]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
Merge tag 'u-boot-amlogic-20190423' of git://git.denx.de/u-boot-amlogic
authorTom Rini <trini@konsulko.com>
Wed, 24 Apr 2019 16:26:25 +0000 (12:26 -0400)
committerTom Rini <trini@konsulko.com>
Wed, 24 Apr 2019 16:26:25 +0000 (12:26 -0400)
- Add support for Amlogic p200 & p201 Reference Designs
- Add Amlogic SoC information display
- Add support for the Libretech-AC AML-S805X-AC board
- Add Amlogic AXG reset compatible
- Add I2C support for Amlogic AXG
- Fix AXG PIN and BANK pinctrl definitions
- Fix regmap_read_poll_timeout warning about sandbox_timer_add_offset
- Add initial support for Amlogic G12A SoC and U200 board
- Enable PHY_REALTEK for selected boards
- Fix Khadas VIM2 README

1019 files changed:
.travis.yml
Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt [new file with mode: 0644]
MAINTAINERS
Makefile
arch/arc/dts/axs10x_mb.dtsi
arch/arc/dts/hsdk.dts
arch/arm/Kconfig
arch/arm/cpu/armv7/vf610/Kconfig
arch/arm/cpu/armv7/vf610/generic.c
arch/arm/cpu/armv8/Makefile
arch/arm/cpu/armv8/fwcall.c
arch/arm/cpu/armv8/psci.S
arch/arm/cpu/armv8/u-boot.lds
arch/arm/dts/Makefile
arch/arm/dts/am335x-brppt1-spi.dts
arch/arm/dts/am335x-guardian-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/am335x-guardian.dts [new file with mode: 0644]
arch/arm/dts/am437x-idk-evm.dts
arch/arm/dts/am437x-sk-evm.dts
arch/arm/dts/am57xx-cl-som-am57x.dts [deleted file]
arch/arm/dts/am57xx-sbc-am57x.dts [deleted file]
arch/arm/dts/armada-370-xp.dtsi
arch/arm/dts/armada-3720-db.dts
arch/arm/dts/armada-3720-espressobin.dts
arch/arm/dts/armada-3720-turris-mox.dts
arch/arm/dts/armada-385-amc.dts [deleted file]
arch/arm/dts/armada-385-atl-x530-u-boot.dtsi
arch/arm/dts/armada-385-db-88f6820-amc.dts [new file with mode: 0644]
arch/arm/dts/armada-385-turris-omnia-u-boot.dtsi
arch/arm/dts/armada-38x-controlcenterdc.dts
arch/arm/dts/armada-38x-solidrun-microsom.dtsi
arch/arm/dts/armada-8040-clearfog-gt-8k.dts
arch/arm/dts/armada-xp-98dx3236.dtsi [new file with mode: 0644]
arch/arm/dts/armada-xp-98dx3336.dtsi [new file with mode: 0644]
arch/arm/dts/armada-xp-98dx4251.dtsi [new file with mode: 0644]
arch/arm/dts/armada-xp-db-xc3-24g4xg-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/armada-xp-db-xc3-24g4xg.dts [new file with mode: 0644]
arch/arm/dts/armada-xp-gp.dts
arch/arm/dts/armada-xp-maxbcm.dts
arch/arm/dts/armada-xp-mv78230.dtsi
arch/arm/dts/armada-xp-mv78260.dtsi
arch/arm/dts/armada-xp-mv78460.dtsi
arch/arm/dts/armada-xp-synology-ds414.dts
arch/arm/dts/armada-xp-theadorable.dts
arch/arm/dts/armada-xp.dtsi
arch/arm/dts/at91-sama5d2_icp-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/at91-sama5d2_icp.dts [new file with mode: 0644]
arch/arm/dts/at91-sama5d2_xplained.dts
arch/arm/dts/at91-sama5d4_xplained.dts
arch/arm/dts/at91-sama5d4ek.dts
arch/arm/dts/at91sam9260.dtsi
arch/arm/dts/at91sam9n12ek.dts
arch/arm/dts/at91sam9x5ek.dtsi
arch/arm/dts/bcm63158.dtsi
arch/arm/dts/bcm6858.dtsi
arch/arm/dts/bcm963158.dts
arch/arm/dts/bcm968580xref.dts
arch/arm/dts/bk4r1.dts [deleted file]
arch/arm/dts/da850-evm-u-boot.dtsi
arch/arm/dts/dra7.dtsi
arch/arm/dts/dra71-evm.dts
arch/arm/dts/exynos5250-snow.dts
arch/arm/dts/exynos5250-spring.dts
arch/arm/dts/exynos5420-peach-pit.dts
arch/arm/dts/fsl-ls1012a-2g5rdb.dts
arch/arm/dts/fsl-ls1012a-frdm.dtsi
arch/arm/dts/fsl-ls1012a-frwy.dts
arch/arm/dts/fsl-ls1012a-qds.dtsi
arch/arm/dts/fsl-ls1012a-rdb.dtsi
arch/arm/dts/fsl-ls1043a-qds.dtsi
arch/arm/dts/fsl-ls1043a-rdb.dts
arch/arm/dts/fsl-ls1046a-qds.dtsi
arch/arm/dts/fsl-ls1046a-rdb.dts
arch/arm/dts/fsl-ls1088a-qds.dts
arch/arm/dts/fsl-ls1088a-rdb.dts
arch/arm/dts/fsl-ls2080a-qds.dts
arch/arm/dts/fsl-ls2080a-rdb.dts
arch/arm/dts/fsl-ls2081a-rdb.dts
arch/arm/dts/fsl-ls2088a-rdb-qspi.dts
arch/arm/dts/hi3798cv200-u-boot.dtsi
arch/arm/dts/imx53-kp-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/imx53-ppd.dts [new file with mode: 0644]
arch/arm/dts/imx53.dtsi
arch/arm/dts/imx6-apalis.dts [new file with mode: 0644]
arch/arm/dts/imx6-colibri.dts [new file with mode: 0644]
arch/arm/dts/imx6dl-wandboard-revb1.dts [new file with mode: 0644]
arch/arm/dts/imx6q-bx50v3.dts [new file with mode: 0644]
arch/arm/dts/imx6q-tbs2910.dts [new file with mode: 0644]
arch/arm/dts/imx6qdl-wandboard-revb1.dtsi [new file with mode: 0644]
arch/arm/dts/imx6qdl-wandboard.dtsi [new file with mode: 0644]
arch/arm/dts/imx6qdl.dtsi
arch/arm/dts/imx6sx-sabreauto-u-boot.dtsi
arch/arm/dts/imx6sx-sdb-u-boot.dtsi
arch/arm/dts/imx6ul-14x14-evk-u-boot.dtsi
arch/arm/dts/imx6ul-9x9-evk-u-boot.dtsi
arch/arm/dts/imx6ull-14x14-evk.dts
arch/arm/dts/imx7d-sdb-qspi-u-boot.dtsi
arch/arm/dts/k3-am65-wakeup.dtsi
arch/arm/dts/k3-am654-base-board-u-boot.dtsi
arch/arm/dts/keystone-k2e-evm.dts
arch/arm/dts/keystone-k2g-evm.dts
arch/arm/dts/keystone-k2g-ice.dts
arch/arm/dts/keystone-k2hk-evm.dts
arch/arm/dts/keystone-k2l-evm.dts
arch/arm/dts/kirkwood-atl-sbx81lifkw.dts
arch/arm/dts/kirkwood-atl-sbx81lifxcat.dts
arch/arm/dts/kirkwood-dreamplug.dts
arch/arm/dts/kirkwood-lsxl.dtsi
arch/arm/dts/kirkwood-netxbig.dtsi
arch/arm/dts/kirkwood-ns2-common.dtsi
arch/arm/dts/kirkwood-synology.dtsi
arch/arm/dts/ls1021a-iot.dtsi
arch/arm/dts/ls1021a-qds.dtsi
arch/arm/dts/ls1021a-twr.dtsi
arch/arm/dts/mt7629-rfb.dts
arch/arm/dts/mt8516-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/mt8516.dtsi [new file with mode: 0644]
arch/arm/dts/omap5-u-boot.dtsi
arch/arm/dts/r8a7790-lager.dts
arch/arm/dts/r8a7790-stout.dts
arch/arm/dts/r8a7790.dtsi
arch/arm/dts/r8a7791-koelsch.dts
arch/arm/dts/r8a7791-porter.dts
arch/arm/dts/r8a7791.dtsi
arch/arm/dts/r8a7792.dtsi
arch/arm/dts/r8a7793-gose.dts
arch/arm/dts/r8a7793.dtsi
arch/arm/dts/r8a7794-alt-u-boot.dts
arch/arm/dts/r8a7794-silk.dts
arch/arm/dts/r8a7794.dtsi
arch/arm/dts/r8a7795-h3ulcb-u-boot.dts
arch/arm/dts/r8a7795-h3ulcb.dts
arch/arm/dts/r8a7795-salvator-x-u-boot.dts
arch/arm/dts/r8a7795-salvator-x.dts
arch/arm/dts/r8a7795-u-boot.dtsi
arch/arm/dts/r8a7795.dtsi
arch/arm/dts/r8a7796-m3ulcb-u-boot.dts
arch/arm/dts/r8a7796-m3ulcb.dts
arch/arm/dts/r8a7796-salvator-x-u-boot.dts
arch/arm/dts/r8a7796-salvator-x.dts
arch/arm/dts/r8a7796-u-boot.dtsi
arch/arm/dts/r8a7796.dtsi
arch/arm/dts/r8a77965-m3nulcb-u-boot.dts [new file with mode: 0644]
arch/arm/dts/r8a77965-m3nulcb.dts [new file with mode: 0644]
arch/arm/dts/r8a77965-salvator-x-u-boot.dts
arch/arm/dts/r8a77965-u-boot.dtsi
arch/arm/dts/r8a77965.dtsi
arch/arm/dts/r8a77970-eagle-u-boot.dts
arch/arm/dts/r8a77970-u-boot.dtsi
arch/arm/dts/r8a77970.dtsi
arch/arm/dts/r8a77990-ebisu-u-boot.dts
arch/arm/dts/r8a77990-ebisu.dts
arch/arm/dts/r8a77990-u-boot.dtsi
arch/arm/dts/r8a77990.dtsi
arch/arm/dts/r8a77995-draak.dts
arch/arm/dts/r8a77995-u-boot.dtsi
arch/arm/dts/r8a77995.dtsi
arch/arm/dts/rk3288-veyron.dtsi
arch/arm/dts/rk3368-lion.dts
arch/arm/dts/rk3399-gru.dtsi
arch/arm/dts/rk3399-puma.dtsi
arch/arm/dts/rv1108-evb.dts
arch/arm/dts/salvator-common.dtsi
arch/arm/dts/sama5d27_som1.dtsi
arch/arm/dts/sama5d3xmb.dtsi
arch/arm/dts/sama5d3xmb_cmp.dtsi
arch/arm/dts/socfpga-common-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/socfpga.dtsi
arch/arm/dts/socfpga_arria5_socdk-u-boot.dtsi
arch/arm/dts/socfpga_cyclone5_dbm_soc1.dts
arch/arm/dts/socfpga_cyclone5_de0_nano_soc-u-boot.dtsi
arch/arm/dts/socfpga_cyclone5_de10_nano.dts
arch/arm/dts/socfpga_cyclone5_de1_soc.dts
arch/arm/dts/socfpga_cyclone5_is1.dts
arch/arm/dts/socfpga_cyclone5_socdk-u-boot.dtsi
arch/arm/dts/socfpga_cyclone5_sockit-u-boot.dtsi
arch/arm/dts/socfpga_cyclone5_socrates-u-boot.dtsi
arch/arm/dts/socfpga_cyclone5_socrates.dts
arch/arm/dts/socfpga_cyclone5_sr1500.dts
arch/arm/dts/socfpga_cyclone5_vining_fpga-u-boot.dtsi
arch/arm/dts/socfpga_stratix10.dtsi [changed mode: 0644->0755]
arch/arm/dts/socfpga_stratix10_socdk-u-boot.dtsi [new file with mode: 0755]
arch/arm/dts/socfpga_stratix10_socdk.dts [changed mode: 0644->0755]
arch/arm/dts/stm32f746-disco.dts
arch/arm/dts/stm32f769-disco.dts
arch/arm/dts/stm32mp15-ddr3-1x4Gb-1066-binG.dtsi [new file with mode: 0644]
arch/arm/dts/stm32mp157-pinctrl.dtsi
arch/arm/dts/stm32mp157-u-boot.dtsi
arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/stm32mp157a-dk1.dts [new file with mode: 0644]
arch/arm/dts/stm32mp157c-dk2-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/stm32mp157c-dk2.dts [new file with mode: 0644]
arch/arm/dts/stm32mp157c-ed1-u-boot.dtsi
arch/arm/dts/stm32mp157c-ed1.dts
arch/arm/dts/stm32mp157c-ev1-u-boot.dtsi
arch/arm/dts/stm32mp157c-ev1.dts
arch/arm/dts/stm32mp157c.dtsi
arch/arm/dts/stv0991.dts
arch/arm/dts/sun50i-a64-oceanic-5205-5inmfd.dts [new file with mode: 0644]
arch/arm/dts/sun50i-h6-orangepi.dtsi
arch/arm/dts/sun50i-h6-pine-h64.dts
arch/arm/dts/sun50i-h6.dtsi
arch/arm/dts/sun7i-a20-ainol-aw1.dts
arch/arm/dts/sun7i-a20-bananapi-m1-plus.dts
arch/arm/dts/sun7i-a20-bananapi.dts
arch/arm/dts/sun7i-a20-bananapro.dts
arch/arm/dts/sun7i-a20-cubieboard2.dts
arch/arm/dts/sun7i-a20-cubietruck.dts
arch/arm/dts/sun7i-a20-hummingbird.dts
arch/arm/dts/sun7i-a20-i12-tvbox.dts
arch/arm/dts/sun7i-a20-icnova-swac.dts
arch/arm/dts/sun7i-a20-itead-ibox.dts
arch/arm/dts/sun7i-a20-lamobo-r1.dts
arch/arm/dts/sun7i-a20-m3.dts
arch/arm/dts/sun7i-a20-m5.dts
arch/arm/dts/sun7i-a20-mk808c.dts
arch/arm/dts/sun7i-a20-olimex-som-evb-emmc.dts [new file with mode: 0644]
arch/arm/dts/sun7i-a20-olimex-som-evb.dts
arch/arm/dts/sun7i-a20-olimex-som204-evb-emmc.dts
arch/arm/dts/sun7i-a20-olimex-som204-evb.dts
arch/arm/dts/sun7i-a20-olinuxino-lime.dts
arch/arm/dts/sun7i-a20-olinuxino-lime2-emmc.dts
arch/arm/dts/sun7i-a20-olinuxino-lime2.dts
arch/arm/dts/sun7i-a20-olinuxino-micro-emmc.dts
arch/arm/dts/sun7i-a20-olinuxino-micro.dts
arch/arm/dts/sun7i-a20-orangepi-mini.dts
arch/arm/dts/sun7i-a20-orangepi.dts
arch/arm/dts/sun7i-a20-pcduino3-nano.dts
arch/arm/dts/sun7i-a20-pcduino3.dts
arch/arm/dts/sun7i-a20-primo73.dts
arch/arm/dts/sun7i-a20-wexler-tab7200.dts
arch/arm/dts/sun7i-a20-wits-pro-a20-dkt-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/sun7i-a20-wits-pro-a20-dkt.dts
arch/arm/dts/sun7i-a20-yones-toptech-bd1078.dts
arch/arm/dts/sun7i-a20.dtsi
arch/arm/dts/sun8i-r40-bananapi-m2-ultra.dts
arch/arm/dts/sun8i-r40.dtsi
arch/arm/dts/sun8i-v40-bananapi-m2-berry.dts
arch/arm/dts/sunxi-itead-core-common.dtsi
arch/arm/dts/ulcb.dtsi
arch/arm/dts/uniphier-ld11.dtsi
arch/arm/dts/uniphier-ld20.dtsi
arch/arm/dts/uniphier-ld4.dtsi
arch/arm/dts/uniphier-pro4.dtsi
arch/arm/dts/uniphier-pxs2.dtsi
arch/arm/dts/uniphier-pxs3-ref.dts
arch/arm/dts/uniphier-pxs3.dtsi
arch/arm/dts/uniphier-sld8.dtsi
arch/arm/dts/vf-colibri-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/vf-colibri.dtsi
arch/arm/dts/vf.dtsi
arch/arm/dts/vf500-colibri.dts
arch/arm/dts/vf610-bk4r1-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/vf610-bk4r1.dts [new file with mode: 0644]
arch/arm/dts/vf610-colibri.dts
arch/arm/dts/vf610-pcm052.dts [moved from arch/arm/dts/pcm052.dts with 81% similarity]
arch/arm/dts/vf610-pcm052.dtsi [new file with mode: 0644]
arch/arm/dts/vf610-pinfunc.h
arch/arm/dts/zynq-zed.dts
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-zc1275-revA.dts
arch/arm/dts/zynqmp-zc1275-revB.dts
arch/arm/dts/zynqmp-zc1751-xm015-dc1.dts
arch/arm/dts/zynqmp-zc1751-xm018-dc4.dts
arch/arm/dts/zynqmp-zcu102-revA.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/include/asm/arch-am33xx/ddr_defs.h
arch/arm/include/asm/arch-sunxi/spl.h
arch/arm/include/asm/arch-vf610/clock.h
arch/arm/include/asm/arch-vf610/crm_regs.h
arch/arm/include/asm/arch-vf610/ddrmc-vf610.h
arch/arm/include/asm/arch-vf610/imx-regs.h
arch/arm/include/asm/arch-vf610/iomux-vf610.h
arch/arm/include/asm/gpio.h
arch/arm/include/asm/io.h
arch/arm/include/asm/mach-imx/video.h
arch/arm/include/asm/secure.h
arch/arm/lib/interrupts_64.c
arch/arm/lib/relocate_64.S
arch/arm/mach-at91/Kconfig
arch/arm/mach-imx/Kconfig
arch/arm/mach-imx/video.c
arch/arm/mach-k3/am6_init.c
arch/arm/mach-k3/common.c
arch/arm/mach-k3/include/mach/sys_proto.h
arch/arm/mach-keystone/Kconfig
arch/arm/mach-keystone/include/mach/hardware-k2g.h
arch/arm/mach-keystone/include/mach/mux-k2g.h
arch/arm/mach-kirkwood/cpu.c
arch/arm/mach-kirkwood/include/mach/cpu.h
arch/arm/mach-kirkwood/include/mach/soc.h
arch/arm/mach-mediatek/Kconfig
arch/arm/mach-mediatek/Makefile
arch/arm/mach-mediatek/mt8516/Makefile [new file with mode: 0644]
arch/arm/mach-mediatek/mt8516/init.c [new file with mode: 0644]
arch/arm/mach-mvebu/Kconfig
arch/arm/mach-mvebu/Makefile
arch/arm/mach-mvebu/cpu.c
arch/arm/mach-mvebu/include/mach/config.h
arch/arm/mach-mvebu/include/mach/cpu.h
arch/arm/mach-mvebu/include/mach/soc.h
arch/arm/mach-mvebu/mbus.c
arch/arm/mach-mvebu/serdes/axp/high_speed_env_lib.c
arch/arm/mach-omap2/Kconfig
arch/arm/mach-omap2/am33xx/Kconfig
arch/arm/mach-omap2/omap5/Kconfig
arch/arm/mach-rmobile/Kconfig.64
arch/arm/mach-rmobile/lowlevel_init_gen3.S
arch/arm/mach-socfpga/include/mach/reset_manager_s10.h
arch/arm/mach-socfpga/include/mach/sdram_gen5.h
arch/arm/mach-socfpga/include/mach/sdram_s10.h
arch/arm/mach-socfpga/misc_gen5.c
arch/arm/mach-socfpga/reset_manager_s10.c
arch/arm/mach-socfpga/spl_gen5.c
arch/arm/mach-socfpga/spl_s10.c
arch/arm/mach-stm32mp/Kconfig
arch/arm/mach-stm32mp/Makefile
arch/arm/mach-stm32mp/bsec.c
arch/arm/mach-stm32mp/cmd_poweroff.c [new file with mode: 0644]
arch/arm/mach-stm32mp/config.mk
arch/arm/mach-stm32mp/cpu.c
arch/arm/mach-stm32mp/include/mach/stm32.h
arch/arm/mach-stm32mp/include/mach/stm32mp1_smc.h [new file with mode: 0644]
arch/arm/mach-stm32mp/include/mach/sys_proto.h
arch/arm/mach-stm32mp/psci.c
arch/arm/mach-stm32mp/spl.c
arch/arm/mach-stm32mp/syscon.c
arch/arm/mach-sunxi/Kconfig
arch/arm/mach-sunxi/board.c
arch/arm/mach-sunxi/dram_sun8i_a33.c
arch/arm/mach-zynqmp/spl.c
arch/mips/dts/Makefile
arch/mips/dts/ap121.dts
arch/mips/dts/ap143.dts
arch/mips/dts/ap152.dts [new file with mode: 0644]
arch/mips/dts/brcm,bcm6838.dtsi
arch/mips/dts/brcm,bcm968380gerg.dts
arch/mips/dts/comtrend,ar-5315u.dts
arch/mips/dts/comtrend,ar-5387un.dts
arch/mips/dts/gardena-smart-gateway-mt7688.dts
arch/mips/dts/jr2_pcb110.dts
arch/mips/dts/jr2_pcb111.dts
arch/mips/dts/linkit-smart-7688.dts
arch/mips/dts/luton_pcb090.dts
arch/mips/dts/luton_pcb091.dts
arch/mips/dts/mscc,jr2.dtsi
arch/mips/dts/mscc,ocelot_pcb.dtsi
arch/mips/dts/mscc,servalt.dtsi
arch/mips/dts/netgear,cg3100d.dts
arch/mips/dts/qca953x.dtsi
arch/mips/dts/qca956x.dtsi [new file with mode: 0644]
arch/mips/dts/sagem,f@st1704.dts
arch/mips/dts/serval2_pcb112.dts
arch/mips/dts/serval_pcb105.dts
arch/mips/dts/serval_pcb106.dts
arch/mips/dts/servalt_pcb116.dts
arch/mips/dts/tplink_wdr4300.dts
arch/mips/lib/bootm.c
arch/mips/mach-ath79/Kconfig
arch/mips/mach-ath79/Makefile
arch/mips/mach-ath79/include/mach/ar71xx_regs.h
arch/mips/mach-ath79/include/mach/ath79.h
arch/mips/mach-ath79/qca956x/Makefile [new file with mode: 0644]
arch/mips/mach-ath79/qca956x/clk.c [new file with mode: 0644]
arch/mips/mach-ath79/qca956x/cpu.c [new file with mode: 0644]
arch/mips/mach-ath79/qca956x/ddr.c [new file with mode: 0644]
arch/mips/mach-ath79/qca956x/qca956x-ddr-tap.S [new file with mode: 0644]
arch/mips/mach-ath79/reset.c
arch/mips/mach-mscc/include/mach/servalt/servalt_devcpu_gcb.h
arch/mips/mach-mt7620/Kconfig
arch/nds32/dts/ae3xx.dts
arch/riscv/dts/ae350_32.dts
arch/riscv/dts/ae350_64.dts
arch/sandbox/dts/test.dts
arch/sandbox/include/asm/sdl.h
arch/sandbox/include/asm/types.h
arch/sandbox/lib/pci_io.c
arch/x86/dts/bayleybay.dts
arch/x86/dts/baytrail_som-db5800-som-6867.dts
arch/x86/dts/cherryhill.dts
arch/x86/dts/chromebook_link.dts
arch/x86/dts/chromebook_samus.dts
arch/x86/dts/chromebox_panther.dts
arch/x86/dts/conga-qeval20-qa3-e3845.dts
arch/x86/dts/cougarcanyon2.dts
arch/x86/dts/crownbay.dts
arch/x86/dts/dfi-bt700.dtsi
arch/x86/dts/galileo.dts
arch/x86/dts/minnowmax.dts
board/CZ.NIC/turris_omnia/turris_omnia.c
board/Marvell/db-xc3-24g4xg/.gitignore [new file with mode: 0644]
board/Marvell/db-xc3-24g4xg/MAINTAINERS [new file with mode: 0644]
board/Marvell/db-xc3-24g4xg/Makefile [new file with mode: 0644]
board/Marvell/db-xc3-24g4xg/README [new file with mode: 0644]
board/Marvell/db-xc3-24g4xg/binary.0 [new file with mode: 0644]
board/Marvell/db-xc3-24g4xg/db-xc3-24g4xg.c [new file with mode: 0644]
board/Marvell/db-xc3-24g4xg/kwbimage.cfg.in [new file with mode: 0644]
board/Synology/ds414/ds414.c
board/alliedtelesis/x530/x530.c
board/aristainetos/aristainetos-v2.c
board/atmel/sama5d2_icp/Kconfig [new file with mode: 0644]
board/atmel/sama5d2_icp/MAINTAINERS [new file with mode: 0644]
board/atmel/sama5d2_icp/Makefile [new file with mode: 0644]
board/atmel/sama5d2_icp/sama5d2_icp.c [new file with mode: 0644]
board/bosch/guardian/Kconfig [new file with mode: 0644]
board/bosch/guardian/MAINTAINERS [new file with mode: 0644]
board/bosch/guardian/Makefile [new file with mode: 0644]
board/bosch/guardian/board.c [new file with mode: 0644]
board/bosch/guardian/board.h [new file with mode: 0644]
board/bosch/guardian/mux.c [new file with mode: 0644]
board/compulab/cl-som-am57x/Kconfig [deleted file]
board/compulab/cl-som-am57x/MAINTAINERS [deleted file]
board/compulab/cl-som-am57x/Makefile [deleted file]
board/compulab/cl-som-am57x/cl-som-am57x.c [deleted file]
board/compulab/cl-som-am57x/eth.c [deleted file]
board/compulab/cl-som-am57x/mux.c [deleted file]
board/compulab/cl-som-am57x/spl.c [deleted file]
board/davinci/da8xxevm/da850evm.c
board/davinci/da8xxevm/u-boot-spl-da850evm.lds
board/freescale/imx8qxp_mek/imx8qxp_mek.c
board/ge/bx50v3/bx50v3.c
board/ge/mx53ppd/mx53ppd.c
board/ge/mx53ppd/ppd_gpio.h
board/logicpd/am3517evm/am3517evm.c
board/maxbcm/maxbcm.c
board/mscc/jr2/jr2.c
board/phytec/pcm052/pcm052.c
board/qca/ap152/Kconfig [new file with mode: 0644]
board/qca/ap152/MAINTAINERS [new file with mode: 0644]
board/qca/ap152/Makefile [new file with mode: 0644]
board/qca/ap152/ap152.c [new file with mode: 0644]
board/renesas/rcar-common/common.c
board/renesas/ulcb/MAINTAINERS
board/renesas/ulcb/ulcb.c
board/solidrun/clearfog/README
board/st/stm32mp1/MAINTAINERS
board/st/stm32mp1/README
board/st/stm32mp1/board.c
board/st/stm32mp1/spl.c
board/st/stm32mp1/stm32mp1.c
board/sunxi/MAINTAINERS
board/sunxi/Makefile
board/sunxi/gmac.c
board/synopsys/axs10x/axs10x.c
board/synopsys/hsdk/hsdk.c
board/tbs/tbs2910/MAINTAINERS
board/tbs/tbs2910/tbs2910.c
board/theadorable/theadorable.c
board/ti/am335x/board.c
board/ti/am65x/evm.c
board/ti/dra7xx/evm.c
board/ti/dra7xx/mux_data.h
board/ti/ks2_evm/board_k2g.c
board/ti/ks2_evm/mux-k2g.h
board/toradex/apalis_imx6/1066mhz_4x128mx16.cfg [deleted file]
board/toradex/apalis_imx6/1066mhz_4x256mx16.cfg [deleted file]
board/toradex/apalis_imx6/MAINTAINERS
board/toradex/apalis_imx6/apalis_imx6.c
board/toradex/apalis_imx6/apalis_imx6q.cfg [deleted file]
board/toradex/apalis_imx6/clocks.cfg [deleted file]
board/toradex/apalis_imx6/ddr-setup.cfg [deleted file]
board/toradex/apalis_imx6/do_fuse.c
board/toradex/apalis_imx6/pf0100.c
board/toradex/apalis_imx6/pf0100.h
board/toradex/colibri_imx6/800mhz_2x64mx16.cfg [deleted file]
board/toradex/colibri_imx6/800mhz_4x64mx16.cfg [deleted file]
board/toradex/colibri_imx6/MAINTAINERS
board/toradex/colibri_imx6/clocks.cfg [deleted file]
board/toradex/colibri_imx6/colibri_imx6.c
board/toradex/colibri_imx6/colibri_imx6.cfg [deleted file]
board/toradex/colibri_imx6/ddr-setup.cfg [deleted file]
board/toradex/colibri_imx6/do_fuse.c
board/toradex/colibri_imx6/pf0100.c
board/toradex/colibri_imx6/pf0100.h
board/toradex/colibri_imx6/pf0100_otp.inc
board/toradex/colibri_vf/MAINTAINERS
board/toradex/colibri_vf/colibri_vf.c
board/toradex/common/tdx-cfg-block.c
board/toradex/common/tdx-common.c
board/wandboard/MAINTAINERS
board/wandboard/spl.c
board/wandboard/wandboard.c
board/xilinx/zynq/cmds.c
board/xilinx/zynqmp/zynqmp.c
cmd/Kconfig
cmd/Makefile
cmd/arm/Makefile [new file with mode: 0644]
cmd/arm/exception.c [new file with mode: 0644]
cmd/arm/exception64.c [new file with mode: 0644]
cmd/bootefi.c
cmd/dfu.c
cmd/fpga.c
cmd/riscv/Makefile [new file with mode: 0644]
cmd/riscv/exception.c [new file with mode: 0644]
cmd/sf.c
cmd/usb.c
cmd/usb_mass_storage.c
cmd/wdt.c [new file with mode: 0644]
cmd/x86/Makefile
cmd/x86/exception.c [new file with mode: 0644]
cmd/ximg.c
common/board_r.c
common/bootm.c
common/dlmalloc.c
common/fdt_support.c
common/image-android.c
common/image-fdt.c
common/image-fit.c
common/image.c
common/spl/spl_nand.c
common/spl/spl_spi.c
common/spl/spl_ymodem.c
common/usb_hub.c
common/usb_kbd.c
configs/am335x_boneblack_vboot_defconfig
configs/am335x_evm_defconfig
configs/am335x_guardian_defconfig [new file with mode: 0644]
configs/am335x_hs_evm_defconfig
configs/am335x_hs_evm_uart_defconfig
configs/am57xx_evm_defconfig
configs/am65x_evm_a53_defconfig
configs/ap152_defconfig [new file with mode: 0644]
configs/apalis_imx6_defconfig
configs/apalis_imx6_nospl_com_defconfig [deleted file]
configs/apalis_imx6_nospl_it_defconfig [deleted file]
configs/aristainetos2_defconfig
configs/aristainetos2b_defconfig
configs/aristainetos_defconfig
configs/axs103_defconfig
configs/bananapi_m2_plus_h3_defconfig
configs/bananapi_m2_plus_h5_defconfig
configs/bananapi_m2_zero_defconfig
configs/bcm963158_ram_defconfig
configs/bcm968380gerg_ram_defconfig
configs/bcm968580xref_ram_defconfig
configs/bk4r1_defconfig
configs/brppt1_mmc_defconfig
configs/brppt1_nand_defconfig
configs/brppt1_spi_defconfig
configs/cgtqmx6eval_defconfig
configs/chiliboard_defconfig
configs/cl-som-am57x_defconfig [deleted file]
configs/cm_fx6_defconfig
configs/colibri_imx6_defconfig
configs/colibri_imx6_nospl_defconfig [deleted file]
configs/colibri_vf_defconfig
configs/corvus_defconfig
configs/da850_am18xxevm_defconfig
configs/da850evm_defconfig
configs/da850evm_nand_defconfig
configs/db-88f6820-amc_defconfig
configs/db-mv784mp-gp_defconfig
configs/db-xc3-24g4xg_defconfig [new file with mode: 0644]
configs/dms-ba16-1g_defconfig
configs/dms-ba16_defconfig
configs/dns325_defconfig
configs/dra7xx_evm_defconfig
configs/dra7xx_hs_evm_defconfig
configs/dreamplug_defconfig
configs/ds109_defconfig
configs/ds414_defconfig
configs/emlid_neutis_n5_devboard_defconfig
configs/ge_bx50v3_defconfig
configs/goflexhome_defconfig
configs/guruplug_defconfig
configs/gwventana_emmc_defconfig
configs/gwventana_gw5904_defconfig
configs/gwventana_nand_defconfig
configs/hsdk_defconfig
configs/imx6dl_icore_nand_defconfig
configs/imx6q_icore_nand_defconfig
configs/imx6qdl_icore_mmc_defconfig
configs/imx6qdl_icore_nand_defconfig
configs/k2e_evm_defconfig
configs/k2e_hs_evm_defconfig
configs/k2g_evm_defconfig
configs/k2g_hs_evm_defconfig
configs/k2hk_evm_defconfig
configs/k2hk_hs_evm_defconfig
configs/k2l_evm_defconfig
configs/k2l_hs_evm_defconfig
configs/libretech_all_h3_cc_h2_plus_defconfig
configs/libretech_all_h3_cc_h3_defconfig
configs/libretech_all_h3_cc_h5_defconfig
configs/linkit-smart-7688-ram_defconfig
configs/linkit-smart-7688_defconfig
configs/lschlv2_defconfig
configs/lsxhl_defconfig
configs/m53menlo_defconfig
configs/marsboard_defconfig
configs/mscc_jr2_defconfig
configs/mscc_luton_defconfig
configs/mscc_ocelot_defconfig
configs/mscc_serval_defconfig
configs/mscc_servalt_defconfig
configs/mx51evk_defconfig
configs/mx53cx9020_defconfig
configs/mx53loco_defconfig
configs/mx53ppd_defconfig
configs/mx6cuboxi_defconfig
configs/mx6qsabrelite_defconfig
configs/mx6sabreauto_defconfig
configs/mx6sabresd_defconfig
configs/nanopi_m1_defconfig
configs/nanopi_m1_plus_defconfig
configs/nanopi_neo2_defconfig
configs/nanopi_neo_air_defconfig
configs/nanopi_neo_defconfig
configs/nanopi_neo_plus2_defconfig
configs/nas220_defconfig
configs/nitrogen6dl2g_defconfig
configs/nitrogen6dl_defconfig
configs/nitrogen6q2g_defconfig
configs/nitrogen6q_defconfig
configs/nitrogen6s1g_defconfig
configs/nitrogen6s_defconfig
configs/novena_defconfig
configs/oceanic_5205_5inmfd_defconfig [new file with mode: 0644]
configs/orangepi_2_defconfig
configs/orangepi_lite_defconfig
configs/orangepi_one_defconfig
configs/orangepi_pc2_defconfig
configs/orangepi_pc_defconfig
configs/orangepi_pc_plus_defconfig
configs/orangepi_plus2e_defconfig
configs/orangepi_plus_defconfig
configs/orangepi_prime_defconfig
configs/orangepi_r1_defconfig
configs/orangepi_zero_defconfig
configs/orangepi_zero_plus2_defconfig
configs/orangepi_zero_plus_defconfig
configs/pcm052_defconfig
configs/pine64-lts_defconfig
configs/poplar_defconfig
configs/r8a7795_salvator-x_defconfig
configs/r8a7795_ulcb_defconfig
configs/r8a77965_salvator-x_defconfig
configs/r8a77965_ulcb_defconfig [new file with mode: 0644]
configs/r8a7796_salvator-x_defconfig
configs/r8a7796_ulcb_defconfig
configs/riotboard_defconfig
configs/riotboard_spl_defconfig
configs/sama5d2_icp_mmc_defconfig [new file with mode: 0644]
configs/sandbox64_defconfig
configs/sandbox_defconfig
configs/sheevaplug_defconfig
configs/socfpga_stratix10_defconfig
configs/stm32mp15_basic_defconfig
configs/stm32mp15_trusted_defconfig [new file with mode: 0644]
configs/tbs2910_defconfig
configs/theadorable_debug_defconfig
configs/turris_omnia_defconfig
configs/uniphier_v8_defconfig
configs/wandboard_defconfig
configs/x530_defconfig
configs/xilinx_zynqmp_mini_qspi_defconfig
configs/xilinx_zynqmp_zcu100_revC_defconfig
doc/README.chromium
doc/README.chromium-chainload [new file with mode: 0644]
doc/README.rmobile
doc/README.uefi
doc/device-tree-bindings/i2c/i2c.txt
doc/device-tree-bindings/leds/leds-bcm6858.txt [new file with mode: 0644]
doc/device-tree-bindings/mmc/snps,dw-mmc.txt [new file with mode: 0644]
doc/device-tree-bindings/mtd/stm32-fmc2-nand.txt [new file with mode: 0644]
doc/device-tree-bindings/phy/phy-stm32-usbphyc.txt
doc/device-tree-bindings/pinctrl/atmel,at91-pio4-pinctrl.txt
doc/device-tree-bindings/spi/spi-atcspi200.txt
doc/device-tree-bindings/spi/spi-stm32-qspi.txt
doc/device-tree-bindings/usb/dwc2.txt [new file with mode: 0644]
doc/driver-model/MIGRATION.txt
doc/driver-model/fs_firmware_loader.txt
doc/git-mailrc
drivers/Kconfig
drivers/ata/Kconfig
drivers/ata/Makefile
drivers/ata/ahci_mvebu.c
drivers/ata/ahci_sunxi.c [moved from board/sunxi/ahci.c with 94% similarity]
drivers/ata/dwc_ahsata.c
drivers/ata/sata_mv.c
drivers/clk/altera/clk-arria10.c
drivers/clk/at91/pmc.c
drivers/clk/clk_stm32mp1.c
drivers/clk/clk_zynq.c
drivers/clk/mediatek/Makefile
drivers/clk/mediatek/clk-mt8516.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mtk.c
drivers/clk/renesas/Kconfig
drivers/clk/renesas/Makefile
drivers/clk/renesas/clk-rcar-gen3.c
drivers/clk/renesas/r8a7790-cpg-mssr.c
drivers/clk/renesas/r8a7791-cpg-mssr.c
drivers/clk/renesas/r8a7792-cpg-mssr.c
drivers/clk/renesas/r8a7794-cpg-mssr.c
drivers/clk/renesas/r8a7795-cpg-mssr.c
drivers/clk/renesas/r8a7796-cpg-mssr.c
drivers/clk/renesas/r8a77965-cpg-mssr.c [new file with mode: 0644]
drivers/clk/renesas/r8a77990-cpg-mssr.c
drivers/clk/renesas/r8a77995-cpg-mssr.c
drivers/clk/renesas/rcar-gen3-cpg.h
drivers/clk/renesas/renesas-cpg-mssr.h
drivers/clk/sunxi/clk_r40.c
drivers/core/ofnode.c
drivers/core/syscon-uclass.c
drivers/core/util.c
drivers/ddr/altera/Kconfig
drivers/ddr/altera/sdram_gen5.c
drivers/ddr/altera/sdram_s10.c
drivers/ddr/altera/sequencer.c
drivers/ddr/altera/sequencer.h
drivers/ddr/marvell/axp/xor_regs.h
drivers/dma/Kconfig
drivers/dma/Makefile
drivers/dma/bcm6348-iudma.c
drivers/dma/ti/Kconfig [new file with mode: 0644]
drivers/dma/ti/Makefile [new file with mode: 0644]
drivers/dma/ti/k3-udma-hwdef.h [new file with mode: 0644]
drivers/dma/ti/k3-udma.c [new file with mode: 0644]
drivers/fastboot/fb_getvar.c
drivers/fastboot/fb_mmc.c
drivers/firmware/ti_sci.c
drivers/firmware/ti_sci.h
drivers/fpga/zynqpl.c
drivers/gpio/Kconfig
drivers/gpio/bcm6345_gpio.c
drivers/i2c/i2c-uclass.c
drivers/i2c/muxes/Kconfig
drivers/i2c/muxes/pca954x.c
drivers/i2c/mxc_i2c.c
drivers/led/Kconfig
drivers/led/Makefile
drivers/led/led_bcm6858.c [new file with mode: 0644]
drivers/misc/Kconfig
drivers/misc/fs_loader.c
drivers/misc/i2c_eeprom.c
drivers/misc/stm32mp_fuse.c
drivers/mmc/Kconfig
drivers/mmc/Makefile
drivers/mmc/mtk-sd.c
drivers/mmc/omap_hsmmc.c
drivers/mmc/snps_dw_mmc.c [new file with mode: 0644]
drivers/mtd/mtdcore.c
drivers/mtd/nand/raw/Kconfig
drivers/mtd/nand/raw/Makefile
drivers/mtd/nand/raw/brcmnand/Makefile [new file with mode: 0644]
drivers/mtd/nand/raw/brcmnand/bcm63158_nand.c [new file with mode: 0644]
drivers/mtd/nand/raw/brcmnand/bcm6838_nand.c [new file with mode: 0644]
drivers/mtd/nand/raw/brcmnand/bcm6858_nand.c [new file with mode: 0644]
drivers/mtd/nand/raw/brcmnand/brcmnand.c [new file with mode: 0644]
drivers/mtd/nand/raw/brcmnand/brcmnand.h [new file with mode: 0644]
drivers/mtd/nand/raw/brcmnand/brcmnand_compat.c [new file with mode: 0644]
drivers/mtd/nand/raw/brcmnand/brcmnand_compat.h [new file with mode: 0644]
drivers/mtd/nand/raw/denali.h
drivers/mtd/nand/raw/denali_dt.c
drivers/mtd/nand/raw/nand_base.c
drivers/mtd/nand/raw/stm32_fmc2_nand.c [new file with mode: 0644]
drivers/mtd/nand/spi/gigadevice.c
drivers/mtd/spi/Kconfig
drivers/mtd/spi/sf_probe.c
drivers/mtd/spi/spi-nor-core.c
drivers/mtd/spi/spi-nor-ids.c
drivers/net/Kconfig
drivers/net/Makefile
drivers/net/ag7xxx.c
drivers/net/fec_mxc.c
drivers/net/higmacv300.c [new file with mode: 0644]
drivers/net/mscc_eswitch/Kconfig
drivers/net/mscc_eswitch/Makefile
drivers/net/mscc_eswitch/jr2_switch.c [new file with mode: 0644]
drivers/net/mscc_eswitch/ocelot_switch.c
drivers/net/mscc_eswitch/servalt_switch.c [new file with mode: 0644]
drivers/net/sh_eth.c
drivers/net/sun8i_emac.c
drivers/net/sunxi_emac.c
drivers/net/ti/cpsw-common.c
drivers/net/ti/cpsw.c
drivers/net/ti/keystone_net.c
drivers/net/zynq_gem.c
drivers/pci/pci-uclass.c
drivers/phy/Kconfig
drivers/phy/Makefile
drivers/phy/mt76x8-usb-phy.c [new file with mode: 0644]
drivers/phy/phy-stm32-usbphyc.c
drivers/pinctrl/Kconfig
drivers/pinctrl/Makefile
drivers/pinctrl/ath79/Makefile
drivers/pinctrl/mediatek/Kconfig
drivers/pinctrl/mediatek/Makefile
drivers/pinctrl/mediatek/pinctrl-mt8516.c [new file with mode: 0644]
drivers/pinctrl/pinctrl-stmfx.c [new file with mode: 0644]
drivers/pinctrl/pinctrl-uclass.c
drivers/pinctrl/renesas/Kconfig
drivers/pinctrl/renesas/Makefile
drivers/pinctrl/renesas/pfc-r8a7790.c
drivers/pinctrl/renesas/pfc-r8a7791.c
drivers/pinctrl/renesas/pfc-r8a7792.c
drivers/pinctrl/renesas/pfc-r8a7794.c
drivers/pinctrl/renesas/pfc-r8a7795.c
drivers/pinctrl/renesas/pfc-r8a7796.c
drivers/pinctrl/renesas/pfc-r8a77965.c [new file with mode: 0644]
drivers/pinctrl/renesas/pfc-r8a77970.c
drivers/pinctrl/renesas/pfc-r8a77990.c
drivers/pinctrl/renesas/pfc-r8a77995.c
drivers/pinctrl/renesas/pfc.c
drivers/pinctrl/renesas/sh_pfc.h
drivers/power/pmic/Kconfig
drivers/power/pmic/Makefile
drivers/power/pmic/stpmic1.c [new file with mode: 0644]
drivers/power/pmic/stpmu1.c [deleted file]
drivers/power/regulator/Kconfig
drivers/power/regulator/Makefile
drivers/power/regulator/pbias_regulator.c
drivers/power/regulator/stpmic1.c [new file with mode: 0644]
drivers/power/regulator/stpmu1.c [deleted file]
drivers/ram/stm32mp1/stm32mp1_ram.c
drivers/reset/Kconfig
drivers/reset/Makefile
drivers/reset/reset-hisilicon.c [new file with mode: 0644]
drivers/reset/reset-socfpga.c
drivers/soc/Kconfig [new file with mode: 0644]
drivers/soc/Makefile
drivers/soc/keystone/Makefile [deleted file]
drivers/soc/ti/Kconfig [new file with mode: 0644]
drivers/soc/ti/Makefile [new file with mode: 0644]
drivers/soc/ti/k3-navss-ringacc.c [new file with mode: 0644]
drivers/soc/ti/keystone_serdes.c [moved from drivers/soc/keystone/keystone_serdes.c with 100% similarity]
drivers/spi/Kconfig
drivers/spi/Makefile
drivers/spi/cadence_qspi.c
drivers/spi/cadence_qspi.h
drivers/spi/cadence_qspi_apb.c
drivers/spi/fsl_dspi.c
drivers/spi/spi-mem.c
drivers/spi/spi-uclass.c
drivers/spi/stm32_qspi.c
drivers/spi/ti_qspi.c
drivers/spi/zynqmp_gqspi.c
drivers/sysreset/sysreset_syscon.c
drivers/timer/dw-apb-timer.c
drivers/usb/gadget/dwc2_udc_otg.c
drivers/usb/gadget/dwc2_udc_otg_priv.h
drivers/usb/gadget/dwc2_udc_otg_regs.h
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c
drivers/usb/host/Kconfig
drivers/usb/host/ehci-mx6.c
drivers/usb/host/usb-uclass.c
drivers/usb/musb-new/Kconfig
drivers/video/Kconfig
drivers/video/Makefile
drivers/video/console_normal.c
drivers/video/console_rotate.c
drivers/video/imx/Kconfig [new file with mode: 0644]
drivers/video/imx/Makefile [new file with mode: 0644]
drivers/video/imx/ipu.h [moved from drivers/video/ipu.h with 100% similarity]
drivers/video/imx/ipu_common.c [moved from drivers/video/ipu_common.c with 100% similarity]
drivers/video/imx/ipu_disp.c [moved from drivers/video/ipu_disp.c with 100% similarity]
drivers/video/imx/ipu_regs.h [moved from drivers/video/ipu_regs.h with 100% similarity]
drivers/video/imx/mxc_ipuv3_fb.c [moved from drivers/video/mxc_ipuv3_fb.c with 88% similarity]
drivers/video/imx/mxcfb.h [moved from drivers/video/mxcfb.h with 100% similarity]
drivers/video/pwm_backlight.c
drivers/video/vidconsole-uclass.c
drivers/video/video-uclass.c
drivers/video/videomodes.c
drivers/watchdog/Kconfig
drivers/watchdog/orion_wdt.c
dts/Kconfig
env/nand.c
include/config_defaults.h
include/configs/advantech_dms-ba16.h
include/configs/alt.h
include/configs/am335x_evm.h
include/configs/am335x_guardian.h [new file with mode: 0644]
include/configs/am43xx_evm.h
include/configs/am57xx_evm.h
include/configs/ap152.h [new file with mode: 0644]
include/configs/apalis_imx6.h
include/configs/aristainetos-common.h
include/configs/baltos.h
include/configs/bav335x.h
include/configs/bk4r1.h
include/configs/broadcom_bcm963158.h
include/configs/broadcom_bcm968380gerg.h
include/configs/broadcom_bcm968580xref.h
include/configs/brppt1.h
include/configs/brxre1.h
include/configs/cgtqmx6eval.h
include/configs/chiliboard.h
include/configs/cl-som-am57x.h [deleted file]
include/configs/clearfog.h
include/configs/cm_fx6.h
include/configs/cm_t43.h
include/configs/colibri_imx6.h
include/configs/colibri_vf.h
include/configs/corvus.h
include/configs/da850evm.h
include/configs/db-88f6720.h
include/configs/db-88f6820-amc.h
include/configs/db-88f6820-gp.h
include/configs/db-mv784mp-gp.h
include/configs/db-xc3-24g4xg.h [new file with mode: 0644]
include/configs/dh_imx6.h
include/configs/dra7xx_evm.h
include/configs/ds414.h
include/configs/embestmx6boards.h
include/configs/ge_bx50v3.h
include/configs/gw_ventana.h
include/configs/helios4.h
include/configs/imx8mq_evk.h
include/configs/k2e_evm.h
include/configs/k2g_evm.h
include/configs/k2hk_evm.h
include/configs/k2l_evm.h
include/configs/kp_imx6q_tpc.h
include/configs/lsxl.h
include/configs/m53menlo.h
include/configs/mvebu_armada-8k.h
include/configs/mx51evk.h
include/configs/mx53cx9020.h
include/configs/mx53loco.h
include/configs/mx53ppd.h
include/configs/mx6_common.h
include/configs/mx6cuboxi.h
include/configs/mx6sabre_common.h
include/configs/mx7_common.h
include/configs/nitrogen6x.h
include/configs/novena.h
include/configs/omapl138_lcdk.h
include/configs/pcm052.h
include/configs/pengwyn.h
include/configs/sama5d2_icp.h [new file with mode: 0644]
include/configs/siemens-am33x-common.h
include/configs/socfpga_common.h
include/configs/stm32mp1.h
include/configs/sunxi-common.h
include/configs/tbs2910.h
include/configs/theadorable.h
include/configs/ti_armv7_keystone2.h
include/configs/ti_omap5_common.h
include/configs/turris_mox.h
include/configs/turris_omnia.h
include/configs/vcoreiii.h
include/configs/vf610twr.h
include/configs/wandboard.h
include/configs/xilinx_zynqmp.h
include/configs/zynq-common.h
include/cpsw.h
include/dm/pinctrl.h
include/dm/util.h
include/dt-bindings/clock/mt8516-clk.h [new file with mode: 0644]
include/dt-bindings/clock/r8a7790-cpg-mssr.h
include/dt-bindings/clock/r8a7791-cpg-mssr.h
include/dt-bindings/clock/r8a7792-cpg-mssr.h
include/dt-bindings/clock/r8a7793-clock.h
include/dt-bindings/clock/r8a7793-cpg-mssr.h
include/dt-bindings/clock/r8a7794-clock.h
include/dt-bindings/clock/r8a7794-cpg-mssr.h
include/dt-bindings/clock/r8a7795-cpg-mssr.h
include/dt-bindings/clock/r8a7796-cpg-mssr.h
include/dt-bindings/clock/r8a77995-cpg-mssr.h
include/dt-bindings/clock/sun8i-tcon-top.h [new file with mode: 0644]
include/dt-bindings/dma/k3-udma.h [new file with mode: 0644]
include/dt-bindings/mfd/st,stpmic1.h [new file with mode: 0644]
include/dt-bindings/mfd/st,stpmu1.h [deleted file]
include/dt-bindings/mscc/jr2_data.h [new file with mode: 0644]
include/efi.h
include/efi_loader.h
include/environment/ti/nand.h [new file with mode: 0644]
include/exception.h [new file with mode: 0644]
include/fdtdec.h
include/fpga.h
include/i2c.h
include/image.h
include/linux/completion.h [new file with mode: 0644]
include/linux/io.h
include/linux/mtd/mtd.h
include/linux/mtd/rawnand.h
include/linux/soc/ti/cppi5.h [new file with mode: 0644]
include/linux/soc/ti/k3-navss-ringacc.h [new file with mode: 0644]
include/linux/soc/ti/ti-udma.h [new file with mode: 0644]
include/linux/soc/ti/ti_sci_protocol.h
include/malloc.h
include/net.h
include/pci.h
include/power/stpmic1.h [new file with mode: 0644]
include/power/stpmu1.h [deleted file]
include/reset.h
include/spi.h
include/usb/dwc2_udc.h
include/video.h
lib/Kconfig
lib/efi_driver/efi_uclass.c
lib/efi_loader/Kconfig
lib/efi_loader/efi_boottime.c
lib/efi_loader/efi_device_path.c
lib/efi_loader/efi_memory.c
lib/efi_loader/efi_root_node.c
lib/efi_loader/efi_setup.c
lib/efi_selftest/efi_selftest_memory.c
lib/fdtdec.c
lib/fdtdec_test.c
lib/libfdt/fdt_ro.c
lib/lz4_wrapper.c
lib/vsprintf.c
scripts/Makefile.lib
scripts/config_whitelist.txt
scripts/dtc/libfdt/fdt_ro.c
scripts/dtc/libfdt/libfdt.h
scripts/dtc/libfdt/libfdt_env.h
test/dm/syscon.c
test/env/Kconfig
test/lib/hexdump.c
test/py/tests/test_fpga.py
tools/kwbimage.c
tools/mkimage.c

index eb531f1e5b7ab86aac2d46e9bd412197ed09acab..951b6a31bbe8be38fb51209404c17c419cf3b7df 100644 (file)
@@ -34,6 +34,7 @@ addons:
     - liblz4-tool
     - libisl15
     - clang-7
+    - srecord
 
 install:
  # Clone uboot-test-hooks
diff --git a/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt b/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt
new file mode 100644 (file)
index 0000000..bac4afa
--- /dev/null
@@ -0,0 +1,136 @@
+*** Reserved memory regions ***
+
+Reserved memory is specified as a node under the /reserved-memory node.
+The operating system shall exclude reserved memory from normal usage
+one can create child nodes describing particular reserved (excluded from
+normal use) memory regions. Such memory regions are usually designed for
+the special usage by various device drivers.
+
+Parameters for each memory region can be encoded into the device tree
+with the following nodes:
+
+/reserved-memory node
+---------------------
+#address-cells, #size-cells (required) - standard definition
+    - Should use the same values as the root node
+ranges (required) - standard definition
+    - Should be empty
+
+/reserved-memory/ child nodes
+-----------------------------
+Each child of the reserved-memory node specifies one or more regions of
+reserved memory. Each child node may either use a 'reg' property to
+specify a specific range of reserved memory, or a 'size' property with
+optional constraints to request a dynamically allocated block of memory.
+
+Following the generic-names recommended practice, node names should
+reflect the purpose of the node (ie. "framebuffer" or "dma-pool"). Unit
+address (@<address>) should be appended to the name if the node is a
+static allocation.
+
+Properties:
+Requires either a) or b) below.
+a) static allocation
+   reg (required) - standard definition
+b) dynamic allocation
+   size (required) - length based on parent's #size-cells
+                   - Size in bytes of memory to reserve.
+   alignment (optional) - length based on parent's #size-cells
+                        - Address boundary for alignment of allocation.
+   alloc-ranges (optional) - prop-encoded-array (address, length pairs).
+                           - Specifies regions of memory that are
+                             acceptable to allocate from.
+
+If both reg and size are present, then the reg property takes precedence
+and size is ignored.
+
+Additional properties:
+compatible (optional) - standard definition
+    - may contain the following strings:
+        - shared-dma-pool: This indicates a region of memory meant to be
+          used as a shared pool of DMA buffers for a set of devices. It can
+          be used by an operating system to instantiate the necessary pool
+          management subsystem if necessary.
+        - vendor specific string in the form <vendor>,[<device>-]<usage>
+no-map (optional) - empty property
+    - Indicates the operating system must not create a virtual mapping
+      of the region as part of its standard mapping of system memory,
+      nor permit speculative access to it under any circumstances other
+      than under the control of the device driver using the region.
+reusable (optional) - empty property
+    - The operating system can use the memory in this region with the
+      limitation that the device driver(s) owning the region need to be
+      able to reclaim it back. Typically that means that the operating
+      system can use that region to store volatile or cached data that
+      can be otherwise regenerated or migrated elsewhere.
+
+Linux implementation note:
+- If a "linux,cma-default" property is present, then Linux will use the
+  region for the default pool of the contiguous memory allocator.
+
+- If a "linux,dma-default" property is present, then Linux will use the
+  region for the default pool of the consistent DMA allocator.
+
+Device node references to reserved memory
+-----------------------------------------
+Regions in the /reserved-memory node may be referenced by other device
+nodes by adding a memory-region property to the device node.
+
+memory-region (optional) - phandle, specifier pairs to children of /reserved-memory
+
+Example
+-------
+This example defines 3 contiguous regions are defined for Linux kernel:
+one default of all device drivers (named linux,cma@72000000 and 64MiB in size),
+one dedicated to the framebuffer device (named framebuffer@78000000, 8MiB), and
+one for multimedia processing (named multimedia-memory@77000000, 64MiB).
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       memory {
+               reg = <0x40000000 0x40000000>;
+       };
+
+       reserved-memory {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               /* global autoconfigured region for contiguous allocations */
+               linux,cma {
+                       compatible = "shared-dma-pool";
+                       reusable;
+                       size = <0x4000000>;
+                       alignment = <0x2000>;
+                       linux,cma-default;
+               };
+
+               display_reserved: framebuffer@78000000 {
+                       reg = <0x78000000 0x800000>;
+               };
+
+               multimedia_reserved: multimedia@77000000 {
+                       compatible = "acme,multimedia-memory";
+                       reg = <0x77000000 0x4000000>;
+               };
+       };
+
+       /* ... */
+
+       fb0: video@12300000 {
+               memory-region = <&display_reserved>;
+               /* ... */
+       };
+
+       scaler: scaler@12500000 {
+               memory-region = <&multimedia_reserved>;
+               /* ... */
+       };
+
+       codec: codec@12600000 {
+               memory-region = <&multimedia_reserved>;
+               /* ... */
+       };
+};
index f5c1e70605ee8f25f1845089e0af6c5b49b2df3f..8651f69cae21bfe4065e1a28e92edc922abda607 100644 (file)
@@ -74,11 +74,19 @@ L:  uboot-snps-arc@synopsys.com
 F:     doc/device-tree-bindings/gpio/snps,creg-gpio.txt
 F:     drivers/gpio/hsdk-creg-gpio.c
 
+ARC SYNOPSYS DW MMC EXTENSIONS
+M:     Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
+S:     Maintained
+L:     uboot-snps-arc@synopsys.com
+F:     doc/device-tree-bindings/mmc/snps,dw-mmc.txt
+F:     drivers/mmc/snps_dw_mmc.c
+
 ARM
 M:     Albert Aribaud <albert.u.boot@aribaud.net>
 S:     Maintained
 T:     git git://git.denx.de/u-boot-arm.git
 F:     arch/arm/
+F:     cmd/arm/
 
 ARM ALTERA SOCFPGA
 M:     Marek Vasut <marex@denx.de>
@@ -295,7 +303,9 @@ F:  drivers/misc/stm32mp_fuse.c
 F:     drivers/mmc/stm32_sdmmc2.c
 F:     drivers/phy/phy-stm32-usbphyc.c
 F:     drivers/pinctrl/pinctrl_stm32.c
+F:     drivers/power/pmic/stpmic1.c
 F:     drivers/power/regulator/stm32-vrefbuf.c
+F:     drivers/power/regulator/stpmic1.c
 F:     drivers/ram/stm32mp1/
 F:     drivers/misc/stm32_rcc.c
 F:     drivers/reset/stm32-reset.c
@@ -308,7 +318,7 @@ F:  arch/arm/cpu/armv7/stv0991/
 F:     arch/arm/include/asm/arch-stv0991/
 
 ARM SUNXI
-M:     Jagan Teki <jagan@openedev.com>
+M:     Jagan Teki <jagan@amarulasolutions.com>
 M:     Maxime Ripard <maxime.ripard@bootlin.com>
 S:     Maintained
 T:     git git://git.denx.de/u-boot-sunxi.git
@@ -668,6 +678,7 @@ M:  Rick Chen <rick@andestech.com>
 S:     Maintained
 T:     git git://git.denx.de/u-boot-riscv.git
 F:     arch/riscv/
+F:     cmd/riscv/
 F:     tools/prelink-riscv.c
 
 ROCKUSB
@@ -689,14 +700,14 @@ T:        git git://git.denx.de/u-boot-sh.git
 F:     arch/sh/
 
 SPI
-M:     Jagan Teki <jagan@openedev.com>
+M:     Jagan Teki <jagan@amarulasolutions.com>
 S:     Maintained
 T:     git git://git.denx.de/u-boot-spi.git
 F:     drivers/spi/
 F:     include/spi*
 
 SPI-NOR
-M:     Jagan Teki <jagan@openedev.com>
+M:     Jagan Teki <jagan@amarulasolutions.com>
 M:     Vignesh R <vigneshr@ti.com>
 S:     Maintained
 F:     drivers/mtd/spi/
@@ -779,6 +790,7 @@ M:  Bin Meng <bmeng.cn@gmail.com>
 S:     Maintained
 T:     git git://git.denx.de/u-boot-x86.git
 F:     arch/x86/
+F:     cmd/x86/
 
 XTENSA
 M:     Max Filippov <jcmvbkbc@gmail.com>
index 8f59c127649b2b6d8100dc1750726f28b2236e1b..f2c7bb6041a25d0d3bc0795d1e44c7ec3a4cb763 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -945,11 +945,22 @@ ifneq ($(CONFIG_DM_USB)$(CONFIG_OF_CONTROL)$(CONFIG_BLK),yyy)
        @echo >&2 "===================================================="
 endif
 endif
-ifeq ($(CONFIG_LIBATA)$(CONFIG_MVSATA_IDE),y)
-ifneq ($(CONFIG_DM_SCSI),y)
+ifeq ($(CONFIG_MVSATA_IDE),y)
        @echo >&2 "===================== WARNING ======================"
-       @echo >&2 "This board does not use CONFIG_DM_SCSI. Please update"
-       @echo >&2 "the storage controller to use CONFIG_DM_SCSI before the v2019.07 release."
+       @echo >&2 "This board does use CONFIG_MVSATA_IDE which is not"
+       @echo >&2 "ported to driver-model (DM) yet. Please update the storage"
+       @echo >&2 "controller driver to use CONFIG_AHCI before the v2019.07"
+       @echo >&2 "release."
+       @echo >&2 "Failure to update by the deadline may result in board removal."
+       @echo >&2 "See doc/driver-model/MIGRATION.txt for more info."
+       @echo >&2 "===================================================="
+endif
+ifeq ($(CONFIG_LIBATA),y)
+ifneq ($(CONFIG_AHCI),y)
+       @echo >&2 "===================== WARNING ======================"
+       @echo >&2 "This board does use CONFIG_LIBATA but has CONFIG_AHCI not"
+       @echo >&2 "enabled. Please update the storage controller driver to use"
+       @echo >&2 "CONFIG_AHCI before the v2019.07 release."
        @echo >&2 "Failure to update by the deadline may result in board removal."
        @echo >&2 "See doc/driver-model/MIGRATION.txt for more info."
        @echo >&2 "===================================================="
@@ -1020,6 +1031,20 @@ quiet_cmd_copy = COPY    $@
 
 ifeq ($(CONFIG_MULTI_DTB_FIT),y)
 
+ifeq ($(CONFIG_MULTI_DTB_FIT_LZO),y)
+FINAL_DTB_CONTAINER = fit-dtb.blob.lzo
+else ifeq ($(CONFIG_MULTI_DTB_FIT_GZIP),y)
+FINAL_DTB_CONTAINER = fit-dtb.blob.gz
+else
+FINAL_DTB_CONTAINER = fit-dtb.blob
+endif
+
+fit-dtb.blob.gz: fit-dtb.blob
+       @gzip -kf9 $< > $@
+
+fit-dtb.blob.lzo: fit-dtb.blob
+       @lzop -f9 $< > $@
+
 fit-dtb.blob: dts/dt.dtb FORCE
        $(call if_changed,mkimage)
 
@@ -1027,8 +1052,13 @@ MKIMAGEFLAGS_fit-dtb.blob = -f auto -A $(ARCH) -T firmware -C none -O u-boot \
        -a 0 -e 0 -E \
        $(patsubst %,-b arch/$(ARCH)/dts/%.dtb,$(subst ",,$(CONFIG_OF_LIST))) -d /dev/null
 
-u-boot-fit-dtb.bin: u-boot-nodtb.bin fit-dtb.blob
+ifneq ($(EXT_DTB),)
+u-boot-fit-dtb.bin: u-boot-nodtb.bin $(EXT_DTB)
+               $(call if_changed,cat)
+else
+u-boot-fit-dtb.bin: u-boot-nodtb.bin $(FINAL_DTB_CONTAINER)
        $(call if_changed,cat)
+endif
 
 u-boot.bin: u-boot-fit-dtb.bin FORCE
        $(call if_changed,copy)
@@ -1947,6 +1977,13 @@ endif
        $(build)=$(build-dir) $(@:.ko=.o)
        $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
 
+quiet_cmd_genenv = GENENV $@
+cmd_genenv = $(OBJCOPY) --dump-section .rodata.default_environment=$@ env/common.o; \
+       sed --in-place -e 's/\x00/\x0A/g' $@
+
+u-boot-initial-env: u-boot.bin
+       $(call if_changed,genenv)
+
 # Consistency checks
 # ---------------------------------------------------------------------------
 
index dfc03810ca0d75e46f9ca0849a25a61183cc3503..6d97de9fd8c91db1c55f6e642afd7dade9b20ecf 100644 (file)
                                #clock-cells = <0>;
                                u-boot,dm-pre-reloc;
                        };
+
+                       mmcclk_ciu: mmcclk-ciu {
+                               compatible = "fixed-clock";
+                               /*
+                                * DW sdio controller has external ciu clock divider
+                                * controlled via register in SDIO IP. It divides
+                                * sdio_ref_clk (which comes from CGU) by 16 for
+                                * default. So default mmcclk clock (which comes
+                                * to sdk_in) is 25000000 Hz.
+                                */
+                               clock-frequency = <25000000>;
+                               #clock-cells = <0>;
+                       };
+
+                       mmcclk_biu: mmcclk-biu {
+                               compatible = "fixed-clock";
+                               clock-frequency = <50000000>;
+                               #clock-cells = <0>;
+                       };
                };
 
                ethernet@18000 {
                        reg = < 0x60000 0x100 >;
                };
 
+               mmc: mmc@15000 {
+                       compatible = "snps,dw-mshc";
+                       reg = <0x15000 0x400>;
+                       bus-width = <4>;
+                       clocks = <&mmcclk_biu>, <&mmcclk_ciu>;
+                       clock-names = "biu", "ciu";
+                       max-frequency = <25000000>;
+               };
+
                uart0: serial0@22000 {
                        compatible = "snps,dw-apb-uart";
                        reg = <0x22000 0x100>;
@@ -71,7 +99,7 @@
                        clock-names = "spi_clk";
                        cs-gpio = <&cs_gpio 0>;
                        spi_flash@0 {
-                               compatible = "spi-flash";
+                               compatible = "jedec,spi-nor";
                                reg = <0>;
                                spi-max-frequency = <4000000>;
                        };
index f024b96925e440c956674833ab954f9fe6688554..7028050447ba3337e53e6ac2fbd3ce7c9f7de267 100644 (file)
                reg = <0xf0060000 0x100>;
        };
 
+       mmcclk_ciu: mmcclk-ciu {
+               compatible = "fixed-clock";
+               /*
+                * DW sdio controller has external ciu clock divider
+                * controlled via register in SDIO IP. Due to its
+                * unexpected default value (it should divide by 1
+                * but it divides by 8) SDIO IP uses wrong clock and
+                * works unstable (see STAR 9001204800)
+                * We switched to the minimum possible value of the
+                * divisor (div-by-2) in HSDK platform code.
+                * So default mmcclk ciu clock is 50000000 Hz.
+                */
+               clock-frequency = <50000000>;
+               #clock-cells = <0>;
+       };
+
+       mmc: mmc0@f000a000 {
+               compatible = "snps,dw-mshc";
+               reg = <0xf000a000 0x400>;
+               bus-width = <4>;
+               fifo-depth = <256>;
+               clocks = <&cgu_clk CLK_SYS_SDIO>, <&mmcclk_ciu>;
+               clock-names = "biu", "ciu";
+               max-frequency = <25000000>;
+       };
+
        spi0: spi@f0020000 {
                compatible = "snps,dw-apb-ssi";
                reg = <0xf0020000 0x1000>;
                clock-names = "spi_clk";
                cs-gpio = <&cs_gpio 0>;
                spi_flash@0 {
-                       compatible = "spi-flash";
+                       compatible = "jedec,spi-nor";
                        reg = <0>;
                        spi-max-frequency = <4000000>;
                };
index 4a23e327dfb486e041038ae3c34f53bec65a87d2..f58f8fb23594164d224800fd34184365eef7cb0e 100644 (file)
@@ -857,6 +857,8 @@ config ARCH_SUNXI
        select DM_ETH
        select DM_GPIO
        select DM_KEYBOARD
+       select DM_MMC if MMC
+       select DM_SCSI if SCSI
        select DM_SERIAL
        select DM_USB if DISTRO_DEFAULTS
        select OF_BOARD_SETUP
@@ -1403,11 +1405,15 @@ config ARCH_STM32MP
        select SYSRESET
        select SYS_THUMB_BUILD
        imply CMD_DM
+       imply CMD_POWEROFF
+       imply ENV_VARS_UBOOT_RUNTIME_CONFIG
        help
          Support for STM32MP SoC family developed by STMicroelectronics,
          MPUs based on ARM cortex A core
-         U-BOOT is running in DDR and SPL support is the unsecure First Stage
-         BootLoader (FSBL)
+         U-BOOT is running in DDR, loaded by the First Stage BootLoader (FSBL).
+         FSBL can be TF-A: Trusted Firmware for Cortex A, for trusted boot
+         chain.
+         SPL is the unsecure FSBL for the basic boot chain.
 
 config ARCH_ROCKCHIP
        bool "Support Rockchip SoCs"
@@ -1464,6 +1470,21 @@ config TI_SECURE_DEVICE
          authenticated) and the code. See the doc/README.ti-secure
          file for further details.
 
+if AM43XX || AM33XX || OMAP54XX || ARCH_KEYSTONE
+config ISW_ENTRY_ADDR
+       hex "Address in memory or XIP address of bootloader entry point"
+       default 0x402F4000 if AM43XX
+       default 0x402F0400 if AM33XX
+       default 0x40301350 if OMAP54XX
+       help
+         After any reset, the boot ROM searches the boot media for a valid
+         boot image. For non-XIP devices, the ROM then copies the image into
+         internal memory. For all boot modes, after the ROM processes the
+         boot image it eventually computes the entry point address depending
+         on the device type (secure/non-secure), boot media (xip/non-xip) and
+         image headers.
+endif
+
 source "arch/arm/mach-aspeed/Kconfig"
 
 source "arch/arm/mach-at91/Kconfig"
@@ -1563,6 +1584,7 @@ source "arch/arm/cpu/armv8/Kconfig"
 source "arch/arm/mach-imx/Kconfig"
 
 source "board/bosch/shc/Kconfig"
+source "board/bosch/guardian/Kconfig"
 source "board/CarMediaLab/flea3/Kconfig"
 source "board/Marvell/aspenite/Kconfig"
 source "board/Marvell/gplugd/Kconfig"
index 13905b5281f21678b8fe5031008411c3eefc745f..5d485a3ce24006e581fdfca29246cbc3a307e7ab 100644 (file)
@@ -23,6 +23,7 @@ config TARGET_BK4R1
        bool "BK4r1"
        select SYS_FSL_ERRATUM_ESDHC135
        select SYS_FSL_ERRATUM_ESDHC_A001
+       select BOARD_LATE_INIT
 
 endchoice
 
index cbd3391918cdf163740211d99736937f209d77c5..90fa695e98e55c7221fa1d4f73f6a5a08740144b 100644 (file)
@@ -252,7 +252,7 @@ U_BOOT_CMD(
 );
 
 #ifdef CONFIG_FEC_MXC
-void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
+__weak void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
 {
        struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
        struct fuse_bank *bank = &ocotp->bank[4];
@@ -375,3 +375,25 @@ void enable_caches(void)
        mmu_set_region_dcache_behaviour(IRAM_BASE_ADDR, IRAM_SIZE, option);
 }
 #endif
+
+#ifdef CONFIG_SYS_I2C_MXC
+/* i2c_num can be from 0 - 3 */
+int enable_i2c_clk(unsigned char enable, unsigned int i2c_num)
+{
+       struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
+
+       switch (i2c_num) {
+       case 0:
+               clrsetbits_le32(&ccm->ccgr4, CCM_CCGR4_I2C0_CTRL_MASK,
+                               CCM_CCGR4_I2C0_CTRL_MASK);
+       case 2:
+               clrsetbits_le32(&ccm->ccgr10, CCM_CCGR10_I2C2_CTRL_MASK,
+                               CCM_CCGR10_I2C2_CTRL_MASK);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+#endif
index a5f54330e38e9675a4ce1908329e1587129c707f..b349b13f497a2caa01da8751de0955ef62ff7912 100644 (file)
@@ -19,7 +19,9 @@ endif
 obj-y  += cache.o
 obj-y  += tlb.o
 obj-y  += transition.o
+ifndef CONFIG_ARMV8_PSCI
 obj-y  += fwcall.o
+endif
 obj-y  += cpu-dt.o
 obj-$(CONFIG_ARM_SMCCC)                += smccc-call.o
 
index 9957c2974bc09134207ad0252052e5aabe55688e..b0aca1b72a3b9fbf732d733446941127f0551331 100644 (file)
@@ -28,7 +28,6 @@ static void hvc_call(struct pt_regs *args)
                "ldr x4, %4\n"
                "ldr x5, %5\n"
                "ldr x6, %6\n"
-               "ldr x7, %7\n"
                "hvc    #0\n"
                "str x0, %0\n"
                "str x1, %1\n"
@@ -37,7 +36,7 @@ static void hvc_call(struct pt_regs *args)
                : "+m" (args->regs[0]), "+m" (args->regs[1]),
                  "+m" (args->regs[2]), "+m" (args->regs[3])
                : "m" (args->regs[4]), "m" (args->regs[5]),
-                 "m" (args->regs[6]), "m" (args->regs[7])
+                 "m" (args->regs[6])
                : "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
                  "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
                  "x16", "x17");
index 358df8fee9c32a1d5956e5a1252e48b8f88fa896..7ffc8dbadbe0d07c9f2cc0aa9fbc5679b25d869a 100644 (file)
@@ -8,6 +8,7 @@
 #include <config.h>
 #include <linux/linkage.h>
 #include <asm/psci.h>
+#include <asm/secure.h>
 
 /* Default PSCI function, return -1, Not Implemented */
 #define PSCI_DEFAULT(__fn) \
@@ -19,8 +20,8 @@
 
 /* PSCI function and ID table definition*/
 #define PSCI_TABLE(__id, __fn) \
-       .word __id; \
-       .word __fn
+       .quad __id; \
+       .quad __fn
 
 .pushsection ._secure.text, "ax"
 
@@ -132,33 +133,52 @@ PSCI_TABLE(0, 0)
 /* Caller must put PSCI function-ID table base in x9 */
 handle_psci:
        psci_enter
-1:     ldr x10, [x9]                   /* Load PSCI function table */
-       ubfx x11, x10, #32, #32
-       ubfx x10, x10, #0, #32
+1:     ldr     x10, [x9]               /* Load PSCI function table */
        cbz     x10, 3f                 /* If reach the end, bail out */
        cmp     x10, x0
        b.eq    2f                      /* PSCI function found */
-       add x9, x9, #                 /* If not match, try next entry */
+       add x9, x9, #16                 /* If not match, try next entry */
        b       1b
 
-2:     blr     x11                     /* Call PSCI function */
+2:     ldr     x11, [x9, #8]           /* Load PSCI function */
+       blr     x11                     /* Call PSCI function */
        psci_return
 
 3:     mov     x0, #ARM_PSCI_RET_NI
        psci_return
 
-unknown_smc_id:
-       ldr     x0, =0xFFFFFFFF
+/*
+ * Handle SiP service functions defined in SiP service function table.
+ * Use DECLARE_SECURE_SVC(_name, _id, _fn) to add platform specific SiP
+ * service function into the SiP service function table.
+ * SiP service function table is located in '._secure_svc_tbl_entries' section,
+ * which is next to '._secure.text' section.
+ */
+handle_svc:
+       adr     x9, __secure_svc_tbl_start
+       adr     x10, __secure_svc_tbl_end
+       subs    x12, x10, x9    /* Get number of entries in table */
+       b.eq    2f              /* Make sure SiP function table is not empty */
+       psci_enter
+1:     ldr x10, [x9]           /* Load SiP function table */
+       ldr x11, [x9, #8]
+       cmp     w10, w0
+       b.eq    2b              /* SiP service function found */
+       add x9, x9, #SECURE_SVC_TBL_OFFSET      /* Move to next entry */
+       subs    x12, x12, #SECURE_SVC_TBL_OFFSET
+       b.eq    3b              /* If reach the end, bail out */
+       b       1b
+2:     ldr     x0, =0xFFFFFFFF
        eret
 
 handle_smc32:
        /* SMC function ID  0x84000000-0x8400001F: 32 bits PSCI */
        ldr     w9, =0x8400001F
        cmp     w0, w9
-       b.gt    unknown_smc_id
+       b.gt    handle_svc
        ldr     w9, =0x84000000
        cmp     w0, w9
-       b.lt    unknown_smc_id
+       b.lt    handle_svc
 
        adr     x9, _psci_32_table
        b       handle_psci
@@ -171,10 +191,10 @@ handle_smc64:
        /* SMC function ID 0xC4000000-0xC400001F: 64 bits PSCI */
        ldr     x9, =0xC400001F
        cmp     x0, x9
-       b.gt    unknown_smc_id
+       b.gt    handle_svc
        ldr     x9, =0xC4000000
        cmp     x0, x9
-       b.lt    unknown_smc_id
+       b.lt    handle_svc
 
        adr     x9, _psci_64_table
        b       handle_psci
index 53de80f745ecd5e15ba158853ef59b85926d0345..2554980595b14cf9a1f5b13db03f147f73048305 100644 (file)
@@ -58,6 +58,10 @@ SECTIONS
                AT(ADDR(.__secure_start) + SIZEOF(.__secure_start))
        {
                *(._secure.text)
+               . = ALIGN(8);
+               __secure_svc_tbl_start = .;
+               KEEP(*(._secure_svc_tbl_entries))
+               __secure_svc_tbl_end = .;
        }
 
        .secure_data : AT(LOADADDR(.secure_text) + SIZEOF(.secure_text))
index c5658d359f8063eefed0da3019646a6588804f5d..1452fd21898852d52ebb115742abe3999a31b159 100644 (file)
@@ -142,7 +142,7 @@ dtb-$(CONFIG_ARCH_MVEBU) +=                 \
        armada-388-clearfog.dtb                 \
        armada-388-gp.dtb                       \
        armada-388-helios4.dtb                  \
-       armada-385-amc.dtb                      \
+       armada-385-db-88f6820-amc.dtb           \
        armada-385-turris-omnia.dtb             \
        armada-7040-db.dtb                      \
        armada-7040-db-nand.dtb                 \
@@ -155,7 +155,8 @@ dtb-$(CONFIG_ARCH_MVEBU) +=                 \
        armada-xp-theadorable.dtb               \
        armada-38x-controlcenterdc.dtb          \
        armada-385-atl-x530.dtb                 \
-       armada-385-atl-x530DP.dtb
+       armada-385-atl-x530DP.dtb               \
+       armada-xp-db-xc3-24g4xg.dtb
 
 dtb-$(CONFIG_ARCH_UNIPHIER_LD11) += \
        uniphier-ld11-global.dtb \
@@ -255,7 +256,8 @@ dtb-$(CONFIG_AM33XX) += \
        am335x-pdu001.dtb \
        am335x-chiliboard.dtb \
        am335x-sl50.dtb \
-       am335x-base0033.dtb
+       am335x-base0033.dtb \
+       am335x-guardian.dtb
 dtb-$(CONFIG_AM43XX) += am437x-gp-evm.dtb am437x-sk-evm.dtb    \
        am43x-epos-evm.dtb \
        am437x-idk-evm.dtb \
@@ -478,6 +480,7 @@ dtb-$(CONFIG_MACH_SUN50I) += \
        sun50i-a64-amarula-relic.dtb \
        sun50i-a64-bananapi-m64.dtb \
        sun50i-a64-nanopi-a64.dtb \
+       sun50i-a64-oceanic-5205-5inmfd.dtb \
        sun50i-a64-olinuxino.dtb \
        sun50i-a64-orangepi-win.dtb \
        sun50i-a64-pine64-lts.dtb \
@@ -493,16 +496,20 @@ dtb-$(CONFIG_MACH_SUN9I) += \
 dtb-$(CONFIG_VF610) += vf500-colibri.dtb \
        vf610-colibri.dtb \
        vf610-twr.dtb \
-       pcm052.dtb \
-       bk4r1.dtb
+       vf610-pcm052.dtb \
+       vf610-bk4r1.dtb
 
 dtb-$(CONFIG_MX53) += imx53-cx9020.dtb \
        imx53-kp.dtb
 
 dtb-$(CONFIG_MX6Q) += \
+       imx6-apalis.dtb \
        imx6q-display5.dtb \
        imx6q-logicpd.dtb
 
+dtb-$(CONFIG_TARGET_TBS2910) += \
+       imx6q-tbs2910.dtb
+
 dtb-$(CONFIG_MX6QDL) += \
        imx6dl-icore.dtb \
        imx6dl-icore-mipi.dtb \
@@ -519,6 +526,9 @@ dtb-$(CONFIG_MX6QDL) += \
        imx6qp-sabreauto.dtb \
        imx6qp-sabresd.dtb
 
+dtb-$(CONFIG_TARGET_WANDBOARD) += \
+       imx6dl-wandboard-revb1.dtb
+
 dtb-$(CONFIG_MX6SL) += imx6sl-evk.dtb
 
 dtb-$(CONFIG_MX6SLL) += imx6sll-evk.dtb
@@ -544,6 +554,9 @@ dtb-$(CONFIG_MX6ULL) += \
        imx6ull-14x14-evk.dtb \
        imx6ull-colibri.dtb \
 
+dtb-$(CONFIG_ARCH_MX6) += \
+       imx6-colibri.dtb
+
 dtb-$(CONFIG_MX7) += imx7d-sdb.dtb \
        imx7d-sdb-qspi.dtb \
        imx7-colibri-emmc.dtb \
@@ -571,6 +584,7 @@ dtb-$(CONFIG_RCAR_GEN3) += \
        r8a7795-salvator-x-u-boot.dtb \
        r8a7796-m3ulcb-u-boot.dtb \
        r8a7796-salvator-x-u-boot.dtb \
+       r8a77965-m3nulcb-u-boot.dtb \
        r8a77965-salvator-x-u-boot.dtb \
        r8a77970-eagle-u-boot.dtb \
        r8a77990-ebisu-u-boot.dtb \
@@ -647,6 +661,9 @@ dtb-$(CONFIG_TARGET_SAMA5D2_XPLAINED) += \
 dtb-$(CONFIG_TARGET_SAMA5D27_SOM1_EK) += \
        at91-sama5d27_som1_ek.dtb
 
+dtb-$(CONFIG_TARGET_SAMA5D2_ICP) += \
+       at91-sama5d2_icp.dtb
+
 dtb-$(CONFIG_TARGET_SAMA5D3XEK) += \
        sama5d31ek.dtb \
        sama5d33ek.dtb \
@@ -688,6 +705,8 @@ dtb-$(CONFIG_ARCH_ASPEED) += ast2500-evb.dtb
 dtb-$(CONFIG_ARCH_STI) += stih410-b2260.dtb
 
 dtb-$(CONFIG_TARGET_STM32MP1) += \
+       stm32mp157a-dk1.dtb \
+       stm32mp157c-dk2.dtb \
        stm32mp157c-ed1.dtb \
        stm32mp157c-ev1.dtb
 
@@ -697,6 +716,9 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += \
        mt7623n-bananapi-bpi-r2.dtb \
        mt7629-rfb.dtb
 
+dtb-$(CONFIG_TARGET_GE_BX50V3) += imx6q-bx50v3.dtb
+dtb-$(CONFIG_TARGET_MX53PPD) += imx53-ppd.dtb
+
 targets += $(dtb-y)
 
 # Add any required device tree compiler flags here
index 522ed5090208614c1634b7995a89fcb45efca488..01ab74be5edb1bb5b0669bd4631c9928a654134c 100644 (file)
        spi_flash: spiflash@0 {
                u-boot,dm-spl;
                u-boot,dm-pre-reloc;
-               compatible = "spidev", "spi-flash";
+               compatible = "spidev", "jedec,spi-nor";
                spi-max-frequency = <24000000>;
                reg = <0>;
        };
diff --git a/arch/arm/dts/am335x-guardian-u-boot.dtsi b/arch/arm/dts/am335x-guardian-u-boot.dtsi
new file mode 100644 (file)
index 0000000..156b9b0
--- /dev/null
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018 EETS GmbH - https://www.eets.ch/
+ * Copyright (C) 2018 Robert Bosch Power Tools GmbH
+ */
+
+/ {
+       ocp {
+               u-boot,dm-pre-reloc;
+       };
+};
+
+&l4_wkup {
+       u-boot,dm-pre-reloc;
+};
+
+&mmc1 {
+       u-boot,dm-pre-reloc;
+};
+
+&mmc1_pins {
+       u-boot,dm-pre-reloc;
+};
+
+&rtc {
+       clocks = <&l4_per_clkctrl AM3_CLKDIV32K_CLKCTRL 0>;
+       clock-names = "int-clk";
+};
+
+&scm {
+       u-boot,dm-pre-reloc;
+};
+
+&uart0 {
+       u-boot,dm-pre-reloc;
+};
+
+&uart0_pins {
+       u-boot,dm-pre-reloc;
+};
+
+&usb {
+       u-boot,dm-pre-reloc;
+};
+
+&usb_ctrl_mod {
+       u-boot,dm-pre-reloc;
+};
+
+&usb0 {
+       u-boot,dm-pre-reloc;
+};
+
+&usb0_phy {
+       u-boot,dm-pre-reloc;
+};
+
+&am33xx_pinmux {
+       u-boot,dm-pre-reloc;
+
+       lcd0_pins: pinmux_lcd0_pins {
+               pinctrl-single,pins = <
+                       AM33XX_IOPAD(0x908, PIN_OUTPUT_PULLUP   | MUX_MODE7)
+               >;
+       };
+};
diff --git a/arch/arm/dts/am335x-guardian.dts b/arch/arm/dts/am335x-guardian.dts
new file mode 100644 (file)
index 0000000..f3f022c
--- /dev/null
@@ -0,0 +1,509 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
+ * Copyright (C) 2018 Robert Bosch Power Tools GmbH
+ */
+/dts-v1/;
+
+#include "am33xx.dtsi"
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/interrupt-controller/irq.h>
+
+/ {
+       model = "Bosch AM335x Guardian";
+       compatible = "bosch,am335x-guardian", "ti,am33xx";
+
+       chosen {
+               stdout-path = &uart0;
+               tick-timer = &timer2;
+       };
+
+       cpus {
+               cpu@0 {
+                       cpu0-supply = <&dcdc2_reg>;
+               };
+       };
+
+       memory@80000000 {
+               device_type = "memory";
+               reg = <0x80000000 0x10000000>; /* 256 MB */
+       };
+
+       gpio_keys {
+               compatible = "gpio-keys";
+               pinctrl-names = "default";
+               pinctrl-0 = <&gpio_keys_pins>;
+
+               button21 {
+                       label = "guardian-power-button";
+                       linux,code = <KEY_POWER>;
+                       gpios = <&gpio2 21 0>;
+                       wakeup-source;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               pinctrl-names = "default";
+               pinctrl-0 = <&leds_pins>;
+
+               led1 {
+                       label = "green:heartbeat";
+                       gpios = <&gpio1 27 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "heartbeat";
+                       default-state = "off";
+               };
+
+               led2 {
+                       label = "green:mmc0";
+                       gpios = <&gpio1 26 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "mmc0";
+                       default-state = "off";
+               };
+       };
+
+       panel {
+               compatible = "ti,tilcdc,panel";
+               pinctrl-names = "default", "sleep";
+               pinctrl-0 = <&lcd_pins_default &lcd_disen_pins>;
+               pinctrl-1 = <&lcd_pins_sleep>;
+
+               display-timings {
+                       320x240 {
+                               hactive         = <320>;
+                               vactive         = <240>;
+                               hback-porch     = <68>;
+                               hfront-porch    = <20>;
+                               hsync-len       = <1>;
+                               vback-porch     = <18>;
+                               vfront-porch    = <4>;
+                               vsync-len       = <1>;
+                               clock-frequency = <9000000>;
+                               hsync-active    = <0>;
+                               vsync-active    = <0>;
+                       };
+               };
+               panel-info {
+                       ac-bias           = <255>;
+                       ac-bias-intrpt    = <0>;
+                       dma-burst-sz      = <16>;
+                       bpp               = <24>;
+                       bus-width         = <16>;
+                       fdd               = <0x80>;
+                       sync-edge         = <0>;
+                       sync-ctrl         = <1>;
+                       raster-order      = <0>;
+                       fifo-th           = <0>;
+               };
+
+       };
+
+       pwm7: dmtimer-pwm {
+               compatible = "ti,omap-dmtimer-pwm";
+               ti,timers = <&timer7>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&dmtimer7_pins>;
+       };
+
+       vmmcsd_fixed: regulator-3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "vmmcsd_fixed";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+};
+
+&cppi41dma  {
+       status = "okay";
+};
+
+&elm {
+       status = "okay";
+};
+
+&gpmc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&nandflash_pins>;
+       ranges = <0 0 0x08000000 0x1000000>;  /* CS0: 16MB for NAND */
+       status = "okay";
+
+       nand@0,0 {
+               compatible = "ti,omap2-nand";
+               reg = <0 0 4>; /* CS0, offset 0, IO size 4 */
+               interrupt-parent = <&gpmc>;
+               interrupts = <0 IRQ_TYPE_NONE>, /* fifoevent */
+                            <1 IRQ_TYPE_NONE>; /* termcount */
+               rb-gpios = <&gpmc 0 GPIO_ACTIVE_HIGH>; /* gpmc_wait0 */
+               ti,nand-ecc-opt = "bch16";
+               ti,elm-id = <&elm>;
+               nand-bus-width = <8>;
+               gpmc,device-width = <1>;
+               gpmc,sync-clk-ps = <0>;
+               gpmc,cs-on-ns = <0>;
+               gpmc,cs-rd-off-ns = <44>;
+               gpmc,cs-wr-off-ns = <44>;
+               gpmc,adv-on-ns = <6>;
+               gpmc,adv-rd-off-ns = <34>;
+               gpmc,adv-wr-off-ns = <44>;
+               gpmc,we-on-ns = <0>;
+               gpmc,we-off-ns = <40>;
+               gpmc,oe-on-ns = <0>;
+               gpmc,oe-off-ns = <54>;
+               gpmc,access-ns = <64>;
+               gpmc,rd-cycle-ns = <82>;
+               gpmc,wr-cycle-ns = <82>;
+               gpmc,bus-turnaround-ns = <0>;
+               gpmc,cycle2cycle-delay-ns = <0>;
+               gpmc,clk-activation-ns = <0>;
+               gpmc,wr-access-ns = <40>;
+               gpmc,wr-data-mux-bus-ns = <0>;
+
+               /*
+                * MTD partition table
+                *
+                * All SPL-* partitions are sized to minimal length which can
+                * be independently programmable. For NAND flash this is equal
+                * to size of erase-block.
+                */
+               #address-cells = <1>;
+               #size-cells = <1>;
+
+               partition@0 {
+                       label = "SPL";
+                       reg = <0x0 0x40000>;
+               };
+
+               partition@1 {
+                       label = "SPL.backup1";
+                       reg = <0x40000  0x40000>;
+               };
+
+               partition@2 {
+                       label = "SPL.backup2";
+                       reg = <0x80000  0x40000>;
+               };
+
+               partition@3 {
+                       label = "SPL.backup3";
+                       reg = <0xc0000  0x40000>;
+               };
+
+               partition@4 {
+                       label = "u-boot";
+                       reg = <0x100000 0x100000>;
+               };
+
+               partition@5 {
+                       label = "u-boot.backup1";
+                       reg = <0x200000 0x100000>;
+               };
+
+               partition@6 {
+                       label = "u-boot-env";
+                       reg = <0x300000 0x40000>;
+               };
+
+               partition@7 {
+                       label = "u-boot-env.backup1";
+                       reg = <0x340000 0x40000>;
+               };
+
+               partition@8 {
+                       label = "UBI";
+                       reg = <0x380000 0x1fc80000>;
+               };
+       };
+};
+
+&i2c0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c0_pins>;
+       clock-frequency = <400000>;
+       status = "okay";
+
+       tps: tps@24 {
+               reg = <0x24>;
+       };
+};
+
+&lcdc {
+       blue-and-red-wiring = "crossed";
+       status = "okay";
+};
+
+&mmc1 {
+       bus-width = <0x4>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&mmc1_pins>;
+       cd-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&vmmcsd_fixed>;
+       status = "okay";
+};
+
+&rtc {
+       clocks = <&clk_32768_ck>, <&clk_24mhz_clkctrl AM3_CLK_24MHZ_CLKDIV32K_CLKCTRL 0>;
+       clock-names = "ext-clk", "int-clk";
+       system-power-controller;
+};
+
+&spi0 {
+       ti,pindir-d0-out-d1-in;
+       pinctrl-names = "default";
+       pinctrl-0 = <&spi0_pins>;
+       status = "okay";
+};
+
+/include/ "tps65217.dtsi"
+
+&tps {
+       ti,pmic-shutdown-controller;
+       interrupt-parent = <&intc>;
+       interrupts = <7>; /* NMI */
+
+       backlight {
+               isel = <1>;  /* 1 - ISET1, 2 ISET2 */
+               fdim = <100>; /* TPS65217_BL_FDIM_100HZ */
+               default-brightness = <100>;
+       };
+
+       regulators {
+               dcdc1_reg: regulator@0 {
+                       regulator-name = "vdds_dpr";
+                       regulator-always-on;
+               };
+
+               dcdc2_reg: regulator@1 {
+                       regulator-name = "vdd_mpu";
+                       regulator-min-microvolt = <925000>;
+                       regulator-max-microvolt = <1351500>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               dcdc3_reg: regulator@2 {
+                       regulator-name = "vdd_core";
+                       regulator-min-microvolt = <925000>;
+                       regulator-max-microvolt = <1150000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               ldo1_reg: regulator@3 {
+                       regulator-name = "vio,vrtc,vdds";
+                       regulator-always-on;
+               };
+
+               ldo2_reg: regulator@4 {
+                       regulator-name = "vdd_3v3aux";
+                       regulator-always-on;
+               };
+
+               ldo3_reg: regulator@5 {
+                       regulator-name = "vdd_1v8";
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-always-on;
+               };
+
+               ldo4_reg: regulator@6 {
+                       regulator-name = "vdd_3v3a";
+                       regulator-always-on;
+               };
+       };
+};
+
+&tscadc {
+       status = "okay";
+
+       adc {
+               ti,adc-channels = <0 1 2 3 4 5 6>;
+       };
+};
+
+&uart0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart0_pins>;
+       status = "okay";
+};
+
+&usb {
+       status = "okay";
+};
+
+&usb_ctrl_mod {
+       status = "okay";
+};
+
+&usb0 {
+       dr_mode = "peripheral";
+       status = "okay";
+};
+
+&usb0_phy {
+       status = "okay";
+};
+
+&usb1 {
+       dr_mode = "host";
+       status = "okay";
+};
+
+&usb1_phy {
+       status = "okay";
+};
+
+&am33xx_pinmux {
+       pinctrl-names = "default";
+       pinctrl-0 = <&clkout2_pin &gpio_pins>;
+
+       clkout2_pin: pinmux_clkout2_pin {
+               pinctrl-single,pins = <
+                       AM33XX_IOPAD(0x9b4, PIN_OUTPUT_PULLDOWN | MUX_MODE3)
+               >;
+       };
+
+       dmtimer7_pins: pinmux_dmtimer7_pins {
+               pinctrl-single,pins = <
+                       AM33XX_IOPAD(0x968, PIN_OUTPUT | MUX_MODE5)
+               >;
+       };
+
+       gpio_keys_pins: pinmux_gpio_keys_pins {
+               pinctrl-single,pins = <
+                       AM33XX_IOPAD(0x940, PIN_INPUT | MUX_MODE7)
+               >;
+       };
+
+       gpio_pins: pinmux_gpio_pins {
+               pinctrl-single,pins = <
+                       AM33XX_IOPAD(0x928, PIN_OUTPUT | MUX_MODE7)
+                       AM33XX_IOPAD(0x990, PIN_OUTPUT | MUX_MODE7)
+               >;
+       };
+
+       i2c0_pins: pinmux_i2c0_pins {
+               pinctrl-single,pins = <
+                       AM33XX_IOPAD(0x988, PIN_INPUT_PULLUP | MUX_MODE0)
+                       AM33XX_IOPAD(0x98c, PIN_INPUT_PULLUP | MUX_MODE0)
+               >;
+       };
+
+       lcd_disen_pins: pinmux_lcd_disen_pins {
+               pinctrl-single,pins = <
+                       AM33XX_IOPAD(0x9a4, PIN_OUTPUT_PULLUP | SLEWCTRL_SLOW | MUX_MODE7)
+               >;
+       };
+
+       lcd_pins_default: pinmux_lcd_pins_default {
+               pinctrl-single,pins = <
+                       AM33XX_IOPAD(0x820, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE1)
+                       AM33XX_IOPAD(0x824, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE1)
+                       AM33XX_IOPAD(0x828, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE1)
+                       AM33XX_IOPAD(0x82c, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE1)
+                       AM33XX_IOPAD(0x830, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE1)
+                       AM33XX_IOPAD(0x834, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE1)
+                       AM33XX_IOPAD(0x838, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE1)
+                       AM33XX_IOPAD(0x83c, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE1)
+                       AM33XX_IOPAD(0x8a0, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8a4, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8a8, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8ac, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8b0, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8b4, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8b8, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8bc, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8c0, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8c4, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8c8, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8cc, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8d0, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8d4, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8d8, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8dc, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8e0, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8e4, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8e8, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+                       AM33XX_IOPAD(0x8ec, PIN_OUTPUT | SLEWCTRL_SLOW | MUX_MODE0)
+               >;
+       };
+
+       lcd_pins_sleep: pinmux_lcd_pins_sleep {
+               pinctrl-single,pins = <
+                       AM33XX_IOPAD(0x8a0, PULL_DISABLE | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8a4, PULL_DISABLE | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8a8, PULL_DISABLE | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8ac, PULL_DISABLE | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8b0, PULL_DISABLE | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8b4, PULL_DISABLE | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8b8, PULL_DISABLE | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8bc, PULL_DISABLE | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8c0, PULL_DISABLE | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8c4, PULL_DISABLE | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8c8, PULL_DISABLE | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8cc, PULL_DISABLE | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8d0, PULL_DISABLE | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8d4, PULL_DISABLE | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8d8, PULL_DISABLE | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8dc, PULL_DISABLE | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8e0, PIN_INPUT_PULLDOWN | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8e4, PIN_INPUT_PULLDOWN | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8e8, PIN_INPUT_PULLDOWN | SLEWCTRL_SLOW | MUX_MODE7)
+                       AM33XX_IOPAD(0x8ec, PIN_INPUT_PULLDOWN | SLEWCTRL_SLOW | MUX_MODE7)
+               >;
+       };
+
+       leds_pins: pinmux_leds_pins {
+               pinctrl-single,pins = <
+                       AM33XX_IOPAD(0x868, PIN_OUTPUT | MUX_MODE7)
+                       AM33XX_IOPAD(0x86c, PIN_OUTPUT | MUX_MODE7)
+               >;
+       };
+
+       mmc1_pins: pinmux_mmc1_pins {
+               pinctrl-single,pins = <
+                       AM33XX_IOPAD(0x8f0, PIN_INPUT_PULLUP | MUX_MODE0)
+                       AM33XX_IOPAD(0x8f4, PIN_INPUT_PULLUP | MUX_MODE0)
+                       AM33XX_IOPAD(0x8f8, PIN_INPUT_PULLUP | MUX_MODE0)
+                       AM33XX_IOPAD(0x8fc, PIN_INPUT_PULLUP | MUX_MODE0)
+                       AM33XX_IOPAD(0x900, PIN_INPUT_PULLUP | MUX_MODE0)
+                       AM33XX_IOPAD(0x904, PIN_INPUT_PULLUP | MUX_MODE0)
+                       AM33XX_IOPAD(0x960, PIN_INPUT | MUX_MODE7)
+               >;
+       };
+
+       spi0_pins: pinmux_spi0_pins {
+               pinctrl-single,pins = <
+                       AM33XX_IOPAD(0x950, PIN_OUTPUT_PULLDOWN | MUX_MODE0)
+                       AM33XX_IOPAD(0x954, PIN_OUTPUT_PULLUP | MUX_MODE0)
+                       AM33XX_IOPAD(0x958, PIN_INPUT_PULLUP | MUX_MODE0)
+                       AM33XX_IOPAD(0x95c, PIN_OUTPUT_PULLUP | MUX_MODE0)
+               >;
+       };
+
+       uart0_pins: pinmux_uart0_pins {
+               pinctrl-single,pins = <
+                       AM33XX_IOPAD(0x970, PIN_INPUT_PULLUP | MUX_MODE0)
+                       AM33XX_IOPAD(0x974, PIN_OUTPUT_PULLDOWN | MUX_MODE0)
+               >;
+       };
+
+       nandflash_pins: pinmux_nandflash_pins {
+               pinctrl-single,pins = <
+                       AM33XX_IOPAD(0x800, PIN_INPUT | MUX_MODE0)
+                       AM33XX_IOPAD(0x804, PIN_INPUT | MUX_MODE0)
+                       AM33XX_IOPAD(0x808, PIN_INPUT | MUX_MODE0)
+                       AM33XX_IOPAD(0x80c, PIN_INPUT | MUX_MODE0)
+                       AM33XX_IOPAD(0x810, PIN_INPUT | MUX_MODE0)
+                       AM33XX_IOPAD(0x814, PIN_INPUT | MUX_MODE0)
+                       AM33XX_IOPAD(0x818, PIN_INPUT | MUX_MODE0)
+                       AM33XX_IOPAD(0x81c, PIN_INPUT | MUX_MODE0)
+                       AM33XX_IOPAD(0x870, PIN_INPUT | MUX_MODE0)
+                       AM33XX_IOPAD(0x874, PIN_OUTPUT | MUX_MODE0)
+                       AM33XX_IOPAD(0x87c, PIN_OUTPUT | MUX_MODE0)
+                       AM33XX_IOPAD(0x890, PIN_OUTPUT | MUX_MODE0)
+                       AM33XX_IOPAD(0x894, PIN_OUTPUT | MUX_MODE0)
+                       AM33XX_IOPAD(0x898, PIN_OUTPUT | MUX_MODE0)
+                       AM33XX_IOPAD(0x89c, PIN_OUTPUT | MUX_MODE0)
+               >;
+       };
+};
index 28e3e1ba32a8de33ba8ca10f3f9e8f5b2a8e68fd..19d1462d15839be3ac8c41b6a5a44d4fed316662 100644 (file)
 
        spi-max-frequency = <48000000>;
        m25p80@0 {
-               compatible = "mx66l51235l", "spi-flash";
+               compatible = "mx66l51235l", "jedec,spi-nor";
                spi-max-frequency = <48000000>;
                reg = <0>;
                spi-cpol;
index 927d8d3e882a8dcfdc36c62c35de86b3a150bb56..dc8fcde4586f10dc8dbf970846bae06837074c14 100644 (file)
 
        spi-max-frequency = <48000000>;
        m25p80@0 {
-               compatible = "mx66l51235l","spi-flash";
+               compatible = "mx66l51235l","jedec,spi-nor";
                spi-max-frequency = <48000000>;
                reg = <0>;
                spi-cpol;
diff --git a/arch/arm/dts/am57xx-cl-som-am57x.dts b/arch/arm/dts/am57xx-cl-som-am57x.dts
deleted file mode 100644 (file)
index 203266f..0000000
+++ /dev/null
@@ -1,617 +0,0 @@
-/*
- * Support for CompuLab CL-SOM-AM57x System-on-Module
- *
- * Copyright (C) 2015 CompuLab Ltd. - http://www.compulab.co.il/
- * Author: Dmitry Lifshitz <lifshitz@compulab.co.il>
- *
- * 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.
- */
-
-/dts-v1/;
-
-#include <dt-bindings/gpio/gpio.h>
-#include <dt-bindings/interrupt-controller/irq.h>
-#include "dra74x.dtsi"
-
-/ {
-       model = "CompuLab CL-SOM-AM57x";
-       compatible = "compulab,cl-som-am57x", "ti,am5728", "ti,dra742", "ti,dra74", "ti,dra7";
-
-       memory@0 {
-               device_type = "memory";
-               reg = <0x0 0x80000000 0x0 0x20000000>; /* 512 MB - minimal configuration */
-       };
-
-       leds {
-               compatible = "gpio-leds";
-               pinctrl-names = "default";
-               pinctrl-0 = <&leds_pins_default>;
-
-               led0 {
-                       label = "cl-som-am57x:green";
-                       gpios = <&gpio2 5 GPIO_ACTIVE_HIGH>;
-                       linux,default-trigger = "heartbeat";
-                       default-state = "off";
-               };
-       };
-
-       vdd_3v3: fixedregulator-vdd_3v3 {
-               compatible = "regulator-fixed";
-               regulator-name = "vdd_3v3";
-               regulator-min-microvolt = <3300000>;
-               regulator-max-microvolt = <3300000>;
-       };
-
-       ads7846reg: fixedregulator-ads7846-reg {
-               compatible = "regulator-fixed";
-               regulator-name = "ads7846-reg";
-               regulator-min-microvolt = <3300000>;
-               regulator-max-microvolt = <3300000>;
-       };
-
-       sound0: sound0 {
-               compatible = "simple-audio-card";
-               simple-audio-card,name = "CL-SOM-AM57x-Sound-Card";
-               simple-audio-card,format = "i2s";
-               simple-audio-card,bitclock-master = <&dailink0_master>;
-               simple-audio-card,frame-master = <&dailink0_master>;
-               simple-audio-card,widgets =
-                                       "Headphone", "Headphone Jack",
-                                       "Microphone", "Microphone Jack",
-                                       "Line", "Line Jack";
-               simple-audio-card,routing =
-                                       "Headphone Jack", "RHPOUT",
-                                       "Headphone Jack", "LHPOUT",
-                                       "LLINEIN", "Line Jack",
-                                       "MICIN", "Mic Bias",
-                                       "Mic Bias", "Microphone Jack";
-
-               dailink0_master: simple-audio-card,cpu {
-                       sound-dai = <&mcasp3>;
-               };
-
-               simple-audio-card,codec {
-                       sound-dai = <&wm8731>;
-                       system-clock-frequency = <12000000>;
-               };
-       };
-};
-
-&dra7_pmx_core {
-       leds_pins_default: leds_pins_default {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x347c, PIN_OUTPUT | MUX_MODE14)      /* gpmc_a15.gpio2_5 */
-               >;
-       };
-
-       i2c1_pins_default: i2c1_pins_default {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3800, PIN_INPUT_PULLUP | MUX_MODE0) /* i2c1_sda.sda */
-                       DRA7XX_CORE_IOPAD(0x3804, PIN_INPUT_PULLUP | MUX_MODE0) /* i2c1_scl.scl */
-               >;
-       };
-
-       i2c3_pins_default: i2c3_pins_default {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x36a4, PIN_INPUT| MUX_MODE10)        /* mcasp1_aclkx.i2c3_sda */
-                       DRA7XX_CORE_IOPAD(0x36a8, PIN_INPUT| MUX_MODE10)        /* mcasp1_fsx.i2c3_scl */
-               >;
-       };
-
-       i2c4_pins_default: i2c4_pins_default {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x36ac, PIN_INPUT| MUX_MODE10)        /* mcasp1_acl.i2c4_sda */
-                       DRA7XX_CORE_IOPAD(0x36b0, PIN_INPUT| MUX_MODE10)        /* mcasp1_fsr.i2c4_scl */
-               >;
-       };
-
-       tps659038_pins_default: tps659038_pins_default {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3818, PIN_INPUT_PULLUP | MUX_MODE14) /* wakeup0.gpio1_0 */
-               >;
-       };
-
-       mmc2_pins_default: mmc2_pins_default {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
-                       DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
-                       DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
-                       DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
-                       DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
-                       DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
-                       DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
-                       DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
-                       DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
-                       DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
-               >;
-       };
-
-       qspi1_pins: pinmux_qspi1_pins {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3474, PIN_INPUT | MUX_MODE1)        /* gpmc_a13.qspi1_rtclk */
-                       DRA7XX_CORE_IOPAD(0x3480, PIN_INPUT | MUX_MODE1)        /* gpmc_a16.qspi1_d0 */
-                       DRA7XX_CORE_IOPAD(0x3484, PIN_INPUT | MUX_MODE1)        /* gpmc_a17.qspi1_d1 */
-                       DRA7XX_CORE_IOPAD(0x3488, PIN_INPUT | MUX_MODE1)        /* qpmc_a18.qspi1_sclk */
-                       DRA7XX_CORE_IOPAD(0x34b8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs2.qspi1_cs0 */
-                       DRA7XX_CORE_IOPAD(0x34bc, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs3.qspi1_cs1 */
-               >;
-       };
-
-       cpsw_pins_default: cpsw_pins_default {
-               pinctrl-single,pins = <
-                       /* Slave at addr 0x0 */
-                       DRA7XX_CORE_IOPAD(0x3650, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_tclk */
-                       DRA7XX_CORE_IOPAD(0x3654, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_tctl */
-                       DRA7XX_CORE_IOPAD(0x3658, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_td3 */
-                       DRA7XX_CORE_IOPAD(0x365c, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_td2 */
-                       DRA7XX_CORE_IOPAD(0x3660, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_td1 */
-                       DRA7XX_CORE_IOPAD(0x3664, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_td0 */
-                       DRA7XX_CORE_IOPAD(0x3668, PIN_INPUT_PULLDOWN | MUX_MODE0) /* rgmii0_rclk */
-                       DRA7XX_CORE_IOPAD(0x366c, PIN_INPUT_PULLDOWN | MUX_MODE0) /* rgmii0_rctl */
-                       DRA7XX_CORE_IOPAD(0x3670, PIN_INPUT_PULLDOWN | MUX_MODE0) /* rgmii0_rd3 */
-                       DRA7XX_CORE_IOPAD(0x3674, PIN_INPUT_PULLDOWN | MUX_MODE0) /* rgmii0_rd2 */
-                       DRA7XX_CORE_IOPAD(0x3678, PIN_INPUT_PULLDOWN | MUX_MODE0) /* rgmii0_rd1 */
-                       DRA7XX_CORE_IOPAD(0x367c, PIN_INPUT_PULLDOWN | MUX_MODE0) /* rgmii0_rd0 */
-
-                       /* Slave at addr 0x1 */
-                       DRA7XX_CORE_IOPAD(0x3598, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d12.rgmii1_tclk */
-                       DRA7XX_CORE_IOPAD(0x359c, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d13.rgmii1_tctl */
-                       DRA7XX_CORE_IOPAD(0x35a0, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d14.rgmii1_td3 */
-                       DRA7XX_CORE_IOPAD(0x35a4, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d15.rgmii1_td2 */
-                       DRA7XX_CORE_IOPAD(0x35a8, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d16.rgmii1_td1 */
-                       DRA7XX_CORE_IOPAD(0x35ac, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d17.rgmii1_td0 */
-                       DRA7XX_CORE_IOPAD(0x35b0, PIN_INPUT_PULLDOWN | MUX_MODE3) /* vin2a_d18.rgmii1_rclk */
-                       DRA7XX_CORE_IOPAD(0x35b4, PIN_INPUT_PULLDOWN | MUX_MODE3) /* vin2a_d19.rgmii1_rctl */
-                       DRA7XX_CORE_IOPAD(0x35b8, PIN_INPUT_PULLDOWN | MUX_MODE3) /* vin2a_d20.rgmii1_rd3 */
-                       DRA7XX_CORE_IOPAD(0x35bc, PIN_INPUT_PULLDOWN | MUX_MODE3) /* vin2a_d21.rgmii1_rd2 */
-                       DRA7XX_CORE_IOPAD(0x35c0, PIN_INPUT_PULLDOWN | MUX_MODE3) /* vin2a_d22.rgmii1_rd1 */
-                       DRA7XX_CORE_IOPAD(0x35c4, PIN_INPUT_PULLDOWN | MUX_MODE3) /* vin2a_d23.rgmii1_rd0 */
-               >;
-       };
-
-       cpsw_pins_sleep: cpsw_pins_sleep {
-               pinctrl-single,pins = <
-                       /* Slave 1 */
-                       DRA7XX_CORE_IOPAD(0x3650, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3654, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3658, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x365c, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3660, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3664, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3668, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x366c, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3670, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3674, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3678, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x367c, PIN_INPUT | MUX_MODE15)
-
-                       /* Slave 2 */
-                       DRA7XX_CORE_IOPAD(0x3598, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x359c, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35a0, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35a4, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35a8, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35ac, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35b0, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35b4, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35b8, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35bc, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35c0, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35c4, PIN_INPUT | MUX_MODE15)
-               >;
-       };
-
-       davinci_mdio_pins_default: davinci_mdio_pins_default {
-               pinctrl-single,pins = <
-                       /* MDIO */
-                       DRA7XX_CORE_IOPAD(0x3590, PIN_OUTPUT_PULLUP | MUX_MODE3)/* vin2a_d10.mdio_mclk */
-                       DRA7XX_CORE_IOPAD(0x3594, PIN_INPUT_PULLUP | MUX_MODE3) /* vin2a_d11.mdio_d */
-               >;
-       };
-
-       davinci_mdio_pins_sleep: davinci_mdio_pins_sleep {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3590, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3594, PIN_INPUT | MUX_MODE15)
-               >;
-       };
-
-       ads7846_pins: pinmux_ads7846_pins {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3464, PIN_INPUT_PULLDOWN | MUX_MODE14) /* gpmc_a9.gpio1_31 */
-               >;
-       };
-
-       mcasp3_pins_default: mcasp3_pins_default {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3724, PIN_INPUT_PULLDOWN | MUX_MODE0) /* mcasp3_aclkx.mcasp3_aclkx */
-                       DRA7XX_CORE_IOPAD(0x3728, PIN_INPUT_PULLDOWN | MUX_MODE0) /* mcasp3_fsx.mcasp3_fsx */
-                       DRA7XX_CORE_IOPAD(0x372c, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mcasp3_axr0.mcasp3_axr0 */
-                       DRA7XX_CORE_IOPAD(0x3730, PIN_INPUT_PULLDOWN | MUX_MODE0) /* mcasp3_axr1.mcasp3_axr1 */
-               >;
-       };
-
-       mcasp3_pins_sleep: mcasp3_pins_sleep {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3724, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3728, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x372c, PIN_INPUT | MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3730, PIN_INPUT | MUX_MODE15)
-               >;
-       };
-};
-
-&i2c1 {
-       status = "okay";
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins_default>;
-       clock-frequency = <400000>;
-};
-
-&i2c3 {
-       status = "okay";
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c3_pins_default>;
-       clock-frequency = <400000>;
-};
-
-&i2c4 {
-       status = "okay";
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c4_pins_default>;
-       clock-frequency = <400000>;
-
-       tps659038: tps659038@58 {
-               compatible = "ti,tps659038";
-               reg = <0x58>;
-               interrupt-parent = <&gpio1>;
-               interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
-
-               pinctrl-names = "default";
-               pinctrl-0 = <&tps659038_pins_default>;
-
-               #interrupt-cells = <2>;
-               interrupt-controller;
-
-               ti,system-power-controller;
-
-               tps659038_pmic {
-                       compatible = "ti,tps659038-pmic";
-
-                       regulators {
-                               smps12_reg: smps12 {
-                                       /* VDD_MPU */
-                                       regulator-name = "smps12";
-                                       regulator-min-microvolt = < 850000>;
-                                       regulator-max-microvolt = <1250000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               smps3_reg: smps3 {
-                                       /* VDD_DDR */
-                                       regulator-name = "smps3";
-                                       regulator-min-microvolt = <1500000>;
-                                       regulator-max-microvolt = <1500000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               smps45_reg: smps45 {
-                                       /* VDD_DSPEVE */
-                                       regulator-name = "smps45";
-                                       regulator-min-microvolt = < 850000>;
-                                       regulator-max-microvolt = <1250000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               smps6_reg: smps6 {
-                                       /* VDD_GPU */
-                                       regulator-name = "smps6";
-                                       regulator-min-microvolt = < 850000>;
-                                       regulator-max-microvolt = <1250000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               smps7_reg: smps7 {
-                                       /* VDD_CORE */
-                                       regulator-name = "smps7";
-                                       regulator-min-microvolt = < 850000>;
-                                       regulator-max-microvolt = <1160000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               smps8_reg: smps8 {
-                                       /* VDD_IVA */
-                                       regulator-name = "smps8";
-                                       regulator-min-microvolt = < 850000>;
-                                       regulator-max-microvolt = <1250000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               smps9_reg: smps9 {
-                                       /* PMIC_3V3 */
-                                       regulator-name = "smps9";
-                                       regulator-min-microvolt = <3300000>;
-                                       regulator-max-microvolt = <3300000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-
-                               ldo1_reg: ldo1 {
-                                       /* VDD_SD / VDDSHV8  */
-                                       regulator-name = "ldo1";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <3300000>;
-                                       regulator-boot-on;
-                                       regulator-always-on;
-                               };
-
-                               ldo2_reg: ldo2 {
-                                       /* VDD_1V8 */
-                                       regulator-name = "ldo2";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               ldo3_reg: ldo3 {
-                                       /* VDDA_1V8_PHYA - supplies VDDA_SATA, VDDA_USB1/2/3 */
-                                       regulator-name = "ldo3";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               ldo4_reg: ldo4 {
-                                       /* VDDA_1V8_PHYB - supplies VDDA_HDMI, VDDA_PCIE/0/1 */
-                                       regulator-name = "ldo4";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               ldo9_reg: ldo9 {
-                                       /* VDD_RTC */
-                                       regulator-name = "ldo9";
-                                       regulator-min-microvolt = <1050000>;
-                                       regulator-max-microvolt = <1050000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               ldoln_reg: ldoln {
-                                       /* VDDA_1V8_PLL */
-                                       regulator-name = "ldoln";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               ldousb_reg: ldousb {
-                                       /* VDDA_3V_USB: VDDA_USBHS33 */
-                                       regulator-name = "ldousb";
-                                       regulator-min-microvolt = <3300000>;
-                                       regulator-max-microvolt = <3300000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               /* regen1 not used */
-                       };
-               };
-
-               tps659038_pwr_button: tps659038_pwr_button {
-                       compatible = "ti,palmas-pwrbutton";
-                       interrupt-parent = <&tps659038>;
-                       interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
-                       wakeup-source;
-                       ti,palmas-long-press-seconds = <12>;
-               };
-
-               tps659038_gpio: tps659038_gpio {
-                       compatible = "ti,palmas-gpio";
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-       };
-
-       rtc0: rtc@56 {
-               compatible = "emmicro,em3027";
-               reg = <0x56>;
-       };
-
-       eeprom_module: atmel@50 {
-               compatible = "atmel,24c08";
-               reg = <0x50>;
-               pagesize = <16>;
-       };
-
-       wm8731: wm8731@1a {
-               #sound-dai-cells = <0>;
-               compatible = "wlf,wm8731";
-               reg = <0x1a>;
-               status = "okay";
-       };
-};
-
-&cpu0 {
-       cpu0-supply = <&smps12_reg>;
-       voltage-tolerance = <1>;
-};
-
-&sata {
-       status = "okay";
-};
-
-&mailbox5 {
-       status = "okay";
-       mbox_ipu1_ipc3x: mbox_ipu1_ipc3x {
-               status = "okay";
-       };
-       mbox_dsp1_ipc3x: mbox_dsp1_ipc3x {
-               status = "okay";
-       };
-};
-
-&mailbox6 {
-       status = "okay";
-       mbox_ipu2_ipc3x: mbox_ipu2_ipc3x {
-               status = "okay";
-       };
-       mbox_dsp2_ipc3x: mbox_dsp2_ipc3x {
-               status = "okay";
-       };
-};
-
-&mmc2 {
-       status = "okay";
-
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc2_pins_default>;
-
-       vmmc-supply = <&vdd_3v3>;
-       bus-width = <8>;
-       ti,non-removable;
-       cap-mmc-dual-data-rate;
-};
-
-&qspi {
-       status = "okay";
-       pinctrl-names = "default";
-       pinctrl-0 = <&qspi1_pins>;
-
-       spi-max-frequency = <48000000>;
-
-       spi_flash: spi_flash@0 {
-               #address-cells = <1>;
-               #size-cells = <1>;
-               compatible = "spansion,m25p80", "jedec,spi-nor";
-               reg = <0>;                              /* CS0 */
-               spi-max-frequency = <48000000>;
-
-               partition@0 {
-                       label = "uboot";
-                       reg = <0x0 0xc0000>;
-               };
-
-               partition@c0000 {
-                       label = "uboot environment";
-                       reg = <0xc0000 0x40000>;
-               };
-
-               partition@100000 {
-                       label = "reserved";
-                       reg = <0x100000 0x0>;
-               };
-       };
-
-       /* touch controller */
-       ads7846@0 {
-               pinctrl-names = "default";
-               pinctrl-0 = <&ads7846_pins>;
-
-               compatible = "ti,ads7846";
-               vcc-supply = <&ads7846reg>;
-
-               reg = <1>;                              /* CS1 */
-               spi-max-frequency = <1500000>;
-
-               interrupt-parent = <&gpio1>;
-               interrupts = <31 0>;
-               pendown-gpio = <&gpio1 31 0>;
-
-
-               ti,x-min = /bits/ 16 <0x0>;
-               ti,x-max = /bits/ 16 <0x0fff>;
-               ti,y-min = /bits/ 16 <0x0>;
-               ti,y-max = /bits/ 16 <0x0fff>;
-
-               ti,x-plate-ohms = /bits/ 16 <180>;
-               ti,pressure-max = /bits/ 16 <255>;
-
-               ti,debounce-max = /bits/ 16 <30>;
-               ti,debounce-tol = /bits/ 16 <10>;
-               ti,debounce-rep = /bits/ 16 <1>;
-
-               wakeup-source;
-       };
-};
-
-&mac {
-       status = "okay";
-       pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&cpsw_pins_default>;
-       pinctrl-1 = <&cpsw_pins_sleep>;
-       dual_emac;
-};
-
-&cpsw_emac0 {
-       phy_id = <&davinci_mdio>, <0>;
-       phy-mode = "rgmii-txid";
-       dual_emac_res_vlan = <0>;
-};
-
-&cpsw_emac1 {
-       phy_id = <&davinci_mdio>, <1>;
-       phy-mode = "rgmii-txid";
-       dual_emac_res_vlan = <1>;
-};
-
-&davinci_mdio {
-       pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&davinci_mdio_pins_default>;
-       pinctrl-1 = <&davinci_mdio_pins_sleep>;
-};
-
-&usb2_phy1 {
-       phy-supply = <&ldousb_reg>;
-};
-
-&usb2_phy2 {
-       phy-supply = <&ldousb_reg>;
-};
-
-&usb1 {
-       dr_mode = "host";
-};
-
-&usb2 {
-       dr_mode = "host";
-};
-
-&mcasp3 {
-       #sound-dai-cells = <0>;
-       pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&mcasp3_pins_default>;
-       pinctrl-1 = <&mcasp3_pins_sleep>;
-       status = "okay";
-
-       op-mode = <0>;  /* MCASP_IIS_MODE */
-       tdm-slots = <2>;
-       /* 4 serializers */
-       serial-dir = <  /* 0: INACTIVE, 1: TX, 2: RX */
-               1 2 0 0
-       >;
-};
-
-&gpio3 {
-       status = "okay";
-       ti,no-reset-on-init;
-};
-
-&gpio2 {
-       status = "okay";
-       ti,no-reset-on-init;
-};
diff --git a/arch/arm/dts/am57xx-sbc-am57x.dts b/arch/arm/dts/am57xx-sbc-am57x.dts
deleted file mode 100644 (file)
index 31f9be6..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Support for CompuLab SBC-AM57x single board computer
- *
- * Copyright (C) 2015 CompuLab Ltd. - http://www.compulab.co.il/
- * Author: Dmitry Lifshitz <lifshitz@compulab.co.il>
- *
- * 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.
- */
-
-#include "am57xx-cl-som-am57x.dts"
-#include "compulab-sb-som.dtsi"
-
-/ {
-       model = "CompuLab CL-SOM-AM57x on SB-SOM-AM57x";
-       compatible = "compulab,sbc-am57x", "compulab,cl-som-am57x", "ti,am5728", "ti,dra742", "ti,dra74", "ti,dra7";
-
-       aliases {
-               display0 = &lcd0;
-               display1 = &hdmi;
-       };
-};
-
-&dra7_pmx_core {
-       uart3_pins_default: uart3_pins_default {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3648, PIN_INPUT_SLEW | MUX_MODE0)   /* uart3_rxd */
-                       DRA7XX_CORE_IOPAD(0x364c, PIN_INPUT_SLEW | MUX_MODE0)   /* uart3_txd */
-               >;
-       };
-
-       mmc1_pins_default: mmc1_pins_default {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
-                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
-                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
-                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
-                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
-                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
-                       DRA7XX_CORE_IOPAD(0x376c, PIN_INPUT | MUX_MODE14)       /* mmc1_sdcd.gpio6_27 */
-                       DRA7XX_CORE_IOPAD(0x377c, PIN_INPUT | MUX_MODE14)       /* mmc1_sdwp.gpio6_28 */
-               >;
-       };
-
-       usb1_pins: pinmux_usb1_pins {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3680, PIN_INPUT_SLEW | MUX_MODE0) /* usb1_drvvbus */
-               >;
-       };
-
-       i2c5_pins_default: i2c5_pins_default {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x36b4, PIN_INPUT| MUX_MODE10)        /* mcasp1_axr0.i2c5_sda */
-                       DRA7XX_CORE_IOPAD(0x36b8, PIN_INPUT| MUX_MODE10)        /* mcasp1_axr1.i2c5_scl */
-               >;
-       };
-
-       lcd_pins_default: lcd_pins_default {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3564, PIN_OUTPUT | MUX_MODE14)      /* vin2a_vsync0.gpio4_0 */
-               >;
-       };
-
-       hdmi_pins: pinmux_hdmi_pins {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3808, PIN_INPUT | MUX_MODE1)        /* i2c2_sda.hdmi1_ddc_scl */
-                       DRA7XX_CORE_IOPAD(0x380c, PIN_INPUT | MUX_MODE1)        /* i2c2_scl.hdmi1_ddc_sda */
-               >;
-       };
-
-       hdmi_conn_pins: pinmux_hdmi_conn_pins {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x37b8, PIN_INPUT | MUX_MODE14)       /* spi1_cs2.gpio7_12 */
-               >;
-       };
-};
-
-&uart3 {
-       status = "okay";
-       interrupts-extended = <&crossbar_mpu GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>,
-                             <&dra7_pmx_core 0x3f8>;
-
-       pinctrl-names = "default";
-       pinctrl-0 = <&uart3_pins_default>;
-};
-
-&mmc1 {
-       status = "okay";
-
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc1_pins_default>;
-
-       vmmc-supply = <&ldo1_reg>;
-       bus-width = <4>;
-       cd-gpios = <&gpio6 27 GPIO_ACTIVE_LOW>;
-       wp-gpios = <&gpio6 28 GPIO_ACTIVE_HIGH>;
-};
-
-&usb1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&usb1_pins>;
-};
-
-&i2c5 {
-       status = "okay";
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c5_pins_default>;
-       clock-frequency = <400000>;
-
-       eeprom_base: atmel@54 {
-               compatible = "atmel,24c08";
-               reg = <0x54>;
-               pagesize = <16>;
-       };
-
-       pca9555: pca9555@20 {
-               compatible = "nxp,pca9555";
-               reg = <0x20>;
-               gpio-controller;
-               #gpio-cells = <2>;
-       };
-};
-
-&dss {
-       status = "ok";
-
-       vdda_video-supply = <&ldoln_reg>;
-
-       port {
-               dpi_lcd_out: endpoint {
-                       remote-endpoint = <&lcd_in>;
-                       data-lines = <24>;
-               };
-       };
-};
-
-&lcd0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&lcd_pins_default>;
-
-       enable-gpios = <&pca9555 14 GPIO_ACTIVE_HIGH
-                       &gpio4 0 GPIO_ACTIVE_HIGH>;
-
-       port {
-               lcd_in: endpoint {
-                       remote-endpoint = <&dpi_lcd_out>;
-                       data-lines = <24>;
-               };
-       };
-};
-
-&hdmi {
-       status = "ok";
-       vdda-supply = <&ldo4_reg>;
-
-       pinctrl-names = "default";
-       pinctrl-0 = <&hdmi_pins>;
-
-       port {
-               hdmi_out: endpoint {
-                       remote-endpoint = <&hdmi_connector_in>;
-                       lanes = <1 0 3 2 5 4 7 6>;
-               };
-       };
-};
-
-&hdmi_conn {
-       pinctrl-names = "default";
-       pinctrl-0 = <&hdmi_conn_pins>;
-
-       hpd-gpios = <&gpio7 12 GPIO_ACTIVE_HIGH>;
-
-       port {
-               hdmi_connector_in: endpoint {
-                       remote-endpoint = <&hdmi_out>;
-               };
-       };
-};
index 0b2a78d393010fbdbfb400ddad63a4dba2d9ff18..e4c35d4e98f4d3078fd2266c1332cbfeae44030b 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
  * Device Tree Include file for Marvell Armada 370 and Armada XP SoC
  *
@@ -8,50 +9,10 @@
  * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
  * Ben Dooks <ben.dooks@codethink.co.uk>
  *
- * This file is dual-licensed: you can use it either under the terms
- * of the GPL or the X11 license, at your option. Note that this dual
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This file is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This file is distributed in the hope that it will be useful
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- * Or, alternatively
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
- *
  * This file contains the definitions that are common to the Armada
  * 370 and Armada XP SoC.
  */
 
-/include/ "skeleton64.dtsi"
-
 #define MBUS_ID(target,attributes) (((target) << 24) | ((attributes) << 16))
 
 / {
@@ -86,7 +47,7 @@
                pcie-mem-aperture = <0xf8000000 0x7e00000>;
                pcie-io-aperture  = <0xffe00000 0x100000>;
 
-               devbus-bootcs {
+               devbus_bootcs: devbus-bootcs {
                        compatible = "marvell,mvebu-devbus";
                        reg = <MBUS_ID(0xf0, 0x01) 0x10400 0x8>;
                        ranges = <0 MBUS_ID(0x01, 0x2f) 0 0xffffffff>;
@@ -96,7 +57,7 @@
                        status = "disabled";
                };
 
-               devbus-cs0 {
+               devbus_cs0: devbus-cs0 {
                        compatible = "marvell,mvebu-devbus";
                        reg = <MBUS_ID(0xf0, 0x01) 0x10408 0x8>;
                        ranges = <0 MBUS_ID(0x01, 0x3e) 0 0xffffffff>;
                        status = "disabled";
                };
 
-               devbus-cs1 {
+               devbus_cs1: devbus-cs1 {
                        compatible = "marvell,mvebu-devbus";
                        reg = <MBUS_ID(0xf0, 0x01) 0x10410 0x8>;
                        ranges = <0 MBUS_ID(0x01, 0x3d) 0 0xffffffff>;
                        status = "disabled";
                };
 
-               devbus-cs2 {
+               devbus_cs2: devbus-cs2 {
                        compatible = "marvell,mvebu-devbus";
                        reg = <MBUS_ID(0xf0, 0x01) 0x10418 0x8>;
                        ranges = <0 MBUS_ID(0x01, 0x3b) 0 0xffffffff>;
                        status = "disabled";
                };
 
-               devbus-cs3 {
+               devbus_cs3: devbus-cs3 {
                        compatible = "marvell,mvebu-devbus";
                        reg = <MBUS_ID(0xf0, 0x01) 0x10420 0x8>;
                        ranges = <0 MBUS_ID(0x01, 0x37) 0 0xffffffff>;
                        #address-cells = <1>;
                        #size-cells = <1>;
                        ranges = <0 MBUS_ID(0xf0, 0x01) 0 0x100000>;
-                       u-boot,dm-pre-reloc;
 
-                       rtc@10300 {
+                       rtc: rtc@10300 {
                                compatible = "marvell,orion-rtc";
                                reg = <0x10300 0x20>;
                                interrupts = <50>;
                        };
 
-                       spi0: spi@10600 {
-                               reg = <0x10600 0x28>;
-                               #address-cells = <1>;
-                               #size-cells = <0>;
-                               cell-index = <0>;
-                               interrupts = <30>;
-                               clocks = <&coreclk 0>;
-                               status = "disabled";
-                       };
-
-                       spi1: spi@10680 {
-                               reg = <0x10680 0x28>;
-                               #address-cells = <1>;
-                               #size-cells = <0>;
-                               cell-index = <1>;
-                               interrupts = <92>;
-                               clocks = <&coreclk 0>;
-                               status = "disabled";
-                       };
-
                        i2c0: i2c@11000 {
                                compatible = "marvell,mv64xxx-i2c";
                                #address-cells = <1>;
                                msi-controller;
                        };
 
-                       coherency-fabric@20200 {
+                       coherencyfab: coherency-fabric@20200 {
                                compatible = "marvell,coherency-fabric";
                                reg = <0x20200 0xb0>, <0x21010 0x1c>;
                        };
 
-                       timer@20300 {
+                       timer: timer@20300 {
                                reg = <0x20300 0x30>, <0x21040 0x30>;
                                interrupts = <37>, <38>, <39>, <40>, <5>, <6>;
                        };
 
-                       watchdog@20300 {
+                       watchdog: watchdog@20300 {
                                reg = <0x20300 0x34>, <0x20704 0x4>;
                        };
 
-                       pmsu@22000 {
+                       cpurst: cpurst@20800 {
+                               compatible = "marvell,armada-370-cpu-reset";
+                               reg = <0x20800 0x8>;
+                       };
+
+                       pmsu: pmsu@22000 {
                                compatible = "marvell,armada-370-pmsu";
                                reg = <0x22000 0x1000>;
                        };
 
-                       usb@50000 {
+                       usb0: usb@50000 {
                                compatible = "marvell,orion-ehci";
                                reg = <0x50000 0x500>;
                                interrupts = <45>;
                                status = "disabled";
                        };
 
-                       usb@51000 {
+                       usb1: usb@51000 {
                                compatible = "marvell,orion-ehci";
                                reg = <0x51000 0x500>;
                                interrupts = <46>;
                                status = "disabled";
                        };
 
-                       mdio: mdio {
+                       mdio: mdio@72004 {
                                #address-cells = <1>;
                                #size-cells = <0>;
                                compatible = "marvell,orion-mdio";
                                status = "disabled";
                        };
 
-                       sata@a0000 {
+                       sata: sata@a0000 {
                                compatible = "marvell,armada-370-sata";
                                reg = <0xa0000 0x5000>;
                                interrupts = <55>;
                                status = "disabled";
                        };
 
-                       mvsdio@d4000 {
+                       sdio: mvsdio@d4000 {
                                compatible = "marvell,orion-sdio";
                                reg = <0xd4000 0x200>;
                                interrupts = <54>;
                                status = "disabled";
                        };
                };
+
+               spi0: spi@10600 {
+                       reg = <MBUS_ID(0xf0, 0x01) 0x10600 0x28>, /* control */
+                             <MBUS_ID(0x01, 0x1e) 0 0xffffffff>, /* CS0 */
+                             <MBUS_ID(0x01, 0x5e) 0 0xffffffff>, /* CS1 */
+                             <MBUS_ID(0x01, 0x9e) 0 0xffffffff>, /* CS2 */
+                             <MBUS_ID(0x01, 0xde) 0 0xffffffff>, /* CS3 */
+                             <MBUS_ID(0x01, 0x1f) 0 0xffffffff>, /* CS4 */
+                             <MBUS_ID(0x01, 0x5f) 0 0xffffffff>, /* CS5 */
+                             <MBUS_ID(0x01, 0x9f) 0 0xffffffff>, /* CS6 */
+                             <MBUS_ID(0x01, 0xdf) 0 0xffffffff>; /* CS7 */
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <0>;
+                       interrupts = <30>;
+                       clocks = <&coreclk 0>;
+                       status = "disabled";
+               };
+
+               spi1: spi@10680 {
+                       reg = <MBUS_ID(0xf0, 0x01) 0x10680 0x28>, /* control */
+                             <MBUS_ID(0x01, 0x1a) 0 0xffffffff>, /* CS0 */
+                             <MBUS_ID(0x01, 0x5a) 0 0xffffffff>, /* CS1 */
+                             <MBUS_ID(0x01, 0x9a) 0 0xffffffff>, /* CS2 */
+                             <MBUS_ID(0x01, 0xda) 0 0xffffffff>, /* CS3 */
+                             <MBUS_ID(0x01, 0x1b) 0 0xffffffff>, /* CS4 */
+                             <MBUS_ID(0x01, 0x5b) 0 0xffffffff>, /* CS5 */
+                             <MBUS_ID(0x01, 0x9b) 0 0xffffffff>, /* CS6 */
+                             <MBUS_ID(0x01, 0xdb) 0 0xffffffff>; /* CS7 */
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <1>;
+                       interrupts = <92>;
+                       clocks = <&coreclk 0>;
+                       status = "disabled";
+               };
        };
 
        clocks {
index 770c08aa7dd4178fc814cb3cf0264f6bf3843e46..1b219c423bd796ac24794542f3d325eeadb35178 100644 (file)
        spi-flash@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "st,m25p128", "spi-flash";
+               compatible = "st,m25p128", "jedec,spi-nor";
                reg = <0>; /* Chip select 0 */
                spi-max-frequency = <50000000>;
                m25p,fast-read;
index 7bfccb0435afe359b0221481383b0dee5566e3bd..84e2c2adbae442907d5042f5037770a4ba5a7978 100644 (file)
        spi-flash@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "st,m25p128", "spi-flash";
+               compatible = "st,m25p128", "jedec,spi-nor";
                reg = <0>; /* Chip select 0 */
                spi-max-frequency = <50000000>;
                m25p,fast-read;
index 14bec0977e9ab2ec555d88dd3a586b21bc6b80cb..c36a5b8895ade550281ff3f4df5b539ada661285 100644 (file)
        spi-flash@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "st,s25fl064l", "spi-flash";
+               compatible = "st,s25fl064l", "jedec,spi-nor";
                reg = <0>;
                spi-max-frequency = <20000000>;
                m25p,fast-read;
diff --git a/arch/arm/dts/armada-385-amc.dts b/arch/arm/dts/armada-385-amc.dts
deleted file mode 100644 (file)
index c9ccbb5..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Device Tree file for Marvell Armada 385 development board
- * (DB-88F6820-AMC)
- *
- * Copyright (C) 2014 Marvell
- *
- * Gregory CLEMENT <gregory.clement@free-electrons.com>
- *
- * This file is dual-licensed: you can use it either under the terms
- * of the GPL or the X11 license, at your option. Note that this dual
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This file is licensed under the terms of the GNU General Public
- *     License version 2.  This program is licensed "as is" without
- *     any warranty of any kind, whether express or implied.
- *
- * Or, alternatively,
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use,
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/dts-v1/;
-#include "armada-385.dtsi"
-#include <dt-bindings/gpio/gpio.h>
-
-/ {
-       model = "Marvell Armada 385 AMC";
-       compatible = "marvell,a385-amc", "marvell,armada385", "marvell,armada380";
-
-       chosen {
-               stdout-path = "serial0:115200n8";
-       };
-
-       aliases {
-               ethernet0 = &eth0;
-               ethernet1 = &eth2;
-               i2c0 = &i2c0;
-               spi1 = &spi1;
-       };
-
-       memory {
-               device_type = "memory";
-               reg = <0x00000000 0x80000000>; /* 2 GB */
-       };
-
-       soc {
-               ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000
-                         MBUS_ID(0x01, 0x1d) 0 0xfff00000 0x100000>;
-
-               internal-regs {
-                       i2c@11000 {
-                               clock-frequency = <100000>;
-                               u-boot,i2c-slave-addr = <0x0>;
-                               pinctrl-names = "default";
-                               pinctrl-0 = <&i2c0_pins>;
-                               status = "okay";
-                       };
-
-                       serial@12000 {
-                               /*
-                                * Exported on the micro USB connector CON16
-                                * through an FTDI
-                                */
-
-                               pinctrl-names = "default";
-                               pinctrl-0 = <&uart0_pins>;
-                               status = "okay";
-                               u-boot,dm-pre-reloc;
-                       };
-
-                       ethernet@34000 {
-                               status = "okay";
-                               phy = <&phy1>;
-                               phy-mode = "sgmii";
-                       };
-
-                       usb@58000 {
-                               status = "okay";
-                       };
-
-                       ethernet@70000 {
-                               pinctrl-names = "default";
-                               /*
-                                * The Reference Clock 0 is used to provide a
-                                * clock to the PHY
-                                */
-                               pinctrl-0 = <&ge0_rgmii_pins>, <&ref_clk0_pins>;
-                               status = "okay";
-                               phy = <&phy0>;
-                               phy-mode = "rgmii-id";
-                       };
-
-
-                       mdio@72004 {
-                               pinctrl-names = "default";
-                               pinctrl-0 = <&mdio_pins>;
-
-                               phy0: ethernet-phy@1 {
-                                       reg = <1>;
-                               };
-
-                               phy1: ethernet-phy@0 {
-                                       reg = <0>;
-                               };
-                       };
-
-                       flash@d0000 {
-                               status = "okay";
-                               num-cs = <1>;
-                               marvell,nand-keep-config;
-                               marvell,nand-enable-arbiter;
-                               nand-on-flash-bbt;
-                       };
-               };
-
-               pcie {
-                       status = "okay";
-                       pcie@1,0 {
-                               /* Port 0, Lane 0 */
-                               status = "okay";
-                       };
-
-               };
-       };
-};
-
-&spi1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&spi1_pins>;
-       status = "okay";
-       u-boot,dm-pre-reloc;
-
-       spi-flash@0 {
-               u-boot,dm-pre-reloc;
-               #address-cells = <1>;
-               #size-cells = <1>;
-               compatible = "st,m25p128", "jedec,spi-nor", "spi-flash";
-               reg = <0>; /* Chip select 0 */
-               spi-max-frequency = <50000000>;
-               m25p,fast-read;
-       };
-};
-
-&refclk {
-       clock-frequency = <20000000>;
-};
index 7074a73537fa739a82a24d6aaa2890dbb271ae64..79b694cb84bce0935936d3a150576e8c9d1083c9 100644 (file)
@@ -11,3 +11,7 @@
 &uart0 {
        u-boot,dm-pre-reloc;
 };
+
+&watchdog {
+       u-boot,dm-pre-reloc;
+};
diff --git a/arch/arm/dts/armada-385-db-88f6820-amc.dts b/arch/arm/dts/armada-385-db-88f6820-amc.dts
new file mode 100644 (file)
index 0000000..59a425f
--- /dev/null
@@ -0,0 +1,146 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Device Tree file for Marvell Armada 385 AMC board
+ * (DB-88F6820-AMC)
+ *
+ * Copyright (C) 2017 Allied Telesis Labs
+ */
+
+/dts-v1/;
+#include "armada-385.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+       model = "Marvell Armada 385 AMC";
+       compatible = "marvell,a385-db-amc", "marvell,armada385", "marvell,armada380";
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       aliases {
+               ethernet0 = &eth0;
+               ethernet1 = &eth2;
+               i2c0 = &i2c0;
+               spi1 = &spi1;
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x00000000 0x80000000>; /* 2GB */
+       };
+
+       soc {
+               ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000
+                         MBUS_ID(0x01, 0x1d) 0 0xfff00000 0x100000>;
+       };
+};
+
+&i2c0 {
+       u-boot,i2c-slave-addr = <0x0>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c0_pins>;
+       status = "okay";
+};
+
+&uart0 {
+       /*
+        * Exported on the micro USB connector CON3
+        * through an FTDI
+        */
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart0_pins>;
+       status = "okay";
+       u-boot,dm-pre-reloc;
+};
+
+
+&eth0 {
+       pinctrl-names = "default";
+       /*
+        * The Reference Clock 0 is used to provide a
+        * clock to the PHY
+        */
+       pinctrl-0 = <&ge0_rgmii_pins>, <&ref_clk0_pins>;
+       status = "okay";
+       phy = <&phy0>;
+       phy-mode = "rgmii-id";
+};
+
+&eth2 {
+       status = "okay";
+       phy = <&phy1>;
+       phy-mode = "sgmii";
+};
+
+&usb0 {
+       status = "okay";
+};
+
+
+
+&mdio {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mdio_pins>;
+
+       phy0: ethernet-phy@1 {
+               reg = <1>;
+       };
+
+       phy1: ethernet-phy@0 {
+               reg = <0>;
+       };
+};
+
+&nand_controller {
+       status = "okay";
+       marvell,nand-keep-config;
+       marvell,nand-enable-arbiter;
+       nand-on-flash-bbt;
+};
+
+&pciec {
+       status = "okay";
+};
+
+&pcie1 {
+       /* Port 0, Lane 0 */
+       status = "okay";
+};
+
+&spi1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&spi1_pins>;
+       status = "okay";
+       u-boot,dm-pre-reloc;
+
+       spi-flash@0 {
+               u-boot,dm-pre-reloc;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "jedec,spi-nor";
+               reg = <0>; /* Chip select 0 */
+               spi-max-frequency = <50000000>;
+               m25p,fast-read;
+
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       partition@0 {
+                               reg = <0x00000000 0x00100000>;
+                               label = "u-boot";
+                       };
+                       partition@100000 {
+                               reg = <0x00100000 0x00040000>;
+                               label = "u-boot-env";
+                       };
+               };
+       };
+};
+
+&refclk {
+       clock-frequency = <20000000>;
+};
index 904429b9742989aaecbbf870285d931ed9dc0ba0..1b46797583d673b9d155fc77b76487965047a53e 100644 (file)
@@ -42,7 +42,7 @@
        u-boot,dm-pre-reloc;
 
        spi-flash@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                reg = <0>;
                spi-max-frequency = <40000000>;
                u-boot,dm-pre-reloc;
index bad7c60f19c49b9190f7808a1c76b41b467b5c27..5063a798df76b39bedbad380915befcbe254690c 100644 (file)
        spi-flash@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "n25q016a", "spi-flash";
+               compatible = "n25q016a", "jedec,spi-nor";
                reg = <0>; /* Chip select 0 */
                spi-max-frequency = <108000000>;
        };
        spi-flash@1 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "n25q128a11", "spi-flash";
+               compatible = "n25q128a11", "jedec,spi-nor";
                reg = <1>; /* Chip select 1 */
                spi-max-frequency = <108000000>;
                u-boot,dm-pre-reloc;
index 74f58de85c4388b6fd9b9997e1b72ef187f00805..a2627223ce3b83dd1b6f7c2788912de31a369c91 100644 (file)
@@ -86,7 +86,7 @@
        w25q32: spi-flash@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "w25q32", "jedec,spi-nor", "spi-flash";
+               compatible = "w25q32", "jedec,spi-nor";
                reg = <0>; /* Chip select 0 */
                spi-max-frequency = <3000000>;
                status = "disabled";
index cdff44aca5aff6cf493f93cfb814dfaac83c6b4f..720c95082b6bde0acdb943c7844169af45ba4150 100644 (file)
        status = "okay";
 
        spi-flash@0 {
-               compatible = "jedec,spi-nor", "spi-flash";
+               compatible = "jedec,spi-nor";
                reg = <0>;
                spi-max-frequency = <10000000>;
 
diff --git a/arch/arm/dts/armada-xp-98dx3236.dtsi b/arch/arm/dts/armada-xp-98dx3236.dtsi
new file mode 100644 (file)
index 0000000..5df1d18
--- /dev/null
@@ -0,0 +1,343 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Device Tree Include file for Marvell 98dx3236 family SoC
+ *
+ * Copyright (C) 2016 Allied Telesis Labs
+ *
+ * Contains definitions specific to the 98dx3236 SoC that are not
+ * common to all Armada XP SoCs.
+ */
+
+#include "armada-370-xp.dtsi"
+
+/ {
+       #address-cells = <2>;
+       #size-cells = <2>;
+
+       model = "Marvell 98DX3236 SoC";
+       compatible = "marvell,armadaxp-98dx3236", "marvell,armada-370-xp";
+
+       aliases {
+               gpio0 = &gpio0;
+               gpio1 = &gpio1;
+               gpio2 = &gpio2;
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               enable-method = "marvell,98dx3236-smp";
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "marvell,sheeva-v7";
+                       reg = <0>;
+                       clocks = <&cpuclk 0>;
+                       clock-latency = <1000000>;
+               };
+       };
+
+       soc {
+               compatible = "marvell,armadaxp-mbus", "simple-bus";
+
+               ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000
+                         MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
+                         MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000
+                         MBUS_ID(0x03, 0x00) 0 0 0xa8000000 0x4000000
+                         MBUS_ID(0x08, 0x00) 0 0 0xac000000 0x100000>;
+
+               bootrom {
+                       compatible = "marvell,bootrom";
+                       reg = <MBUS_ID(0x01, 0x1d) 0 0x100000>;
+               };
+
+               /*
+                * 98DX3236 has 1 x1 PCIe unit Gen2.0
+                */
+               pciec: pcie@82000000 {
+                       compatible = "marvell,armada-xp-pcie";
+                       status = "disabled";
+                       device_type = "pci";
+
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+
+                       msi-parent = <&mpic>;
+                       bus-range = <0x00 0xff>;
+
+                       ranges =
+                              <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000   /* Port 0.0 registers */
+                               0x82000000 0x1 0       MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */
+                               0x81000000 0x1 0       MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO  */>;
+
+                       pcie1: pcie@1,0 {
+                               device_type = "pci";
+                               assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
+                               reg = <0x0800 0 0 0 0>;
+                               #address-cells = <3>;
+                               #size-cells = <2>;
+                               #interrupt-cells = <1>;
+                               ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
+                                         0x81000000 0 0 0x81000000 0x1 0 1 0>;
+                               bus-range = <0x00 0xff>;
+                               interrupt-map-mask = <0 0 0 0>;
+                               interrupt-map = <0 0 0 0 &mpic 58>;
+                               marvell,pcie-port = <0>;
+                               marvell,pcie-lane = <0>;
+                               clocks = <&gateclk 5>;
+                               status = "disabled";
+                       };
+               };
+
+               internal-regs {
+                       sdramc: sdramc@1400 {
+                               compatible = "marvell,armada-xp-sdram-controller";
+                               reg = <0x1400 0x500>;
+                       };
+
+                       L2: l2-cache@8000 {
+                               compatible = "marvell,aurora-system-cache";
+                               reg = <0x08000 0x1000>;
+                               cache-id-part = <0x100>;
+                               cache-level = <2>;
+                               cache-unified;
+                               wt-override;
+                       };
+
+                       gpio0: gpio@18100 {
+                               compatible = "marvell,orion-gpio";
+                               reg = <0x18100 0x40>;
+                               ngpios = <32>;
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               interrupts = <82>, <83>, <84>, <85>;
+                       };
+
+                       /* does not exist */
+                       gpio1: gpio@18140 {
+                               compatible = "marvell,orion-gpio";
+                               reg = <0x18140 0x40>;
+                               status = "disabled";
+                       };
+
+                       gpio2: gpio@18180 { /* rework some properties */
+                               compatible = "marvell,orion-gpio";
+                               reg = <0x18180 0x40>;
+                               ngpios = <1>; /* only gpio #32 */
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               interrupts = <87>;
+                       };
+
+                       systemc: system-controller@18200 {
+                               compatible = "marvell,armada-370-xp-system-controller";
+                               reg = <0x18200 0x500>;
+                       };
+
+                       gateclk: clock-gating-control@18220 {
+                               compatible = "marvell,mv98dx3236-gating-clock";
+                               reg = <0x18220 0x4>;
+                               clocks = <&coreclk 0>;
+                               #clock-cells = <1>;
+                       };
+
+                       cpuclk: clock-complex@18700 {
+                               #clock-cells = <1>;
+                               compatible = "marvell,mv98dx3236-cpu-clock";
+                               reg = <0x18700 0x24>, <0x1c054 0x10>;
+                               clocks = <&coreclk 1>;
+                       };
+
+                       corediv-clock@18740 {
+                               status = "disabled";
+                       };
+
+                       cpu-config@21000 {
+                               compatible = "marvell,armada-xp-cpu-config";
+                               reg = <0x21000 0x8>;
+                       };
+
+                       ethernet@70000 {
+                               compatible = "marvell,armada-xp-neta";
+                       };
+
+                       ethernet@74000 {
+                               compatible = "marvell,armada-xp-neta";
+                       };
+
+                       xor1: xor@f0800 {
+                               compatible = "marvell,orion-xor";
+                               reg = <0xf0800 0x100
+                                      0xf0a00 0x100>;
+                               clocks = <&gateclk 22>;
+                               status = "okay";
+
+                               xor10 {
+                                       interrupts = <51>;
+                                       dmacap,memcpy;
+                                       dmacap,xor;
+                               };
+                               xor11 {
+                                       interrupts = <52>;
+                                       dmacap,memcpy;
+                                       dmacap,xor;
+                                       dmacap,memset;
+                               };
+                       };
+
+                       nand_controller: nand@d0000 {
+                               clocks = <&dfx_coredivclk 0>;
+                       };
+
+                       xor0: xor@f0900 {
+                               compatible = "marvell,orion-xor";
+                               reg = <0xF0900 0x100
+                                      0xF0B00 0x100>;
+                               clocks = <&gateclk 28>;
+                               status = "okay";
+
+                               xor00 {
+                                       interrupts = <94>;
+                                       dmacap,memcpy;
+                                       dmacap,xor;
+                               };
+                               xor01 {
+                                       interrupts = <95>;
+                                       dmacap,memcpy;
+                                       dmacap,xor;
+                                       dmacap,memset;
+                               };
+                       };
+               };
+
+               dfx: dfx-server@ac000000 {
+                       compatible = "marvell,dfx-server", "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0 MBUS_ID(0x08, 0x00) 0 0x100000>;
+                       reg = <MBUS_ID(0x08, 0x00) 0 0x100000>;
+
+                        thermal: thermal@f8078 {
+                                compatible = "marvell,armada380-thermal";
+                                reg = <0xf8078 0x4>, <0xf8074 0x4>;
+                                status = "okay";
+                        };
+
+                       coreclk: mvebu-sar@f8204 {
+                               compatible = "marvell,mv98dx3236-core-clock";
+                               reg = <0xf8204 0x4>;
+                               #clock-cells = <1>;
+                       };
+
+                       dfx_coredivclk: corediv-clock@f8268 {
+                               compatible = "marvell,mv98dx3236-corediv-clock";
+                               reg = <0xf8268 0xc>;
+                               #clock-cells = <1>;
+                               clocks = <&mainpll>;
+                               clock-output-names = "nand";
+                       };
+               };
+
+               switch: switch@a8000000 {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0 MBUS_ID(0x03, 0x00) 0 0x100000>;
+
+                       pp0: packet-processor@0 {
+                               compatible = "marvell,prestera-98dx3236", "marvell,prestera";
+                               reg = <0 0x4000000>;
+                               interrupts = <33>, <34>, <35>;
+                               dfx = <&dfx>;
+                       };
+               };
+       };
+
+       clocks {
+               /* 25 MHz reference crystal */
+               refclk: oscillator {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <25000000>;
+               };
+       };
+};
+
+&i2c0 {
+       compatible = "marvell,mv78230-i2c", "marvell,mv64xxx-i2c";
+       reg = <0x11000 0x100>;
+};
+
+&i2c1 {
+       compatible = "marvell,mv78230-i2c", "marvell,mv64xxx-i2c";
+       reg = <0x11100 0x100>;
+};
+
+&mpic {
+       reg = <0x20a00 0x2d0>, <0x21070 0x58>;
+};
+
+&rtc {
+       status = "disabled";
+};
+
+&timer {
+       compatible = "marvell,armada-xp-timer";
+       clocks = <&coreclk 2>, <&refclk>;
+       clock-names = "nbclk", "fixed";
+};
+
+&watchdog {
+       compatible = "marvell,armada-xp-wdt";
+       clocks = <&coreclk 2>, <&refclk>;
+       clock-names = "nbclk", "fixed";
+};
+
+&cpurst {
+       reg = <0x20800 0x20>;
+};
+
+&usb0 {
+       clocks = <&gateclk 18>;
+};
+
+&usb1 {
+       clocks = <&gateclk 19>;
+};
+
+&pinctrl {
+       compatible = "marvell,98dx3236-pinctrl";
+
+       nand_pins: nand-pins {
+               marvell,pins = "mpp20", "mpp21", "mpp22",
+                              "mpp23", "mpp24", "mpp25",
+                              "mpp26", "mpp27", "mpp28",
+                              "mpp29", "mpp30";
+               marvell,function = "dev";
+       };
+
+       nand_rb: nand-rb {
+               marvell,pins = "mpp19";
+               marvell,function = "nand";
+       };
+
+       spi0_pins: spi0-pins {
+               marvell,pins = "mpp0", "mpp1",
+                              "mpp2", "mpp3";
+               marvell,function = "spi0";
+       };
+};
+
+&spi0 {
+       compatible = "marvell,armada-xp-spi", "marvell,orion-spi";
+       pinctrl-0 = <&spi0_pins>;
+       pinctrl-names = "default";
+};
+
+&sdio {
+       status = "disabled";
+};
diff --git a/arch/arm/dts/armada-xp-98dx3336.dtsi b/arch/arm/dts/armada-xp-98dx3336.dtsi
new file mode 100644 (file)
index 0000000..1d9d8a8
--- /dev/null
@@ -0,0 +1,39 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Device Tree Include file for Marvell 98dx3336 family SoC
+ *
+ * Copyright (C) 2016 Allied Telesis Labs
+ *
+ * Contains definitions specific to the 98dx3236 SoC that are not
+ * common to all Armada XP SoCs.
+ */
+
+#include "armada-xp-98dx3236.dtsi"
+
+/ {
+       model = "Marvell 98DX3336 SoC";
+       compatible = "marvell,armadaxp-98dx3336", "marvell,armadaxp-98dx3236", "marvell,armada-370-xp";
+
+       cpus {
+               cpu@1 {
+                       device_type = "cpu";
+                       compatible = "marvell,sheeva-v7";
+                       reg = <1>;
+                       clocks = <&cpuclk 1>;
+                       clock-latency = <1000000>;
+               };
+       };
+
+       soc {
+               internal-regs {
+                       resume@20980 {
+                               compatible = "marvell,98dx3336-resume-ctrl";
+                               reg = <0x20980 0x10>;
+                       };
+               };
+       };
+};
+
+&pp0 {
+       compatible = "marvell,prestera-98dx3336", "marvell,prestera";
+};
diff --git a/arch/arm/dts/armada-xp-98dx4251.dtsi b/arch/arm/dts/armada-xp-98dx4251.dtsi
new file mode 100644 (file)
index 0000000..48ffdc7
--- /dev/null
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Device Tree Include file for Marvell 98dx4521 family SoC
+ *
+ * Copyright (C) 2016 Allied Telesis Labs
+ *
+ * Contains definitions specific to the 98dx4521 SoC that are not
+ * common to all Armada XP SoCs.
+ */
+
+#include "armada-xp-98dx3236.dtsi"
+
+/ {
+       model = "Marvell 98DX4251 SoC";
+       compatible = "marvell,armadaxp-98dx4251", "marvell,armadaxp-98dx3236", "marvell,armada-370-xp";
+
+       cpus {
+               cpu@1 {
+                       device_type = "cpu";
+                       compatible = "marvell,sheeva-v7";
+                       reg = <1>;
+                       clocks = <&cpuclk 1>;
+                       clock-latency = <1000000>;
+               };
+       };
+
+       soc {
+               internal-regs {
+                       resume@20980 {
+                               compatible = "marvell,98dx3336-resume-ctrl";
+                               reg = <0x20980 0x10>;
+                       };
+               };
+       };
+};
+
+&sdio {
+       status = "okay";
+};
+
+&pinctrl {
+       compatible = "marvell,98dx4251-pinctrl";
+
+       sdio_pins: sdio-pins {
+               marvell,pins = "mpp5", "mpp6", "mpp7",
+                              "mpp8", "mpp9", "mpp10";
+               marvell,function = "sd0";
+       };
+};
+
+&pp0 {
+       compatible = "marvell,prestera-98dx4251", "marvell,prestera";
+       interrupts = <33>, <34>, <35>, <36>;
+};
diff --git a/arch/arm/dts/armada-xp-db-xc3-24g4xg-u-boot.dtsi b/arch/arm/dts/armada-xp-db-xc3-24g4xg-u-boot.dtsi
new file mode 100644 (file)
index 0000000..90cad85
--- /dev/null
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+
+&uart0 {
+       u-boot,dm-pre-reloc;
+};
+
+&nand_controller {
+       compatible="marvell,mvebu-pxa3xx-nand";
+       status = "okay";
+       label = "pxa3xx_nand-0";
+       nand-rb = <0>;
+       marvell,nand-keep-config;
+       nand-on-flash-bbt;
+       nand-ecc-strength = <4>;
+       nand-ecc-step-size = <512>;
+};
+
+&spi0 {
+       u-boot,dm-pre-reloc;
+
+       spi-flash@0 {
+               u-boot,dm-pre-reloc;
+       };
+};
diff --git a/arch/arm/dts/armada-xp-db-xc3-24g4xg.dts b/arch/arm/dts/armada-xp-db-xc3-24g4xg.dts
new file mode 100644 (file)
index 0000000..d4b5288
--- /dev/null
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Device Tree file for DB-XC3-24G4XG board
+ *
+ * Copyright (C) 2016 Allied Telesis Labs
+ *
+ * Based on armada-xp-db.dts
+ *
+ * Note: this Device Tree assumes that the bootloader has remapped the
+ * internal registers to 0xf1000000 (instead of the default
+ * 0xd0000000). The 0xf1000000 is the default used by the recent,
+ * DT-capable, U-Boot bootloaders provided by Marvell. Some earlier
+ * boards were delivered with an older version of the bootloader that
+ * left internal registers mapped at 0xd0000000. If you are in this
+ * situation, you should either update your bootloader (preferred
+ * solution) or the below Device Tree should be adjusted.
+ */
+
+/dts-v1/;
+#include "armada-xp-98dx3336.dtsi"
+#include "armada-xp-db-xc3-24g4xg-u-boot.dtsi"
+
+/ {
+       model = "DB-XC3-24G4XG";
+       compatible = "marvell,armadaxp-98dx3336", "marvell,armadaxp-mv78260", "marvell,armadaxp", "marvell,armada-370-xp";
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+               bootargs = "console=ttyS0,115200 earlyprintk";
+       };
+
+       aliases {
+               spi0 = &spi0;
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0 0x00000000 0 0x40000000>; /* 1 GB */
+       };
+};
+
+&L2 {
+       arm,parity-enable;
+       marvell,ecc-enable;
+};
+
+&devbus_bootcs {
+       status = "okay";
+
+       /* Device Bus parameters are required */
+
+       /* Read parameters */
+       devbus,bus-width    = <16>;
+       devbus,turn-off-ps  = <60000>;
+       devbus,badr-skew-ps = <0>;
+       devbus,acc-first-ps = <124000>;
+       devbus,acc-next-ps  = <248000>;
+       devbus,rd-setup-ps  = <0>;
+       devbus,rd-hold-ps   = <0>;
+
+       /* Write parameters */
+       devbus,sync-enable = <0>;
+       devbus,wr-high-ps  = <60000>;
+       devbus,wr-low-ps   = <60000>;
+       devbus,ale-wr-ps   = <60000>;
+};
+
+&uart0 {
+       status = "okay";
+};
+
+&uart1 {
+       status = "okay";
+};
+
+&i2c0 {
+       clock-frequency = <100000>;
+       status = "okay";
+};
+
+&usb0 {
+       status = "okay";
+};
+
+&spi0 {
+       status = "okay";
+
+       spi-flash@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "spi-flash", "jedec,spi-nor";
+               reg = <0>; /* Chip select 0 */
+               spi-max-frequency = <108000000>;
+               m25p,fast-read;
+
+               partition@u-boot {
+                       reg = <0x00000000 0x00100000>;
+                       label = "u-boot";
+               };
+               partition@u-boot-env {
+                       reg = <0x00100000 0x00040000>;
+                       label = "u-boot-env";
+               };
+               partition@unused {
+                       reg = <0x00140000 0x00ec0000>;
+                       label = "unused";
+               };
+
+       };
+};
index 27799d1254eadc1f9056a17184195449c5cd8624..1139e9469a83792efc102ff2c8dd375d1c5591b3 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
  * Device Tree file for Marvell Armada XP development board
  * (DB-MV784MP-GP)
@@ -8,44 +9,6 @@
  * Gregory CLEMENT <gregory.clement@free-electrons.com>
  * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
  *
- * This file is dual-licensed: you can use it either under the terms
- * of the GPL or the X11 license, at your option. Note that this dual
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This file is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This file is distributed in the hope that it will be useful
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- * Or, alternatively
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
- *
  * Note: this Device Tree assumes that the bootloader has remapped the
  * internal registers to 0xf1000000 (instead of the default
  * 0xd0000000). The 0xf1000000 is the default used by the recent,
                stdout-path = "serial0:115200n8";
        };
 
-       aliases {
-               spi0 = &spi0;
-       };
-
-       memory {
+       memory@0 {
                device_type = "memory";
                /*
                  * 8 GB of plug-in RAM modules by default.The amount
        soc {
                ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000
                          MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
-                         MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000>;
+                         MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000
+                         MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000
+                         MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000
+                         MBUS_ID(0x0c, 0x04) 0 0 0xf1200000 0x100000>;
 
                devbus-bootcs {
                        status = "okay";
                        };
                };
 
-               pcie-controller {
-                       status = "okay";
-
-                       /*
-                        * The 3 slots are physically present as
-                        * standard PCIe slots on the board.
-                        */
-                       pcie@1,0 {
-                               /* Port 0, Lane 0 */
-                               status = "okay";
-                       };
-                       pcie@9,0 {
-                               /* Port 2, Lane 0 */
-                               status = "okay";
-                       };
-                       pcie@10,0 {
-                               /* Port 3, Lane 0 */
-                               status = "okay";
-                       };
-               };
-
                internal-regs {
                        serial@12000 {
                                status = "okay";
-                               u-boot,dm-pre-reloc;
                        };
                        serial@12100 {
                                status = "okay";
                                status = "okay";
                        };
 
-                       mdio {
-                               phy0: ethernet-phy@0 {
-                                       reg = <16>;
-                               };
-
-                               phy1: ethernet-phy@1 {
-                                       reg = <17>;
-                               };
-
-                               phy2: ethernet-phy@2 {
-                                       reg = <18>;
-                               };
-
-                               phy3: ethernet-phy@3 {
-                                       reg = <19>;
-                               };
-                       };
-
                        ethernet@70000 {
                                status = "okay";
                                phy = <&phy0>;
                                phy-mode = "qsgmii";
+                               buffer-manager = <&bm>;
+                               bm,pool-long = <0>;
                        };
                        ethernet@74000 {
                                status = "okay";
                                phy = <&phy1>;
                                phy-mode = "qsgmii";
+                               buffer-manager = <&bm>;
+                               bm,pool-long = <1>;
                        };
                        ethernet@30000 {
                                status = "okay";
                                phy = <&phy2>;
                                phy-mode = "qsgmii";
+                               buffer-manager = <&bm>;
+                               bm,pool-long = <2>;
                        };
                        ethernet@34000 {
                                status = "okay";
                                phy = <&phy3>;
                                phy-mode = "qsgmii";
+                               buffer-manager = <&bm>;
+                               bm,pool-long = <3>;
                        };
 
                        /* Front-side USB slot */
                                status = "okay";
                        };
 
-                       spi0: spi@10600 {
+                       bm@c0000 {
                                status = "okay";
-                               u-boot,dm-pre-reloc;
-
-                               spi-flash@0 {
-                                       u-boot,dm-pre-reloc;
-                                       #address-cells = <1>;
-                                       #size-cells = <1>;
-                                       compatible = "n25q128a13", "jedec,spi-nor";
-                                       reg = <0>; /* Chip select 0 */
-                                       spi-max-frequency = <108000000>;
-                               };
                        };
 
                        nand@d0000 {
                                status = "okay";
+                               label = "pxa3xx_nand-0";
                                num-cs = <1>;
                                marvell,nand-keep-config;
-                               marvell,nand-enable-arbiter;
                                nand-on-flash-bbt;
                        };
                };
+
+               bm-bppi {
+                       status = "okay";
+               };
+       };
+};
+
+&pciec {
+       status = "okay";
+
+       /*
+        * The 3 slots are physically present as
+        * standard PCIe slots on the board.
+        */
+       pcie@1,0 {
+               /* Port 0, Lane 0 */
+               status = "okay";
+       };
+       pcie@9,0 {
+               /* Port 2, Lane 0 */
+               status = "okay";
+       };
+       pcie@a,0 {
+               /* Port 3, Lane 0 */
+               status = "okay";
+       };
+};
+
+&mdio {
+       phy0: ethernet-phy@0 {
+               reg = <16>;
+       };
+
+       phy1: ethernet-phy@1 {
+               reg = <17>;
+       };
+
+       phy2: ethernet-phy@2 {
+               reg = <18>;
+       };
+
+       phy3: ethernet-phy@3 {
+               reg = <19>;
+       };
+};
+
+&spi0 {
+       status = "okay";
+
+       spi-flash@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "n25q128a13", "jedec,spi-nor";
+               reg = <0>; /* Chip select 0 */
+               spi-max-frequency = <108000000>;
        };
 };
index d7d7f65c85fec623f7a66fcd4efdc12fa0216d47..921eb708625433ca6f3d471c67d67f9c02ae392d 100644 (file)
                                status = "okay";
                        };
 
-                       spi0: spi@10600 {
-                               status = "okay";
-
-                               spi-flash@0 {
-                                       #address-cells = <1>;
-                                       #size-cells = <1>;
-                                       compatible = "n25q128a13", "jedec,spi-nor";
-                                       reg = <0>; /* Chip select 0 */
-                                       spi-max-frequency = <108000000>;
-                               };
-                       };
-
                        nand@d0000 {
                                status = "okay";
                                num-cs = <1>;
                };
        };
 };
+
+&spi0 {
+       status = "okay";
+
+       spi-flash@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "n25q128a13", "jedec,spi-nor";
+               reg = <0>; /* Chip select 0 */
+               spi-max-frequency = <108000000>;
+       };
+};
index f6bab9fb20a908e305e5c84ca296c9ed22e37dc6..8558bf6bb54c603c16b8a5a987c991413e3297c8 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
  * Device Tree Include file for Marvell Armada XP family SoC
  *
@@ -5,44 +6,6 @@
  *
  * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
  *
- * This file is dual-licensed: you can use it either under the terms
- * of the GPL or the X11 license, at your option. Note that this dual
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This file is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This file is distributed in the hope that it will be useful
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- * Or, alternatively
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
- *
  * Contains definitions specific to the Armada XP MV78230 SoC that are not
  * common to all Armada XP SoCs.
  */
 
                internal-regs {
                        gpio0: gpio@18100 {
-                               compatible = "marvell,orion-gpio";
-                               reg = <0x18100 0x40>;
+                               compatible = "marvell,armada-370-gpio",
+                                            "marvell,orion-gpio";
+                               reg = <0x18100 0x40>, <0x181c0 0x08>;
+                               reg-names = "gpio", "pwm";
                                ngpios = <32>;
                                gpio-controller;
                                #gpio-cells = <2>;
+                               #pwm-cells = <2>;
                                interrupt-controller;
                                #interrupt-cells = <2>;
                                interrupts = <82>, <83>, <84>, <85>;
+                               clocks = <&coreclk 0>;
                        };
 
                        gpio1: gpio@18140 {
-                               compatible = "marvell,orion-gpio";
-                               reg = <0x18140 0x40>;
+                               compatible = "marvell,armada-370-gpio",
+                                            "marvell,orion-gpio";
+                               reg = <0x18140 0x40>, <0x181c8 0x08>;
+                               reg-names = "gpio", "pwm";
                                ngpios = <17>;
                                gpio-controller;
                                #gpio-cells = <2>;
+                               #pwm-cells = <2>;
                                interrupt-controller;
                                #interrupt-cells = <2>;
                                interrupts = <87>, <88>, <89>;
+                               clocks = <&coreclk 0>;
                        };
                };
        };
index d39231f69d9a960f011e27f44974d2afe2f270c3..2d85fe8ac327296420e1050228e88fa0df48d79a 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
  * Device Tree Include file for Marvell Armada XP family SoC
  *
@@ -5,44 +6,6 @@
  *
  * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
  *
- * This file is dual-licensed: you can use it either under the terms
- * of the GPL or the X11 license, at your option. Note that this dual
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This file is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This file is distributed in the hope that it will be useful
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- * Or, alternatively
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
- *
  * Contains definitions specific to the Armada XP MV78260 SoC that are not
  * common to all Armada XP SoCs.
  */
 
                internal-regs {
                        gpio0: gpio@18100 {
-                               compatible = "marvell,orion-gpio";
-                               reg = <0x18100 0x40>;
+                               compatible = "marvell,armada-370-gpio",
+                                            "marvell,orion-gpio";
+                               reg = <0x18100 0x40>, <0x181c0 0x08>;
+                               reg-names = "gpio", "pwm";
                                ngpios = <32>;
                                gpio-controller;
                                #gpio-cells = <2>;
+                               #pwm-cells = <2>;
                                interrupt-controller;
                                #interrupt-cells = <2>;
                                interrupts = <82>, <83>, <84>, <85>;
+                               clocks = <&coreclk 0>;
                        };
 
                        gpio1: gpio@18140 {
-                               compatible = "marvell,orion-gpio";
-                               reg = <0x18140 0x40>;
+                               compatible = "marvell,armada-370-gpio",
+                                            "marvell,orion-gpio";
+                               reg = <0x18140 0x40>, <0x181c8 0x08>;
+                               reg-names = "gpio", "pwm";
                                ngpios = <32>;
                                gpio-controller;
                                #gpio-cells = <2>;
+                               #pwm-cells = <2>;
                                interrupt-controller;
                                #interrupt-cells = <2>;
                                interrupts = <87>, <88>, <89>, <90>;
+                               clocks = <&coreclk 0>;
                        };
 
                        gpio2: gpio@18180 {
-                               compatible = "marvell,orion-gpio";
+                               compatible = "marvell,armada-370-gpio",
+                                            "marvell,orion-gpio";
                                reg = <0x18180 0x40>;
                                ngpios = <3>;
                                gpio-controller;
index c642565d1bc68119dfa5c470fdc7e4d0c63865b0..230a3fd36b3048937c760784ec2fd619f49f9bdb 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
  * Device Tree Include file for Marvell Armada XP family SoC
  *
@@ -5,44 +6,6 @@
  *
  * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
  *
- * This file is dual-licensed: you can use it either under the terms
- * of the GPL or the X11 license, at your option. Note that this dual
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This file is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This file is distributed in the hope that it will be useful
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- * Or, alternatively
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
- *
  * Contains definitions specific to the Armada XP MV78460 SoC that are not
  * common to all Armada XP SoCs.
  */
 
                internal-regs {
                        gpio0: gpio@18100 {
-                               compatible = "marvell,orion-gpio";
-                               reg = <0x18100 0x40>;
+                               compatible = "marvell,armada-370-gpio",
+                                            "marvell,orion-gpio";
+                               reg = <0x18100 0x40>, <0x181c0 0x08>;
+                               reg-names = "gpio", "pwm";
                                ngpios = <32>;
                                gpio-controller;
                                #gpio-cells = <2>;
+                               #pwm-cells = <2>;
                                interrupt-controller;
                                #interrupt-cells = <2>;
                                interrupts = <82>, <83>, <84>, <85>;
+                               clocks = <&coreclk 0>;
                        };
 
                        gpio1: gpio@18140 {
-                               compatible = "marvell,orion-gpio";
-                               reg = <0x18140 0x40>;
+                               compatible = "marvell,armada-370-gpio",
+                                            "marvell,orion-gpio";
+                               reg = <0x18140 0x40>, <0x181c8 0x08>;
+                               reg-names = "gpio", "pwm";
                                ngpios = <32>;
                                gpio-controller;
                                #gpio-cells = <2>;
+                               #pwm-cells = <2>;
                                interrupt-controller;
                                #interrupt-cells = <2>;
                                interrupts = <87>, <88>, <89>, <90>;
+                               clocks = <&coreclk 0>;
                        };
 
                        gpio2: gpio@18180 {
-                               compatible = "marvell,orion-gpio";
+                               compatible = "marvell,armada-370-gpio",
+                                            "marvell,orion-gpio";
                                reg = <0x18180 0x40>;
                                ngpios = <3>;
                                gpio-controller;
index 0a60ddfa4149ee75da08ef732bf5699544c7131c..861967cd7e8728124f0e336819bf4c034b930a56 100644 (file)
@@ -1,13 +1,9 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
  * Device Tree file for Synology DS414
  *
  * Copyright (C) 2014, Arnaud EBALARD <arno@natisbad.org>
  *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
  * Note: this Device Tree assumes that the bootloader has remapped the
  * internal registers to 0xf1000000 (instead of the old 0xd0000000).
  * The 0xf1000000 is the default used by the recent, DT-capable, U-Boot
                spi0 = &spi0;
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0 0x00000000 0 0x40000000>; /* 1GB */
        };
 
        soc {
                ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000
-                         MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000>;
-
-               pcie-controller {
-                       status = "okay";
-
-                       /*
-                        * Connected to Marvell 88SX7042 SATA-II controller
-                        * handling the four disks.
-                        */
-                       pcie@1,0 {
-                               /* Port 0, Lane 0 */
-                               status = "okay";
-                       };
-
-                       /*
-                        * Connected to EtronTech EJ168A XHCI controller
-                        * providing the two rear USB 3.0 ports.
-                        */
-                       pcie@5,0 {
-                               /* Port 1, Lane 0 */
-                               status = "okay";
-                       };
-               };
+                         MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
+                         MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000
+                         MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>;
 
                internal-regs {
 
                                status = "disabled";
                        };
 
-                       spi0: spi@10600 {
-                               status = "okay";
-                               u-boot,dm-pre-reloc;
-
-                               spi-flash@0 {
-                                       u-boot,dm-pre-reloc;
-                                       #address-cells = <1>;
-                                       #size-cells = <1>;
-                                       compatible = "micron,n25q064";
-                                       reg = <0>; /* Chip select 0 */
-                                       spi-max-frequency = <20000000>;
-
-                                       /*
-                                        * Warning!
-                                        *
-                                        * Synology u-boot uses its compiled-in environment
-                                        * and it seems Synology did not care to change u-boot
-                                        * default configuration in order to allow saving a
-                                        * modified environment at a sensible location. So,
-                                        * if you do a 'saveenv' under u-boot, your modified
-                                        * environment will be saved at 1MB after the start
-                                        * of the flash, i.e. in the middle of the uImage.
-                                        * For that reason, it is strongly advised not to
-                                        * change the default environment, unless you know
-                                        * what you are doing.
-                                        */
-                                       partition@00000000 { /* u-boot */
-                                               label = "RedBoot";
-                                               reg = <0x00000000 0x000d0000>; /* 832KB */
-                                       };
-
-                                       partition@000c0000 { /* uImage */
-                                               label = "zImage";
-                                               reg = <0x000d0000 0x002d0000>; /* 2880KB */
-                                       };
-
-                                       partition@003a0000 { /* uInitramfs */
-                                               label = "rd.gz";
-                                               reg = <0x003a0000 0x00430000>; /* 4250KB */
-                                       };
-
-                                       partition@007d0000 { /* MAC address and serial number */
-                                               label = "vendor";
-                                               reg = <0x007d0000 0x00010000>; /* 64KB */
-                                       };
-
-                                       partition@007e0000 {
-                                               label = "RedBoot config";
-                                               reg = <0x007e0000 0x00010000>; /* 64KB */
-                                       };
-
-                                       partition@007f0000 {
-                                               label = "FIS directory";
-                                               reg = <0x007f0000 0x00010000>; /* 64KB */
-                                       };
-                               };
-                       };
-
                        i2c@11000 {
                                clock-frequency = <400000>;
                                status = "okay";
                                status = "okay";
                        };
 
-                       mdio {
-                               phy0: ethernet-phy@0 { /* Marvell 88E1512 */
-                                       reg = <0>;
-                               };
-
-                               phy1: ethernet-phy@1 { /* Marvell 88E1512 */
-                                       reg = <1>;
-                               };
-                       };
-
                        ethernet@70000 {
                                status = "okay";
                                pinctrl-0 = <&ge0_rgmii_pins>;
                             &sata3_pwr_pin &sata4_pwr_pin>;
                pinctrl-names = "default";
 
-               sata1_regulator: sata1-regulator {
+               sata1_regulator: sata1-regulator@1 {
                        compatible = "regulator-fixed";
                        reg = <1>;
                        regulator-name = "SATA1 Power";
                        gpio = <&gpio1 10 GPIO_ACTIVE_HIGH>;
                };
 
-               sata2_regulator: sata2-regulator {
+               sata2_regulator: sata2-regulator@2 {
                        compatible = "regulator-fixed";
                        reg = <2>;
                        regulator-name = "SATA2 Power";
                        gpio = <&gpio1 12 GPIO_ACTIVE_HIGH>;
                };
 
-               sata3_regulator: sata3-regulator {
+               sata3_regulator: sata3-regulator@3 {
                        compatible = "regulator-fixed";
                        reg = <3>;
                        regulator-name = "SATA3 Power";
                        gpio = <&gpio1 13 GPIO_ACTIVE_HIGH>;
                };
 
-               sata4_regulator: sata4-regulator {
+               sata4_regulator: sata4-regulator@4 {
                        compatible = "regulator-fixed";
                        reg = <4>;
                        regulator-name = "SATA4 Power";
        };
 };
 
+&pciec {
+       status = "okay";
+
+       /*
+        * Connected to Marvell 88SX7042 SATA-II controller
+        * handling the four disks.
+        */
+       pcie@1,0 {
+               /* Port 0, Lane 0 */
+               status = "okay";
+       };
+
+       /*
+        * Connected to EtronTech EJ168A XHCI controller
+        * providing the two rear USB 3.0 ports.
+        */
+       pcie@5,0 {
+               /* Port 1, Lane 0 */
+               status = "okay";
+       };
+};
+
+
+&mdio {
+       phy0: ethernet-phy@0 { /* Marvell 88E1512 */
+               reg = <0>;
+       };
+
+       phy1: ethernet-phy@1 { /* Marvell 88E1512 */
+               reg = <1>;
+       };
+};
+
 &pinctrl {
        sata1_pwr_pin: sata1-pwr-pin {
                marvell,pins = "mpp42";
                marvell,function = "gpio";
        };
 };
+
+&spi0 {
+       status = "okay";
+
+       spi-flash@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "micron,n25q064", "jedec,spi-nor";
+               reg = <0>; /* Chip select 0 */
+               spi-max-frequency = <20000000>;
+
+               /*
+                * Warning!
+                *
+                * Synology u-boot uses its compiled-in environment
+                * and it seems Synology did not care to change u-boot
+                * default configuration in order to allow saving a
+                * modified environment at a sensible location. So,
+                * if you do a 'saveenv' under u-boot, your modified
+                * environment will be saved at 1MB after the start
+                * of the flash, i.e. in the middle of the uImage.
+                * For that reason, it is strongly advised not to
+                * change the default environment, unless you know
+                * what you are doing.
+                */
+               partition@0 { /* u-boot */
+                       label = "RedBoot";
+                       reg = <0x00000000 0x000d0000>; /* 832KB */
+               };
+
+               partition@c0000 { /* uImage */
+                       label = "zImage";
+                       reg = <0x000d0000 0x002d0000>; /* 2880KB */
+               };
+
+               partition@3a0000 { /* uInitramfs */
+                       label = "rd.gz";
+                       reg = <0x003a0000 0x00430000>; /* 4250KB */
+               };
+
+               partition@7d0000 { /* MAC address and serial number */
+                       label = "vendor";
+                       reg = <0x007d0000 0x00010000>; /* 64KB */
+               };
+
+               partition@7e0000 {
+                       label = "RedBoot config";
+                       reg = <0x007e0000 0x00010000>; /* 64KB */
+               };
+
+               partition@7f0000 {
+                       label = "FIS directory";
+                       reg = <0x007f0000 0x00010000>; /* 64KB */
+               };
+       };
+};
index 5695e9b758569234dd4dcb6ffeb7e0af39583f65..5b18d62c3c5f1d22040421aaf5133abb7a3907ff 100644 (file)
                                status = "okay";
                        };
 
-                       spi0: spi@10600 {
-                               status = "okay";
-                               u-boot,dm-pre-reloc;
-
-                               spi-flash@0 {
-                                       u-boot,dm-pre-reloc;
-                                       #address-cells = <1>;
-                                       #size-cells = <1>;
-                                       compatible = "n25q128a13", "jedec,spi-nor", "spi-flash";
-                                       reg = <0>; /* Chip select 0 */
-                                       spi-max-frequency = <27777777>;
-                               };
-
-                               fpga@1 {
-                                       #address-cells = <1>;
-                                       #size-cells = <1>;
-                                       compatible = "spi-generic-device";
-                                       reg = <1>; /* Chip select 1 */
-                                       spi-max-frequency = <27777777>;
-                               };
-                       };
-
-                       spi1: spi@10680 {
-                               status = "okay";
-
-                               fpga@0 {
-                                       #address-cells = <1>;
-                                       #size-cells = <1>;
-                                       compatible = "spi-generic-device";
-                                       reg = <0>; /* Chip select 0 */
-                                       spi-max-frequency = <27777777>;
-                               };
-                       };
-
                        /* The LCD controller is only used on this board */
                        lcd0: lcd-controller@e0000 {
                                compatible = "marvell,armada-xp-lcd";
        };
 };
 
+&spi0 {
+       status = "okay";
+       u-boot,dm-pre-reloc;
+
+       spi-flash@0 {
+               u-boot,dm-pre-reloc;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "n25q128a13", "jedec,spi-nor";
+               reg = <0>; /* Chip select 0 */
+               spi-max-frequency = <27777777>;
+       };
+
+       fpga@1 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "spi-generic-device";
+               reg = <1>; /* Chip select 1 */
+               spi-max-frequency = <27777777>;
+       };
+};
+
+&spi1 {
+       status = "okay";
+
+       fpga@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "spi-generic-device";
+               reg = <0>; /* Chip select 0 */
+               spi-max-frequency = <27777777>;
+       };
+};
+
+
 &pciec {
        status = "okay";
 
index 3fac39e41d789199947a3927bf7c4630ea14c275..d856d96022727a7802fcd71c5b526a309d0a0bda 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
  * Device Tree Include file for Marvell Armada XP family SoC
  *
@@ -8,44 +9,6 @@
  * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
  * Ben Dooks <ben.dooks@codethink.co.uk>
  *
- * This file is dual-licensed: you can use it either under the terms
- * of the GPL or the X11 license, at your option. Note that this dual
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This file is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This file is distributed in the hope that it will be useful
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- * Or, alternatively
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
- *
  * Contains definitions specific to the Armada XP SoC that are not
  * common to all Armada SoCs.
  */
@@ -53,6 +16,9 @@
 #include "armada-370-xp.dtsi"
 
 / {
+       #address-cells = <2>;
+       #size-cells = <2>;
+
        model = "Marvell Armada XP family SoC";
        compatible = "marvell,armadaxp", "marvell,armada-370-xp";
 
                };
 
                internal-regs {
-                       sdramc@1400 {
+                       sdramc: sdramc@1400 {
                                compatible = "marvell,armada-xp-sdram-controller";
                                reg = <0x1400 0x500>;
                        };
 
-                       L2: l2-cache {
+                       L2: l2-cache@8000 {
                                compatible = "marvell,aurora-system-cache";
                                reg = <0x08000 0x1000>;
                                cache-id-part = <0x100>;
                                wt-override;
                        };
 
-                       spi0: spi@10600 {
-                               compatible = "marvell,armada-xp-spi",
-                                               "marvell,orion-spi";
-                               pinctrl-0 = <&spi0_pins>;
-                               pinctrl-names = "default";
-                       };
-
-                       spi1: spi@10680 {
-                               compatible = "marvell,armada-xp-spi",
-                                               "marvell,orion-spi";
-                       };
-
-
-                       i2c0: i2c@11000 {
-                               compatible = "marvell,mv78230-i2c", "marvell,mv64xxx-i2c";
-                               reg = <0x11000 0x100>;
-                       };
-
-                       i2c1: i2c@11100 {
-                               compatible = "marvell,mv78230-i2c", "marvell,mv64xxx-i2c";
-                               reg = <0x11100 0x100>;
-                       };
-
                        uart2: serial@12200 {
                                compatible = "snps,dw-apb-uart";
                                pinctrl-0 = <&uart2_pins>;
                                status = "disabled";
                        };
 
-                       system-controller@18200 {
+                       systemc: system-controller@18200 {
                                compatible = "marvell,armada-370-xp-system-controller";
                                reg = <0x18200 0x500>;
                        };
                                #clock-cells = <1>;
                        };
 
-                       thermal@182b0 {
+                       thermal: thermal@182b0 {
                                compatible = "marvell,armadaxp-thermal";
                                reg = <0x182b0 0x4
                                        0x184d0 0x4>;
                                clocks = <&coreclk 1>;
                        };
 
-                       interrupt-controller@20a00 {
-                             reg = <0x20a00 0x2d0>, <0x21070 0x58>;
-                       };
-
-                       timer@20300 {
-                               compatible = "marvell,armada-xp-timer";
-                               clocks = <&coreclk 2>, <&refclk>;
-                               clock-names = "nbclk", "fixed";
-                       };
-
-                       watchdog@20300 {
-                               compatible = "marvell,armada-xp-wdt";
-                               clocks = <&coreclk 2>, <&refclk>;
-                               clock-names = "nbclk", "fixed";
-                       };
-
-                       cpurst@20800 {
-                               compatible = "marvell,armada-370-cpu-reset";
-                               reg = <0x20800 0x20>;
+                       cpu-config@21000 {
+                               compatible = "marvell,armada-xp-cpu-config";
+                               reg = <0x21000 0x8>;
                        };
 
                        eth2: ethernet@30000 {
                                status = "disabled";
                        };
 
-                       usb@50000 {
-                               clocks = <&gateclk 18>;
-                       };
-
-                       usb@51000 {
-                               clocks = <&gateclk 19>;
-                       };
-
-                       usb@52000 {
+                       usb2: usb@52000 {
                                compatible = "marvell,orion-ehci";
                                reg = <0x52000 0x500>;
                                interrupts = <47>;
                                status = "disabled";
                        };
 
-                       xor@60900 {
+                       xor1: xor@60900 {
                                compatible = "marvell,orion-xor";
                                reg = <0x60900 0x100
                                       0x60b00 0x100>;
                                compatible = "marvell,armada-xp-neta";
                        };
 
-                       xor@f0900 {
+                       cesa: crypto@90000 {
+                               compatible = "marvell,armada-xp-crypto";
+                               reg = <0x90000 0x10000>;
+                               reg-names = "regs";
+                               interrupts = <48>, <49>;
+                               clocks = <&gateclk 23>, <&gateclk 23>;
+                               clock-names = "cesa0", "cesa1";
+                               marvell,crypto-srams = <&crypto_sram0>,
+                                                      <&crypto_sram1>;
+                               marvell,crypto-sram-size = <0x800>;
+                       };
+
+                       bm: bm@c0000 {
+                               compatible = "marvell,armada-380-neta-bm";
+                               reg = <0xc0000 0xac>;
+                               clocks = <&gateclk 13>;
+                               internal-mem = <&bm_bppi>;
+                               status = "disabled";
+                       };
+
+                       xor0: xor@f0900 {
                                compatible = "marvell,orion-xor";
                                reg = <0xF0900 0x100
                                       0xF0B00 0x100>;
                                };
                        };
                };
+
+               crypto_sram0: sa-sram0 {
+                       compatible = "mmio-sram";
+                       reg = <MBUS_ID(0x09, 0x09) 0 0x800>;
+                       clocks = <&gateclk 23>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0 MBUS_ID(0x09, 0x09) 0 0x800>;
+               };
+
+               crypto_sram1: sa-sram1 {
+                       compatible = "mmio-sram";
+                       reg = <MBUS_ID(0x09, 0x05) 0 0x800>;
+                       clocks = <&gateclk 23>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0 MBUS_ID(0x09, 0x05) 0 0x800>;
+               };
+
+               bm_bppi: bm-bppi {
+                       compatible = "mmio-sram";
+                       reg = <MBUS_ID(0x0c, 0x04) 0 0x100000>;
+                       ranges = <0 MBUS_ID(0x0c, 0x04) 0 0x100000>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       clocks = <&gateclk 13>;
+                       no-memory-wc;
+                       status = "disabled";
+               };
        };
 
        clocks {
        };
 };
 
+&i2c0 {
+       compatible = "marvell,mv78230-i2c", "marvell,mv64xxx-i2c";
+       reg = <0x11000 0x100>;
+};
+
+&i2c1 {
+       compatible = "marvell,mv78230-i2c", "marvell,mv64xxx-i2c";
+       reg = <0x11100 0x100>;
+};
+
+&mpic {
+       reg = <0x20a00 0x2d0>, <0x21070 0x58>;
+};
+
+&timer {
+       compatible = "marvell,armada-xp-timer";
+       clocks = <&coreclk 2>, <&refclk>;
+       clock-names = "nbclk", "fixed";
+};
+
+&watchdog {
+       compatible = "marvell,armada-xp-wdt";
+       clocks = <&coreclk 2>, <&refclk>;
+       clock-names = "nbclk", "fixed";
+};
+
+&cpurst {
+       reg = <0x20800 0x20>;
+};
+
+&usb0 {
+       clocks = <&gateclk 18>;
+};
+
+&usb1 {
+       clocks = <&gateclk 19>;
+};
+
 &pinctrl {
        ge0_gmii_pins: ge0-gmii-pins {
                marvell,pins =
                marvell,function = "spi0";
        };
 
+       spi1_pins: spi1-pins {
+               marvell,pins = "mpp13", "mpp14",
+                              "mpp16", "mpp17";
+               marvell,function = "spi1";
+       };
+
        uart2_pins: uart2-pins {
                marvell,pins = "mpp42", "mpp43";
                marvell,function = "uart2";
                marvell,function = "uart3";
        };
 };
+
+&spi0 {
+       compatible = "marvell,armada-xp-spi", "marvell,orion-spi";
+       pinctrl-0 = <&spi0_pins>;
+       pinctrl-names = "default";
+};
+
+&spi1 {
+       compatible = "marvell,armada-xp-spi", "marvell,orion-spi";
+       pinctrl-0 = <&spi1_pins>;
+       pinctrl-names = "default";
+};
diff --git a/arch/arm/dts/at91-sama5d2_icp-u-boot.dtsi b/arch/arm/dts/at91-sama5d2_icp-u-boot.dtsi
new file mode 100644 (file)
index 0000000..347fa81
--- /dev/null
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0+ OR MIT
+/*
+ * at91-sama5d2_icp-for-uboot.dtsi - Device Tree file for SAMA5D2 ICP board
+ *                     SAMA5D2 Industrial Connectivity Platform
+ *
+ *  Copyright (c) 2019, Microchip Technology Inc. and its subsidiaries
+ *                2019, Eugen Hristev <eugen.hristev@microchip.com>
+ */
+
+/ {
+       chosen {
+               u-boot,dm-pre-reloc;
+       };
+};
+
+&sdmmc0 {
+       u-boot,dm-pre-reloc;
+};
+
+&uart0 { /* mikrobus1 uart */
+       u-boot,dm-pre-reloc;
+};
+
+&pinctrl_sdmmc0_default {
+       u-boot,dm-pre-reloc;
+};
+
+&pinctrl_mikrobus1_uart {
+       u-boot,dm-pre-reloc;
+};
diff --git a/arch/arm/dts/at91-sama5d2_icp.dts b/arch/arm/dts/at91-sama5d2_icp.dts
new file mode 100644 (file)
index 0000000..cae8748
--- /dev/null
@@ -0,0 +1,132 @@
+// SPDX-License-Identifier: GPL-2.0+ OR MIT
+/*
+ * at91-sama5d2_icp.dts - Device Tree file for SAMA5D2 ICP board
+ *                     SAMA5D2 Industrial Connectivity Board
+ *
+ *  Copyright (c) 2018, Microchip Technology Inc.
+ *                2018, Eugen Hristev <eugen.hristev@microchip.com>
+ */
+/dts-v1/;
+#include "sama5d2.dtsi"
+#include "sama5d2-pinfunc.h"
+
+/ {
+       model = "Microchip SAMA5D2 ICP";
+       compatible = "atmel,sama5d2-icp", "atmel,sama5d27", "atmel,sama5d2", "atmel,sama5";
+
+       aliases {
+               serial0 = &uart0;
+               i2c1    = &i2c1;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       ahb {
+
+               sdmmc0: sdio-host@a0000000 {
+                       bus-width = <4>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_sdmmc0_default>;
+                       status = "okay";
+               };
+
+               apb {
+                       uart0: serial@f801c000 { /* mikrobus1 uart */
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_mikrobus1_uart>;
+                               status = "okay";
+                       };
+
+                       macb0: ethernet@f8008000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_macb0_rmii &pinctrl_macb0_phy_irq &pinctrl_macb0_rst>;
+                               phy-mode = "internal";
+                               status = "okay";
+                       };
+
+                       i2c1: i2c@fc028000 {
+                               dmas = <0>, <0>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_i2c1_default>;
+                               status = "okay";
+
+                               eeprom@50 {
+                                       compatible = "atmel,24c32";
+                                       reg = <0x50>;
+                                       pagesize = <16>;
+                               };
+
+                               eeprom@52 {
+                                       compatible = "atmel,24c32";
+                                       reg = <0x52>;
+                                       pagesize = <16>;
+                               };
+
+                               eeprom@53 {
+                                       compatible = "atmel,24c32";
+                                       reg = <0x53>;
+                                       pagesize = <16>;
+                               };
+                       };
+                       pioA: gpio@fc038000 {
+                               status = "okay";
+                               pinctrl {
+                                       pinctrl_i2c1_default: i2c1_default {
+                                               pinmux = <PIN_PD19__TWD1>,
+                                                        <PIN_PD20__TWCK1>;
+                                               bias-disable;
+                                       };
+
+                                       pinctrl_macb0_rmii: macb0_rmii {
+                                               pinmux = <PIN_PD1__GRXCK>,
+                                                        <PIN_PD2__GTXER>,
+                                                        <PIN_PD5__GRX2>,
+                                                        <PIN_PD6__GRX3>,
+                                                        <PIN_PD7__GTX2>,
+                                                        <PIN_PD8__GTX3>,
+                                                        <PIN_PD9__GTXCK>,
+                                                        <PIN_PD10__GTXEN>,
+                                                        <PIN_PD11__GRXDV>,
+                                                        <PIN_PD12__GRXER>,
+                                                        <PIN_PD13__GRX0>,
+                                                        <PIN_PD14__GRX1>,
+                                                        <PIN_PD15__GTX0>,
+                                                        <PIN_PD16__GTX1>,
+                                                        <PIN_PD17__GMDC>,
+                                                        <PIN_PD18__GMDIO>;
+                                               bias-disable;
+                                       };
+
+                                       pinctrl_macb0_phy_irq: macb0_phy_irq {
+                                               pinmux = <PIN_PD3__GPIO>;
+                                               bias-disable;
+                                       };
+
+                                       pinctrl_macb0_rst: macb0_sw_rst {
+                                               pinmux = <PIN_PD4__GPIO>;
+                                               bias-pull-up;
+                                       };
+
+                                       pinctrl_sdmmc0_default: sdmmc0_default {
+                                               pinmux = <PIN_PA1__SDMMC0_CMD>,
+                                                        <PIN_PA2__SDMMC0_DAT0>,
+                                                        <PIN_PA3__SDMMC0_DAT1>,
+                                                        <PIN_PA4__SDMMC0_DAT2>,
+                                                        <PIN_PA5__SDMMC0_DAT3>,
+                                                        <PIN_PA0__SDMMC0_CK>,
+                                                        <PIN_PA13__SDMMC0_CD>;
+                                               bias-disable;
+                                       };
+
+                                       pinctrl_mikrobus1_uart: mikrobus1_uart {
+                                               pinmux = <PIN_PB26__URXD0>,
+                                                        <PIN_PB27__UTXD0>;
+                                               bias-disable;
+                                       };
+                               };
+                       };
+               };
+       };
+};
index 33064b390a65dc593284f161501d6e0d3fe4acfa..c0708feeb7b23696c95cdc75437a9aaa3254d97d 100644 (file)
                                u-boot,dm-pre-reloc;
 
                                spi_flash@0 {
-                                       compatible = "spi-flash";
+                                       compatible = "jedec,spi-nor";
                                        reg = <0>;
                                        spi-max-frequency = <50000000>;
                                        u-boot,dm-pre-reloc;
index 58a0e60d184dd67edd884c7e03852e9559af4a65..7da5086865b84cb5bbbc1c1f422b00852cf029db 100644 (file)
                                status = "okay";
                                spi_flash@0 {
                                        u-boot,dm-pre-reloc;
-                                       compatible = "spi-flash";
+                                       compatible = "jedec,spi-nor";
                                        spi-max-frequency = <50000000>;
                                        reg = <0>;
                                };
index a5d75452cf3e8fff1c845e672cf1009f3c27f3a4..c1d657814df861aab21f6d15ef480c6f0b751191 100644 (file)
                                status = "okay";
                                spi_flash@0 {
                                        u-boot,dm-pre-reloc;
-                                       compatible = "spi-flash";
+                                       compatible = "jedec,spi-nor";
                                        spi-max-frequency = <50000000>;
                                        reg = <0>;
                                };
index 476ad1dad2af27ff464e6050254f5390a14eee97..800d96eb2fcc6b8e05708cc60c3ab6b2786c7d99 100644 (file)
                                u-boot,dm-pre-reloc;
                        };
 
-                       pinctrl@fffff400 {
+                       pinctrl: pinctrl@fffff400 {
                                #address-cells = <1>;
                                #size-cells = <1>;
                                compatible = "atmel,at91rm9200-pinctrl", "simple-bus";
                                };
                        };
 
-                       rtc@fffffd20 {
+                       rtc: rtc@fffffd20 {
                                compatible = "atmel,at91sam9260-rtt";
                                reg = <0xfffffd20 0x10>;
                                interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
                                status = "disabled";
                        };
 
-                       watchdog@fffffd40 {
+                       watchdog: watchdog@fffffd40 {
                                compatible = "atmel,at91sam9260-wdt";
                                reg = <0xfffffd40 0x10>;
                                interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
index 888bda15aaed690bf43aeed2c9251a4ca8eb2a3d..64a7abf639ffeb81f5a1cfab2bc59c9b983ec58b 100644 (file)
                                status = "okay";
                                cs-gpios = <&pioA 14 0>, <0>, <0>, <0>;
                                spi_flash@0 {
-                                       compatible = "spi-flash";
+                                       compatible = "jedec,spi-nor";
                                        spi-max-frequency = <50000000>;
                                        reg = <0>;
                                };
index f2a532d605da61fcc13e82c8e69dccdce092e74d..1f7f37b687c23ca96e468340ff0ae68a7eeeffa5 100644 (file)
                                status = "okay";
                                cs-gpios = <&pioA 14 0>, <0>, <0>, <0>;
                                spi_flash@0 {
-                                       compatible = "spi-flash";
+                                       compatible = "jedec,spi-nor";
                                        spi-max-frequency = <50000000>;
                                        reg = <0>;
                                };
index 6a3fbc90939b22cdba221b1d601293fce511e453..4b2eaeea2eb282de181ede2961545dd1276724c0 100644 (file)
                        status = "disabled";
                };
 
+               leds: led-controller@ff800800 {
+                       compatible = "brcm,bcm6858-leds";
+                       reg = <0x0 0xff800800 0x0 0xe4>;
+
+                       status = "disabled";
+               };
+
                wdt1: watchdog@ff800480 {
                        compatible = "brcm,bcm6345-wdt";
                        reg = <0x0 0xff800480 0x0 0x14>;
                        compatible = "wdt-reboot";
                        wdt = <&wdt1>;
                };
+
+               gpio0: gpio-controller@0xff800500 {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x0 0xff800500 0x0 0x4>,
+                             <0x0 0xff800520 0x0 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               gpio1: gpio-controller@0xff800504 {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x0 0xff800504 0x0 0x4>,
+                             <0x0 0xff800524 0x0 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               gpio2: gpio-controller@0xff800508 {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x0 0xff800508 0x0 0x4>,
+                             <0x0 0xff800528 0x0 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               gpio3: gpio-controller@0xff80050c {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x0 0xff80050c 0x0 0x4>,
+                             <0x0 0xff80052c 0x0 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               gpio4: gpio-controller@0xff800510 {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x0 0xff800510 0x0 0x4>,
+                             <0x0 0xff800530 0x0 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               gpio5: gpio-controller@0xff800514 {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x0 0xff800514 0x0 0x4>,
+                             <0x0 0xff800534 0x0 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               gpio6: gpio-controller@0xff800518 {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x0 0xff800518 0x0 0x4>,
+                             <0x0 0xff800538 0x0 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               gpio7: gpio-controller@0xff80051c {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x0 0xff80051c 0x0 0x4>,
+                             <0x0 0xff80053c 0x0 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               nand: nand-controller@ff801800 {
+                       compatible = "brcm,nand-bcm63158",
+                                    "brcm,brcmnand-v5.0",
+                                    "brcm,brcmnand";
+                       reg-names = "nand", "nand-int-base", "nand-cache";
+                       reg = <0x0 0xff801800 0x0 0x180>,
+                             <0x0 0xff802000 0x0 0x10>,
+                             <0x0 0xff801c00 0x0 0x200>;
+                       parameter-page-big-endian = <0>;
+
+                       status = "disabled";
+               };
        };
 };
index 23b80c67a64a6db77569c86851220693a0c736bc..76ba0ea1675ecc95fd33f5dc40f453ccf2827ae5 100644 (file)
                        status = "disabled";
                };
 
+               leds: led-controller@ff800800 {
+                       compatible = "brcm,bcm6858-leds";
+                       reg = <0x0 0xff800800 0x0 0xe4>;
+
+                       status = "disabled";
+               };
+
                wdt1: watchdog@ff802780 {
                        compatible = "brcm,bcm6345-wdt";
                        reg = <0x0 0xff802780 0x0 0x14>;
                        compatible = "wdt-reboot";
                        wdt = <&wdt1>;
                };
+
+               gpio0: gpio-controller@0xff800500 {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x0 0xff800500 0x0 0x4>,
+                             <0x0 0xff800520 0x0 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               gpio1: gpio-controller@0xff800504 {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x0 0xff800504 0x0 0x4>,
+                             <0x0 0xff800524 0x0 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               gpio2: gpio-controller@0xff800508 {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x0 0xff800508 0x0 0x4>,
+                             <0x0 0xff800528 0x0 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               gpio3: gpio-controller@0xff80050c {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x0 0xff80050c 0x0 0x4>,
+                             <0x0 0xff80052c 0x0 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               gpio4: gpio-controller@0xff800510 {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x0 0xff800510 0x0 0x4>,
+                             <0x0 0xff800530 0x0 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               gpio5: gpio-controller@0xff800514 {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x0 0xff800514 0x0 0x4>,
+                             <0x0 0xff800534 0x0 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               gpio6: gpio-controller@0xff800518 {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x0 0xff800518 0x0 0x4>,
+                             <0x0 0xff800538 0x0 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               gpio7: gpio-controller@0xff80051c {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x0 0xff80051c 0x0 0x4>,
+                             <0x0 0xff80053c 0x0 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               nand: nand-controller@ff801800 {
+                       compatible = "brcm,nand-bcm6858",
+                                    "brcm,brcmnand-v5.0",
+                                    "brcm,brcmnand";
+                       reg-names = "nand", "nand-int-base", "nand-cache";
+                       reg = <0x0 0xff801800 0x0 0x180>,
+                             <0x0 0xff802000 0x0 0x10>,
+                             <0x0 0xff801c00 0x0 0x200>;
+                       parameter-page-big-endian = <0>;
+
+                       status = "disabled";
+               };
        };
 };
index dc5afb5a24afa4641891f421266ff841c7cf09ea..85659440dae938acd69b633ba856c47d74817d16 100644 (file)
        u-boot,dm-pre-reloc;
        status = "okay";
 };
+
+&gpio0 {
+       status = "okay";
+};
+
+&gpio1 {
+       status = "okay";
+};
+
+&gpio2 {
+       status = "okay";
+};
+
+&gpio3 {
+       status = "okay";
+};
+
+&gpio4 {
+       status = "okay";
+};
+
+&gpio5 {
+       status = "okay";
+};
+
+&gpio6 {
+       status = "okay";
+};
+
+&gpio7 {
+       status = "okay";
+};
+
+&nand {
+       status = "okay";
+       write-protect = <0>;
+       #address-cells = <1>;
+       #size-cells = <0>;
+
+       nandcs@0 {
+               compatible = "brcm,nandcs";
+               reg = <0>;
+               nand-ecc-strength = <4>;
+               nand-ecc-step-size = <512>;
+               brcm,nand-oob-sector-size = <16>;
+       };
+};
+
+&leds {
+       status = "okay";
+       #address-cells = <1>;
+       #size-cells = <0>;
+       brcm,serial-led-en-pol;
+       brcm,serial-led-data-ppol;
+
+       led@16 {
+               reg = <16>;
+               label = "red:dsl2";
+       };
+
+       led@17 {
+               reg = <17>;
+               label = "green:dsl1";
+       };
+
+       led@18 {
+               reg = <18>;
+               label = "green:fxs2";
+       };
+
+       led@19 {
+               reg = <19>;
+               label = "green:fxs1";
+       };
+
+       led@26 {
+               reg = <26>;
+               label = "green:wan1_act";
+       };
+
+       led@27 {
+               reg = <27>;
+               label = "green:wps";
+       };
+
+       led@28 {
+               reg = <28>;
+               active-low;
+               label = "green:aggregate_act";
+       };
+
+       led@29 {
+               reg = <29>;
+               label = "green:aggregate_link";
+       };
+};
index 0c59f94710c97925d9e05b6390c42be3f80d3a5f..861e9891a78371dcbf1cac223ab1b3ae66ebf7da 100644 (file)
        u-boot,dm-pre-reloc;
        status = "okay";
 };
+
+&gpio0 {
+       status = "okay";
+};
+
+&gpio1 {
+       status = "okay";
+};
+
+&gpio2 {
+       status = "okay";
+};
+
+&gpio3 {
+       status = "okay";
+};
+
+&gpio4 {
+       status = "okay";
+};
+
+&gpio5 {
+       status = "okay";
+};
+
+&gpio6 {
+       status = "okay";
+};
+
+&gpio7 {
+       status = "okay";
+};
+
+&nand {
+       status = "okay";
+       write-protect = <0>;
+       #address-cells = <1>;
+       #size-cells = <0>;
+
+       nandcs@0 {
+               compatible = "brcm,nandcs";
+               reg = <0>;
+               nand-ecc-strength = <4>;
+               nand-ecc-step-size = <512>;
+               brcm,nand-oob-sector-size = <16>;
+       };
+};
+
+&leds {
+       status = "okay";
+       #address-cells = <1>;
+       #size-cells = <0>;
+       brcm,serial-led-en-pol;
+       brcm,serial-led-data-ppol;
+
+       led@2 {
+               reg = <2>;
+               label = "green:inet";
+       };
+
+       led@5 {
+               reg = <5>;
+               label = "red:alarm";
+       };
+
+       led@8 {
+               reg = <8>;
+               label = "green:wlan_link";
+       };
+
+       led@11 {
+               reg = <11>;
+               label = "green:fxs1";
+       };
+
+       led@14 {
+               reg = <14>;
+               label = "green:fxs2";
+       };
+
+       led@15 {
+               reg = <15>;
+               label = "green:usb0";
+       };
+
+       led@16 {
+               reg = <16>;
+               label = "green:usb1";
+       };
+
+       led@17 {
+               reg = <17>;
+               label = "green:wps";
+       };
+};
diff --git a/arch/arm/dts/bk4r1.dts b/arch/arm/dts/bk4r1.dts
deleted file mode 100644 (file)
index 866b80e..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+ OR X11
-/*
- * Copyright 2016 Toradex AG
- */
-
-/dts-v1/;
-#include "vf.dtsi"
-
-/ {
-       model = "Phytec phyCORE-Vybrid";
-       compatible = "phytec,pcm052", "fsl,vf610";
-
-       chosen {
-               stdout-path = &uart1;
-       };
-
-       aliases {
-               spi0 = &qspi0;
-       };
-
-};
-
-&uart1 {
-       status = "okay";
-};
-
-&qspi0 {
-       bus-num = <0>;
-       num-cs = <2>;
-       status = "okay";
-
-       qflash0: spi_flash@0 {
-               #address-cells = <1>;
-               #size-cells = <1>;
-               compatible = "spi-flash";
-               spi-max-frequency = <108000000>;
-               reg = <0>;
-       };
-
-       qflash1: spi_flash@1 {
-               #address-cells = <1>;
-               #size-cells = <1>;
-               compatible = "spi-flash";
-               spi-max-frequency = <66000000>;
-               reg = <1>;
-       };
-};
index ab1de77954035d98fed19f6dbf03a45b2ba04934..1683f3472e4dfc51bd0a21240b46fe85bf791d74 100644 (file)
@@ -6,6 +6,24 @@
  * Copyright (C) Adam Ford
  */
 
+/ {
+       soc@1c00000 {
+               u-boot,dm-spl;
+       };
+};
+
 &flash {
-       compatible = "m25p64", "spi-flash";
+       compatible = "m25p64", "jedec,spi-nor";
+};
+
+&mmc0 {
+       u-boot,dm-spl;
+};
+
+&serial2 {
+       u-boot,dm-spl;
+};
+
+&spi1 {
+       u-boot,dm-spl;
 };
index 0f982d8b44addc3a201d84128112a492e5823ff1..fd1aea0b1b1617b6c4fa08d03c13204c6da61334 100644 (file)
                                                pbias_mmc_reg: pbias_mmc_omap5 {
                                                        regulator-name = "pbias_mmc_omap5";
                                                        regulator-min-microvolt = <1800000>;
-                                                       regulator-max-microvolt = <3000000>;
+                                                       regulator-max-microvolt = <3300000>;
                                                };
                                        };
 
index 41c9132eb550d07dd686a85eda0296bbfad0b6f7..64363f75c01ad507ce40c32bd2e4a756190a608e 100644 (file)
 
                regulator-name = "vddshv8";
                regulator-min-microvolt = <1800000>;
-               regulator-max-microvolt = <3000000>;
+               regulator-max-microvolt = <3300000>;
                regulator-boot-on;
                vin-supply = <&evm_5v0>;
 
                gpios = <&gpio7 11 GPIO_ACTIVE_HIGH>;
                states = <1800000 0x0
-                         3000000 0x1>;
+                         3300000 0x1>;
        };
 
        evm_1v8_sw: fixedregulator-evm_1v8 {
index 7587dc0ff24dd5c1cc2a75c5a07dad4c134d3388..e41f2d3041e2f1a40358212a92f66e5a75ec99a2 100644 (file)
        spi@12d30000 {
                spi-max-frequency = <50000000>;
                firmware_storage_spi: flash@0 {
-                       compatible = "spi-flash";
+                       compatible = "jedec,spi-nor";
                        reg = <0>;
                };
        };
index c7553208adeed6f85255f9c412c0ced2427f7d34..77e7a6b9e45a61554c2996efe2e37d04d7bb014f 100644 (file)
        spi@12d30000 {
                spi-max-frequency = <50000000>;
                firmware_storage_spi: flash@0 {
-                       compatible = "spi-flash";
+                       compatible = "jedec,spi-nor";
                        reg = <0>;
                };
        };
index 4a96a18110a2fe85085ad9745bc14c267ca60a75..a68c3b517460f6483ba6984efd423290caaf7fed 100644 (file)
        spi@12d30000 { /* spi1 */
                spi-max-frequency = <50000000>;
                firmware_storage_spi: flash@0 {
-                       compatible = "spi-flash";
+                       compatible = "jedec,spi-nor";
                        reg = <0>;
 
                        /*
index cdd4ce45aaf9bf15101cb8d27c49db26f90d6857..fecef88e08094a5e247f54a7b439ea37b588f0c4 100644 (file)
@@ -27,7 +27,7 @@
        qflash0: s25fl128s@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <20000000>;
                reg = <0>;
        };
index 9cb3de1d40cf02105304ee6ea8cf541e58b0b79c..a357793bfaca5180aa22bddeccd32776c71f465a 100644 (file)
@@ -21,7 +21,7 @@
        qflash0: s25fl128s@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <20000000>;
                reg = <0>;
        };
index a56909ab92f4085e69c5828d5df8819a71cb54aa..7242af51e432e0f01fc9b6d2ecad407a54bcebc7 100644 (file)
@@ -28,7 +28,7 @@
        qflash0: w25q16dw@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <20000000>;
                reg = <0>;
        };
index 661af0e49e637b51a722a2d78f8770545e48c65a..a330597b6c047ed3969fd7d7cf64dabd66583fbd 100644 (file)
@@ -20,7 +20,7 @@
        dflash0: n25q128a {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                reg = <0>;
                spi-max-frequency = <1000000>; /* input clock */
        };
@@ -28,7 +28,7 @@
        dflash1: sst25wf040b {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <3500000>;
                reg = <1>;
        };
@@ -36,7 +36,7 @@
        dflash2: en25s64 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <3500000>;
                reg = <2>;
        };
@@ -49,7 +49,7 @@
        qflash0: s25fl128s@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <20000000>;
                reg = <0>;
        };
index 757e2eb3519193090f65b68e42724dec77f3eb0a..f053e789c253b792fc8b1217e432ad270e79e8bf 100644 (file)
@@ -21,7 +21,7 @@
        qflash0: s25fl128s@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <20000000>;
                reg = <0>;
        };
index 3841aee11e47347d097c595dd9c49b4e859db3b5..70e1a6a53f1130cd18f6eab0f4b1ac7d7359626f 100644 (file)
@@ -24,7 +24,7 @@
        dflash0: n25q128a {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <1000000>; /* input clock */
                spi-cpol;
                spi-cpha;
@@ -34,7 +34,7 @@
        dflash1: sst25wf040b {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <3500000>;
                spi-cpol;
                spi-cpha;
@@ -44,7 +44,7 @@
        dflash2: en25s64 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <3500000>;
                spi-cpol;
                spi-cpha;
@@ -59,7 +59,7 @@
        qflash0: s25fl128s@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <20000000>;
                reg = <0>;
        };
index c42cad703484e62736b9d5220021c45910f6b303..721b158169db43cf42b23bfea044a173d21621cd 100644 (file)
@@ -26,7 +26,7 @@
        dspiflash: n25q12a {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                reg = <0>;
                spi-max-frequency = <1000000>; /* input clock */
        };
index ada8a859b10a9cd4ef8a8cc781c42e351d67e7f2..c95f44fc36166b9f847c5919191d842f28dc4a2f 100644 (file)
@@ -24,7 +24,7 @@
        dflash0: n25q128a {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <1000000>; /* input clock */
                spi-cpol;
                spi-cpha;
@@ -34,7 +34,7 @@
        dflash1: sst25wf040b {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <3500000>;
                spi-cpol;
                spi-cpha;
@@ -44,7 +44,7 @@
        dflash2: en25s64 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <3500000>;
                spi-cpol;
                spi-cpha;
@@ -59,7 +59,7 @@
        qflash0: s25fl128s@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <20000000>;
                reg = <0>;
        };
index ba30fd262ac9477af0483d89695c1ed2bc2ae2b5..a05c9e9b9ea0ee33e4f89a7445514037c92ad261 100644 (file)
@@ -26,7 +26,7 @@
        qflash0: s25fs512s@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <50000000>;
                reg = <0>;
        };
@@ -34,7 +34,7 @@
        qflash1: s25fs512s@1 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <50000000>;
                reg = <1>;
         };
index 4ea451c1b6a9dd5271196cdfbc85918b1d4cdb70..8fbb52f0e09df5d827f40610f4031e1f38789073 100644 (file)
@@ -62,7 +62,7 @@
        dflash0: n25q128a {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                reg = <0>;
                spi-max-frequency = <1000000>; /* input clock */
        };
@@ -70,7 +70,7 @@
        dflash1: sst25wf040b {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <3500000>;
                reg = <1>;
        };
@@ -78,7 +78,7 @@
        dflash2: en25s64 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <3500000>;
                reg = <2>;
        };
@@ -91,7 +91,7 @@
        qflash0: s25fs512s@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <50000000>;
                reg = <0>;
        };
@@ -99,7 +99,7 @@
        qflash1: s25fs512s@1 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <50000000>;
                reg = <1>;
         };
index f30bbb7247c503698fa1a3a84b05357eaeccf3cf..765d1e3d74e8c1bd5d66bfb95c41587ed7e2f86c 100644 (file)
@@ -24,7 +24,7 @@
        qflash0: s25fs512s@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <50000000>;
                reg = <0>;
        };
@@ -32,7 +32,7 @@
        qflash1: s25fs512s@1 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <50000000>;
                reg = <1>;
         };
index 39fbc1b79c1cc8a23724f547a78d05dc629bfed7..2a0a5280d07e81c9f535950ac5baa3fcb1b0da2b 100644 (file)
@@ -26,7 +26,7 @@
        dflash0: n25q128a {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <3000000>;
                spi-cpol;
                spi-cpha;
@@ -35,7 +35,7 @@
        dflash1: sst25wf040b {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <3000000>;
                spi-cpol;
                spi-cpha;
@@ -44,7 +44,7 @@
        dflash2: en25s64 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <3000000>;
                spi-cpol;
                spi-cpha;
@@ -59,7 +59,7 @@
        qflash0: s25fs256s@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <20000000>;
                reg = <0>;
        };
index e7567cfa2312d33db6373860e91684ddbd530711..0a87caeba967bd8436ac0a5e76fc6979e73d4b50 100644 (file)
@@ -25,7 +25,7 @@
        dflash0: n25q512a {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <3000000>;
                spi-cpol;
                spi-cpha;
index 73e2683d59bca7b4c151af6893697087ff57fd39..b0b7ef08a021823728f9b6f420a6afef4993854b 100644 (file)
@@ -28,7 +28,7 @@
        dflash0: n25q512a {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <3000000>;
                spi-cpol;
                spi-cpha;
@@ -43,7 +43,7 @@
        qflash0: s25fs512s@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <50000000>;
                reg = <0>;
        };
@@ -51,7 +51,7 @@
        qflash1: s25fs512s@1 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <50000000>;
                reg = <1>;
        };
index b6d4f0f6af1218f1172ae565f0cf77369dc16f9f..bf97d138fc2c7d5ba1c4aa9e1827e3f3c979ef4d 100644 (file)
@@ -28,7 +28,7 @@
        dflash0: n25q512a {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <3000000>;
                spi-cpol;
                spi-cpha;
@@ -43,7 +43,7 @@
        qflash0: s25fs512s@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <50000000>;
                reg = <0>;
        };
@@ -51,7 +51,7 @@
        qflash1: s25fs512s@1 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <50000000>;
                reg = <1>;
        };
index 7844c5208c5d4e5a8083c51d3e04288b8b70b3a9..2de06d952914643fbc512cd2af4a2df1a69582f8 100644 (file)
@@ -8,7 +8,15 @@
  * (C) Copyright 2017 Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
  */
 
+#include <dt-bindings/reset/ti-syscon.h>
+
 &soc {
+       rst: reset-controller@8a22000 {
+               compatible = "hisilicon,hi3798cv200-reset";
+               reg = <0x8a22000 0x1000>;
+               #reset-cells = <3>;
+       };
+
        usb2: ehci@9890000 {
                compatible = "generic-ehci";
                reg = <0x9890000 0x100>;
        };
 };
 
+&gmac1 {
+       resets = <&rst 0xcc 9  ASSERT_SET>,
+                <&rst 0xcc 11 ASSERT_SET>,
+                <&rst 0xcc 13 DEASSERT_SET>;
+};
+
 &uart0 {
        clock = <75000000>;
        status = "okay";
diff --git a/arch/arm/dts/imx53-kp-u-boot.dtsi b/arch/arm/dts/imx53-kp-u-boot.dtsi
new file mode 100644 (file)
index 0000000..acab9b3
--- /dev/null
@@ -0,0 +1,10 @@
+/*
+ * Copyright 2019
+ * Lukasz Majewski, DENX Software Engineering, lukma@denx.de
+ *
+ * SPDX-License-Identifier:     GPL-2.0+ or X11
+ */
+
+&pmic {
+       u-boot,i2c-transaction-bytes = <3>;
+};
diff --git a/arch/arm/dts/imx53-ppd.dts b/arch/arm/dts/imx53-ppd.dts
new file mode 100644 (file)
index 0000000..f89d6f4
--- /dev/null
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: GPL-2.0+ OR X11 */
+/*
+ * Copyright 2018 General Electric Company
+ * Based on imx53-ppd.dts from kernel 4.20.5.
+ */
+
+/dts-v1/;
+
+#include "imx53.dtsi"
+
+/ {
+       model = "General Electric CS ONE";
+       compatible = "ge,imx53-cpuvo", "fsl,imx53";
+};
+
+&iomuxc {
+       pinctrl-names = "default";
+
+       pinctrl_esdhc3: esdhc3grp {
+               fsl,pins = <
+                       MX53_PAD_PATA_DATA8__ESDHC3_DAT0        0x1d5
+                       MX53_PAD_PATA_DATA9__ESDHC3_DAT1        0x1d5
+                       MX53_PAD_PATA_DATA10__ESDHC3_DAT2       0x1d5
+                       MX53_PAD_PATA_DATA11__ESDHC3_DAT3       0x1d5
+                       MX53_PAD_PATA_DATA0__ESDHC3_DAT4        0x1d5
+                       MX53_PAD_PATA_DATA1__ESDHC3_DAT5        0x1d5
+                       MX53_PAD_PATA_DATA2__ESDHC3_DAT6        0x1d5
+                       MX53_PAD_PATA_DATA3__ESDHC3_DAT7        0x1d5
+                       MX53_PAD_PATA_RESET_B__ESDHC3_CMD       0x1d5
+                       MX53_PAD_PATA_IORDY__ESDHC3_CLK         0x1d5
+               >;
+       };
+};
+
+/* eMMC */
+&esdhc3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_esdhc3>;
+       compatible = "fsl,esdhc";
+       bus-width = <8>;
+       non-removable;
+       status = "okay";
+};
index e13009c8708b51c1b8811ca4dea64febc12d79a2..0fd4acc6f5376d3364978c730f99f868e88283f3 100644 (file)
@@ -33,6 +33,8 @@
                i2c2 = &i2c3;
                mmc0 = &esdhc1;
                mmc1 = &esdhc2;
+               mmc2 = &esdhc3;
+               mmc3 = &esdhc4;
        };
 
        tzic: tz-interrupt-controller@fffc000 {
                                        bus-width = <4>;
                                        status = "disabled";
                                };
+
+                               esdhc3: esdhc@50020000 {
+                                       compatible = "fsl,imx53-esdhc";
+                                       reg = <0x50020000 0x4000>;
+                                       interrupts = <3>;
+                                       clocks = <&clks IMX5_CLK_ESDHC3_IPG_GATE>,
+                                                <&clks IMX5_CLK_DUMMY>,
+                                                <&clks IMX5_CLK_ESDHC3_PER_GATE>;
+                                       clock-names = "ipg", "ahb", "per";
+                                       bus-width = <4>;
+                                       status = "disabled";
+                               };
+
+                               esdhc4: esdhc@50024000 {
+                                       compatible = "fsl,imx53-esdhc";
+                                       reg = <0x50024000 0x4000>;
+                                       interrupts = <4>;
+                                       clocks = <&clks IMX5_CLK_ESDHC4_IPG_GATE>,
+                                                <&clks IMX5_CLK_DUMMY>,
+                                                <&clks IMX5_CLK_ESDHC4_PER_GATE>;
+                                       clock-names = "ipg", "ahb", "per";
+                                       bus-width = <4>;
+                                       status = "disabled";
+                               };
                        };
 
                        iomuxc: iomuxc@53fa8000 {
diff --git a/arch/arm/dts/imx6-apalis.dts b/arch/arm/dts/imx6-apalis.dts
new file mode 100644 (file)
index 0000000..b2fdfa1
--- /dev/null
@@ -0,0 +1,730 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * Copyright 2019 Toradex AG
+ */
+
+/dts-v1/;
+#include <dt-bindings/gpio/gpio.h>
+#include "imx6q.dtsi"
+
+/ {
+       model = "Toradex Apalis iMX6Q/D";
+       compatible = "toradex,apalis_imx6q", "fsl,imx6q";
+
+       /* Will be filled by the bootloader */
+       memory@10000000 {
+               device_type = "memory";
+               reg = <0x10000000 0>;
+       };
+
+       aliases {
+               mmc0 = &usdhc3;
+               mmc1 = &usdhc1;
+               mmc2 = &usdhc2;
+               usb0 = &usbotg; /* required for ums */
+       };
+
+       chosen {
+               stdout-path = &uart1;
+       };
+
+       reg_module_3v3: regulator-module-3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "+V3.3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+       };
+
+       reg_usb_otg_vbus: regulator-usb-otg-vbus {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_regulator_usbotg_pwr>;
+               regulator-name = "usb_otg_vbus";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>; /* USBO1_EN */
+               enable-active-high;
+       };
+
+       /* on-module USB hub */
+       reg_usb_host_vbus_hub: regulator-usb-host-vbus-hub {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_regulator_usbhub_pwr>;
+               regulator-name = "usb_host_vbus_hub";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               gpio = <&gpio3 28 GPIO_ACTIVE_HIGH>;
+               startup-delay-us = <2000>;
+               enable-active-high;
+       };
+
+       reg_usb_host_vbus: regulator-usb-host-vbus {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_regulator_usbh_pwr>;
+               regulator-name = "usb_host_vbus";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               gpio = <&gpio1 0 GPIO_ACTIVE_HIGH>; /* USBH_EN */
+               enable-active-high;
+               vin-supply = <&reg_usb_host_vbus_hub>;
+       };
+};
+
+/* I2C1_SDA/SCL on MXM3 209/211 (e.g. RTC on carrier board) */
+&i2c1 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c1>;
+       status = "okay";
+};
+
+/*
+ * PWR_I2C: power I2C to audio codec, PMIC, temperature sensor and
+ * touch screen controller
+ */
+&i2c2 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c2>;
+       status = "okay";
+
+       pmic: pfuze100@8 {
+               compatible = "fsl,pfuze100";
+               reg = <0x08>;
+
+               regulators {
+                       sw1a_reg: sw1ab {
+                               regulator-min-microvolt = <300000>;
+                               regulator-max-microvolt = <1875000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <6250>;
+                       };
+
+                       sw1c_reg: sw1c {
+                               regulator-min-microvolt = <300000>;
+                               regulator-max-microvolt = <1875000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <6250>;
+                       };
+
+                       sw3a_reg: sw3a {
+                               regulator-min-microvolt = <400000>;
+                               regulator-max-microvolt = <1975000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       swbst_reg: swbst {
+                               regulator-min-microvolt = <5000000>;
+                               regulator-max-microvolt = <5150000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       snvs_reg: vsnvs {
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <3000000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vref_reg: vrefddr {
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vgen1_reg: vgen1 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1550000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vgen2_reg: vgen2 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1550000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vgen3_reg: vgen3 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vgen4_reg: vgen4 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vgen5_reg: vgen5 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vgen6_reg: vgen6 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+               };
+       };
+};
+
+/*
+ * I2C3_SDA/SCL (CAM) on MXM3 pin 201/203 (e.g. camera sensor on carrier
+ * board)
+ */
+&i2c3 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default", "gpio";
+       pinctrl-0 = <&pinctrl_i2c3>;
+       pinctrl-1 = <&pinctrl_i2c3_recovery>;
+       scl-gpios = <&gpio3 17 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+       sda-gpios = <&gpio3 18 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+       status = "okay";
+};
+
+/* Apalis Serial ATA */
+&sata {
+       status = "okay";
+};
+
+/* Apalis UART1 */
+&uart1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart1_dte &pinctrl_uart1_ctrl>;
+       fsl,dte-mode;
+       uart-has-rtscts;
+       status = "okay";
+};
+
+/* Apalis UART2 */
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart2_dte>;
+       fsl,dte-mode;
+       uart-has-rtscts;
+       status = "okay";
+};
+
+/* Apalis UART3 */
+&uart4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart4_dte>;
+       fsl,dte-mode;
+       status = "okay";
+};
+
+/* Apalis UART4 */
+&uart5 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart5_dte>;
+       fsl,dte-mode;
+       status = "okay";
+};
+
+/* Apalis USBH[2|3|4] */
+&usbh1 {
+       dr_mode = "host";
+       vbus-supply = <&reg_usb_host_vbus>;
+       status = "okay";
+};
+
+/* Apalis USBO1 */
+&usbotg {
+       dr_mode = "host";
+       vbus-supply = <&reg_usb_otg_vbus>;
+       status = "okay";
+};
+
+/* Apalis MMC1 */
+&usdhc1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc1_4bit &pinctrl_usdhc1_8bit &pinctrl_mmc_cd>;
+       cd-gpios = <&gpio4 20 GPIO_ACTIVE_LOW>; /* MMC1_CD */
+       disable-wp;
+       no-1-8-v;
+       status = "okay";
+};
+
+/* Apalis SD1 */
+&usdhc2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2 &pinctrl_sd_cd>;
+       cd-gpios = <&gpio6 14 GPIO_ACTIVE_LOW>; /* SD1_CD */
+       disable-wp;
+       no-1-8-v;
+       status = "okay";
+};
+
+/* eMMC */
+&usdhc3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       vqmmc-supply = <&reg_module_3v3>;
+       bus-width = <8>;
+       no-1-8-v;
+       non-removable;
+       status = "okay";
+};
+
+&iomuxc {
+       pinctrl_apalis_gpio1: gpio2io04grp {
+               fsl,pins = <
+                       MX6QDL_PAD_NANDF_D4__GPIO2_IO04 0x130b0
+               >;
+       };
+
+       pinctrl_apalis_gpio2: gpio2io05grp {
+               fsl,pins = <
+                       MX6QDL_PAD_NANDF_D5__GPIO2_IO05 0x130b0
+               >;
+       };
+
+       pinctrl_apalis_gpio3: gpio2io06grp {
+               fsl,pins = <
+                       MX6QDL_PAD_NANDF_D6__GPIO2_IO06 0x130b0
+               >;
+       };
+
+       pinctrl_apalis_gpio4: gpio2io07grp {
+               fsl,pins = <
+                       MX6QDL_PAD_NANDF_D7__GPIO2_IO07 0x130b0
+               >;
+       };
+
+       pinctrl_apalis_gpio5: gpio6io10grp {
+               fsl,pins = <
+                       MX6QDL_PAD_NANDF_RB0__GPIO6_IO10        0x130b0
+               >;
+       };
+
+       pinctrl_apalis_gpio6: gpio6io09grp {
+               fsl,pins = <
+                       MX6QDL_PAD_NANDF_WP_B__GPIO6_IO09       0x130b0
+               >;
+       };
+
+       pinctrl_apalis_gpio7: gpio1io02grp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_2__GPIO1_IO02   0x130b0
+               >;
+       };
+
+       pinctrl_apalis_gpio8: gpio1io06grp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_6__GPIO1_IO06   0x130b0
+               >;
+       };
+
+       pinctrl_audmux: audmuxgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_DISP0_DAT20__AUD4_TXC        0x130b0
+                       MX6QDL_PAD_DISP0_DAT21__AUD4_TXD        0x130b0
+                       MX6QDL_PAD_DISP0_DAT22__AUD4_TXFS       0x130b0
+                       MX6QDL_PAD_DISP0_DAT23__AUD4_RXD        0x130b0
+                       /* SGTL5000 sys_mclk */
+                       MX6QDL_PAD_GPIO_5__CCM_CLKO1            0x130b0
+               >;
+       };
+
+       pinctrl_cam_mclk: cammclkgrp {
+               fsl,pins = <
+                       /* CAM sys_mclk */
+                       MX6QDL_PAD_NANDF_CS2__CCM_CLKO2 0x00b0
+               >;
+       };
+
+       pinctrl_ecspi1: ecspi1grp {
+               fsl,pins = <
+                       MX6QDL_PAD_CSI0_DAT6__ECSPI1_MISO       0x100b1
+                       MX6QDL_PAD_CSI0_DAT5__ECSPI1_MOSI       0x100b1
+                       MX6QDL_PAD_CSI0_DAT4__ECSPI1_SCLK       0x100b1
+                       /* SPI1 cs */
+                       MX6QDL_PAD_CSI0_DAT7__GPIO5_IO25        0x000b1
+               >;
+       };
+
+       pinctrl_ecspi2: ecspi2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_OE__ECSPI2_MISO  0x100b1
+                       MX6QDL_PAD_EIM_CS1__ECSPI2_MOSI 0x100b1
+                       MX6QDL_PAD_EIM_CS0__ECSPI2_SCLK 0x100b1
+                       /* SPI2 cs */
+                       MX6QDL_PAD_EIM_RW__GPIO2_IO26   0x000b1
+               >;
+       };
+
+       pinctrl_enet: enetgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_ENET_MDIO__ENET_MDIO         0x100b0
+                       MX6QDL_PAD_ENET_MDC__ENET_MDC           0x100b0
+                       MX6QDL_PAD_RGMII_TXC__RGMII_TXC         0x10030
+                       MX6QDL_PAD_RGMII_TD0__RGMII_TD0         0x10030
+                       MX6QDL_PAD_RGMII_TD1__RGMII_TD1         0x10030
+                       MX6QDL_PAD_RGMII_TD2__RGMII_TD2         0x10030
+                       MX6QDL_PAD_RGMII_TD3__RGMII_TD3         0x10030
+                       MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL   0x10030
+                       MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK    0x100b0
+                       MX6QDL_PAD_RGMII_RXC__RGMII_RXC         0x1b030
+                       MX6QDL_PAD_RGMII_RD0__RGMII_RD0         0x1b030
+                       MX6QDL_PAD_RGMII_RD1__RGMII_RD1         0x1b030
+                       MX6QDL_PAD_RGMII_RD2__RGMII_RD2         0x1b030
+                       MX6QDL_PAD_RGMII_RD3__RGMII_RD3         0x1b030
+                       MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL   0x1b030
+                       /* Ethernet PHY reset */
+                       MX6QDL_PAD_ENET_CRS_DV__GPIO1_IO25      0x000b0
+                       /* Ethernet PHY interrupt */
+                       MX6QDL_PAD_ENET_TXD0__GPIO1_IO30        0x000b1
+               >;
+       };
+
+       pinctrl_flexcan1: flexcan1grp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_7__FLEXCAN1_TX  0x1b0b0
+                       MX6QDL_PAD_GPIO_8__FLEXCAN1_RX  0x1b0b0
+               >;
+       };
+
+       pinctrl_flexcan2: flexcan2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_KEY_COL4__FLEXCAN2_TX        0x1b0b0
+                       MX6QDL_PAD_KEY_ROW4__FLEXCAN2_RX        0x1b0b0
+               >;
+       };
+
+       pinctrl_gpio_bl_on: gpioblon {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_DA13__GPIO3_IO13 0x1b0b0
+               >;
+       };
+
+       pinctrl_gpio_keys: gpio1io04grp {
+               fsl,pins = <
+                       /* Power button */
+                       MX6QDL_PAD_GPIO_4__GPIO1_IO04 0x1b0b0
+               >;
+       };
+
+       pinctrl_hdmi_cec: hdmicecgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_KEY_ROW2__HDMI_TX_CEC_LINE 0x1f8b0
+               >;
+       };
+
+       pinctrl_hdmi_ddc: hdmiddcgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_EB2__HDMI_TX_DDC_SCL     0x4001b8b1
+                       MX6QDL_PAD_EIM_D16__HDMI_TX_DDC_SDA     0x4001b8b1
+               >;
+       };
+
+       pinctrl_i2c1: i2c1grp {
+               fsl,pins = <
+                       MX6QDL_PAD_CSI0_DAT8__I2C1_SDA  0x4001b8b1
+                       MX6QDL_PAD_CSI0_DAT9__I2C1_SCL  0x4001b8b1
+               >;
+       };
+
+       pinctrl_i2c2: i2c2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_KEY_COL3__I2C2_SCL   0x4001b8b1
+                       MX6QDL_PAD_KEY_ROW3__I2C2_SDA   0x4001b8b1
+               >;
+       };
+
+       pinctrl_i2c3: i2c3grp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_D17__I2C3_SCL    0x4001b8b1
+                       MX6QDL_PAD_EIM_D18__I2C3_SDA    0x4001b8b1
+               >;
+       };
+
+       pinctrl_i2c3_recovery: i2c3recoverygrp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_D17__GPIO3_IO17  0x4001b8b1
+                       MX6QDL_PAD_EIM_D18__GPIO3_IO18  0x4001b8b1
+               >;
+       };
+
+       pinctrl_ipu1_lcdif: ipu1lcdifgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_A16__IPU1_DI1_DISP_CLK   0x61
+                       /* DE */
+                       MX6QDL_PAD_EIM_DA10__IPU1_DI1_PIN15     0x61
+                       /* HSync */
+                       MX6QDL_PAD_EIM_DA11__IPU1_DI1_PIN02     0x61
+                       /* VSync */
+                       MX6QDL_PAD_EIM_DA12__IPU1_DI1_PIN03     0x61
+                       MX6QDL_PAD_EIM_DA9__IPU1_DISP1_DATA00   0x61
+                       MX6QDL_PAD_EIM_DA8__IPU1_DISP1_DATA01   0x61
+                       MX6QDL_PAD_EIM_DA7__IPU1_DISP1_DATA02   0x61
+                       MX6QDL_PAD_EIM_DA6__IPU1_DISP1_DATA03   0x61
+                       MX6QDL_PAD_EIM_DA5__IPU1_DISP1_DATA04   0x61
+                       MX6QDL_PAD_EIM_DA4__IPU1_DISP1_DATA05   0x61
+                       MX6QDL_PAD_EIM_DA3__IPU1_DISP1_DATA06   0x61
+                       MX6QDL_PAD_EIM_DA2__IPU1_DISP1_DATA07   0x61
+                       MX6QDL_PAD_EIM_DA1__IPU1_DISP1_DATA08   0x61
+                       MX6QDL_PAD_EIM_DA0__IPU1_DISP1_DATA09   0x61
+                       MX6QDL_PAD_EIM_EB1__IPU1_DISP1_DATA10   0x61
+                       MX6QDL_PAD_EIM_EB0__IPU1_DISP1_DATA11   0x61
+                       MX6QDL_PAD_EIM_A17__IPU1_DISP1_DATA12   0x61
+                       MX6QDL_PAD_EIM_A18__IPU1_DISP1_DATA13   0x61
+                       MX6QDL_PAD_EIM_A19__IPU1_DISP1_DATA14   0x61
+                       MX6QDL_PAD_EIM_A20__IPU1_DISP1_DATA15   0x61
+                       MX6QDL_PAD_EIM_A21__IPU1_DISP1_DATA16   0x61
+                       MX6QDL_PAD_EIM_A22__IPU1_DISP1_DATA17   0x61
+                       MX6QDL_PAD_EIM_A23__IPU1_DISP1_DATA18   0x61
+                       MX6QDL_PAD_EIM_A24__IPU1_DISP1_DATA19   0x61
+                       MX6QDL_PAD_EIM_D31__IPU1_DISP1_DATA20   0x61
+                       MX6QDL_PAD_EIM_D30__IPU1_DISP1_DATA21   0x61
+                       MX6QDL_PAD_EIM_D26__IPU1_DISP1_DATA22   0x61
+                       MX6QDL_PAD_EIM_D27__IPU1_DISP1_DATA23   0x61
+               >;
+       };
+
+       pinctrl_ipu2_vdac: ipu2vdacgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_DI0_DISP_CLK__IPU2_DI0_DISP_CLK      0xd1
+                       MX6QDL_PAD_DI0_PIN15__IPU2_DI0_PIN15            0xd1
+                       MX6QDL_PAD_DI0_PIN2__IPU2_DI0_PIN02             0xd1
+                       MX6QDL_PAD_DI0_PIN3__IPU2_DI0_PIN03             0xd1
+                       MX6QDL_PAD_DISP0_DAT0__IPU2_DISP0_DATA00        0xf9
+                       MX6QDL_PAD_DISP0_DAT1__IPU2_DISP0_DATA01        0xf9
+                       MX6QDL_PAD_DISP0_DAT2__IPU2_DISP0_DATA02        0xf9
+                       MX6QDL_PAD_DISP0_DAT3__IPU2_DISP0_DATA03        0xf9
+                       MX6QDL_PAD_DISP0_DAT4__IPU2_DISP0_DATA04        0xf9
+                       MX6QDL_PAD_DISP0_DAT5__IPU2_DISP0_DATA05        0xf9
+                       MX6QDL_PAD_DISP0_DAT6__IPU2_DISP0_DATA06        0xf9
+                       MX6QDL_PAD_DISP0_DAT7__IPU2_DISP0_DATA07        0xf9
+                       MX6QDL_PAD_DISP0_DAT8__IPU2_DISP0_DATA08        0xf9
+                       MX6QDL_PAD_DISP0_DAT9__IPU2_DISP0_DATA09        0xf9
+                       MX6QDL_PAD_DISP0_DAT10__IPU2_DISP0_DATA10       0xf9
+                       MX6QDL_PAD_DISP0_DAT11__IPU2_DISP0_DATA11       0xf9
+                       MX6QDL_PAD_DISP0_DAT12__IPU2_DISP0_DATA12       0xf9
+                       MX6QDL_PAD_DISP0_DAT13__IPU2_DISP0_DATA13       0xf9
+                       MX6QDL_PAD_DISP0_DAT14__IPU2_DISP0_DATA14       0xf9
+                       MX6QDL_PAD_DISP0_DAT15__IPU2_DISP0_DATA15       0xf9
+               >;
+       };
+
+       pinctrl_mmc_cd: gpiommccdgrp {
+               fsl,pins = <
+                        /* MMC1 CD */
+                       MX6QDL_PAD_DI0_PIN4__GPIO4_IO20 0x000b0
+               >;
+       };
+
+       pinctrl_pwm1: pwm1grp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_9__PWM1_OUT     0x1b0b1
+               >;
+       };
+
+       pinctrl_pwm2: pwm2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_1__PWM2_OUT     0x1b0b1
+               >;
+       };
+
+       pinctrl_pwm3: pwm3grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD4_DAT1__PWM3_OUT   0x1b0b1
+               >;
+       };
+
+       pinctrl_pwm4: pwm4grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD4_DAT2__PWM4_OUT   0x1b0b1
+               >;
+       };
+
+       pinctrl_regulator_usbh_pwr: gpioregusbhpwrgrp {
+               fsl,pins = <
+                       /* USBH_EN */
+                       MX6QDL_PAD_GPIO_0__GPIO1_IO00   0x0f058
+               >;
+       };
+
+       pinctrl_regulator_usbhub_pwr: gpioregusbhubpwrgrp {
+               fsl,pins = <
+                       /* USBH_HUB_EN */
+                       MX6QDL_PAD_EIM_D28__GPIO3_IO28  0x0f058
+               >;
+       };
+
+       pinctrl_regulator_usbotg_pwr: gpioregusbotgpwrgrp {
+               fsl,pins = <
+                       /* USBO1 power en */
+                       MX6QDL_PAD_EIM_D22__GPIO3_IO22  0x0f058
+               >;
+       };
+
+       pinctrl_reset_moci: gpioresetmocigrp {
+               fsl,pins = <
+                       /* RESET_MOCI control */
+                       MX6QDL_PAD_ENET_TX_EN__GPIO1_IO28       0x0f058
+               >;
+       };
+
+       pinctrl_sd_cd: gpiosdcdgrp {
+               fsl,pins = <
+                       /* SD1 CD */
+                       MX6QDL_PAD_NANDF_CS1__GPIO6_IO14        0x000b0
+               >;
+       };
+
+       pinctrl_spdif: spdifgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_16__SPDIF_IN    0x1b0b0
+                       MX6QDL_PAD_GPIO_17__SPDIF_OUT   0x1b0b0
+               >;
+       };
+
+       pinctrl_touch_int: gpiotouchintgrp {
+               fsl,pins = <
+                       /* STMPE811 interrupt */
+                       MX6QDL_PAD_KEY_COL2__GPIO4_IO10 0x1b0b0
+               >;
+       };
+
+       pinctrl_uart1_dce: uart1dcegrp {
+               fsl,pins = <
+                       MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA    0x1b0b1
+                       MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA    0x1b0b1
+               >;
+       };
+
+       /* DTE mode */
+       pinctrl_uart1_dte: uart1dtegrp {
+               fsl,pins = <
+                       MX6QDL_PAD_CSI0_DAT10__UART1_RX_DATA    0x1b0b1
+                       MX6QDL_PAD_CSI0_DAT11__UART1_TX_DATA    0x1b0b1
+                       MX6QDL_PAD_EIM_D19__UART1_RTS_B         0x1b0b1
+                       MX6QDL_PAD_EIM_D20__UART1_CTS_B         0x1b0b1
+               >;
+       };
+
+       /* Additional DTR, DSR, DCD */
+       pinctrl_uart1_ctrl: uart1ctrlgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_D23__UART1_DCD_B 0x1b0b0
+                       MX6QDL_PAD_EIM_D24__UART1_DTR_B 0x1b0b0
+                       MX6QDL_PAD_EIM_D25__UART1_DSR_B 0x1b0b0
+               >;
+       };
+
+       pinctrl_uart2_dce: uart2dcegrp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD4_DAT4__UART2_RX_DATA      0x1b0b1
+                       MX6QDL_PAD_SD4_DAT7__UART2_TX_DATA      0x1b0b1
+               >;
+       };
+
+       /* DTE mode */
+       pinctrl_uart2_dte: uart2dtegrp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD4_DAT4__UART2_TX_DATA      0x1b0b1
+                       MX6QDL_PAD_SD4_DAT7__UART2_RX_DATA      0x1b0b1
+                       MX6QDL_PAD_SD4_DAT6__UART2_RTS_B        0x1b0b1
+                       MX6QDL_PAD_SD4_DAT5__UART2_CTS_B        0x1b0b1
+               >;
+       };
+
+       pinctrl_uart4_dce: uart4dcegrp {
+               fsl,pins = <
+                       MX6QDL_PAD_KEY_COL0__UART4_TX_DATA      0x1b0b1
+                       MX6QDL_PAD_KEY_ROW0__UART4_RX_DATA      0x1b0b1
+               >;
+       };
+
+       /* DTE mode */
+       pinctrl_uart4_dte: uart4dtegrp {
+               fsl,pins = <
+                       MX6QDL_PAD_KEY_COL0__UART4_RX_DATA      0x1b0b1
+                       MX6QDL_PAD_KEY_ROW0__UART4_TX_DATA      0x1b0b1
+               >;
+       };
+
+       pinctrl_uart5_dce: uart5dcegrp {
+               fsl,pins = <
+                       MX6QDL_PAD_KEY_COL1__UART5_TX_DATA      0x1b0b1
+                       MX6QDL_PAD_KEY_ROW1__UART5_RX_DATA      0x1b0b1
+               >;
+       };
+
+       /* DTE mode */
+       pinctrl_uart5_dte: uart5dtegrp {
+               fsl,pins = <
+                       MX6QDL_PAD_KEY_COL1__UART5_RX_DATA      0x1b0b1
+                       MX6QDL_PAD_KEY_ROW1__UART5_TX_DATA      0x1b0b1
+               >;
+       };
+
+       pinctrl_usbotg: usbotggrp {
+               fsl,pins = <
+                       MX6QDL_PAD_ENET_RX_ER__USB_OTG_ID       0x17059
+               >;
+       };
+
+       pinctrl_usdhc1_4bit: usdhc1grp_4bit {
+               fsl,pins = <
+                       MX6QDL_PAD_SD1_CMD__SD1_CMD     0x17071
+                       MX6QDL_PAD_SD1_CLK__SD1_CLK     0x10071
+                       MX6QDL_PAD_SD1_DAT0__SD1_DATA0  0x17071
+                       MX6QDL_PAD_SD1_DAT1__SD1_DATA1  0x17071
+                       MX6QDL_PAD_SD1_DAT2__SD1_DATA2  0x17071
+                       MX6QDL_PAD_SD1_DAT3__SD1_DATA3  0x17071
+               >;
+       };
+
+       pinctrl_usdhc1_8bit: usdhc1grp_8bit {
+               fsl,pins = <
+                       MX6QDL_PAD_NANDF_D0__SD1_DATA4  0x17071
+                       MX6QDL_PAD_NANDF_D1__SD1_DATA5  0x17071
+                       MX6QDL_PAD_NANDF_D2__SD1_DATA6  0x17071
+                       MX6QDL_PAD_NANDF_D3__SD1_DATA7  0x17071
+               >;
+       };
+
+       pinctrl_usdhc2: usdhc2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD2_CMD__SD2_CMD     0x17071
+                       MX6QDL_PAD_SD2_CLK__SD2_CLK     0x10071
+                       MX6QDL_PAD_SD2_DAT0__SD2_DATA0  0x17071
+                       MX6QDL_PAD_SD2_DAT1__SD2_DATA1  0x17071
+                       MX6QDL_PAD_SD2_DAT2__SD2_DATA2  0x17071
+                       MX6QDL_PAD_SD2_DAT3__SD2_DATA3  0x17071
+               >;
+       };
+
+       pinctrl_usdhc3: usdhc3grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD3_CMD__SD3_CMD     0x17059
+                       MX6QDL_PAD_SD3_CLK__SD3_CLK     0x10059
+                       MX6QDL_PAD_SD3_DAT0__SD3_DATA0  0x17059
+                       MX6QDL_PAD_SD3_DAT1__SD3_DATA1  0x17059
+                       MX6QDL_PAD_SD3_DAT2__SD3_DATA2  0x17059
+                       MX6QDL_PAD_SD3_DAT3__SD3_DATA3  0x17059
+                       MX6QDL_PAD_SD3_DAT4__SD3_DATA4  0x17059
+                       MX6QDL_PAD_SD3_DAT5__SD3_DATA5  0x17059
+                       MX6QDL_PAD_SD3_DAT6__SD3_DATA6  0x17059
+                       MX6QDL_PAD_SD3_DAT7__SD3_DATA7  0x17059
+                       /* eMMC reset */
+                       MX6QDL_PAD_SD3_RST__SD3_RESET   0x17059
+               >;
+       };
+};
diff --git a/arch/arm/dts/imx6-colibri.dts b/arch/arm/dts/imx6-colibri.dts
new file mode 100644 (file)
index 0000000..5c9f1f0
--- /dev/null
@@ -0,0 +1,411 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * Copyright 2019 Toradex AG
+ */
+
+/dts-v1/;
+#include <dt-bindings/gpio/gpio.h>
+#include "imx6dl.dtsi"
+
+/ {
+       model = "Toradex Colibri iMX6DL/S";
+       compatible = "toradex,colibri_imx6dl", "fsl,imx6dl";
+
+       /* Will be filled by the bootloader */
+       memory@10000000 {
+               device_type = "memory";
+               reg = <0x10000000 0>;
+       };
+
+       aliases {
+               mmc0 = &usdhc3;
+               mmc1 = &usdhc1;
+               usb0 = &usbotg; /* required for ums */
+       };
+
+       chosen {
+               stdout-path = &uart1;
+       };
+
+       reg_module_3v3: regulator-module-3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "+V3.3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+       };
+
+       reg_usb_host_vbus: regulator-usb-host-vbus {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_regulator_usbh_pwr>;
+               regulator-name = "usb_host_vbus";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               gpio = <&gpio3 31 GPIO_ACTIVE_LOW>; /* USBH_PEN */
+       };
+};
+
+/*
+ * PWR_I2C: power I2C to audio codec, PMIC, temperature sensor and
+ * touch screen controller
+ */
+&i2c2 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c2>;
+       status = "okay";
+
+       pmic: pfuze100@8 {
+               compatible = "fsl,pfuze100";
+               reg = <0x08>;
+
+               regulators {
+                       sw1a_reg: sw1ab {
+                               regulator-min-microvolt = <300000>;
+                               regulator-max-microvolt = <1875000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <6250>;
+                       };
+
+                       sw1c_reg: sw1c {
+                               regulator-min-microvolt = <300000>;
+                               regulator-max-microvolt = <1875000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <6250>;
+                       };
+
+                       sw3a_reg: sw3a {
+                               regulator-min-microvolt = <400000>;
+                               regulator-max-microvolt = <1975000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       swbst_reg: swbst {
+                               regulator-min-microvolt = <5000000>;
+                               regulator-max-microvolt = <5150000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       snvs_reg: vsnvs {
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <3000000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vref_reg: vrefddr {
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       /* vgen1: unused */
+
+                       vgen2_reg: vgen2 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1550000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       /* vgen3: unused */
+
+                       vgen4_reg: vgen4 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vgen5_reg: vgen5 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vgen6_reg: vgen6 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+               };
+       };
+};
+
+/*
+ * I2C3_SDA/SCL on SODIMM 194/196 (e.g. RTC on carrier board)
+ */
+&i2c3 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default", "gpio";
+       pinctrl-0 = <&pinctrl_i2c3>;
+       pinctrl-1 = <&pinctrl_i2c3_recovery>;
+       scl-gpios = <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+       sda-gpios = <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+       status = "okay";
+};
+
+/* Colibri UART_A */
+&uart1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart1_dte &pinctrl_uart1_ctrl>;
+       fsl,dte-mode;
+       uart-has-rtscts;
+       status = "okay";
+};
+
+/* Colibri UART_B */
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart2_dte>;
+       fsl,dte-mode;
+       uart-has-rtscts;
+       status = "okay";
+};
+
+/* Colibri UART_C */
+&uart3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart3_dte>;
+       fsl,dte-mode;
+       status = "okay";
+};
+
+/* Colibri USBH */
+&usbh1 {
+       dr_mode = "host";
+       vbus-supply = <&reg_usb_host_vbus>;
+       status = "okay";
+};
+
+/* Colibri USBC */
+&usbotg {
+       dr_mode = "host";
+       status = "okay";
+};
+
+/* Colibri MMC */
+&usdhc1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc1 &pinctrl_mmc_cd>;
+       cd-gpios = <&gpio2 5 GPIO_ACTIVE_LOW>; /* MMCD */
+       disable-wp;
+       vqmmc-supply = <&reg_module_3v3>;
+       bus-width = <4>;
+       no-1-8-v;
+       status = "okay";
+};
+
+/* eMMC */
+&usdhc3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       vqmmc-supply = <&reg_module_3v3>;
+       bus-width = <8>;
+       no-1-8-v;
+       non-removable;
+       status = "okay";
+};
+
+&iomuxc {
+       pinctrl_ecspi4: ecspi4grp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_D22__ECSPI4_MISO 0x100b1
+                       MX6QDL_PAD_EIM_D28__ECSPI4_MOSI 0x100b1
+                       MX6QDL_PAD_EIM_D21__ECSPI4_SCLK 0x100b1
+                       /* SPI CS */
+                       MX6QDL_PAD_EIM_A25__GPIO5_IO02  0x000b1
+               >;
+       };
+
+       pinctrl_enet: enetgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_ENET_MDC__ENET_MDC           0x1b0b0
+                       MX6QDL_PAD_ENET_MDIO__ENET_MDIO         0x1b0b0
+                       MX6QDL_PAD_ENET_RXD0__ENET_RX_DATA0     0x1b0b0
+                       MX6QDL_PAD_ENET_RXD1__ENET_RX_DATA1     0x1b0b0
+                       MX6QDL_PAD_ENET_RX_ER__ENET_RX_ER       0x1b0b0
+                       MX6QDL_PAD_ENET_TX_EN__ENET_TX_EN       0x1b0b0
+                       MX6QDL_PAD_ENET_TXD0__ENET_TX_DATA0     0x1b0b0
+                       MX6QDL_PAD_ENET_TXD1__ENET_TX_DATA1     0x1b0b0
+                       MX6QDL_PAD_ENET_CRS_DV__ENET_RX_EN      0x1b0b0
+                       MX6QDL_PAD_GPIO_16__ENET_REF_CLK     ((1<<30) | 0x1b0b0)
+               >;
+       };
+
+       pinctrl_gpio_bl_on: gpioblon {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_D26__GPIO3_IO26  0x1b0b0
+               >;
+       };
+
+       pinctrl_hdmi_ddc: hdmiddcgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_KEY_COL3__HDMI_TX_DDC_SCL    0x4001b8b1
+                       MX6QDL_PAD_KEY_ROW3__HDMI_TX_DDC_SDA    0x4001b8b1
+               >;
+       };
+
+       pinctrl_i2c2: i2c2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_EB2__I2C2_SCL    0x4001b8b1
+                       MX6QDL_PAD_EIM_D16__I2C2_SDA    0x4001b8b1
+               >;
+       };
+
+       pinctrl_i2c3: i2c3grp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_3__I2C3_SCL     0x4001b8b1
+                       MX6QDL_PAD_GPIO_6__I2C3_SDA     0x4001b8b1
+               >;
+       };
+
+       pinctrl_i2c3_recovery: i2c3recoverygrp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_3__GPIO1_IO03   0x4001b8b1
+                       MX6QDL_PAD_GPIO_6__GPIO1_IO06   0x4001b8b1
+               >;
+       };
+
+       pinctrl_ipu1_lcdif: ipu1lcdifgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK      0xa1
+                       MX6QDL_PAD_DI0_PIN15__IPU1_DI0_PIN15            0xa1
+                       MX6QDL_PAD_DI0_PIN2__IPU1_DI0_PIN02             0xa1
+                       MX6QDL_PAD_DI0_PIN3__IPU1_DI0_PIN03             0xa1
+                       MX6QDL_PAD_DISP0_DAT0__IPU1_DISP0_DATA00        0xa1
+                       MX6QDL_PAD_DISP0_DAT1__IPU1_DISP0_DATA01        0xa1
+                       MX6QDL_PAD_DISP0_DAT2__IPU1_DISP0_DATA02        0xa1
+                       MX6QDL_PAD_DISP0_DAT3__IPU1_DISP0_DATA03        0xa1
+                       MX6QDL_PAD_DISP0_DAT4__IPU1_DISP0_DATA04        0xa1
+                       MX6QDL_PAD_DISP0_DAT5__IPU1_DISP0_DATA05        0xa1
+                       MX6QDL_PAD_DISP0_DAT6__IPU1_DISP0_DATA06        0xa1
+                       MX6QDL_PAD_DISP0_DAT7__IPU1_DISP0_DATA07        0xa1
+                       MX6QDL_PAD_DISP0_DAT8__IPU1_DISP0_DATA08        0xa1
+                       MX6QDL_PAD_DISP0_DAT9__IPU1_DISP0_DATA09        0xa1
+                       MX6QDL_PAD_DISP0_DAT10__IPU1_DISP0_DATA10       0xa1
+                       MX6QDL_PAD_DISP0_DAT11__IPU1_DISP0_DATA11       0xa1
+                       MX6QDL_PAD_DISP0_DAT12__IPU1_DISP0_DATA12       0xa1
+                       MX6QDL_PAD_DISP0_DAT13__IPU1_DISP0_DATA13       0xa1
+                       MX6QDL_PAD_DISP0_DAT14__IPU1_DISP0_DATA14       0xa1
+                       MX6QDL_PAD_DISP0_DAT15__IPU1_DISP0_DATA15       0xa1
+                       MX6QDL_PAD_DISP0_DAT16__IPU1_DISP0_DATA16       0xa1
+                       MX6QDL_PAD_DISP0_DAT17__IPU1_DISP0_DATA17       0xa1
+               >;
+       };
+
+       pinctrl_mmc_cd: gpiommccd {
+               fsl,pins = <
+                       MX6QDL_PAD_NANDF_D5__GPIO2_IO05 0x1b0b1
+               >;
+       };
+
+       pinctrl_pwm1: pwm1grp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_9__PWM1_OUT     0x1b0b1
+               >;
+       };
+
+       pinctrl_pwm2: pwm2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_1__PWM2_OUT     0x1b0b1
+                       MX6QDL_PAD_EIM_A21__GPIO2_IO17  0x00040
+               >;
+       };
+
+       pinctrl_pwm3: pwm3grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD4_DAT1__PWM3_OUT   0x1b0b1
+                       MX6QDL_PAD_EIM_A22__GPIO2_IO16  0x00040
+               >;
+       };
+
+       pinctrl_pwm4: pwm4grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD4_DAT2__PWM4_OUT   0x1b0b1
+               >;
+       };
+
+       pinctrl_regulator_usbh_pwr: gpioregusbhpwrgrp {
+               fsl,pins = <
+                       /* SODIMM 129 USBH_PEN */
+                       MX6QDL_PAD_EIM_D31__GPIO3_IO31  0x0f058
+               >;
+       };
+
+       pinctrl_uart1_dce: uart1dcegrp {
+               fsl,pins = <
+                       MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA    0x1b0b1
+                       MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA    0x1b0b1
+               >;
+       };
+
+       /* DTE mode */
+       pinctrl_uart1_dte: uart1dtegrp {
+               fsl,pins = <
+                       MX6QDL_PAD_CSI0_DAT10__UART1_RX_DATA    0x1b0b1
+                       MX6QDL_PAD_CSI0_DAT11__UART1_TX_DATA    0x1b0b1
+                       MX6QDL_PAD_EIM_D19__UART1_RTS_B         0x1b0b1
+                       MX6QDL_PAD_EIM_D20__UART1_CTS_B         0x1b0b1
+               >;
+       };
+
+       /* Additional DTR, DSR, DCD */
+       pinctrl_uart1_ctrl: uart1ctrlgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_D23__UART1_DCD_B 0x1b0b0
+                       MX6QDL_PAD_EIM_D24__UART1_DTR_B 0x1b0b0
+                       MX6QDL_PAD_EIM_D25__UART1_DSR_B 0x1b0b0
+               >;
+       };
+
+       pinctrl_uart2_dte: uart2dtegrp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD4_DAT4__UART2_TX_DATA      0x1b0b1
+                       MX6QDL_PAD_SD4_DAT7__UART2_RX_DATA      0x1b0b1
+                       MX6QDL_PAD_SD4_DAT6__UART2_RTS_B        0x1b0b1
+                       MX6QDL_PAD_SD4_DAT5__UART2_CTS_B        0x1b0b1
+               >;
+       };
+
+       pinctrl_uart3_dte: uart3dtegrp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD4_CLK__UART3_TX_DATA       0x1b0b1
+                       MX6QDL_PAD_SD4_CMD__UART3_RX_DATA       0x1b0b1
+               >;
+       };
+
+       pinctrl_usdhc1: usdhc1grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD1_CMD__SD1_CMD     0x17071
+                       MX6QDL_PAD_SD1_CLK__SD1_CLK     0x10071
+                       MX6QDL_PAD_SD1_DAT0__SD1_DATA0  0x17071
+                       MX6QDL_PAD_SD1_DAT1__SD1_DATA1  0x17071
+                       MX6QDL_PAD_SD1_DAT2__SD1_DATA2  0x17071
+                       MX6QDL_PAD_SD1_DAT3__SD1_DATA3  0x17071
+               >;
+       };
+
+       pinctrl_usdhc3: usdhc3grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD3_CMD__SD3_CMD     0x17059
+                       MX6QDL_PAD_SD3_CLK__SD3_CLK     0x10059
+                       MX6QDL_PAD_SD3_DAT0__SD3_DATA0  0x17059
+                       MX6QDL_PAD_SD3_DAT1__SD3_DATA1  0x17059
+                       MX6QDL_PAD_SD3_DAT2__SD3_DATA2  0x17059
+                       MX6QDL_PAD_SD3_DAT3__SD3_DATA3  0x17059
+                       MX6QDL_PAD_SD3_DAT4__SD3_DATA4  0x17059
+                       MX6QDL_PAD_SD3_DAT5__SD3_DATA5  0x17059
+                       MX6QDL_PAD_SD3_DAT6__SD3_DATA6  0x17059
+                       MX6QDL_PAD_SD3_DAT7__SD3_DATA7  0x17059
+                       /* eMMC reset */
+                       MX6QDL_PAD_SD3_RST__SD3_RESET   0x17059
+               >;
+       };
+};
diff --git a/arch/arm/dts/imx6dl-wandboard-revb1.dts b/arch/arm/dts/imx6dl-wandboard-revb1.dts
new file mode 100644 (file)
index 0000000..738db4f
--- /dev/null
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * Author: Fabio Estevam <fabio.estevam@freescale.com>
+ */
+/dts-v1/;
+#include "imx6dl.dtsi"
+#include "imx6qdl-wandboard-revb1.dtsi"
+
+/ {
+       model = "Wandboard i.MX6 Dual Lite Board rev B1";
+       compatible = "wand,imx6dl-wandboard", "fsl,imx6dl";
+
+       memory@10000000 {
+               reg = <0x10000000 0x40000000>;
+       };
+};
diff --git a/arch/arm/dts/imx6q-bx50v3.dts b/arch/arm/dts/imx6q-bx50v3.dts
new file mode 100644 (file)
index 0000000..deaec63
--- /dev/null
@@ -0,0 +1,89 @@
+/* SPDX-License-Identifier: GPL-2.0+ OR X11 */
+/*
+ * Copyright 2015 Timesys Corporation.
+ * Copyright 2018 General Electric Company
+ * Based on imx6q-ba16.dtsi and imx6q-bx50v3.dtsi from kernel 4.20.5.
+ */
+
+/dts-v1/;
+
+#include "imx6q.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+       model = "General Electric Bx50v3";
+       compatible = "ge,imx6q-bx50v3", "advantech,imx6q-ba16", "fsl,imx6q";
+};
+
+&iomuxc {
+       pinctrl-names = "default";
+
+       pinctrl_ecspi1: ecspi1grp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_D17__ECSPI1_MISO 0x100b1
+                       MX6QDL_PAD_EIM_D18__ECSPI1_MOSI 0x100b1
+                       MX6QDL_PAD_EIM_D16__ECSPI1_SCLK 0x100b1
+                       /* SPI1 CS */
+                       MX6QDL_PAD_EIM_EB2__GPIO2_IO30  0x1b0b0
+               >;
+       };
+
+       pinctrl_usdhc3: usdhc3grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD3_CMD__SD3_CMD     0x17059
+                       MX6QDL_PAD_SD3_CLK__SD3_CLK     0x10059
+                       MX6QDL_PAD_SD3_DAT0__SD3_DATA0  0x17059
+                       MX6QDL_PAD_SD3_DAT1__SD3_DATA1  0x17059
+                       MX6QDL_PAD_SD3_DAT2__SD3_DATA2  0x17059
+                       MX6QDL_PAD_SD3_DAT3__SD3_DATA3  0x17059
+                       MX6QDL_PAD_SD3_DAT4__SD3_DATA4  0x17059
+                       MX6QDL_PAD_SD3_DAT5__SD3_DATA5  0x17059
+                       MX6QDL_PAD_SD3_DAT6__SD3_DATA6  0x17059
+                       MX6QDL_PAD_SD3_DAT7__SD3_DATA7  0x17059
+               >;
+       };
+
+       pinctrl_usdhc3_reset: usdhc3grp-reset {
+               fsl,pins = <
+                       MX6QDL_PAD_SD3_RST__SD3_RESET   0x170F9
+               >;
+       };
+};
+
+&usdhc1 {
+       status = "disabled";
+};
+
+&usdhc2 {
+       status = "disabled";
+};
+
+/* eMMC */
+&usdhc3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3 &pinctrl_usdhc3_reset>;
+       bus-width = <8>;
+       non-removable;
+       keep-power-in-suspend;
+       status = "okay";
+};
+
+&usdhc4 {
+       status = "disabled";
+};
+
+/* SPI NOR */
+&ecspi1 {
+       cs-gpios = <&gpio2 30 GPIO_ACTIVE_LOW>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ecspi1>;
+       status = "okay";
+
+       flash: n25q032@0 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               spi-max-frequency = <20000000>;
+               reg = <0>;
+       };
+};
diff --git a/arch/arm/dts/imx6q-tbs2910.dts b/arch/arm/dts/imx6q-tbs2910.dts
new file mode 100644 (file)
index 0000000..21e62c0
--- /dev/null
@@ -0,0 +1,394 @@
+// SPDX-License-Identifier: GPL-2.0+ OR MIT
+//
+// Copyright 2014-2019 Soeren Moch <smoch@web.de>
+
+/dts-v1/;
+
+#include "imx6q.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+       model = "TBS2910 Matrix ARM mini PC";
+       compatible = "tbs,imx6q-tbs2910", "fsl,imx6q";
+
+       chosen {
+               stdout-path = &uart1;
+       };
+
+       aliases {
+               mmc0 = &usdhc2;
+               mmc1 = &usdhc3;
+               mmc2 = &usdhc4;
+               usb0 = &usbotg;
+       };
+
+       memory@10000000 {
+               reg = <0x10000000 0x80000000>;
+       };
+
+       fan {
+               compatible = "gpio-fan";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_gpio_fan>;
+               gpios = <&gpio3 28 GPIO_ACTIVE_HIGH>;
+               gpio-fan,speed-map = <0    0
+                                     3000 1>;
+       };
+
+       ir_recv {
+               compatible = "gpio-ir-receiver";
+               gpios = <&gpio3 18 GPIO_ACTIVE_LOW>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_ir>;
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_gpio_leds>;
+
+               blue {
+                       label = "blue_status_led";
+                       gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+                       default-state = "keep";
+               };
+       };
+
+       reg_2p5v: regulator-2p5v {
+               compatible = "regulator-fixed";
+               regulator-name = "2P5V";
+               regulator-min-microvolt = <2500000>;
+               regulator-max-microvolt = <2500000>;
+       };
+
+       reg_3p3v: regulator-3p3v {
+               compatible = "regulator-fixed";
+               regulator-name = "3P3V";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+
+       reg_5p0v: regulator-5p0v {
+               compatible = "regulator-fixed";
+               regulator-name = "5P0V";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+       };
+
+       sound-sgtl5000 {
+               audio-codec = <&sgtl5000>;
+               audio-routing =
+                       "MIC_IN", "Mic Jack",
+                       "Mic Jack", "Mic Bias",
+                       "Headphone Jack", "HP_OUT";
+               compatible = "fsl,imx-audio-sgtl5000";
+               model = "On-board Codec";
+               mux-ext-port = <3>;
+               mux-int-port = <1>;
+               ssi-controller = <&ssi1>;
+       };
+
+       sound-spdif {
+               compatible = "fsl,imx-audio-spdif";
+               model = "On-board SPDIF";
+               spdif-controller = <&spdif>;
+               spdif-out;
+       };
+};
+
+&audmux {
+       status = "okay";
+};
+
+&fec {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_enet>;
+       phy-mode = "rgmii";
+       phy-reset-gpios = <&gpio1 25 GPIO_ACTIVE_LOW>;
+       status = "okay";
+};
+
+&hdmi {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_hdmi>;
+       ddc-i2c-bus = <&i2c2>;
+       status = "okay";
+};
+
+&i2c1 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c1>;
+       status = "okay";
+
+       sgtl5000: sgtl5000@a {
+               clocks = <&clks IMX6QDL_CLK_CKO>;
+               compatible = "fsl,sgtl5000";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_sgtl5000>;
+               reg = <0x0a>;
+               VDDA-supply = <&reg_2p5v>;
+               VDDIO-supply = <&reg_3p3v>;
+       };
+};
+
+&i2c2 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c2>;
+       status = "okay";
+};
+
+&i2c3 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c3>;
+       status = "okay";
+
+       rtc: ds1307@68 {
+               compatible = "dallas,ds1307";
+               reg = <0x68>;
+       };
+};
+
+&pcie {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_pcie>;
+       reset-gpio = <&gpio7 12 GPIO_ACTIVE_LOW>;
+       status = "okay";
+};
+
+&sata {
+       fsl,transmit-level-mV = <1104>;
+       fsl,transmit-boost-mdB = <3330>;
+       fsl,transmit-atten-16ths = <16>;
+       fsl,receive-eq-mdB = <3000>;
+       status = "okay";
+};
+
+&snvs_poweroff {
+       status = "okay";
+};
+
+&spdif {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_spdif>;
+       status = "okay";
+};
+
+&ssi1 {
+       status = "okay";
+};
+
+&uart1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart1>;
+       status = "okay";
+};
+
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart2>;
+       status = "okay";
+};
+
+&usbh1 {
+       vbus-supply = <&reg_5p0v>;
+       status = "okay";
+};
+
+&usbotg {
+       vbus-supply = <&reg_5p0v>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usbotg>;
+       disable-over-current;
+       status = "okay";
+};
+
+&usdhc2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       bus-width = <4>;
+       cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&reg_3p3v>;
+       vqmmc-supply = <&reg_3p3v>;
+       voltage-ranges = <3300 3300>;
+       no-1-8-v;
+       status = "okay";
+};
+
+&usdhc3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       bus-width = <4>;
+       cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
+       wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
+       vmmc-supply = <&reg_3p3v>;
+       vqmmc-supply = <&reg_3p3v>;
+       voltage-ranges = <3300 3300>;
+       no-1-8-v;
+       status = "okay";
+};
+
+&usdhc4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc4>;
+       bus-width = <8>;
+       vmmc-supply = <&reg_3p3v>;
+       vqmmc-supply = <&reg_3p3v>;
+       voltage-ranges = <3300 3300>;
+       non-removable;
+       no-1-8-v;
+       status = "okay";
+};
+
+&iomuxc {
+       pinctrl_enet: enetgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_ENET_MDIO__ENET_MDIO       0x1b0b0
+                       MX6QDL_PAD_ENET_MDC__ENET_MDC         0x1b0b0
+                       MX6QDL_PAD_RGMII_TXC__RGMII_TXC       0x1b030
+                       MX6QDL_PAD_RGMII_TD0__RGMII_TD0       0x1b030
+                       MX6QDL_PAD_RGMII_TD1__RGMII_TD1       0x1b030
+                       MX6QDL_PAD_RGMII_TD2__RGMII_TD2       0x1b030
+                       MX6QDL_PAD_RGMII_TD3__RGMII_TD3       0x1b030
+                       MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b030
+                       MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK  0x1b0b0
+                       MX6QDL_PAD_RGMII_RXC__RGMII_RXC       0x1b030
+                       MX6QDL_PAD_RGMII_RD0__RGMII_RD0       0x1b030
+                       MX6QDL_PAD_RGMII_RD1__RGMII_RD1       0x1b030
+                       MX6QDL_PAD_RGMII_RD2__RGMII_RD2       0x1b030
+                       MX6QDL_PAD_RGMII_RD3__RGMII_RD3       0x1b030
+                       MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b030
+                       MX6QDL_PAD_GPIO_16__ENET_REF_CLK      0x4001b0a8
+                       MX6QDL_PAD_ENET_CRS_DV__GPIO1_IO25    0x1b059
+               >;
+       };
+
+       pinctrl_gpio_fan: gpiofangrp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_D28__GPIO3_IO28        0x130b1
+               >;
+       };
+
+       pinctrl_gpio_leds: gpioledsgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_2__GPIO1_IO02         0x130b1
+               >;
+       };
+
+       pinctrl_hdmi: hdmigrp {
+               fsl,pins = <
+                       MX6QDL_PAD_KEY_ROW2__HDMI_TX_CEC_LINE 0x1f8b0
+               >;
+       };
+
+       pinctrl_i2c1: i2c1grp {
+               fsl,pins = <
+                       MX6QDL_PAD_CSI0_DAT9__I2C1_SCL        0x4001b8b1
+                       MX6QDL_PAD_CSI0_DAT8__I2C1_SDA        0x4001b8b1
+               >;
+       };
+
+       pinctrl_i2c2: i2c2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_KEY_COL3__I2C2_SCL         0x4001b8b1
+                       MX6QDL_PAD_KEY_ROW3__I2C2_SDA         0x4001b8b1
+               >;
+       };
+
+       pinctrl_i2c3: i2c3grp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_3__I2C3_SCL           0x4001b8b1
+                       MX6QDL_PAD_GPIO_6__I2C3_SDA           0x4001b8b1
+               >;
+       };
+
+       pinctrl_ir: irgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_D18__GPIO3_IO18        0x17059
+               >;
+       };
+
+       pinctrl_pcie: pciegrp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_17__GPIO7_IO12        0x17059
+               >;
+       };
+
+       pinctrl_sgtl5000: sgtl5000grp {
+               fsl,pins = <
+                       MX6QDL_PAD_CSI0_DAT7__AUD3_RXD        0x130b0
+                       MX6QDL_PAD_CSI0_DAT4__AUD3_TXC        0x130b0
+                       MX6QDL_PAD_CSI0_DAT5__AUD3_TXD        0x110b0
+                       MX6QDL_PAD_CSI0_DAT6__AUD3_TXFS       0x130b0
+                       MX6QDL_PAD_GPIO_0__CCM_CLKO1          0x130b0
+               >;
+       };
+
+       pinctrl_spdif: spdifgrp {
+               fsl,pins = <MX6QDL_PAD_GPIO_19__SPDIF_OUT     0x13091
+               >;
+       };
+
+       pinctrl_uart1: uart1grp {
+               fsl,pins = <
+                       MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA  0x1b0b1
+                       MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA  0x1b0b1
+               >;
+       };
+
+       pinctrl_uart2: uart2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_D26__UART2_TX_DATA     0x1b0b1
+                       MX6QDL_PAD_EIM_D27__UART2_RX_DATA     0x1b0b1
+               >;
+       };
+
+       pinctrl_usbotg: usbotggrp {
+               fsl,pins = <
+                       MX6QDL_PAD_ENET_RX_ER__USB_OTG_ID     0x17059
+               >;
+       };
+
+       pinctrl_usdhc2: usdhc2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD2_CMD__SD2_CMD           0x17059
+                       MX6QDL_PAD_SD2_CLK__SD2_CLK           0x10059
+                       MX6QDL_PAD_SD2_DAT0__SD2_DATA0        0x17059
+                       MX6QDL_PAD_SD2_DAT1__SD2_DATA1        0x17059
+                       MX6QDL_PAD_SD2_DAT2__SD2_DATA2        0x17059
+                       MX6QDL_PAD_SD2_DAT3__SD2_DATA3        0x17059
+                       MX6QDL_PAD_NANDF_D2__GPIO2_IO02       0x17059
+               >;
+       };
+
+       pinctrl_usdhc3: usdhc3grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD3_CMD__SD3_CMD           0x17059
+                       MX6QDL_PAD_SD3_CLK__SD3_CLK           0x10059
+                       MX6QDL_PAD_SD3_DAT0__SD3_DATA0        0x17059
+                       MX6QDL_PAD_SD3_DAT1__SD3_DATA1        0x17059
+                       MX6QDL_PAD_SD3_DAT2__SD3_DATA2        0x17059
+                       MX6QDL_PAD_SD3_DAT3__SD3_DATA3        0x17059
+                       MX6QDL_PAD_NANDF_D0__GPIO2_IO00       0x17059
+                       MX6QDL_PAD_NANDF_D1__GPIO2_IO01       0x17059
+               >;
+       };
+
+       pinctrl_usdhc4: usdhc4grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD4_CMD__SD4_CMD           0x17059
+                       MX6QDL_PAD_SD4_CLK__SD4_CLK           0x10059
+                       MX6QDL_PAD_SD4_DAT0__SD4_DATA0        0x17059
+                       MX6QDL_PAD_SD4_DAT1__SD4_DATA1        0x17059
+                       MX6QDL_PAD_SD4_DAT2__SD4_DATA2        0x17059
+                       MX6QDL_PAD_SD4_DAT3__SD4_DATA3        0x17059
+                       MX6QDL_PAD_SD4_DAT4__SD4_DATA4        0x17059
+                       MX6QDL_PAD_SD4_DAT5__SD4_DATA5        0x17059
+                       MX6QDL_PAD_SD4_DAT6__SD4_DATA6        0x17059
+                       MX6QDL_PAD_SD4_DAT7__SD4_DATA7        0x17059
+               >;
+       };
+};
diff --git a/arch/arm/dts/imx6qdl-wandboard-revb1.dtsi b/arch/arm/dts/imx6qdl-wandboard-revb1.dtsi
new file mode 100644 (file)
index 0000000..855dc6f
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * Author: Fabio Estevam <fabio.estevam@freescale.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.
+ *
+ */
+
+#include "imx6qdl-wandboard.dtsi"
+
+&iomuxc {
+       pinctrl-0 = <&pinctrl_hog>;
+
+       imx6qdl-wandboard {
+               pinctrl_hog: hoggrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_2__GPIO1_IO02           0x80000000      /* uSDHC1 CD */
+                               MX6QDL_PAD_EIM_DA9__GPIO3_IO09          0x80000000      /* uSDHC3 CD */
+                               MX6QDL_PAD_EIM_EB1__GPIO2_IO29          0x0f0b0         /* WL_REF_ON */
+                               MX6QDL_PAD_EIM_A25__GPIO5_IO02          0x0f0b0         /* WL_RST_N */
+                               MX6QDL_PAD_ENET_RXD1__GPIO1_IO26        0x000b0         /* WL_REG_ON */
+                               MX6QDL_PAD_ENET_TXD1__GPIO1_IO29        0x80000000      /* WL_HOST_WAKE */
+                               MX6QDL_PAD_ENET_TXD0__GPIO1_IO30        0x80000000      /* WL_WAKE */
+                               MX6QDL_PAD_EIM_D29__GPIO3_IO29          0x80000000      /* RGMII_nRST */
+                               MX6QDL_PAD_EIM_DA13__GPIO3_IO13         0x80000000      /* BT_ON */
+                               MX6QDL_PAD_EIM_DA14__GPIO3_IO14         0x80000000      /* BT_WAKE */
+                               MX6QDL_PAD_EIM_DA15__GPIO3_IO15         0x80000000      /* BT_HOST_WAKE */
+                       >;
+               };
+       };
+};
+
+&usdhc2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       non-removable;
+       status = "okay";
+};
diff --git a/arch/arm/dts/imx6qdl-wandboard.dtsi b/arch/arm/dts/imx6qdl-wandboard.dtsi
new file mode 100644 (file)
index 0000000..4d03d49
--- /dev/null
@@ -0,0 +1,380 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * Author: Fabio Estevam <fabio.estevam@freescale.com>
+ */
+
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+       sound {
+               compatible = "fsl,imx6-wandboard-sgtl5000",
+                            "fsl,imx-audio-sgtl5000";
+               model = "imx6-wandboard-sgtl5000";
+               ssi-controller = <&ssi1>;
+               audio-codec = <&codec>;
+               audio-routing =
+                       "MIC_IN", "Mic Jack",
+                       "Mic Jack", "Mic Bias",
+                       "Headphone Jack", "HP_OUT";
+               mux-int-port = <1>;
+               mux-ext-port = <3>;
+       };
+
+       sound-spdif {
+               compatible = "fsl,imx-audio-spdif";
+               model = "imx-spdif";
+               spdif-controller = <&spdif>;
+               spdif-out;
+       };
+
+       reg_2p5v: regulator-2p5v {
+               compatible = "regulator-fixed";
+               regulator-name = "2P5V";
+               regulator-min-microvolt = <2500000>;
+               regulator-max-microvolt = <2500000>;
+               regulator-always-on;
+       };
+
+       reg_3p3v: regulator-3p3v {
+               compatible = "regulator-fixed";
+               regulator-name = "3P3V";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+       };
+
+       reg_usb_otg_vbus: regulator-usbotgvbus {
+               compatible = "regulator-fixed";
+               regulator-name = "usb_otg_vbus";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_usbotgvbus>;
+               gpio = <&gpio3 22 GPIO_ACTIVE_LOW>;
+       };
+};
+
+&audmux {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_audmux>;
+       status = "okay";
+};
+
+&hdmi {
+       ddc-i2c-bus = <&i2c1>;
+       status = "okay";
+};
+
+&i2c1 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c1>;
+       status = "okay";
+};
+
+&i2c2 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c2>;
+       status = "okay";
+
+       codec: sgtl5000@a {
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_mclk>;
+               compatible = "fsl,sgtl5000";
+               reg = <0x0a>;
+               clocks = <&clks IMX6QDL_CLK_CKO>;
+               VDDA-supply = <&reg_2p5v>;
+               VDDIO-supply = <&reg_3p3v>;
+               lrclk-strength = <3>;
+       };
+
+       pmic: pfuze100@8 {
+               compatible = "fsl,pfuze100";
+               reg = <0x08>;
+
+               regulators {
+                       sw1a_reg: sw1ab {
+                               regulator-min-microvolt = <300000>;
+                               regulator-max-microvolt = <1875000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <6250>;
+                       };
+
+                       sw1c_reg: sw1c {
+                               regulator-min-microvolt = <300000>;
+                               regulator-max-microvolt = <1875000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <6250>;
+                       };
+
+                       sw2_reg: sw2 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <6250>;
+                       };
+
+                       sw3a_reg: sw3a {
+                               regulator-min-microvolt = <400000>;
+                               regulator-max-microvolt = <1975000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       sw3b_reg: sw3b {
+                               regulator-min-microvolt = <400000>;
+                               regulator-max-microvolt = <1975000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       sw4_reg: sw4 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       swbst_reg: swbst {
+                               regulator-min-microvolt = <5000000>;
+                               regulator-max-microvolt = <5150000>;
+                       };
+
+                       snvs_reg: vsnvs {
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <3000000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vref_reg: vrefddr {
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vgen1_reg: vgen1 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1550000>;
+                       };
+
+                       vgen2_reg: vgen2 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1550000>;
+                       };
+
+                       vgen3_reg: vgen3 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                       };
+
+                       vgen4_reg: vgen4 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vgen5_reg: vgen5 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vgen6_reg: vgen6 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+               };
+       };
+};
+
+&iomuxc {
+       pinctrl-names = "default";
+
+       imx6qdl-wandboard {
+
+               pinctrl_audmux: audmuxgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_CSI0_DAT7__AUD3_RXD          0x130b0
+                               MX6QDL_PAD_CSI0_DAT4__AUD3_TXC          0x130b0
+                               MX6QDL_PAD_CSI0_DAT5__AUD3_TXD          0x110b0
+                               MX6QDL_PAD_CSI0_DAT6__AUD3_TXFS         0x130b0
+                       >;
+               };
+
+               pinctrl_enet: enetgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_ENET_MDIO__ENET_MDIO         0x1b0b0
+                               MX6QDL_PAD_ENET_MDC__ENET_MDC           0x1b0b0
+                               MX6QDL_PAD_RGMII_TXC__RGMII_TXC         0x1b030
+                               MX6QDL_PAD_RGMII_TD0__RGMII_TD0         0x1b030
+                               MX6QDL_PAD_RGMII_TD1__RGMII_TD1         0x1b030
+                               MX6QDL_PAD_RGMII_TD2__RGMII_TD2         0x1b030
+                               MX6QDL_PAD_RGMII_TD3__RGMII_TD3         0x1b030
+                               MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL   0x1b030
+                               MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK    0x1b0b0
+                               MX6QDL_PAD_RGMII_RXC__RGMII_RXC         0x1b030
+                               MX6QDL_PAD_RGMII_RD0__RGMII_RD0         0x1b030
+                               MX6QDL_PAD_RGMII_RD1__RGMII_RD1         0x1b030
+                               MX6QDL_PAD_RGMII_RD2__RGMII_RD2         0x1b030
+                               MX6QDL_PAD_RGMII_RD3__RGMII_RD3         0x1b030
+                               MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL   0x1b030
+                               MX6QDL_PAD_GPIO_16__ENET_REF_CLK        0x4001b0a8
+                               MX6QDL_PAD_GPIO_6__ENET_IRQ             0x000b1
+                       >;
+               };
+
+               pinctrl_i2c1: i2c1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D21__I2C1_SCL            0x4001b8b1
+                               MX6QDL_PAD_EIM_D28__I2C1_SDA            0x4001b8b1
+                       >;
+               };
+
+               pinctrl_i2c2: i2c2grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_KEY_COL3__I2C2_SCL           0x4001b8b1
+                               MX6QDL_PAD_KEY_ROW3__I2C2_SDA           0x4001b8b1
+                       >;
+               };
+
+               pinctrl_mclk: mclkgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_0__CCM_CLKO1            0x130b0
+                       >;
+               };
+
+               pinctrl_spdif: spdifgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_ENET_RXD0__SPDIF_OUT         0x1b0b0
+                       >;
+               };
+
+               pinctrl_uart1: uart1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA    0x1b0b1
+                               MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA    0x1b0b1
+                       >;
+               };
+
+               pinctrl_uart3: uart3grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D24__UART3_TX_DATA       0x1b0b1
+                               MX6QDL_PAD_EIM_D25__UART3_RX_DATA       0x1b0b1
+                               MX6QDL_PAD_EIM_D23__UART3_CTS_B         0x1b0b1
+                               MX6QDL_PAD_EIM_EB3__UART3_RTS_B         0x1b0b1
+                       >;
+               };
+
+               pinctrl_usbotg: usbotggrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_1__USB_OTG_ID           0x17059
+                       >;
+               };
+
+               pinctrl_usbotgvbus: usbotgvbusgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D22__GPIO3_IO22          0x130b0
+                       >;
+               };
+
+               pinctrl_usdhc1: usdhc1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD1_CMD__SD1_CMD             0x17059
+                               MX6QDL_PAD_SD1_CLK__SD1_CLK             0x10059
+                               MX6QDL_PAD_SD1_DAT0__SD1_DATA0          0x17059
+                               MX6QDL_PAD_SD1_DAT1__SD1_DATA1          0x17059
+                               MX6QDL_PAD_SD1_DAT2__SD1_DATA2          0x17059
+                               MX6QDL_PAD_SD1_DAT3__SD1_DATA3          0x17059
+                       >;
+               };
+
+               pinctrl_usdhc2: usdhc2grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD2_CMD__SD2_CMD             0x17059
+                               MX6QDL_PAD_SD2_CLK__SD2_CLK             0x10059
+                               MX6QDL_PAD_SD2_DAT0__SD2_DATA0          0x17059
+                               MX6QDL_PAD_SD2_DAT1__SD2_DATA1          0x17059
+                               MX6QDL_PAD_SD2_DAT2__SD2_DATA2          0x17059
+                               MX6QDL_PAD_SD2_DAT3__SD2_DATA3          0x17059
+                       >;
+               };
+
+               pinctrl_usdhc3: usdhc3grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD3_CMD__SD3_CMD             0x17059
+                               MX6QDL_PAD_SD3_CLK__SD3_CLK             0x10059
+                               MX6QDL_PAD_SD3_DAT0__SD3_DATA0          0x17059
+                               MX6QDL_PAD_SD3_DAT1__SD3_DATA1          0x17059
+                               MX6QDL_PAD_SD3_DAT2__SD3_DATA2          0x17059
+                               MX6QDL_PAD_SD3_DAT3__SD3_DATA3          0x17059
+                       >;
+               };
+       };
+};
+
+&fec {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_enet>;
+       phy-mode = "rgmii";
+       phy-reset-gpios = <&gpio3 29 GPIO_ACTIVE_LOW>;
+       interrupts-extended = <&gpio1 6 IRQ_TYPE_LEVEL_HIGH>,
+                             <&intc 0 119 IRQ_TYPE_LEVEL_HIGH>;
+       fsl,err006687-workaround-present;
+       status = "okay";
+};
+
+&spdif {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_spdif>;
+       status = "okay";
+};
+
+&ssi1 {
+       status = "okay";
+};
+
+&uart1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart1>;
+       status = "okay";
+};
+
+&uart3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart3>;
+       uart-has-rtscts;
+       status = "okay";
+};
+
+&usbh1 {
+       status = "okay";
+};
+
+&usbotg {
+       vbus-supply = <&reg_usb_otg_vbus>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usbotg>;
+       disable-over-current;
+       dr_mode = "otg";
+       status = "okay";
+};
+
+&usdhc1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc1>;
+       cd-gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
+       status = "okay";
+};
+
+&usdhc3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       cd-gpios = <&gpio3 9 GPIO_ACTIVE_LOW>;
+       status = "okay";
+};
index e4daf150881a9e2c9f5d5283e470edd8c586b13a..c0a94780087382a6e2805b7d6572f3e5e294e302 100644 (file)
                compatible = "simple-bus";
                interrupt-parent = <&gpc>;
                ranges;
+               u-boot,dm-pre-reloc;
 
                dma_apbh: dma-apbh@110000 {
                        compatible = "fsl,imx6q-dma-apbh", "fsl,imx28-dma-apbh";
                                 <&clks IMX6QDL_CLK_IPU1_DI1>;
                        clock-names = "bus", "di0", "di1";
                        resets = <&src 2>;
+                       u-boot,dm-pre-reloc;
 
                        ipu1_csi0: port@0 {
                                reg = <0>;
index f5c68d707c376ba037c1f4ea8cc49b1508e22ef9..549461df71e4e083bb00df5186cafa61244f14f2 100644 (file)
@@ -7,10 +7,10 @@
        num-cs = <2>;
 
        flash0: n25q256a@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
        };
 
        flash1: n25q256a@1 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
        };
 };
index 8e592cded9fbdc0237758f5dda57a9755aef3736..8f9236da0f3b4f186b05a4f4af09c18ceb235355 100644 (file)
@@ -7,10 +7,10 @@
        num-cs = <2>;
 
        flash0: n25q256a@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
        };
 
        flash1: n25q256a@1 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
        };
 };
index db640d6e67420def7f3722e56ea1b8a25a06b408..77cb461a2157f7c21cacbbe990183e7199eccd3a 100644 (file)
@@ -5,6 +5,6 @@
 
 &qspi {
        flash0: n25q256a@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
        };
 };
\ No newline at end of file
index db640d6e67420def7f3722e56ea1b8a25a06b408..77cb461a2157f7c21cacbbe990183e7199eccd3a 100644 (file)
@@ -5,6 +5,6 @@
 
 &qspi {
        flash0: n25q256a@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
        };
 };
\ No newline at end of file
index 8a1b67d6bbf441b9b154a525d849477e4f1f7c3e..9ebcfe1f4ea1b6c9e7bb237a4a573b09fb51bf9b 100644 (file)
                #address-cells = <1>;
                #size-cells = <1>;
                /* compatible = "micron,n25q256a"; */
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <29000000>;
                spi-nor,ddr-quad-read-dummy = <6>;
                reg = <0>;
index 2ce6961096f4694644a79eda2caee0c045fc3cf5..585af6d211fe7bb477e77b397c818c323cc99f65 100644 (file)
@@ -5,6 +5,6 @@
 
 &qspi1 {
        flash0: mx25l51245g@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
        };
 };
index 8d7b47f9dfbf4e43f15b821c92649b594788103a..1f591ef8bb9e0e9a95a43e1380dd21c1e6f6e217 100644 (file)
@@ -7,7 +7,7 @@
 
 &cbass_wakeup {
        dmsc: dmsc {
-               compatible = "ti,k2g-sci";
+               compatible = "ti,am654-sci";
                ti,host-id = <12>;
                #address-cells = <1>;
                #size-cells = <1>;
index 143eb6d63092bb9c7e1f2a3dde85b0d165abe543..c5d23d0203abc755eea97b7b90405033ec9ce339 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 #include <dt-bindings/pinctrl/k3-am65.h>
+#include <dt-bindings/dma/k3-udma.h>
 
 / {
        chosen {
                pinctrl-single,register-width = <32>;
                pinctrl-single,function-mask = <0xffffffff>;
        };
+
+       navss_mcu: navss-mcu {
+               compatible = "simple-bus";
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges;
+
+               ti,sci-dev-id = <119>;
+
+               mcu_ringacc: ringacc@2b800000 {
+                       compatible = "ti,am654-navss-ringacc";
+                       reg =   <0x0 0x2b800000 0x0 0x400000>,
+                               <0x0 0x2b000000 0x0 0x400000>,
+                               <0x0 0x28590000 0x0 0x100>,
+                               <0x0 0x2a500000 0x0 0x40000>;
+                       reg-names = "rt", "fifos",
+                                   "proxy_gcfg", "proxy_target";
+                       ti,num-rings = <286>;
+                       ti,sci-rm-range-gp-rings = <0x2>; /* GP ring range */
+                       ti,dma-ring-reset-quirk;
+                       ti,sci = <&dmsc>;
+                       ti,sci-dev-id = <195>;
+               };
+
+               mcu_udmap: udmap@285c0000 {
+                       compatible = "ti,k3-navss-udmap";
+                       reg =   <0x0 0x285c0000 0x0 0x100>,
+                               <0x0 0x2a800000 0x0 0x40000>,
+                               <0x0 0x2aa00000 0x0 0x40000>;
+                       reg-names = "gcfg", "rchanrt", "tchanrt";
+                       #dma-cells = <3>;
+
+                       ti,ringacc = <&mcu_ringacc>;
+                       ti,psil-base = <0x6000>;
+
+                       ti,sci = <&dmsc>;
+                       ti,sci-dev-id = <194>;
+
+                       ti,sci-rm-range-tchan = <0x1>, /* TX_HCHAN */
+                                               <0x2>; /* TX_CHAN */
+                       ti,sci-rm-range-rchan = <0x3>, /* RX_HCHAN */
+                                               <0x4>; /* RX_CHAN */
+                       ti,sci-rm-range-rflow = <0x5>; /* GP RFLOW */
+                       dma-coherent;
+               };
+       };
 };
 
 &cbass_wakeup {
index 3be8b532525cdb5ef65359c6ea0a53482e9ab4f1..9288df21ce1f386443e5347382a58d7917f8ea7d 100644 (file)
        nor_flash: n25q128a11@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "Micron,n25q128a11", "spi-flash";
+               compatible = "Micron,n25q128a11", "jedec,spi-nor";
                spi-max-frequency = <54000000>;
                m25p,fast-read;
                reg = <0>;
index 6c9de25b9447499e1060ba5b90e941e30fd3f52f..7c5deef8083f399a2ab80cb1ca35270af8052bd9 100644 (file)
@@ -29,7 +29,6 @@
        status = "okay";
        ethphy0: ethernet-phy@0 {
                reg = <0>;
-               phy-mode = "rgmii-id";
        };
 };
 
@@ -75,7 +74,7 @@
        spi_nor: flash@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <50000000>;
                m25p,fast-read;
                reg = <0>;
@@ -97,7 +96,7 @@
        status = "okay";
 
        flash0: m25p80@0 {
-               compatible = "s25fl512s","spi-flash";
+               compatible = "s25fl512s","jedec,spi-nor";
                reg = <0>;
                spi-tx-bus-width = <1>;
                spi-rx-bus-width = <4>;
index 698338b93d27b343fe5efd2a6661eb6e05a958e5..ecca2dfac1ad4d4d85f6afa10bc5d9b82c0f4e4c 100644 (file)
@@ -7,6 +7,7 @@
 /dts-v1/;
 
 #include "keystone-k2g.dtsi"
+#include <dt-bindings/net/ti-dp83867.h>
 
 / {
        compatible = "ti,k2g-ice", "ti,k2g", "ti,keystone";
@@ -38,7 +39,7 @@
        status = "okay";
 
        flash0: m25p80@0 {
-               compatible = "s25fl256s1", "spi-flash";
+               compatible = "s25fl256s1", "jedec,spi-nor";
                reg = <0>;
                spi-tx-bus-width = <1>;
                spi-rx-bus-width = <4>;
                };
        };
 };
+
+&qmss {
+       status = "okay";
+};
+
+&knav_dmas {
+       status = "okay";
+};
+
+&netcp {
+       pinctrl-names = "default";
+       //pinctrl-0 = <&emac_pins>;
+       status = "okay";
+};
+
+&mdio {
+       pinctrl-names = "default";
+       //pinctrl-0 = <&mdio_pins>;
+       status = "okay";
+       ethphy0: ethernet-phy@0 {
+               reg = <0>;
+               ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_25_NS>;
+               ti,tx-internal-delay = <DP83867_RGMIIDCTL_250_PS>;
+               ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_8_B_NIB>;
+               ti,min-output-impedance;
+               ti,dp83867-rxctrl-strap-quirk;
+       };
+};
+
+&gbe0 {
+       phy-handle = <&ethphy0>;
+       phy-mode = "rgmii-id";
+       status = "okay";
+};
index 76a675f1e4600feecc9c426c88241f0ca90a60c3..84c58d75ada9842ad701c390897597f894483f7b 100644 (file)
        nor_flash: n25q128a11@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "Micron,n25q128a11", "spi-flash";
+               compatible = "Micron,n25q128a11", "jedec,spi-nor";
                spi-max-frequency = <54000000>;
                m25p,fast-read;
                reg = <0>;
index b5c56176bf6046ab80e214fd42e94ac263c8d42e..91cefdf2aa9d54f6747cfb265d526296de84fa00 100644 (file)
        nor_flash: n25q128a11@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "Micron,n25q128a11", "spi-flash";
+               compatible = "Micron,n25q128a11", "jedec,spi-nor";
                spi-max-frequency = <54000000>;
                m25p,fast-read;
                reg = <0>;
index e5b1efa1415a85de6519b7b2aff97018f6659317..4ae74f4316e58b52019cb00a2d395863658962c9 100644 (file)
@@ -78,7 +78,7 @@
        flash@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "st,m25p128", "jedec,spi-nor", "spi-flash";
+               compatible = "st,m25p128", "jedec,spi-nor";
                reg = <0>;
                spi-max-frequency = <50000000>;
                mode = <0>;
index c234449936232b713ea0f50bd2ca5f31b18c5aee..6e3418f24611b4d86ab5ecce2c108aa63ef200ef 100644 (file)
@@ -92,7 +92,7 @@
        flash@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "st,m25p128", "jedec,spi-nor", "spi-flash";
+               compatible = "st,m25p128", "jedec,spi-nor";
                reg = <0>;
                spi-max-frequency = <50000000>;
                mode = <0>;
index ccd74dd7fb33cb65a6e4402a952cc883c8b4a245..e9eea22fc93ba8ffce7a8d595e8d264345496f76 100644 (file)
@@ -47,7 +47,7 @@
                        m25p40@0 {
                                #address-cells = <1>;
                                #size-cells = <1>;
-                               compatible = "mxicy,mx25l1606e", "jedec,spi-nor", "spi-flash";
+                               compatible = "mxicy,mx25l1606e", "jedec,spi-nor";
                                reg = <0>;
                                spi-max-frequency = <50000000>;
                                mode = <0>;
index 479a750d1d816104f006acba2b099b1d1dd1118e..c99c0da0937b5725a3c5ad5a0183539b8ebb88d2 100644 (file)
@@ -79,7 +79,7 @@
                        m25p40@0 {
                                #address-cells = <1>;
                                #size-cells = <1>;
-                               compatible = "m25p40", "jedec,spi-nor", "spi-flash";
+                               compatible = "m25p40", "jedec,spi-nor";
                                reg = <0>;
                                spi-max-frequency = <25000000>;
                                mode = <0>;
index 135ac8021c8c339a4183e9228997af6a0c90c30b..b5737026e244dafe25bef6692381c2980b8666d5 100644 (file)
@@ -32,7 +32,7 @@
                        flash@0 {
                                #address-cells = <1>;
                                #size-cells = <1>;
-                               compatible = "mxicy,mx25l4005a", "jedec,spi-nor", "spi-flash";
+                               compatible = "mxicy,mx25l4005a", "jedec,spi-nor";
                                reg = <0>;
                                spi-max-frequency = <20000000>;
                                mode = <0>;
index f997bb4df202b6f922e6f57d02cfebbd0c03108c..51530ea86622af05fc09eaa993e52c6dd9918aad 100644 (file)
@@ -30,7 +30,7 @@
                        flash@0 {
                                #address-cells = <1>;
                                #size-cells = <1>;
-                               compatible = "mxicy,mx25l4005a", "jedec,spi-nor", "spi-flash";
+                               compatible = "mxicy,mx25l4005a", "jedec,spi-nor";
                                reg = <0>;
                                spi-max-frequency = <20000000>;
                                mode = <0>;
index b80d8ee37093a4447afd88d7bfeac92eba6f0fbf..c97ed29a0a0bf3cb2aa01e37e15ca99d72c3301f 100644 (file)
                        m25p80@0 {
                                #address-cells = <1>;
                                #size-cells = <1>;
-                               compatible = "st,m25p80", "jedec,spi-nor", "spi-flash";
+                               compatible = "st,m25p80", "jedec,spi-nor";
                                reg = <0>;
                                spi-max-frequency = <20000000>;
                                mode = <0>;
index d27b6014207421171af10c4583dbfbe4a6d81c3c..44dd9b61d3f4c06aeffcd24bea0bda245f081e24 100644 (file)
@@ -27,7 +27,7 @@
        qflash0: n25q128a13@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <20000000>;
                reg = <0>;
        };
@@ -40,7 +40,7 @@
        dspiflash: at26df081a@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <16000000>;
                spi-cpol;
                spi-cpha;
index f7783e51653ba76ea888e9c2d6519b7e0b1c2b34..b12102abfa388b5c79dcfaa9432cdd7377b40f24 100644 (file)
@@ -43,7 +43,7 @@
        qflash0: s25fl128s@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <20000000>;
                reg = <0>;
        };
index 928e1002585c637dd1c51ef12514c89b84fb8f55..5d3275ced913e1b49b4ae2b23c89c25bdcb414bc 100644 (file)
@@ -30,7 +30,7 @@
        qflash0: n25q128a13@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <20000000>;
                reg = <0>;
        };
@@ -43,7 +43,7 @@
        dspiflash: at26df081a@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <16000000>;
                spi-cpol;
                spi-cpha;
index 95d10aa6d324fa37266f5e8c562d6ca2cd37e1ae..4612218a1ebf2b9ba236d1d04eae09badf1bdac8 100644 (file)
@@ -62,7 +62,7 @@
        status = "okay";
 
        spi-flash@0{
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                reg = <0>;
                u-boot,dm-pre-reloc;
        };
diff --git a/arch/arm/dts/mt8516-u-boot.dtsi b/arch/arm/dts/mt8516-u-boot.dtsi
new file mode 100644 (file)
index 0000000..3c0d843
--- /dev/null
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright (C) 2019 BayLibre, SAS
+ * Author: Fabien Parent <fparent@baylibre.com>
+ */
+
+&infracfg {
+       u-boot,dm-pre-reloc;
+};
+
+&topckgen_ {
+       u-boot,dm-pre-reloc;
+};
+
+&topckgen_cg {
+       u-boot,dm-pre-reloc;
+};
+
+&apmixedsys {
+       u-boot,dm-pre-reloc;
+};
+
+&uart0 {
+       u-boot,dm-pre-reloc;
+};
diff --git a/arch/arm/dts/mt8516.dtsi b/arch/arm/dts/mt8516.dtsi
new file mode 100644 (file)
index 0000000..1c33582
--- /dev/null
@@ -0,0 +1,136 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright (C) 2019 BayLibre, SAS
+ * Author: Fabien Parent <fparent@baylibre.com>
+ */
+
+#include <dt-bindings/clock/mt8516-clk.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+
+/ {
+       compatible = "mediatek,mt8516";
+       interrupt-parent = <&sysirq>;
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               enable-method = "mediatek,mt8516-smp";
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a35";
+                       reg = <0x0>;
+                       clock-frequency = <1300000000>;
+               };
+
+               cpu@1 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a35";
+                       reg = <0x1>;
+                       clock-frequency = <1300000000>;
+               };
+
+               cpu@2 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a35";
+                       reg = <0x2>;
+                       clock-frequency = <1300000000>;
+               };
+
+               cpu@3 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a35";
+                       reg = <0x3>;
+                       clock-frequency = <1300000000>;
+               };
+       };
+
+       topckgen: clock-controller@10000000 {
+               compatible = "mediatek,mt8516-topckgen";
+               reg = <0x10000000 0x1000>;
+               #clock-cells = <1>;
+       };
+
+       topckgen_cg: clock-controller-cg@10000000 {
+               compatible = "mediatek,mt8516-topckgen-cg";
+               reg = <0x10000000 0x1000>;
+               #clock-cells = <1>;
+       };
+
+       infracfg: clock-controller@10001000 {
+               compatible = "mediatek,mt8516-infracfg";
+               reg = <0x10001000 0x1000>;
+               #clock-cells = <1>;
+       };
+
+       apmixedsys: clock-controller@10018000 {
+               compatible = "mediatek,mt8516-apmixedsys";
+               reg = <0x10018000 0x710>;
+               #clock-cells = <1>;
+       };
+
+       gic: interrupt-controller@10310000 {
+               compatible = "arm,gic-400";
+               interrupt-controller;
+               #interrupt-cells = <3>;
+               interrupt-parent = <&gic>;
+               reg = <0x10310000 0x1000>,
+                     <0x10320000 0x1000>,
+                     <0x10340000 0x2000>,
+                     <0x10360000 0x2000>;
+               interrupts = <GIC_PPI 9
+                            (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
+       };
+
+       sysirq: interrupt-controller@10200620 {
+               compatible = "mediatek,sysirq";
+               interrupt-controller;
+               #interrupt-cells = <3>;
+               interrupt-parent = <&gic>;
+               reg = <0x10200620 0x20>;
+       };
+
+       watchdog: watchdog@10007000 {
+               compatible = "mediatek,wdt";
+               reg = <0x10007000 0x1000>;
+               interrupts = <GIC_SPI 198 IRQ_TYPE_EDGE_FALLING>;
+               #reset-cells = <1>;
+               status = "disabled";
+       };
+
+       pinctrl: pinctrl@10005000 {
+               compatible = "mediatek,mt8516-pinctrl";
+               reg = <0x10005000 0x1000>;
+
+               gpio: gpio-controller {
+                       gpio-controller;
+                       #gpio-cells = <2>;
+               };
+       };
+
+       mmc0: mmc@11120000 {
+               compatible = "mediatek,mt8516-mmc";
+               reg = <0x11120000 0x1000>;
+               interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_LOW>;
+               clocks = <&topckgen_cg CLK_TOP_MSDC0>,
+                        <&topckgen CLK_TOP_AHB_INFRA_SEL>,
+                        <&topckgen_cg CLK_TOP_MSDC0_INFRA>;
+               clock-names = "source", "hclk", "source_cg";
+               status = "disabled";
+       };
+
+       uart0: serial@11005000 {
+               compatible = "mediatek,hsuart";
+               reg = <0x11005000 0x1000>;
+               reg-shift = <2>;
+               interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_LOW>;
+               clocks = <&topckgen CLK_TOP_UART0_SEL>,
+                        <&topckgen_cg CLK_TOP_UART0>;
+               clock-names = "baud","bus";
+               status = "disabled";
+       };
+};
index 54a7285e6e1ea04cba5e31b7cad24253316b2353..1b1d765fae0cb02cda81866872a46fcf49d6525c 100644 (file)
@@ -68,7 +68,7 @@
        u-boot,dm-spl;
 
        m25p80@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                u-boot,dm-spl;
        };
 };
index 50312e752e2fae3dc42c6a0c6b45b78b0db7dcf1..7b9508e83d46c54df2d2b424a63f3ae9db1cdc87 100644 (file)
 };
 
 &lvds1 {
-       status = "okay";
-
        ports {
                port@1 {
                        lvds_connector: endpoint {
index a13a92c2664507ee49d1ef8d0b3f5d80dbeffc5d..7a7d3b84d1a6b21d1ddccd4afd2ac55747de5689 100644 (file)
@@ -94,9 +94,8 @@
        status = "okay";
 
        clocks = <&cpg CPG_MOD 724>, <&cpg CPG_MOD 723>, <&cpg CPG_MOD 722>,
-                <&cpg CPG_MOD 726>, <&cpg CPG_MOD 725>,
                 <&osc1_clk>;
-       clock-names = "du.0", "du.1", "du.2", "lvds.0", "lvds.1", "dclkin.0";
+       clock-names = "du.0", "du.1", "du.2", "dclkin.0";
 
        ports {
                port@0 {
                                remote-endpoint = <&adv7511_in>;
                        };
                };
+       };
+};
+
+&lvds0 {
+       ports {
                port@1 {
                        lvds_connector0: endpoint {
                        };
                };
-               port@2 {
+       };
+};
+
+&lvds1 {
+       ports {
+               port@1 {
                        lvds_connector1: endpoint {
                        };
                };
                interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
                interrupt-controller;
 
+               onkey {
+                       compatible = "dlg,da9063-onkey";
+               };
+
                rtc {
                        compatible = "dlg,da9063-rtc";
                };
index 0925bdca438feedaa8ee956f8109fcca75dbbe1f..5a2747758f676a4b526231658fb728aae93d2fe9 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * Device Tree Source for the r8a7790 SoC
+ * Device Tree Source for the R-Car H2 (R8A77900) SoC
  *
  * Copyright (C) 2015 Renesas Electronics Corporation
  * Copyright (C) 2013-2014 Renesas Solutions Corp.
                sata0: sata@ee300000 {
                        compatible = "renesas,sata-r8a7790",
                                     "renesas,rcar-gen2-sata";
-                       reg = <0 0xee300000 0 0x2000>;
+                       reg = <0 0xee300000 0 0x200000>;
                        interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 815>;
                        power-domains = <&sysc R8A7790_PD_ALWAYS_ON>;
                sata1: sata@ee500000 {
                        compatible = "renesas,sata-r8a7790",
                                     "renesas,rcar-gen2-sata";
-                       reg = <0 0xee500000 0 0x2000>;
+                       reg = <0 0xee500000 0 0x200000>;
                        interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 814>;
                        power-domains = <&sysc R8A7790_PD_ALWAYS_ON>;
index ce22db01fbbaafb4689cc736cc357f8ec7f7f335..e6580aa0cea3573fd3c7b52e560f4a076f6e58cb 100644 (file)
 };
 
 &lvds0 {
-       status = "okay";
-
        ports {
                port@1 {
                        lvds_connector: endpoint {
index f02036e5de015a95feec05c47ead06e91cb3daee..fefdf8238bbe900226f338c60753e0f68919258e 100644 (file)
 };
 
 &lvds0 {
-       status = "okay";
-
        ports {
                port@1 {
                        lvds_connector: endpoint {
index 991ac6feedd5beb6123f7a12f98c8799d89f9565..6f875502453cf40a52df7337e53e4933c7a8053f 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * Device Tree Source for the r8a7791 SoC
+ * Device Tree Source for the R-Car M2-W (R8A77910) SoC
  *
  * Copyright (C) 2013-2015 Renesas Electronics Corporation
  * Copyright (C) 2013-2014 Renesas Solutions Corp.
                sata0: sata@ee300000 {
                        compatible = "renesas,sata-r8a7791",
                                     "renesas,rcar-gen2-sata";
-                       reg = <0 0xee300000 0 0x2000>;
+                       reg = <0 0xee300000 0 0x200000>;
                        interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 815>;
                        power-domains = <&sysc R8A7791_PD_ALWAYS_ON>;
                sata1: sata@ee500000 {
                        compatible = "renesas,sata-r8a7791",
                                     "renesas,rcar-gen2-sata";
-                       reg = <0 0xee500000 0 0x2000>;
+                       reg = <0 0xee500000 0 0x200000>;
                        interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 814>;
                        power-domains = <&sysc R8A7791_PD_ALWAYS_ON>;
index 63a978ec81cc09f0a4d989fff7171d893ba07387..8e9eb4b704d32f2a23179435f158030772ca2365 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * Device Tree Source for the r8a7792 SoC
+ * Device Tree Source for the R-Car V2H (R8A77920) SoC
  *
  * Copyright (C) 2016 Cogent Embedded Inc.
  */
                du: display@feb00000 {
                        compatible = "renesas,du-r8a7792";
                        reg = <0 0xfeb00000 0 0x40000>;
-                       reg-names = "du";
                        interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>,
                                     <GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 724>,
index 6b2f3a4fd13d646c35e48fc46a7efa31ab42035e..f51601af89a2f4d5324e891a85944a6d57d2b074 100644 (file)
        status = "okay";
 };
 
+&cpu0 {
+       cpu0-supply = <&vdd_dvfs>;
+};
+
 &rwdt {
        timeout-sec = <60>;
        status = "okay";
                        compatible = "dlg,da9063-watchdog";
                };
        };
+
+       vdd_dvfs: regulator@68 {
+               compatible = "dlg,da9210";
+               reg = <0x68>;
+               interrupt-parent = <&irqc0>;
+               interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
+
+               regulator-min-microvolt = <1000000>;
+               regulator-max-microvolt = <1000000>;
+               regulator-boot-on;
+               regulator-always-on;
+       };
 };
 
 &i2c4 {
index 620a570307ffcffa0ac2cc42918684882952b4b2..bf05110fac4e23beb7b5dff259d44b317a49c0db 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * Device Tree Source for the r8a7793 SoC
+ * Device Tree Source for the R-Car M2-N (R8A77930) SoC
  *
  * Copyright (C) 2014-2015 Renesas Electronics Corporation
  */
index 14cd39297e6f1e425b5821c50bfff6523c3a835d..29b0e32d14fc2ec4d9d5eb4b4186ad3f9062c9e0 100644 (file)
        clock-frequency = <100000>;
 };
 
+&pci0 {
+       status = "okay";
+       pinctrl-0 = <&usb0_pins>;
+       pinctrl-names = "default";
+};
+
+&pci1 {
+       status = "okay";
+       pinctrl-0 = <&usb1_pins>;
+       pinctrl-names = "default";
+};
+
+&pfc {
+       usb0_pins: usb0 {
+               groups = "usb0";
+               function = "usb0";
+       };
+
+       usb1_pins: usb1 {
+               groups = "usb1";
+               function = "usb1";
+       };
+};
+
 &scif2 {
        u-boot,dm-pre-reloc;
 };
@@ -23,3 +47,7 @@
                spi-rx-bus-width = <1>;
        };
 };
+
+&usbphy {
+       status = "okay";
+};
index daec965889d3e5fe18e764daaf77758e24aacd0c..60e91ebfa65dc5b3d76cd28218b51aa4fceb8c17 100644 (file)
        clock-frequency = <400000>;
 };
 
+&i2c7 {
+       status = "okay";
+       clock-frequency = <100000>;
+
+       pmic@58 {
+               compatible = "dlg,da9063";
+               reg = <0x58>;
+               interrupt-parent = <&gpio3>;
+               interrupts = <31 IRQ_TYPE_LEVEL_LOW>;
+               interrupt-controller;
+
+               onkey {
+                       compatible = "dlg,da9063-onkey";
+               };
+
+               rtc {
+                       compatible = "dlg,da9063-rtc";
+               };
+
+               wdt {
+                       compatible = "dlg,da9063-watchdog";
+               };
+       };
+};
+
 &mmcif0 {
        pinctrl-0 = <&mmcif0_pins>;
        pinctrl-names = "default";
index ea2ca4bdaf1c129c3932644a45bce1145ebabfb6..8d797d34816e3625e1c3a56aa7e6af8cadc219dc 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * Device Tree Source for the r8a7794 SoC
+ * Device Tree Source for the R-Car E2 (R8A77940) SoC
  *
  * Copyright (C) 2014 Renesas Electronics Corporation
  * Copyright (C) 2014 Ulrich Hecht
                du: display@feb00000 {
                        compatible = "renesas,du-r8a7794";
                        reg = <0 0xfeb00000 0 0x40000>;
-                       reg-names = "du";
                        interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>,
                                     <GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 724>, <&cpg CPG_MOD 723>;
index 3de640724dfd768de94786297017a4ecf1876850..dda339bd30848694202d4a52e5114af5cefe999e 100644 (file)
        };
 };
 
-&vcc_sdhi0 {
-       u-boot,off-on-delay-us = <20000>;
-};
-
-&sdhi2_pins {
-       groups = "sdhi2_data8", "sdhi2_ctrl", "sdhi2_ds";
-       power-source = <1800>;
-};
-
-&sdhi2_pins_uhs {
-       groups = "sdhi2_data8", "sdhi2_ctrl", "sdhi2_ds";
-};
-
 &sdhi0 {
        sd-uhs-sdr12;
        sd-uhs-sdr25;
index df50bf46406e6e904f31541e1767a1dfe8b4b25a..54515eaf0310f1727f4e695196b74b5bd7354645 100644 (file)
                 <&cpg CPG_MOD 723>,
                 <&cpg CPG_MOD 722>,
                 <&cpg CPG_MOD 721>,
-                <&cpg CPG_MOD 727>,
                 <&versaclock5 1>,
                 <&versaclock5 3>,
                 <&versaclock5 4>,
                 <&versaclock5 2>;
-       clock-names = "du.0", "du.1", "du.2", "du.3", "lvds.0",
+       clock-names = "du.0", "du.1", "du.2", "du.3",
                      "dclkin.0", "dclkin.1", "dclkin.2", "dclkin.3";
 };
index a22028bb3184b662257411bd33d6df8cfed7ddc1..66b608a0f1a9ab84f450c6cb2e760806bf42a54f 100644 (file)
@@ -8,23 +8,6 @@
 #include "r8a7795-salvator-x.dts"
 #include "r8a7795-u-boot.dtsi"
 
-&vcc_sdhi0 {
-       u-boot,off-on-delay-us = <20000>;
-};
-
-&vcc_sdhi3 {
-       u-boot,off-on-delay-us = <20000>;
-};
-
-&sdhi2_pins {
-       groups = "sdhi2_data8", "sdhi2_ctrl", "sdhi2_ds";
-       power-source = <1800>;
-};
-
-&sdhi2_pins_uhs {
-       groups = "sdhi2_data8", "sdhi2_ctrl", "sdhi2_ds";
-};
-
 &sdhi0 {
        sd-uhs-sdr12;
        sd-uhs-sdr25;
index 446822f5751c77e8a78fe599c8f818a7db8d51f5..d2d48b33b37f471b504b289bd909e6ab772b7c37 100644 (file)
                 <&cpg CPG_MOD 723>,
                 <&cpg CPG_MOD 722>,
                 <&cpg CPG_MOD 721>,
-                <&cpg CPG_MOD 727>,
                 <&versaclock5 1>,
                 <&x21_clk>,
                 <&x22_clk>,
                 <&versaclock5 2>;
-       clock-names = "du.0", "du.1", "du.2", "du.3", "lvds.0",
+       clock-names = "du.0", "du.1", "du.2", "du.3",
                      "dclkin.0", "dclkin.1", "dclkin.2", "dclkin.3";
 };
 
        ports {
                /* rsnd_port0 is on salvator-common */
                rsnd_port1: port@1 {
+                       reg = <1>;
                        rsnd_endpoint1: endpoint {
                                remote-endpoint = <&dw_hdmi0_snd_in>;
 
                        };
                };
                rsnd_port2: port@2 {
+                       reg = <2>;
                        rsnd_endpoint2: endpoint {
                                remote-endpoint = <&dw_hdmi1_snd_in>;
 
index cc22c57ae3199d5bf09e2af90cb87c43105b4124..3f4b1f5acc913f766071471ef083382106c38020 100644 (file)
        u-boot,dm-pre-reloc;
 };
 
-&soc {
-       rpc: rpc@0xee200000 {
-               compatible = "renesas,rpc-r8a7795", "renesas,rpc";
-               reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
-               clocks = <&cpg CPG_MOD 917>;
-               bank-width = <2>;
-               status = "disabled";
+/ {
+       soc {
+               rpc: rpc@0xee200000 {
+                       compatible = "renesas,rpc-r8a7795", "renesas,rpc";
+                       reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
+                       clocks = <&cpg CPG_MOD 917>;
+                       bank-width = <2>;
+                       status = "disabled";
+               };
        };
 };
index c87eed77de2c110189e0789b488aa63ec3dad589..abeac3059383969c1329406b3cbbf6bc582e7936 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * Device Tree Source for the r8a7795 SoC
+ * Device Tree Source for the R-Car H3 (R8A77950) SoC
  *
  * Copyright (C) 2015 Renesas Electronics Corp.
  */
                #address-cells = <1>;
                #size-cells = <0>;
 
+               cpu-map {
+                       cluster0 {
+                               core0 {
+                                       cpu = <&a57_0>;
+                               };
+                               core1 {
+                                       cpu = <&a57_1>;
+                               };
+                               core2 {
+                                       cpu = <&a57_2>;
+                               };
+                               core3 {
+                                       cpu = <&a57_3>;
+                               };
+                       };
+
+                       cluster1 {
+                               core0 {
+                                       cpu = <&a53_0>;
+                               };
+                               core1 {
+                                       cpu = <&a53_1>;
+                               };
+                               core2 {
+                                       cpu = <&a53_2>;
+                               };
+                               core3 {
+                                       cpu = <&a53_3>;
+                               };
+                       };
+               };
+
                a57_0: cpu@0 {
-                       compatible = "arm,cortex-a57", "arm,armv8";
+                       compatible = "arm,cortex-a57";
                        reg = <0x0>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A7795_PD_CA57_CPU0>;
                        next-level-cache = <&L2_CA57>;
                        enable-method = "psci";
-                       clocks =<&cpg CPG_CORE R8A7795_CLK_Z>;
+                       clocks = <&cpg CPG_CORE R8A7795_CLK_Z>;
                        operating-points-v2 = <&cluster0_opp>;
+                       capacity-dmips-mhz = <1024>;
                        #cooling-cells = <2>;
                };
 
                a57_1: cpu@1 {
-                       compatible = "arm,cortex-a57", "arm,armv8";
+                       compatible = "arm,cortex-a57";
                        reg = <0x1>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A7795_PD_CA57_CPU1>;
                        next-level-cache = <&L2_CA57>;
                        enable-method = "psci";
-                       clocks =<&cpg CPG_CORE R8A7795_CLK_Z>;
+                       clocks = <&cpg CPG_CORE R8A7795_CLK_Z>;
                        operating-points-v2 = <&cluster0_opp>;
+                       capacity-dmips-mhz = <1024>;
                        #cooling-cells = <2>;
                };
 
                a57_2: cpu@2 {
-                       compatible = "arm,cortex-a57", "arm,armv8";
+                       compatible = "arm,cortex-a57";
                        reg = <0x2>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A7795_PD_CA57_CPU2>;
                        next-level-cache = <&L2_CA57>;
                        enable-method = "psci";
-                       clocks =<&cpg CPG_CORE R8A7795_CLK_Z>;
+                       clocks = <&cpg CPG_CORE R8A7795_CLK_Z>;
                        operating-points-v2 = <&cluster0_opp>;
+                       capacity-dmips-mhz = <1024>;
                        #cooling-cells = <2>;
                };
 
                a57_3: cpu@3 {
-                       compatible = "arm,cortex-a57", "arm,armv8";
+                       compatible = "arm,cortex-a57";
                        reg = <0x3>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A7795_PD_CA57_CPU3>;
                        next-level-cache = <&L2_CA57>;
                        enable-method = "psci";
-                       clocks =<&cpg CPG_CORE R8A7795_CLK_Z>;
+                       clocks = <&cpg CPG_CORE R8A7795_CLK_Z>;
                        operating-points-v2 = <&cluster0_opp>;
+                       capacity-dmips-mhz = <1024>;
                        #cooling-cells = <2>;
                };
 
                a53_0: cpu@100 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x100>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A7795_PD_CA53_CPU0>;
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
-                       clocks =<&cpg CPG_CORE R8A7795_CLK_Z2>;
+                       clocks = <&cpg CPG_CORE R8A7795_CLK_Z2>;
                        operating-points-v2 = <&cluster1_opp>;
+                       capacity-dmips-mhz = <535>;
                };
 
                a53_1: cpu@101 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x101>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A7795_PD_CA53_CPU1>;
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
-                       clocks =<&cpg CPG_CORE R8A7795_CLK_Z2>;
+                       clocks = <&cpg CPG_CORE R8A7795_CLK_Z2>;
                        operating-points-v2 = <&cluster1_opp>;
+                       capacity-dmips-mhz = <535>;
                };
 
                a53_2: cpu@102 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x102>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A7795_PD_CA53_CPU2>;
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
-                       clocks =<&cpg CPG_CORE R8A7795_CLK_Z2>;
+                       clocks = <&cpg CPG_CORE R8A7795_CLK_Z2>;
                        operating-points-v2 = <&cluster1_opp>;
+                       capacity-dmips-mhz = <535>;
                };
 
                a53_3: cpu@103 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x103>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A7795_PD_CA53_CPU3>;
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
-                       clocks =<&cpg CPG_CORE R8A7795_CLK_Z2>;
+                       clocks = <&cpg CPG_CORE R8A7795_CLK_Z2>;
                        operating-points-v2 = <&cluster1_opp>;
+                       capacity-dmips-mhz = <535>;
                };
 
                L2_CA57: cache-controller-0 {
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
                        resets = <&cpg 522>;
                        #thermal-sensor-cells = <1>;
-                       status = "okay";
                };
 
                intc_ex: interrupt-controller@e61c0000 {
                        status = "disabled";
                };
 
-               arm_cc630p: crypto@e6601000 {
-                       compatible = "arm,cryptocell-630p-ree";
-                       interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
-                       reg = <0x0 0xe6601000 0 0x1000>;
-                       clocks = <&cpg CPG_MOD 229>;
-                       resets = <&cpg 229>;
-                       power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
-               };
-
                i2c3: i2c@e66d0000 {
                        #address-cells = <1>;
                        #size-cells = <0>;
                hsusb: usb@e6590000 {
                        compatible = "renesas,usbhs-r8a7795",
                                     "renesas,rcar-gen3-usbhs";
-                       reg = <0 0xe6590000 0 0x100>;
+                       reg = <0 0xe6590000 0 0x200>;
                        interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 704>;
+                       clocks = <&cpg CPG_MOD 704>, <&cpg CPG_MOD 703>;
                        dmas = <&usb_dmac0 0>, <&usb_dmac0 1>,
                               <&usb_dmac1 0>, <&usb_dmac1 1>;
                        dma-names = "ch0", "ch1", "ch2", "ch3";
                        phys = <&usb2_phy0>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
-                       resets = <&cpg 704>;
+                       resets = <&cpg 704>, <&cpg 703>;
                        status = "disabled";
                };
 
                hsusb3: usb@e659c000 {
                        compatible = "renesas,usbhs-r8a7795",
                                     "renesas,rcar-gen3-usbhs";
-                       reg = <0 0xe659c000 0 0x100>;
+                       reg = <0 0xe659c000 0 0x200>;
                        interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 705>;
+                       clocks = <&cpg CPG_MOD 705>, <&cpg CPG_MOD 700>;
                        dmas = <&usb_dmac2 0>, <&usb_dmac2 1>,
                               <&usb_dmac3 0>, <&usb_dmac3 1>;
                        dma-names = "ch0", "ch1", "ch2", "ch3";
                        phys = <&usb2_phy3>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
-                       resets = <&cpg 705>;
+                       resets = <&cpg 705>, <&cpg 700>;
                        status = "disabled";
                };
 
                        status = "disabled";
                };
 
+               arm_cc630p: crypto@e6601000 {
+                       compatible = "arm,cryptocell-630p-ree";
+                       interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
+                       reg = <0x0 0xe6601000 0 0x1000>;
+                       clocks = <&cpg CPG_MOD 229>;
+                       resets = <&cpg 229>;
+                       power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+               };
+
                dmac0: dma-controller@e6700000 {
                        compatible = "renesas,dmac-r8a7795",
                                     "renesas,rcar-dmac";
 
                                        vin0csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin0>;
+                                               remote-endpoint = <&csi20vin0>;
                                        };
                                        vin0csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin0>;
+                                               remote-endpoint = <&csi40vin0>;
                                        };
                                };
                        };
 
                                        vin1csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin1>;
+                                               remote-endpoint = <&csi20vin1>;
                                        };
                                        vin1csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin1>;
+                                               remote-endpoint = <&csi40vin1>;
                                        };
                                };
                        };
 
                                        vin2csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin2>;
+                                               remote-endpoint = <&csi20vin2>;
                                        };
                                        vin2csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin2>;
+                                               remote-endpoint = <&csi40vin2>;
                                        };
                                };
                        };
 
                                        vin3csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin3>;
+                                               remote-endpoint = <&csi20vin3>;
                                        };
                                        vin3csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin3>;
+                                               remote-endpoint = <&csi40vin3>;
                                        };
                                };
                        };
 
                                        vin4csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin4>;
+                                               remote-endpoint = <&csi20vin4>;
                                        };
                                        vin4csi41: endpoint@3 {
                                                reg = <3>;
-                                               remote-endpoint= <&csi41vin4>;
+                                               remote-endpoint = <&csi41vin4>;
                                        };
                                };
                        };
 
                                        vin5csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin5>;
+                                               remote-endpoint = <&csi20vin5>;
                                        };
                                        vin5csi41: endpoint@3 {
                                                reg = <3>;
-                                               remote-endpoint= <&csi41vin5>;
+                                               remote-endpoint = <&csi41vin5>;
                                        };
                                };
                        };
 
                                        vin6csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin6>;
+                                               remote-endpoint = <&csi20vin6>;
                                        };
                                        vin6csi41: endpoint@3 {
                                                reg = <3>;
-                                               remote-endpoint= <&csi41vin6>;
+                                               remote-endpoint = <&csi41vin6>;
                                        };
                                };
                        };
 
                                        vin7csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin7>;
+                                               remote-endpoint = <&csi20vin7>;
                                        };
                                        vin7csi41: endpoint@3 {
                                                reg = <3>;
-                                               remote-endpoint= <&csi41vin7>;
+                                               remote-endpoint = <&csi41vin7>;
                                        };
                                };
                        };
                                };
                        };
 
+                       rcar_sound,ssiu {
+                               ssiu00: ssiu-0 {
+                                       dmas = <&audma0 0x15>, <&audma1 0x16>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu01: ssiu-1 {
+                                       dmas = <&audma0 0x35>, <&audma1 0x36>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu02: ssiu-2 {
+                                       dmas = <&audma0 0x37>, <&audma1 0x38>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu03: ssiu-3 {
+                                       dmas = <&audma0 0x47>, <&audma1 0x48>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu04: ssiu-4 {
+                                       dmas = <&audma0 0x3F>, <&audma1 0x40>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu05: ssiu-5 {
+                                       dmas = <&audma0 0x43>, <&audma1 0x44>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu06: ssiu-6 {
+                                       dmas = <&audma0 0x4F>, <&audma1 0x50>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu07: ssiu-7 {
+                                       dmas = <&audma0 0x53>, <&audma1 0x54>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu10: ssiu-8 {
+                                       dmas = <&audma0 0x49>, <&audma1 0x4a>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu11: ssiu-9 {
+                                       dmas = <&audma0 0x4B>, <&audma1 0x4C>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu12: ssiu-10 {
+                                       dmas = <&audma0 0x57>, <&audma1 0x58>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu13: ssiu-11 {
+                                       dmas = <&audma0 0x59>, <&audma1 0x5A>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu14: ssiu-12 {
+                                       dmas = <&audma0 0x5F>, <&audma1 0x60>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu15: ssiu-13 {
+                                       dmas = <&audma0 0xC3>, <&audma1 0xC4>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu16: ssiu-14 {
+                                       dmas = <&audma0 0xC7>, <&audma1 0xC8>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu17: ssiu-15 {
+                                       dmas = <&audma0 0xCB>, <&audma1 0xCC>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu20: ssiu-16 {
+                                       dmas = <&audma0 0x63>, <&audma1 0x64>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu21: ssiu-17 {
+                                       dmas = <&audma0 0x67>, <&audma1 0x68>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu22: ssiu-18 {
+                                       dmas = <&audma0 0x6B>, <&audma1 0x6C>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu23: ssiu-19 {
+                                       dmas = <&audma0 0x6D>, <&audma1 0x6E>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu24: ssiu-20 {
+                                       dmas = <&audma0 0xCF>, <&audma1 0xCE>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu25: ssiu-21 {
+                                       dmas = <&audma0 0xEB>, <&audma1 0xEC>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu26: ssiu-22 {
+                                       dmas = <&audma0 0xED>, <&audma1 0xEE>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu27: ssiu-23 {
+                                       dmas = <&audma0 0xEF>, <&audma1 0xF0>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu30: ssiu-24 {
+                                       dmas = <&audma0 0x6f>, <&audma1 0x70>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu31: ssiu-25 {
+                                       dmas = <&audma0 0x21>, <&audma1 0x22>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu32: ssiu-26 {
+                                       dmas = <&audma0 0x23>, <&audma1 0x24>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu33: ssiu-27 {
+                                       dmas = <&audma0 0x25>, <&audma1 0x26>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu34: ssiu-28 {
+                                       dmas = <&audma0 0x27>, <&audma1 0x28>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu35: ssiu-29 {
+                                       dmas = <&audma0 0x29>, <&audma1 0x2A>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu36: ssiu-30 {
+                                       dmas = <&audma0 0x2B>, <&audma1 0x2C>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu37: ssiu-31 {
+                                       dmas = <&audma0 0x2D>, <&audma1 0x2E>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu40: ssiu-32 {
+                                       dmas =  <&audma0 0x71>, <&audma1 0x72>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu41: ssiu-33 {
+                                       dmas = <&audma0 0x17>, <&audma1 0x18>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu42: ssiu-34 {
+                                       dmas = <&audma0 0x19>, <&audma1 0x1A>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu43: ssiu-35 {
+                                       dmas = <&audma0 0x1B>, <&audma1 0x1C>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu44: ssiu-36 {
+                                       dmas = <&audma0 0x1D>, <&audma1 0x1E>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu45: ssiu-37 {
+                                       dmas = <&audma0 0x1F>, <&audma1 0x20>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu46: ssiu-38 {
+                                       dmas = <&audma0 0x31>, <&audma1 0x32>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu47: ssiu-39 {
+                                       dmas = <&audma0 0x33>, <&audma1 0x34>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu50: ssiu-40 {
+                                       dmas = <&audma0 0x73>, <&audma1 0x74>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu60: ssiu-41 {
+                                       dmas = <&audma0 0x75>, <&audma1 0x76>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu70: ssiu-42 {
+                                       dmas = <&audma0 0x79>, <&audma1 0x7a>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu80: ssiu-43 {
+                                       dmas = <&audma0 0x7b>, <&audma1 0x7c>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu90: ssiu-44 {
+                                       dmas = <&audma0 0x7d>, <&audma1 0x7e>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu91: ssiu-45 {
+                                       dmas = <&audma0 0x7F>, <&audma1 0x80>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu92: ssiu-46 {
+                                       dmas = <&audma0 0x81>, <&audma1 0x82>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu93: ssiu-47 {
+                                       dmas = <&audma0 0x83>, <&audma1 0x84>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu94: ssiu-48 {
+                                       dmas = <&audma0 0xA3>, <&audma1 0xA4>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu95: ssiu-49 {
+                                       dmas = <&audma0 0xA5>, <&audma1 0xA6>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu96: ssiu-50 {
+                                       dmas = <&audma0 0xA7>, <&audma1 0xA8>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu97: ssiu-51 {
+                                       dmas = <&audma0 0xA9>, <&audma1 0xAA>;
+                                       dma-names = "rx", "tx";
+                               };
+                       };
+
                        rcar_sound,ssi {
                                ssi0: ssi-0 {
                                        interrupts = <GIC_SPI 370 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x01>, <&audma1 0x02>, <&audma0 0x15>, <&audma1 0x16>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x01>, <&audma1 0x02>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi1: ssi-1 {
                                         interrupts = <GIC_SPI 371 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x03>, <&audma1 0x04>, <&audma0 0x49>, <&audma1 0x4a>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x03>, <&audma1 0x04>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi2: ssi-2 {
                                        interrupts = <GIC_SPI 372 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x05>, <&audma1 0x06>, <&audma0 0x63>, <&audma1 0x64>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x05>, <&audma1 0x06>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi3: ssi-3 {
                                        interrupts = <GIC_SPI 373 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x07>, <&audma1 0x08>, <&audma0 0x6f>, <&audma1 0x70>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x07>, <&audma1 0x08>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi4: ssi-4 {
                                        interrupts = <GIC_SPI 374 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x09>, <&audma1 0x0a>, <&audma0 0x71>, <&audma1 0x72>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x09>, <&audma1 0x0a>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi5: ssi-5 {
                                        interrupts = <GIC_SPI 375 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x0b>, <&audma1 0x0c>, <&audma0 0x73>, <&audma1 0x74>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x0b>, <&audma1 0x0c>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi6: ssi-6 {
                                        interrupts = <GIC_SPI 376 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x0d>, <&audma1 0x0e>, <&audma0 0x75>, <&audma1 0x76>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x0d>, <&audma1 0x0e>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi7: ssi-7 {
                                        interrupts = <GIC_SPI 377 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x0f>, <&audma1 0x10>, <&audma0 0x79>, <&audma1 0x7a>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x0f>, <&audma1 0x10>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi8: ssi-8 {
                                        interrupts = <GIC_SPI 378 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x11>, <&audma1 0x12>, <&audma0 0x7b>, <&audma1 0x7c>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x11>, <&audma1 0x12>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi9: ssi-9 {
                                        interrupts = <GIC_SPI 379 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x13>, <&audma1 0x14>, <&audma0 0x7d>, <&audma1 0x7e>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
-                               };
-                       };
-
-                       ports {
-                               #address-cells = <1>;
-                               #size-cells = <0>;
-                               port@0 {
-                                       reg = <0>;
-                               };
-                               port@1 {
-                                       reg = <1>;
-                               };
-                               port@2 {
-                                       reg = <2>;
+                                       dmas = <&audma0 0x13>, <&audma1 0x14>;
+                                       dma-names = "rx", "tx";
                                };
                        };
                };
                        compatible = "generic-ohci";
                        reg = <0 0xee080000 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        phys = <&usb2_phy0>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
-                       resets = <&cpg 703>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        status = "disabled";
                };
 
                        compatible = "generic-ohci";
                        reg = <0 0xee0e0000 0 0x100>;
                        interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 700>;
+                       clocks = <&cpg CPG_MOD 700>, <&cpg CPG_MOD 705>;
                        phys = <&usb2_phy3>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
-                       resets = <&cpg 700>;
+                       resets = <&cpg 700>, <&cpg 705>;
                        status = "disabled";
                };
 
                        compatible = "generic-ehci";
                        reg = <0 0xee080100 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        phys = <&usb2_phy0>;
                        phy-names = "usb";
                        companion = <&ohci0>;
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
-                       resets = <&cpg 703>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        status = "disabled";
                };
 
                        compatible = "generic-ehci";
                        reg = <0 0xee0e0100 0 0x100>;
                        interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 700>;
+                       clocks = <&cpg CPG_MOD 700>, <&cpg CPG_MOD 705>;
                        phys = <&usb2_phy3>;
                        phy-names = "usb";
                        companion = <&ohci3>;
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
-                       resets = <&cpg 700>;
+                       resets = <&cpg 700>, <&cpg 705>;
                        status = "disabled";
                };
 
                                     "renesas,rcar-gen3-usb2-phy";
                        reg = <0 0xee080200 0 0x700>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
-                       resets = <&cpg 703>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        #phy-cells = <0>;
                        status = "disabled";
                };
                                     "renesas,rcar-gen3-usb2-phy";
                        reg = <0 0xee0e0200 0 0x700>;
                        interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 700>;
+                       clocks = <&cpg CPG_MOD 700>, <&cpg CPG_MOD 705>;
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
-                       resets = <&cpg 700>;
+                       resets = <&cpg 700>, <&cpg 705>;
                        #phy-cells = <0>;
                        status = "disabled";
                };
 
                du: display@feb00000 {
                        compatible = "renesas,du-r8a7795";
-                       reg = <0 0xfeb00000 0 0x80000>,
-                             <0 0xfeb90000 0 0x14>;
-                       reg-names = "du", "lvds.0";
+                       reg = <0 0xfeb00000 0 0x80000>;
                        interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>,
                                     <GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>,
                                     <GIC_SPI 269 IRQ_TYPE_LEVEL_HIGH>,
                        clocks = <&cpg CPG_MOD 724>,
                                 <&cpg CPG_MOD 723>,
                                 <&cpg CPG_MOD 722>,
-                                <&cpg CPG_MOD 721>,
-                                <&cpg CPG_MOD 727>;
-                       clock-names = "du.0", "du.1", "du.2", "du.3", "lvds.0";
+                                <&cpg CPG_MOD 721>;
+                       clock-names = "du.0", "du.1", "du.2", "du.3";
                        vsps = <&vspd0 0 &vspd1 0 &vspd2 0 &vspd0 1>;
                        status = "disabled";
 
                                port@3 {
                                        reg = <3>;
                                        du_out_lvds0: endpoint {
+                                               remote-endpoint = <&lvds0_in>;
+                                       };
+                               };
+                       };
+               };
+
+               lvds0: lvds@feb90000 {
+                       compatible = "renesas,r8a7795-lvds";
+                       reg = <0 0xfeb90000 0 0x14>;
+                       clocks = <&cpg CPG_MOD 727>;
+                       power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+                       resets = <&cpg 727>;
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+                                       lvds0_in: endpoint {
+                                               remote-endpoint = <&du_out_lvds0>;
+                                       };
+                               };
+                               port@1 {
+                                       reg = <1>;
+                                       lvds0_out: endpoint {
                                        };
                                };
                        };
                        cooling-maps {
                                map0 {
                                        trip = <&sensor1_passive>;
-                                       cooling-device = <&a57_0 4 4>;
+                                       cooling-device = <&a57_0 4 4>,
+                                                        <&a57_1 4 4>,
+                                                        <&a57_2 4 4>,
+                                                        <&a57_3 4 4>;
                                };
                        };
                };
                        cooling-maps {
                                map0 {
                                        trip = <&sensor2_passive>;
-                                       cooling-device = <&a57_0 4 4>;
+                                       cooling-device = <&a57_0 4 4>,
+                                                        <&a57_1 4 4>,
+                                                        <&a57_2 4 4>,
+                                                        <&a57_3 4 4>;
                                };
                        };
                };
                        cooling-maps {
                                map0 {
                                        trip = <&sensor3_passive>;
-                                       cooling-device = <&a57_0 4 4>;
+                                       cooling-device = <&a57_0 4 4>,
+                                                        <&a57_1 4 4>,
+                                                        <&a57_2 4 4>,
+                                                        <&a57_3 4 4>;
                                };
                        };
                };
index 612cc87c71045137dc16c1e11ea0a445f1d5d843..1defe84f9812abdf2b2580a9230790d0a0b3078b 100644 (file)
        };
 };
 
-&vcc_sdhi0 {
-       u-boot,off-on-delay-us = <20000>;
-};
-
-&sdhi2_pins {
-       groups = "sdhi2_data8", "sdhi2_ctrl", "sdhi2_ds";
-       power-source = <1800>;
-};
-
-&sdhi2_pins_uhs {
-       groups = "sdhi2_data8", "sdhi2_ctrl", "sdhi2_ds";
-};
-
 &sdhi0 {
        sd-uhs-sdr12;
        sd-uhs-sdr25;
index cbd8acbf537e634ab461bd03c9459203440bfbd0..9e4594c27fa6c5534d074eae609ece05eec8538e 100644 (file)
        clocks = <&cpg CPG_MOD 724>,
                 <&cpg CPG_MOD 723>,
                 <&cpg CPG_MOD 722>,
-                <&cpg CPG_MOD 727>,
                 <&versaclock5 1>,
                 <&versaclock5 3>,
                 <&versaclock5 2>;
-       clock-names = "du.0", "du.1", "du.2", "lvds.0",
+       clock-names = "du.0", "du.1", "du.2",
                      "dclkin.0", "dclkin.1", "dclkin.2";
 };
index c730b90a42c5d8bd30c5da18dadcd0a91320be06..2610f8baa84dd7a3ad8d398cbacfe5a0c401d55f 100644 (file)
@@ -8,23 +8,6 @@
 #include "r8a7796-salvator-x.dts"
 #include "r8a7796-u-boot.dtsi"
 
-&vcc_sdhi0 {
-       u-boot,off-on-delay-us = <20000>;
-};
-
-&vcc_sdhi3 {
-       u-boot,off-on-delay-us = <20000>;
-};
-
-&sdhi2_pins {
-       groups = "sdhi2_data8", "sdhi2_ctrl", "sdhi2_ds";
-       power-source = <1800>;
-};
-
-&sdhi2_pins_uhs {
-       groups = "sdhi2_data8", "sdhi2_ctrl", "sdhi2_ds";
-};
-
 &sdhi0 {
        sd-uhs-sdr12;
        sd-uhs-sdr25;
index 052d72acc862b83c659f0056deeb9fe720d875a6..b4f9567cb9f86312164fd4d2302a926974df75a6 100644 (file)
        clocks = <&cpg CPG_MOD 724>,
                 <&cpg CPG_MOD 723>,
                 <&cpg CPG_MOD 722>,
-                <&cpg CPG_MOD 727>,
                 <&versaclock5 1>,
                 <&x21_clk>,
                 <&versaclock5 2>;
-       clock-names = "du.0", "du.1", "du.2", "lvds.0",
+       clock-names = "du.0", "du.1", "du.2",
                      "dclkin.0", "dclkin.1", "dclkin.2";
 };
 
index 4655259afe1a92b048c2a63f8f6de91dfe2db7cd..622105486b58deb19d698ce03a7a2a07142779a2 100644 (file)
        u-boot,dm-pre-reloc;
 };
 
-&soc {
-       rpc: rpc@0xee200000 {
-               compatible = "renesas,rpc-r8a7796", "renesas,rpc";
-               reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
-               clocks = <&cpg CPG_MOD 917>;
-               bank-width = <2>;
-               status = "disabled";
+/ {
+       soc {
+               rpc: rpc@0xee200000 {
+                       compatible = "renesas,rpc-r8a7796", "renesas,rpc";
+                       reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
+                       clocks = <&cpg CPG_MOD 917>;
+                       bank-width = <2>;
+                       status = "disabled";
+               };
        };
 };
index bf860f06d6c0f4ccf45258d4b8c67a96fa7b14d7..cdf784899cf8c06876888c5cfcd510bf645085ea 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * Device Tree Source for the r8a7796 SoC
+ * Device Tree Source for the R-Car M3-W (R8A77960) SoC
  *
  * Copyright (C) 2016-2017 Renesas Electronics Corp.
  */
                #address-cells = <1>;
                #size-cells = <0>;
 
+               cpu-map {
+                       cluster0 {
+                               core0 {
+                                       cpu = <&a57_0>;
+                               };
+                               core1 {
+                                       cpu = <&a57_1>;
+                               };
+                       };
+
+                       cluster1 {
+                               core0 {
+                                       cpu = <&a53_0>;
+                               };
+                               core1 {
+                                       cpu = <&a53_1>;
+                               };
+                               core2 {
+                                       cpu = <&a53_2>;
+                               };
+                               core3 {
+                                       cpu = <&a53_3>;
+                               };
+                       };
+               };
+
                a57_0: cpu@0 {
-                       compatible = "arm,cortex-a57", "arm,armv8";
+                       compatible = "arm,cortex-a57";
                        reg = <0x0>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A7796_PD_CA57_CPU0>;
                        next-level-cache = <&L2_CA57>;
                        enable-method = "psci";
-                       clocks =<&cpg CPG_CORE R8A7796_CLK_Z>;
+                       clocks = <&cpg CPG_CORE R8A7796_CLK_Z>;
                        operating-points-v2 = <&cluster0_opp>;
+                       capacity-dmips-mhz = <1024>;
                        #cooling-cells = <2>;
                };
 
                a57_1: cpu@1 {
-                       compatible = "arm,cortex-a57", "arm,armv8";
+                       compatible = "arm,cortex-a57";
                        reg = <0x1>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A7796_PD_CA57_CPU1>;
                        next-level-cache = <&L2_CA57>;
                        enable-method = "psci";
-                       clocks =<&cpg CPG_CORE R8A7796_CLK_Z>;
+                       clocks = <&cpg CPG_CORE R8A7796_CLK_Z>;
                        operating-points-v2 = <&cluster0_opp>;
+                       capacity-dmips-mhz = <1024>;
                        #cooling-cells = <2>;
                };
 
                a53_0: cpu@100 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x100>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A7796_PD_CA53_CPU0>;
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
-                       clocks =<&cpg CPG_CORE R8A7796_CLK_Z2>;
+                       clocks = <&cpg CPG_CORE R8A7796_CLK_Z2>;
                        operating-points-v2 = <&cluster1_opp>;
+                       capacity-dmips-mhz = <535>;
                };
 
                a53_1: cpu@101 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x101>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A7796_PD_CA53_CPU1>;
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
-                       clocks =<&cpg CPG_CORE R8A7796_CLK_Z2>;
+                       clocks = <&cpg CPG_CORE R8A7796_CLK_Z2>;
                        operating-points-v2 = <&cluster1_opp>;
+                       capacity-dmips-mhz = <535>;
                };
 
                a53_2: cpu@102 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x102>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A7796_PD_CA53_CPU2>;
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
-                       clocks =<&cpg CPG_CORE R8A7796_CLK_Z2>;
+                       clocks = <&cpg CPG_CORE R8A7796_CLK_Z2>;
                        operating-points-v2 = <&cluster1_opp>;
+                       capacity-dmips-mhz = <535>;
                };
 
                a53_3: cpu@103 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x103>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A7796_PD_CA53_CPU3>;
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
-                       clocks =<&cpg CPG_CORE R8A7796_CLK_Z2>;
+                       clocks = <&cpg CPG_CORE R8A7796_CLK_Z2>;
                        operating-points-v2 = <&cluster1_opp>;
+                       capacity-dmips-mhz = <535>;
                };
 
                L2_CA57: cache-controller-0 {
                clock-frequency = <0>;
        };
 
-       soc: soc {
+       soc {
                compatible = "simple-bus";
                interrupt-parent = <&gic>;
                #address-cells = <2>;
                        reg = <0 0xe6060000 0 0x50c>;
                };
 
+               cmt0: timer@e60f0000 {
+                       compatible = "renesas,r8a7796-cmt0",
+                                    "renesas,rcar-gen3-cmt0";
+                       reg = <0 0xe60f0000 0 0x1004>;
+                       interrupts = <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 303>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+                       resets = <&cpg 303>;
+                       status = "disabled";
+               };
+
+               cmt1: timer@e6130000 {
+                       compatible = "renesas,r8a7796-cmt1",
+                                    "renesas,rcar-gen3-cmt1";
+                       reg = <0 0xe6130000 0 0x1004>;
+                       interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 302>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+                       resets = <&cpg 302>;
+                       status = "disabled";
+               };
+
+               cmt2: timer@e6140000 {
+                       compatible = "renesas,r8a7796-cmt1",
+                                    "renesas,rcar-gen3-cmt1";
+                       reg = <0 0xe6140000 0 0x1004>;
+                       interrupts = <GIC_SPI 398 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 399 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 400 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 401 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 402 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 403 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 404 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 405 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 301>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+                       resets = <&cpg 301>;
+                       status = "disabled";
+               };
+
+               cmt3: timer@e6148000 {
+                       compatible = "renesas,r8a7796-cmt1",
+                                    "renesas,rcar-gen3-cmt1";
+                       reg = <0 0xe6148000 0 0x1004>;
+                       interrupts = <GIC_SPI 470 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 471 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 472 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 473 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 474 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 475 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 476 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 477 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 300>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+                       resets = <&cpg 300>;
+                       status = "disabled";
+               };
+
                cpg: clock-controller@e6150000 {
                        compatible = "renesas,r8a7796-cpg-mssr";
                        reg = <0 0xe6150000 0 0x1000>;
                        power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
                        resets = <&cpg 522>;
                        #thermal-sensor-cells = <1>;
-                       status = "okay";
                };
 
                intc_ex: interrupt-controller@e61c0000 {
                hsusb: usb@e6590000 {
                        compatible = "renesas,usbhs-r8a7796",
                                     "renesas,rcar-gen3-usbhs";
-                       reg = <0 0xe6590000 0 0x100>;
+                       reg = <0 0xe6590000 0 0x200>;
                        interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 704>;
+                       clocks = <&cpg CPG_MOD 704>, <&cpg CPG_MOD 703>;
                        dmas = <&usb_dmac0 0>, <&usb_dmac0 1>,
                               <&usb_dmac1 0>, <&usb_dmac1 1>;
                        dma-names = "ch0", "ch1", "ch2", "ch3";
                        phys = <&usb2_phy0>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
-                       resets = <&cpg 704>;
+                       resets = <&cpg 704>, <&cpg 703>;
                        status = "disabled";
                };
 
                                 <&cpg CPG_CORE R8A7796_CLK_S3D1>,
                                 <&scif_clk>;
                        clock-names = "fck", "brg_int", "scif_clk";
+                       dmas = <&dmac1 0x13>, <&dmac1 0x12>,
+                              <&dmac2 0x13>, <&dmac2 0x12>;
+                       dma-names = "tx", "rx", "tx", "rx";
                        power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
                        resets = <&cpg 310>;
                        status = "disabled";
 
                                        vin0csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin0>;
+                                               remote-endpoint = <&csi20vin0>;
                                        };
                                        vin0csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin0>;
+                                               remote-endpoint = <&csi40vin0>;
                                        };
                                };
                        };
 
                                        vin1csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin1>;
+                                               remote-endpoint = <&csi20vin1>;
                                        };
                                        vin1csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin1>;
+                                               remote-endpoint = <&csi40vin1>;
                                        };
                                };
                        };
 
                                        vin2csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin2>;
+                                               remote-endpoint = <&csi20vin2>;
                                        };
                                        vin2csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin2>;
+                                               remote-endpoint = <&csi40vin2>;
                                        };
                                };
                        };
 
                                        vin3csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin3>;
+                                               remote-endpoint = <&csi20vin3>;
                                        };
                                        vin3csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin3>;
+                                               remote-endpoint = <&csi40vin3>;
                                        };
                                };
                        };
 
                                        vin4csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin4>;
+                                               remote-endpoint = <&csi20vin4>;
                                        };
                                        vin4csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin4>;
+                                               remote-endpoint = <&csi40vin4>;
                                        };
                                };
                        };
 
                                        vin5csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin5>;
+                                               remote-endpoint = <&csi20vin5>;
                                        };
                                        vin5csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin5>;
+                                               remote-endpoint = <&csi40vin5>;
                                        };
                                };
                        };
 
                                        vin6csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin6>;
+                                               remote-endpoint = <&csi20vin6>;
                                        };
                                        vin6csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin6>;
+                                               remote-endpoint = <&csi40vin6>;
                                        };
                                };
                        };
 
                                        vin7csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin7>;
+                                               remote-endpoint = <&csi20vin7>;
                                        };
                                        vin7csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin7>;
+                                               remote-endpoint = <&csi40vin7>;
                                        };
                                };
                        };
                                };
                        };
 
+                       rcar_sound,ssiu {
+                               ssiu00: ssiu-0 {
+                                       dmas = <&audma0 0x15>, <&audma1 0x16>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu01: ssiu-1 {
+                                       dmas = <&audma0 0x35>, <&audma1 0x36>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu02: ssiu-2 {
+                                       dmas = <&audma0 0x37>, <&audma1 0x38>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu03: ssiu-3 {
+                                       dmas = <&audma0 0x47>, <&audma1 0x48>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu04: ssiu-4 {
+                                       dmas = <&audma0 0x3F>, <&audma1 0x40>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu05: ssiu-5 {
+                                       dmas = <&audma0 0x43>, <&audma1 0x44>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu06: ssiu-6 {
+                                       dmas = <&audma0 0x4F>, <&audma1 0x50>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu07: ssiu-7 {
+                                       dmas = <&audma0 0x53>, <&audma1 0x54>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu10: ssiu-8 {
+                                       dmas = <&audma0 0x49>, <&audma1 0x4a>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu11: ssiu-9 {
+                                       dmas = <&audma0 0x4B>, <&audma1 0x4C>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu12: ssiu-10 {
+                                       dmas = <&audma0 0x57>, <&audma1 0x58>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu13: ssiu-11 {
+                                       dmas = <&audma0 0x59>, <&audma1 0x5A>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu14: ssiu-12 {
+                                       dmas = <&audma0 0x5F>, <&audma1 0x60>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu15: ssiu-13 {
+                                       dmas = <&audma0 0xC3>, <&audma1 0xC4>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu16: ssiu-14 {
+                                       dmas = <&audma0 0xC7>, <&audma1 0xC8>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu17: ssiu-15 {
+                                       dmas = <&audma0 0xCB>, <&audma1 0xCC>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu20: ssiu-16 {
+                                       dmas = <&audma0 0x63>, <&audma1 0x64>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu21: ssiu-17 {
+                                       dmas = <&audma0 0x67>, <&audma1 0x68>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu22: ssiu-18 {
+                                       dmas = <&audma0 0x6B>, <&audma1 0x6C>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu23: ssiu-19 {
+                                       dmas = <&audma0 0x6D>, <&audma1 0x6E>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu24: ssiu-20 {
+                                       dmas = <&audma0 0xCF>, <&audma1 0xCE>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu25: ssiu-21 {
+                                       dmas = <&audma0 0xEB>, <&audma1 0xEC>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu26: ssiu-22 {
+                                       dmas = <&audma0 0xED>, <&audma1 0xEE>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu27: ssiu-23 {
+                                       dmas = <&audma0 0xEF>, <&audma1 0xF0>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu30: ssiu-24 {
+                                       dmas = <&audma0 0x6f>, <&audma1 0x70>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu31: ssiu-25 {
+                                       dmas = <&audma0 0x21>, <&audma1 0x22>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu32: ssiu-26 {
+                                       dmas = <&audma0 0x23>, <&audma1 0x24>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu33: ssiu-27 {
+                                       dmas = <&audma0 0x25>, <&audma1 0x26>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu34: ssiu-28 {
+                                       dmas = <&audma0 0x27>, <&audma1 0x28>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu35: ssiu-29 {
+                                       dmas = <&audma0 0x29>, <&audma1 0x2A>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu36: ssiu-30 {
+                                       dmas = <&audma0 0x2B>, <&audma1 0x2C>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu37: ssiu-31 {
+                                       dmas = <&audma0 0x2D>, <&audma1 0x2E>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu40: ssiu-32 {
+                                       dmas =  <&audma0 0x71>, <&audma1 0x72>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu41: ssiu-33 {
+                                       dmas = <&audma0 0x17>, <&audma1 0x18>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu42: ssiu-34 {
+                                       dmas = <&audma0 0x19>, <&audma1 0x1A>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu43: ssiu-35 {
+                                       dmas = <&audma0 0x1B>, <&audma1 0x1C>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu44: ssiu-36 {
+                                       dmas = <&audma0 0x1D>, <&audma1 0x1E>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu45: ssiu-37 {
+                                       dmas = <&audma0 0x1F>, <&audma1 0x20>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu46: ssiu-38 {
+                                       dmas = <&audma0 0x31>, <&audma1 0x32>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu47: ssiu-39 {
+                                       dmas = <&audma0 0x33>, <&audma1 0x34>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu50: ssiu-40 {
+                                       dmas = <&audma0 0x73>, <&audma1 0x74>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu60: ssiu-41 {
+                                       dmas = <&audma0 0x75>, <&audma1 0x76>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu70: ssiu-42 {
+                                       dmas = <&audma0 0x79>, <&audma1 0x7a>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu80: ssiu-43 {
+                                       dmas = <&audma0 0x7b>, <&audma1 0x7c>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu90: ssiu-44 {
+                                       dmas = <&audma0 0x7d>, <&audma1 0x7e>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu91: ssiu-45 {
+                                       dmas = <&audma0 0x7F>, <&audma1 0x80>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu92: ssiu-46 {
+                                       dmas = <&audma0 0x81>, <&audma1 0x82>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu93: ssiu-47 {
+                                       dmas = <&audma0 0x83>, <&audma1 0x84>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu94: ssiu-48 {
+                                       dmas = <&audma0 0xA3>, <&audma1 0xA4>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu95: ssiu-49 {
+                                       dmas = <&audma0 0xA5>, <&audma1 0xA6>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu96: ssiu-50 {
+                                       dmas = <&audma0 0xA7>, <&audma1 0xA8>;
+                                       dma-names = "rx", "tx";
+                               };
+                               ssiu97: ssiu-51 {
+                                       dmas = <&audma0 0xA9>, <&audma1 0xAA>;
+                                       dma-names = "rx", "tx";
+                               };
+                       };
+
                        rcar_sound,ssi {
                                ssi0: ssi-0 {
                                        interrupts = <GIC_SPI 370 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x01>, <&audma1 0x02>, <&audma0 0x15>, <&audma1 0x16>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x01>, <&audma1 0x02>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi1: ssi-1 {
                                        interrupts = <GIC_SPI 371 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x03>, <&audma1 0x04>, <&audma0 0x49>, <&audma1 0x4a>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x03>, <&audma1 0x04>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi2: ssi-2 {
                                        interrupts = <GIC_SPI 372 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x05>, <&audma1 0x06>, <&audma0 0x63>, <&audma1 0x64>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x05>, <&audma1 0x06>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi3: ssi-3 {
                                        interrupts = <GIC_SPI 373 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x07>, <&audma1 0x08>, <&audma0 0x6f>, <&audma1 0x70>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x07>, <&audma1 0x08>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi4: ssi-4 {
                                        interrupts = <GIC_SPI 374 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x09>, <&audma1 0x0a>, <&audma0 0x71>, <&audma1 0x72>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x09>, <&audma1 0x0a>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi5: ssi-5 {
                                        interrupts = <GIC_SPI 375 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x0b>, <&audma1 0x0c>, <&audma0 0x73>, <&audma1 0x74>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x0b>, <&audma1 0x0c>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi6: ssi-6 {
                                        interrupts = <GIC_SPI 376 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x0d>, <&audma1 0x0e>, <&audma0 0x75>, <&audma1 0x76>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x0d>, <&audma1 0x0e>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi7: ssi-7 {
                                        interrupts = <GIC_SPI 377 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x0f>, <&audma1 0x10>, <&audma0 0x79>, <&audma1 0x7a>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x0f>, <&audma1 0x10>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi8: ssi-8 {
                                        interrupts = <GIC_SPI 378 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x11>, <&audma1 0x12>, <&audma0 0x7b>, <&audma1 0x7c>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x11>, <&audma1 0x12>;
+                                       dma-names = "rx", "tx";
                                };
                                ssi9: ssi-9 {
                                        interrupts = <GIC_SPI 379 IRQ_TYPE_LEVEL_HIGH>;
-                                       dmas = <&audma0 0x13>, <&audma1 0x14>, <&audma0 0x7d>, <&audma1 0x7e>;
-                                       dma-names = "rx", "tx", "rxu", "txu";
+                                       dmas = <&audma0 0x13>, <&audma1 0x14>;
+                                       dma-names = "rx", "tx";
                                };
                        };
 
                        compatible = "generic-ohci";
                        reg = <0 0xee080000 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        phys = <&usb2_phy0>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
-                       resets = <&cpg 703>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        status = "disabled";
                };
 
                        compatible = "generic-ehci";
                        reg = <0 0xee080100 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        phys = <&usb2_phy0>;
                        phy-names = "usb";
-                       companion= <&ohci0>;
+                       companion = <&ohci0>;
                        power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
-                       resets = <&cpg 703>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        status = "disabled";
                };
 
                        clocks = <&cpg CPG_MOD 702>;
                        phys = <&usb2_phy1>;
                        phy-names = "usb";
-                       companion= <&ohci1>;
+                       companion = <&ohci1>;
                        power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
                        resets = <&cpg 702>;
                        status = "disabled";
                                     "renesas,rcar-gen3-usb2-phy";
                        reg = <0 0xee080200 0 0x700>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
-                       resets = <&cpg 703>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        #phy-cells = <0>;
                        status = "disabled";
                };
 
                du: display@feb00000 {
                        compatible = "renesas,du-r8a7796";
-                       reg = <0 0xfeb00000 0 0x70000>,
-                             <0 0xfeb90000 0 0x14>;
-                       reg-names = "du", "lvds.0";
+                       reg = <0 0xfeb00000 0 0x70000>;
                        interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>,
                                     <GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>,
                                     <GIC_SPI 269 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 724>,
                                 <&cpg CPG_MOD 723>,
-                                <&cpg CPG_MOD 722>,
-                                <&cpg CPG_MOD 727>;
-                       clock-names = "du.0", "du.1", "du.2", "lvds.0";
+                                <&cpg CPG_MOD 722>;
+                       clock-names = "du.0", "du.1", "du.2";
                        status = "disabled";
 
                        vsps = <&vspd0 &vspd1 &vspd2>;
                                port@2 {
                                        reg = <2>;
                                        du_out_lvds0: endpoint {
+                                               remote-endpoint = <&lvds0_in>;
+                                       };
+                               };
+                       };
+               };
+
+               lvds0: lvds@feb90000 {
+                       compatible = "renesas,r8a7796-lvds";
+                       reg = <0 0xfeb90000 0 0x14>;
+                       clocks = <&cpg CPG_MOD 727>;
+                       power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+                       resets = <&cpg 727>;
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+                                       lvds0_in: endpoint {
+                                               remote-endpoint = <&du_out_lvds0>;
+                                       };
+                               };
+                               port@1 {
+                                       reg = <1>;
+                                       lvds0_out: endpoint {
                                        };
                                };
                        };
                        cooling-maps {
                                map0 {
                                        trip = <&sensor1_passive>;
-                                       cooling-device = <&a57_0 5 5>;
+                                       cooling-device = <&a57_0 5 5>, <&a57_1 5 5>;
                                };
                        };
                };
                        cooling-maps {
                                map0 {
                                        trip = <&sensor2_passive>;
-                                       cooling-device = <&a57_0 5 5>;
+                                       cooling-device = <&a57_0 5 5>, <&a57_1 5 5>;
                                };
                        };
                };
                        cooling-maps {
                                map0 {
                                        trip = <&sensor3_passive>;
-                                       cooling-device = <&a57_0 5 5>;
+                                       cooling-device = <&a57_0 5 5>, <&a57_1 5 5>;
                                };
                        };
                };
diff --git a/arch/arm/dts/r8a77965-m3nulcb-u-boot.dts b/arch/arm/dts/r8a77965-m3nulcb-u-boot.dts
new file mode 100644 (file)
index 0000000..8ecfc7a
--- /dev/null
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Device Tree Source extras for U-Boot for the ULCB board
+ *
+ * Copyright (C) 2018 Marek Vasut <marek.vasut@gmail.com>
+ */
+
+#include "r8a77965-m3nulcb.dts"
+#include "r8a77965-u-boot.dtsi"
+
+/ {
+       cpld {
+               compatible = "renesas,ulcb-cpld";
+               status = "okay";
+               gpio-sck = <&gpio6 8 0>;
+               gpio-mosi = <&gpio6 7 0>;
+               gpio-miso = <&gpio6 10 0>;
+               gpio-sstbz = <&gpio2 3 0>;
+       };
+};
+
+&sdhi0 {
+       sd-uhs-sdr12;
+       sd-uhs-sdr25;
+       sd-uhs-sdr104;
+       max-frequency = <208000000>;
+       status = "okay";
+};
+
+&sdhi2 {
+       mmc-hs400-1_8v;
+       max-frequency = <200000000>;
+       status = "okay";
+};
diff --git a/arch/arm/dts/r8a77965-m3nulcb.dts b/arch/arm/dts/r8a77965-m3nulcb.dts
new file mode 100644 (file)
index 0000000..964078b
--- /dev/null
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Device Tree Source for the M3NULCB (R-Car Starter Kit Pro) board
+ *
+ * Copyright (C) 2018 Renesas Electronics Corp.
+ * Copyright (C) 2018 Cogent Embedded, Inc.
+ */
+
+/dts-v1/;
+#include "r8a77965.dtsi"
+#include "ulcb.dtsi"
+
+/ {
+       model = "Renesas M3NULCB board based on r8a77965";
+       compatible = "renesas,m3nulcb", "renesas,r8a77965";
+
+       memory@48000000 {
+               device_type = "memory";
+               /* first 128MB is reserved for secure area. */
+               reg = <0x0 0x48000000 0x0 0x78000000>;
+       };
+};
+
+&du {
+       clocks = <&cpg CPG_MOD 724>,
+                <&cpg CPG_MOD 723>,
+                <&cpg CPG_MOD 721>,
+                <&versaclock5 1>,
+                <&versaclock5 3>,
+                <&versaclock5 2>;
+       clock-names = "du.0", "du.1", "du.3",
+                     "dclkin.0", "dclkin.1", "dclkin.3";
+};
index cfc0f74081592580e0e5a490d3a0c5d176da0ef3..208ed56bd1194c05719af6071a1e8c4fa58524be 100644 (file)
@@ -8,23 +8,6 @@
 #include "r8a77965-salvator-x.dts"
 #include "r8a77965-u-boot.dtsi"
 
-&vcc_sdhi0 {
-       u-boot,off-on-delay-us = <20000>;
-};
-
-&vcc_sdhi3 {
-       u-boot,off-on-delay-us = <20000>;
-};
-
-&sdhi2_pins {
-       groups = "sdhi2_data8", "sdhi2_ctrl", "sdhi2_ds";
-       power-source = <1800>;
-};
-
-&sdhi2_pins_uhs {
-       groups = "sdhi2_data8", "sdhi2_ctrl", "sdhi2_ds";
-};
-
 &sdhi0 {
        sd-uhs-sdr12;
        sd-uhs-sdr25;
index ca80ef8f29ee98265b7f2c4b0565e196c24c9b20..81ee0961e26b889f6b58e5b66930216389bd22a2 100644 (file)
        u-boot,dm-pre-reloc;
 };
 
-&soc {
-       rpc: rpc@0xee200000 {
-               compatible = "renesas,rpc-r8a77965", "renesas,rpc";
-               reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
-               clocks = <&cpg CPG_MOD 917>;
-               bank-width = <2>;
-               status = "disabled";
+/ {
+       soc {
+               rpc: rpc@0xee200000 {
+                       compatible = "renesas,rpc-r8a77965", "renesas,rpc";
+                       reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
+                       clocks = <&cpg CPG_MOD 917>;
+                       bank-width = <2>;
+                       status = "disabled";
+               };
        };
 };
index ef8cdc6a16b4f4bfbbd458bf5f236fc64dd63bd5..9763d108e183b13d1067eac9c8d08af1f3ed24a4 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * Device Tree Source for the r8a77965 SoC
+ * Device Tree Source for the R-Car M3-N (R8A77965) SoC
  *
  * Copyright (C) 2018 Jacopo Mondi <jacopo+renesas@jmondi.org>
  *
@@ -12,7 +12,7 @@
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 #include <dt-bindings/power/r8a77965-sysc.h>
 
-#define CPG_AUDIO_CLK_I                10
+#define CPG_AUDIO_CLK_I                R8A77965_CLK_S0D4
 
 / {
        compatible = "renesas,r8a77965";
                clock-frequency = <0>;
        };
 
+       cluster0_opp: opp_table0 {
+               compatible = "operating-points-v2";
+               opp-shared;
+
+               opp-500000000 {
+                       opp-hz = /bits/ 64 <500000000>;
+                       opp-microvolt = <830000>;
+                       clock-latency-ns = <300000>;
+               };
+               opp-1000000000 {
+                       opp-hz = /bits/ 64 <1000000000>;
+                       opp-microvolt = <830000>;
+                       clock-latency-ns = <300000>;
+               };
+               opp-1500000000 {
+                       opp-hz = /bits/ 64 <1500000000>;
+                       opp-microvolt = <830000>;
+                       clock-latency-ns = <300000>;
+                       opp-suspend;
+               };
+               opp-1600000000 {
+                       opp-hz = /bits/ 64 <1600000000>;
+                       opp-microvolt = <900000>;
+                       clock-latency-ns = <300000>;
+                       turbo-mode;
+               };
+               opp-1700000000 {
+                       opp-hz = /bits/ 64 <1700000000>;
+                       opp-microvolt = <900000>;
+                       clock-latency-ns = <300000>;
+                       turbo-mode;
+               };
+               opp-1800000000 {
+                       opp-hz = /bits/ 64 <1800000000>;
+                       opp-microvolt = <960000>;
+                       clock-latency-ns = <300000>;
+                       turbo-mode;
+               };
+       };
+
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
 
                a57_0: cpu@0 {
-                       compatible = "arm,cortex-a57", "arm,armv8";
+                       compatible = "arm,cortex-a57";
                        reg = <0x0>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A77965_PD_CA57_CPU0>;
                        next-level-cache = <&L2_CA57>;
                        enable-method = "psci";
+                       clocks = <&cpg CPG_CORE R8A77965_CLK_Z>;
+                       operating-points-v2 = <&cluster0_opp>;
                };
 
                a57_1: cpu@1 {
-                       compatible = "arm,cortex-a57", "arm,armv8";
+                       compatible = "arm,cortex-a57";
                        reg = <0x1>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A77965_PD_CA57_CPU1>;
                        next-level-cache = <&L2_CA57>;
                        enable-method = "psci";
+                       clocks = <&cpg CPG_CORE R8A77965_CLK_Z>;
+                       operating-points-v2 = <&cluster0_opp>;
                };
 
                L2_CA57: cache-controller-0 {
                clock-frequency = <0>;
        };
 
-       soc: soc {
+       soc {
                compatible = "simple-bus";
                interrupt-parent = <&gic>;
                #address-cells = <2>;
                        power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
                        resets = <&cpg 522>;
                        #thermal-sensor-cells = <1>;
-                       status = "okay";
                };
 
                intc_ex: interrupt-controller@e61c0000 {
                };
 
                hsusb: usb@e6590000 {
-                       compatible = "renesas,usbhs-r8a7796",
+                       compatible = "renesas,usbhs-r8a77965",
                                     "renesas,rcar-gen3-usbhs";
-                       reg = <0 0xe6590000 0 0x100>;
+                       reg = <0 0xe6590000 0 0x200>;
                        interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 704>;
+                       clocks = <&cpg CPG_MOD 704>, <&cpg CPG_MOD 703>;
                        dmas = <&usb_dmac0 0>, <&usb_dmac0 1>,
                               <&usb_dmac1 0>, <&usb_dmac1 1>;
                        dma-names = "ch0", "ch1", "ch2", "ch3";
                        phys = <&usb2_phy0>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
-                       resets = <&cpg 704>;
+                       resets = <&cpg 704>, <&cpg 703>;
                        status = "disabled";
                };
 
                        resets = <&cpg 219>;
                        #dma-cells = <1>;
                        dma-channels = <16>;
+                       iommus = <&ipmmu_ds0 0>, <&ipmmu_ds0 1>,
+                              <&ipmmu_ds0 2>, <&ipmmu_ds0 3>,
+                              <&ipmmu_ds0 4>, <&ipmmu_ds0 5>,
+                              <&ipmmu_ds0 6>, <&ipmmu_ds0 7>,
+                              <&ipmmu_ds0 8>, <&ipmmu_ds0 9>,
+                              <&ipmmu_ds0 10>, <&ipmmu_ds0 11>,
+                              <&ipmmu_ds0 12>, <&ipmmu_ds0 13>,
+                              <&ipmmu_ds0 14>, <&ipmmu_ds0 15>;
                };
 
                dmac1: dma-controller@e7300000 {
                        resets = <&cpg 218>;
                        #dma-cells = <1>;
                        dma-channels = <16>;
+                       iommus = <&ipmmu_ds1 0>, <&ipmmu_ds1 1>,
+                              <&ipmmu_ds1 2>, <&ipmmu_ds1 3>,
+                              <&ipmmu_ds1 4>, <&ipmmu_ds1 5>,
+                              <&ipmmu_ds1 6>, <&ipmmu_ds1 7>,
+                              <&ipmmu_ds1 8>, <&ipmmu_ds1 9>,
+                              <&ipmmu_ds1 10>, <&ipmmu_ds1 11>,
+                              <&ipmmu_ds1 12>, <&ipmmu_ds1 13>,
+                              <&ipmmu_ds1 14>, <&ipmmu_ds1 15>;
                };
 
                dmac2: dma-controller@e7310000 {
                        resets = <&cpg 217>;
                        #dma-cells = <1>;
                        dma-channels = <16>;
+                       iommus = <&ipmmu_ds1 16>, <&ipmmu_ds1 17>,
+                              <&ipmmu_ds1 18>, <&ipmmu_ds1 19>,
+                              <&ipmmu_ds1 20>, <&ipmmu_ds1 21>,
+                              <&ipmmu_ds1 22>, <&ipmmu_ds1 23>,
+                              <&ipmmu_ds1 24>, <&ipmmu_ds1 25>,
+                              <&ipmmu_ds1 26>, <&ipmmu_ds1 27>,
+                              <&ipmmu_ds1 28>, <&ipmmu_ds1 29>,
+                              <&ipmmu_ds1 30>, <&ipmmu_ds1 31>;
                };
 
                ipmmu_ds0: mmu@e6740000 {
                        #iommu-cells = <1>;
                };
 
-               ipmmu_ir: mmu@ff8b0000 {
-                       compatible = "renesas,ipmmu-r8a77965";
-                       reg = <0 0xff8b0000 0 0x1000>;
-                       renesas,ipmmu-main = <&ipmmu_mm 3>;
-                       power-domains = <&sysc R8A77965_PD_A3IR>;
-                       #iommu-cells = <1>;
-               };
-
                ipmmu_mm: mmu@e67b0000 {
                        compatible = "renesas,ipmmu-r8a77965";
                        reg = <0 0xe67b0000 0 0x1000>;
                        power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        phy-mode = "rgmii";
+                       iommus = <&ipmmu_ds0 16>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "disabled";
                };
 
+               can0: can@e6c30000 {
+                       compatible = "renesas,can-r8a77965",
+                                    "renesas,rcar-gen3-can";
+                       reg = <0 0xe6c30000 0 0x1000>;
+                       interrupts = <GIC_SPI 186 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 916>,
+                              <&cpg CPG_CORE R8A77965_CLK_CANFD>,
+                              <&can_clk>;
+                       clock-names = "clkp1", "clkp2", "can_clk";
+                       assigned-clocks = <&cpg CPG_CORE R8A77965_CLK_CANFD>;
+                       assigned-clock-rates = <40000000>;
+                       power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
+                       resets = <&cpg 916>;
+                       status = "disabled";
+               };
+
+               can1: can@e6c38000 {
+                       compatible = "renesas,can-r8a77965",
+                                    "renesas,rcar-gen3-can";
+                       reg = <0 0xe6c38000 0 0x1000>;
+                       interrupts = <GIC_SPI 187 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 915>,
+                              <&cpg CPG_CORE R8A77965_CLK_CANFD>,
+                              <&can_clk>;
+                       clock-names = "clkp1", "clkp2", "can_clk";
+                       assigned-clocks = <&cpg CPG_CORE R8A77965_CLK_CANFD>;
+                       assigned-clock-rates = <40000000>;
+                       power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
+                       resets = <&cpg 915>;
+                       status = "disabled";
+               };
+
+               canfd: can@e66c0000 {
+                       compatible = "renesas,r8a77965-canfd",
+                                    "renesas,rcar-gen3-canfd";
+                       reg = <0 0xe66c0000 0 0x8000>;
+                       interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>,
+                                  <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 914>,
+                              <&cpg CPG_CORE R8A77965_CLK_CANFD>,
+                              <&can_clk>;
+                       clock-names = "fck", "canfd", "can_clk";
+                       assigned-clocks = <&cpg CPG_CORE R8A77965_CLK_CANFD>;
+                       assigned-clock-rates = <40000000>;
+                       power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
+                       resets = <&cpg 914>;
+                       status = "disabled";
+
+                       channel0 {
+                               status = "disabled";
+                       };
+
+                       channel1 {
+                               status = "disabled";
+                       };
+               };
+
                pwm0: pwm@e6e30000 {
                        compatible = "renesas,pwm-r8a77965", "renesas,pwm-rcar";
                        reg = <0 0xe6e30000 0 8>;
                                 <&cpg CPG_CORE R8A77965_CLK_S3D1>,
                                 <&scif_clk>;
                        clock-names = "fck", "brg_int", "scif_clk";
+                       dmas = <&dmac1 0x13>, <&dmac1 0x12>,
+                              <&dmac2 0x13>, <&dmac2 0x12>;
+                       dma-names = "tx", "rx", "tx", "rx";
                        power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
                        resets = <&cpg 310>;
                        status = "disabled";
 
                                        vin0csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin0>;
+                                               remote-endpoint = <&csi20vin0>;
                                        };
                                        vin0csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin0>;
+                                               remote-endpoint = <&csi40vin0>;
                                        };
                                };
                        };
 
                                        vin1csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin1>;
+                                               remote-endpoint = <&csi20vin1>;
                                        };
                                        vin1csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin1>;
+                                               remote-endpoint = <&csi40vin1>;
                                        };
                                };
                        };
 
                                        vin2csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin2>;
+                                               remote-endpoint = <&csi20vin2>;
                                        };
                                        vin2csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin2>;
+                                               remote-endpoint = <&csi40vin2>;
                                        };
                                };
                        };
 
                                        vin3csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin3>;
+                                               remote-endpoint = <&csi20vin3>;
                                        };
                                        vin3csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin3>;
+                                               remote-endpoint = <&csi40vin3>;
                                        };
                                };
                        };
 
                                        vin4csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin4>;
+                                               remote-endpoint = <&csi20vin4>;
                                        };
                                        vin4csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin4>;
+                                               remote-endpoint = <&csi40vin4>;
                                        };
                                };
                        };
 
                                        vin5csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin5>;
+                                               remote-endpoint = <&csi20vin5>;
                                        };
                                        vin5csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin5>;
+                                               remote-endpoint = <&csi40vin5>;
                                        };
                                };
                        };
 
                                        vin6csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin6>;
+                                               remote-endpoint = <&csi20vin6>;
                                        };
                                        vin6csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin6>;
+                                               remote-endpoint = <&csi40vin6>;
                                        };
                                };
                        };
 
                                        vin7csi20: endpoint@0 {
                                                reg = <0>;
-                                               remote-endpoint= <&csi20vin7>;
+                                               remote-endpoint = <&csi20vin7>;
                                        };
                                        vin7csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin7>;
+                                               remote-endpoint = <&csi40vin7>;
                                        };
                                };
                        };
                };
 
                rcar_sound: sound@ec500000 {
+                       /*
+                        * #sound-dai-cells is required
+                        *
+                        * Single DAI : #sound-dai-cells = <0>; <&rcar_sound>;
+                        * Multi  DAI : #sound-dai-cells = <1>; <&rcar_sound N>;
+                        */
+                       /*
+                        * #clock-cells is required for audio_clkout0/1/2/3
+                        *
+                        * clkout       : #clock-cells = <0>;   <&rcar_sound>;
+                        * clkout0/1/2/3: #clock-cells = <1>;   <&rcar_sound N>;
+                        */
+                       compatible =  "renesas,rcar_sound-r8a77965", "renesas,rcar_sound-gen3";
                        reg =   <0 0xec500000 0 0x1000>, /* SCU */
                                <0 0xec5a0000 0 0x100>,  /* ADG */
                                <0 0xec540000 0 0x1000>, /* SSIU */
                                <0 0xec541000 0 0x280>,  /* SSI */
                                <0 0xec740000 0 0x200>;  /* Audio DMAC peri peri*/
-                       /* placeholder */
+                       reg-names = "scu", "adg", "ssiu", "ssi", "audmapp";
+
+                       clocks = <&cpg CPG_MOD 1005>,
+                                <&cpg CPG_MOD 1006>, <&cpg CPG_MOD 1007>,
+                                <&cpg CPG_MOD 1008>, <&cpg CPG_MOD 1009>,
+                                <&cpg CPG_MOD 1010>, <&cpg CPG_MOD 1011>,
+                                <&cpg CPG_MOD 1012>, <&cpg CPG_MOD 1013>,
+                                <&cpg CPG_MOD 1014>, <&cpg CPG_MOD 1015>,
+                                <&cpg CPG_MOD 1022>, <&cpg CPG_MOD 1023>,
+                                <&cpg CPG_MOD 1024>, <&cpg CPG_MOD 1025>,
+                                <&cpg CPG_MOD 1026>, <&cpg CPG_MOD 1027>,
+                                <&cpg CPG_MOD 1028>, <&cpg CPG_MOD 1029>,
+                                <&cpg CPG_MOD 1030>, <&cpg CPG_MOD 1031>,
+                                <&cpg CPG_MOD 1020>, <&cpg CPG_MOD 1021>,
+                                <&cpg CPG_MOD 1020>, <&cpg CPG_MOD 1021>,
+                                <&cpg CPG_MOD 1019>, <&cpg CPG_MOD 1018>,
+                                <&audio_clk_a>, <&audio_clk_b>,
+                                <&audio_clk_c>,
+                                <&cpg CPG_CORE R8A77965_CLK_S0D4>;
+                       clock-names = "ssi-all",
+                                     "ssi.9", "ssi.8", "ssi.7", "ssi.6",
+                                     "ssi.5", "ssi.4", "ssi.3", "ssi.2",
+                                     "ssi.1", "ssi.0",
+                                     "src.9", "src.8", "src.7", "src.6",
+                                     "src.5", "src.4", "src.3", "src.2",
+                                     "src.1", "src.0",
+                                     "mix.1", "mix.0",
+                                     "ctu.1", "ctu.0",
+                                     "dvc.0", "dvc.1",
+                                     "clk_a", "clk_b", "clk_c", "clk_i";
+                       power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
+                       resets = <&cpg 1005>,
+                                <&cpg 1006>, <&cpg 1007>,
+                                <&cpg 1008>, <&cpg 1009>,
+                                <&cpg 1010>, <&cpg 1011>,
+                                <&cpg 1012>, <&cpg 1013>,
+                                <&cpg 1014>, <&cpg 1015>;
+                       reset-names = "ssi-all",
+                                     "ssi.9", "ssi.8", "ssi.7", "ssi.6",
+                                     "ssi.5", "ssi.4", "ssi.3", "ssi.2",
+                                     "ssi.1", "ssi.0";
+                       status = "disabled";
 
                        rcar_sound,dvc {
                                dvc0: dvc-0 {
+                                       dmas = <&audma1 0xbc>;
+                                       dma-names = "tx";
                                };
                                dvc1: dvc-1 {
+                                       dmas = <&audma1 0xbe>;
+                                       dma-names = "tx";
                                };
                        };
 
+                       rcar_sound,mix {
+                               mix0: mix-0 { };
+                               mix1: mix-1 { };
+                       };
+
+                       rcar_sound,ctu {
+                               ctu00: ctu-0 { };
+                               ctu01: ctu-1 { };
+                               ctu02: ctu-2 { };
+                               ctu03: ctu-3 { };
+                               ctu10: ctu-4 { };
+                               ctu11: ctu-5 { };
+                               ctu12: ctu-6 { };
+                               ctu13: ctu-7 { };
+                       };
+
                        rcar_sound,src {
                                src0: src-0 {
+                                       interrupts = <GIC_SPI 352 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x85>, <&audma1 0x9a>;
+                                       dma-names = "rx", "tx";
                                };
                                src1: src-1 {
+                                       interrupts = <GIC_SPI 353 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x87>, <&audma1 0x9c>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src2: src-2 {
+                                       interrupts = <GIC_SPI 354 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x89>, <&audma1 0x9e>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src3: src-3 {
+                                       interrupts = <GIC_SPI 355 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x8b>, <&audma1 0xa0>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src4: src-4 {
+                                       interrupts = <GIC_SPI 356 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x8d>, <&audma1 0xb0>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src5: src-5 {
+                                       interrupts = <GIC_SPI 357 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x8f>, <&audma1 0xb2>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src6: src-6 {
+                                       interrupts = <GIC_SPI 358 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x91>, <&audma1 0xb4>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src7: src-7 {
+                                       interrupts = <GIC_SPI 359 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x93>, <&audma1 0xb6>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src8: src-8 {
+                                       interrupts = <GIC_SPI 360 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x95>, <&audma1 0xb8>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src9: src-9 {
+                                       interrupts = <GIC_SPI 361 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x97>, <&audma1 0xba>;
+                                       dma-names = "rx", "tx";
                                };
                        };
 
                        rcar_sound,ssi {
                                ssi0: ssi-0 {
+                                       interrupts = <GIC_SPI 370 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x01>, <&audma1 0x02>, <&audma0 0x15>, <&audma1 0x16>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
                                };
                                ssi1: ssi-1 {
+                                       interrupts = <GIC_SPI 371 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x03>, <&audma1 0x04>, <&audma0 0x49>, <&audma1 0x4a>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
                                };
-                       };
-
-                       ports {
-                               #address-cells = <1>;
-                               #size-cells = <0>;
-                               port@0 {
-                                       reg = <0>;
+                               ssi2: ssi-2 {
+                                       interrupts = <GIC_SPI 372 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x05>, <&audma1 0x06>, <&audma0 0x63>, <&audma1 0x64>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
                                };
-                               port@1 {
-                                       reg = <1>;
+                               ssi3: ssi-3 {
+                                       interrupts = <GIC_SPI 373 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x07>, <&audma1 0x08>, <&audma0 0x6f>, <&audma1 0x70>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
+                               };
+                               ssi4: ssi-4 {
+                                       interrupts = <GIC_SPI 374 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x09>, <&audma1 0x0a>, <&audma0 0x71>, <&audma1 0x72>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
+                               };
+                               ssi5: ssi-5 {
+                                       interrupts = <GIC_SPI 375 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x0b>, <&audma1 0x0c>, <&audma0 0x73>, <&audma1 0x74>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
+                               };
+                               ssi6: ssi-6 {
+                                       interrupts = <GIC_SPI 376 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x0d>, <&audma1 0x0e>, <&audma0 0x75>, <&audma1 0x76>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
+                               };
+                               ssi7: ssi-7 {
+                                       interrupts = <GIC_SPI 377 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x0f>, <&audma1 0x10>, <&audma0 0x79>, <&audma1 0x7a>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
+                               };
+                               ssi8: ssi-8 {
+                                       interrupts = <GIC_SPI 378 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x11>, <&audma1 0x12>, <&audma0 0x7b>, <&audma1 0x7c>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
+                               };
+                               ssi9: ssi-9 {
+                                       interrupts = <GIC_SPI 379 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x13>, <&audma1 0x14>, <&audma0 0x7d>, <&audma1 0x7e>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
                                };
                        };
                };
 
+               audma0: dma-controller@ec700000 {
+                       compatible = "renesas,dmac-r8a77965",
+                                    "renesas,rcar-dmac";
+                       reg = <0 0xec700000 0 0x10000>;
+                       interrupts = <GIC_SPI 350 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 320 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 321 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 322 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 323 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 324 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 325 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 326 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 327 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 328 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 329 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 330 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 331 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 332 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 333 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 334 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 335 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "error",
+                                       "ch0", "ch1", "ch2", "ch3",
+                                       "ch4", "ch5", "ch6", "ch7",
+                                       "ch8", "ch9", "ch10", "ch11",
+                                       "ch12", "ch13", "ch14", "ch15";
+                       clocks = <&cpg CPG_MOD 502>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
+                       resets = <&cpg 502>;
+                       #dma-cells = <1>;
+                       dma-channels = <16>;
+               };
+
+               audma1: dma-controller@ec720000 {
+                       compatible = "renesas,dmac-r8a77965",
+                                    "renesas,rcar-dmac";
+                       reg = <0 0xec720000 0 0x10000>;
+                       interrupts = <GIC_SPI 351 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 336 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 337 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 338 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 339 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 340 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 341 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 342 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 343 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 344 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 345 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 346 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 347 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 348 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 349 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 382 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 383 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "error",
+                                       "ch0", "ch1", "ch2", "ch3",
+                                       "ch4", "ch5", "ch6", "ch7",
+                                       "ch8", "ch9", "ch10", "ch11",
+                                       "ch12", "ch13", "ch14", "ch15";
+                       clocks = <&cpg CPG_MOD 501>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
+                       resets = <&cpg 501>;
+                       #dma-cells = <1>;
+                       dma-channels = <16>;
+               };
+
                xhci0: usb@ee000000 {
                        compatible = "renesas,xhci-r8a77965",
                                     "renesas,rcar-gen3-xhci";
                        compatible = "generic-ohci";
                        reg = <0 0xee080000 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        phys = <&usb2_phy0>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
-                       resets = <&cpg 703>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        status = "disabled";
                };
 
                        compatible = "generic-ehci";
                        reg = <0 0xee080100 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        phys = <&usb2_phy0>;
                        phy-names = "usb";
                        companion = <&ohci0>;
                        power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
-                       resets = <&cpg 703>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        status = "disabled";
                };
 
                                     "renesas,rcar-gen3-usb2-phy";
                        reg = <0 0xee080200 0 0x700>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
-                       resets = <&cpg 703>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        #phy-cells = <0>;
                        status = "disabled";
                };
                        compatible = "renesas,usb2-phy-r8a77965",
                                     "renesas,rcar-gen3-usb2-phy";
                        reg = <0 0xee0a0200 0 0x700>;
-                       clocks = <&cpg CPG_MOD 703>;
+                       clocks = <&cpg CPG_MOD 702>;
                        power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
-                       resets = <&cpg 703>;
+                       resets = <&cpg 702>;
                        #phy-cells = <0>;
                        status = "disabled";
                };
                        status = "disabled";
                };
 
+               sata: sata@ee300000 {
+                       compatible = "renesas,sata-r8a77965",
+                                    "renesas,rcar-gen3-sata";
+                       reg = <0 0xee300000 0 0x200000>;
+                       interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 815>;
+                       power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
+                       resets = <&cpg 815>;
+                       status = "disabled";
+               };
+
                gic: interrupt-controller@f1010000 {
                        compatible = "arm,gic-400";
                        #interrupt-cells = <3>;
                        status = "disabled";
                };
 
+               fdp1@fe940000 {
+                       compatible = "renesas,fdp1";
+                       reg = <0 0xfe940000 0 0x2400>;
+                       interrupts = <GIC_SPI 262 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 119>;
+                       power-domains = <&sysc R8A77965_PD_A3VP>;
+                       resets = <&cpg 119>;
+                       renesas,fcp = <&fcpf0>;
+               };
+
                fcpf0: fcp@fe950000 {
                        compatible = "renesas,fcpf";
                        reg = <0 0xfe950000 0 0x200>;
                                port@2 {
                                        reg = <2>;
                                        du_out_lvds0: endpoint {
+                                               remote-endpoint = <&lvds0_in>;
+                                       };
+                               };
+                       };
+               };
+
+               lvds0: lvds@feb90000 {
+                       compatible = "renesas,r8a77965-lvds";
+                       reg = <0 0xfeb90000 0 0x14>;
+                       clocks = <&cpg CPG_MOD 727>;
+                       power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
+                       resets = <&cpg 727>;
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+                                       lvds0_in: endpoint {
+                                               remote-endpoint = <&du_out_lvds0>;
+                                       };
+                               };
+                               port@1 {
+                                       reg = <1>;
+                                       lvds0_out: endpoint {
                                        };
                                };
                        };
                };
        };
 
-       timer {
-               compatible = "arm,armv8-timer";
-               interrupts-extended = <&gic GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
-                                     <&gic GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
-                                     <&gic GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
-                                     <&gic GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>;
-       };
-
        thermal-zones {
                sensor_thermal1: sensor-thermal1 {
                        polling-delay-passive = <250>;
                };
        };
 
+       timer {
+               compatible = "arm,armv8-timer";
+               interrupts-extended = <&gic GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
+                                     <&gic GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
+                                     <&gic GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
+                                     <&gic GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>;
+       };
+
        /* External USB clocks - can be overridden by the board */
        usb3s0_clk: usb3s0 {
                compatible = "fixed-clock";
index 5b17f1d1f0bb3000be06ff27ae2038010873ee38..eb868eda4147a31e157c35c0c438358759032754 100644 (file)
@@ -44,7 +44,7 @@
        flash0: spi-flash@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "s25fs512s", "spi-flash", "jedec,spi-nor";
+               compatible = "s25fs512s", "jedec,spi-nor";
                spi-max-frequency = <50000000>;
                spi-tx-bus-width = <1>;
                spi-rx-bus-width = <1>;
index 2903fdb52371bb340d414ef3e28dd489b2ae7839..eabab7ce5823197cea46b9a8b236e3deea74b317 100644 (file)
        u-boot,dm-pre-reloc;
 };
 
-&soc {
-       rpc: rpc@0xee200000 {
-               compatible = "renesas,rpc-r8a77970", "renesas,rpc";
-               reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
-               clocks = <&cpg CPG_MOD 917>;
-               bank-width = <2>;
-               status = "disabled";
+/ {
+       soc {
+               rpc: rpc@0xee200000 {
+                       compatible = "renesas,rpc-r8a77970", "renesas,rpc";
+                       reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
+                       clocks = <&cpg CPG_MOD 917>;
+                       bank-width = <2>;
+                       status = "disabled";
+               };
        };
 };
index a0808c90ab84c8d5d87360bf28018784ef55a3e0..5b6164d4b8e3630dee473449e53c07d8d85901d2 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * Device Tree Source for the r8a77970 SoC
+ * Device Tree Source for the R-Car V3M (R8A77970) SoC
  *
  * Copyright (C) 2016-2017 Renesas Electronics Corp.
  * Copyright (C) 2017 Cogent Embedded, Inc.
                i2c4 = &i2c4;
        };
 
+       /* External CAN clock - to be overridden by boards that provide it */
+       can_clk: can {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <0>;
+       };
+
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
 
                a53_0: cpu@0 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0>;
                        clocks = <&cpg CPG_CORE R8A77970_CLK_Z2>;
                        power-domains = <&sysc R8A77970_PD_CA53_CPU0>;
@@ -40,7 +47,7 @@
 
                a53_1: cpu@1 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <1>;
                        clocks = <&cpg CPG_CORE R8A77970_CLK_Z2>;
                        power-domains = <&sysc R8A77970_PD_CA53_CPU1>;
                method = "smc";
        };
 
-       /* External CAN clock - to be overridden by boards that provide it */
-       can_clk: can {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <0>;
-       };
-
        /* External SCIF clock - to be overridden by boards that provide it */
        scif_clk: scif {
                compatible = "fixed-clock";
@@ -96,7 +96,7 @@
                clock-frequency = <0>;
        };
 
-       soc: soc {
+       soc {
                compatible = "simple-bus";
                interrupt-parent = <&gic>;
 
                        reg = <0 0xe6060000 0 0x504>;
                };
 
+               cmt0: timer@e60f0000 {
+                       compatible = "renesas,r8a77970-cmt0",
+                                    "renesas,rcar-gen3-cmt0";
+                       reg = <0 0xe60f0000 0 0x1004>;
+                       interrupts = <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 303>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 303>;
+                       status = "disabled";
+               };
+
+               cmt1: timer@e6130000 {
+                       compatible = "renesas,r8a77970-cmt1",
+                                    "renesas,rcar-gen3-cmt1";
+                       reg = <0 0xe6130000 0 0x1004>;
+                       interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 302>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 302>;
+                       status = "disabled";
+               };
+
+               cmt2: timer@e6140000 {
+                       compatible = "renesas,r8a77970-cmt1",
+                                    "renesas,rcar-gen3-cmt1";
+                       reg = <0 0xe6140000 0 0x1004>;
+                       interrupts = <GIC_SPI 258 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 259 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 260 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 261 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 262 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 263 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 264 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 265 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 301>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 301>;
+                       status = "disabled";
+               };
+
+               cmt3: timer@e6148000 {
+                       compatible = "renesas,r8a77970-cmt1",
+                                    "renesas,rcar-gen3-cmt1";
+                       reg = <0 0xe6148000 0 0x1004>;
+                       interrupts = <GIC_SPI 273 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 274 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 275 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 276 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 277 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 278 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 279 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 280 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 300>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 300>;
+                       status = "disabled";
+               };
+
                cpg: clock-controller@e6150000 {
                        compatible = "renesas,r8a77970-cpg-mssr";
                        reg = <0 0xe6150000 0 0x1000>;
                        #power-domain-cells = <1>;
                };
 
+               thermal: thermal@e6190000 {
+                       compatible = "renesas,thermal-r8a77970";
+                       reg =  <0 0xe6190000 0 0x10
+                               0 0xe6190100 0 0x120>;
+                       interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 522>;
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 522>;
+                       #thermal-sensor-cells = <0>;
+               };
+
                intc_ex: interrupt-controller@e61c0000 {
                        compatible = "renesas,intc-ex-r8a77970", "renesas,irqc";
                        #interrupt-cells = <2>;
                        resets = <&cpg 407>;
                };
 
+               tmu0: timer@e61e0000 {
+                       compatible = "renesas,tmu-r8a77970", "renesas,tmu";
+                       reg = <0 0xe61e0000 0 0x30>;
+                       interrupts = <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 125>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 125>;
+                       status = "disabled";
+               };
+
+               tmu1: timer@e6fc0000 {
+                       compatible = "renesas,tmu-r8a77970", "renesas,tmu";
+                       reg = <0 0xe6fc0000 0 0x30>;
+                       interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 124>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 124>;
+                       status = "disabled";
+               };
+
+               tmu2: timer@e6fd0000 {
+                       compatible = "renesas,tmu-r8a77970", "renesas,tmu";
+                       reg = <0 0xe6fd0000 0 0x30>;
+                       interrupts = <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 304 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 305 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 123>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 123>;
+                       status = "disabled";
+               };
+
+               tmu3: timer@e6fe0000 {
+                       compatible = "renesas,tmu-r8a77970", "renesas,tmu";
+                       reg = <0 0xe6fe0000 0 0x30>;
+                       interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 122>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 122>;
+                       status = "disabled";
+               };
+
+               tmu4: timer@ffc00000 {
+                       compatible = "renesas,tmu-r8a77970", "renesas,tmu";
+                       reg = <0 0xffc00000 0 0x30>;
+                       interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 121>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 121>;
+                       status = "disabled";
+               };
+
                i2c0: i2c@e6500000 {
                        compatible = "renesas,i2c-r8a77970",
                                     "renesas,rcar-gen3-i2c";
                        status = "disabled";
                };
 
+               pwm0: pwm@e6e30000 {
+                       compatible = "renesas,pwm-r8a77970", "renesas,pwm-rcar";
+                       reg = <0 0xe6e30000 0 8>;
+                       #pwm-cells = <2>;
+                       clocks = <&cpg CPG_MOD 523>;
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 523>;
+                       status = "disabled";
+               };
+
+               pwm1: pwm@e6e31000 {
+                       compatible = "renesas,pwm-r8a77970", "renesas,pwm-rcar";
+                       reg = <0 0xe6e31000 0 8>;
+                       #pwm-cells = <2>;
+                       clocks = <&cpg CPG_MOD 523>;
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 523>;
+                       status = "disabled";
+               };
+
+               pwm2: pwm@e6e32000 {
+                       compatible = "renesas,pwm-r8a77970", "renesas,pwm-rcar";
+                       reg = <0 0xe6e32000 0 8>;
+                       #pwm-cells = <2>;
+                       clocks = <&cpg CPG_MOD 523>;
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 523>;
+                       status = "disabled";
+               };
+
+               pwm3: pwm@e6e33000 {
+                       compatible = "renesas,pwm-r8a7790", "renesas,pwm-rcar";
+                       reg = <0 0xe6e33000 0 8>;
+                       #pwm-cells = <2>;
+                       clocks = <&cpg CPG_MOD 523>;
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 523>;
+                       status = "disabled";
+               };
+
+               pwm4: pwm@e6e34000 {
+                       compatible = "renesas,pwm-r8a77970", "renesas,pwm-rcar";
+                       reg = <0 0xe6e34000 0 8>;
+                       #pwm-cells = <2>;
+                       clocks = <&cpg CPG_MOD 523>;
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 523>;
+                       status = "disabled";
+               };
+
                scif0: serial@e6e60000 {
                        compatible = "renesas,scif-r8a77970",
                                     "renesas,rcar-gen3-scif",
                        status = "disabled";
                };
 
+               tpu: pwm@e6e80000 {
+                       compatible = "renesas,tpu-r8a77970", "renesas,tpu";
+                       reg = <0 0xe6e80000 0 0x148>;
+                       interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 304>;
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 304>;
+                       #pwm-cells = <3>;
+                       status = "disabled";
+               };
+
+               msiof0: spi@e6e90000 {
+                       compatible = "renesas,msiof-r8a77970",
+                                    "renesas,rcar-gen3-msiof";
+                       reg = <0 0xe6e90000 0 0x64>;
+                       interrupts = <GIC_SPI 156 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 211>;
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 211>;
+                       dmas = <&dmac1 0x41>, <&dmac1 0x40>,
+                              <&dmac2 0x41>, <&dmac2 0x40>;
+                       dma-names = "tx", "rx", "tx", "rx";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               msiof1: spi@e6ea0000 {
+                       compatible = "renesas,msiof-r8a77970",
+                                    "renesas,rcar-gen3-msiof";
+                       reg = <0 0xe6ea0000 0 0x0064>;
+                       interrupts = <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 210>;
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 210>;
+                       dmas = <&dmac1 0x43>, <&dmac1 0x42>,
+                              <&dmac2 0x43>, <&dmac2 0x42>;
+                       dma-names = "tx", "rx", "tx", "rx";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               msiof2: spi@e6c00000 {
+                       compatible = "renesas,msiof-r8a77970",
+                                    "renesas,rcar-gen3-msiof";
+                       reg = <0 0xe6c00000 0 0x0064>;
+                       interrupts = <GIC_SPI 158 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 209>;
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 209>;
+                       dmas = <&dmac1 0x45>, <&dmac1 0x44>,
+                              <&dmac2 0x45>, <&dmac2 0x44>;
+                       dma-names = "tx", "rx", "tx", "rx";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               msiof3: spi@e6c10000 {
+                       compatible = "renesas,msiof-r8a77970",
+                                    "renesas,rcar-gen3-msiof";
+                       reg = <0 0xe6c10000 0 0x0064>;
+                       interrupts = <GIC_SPI 159 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 208>;
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 208>;
+                       dmas = <&dmac1 0x47>, <&dmac1 0x46>,
+                              <&dmac2 0x47>, <&dmac2 0x46>;
+                       dma-names = "tx", "rx", "tx", "rx";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
 
                vin0: video@e6ef0000 {
                        compatible = "renesas,vin-r8a77970";
 
                                        vin0csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin0>;
+                                               remote-endpoint = <&csi40vin0>;
                                        };
                                };
                        };
 
                                        vin1csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin1>;
+                                               remote-endpoint = <&csi40vin1>;
                                        };
                                };
                        };
 
                                        vin2csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin2>;
+                                               remote-endpoint = <&csi40vin2>;
                                        };
                                };
                        };
 
                                        vin3csi40: endpoint@2 {
                                                reg = <2>;
-                                               remote-endpoint= <&csi40vin3>;
+                                               remote-endpoint = <&csi40vin3>;
                                        };
                                };
                        };
                        #iommu-cells = <1>;
                };
 
+               mmc0: mmc@ee140000 {
+                       compatible = "renesas,sdhi-r8a77970",
+                                    "renesas,rcar-gen3-sdhi";
+                       reg = <0 0xee140000 0 0x2000>;
+                       interrupts = <GIC_SPI 165 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 314>;
+                       power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
+                       resets = <&cpg 314>;
+                       max-frequency = <200000000>;
+                       status = "disabled";
+               };
+
                gic: interrupt-controller@f1010000 {
                        compatible = "arm,gic-400";
                        #interrupt-cells = <3>;
                };
        };
 
+       thermal-zones {
+               cpu-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <1000>;
+                       thermal-sensors = <&thermal>;
+
+                       trips {
+                               cpu-crit {
+                                       temperature = <120000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                       };
+               };
+       };
+
        timer {
                compatible = "arm,armv8-timer";
                interrupts-extended = <&gic GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
index 4c1669e022cc6599fe2600b7aa6d0ef93e8152c8..1ce22e5c0f773ee1f6b654e3c1ce3d59d4140cd4 100644 (file)
 #include "r8a77990-ebisu.dts"
 #include "r8a77990-u-boot.dtsi"
 
-/ {
-       reg_1p8v: regulator0 {
-               compatible = "regulator-fixed";
-               regulator-name = "fixed-1.8V";
-               regulator-min-microvolt = <1800000>;
-               regulator-max-microvolt = <1800000>;
-               regulator-boot-on;
-               regulator-always-on;
-       };
-
-       reg_3p3v: regulator1 {
-               compatible = "regulator-fixed";
-               regulator-name = "fixed-3.3V";
-               regulator-min-microvolt = <3300000>;
-               regulator-max-microvolt = <3300000>;
-               regulator-boot-on;
-               regulator-always-on;
-       };
-
-       vcc_sdhi0: regulator-vcc-sdhi0 {
-               compatible = "regulator-fixed";
-
-               regulator-name = "SDHI0 Vcc";
-               regulator-min-microvolt = <3300000>;
-               regulator-max-microvolt = <3300000>;
-
-               gpio = <&gpio5 17 GPIO_ACTIVE_HIGH>;
-               enable-active-high;
-               u-boot,off-on-delay-us = <20000>;
-       };
-
-       vccq_sdhi0: regulator-vccq-sdhi0 {
-               compatible = "regulator-gpio";
-
-               regulator-name = "SDHI0 VccQ";
-               regulator-min-microvolt = <1800000>;
-               regulator-max-microvolt = <3300000>;
-
-               gpios = <&gpio5 18 GPIO_ACTIVE_HIGH>;
-               gpios-states = <1>;
-               states = <3300000 1
-                         1800000 0>;
-       };
-
-       vcc_sdhi1: regulator-vcc-sdhi1 {
-               compatible = "regulator-fixed";
-
-               regulator-name = "SDHI1 Vcc";
-               regulator-min-microvolt = <3300000>;
-               regulator-max-microvolt = <3300000>;
-
-               gpio = <&gpio0 4 GPIO_ACTIVE_HIGH>;
-               enable-active-high;
-               u-boot,off-on-delay-us = <20000>;
-       };
-
-       vccq_sdhi1: regulator-vccq-sdhi1 {
-               compatible = "regulator-gpio";
-
-               regulator-name = "SDHI1 VccQ";
-               regulator-min-microvolt = <1800000>;
-               regulator-max-microvolt = <3300000>;
-
-               gpios = <&gpio3 15 GPIO_ACTIVE_HIGH>;
-               gpios-states = <1>;
-               states = <3300000 1
-                         1800000 0>;
-       };
-};
-
 &pfc {
        pinctrl-0 = <&scif_clk_pins>;
        pinctrl-names = "default";
 
-       scif2_pins: scif2 {
-               groups = "scif2_data_a";
-               function = "scif2";
-       };
-
        scif_clk_pins: scif_clk {
                groups = "scif_clk_a";
                function = "scif_clk";
        };
-
-       sdhi0_pins: sd0 {
-               groups = "sdhi0_data4", "sdhi0_ctrl";
-               function = "sdhi0";
-               power-source = <3300>;
-       };
-
-       sdhi0_pins_uhs: sd0_uhs {
-               groups = "sdhi0_data4", "sdhi0_ctrl";
-               function = "sdhi0";
-               power-source = <1800>;
-       };
-
-       sdhi1_pins: sd1 {
-               groups = "sdhi1_data4", "sdhi1_ctrl";
-               function = "sdhi1";
-               power-source = <3300>;
-       };
-
-       sdhi1_pins_uhs: sd1_uhs {
-               groups = "sdhi1_data4", "sdhi1_ctrl";
-               function = "sdhi1";
-               power-source = <1800>;
-       };
-
-       sdhi3_pins: sd2 {
-               groups = "sdhi3_data8", "sdhi3_ctrl", "sdhi3_ds";
-               function = "sdhi3";
-               power-source = <1800>;
-       };
-
-       sdhi3_pins_uhs: sd2_uhs {
-               groups = "sdhi3_data8", "sdhi3_ctrl", "sdhi3_ds";
-               function = "sdhi3";
-               power-source = <1800>;
-       };
-};
-
-&scif2 {
-       pinctrl-0 = <&scif2_pins>;
-       pinctrl-names = "default";
-       status = "okay";
 };
 
 &sdhi0 {
-       /* full size SD */
-       pinctrl-0 = <&sdhi0_pins>;
-       pinctrl-1 = <&sdhi0_pins_uhs>;
-       pinctrl-names = "default", "state_uhs";
-
-       vmmc-supply = <&vcc_sdhi0>;
-       vqmmc-supply = <&vccq_sdhi0>;
-       cd-gpios = <&gpio3 12 GPIO_ACTIVE_LOW>;
-       wp-gpios = <&gpio3 13 GPIO_ACTIVE_HIGH>;
-       bus-width = <4>;
        sd-uhs-sdr12;
        sd-uhs-sdr25;
-       sd-uhs-sdr50;
-       sd-uhs-sdr104;
-       status = "okay";
        max-frequency = <208000000>;
 };
 
 &sdhi1 {
-       /* microSD */
-       pinctrl-0 = <&sdhi1_pins>;
-       pinctrl-1 = <&sdhi1_pins_uhs>;
-       pinctrl-names = "default", "state_uhs";
-
-       vmmc-supply = <&vcc_sdhi1>;
-       vqmmc-supply = <&vccq_sdhi1>;
-       cd-gpios = <&gpio3 14 GPIO_ACTIVE_LOW>;
-       bus-width = <4>;
        sd-uhs-sdr12;
        sd-uhs-sdr25;
-       sd-uhs-sdr50;
-       sd-uhs-sdr104;
-       status = "okay";
        max-frequency = <208000000>;
 };
-
-&sdhi3 {
-       /* used for on-board 8bit eMMC */
-       pinctrl-0 = <&sdhi3_pins>;
-       pinctrl-1 = <&sdhi3_pins_uhs>;
-       pinctrl-names = "default", "state_uhs";
-
-       vmmc-supply = <&reg_3p3v>;
-       vqmmc-supply = <&reg_1p8v>;
-       bus-width = <8>;
-       mmc-hs200-1_8v;
-       mmc-hs400-1_8v;
-       non-removable;
-       status = "okay";
-};
index 2bc3a4884b0031f713391f046dabc2712f54f0aa..144c0820cf60c73178b43279ca73772c341b7554 100644 (file)
                /* first 128MB is reserved for secure area. */
                reg = <0x0 0x48000000 0x0 0x38000000>;
        };
+
+       audio_clkout: audio-clkout {
+               /*
+                * This is same as <&rcar_sound 0>
+                * but needed to avoid cs2000/rcar_sound probe dead-lock
+                */
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <11289600>;
+       };
+
+       backlight: backlight {
+               compatible = "pwm-backlight";
+               pwms = <&pwm3 0 50000>;
+
+               brightness-levels = <512 511 505 494 473 440 392 327 241 133 0>;
+               default-brightness-level = <10>;
+
+               power-supply = <&reg_12p0v>;
+       };
+
+       cvbs-in {
+               compatible = "composite-video-connector";
+               label = "CVBS IN";
+
+               port {
+                       cvbs_con: endpoint {
+                               remote-endpoint = <&adv7482_ain7>;
+                       };
+               };
+       };
+
+       hdmi-in {
+               compatible = "hdmi-connector";
+               label = "HDMI IN";
+               type = "a";
+
+               port {
+                       hdmi_in_con: endpoint {
+                               remote-endpoint = <&adv7482_hdmi>;
+                       };
+               };
+       };
+
+       hdmi-out {
+               compatible = "hdmi-connector";
+               type = "a";
+
+               port {
+                       hdmi_con_out: endpoint {
+                               remote-endpoint = <&adv7511_out>;
+                       };
+               };
+       };
+
+       lvds-decoder {
+               compatible = "thine,thc63lvd1024";
+               vcc-supply = <&reg_3p3v>;
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       port@0 {
+                               reg = <0>;
+                               thc63lvd1024_in: endpoint {
+                                       remote-endpoint = <&lvds0_out>;
+                               };
+                       };
+
+                       port@2 {
+                               reg = <2>;
+                               thc63lvd1024_out: endpoint {
+                                       remote-endpoint = <&adv7511_in>;
+                               };
+                       };
+               };
+       };
+
+       vga {
+               compatible = "vga-connector";
+
+               port {
+                       vga_in: endpoint {
+                               remote-endpoint = <&adv7123_out>;
+                       };
+               };
+       };
+
+       vga-encoder {
+               compatible = "adi,adv7123";
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       port@0 {
+                               reg = <0>;
+                               adv7123_in: endpoint {
+                                       remote-endpoint = <&du_out_rgb>;
+                               };
+                       };
+                       port@1 {
+                               reg = <1>;
+                               adv7123_out: endpoint {
+                                       remote-endpoint = <&vga_in>;
+                               };
+                       };
+               };
+       };
+
+       reg_1p8v: regulator0 {
+               compatible = "regulator-fixed";
+               regulator-name = "fixed-1.8V";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               regulator-boot-on;
+               regulator-always-on;
+       };
+
+       reg_3p3v: regulator1 {
+               compatible = "regulator-fixed";
+               regulator-name = "fixed-3.3V";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-boot-on;
+               regulator-always-on;
+       };
+
+       vbus0_usb2: regulator-vbus0-usb2 {
+               compatible = "regulator-fixed";
+
+               regulator-name = "USB20_VBUS_CN";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+
+               gpio = <&gpio6 4 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       rsnd_ak4613: sound {
+               compatible = "simple-audio-card";
+
+               simple-audio-card,name = "rsnd-ak4613";
+               simple-audio-card,format = "left_j";
+               simple-audio-card,bitclock-master = <&sndcpu>;
+               simple-audio-card,frame-master = <&sndcpu>;
+
+               sndcpu: simple-audio-card,cpu {
+                       sound-dai = <&rcar_sound>;
+               };
+
+               sndcodec: simple-audio-card,codec {
+                       sound-dai = <&ak4613>;
+               };
+       };
+
+       x12_clk: x12 {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <24576000>;
+       };
+
+       reg_12p0v: regulator2 {
+               compatible = "regulator-fixed";
+               regulator-name = "D12.0V";
+               regulator-min-microvolt = <12000000>;
+               regulator-max-microvolt = <12000000>;
+               regulator-boot-on;
+               regulator-always-on;
+       };
+
+       x13_clk: x13 {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <74250000>;
+       };
+
+       vcc_sdhi0: regulator-vcc-sdhi0 {
+               compatible = "regulator-fixed";
+
+               regulator-name = "SDHI0 Vcc";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+
+               gpio = <&gpio5 17 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       vccq_sdhi0: regulator-vccq-sdhi0 {
+               compatible = "regulator-gpio";
+
+               regulator-name = "SDHI0 VccQ";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <3300000>;
+
+               gpios = <&gpio5 18 GPIO_ACTIVE_HIGH>;
+               gpios-states = <1>;
+               states = <3300000 1
+                         1800000 0>;
+       };
+
+       vcc_sdhi1: regulator-vcc-sdhi1 {
+               compatible = "regulator-fixed";
+
+               regulator-name = "SDHI1 Vcc";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+
+               gpio = <&gpio0 4 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       vccq_sdhi1: regulator-vccq-sdhi1 {
+               compatible = "regulator-gpio";
+
+               regulator-name = "SDHI1 VccQ";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <3300000>;
+
+               gpios = <&gpio3 15 GPIO_ACTIVE_HIGH>;
+               gpios-states = <1>;
+               states = <3300000 1
+                         1800000 0>;
+       };
+};
+
+&audio_clk_a {
+       clock-frequency = <22579200>;
 };
 
 &avb {
        pinctrl-names = "default";
        renesas,no-ether-link;
        phy-handle = <&phy0>;
-       phy-mode = "rgmii-txid";
        status = "okay";
 
        phy0: ethernet-phy@0 {
        };
 };
 
+&canfd {
+       pinctrl-0 = <&canfd0_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+
+       channel0 {
+               status = "okay";
+       };
+};
+
+&csi40 {
+       status = "okay";
+
+       ports {
+               port@0 {
+                       reg = <0>;
+
+                       csi40_in: endpoint {
+                               clock-lanes = <0>;
+                               data-lanes = <1 2>;
+                               remote-endpoint = <&adv7482_txa>;
+                       };
+               };
+       };
+};
+
+&du {
+       pinctrl-0 = <&du_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+
+       clocks = <&cpg CPG_MOD 724>,
+                <&cpg CPG_MOD 723>,
+                <&x13_clk>;
+       clock-names = "du.0", "du.1", "dclkin.0";
+
+       ports {
+               port@0 {
+                       endpoint {
+                               remote-endpoint = <&adv7123_in>;
+                       };
+               };
+       };
+};
+
 &ehci0 {
+       dr_mode = "otg";
        status = "okay";
 };
 
        clock-frequency = <48000000>;
 };
 
+&hsusb {
+       dr_mode = "otg";
+       status = "okay";
+};
+
+&i2c0 {
+       status = "okay";
+
+       hdmi-encoder@39 {
+               compatible = "adi,adv7511w";
+               reg = <0x39>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <1 IRQ_TYPE_LEVEL_LOW>;
+
+               adi,input-depth = <8>;
+               adi,input-colorspace = "rgb";
+               adi,input-clock = "1x";
+               adi,input-style = <1>;
+               adi,input-justification = "evenly";
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       port@0 {
+                               reg = <0>;
+                               adv7511_in: endpoint {
+                                       remote-endpoint = <&thc63lvd1024_out>;
+                               };
+                       };
+
+                       port@1 {
+                               reg = <1>;
+                               adv7511_out: endpoint {
+                                       remote-endpoint = <&hdmi_con_out>;
+                               };
+                       };
+               };
+       };
+
+       video-receiver@70 {
+               compatible = "adi,adv7482";
+               reg = <0x70>;
+
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               interrupt-parent = <&gpio0>;
+               interrupt-names = "intrq1", "intrq2";
+               interrupts = <7 IRQ_TYPE_LEVEL_LOW>,
+                            <17 IRQ_TYPE_LEVEL_LOW>;
+
+               port@7 {
+                       reg = <7>;
+
+                       adv7482_ain7: endpoint {
+                               remote-endpoint = <&cvbs_con>;
+                       };
+               };
+
+               port@8 {
+                       reg = <8>;
+
+                       adv7482_hdmi: endpoint {
+                               remote-endpoint = <&hdmi_in_con>;
+                       };
+               };
+
+               port@a {
+                       reg = <0xa>;
+
+                       adv7482_txa: endpoint {
+                               clock-lanes = <0>;
+                               data-lanes = <1 2>;
+                               remote-endpoint = <&csi40_in>;
+                       };
+               };
+       };
+};
+
+&i2c3 {
+       status = "okay";
+
+       ak4613: codec@10 {
+               compatible = "asahi-kasei,ak4613";
+               #sound-dai-cells = <0>;
+               reg = <0x10>;
+               clocks = <&rcar_sound 3>;
+
+               asahi-kasei,in1-single-end;
+               asahi-kasei,in2-single-end;
+               asahi-kasei,out1-single-end;
+               asahi-kasei,out2-single-end;
+               asahi-kasei,out3-single-end;
+               asahi-kasei,out4-single-end;
+               asahi-kasei,out5-single-end;
+               asahi-kasei,out6-single-end;
+       };
+
+       cs2000: clk-multiplier@4f {
+               #clock-cells = <0>;
+               compatible = "cirrus,cs2000-cp";
+               reg = <0x4f>;
+               clocks = <&audio_clkout>, <&x12_clk>;
+               clock-names = "clk_in", "ref_clk";
+
+               assigned-clocks = <&cs2000>;
+               assigned-clock-rates = <24576000>; /* 1/1 divide */
+       };
+};
+
+&lvds0 {
+       status = "okay";
+
+       clocks = <&cpg CPG_MOD 727>,
+                <&x13_clk>,
+                <&extal_clk>;
+       clock-names = "fck", "dclkin.0", "extal";
+
+       ports {
+               port@1 {
+                       lvds0_out: endpoint {
+                               remote-endpoint = <&thc63lvd1024_in>;
+                       };
+               };
+       };
+};
+
+&lvds1 {
+       clocks = <&cpg CPG_MOD 727>,
+                <&x13_clk>,
+                <&extal_clk>;
+       clock-names = "fck", "dclkin.0", "extal";
+};
+
 &ohci0 {
+       dr_mode = "otg";
+       status = "okay";
+};
+
+&pcie_bus_clk {
+       clock-frequency = <100000000>;
+};
+
+&pciec0 {
        status = "okay";
 };
 
                };
        };
 
+       canfd0_pins: canfd0 {
+               groups = "canfd0_data";
+               function = "canfd0";
+       };
+
+       du_pins: du {
+               groups = "du_rgb888", "du_sync", "du_disp", "du_clk_out_0";
+               function = "du";
+       };
+
+       pwm3_pins: pwm3 {
+               groups = "pwm3_b";
+               function = "pwm3";
+       };
+
+       pwm5_pins: pwm5 {
+               groups = "pwm5_a";
+               function = "pwm5";
+       };
+
+       sdhi0_pins: sd0 {
+               groups = "sdhi0_data4", "sdhi0_ctrl";
+               function = "sdhi0";
+               power-source = <3300>;
+       };
+
+       sdhi0_pins_uhs: sd0_uhs {
+               groups = "sdhi0_data4", "sdhi0_ctrl";
+               function = "sdhi0";
+               power-source = <1800>;
+       };
+
+       sdhi1_pins: sd1 {
+               groups = "sdhi1_data4", "sdhi1_ctrl";
+               function = "sdhi1";
+               power-source = <3300>;
+       };
+
+       sdhi1_pins_uhs: sd1_uhs {
+               groups = "sdhi1_data4", "sdhi1_ctrl";
+               function = "sdhi1";
+               power-source = <1800>;
+       };
+
+       sdhi3_pins: sd3 {
+               groups = "sdhi3_data8", "sdhi3_ctrl", "sdhi3_ds";
+               function = "sdhi3";
+               power-source = <1800>;
+       };
+
+       sound_pins: sound {
+               groups = "ssi01239_ctrl", "ssi0_data", "ssi1_data";
+               function = "ssi";
+       };
+
+       sound_clk_pins: sound_clk {
+               groups = "audio_clk_a", "audio_clk_b_a", "audio_clk_c_a",
+                        "audio_clkout_a", "audio_clkout1_a";
+               function = "audio_clk";
+       };
+
+       scif2_pins: scif2 {
+               groups = "scif2_data_a";
+               function = "scif2";
+       };
+
        usb0_pins: usb {
-               groups = "usb0_b";
+               groups = "usb0_b", "usb0_id";
                function = "usb0";
        };
 
        };
 };
 
+&pwm3 {
+       pinctrl-0 = <&pwm3_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
+};
+
+&pwm5 {
+       pinctrl-0 = <&pwm5_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
+};
+
+&rcar_sound {
+       pinctrl-0 = <&sound_pins &sound_clk_pins>;
+       pinctrl-names = "default";
+
+       /* Single DAI */
+       #sound-dai-cells = <0>;
+
+       /* audio_clkout0/1/2/3 */
+       #clock-cells = <1>;
+       clock-frequency = <12288000 11289600>;
+       clkout-lr-synchronous;
+
+       status = "okay";
+
+       /* update <audio_clk_b> to <cs2000> */
+       clocks = <&cpg CPG_MOD 1005>,
+                <&cpg CPG_MOD 1006>, <&cpg CPG_MOD 1007>,
+                <&cpg CPG_MOD 1008>, <&cpg CPG_MOD 1009>,
+                <&cpg CPG_MOD 1010>, <&cpg CPG_MOD 1011>,
+                <&cpg CPG_MOD 1012>, <&cpg CPG_MOD 1013>,
+                <&cpg CPG_MOD 1014>, <&cpg CPG_MOD 1015>,
+                <&cpg CPG_MOD 1022>, <&cpg CPG_MOD 1023>,
+                <&cpg CPG_MOD 1024>, <&cpg CPG_MOD 1025>,
+                <&cpg CPG_MOD 1026>, <&cpg CPG_MOD 1027>,
+                <&cpg CPG_MOD 1028>, <&cpg CPG_MOD 1029>,
+                <&cpg CPG_MOD 1030>, <&cpg CPG_MOD 1031>,
+                <&cpg CPG_MOD 1020>, <&cpg CPG_MOD 1021>,
+                <&cpg CPG_MOD 1020>, <&cpg CPG_MOD 1021>,
+                <&cpg CPG_MOD 1019>, <&cpg CPG_MOD 1018>,
+                <&audio_clk_a>, <&cs2000>, <&audio_clk_c>,
+                <&cpg CPG_CORE R8A77990_CLK_ZA2>;
+
+       rcar_sound,dai {
+               dai0 {
+                       playback = <&ssi0 &src0 &dvc0>;
+                       capture  = <&ssi1 &src1 &dvc1>;
+               };
+       };
+
+};
+
 &rwdt {
        timeout-sec = <60>;
        status = "okay";
 };
 
 &scif2 {
+       pinctrl-0 = <&scif2_pins>;
+       pinctrl-names = "default";
+
        status = "okay";
 };
 
+&ssi1 {
+       shared-pin;
+};
+
 &usb2_phy0 {
        pinctrl-0 = <&usb0_pins>;
        pinctrl-names = "default";
 
+       vbus-supply = <&vbus0_usb2>;
+       status = "okay";
+};
+
+&usb3_peri0 {
+       companion = <&xhci0>;
+       status = "okay";
+};
+
+&vin4 {
        status = "okay";
 };
 
 
        status = "okay";
 };
+
+&sdhi0 {
+       pinctrl-0 = <&sdhi0_pins>;
+       pinctrl-1 = <&sdhi0_pins_uhs>;
+       pinctrl-names = "default", "state_uhs";
+
+       vmmc-supply = <&vcc_sdhi0>;
+       vqmmc-supply = <&vccq_sdhi0>;
+       cd-gpios = <&gpio3 12 GPIO_ACTIVE_LOW>;
+       wp-gpios = <&gpio3 13 GPIO_ACTIVE_HIGH>;
+       bus-width = <4>;
+       sd-uhs-sdr50;
+       sd-uhs-sdr104;
+       status = "okay";
+};
+
+&sdhi1 {
+       pinctrl-0 = <&sdhi1_pins>;
+       pinctrl-1 = <&sdhi1_pins_uhs>;
+       pinctrl-names = "default", "state_uhs";
+
+       vmmc-supply = <&vcc_sdhi1>;
+       vqmmc-supply = <&vccq_sdhi1>;
+       cd-gpios = <&gpio3 14 GPIO_ACTIVE_LOW>;
+       bus-width = <4>;
+       sd-uhs-sdr50;
+       sd-uhs-sdr104;
+       status = "okay";
+};
+
+&sdhi3 {
+       /* used for on-board 8bit eMMC */
+       pinctrl-0 = <&sdhi3_pins>;
+       pinctrl-1 = <&sdhi3_pins>;
+       pinctrl-names = "default", "state_uhs";
+
+       vmmc-supply = <&reg_3p3v>;
+       vqmmc-supply = <&reg_1p8v>;
+       mmc-hs200-1_8v;
+       mmc-hs400-1_8v;
+       bus-width = <8>;
+       non-removable;
+       status = "okay";
+};
index 288e57e4bca0511c6c68df523995d08f86bc5c19..ddf8b626271513e2abc4a01b5ffe9b084772769f 100644 (file)
@@ -7,36 +7,14 @@
 
 #include "r8a779x-u-boot.dtsi"
 
-&soc {
-       rpc: rpc@0xee200000 {
-               compatible = "renesas,rpc-r8a77990", "renesas,rpc";
-               reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
-               clocks = <&cpg CPG_MOD 917>;
-               bank-width = <2>;
-               status = "disabled";
-       };
-
-       sdhi0: sd@ee100000 {
-               compatible = "renesas,sdhi-r8a77990";
-               reg = <0 0xee100000 0 0x2000>;
-               clocks = <&cpg CPG_MOD 314>;
-               max-frequency = <200000000>;
-               status = "disabled";
-       };
-
-       sdhi1: sd@ee120000 {
-               compatible = "renesas,sdhi-r8a77990";
-               reg = <0 0xee120000 0 0x2000>;
-               clocks = <&cpg CPG_MOD 313>;
-               max-frequency = <200000000>;
-               status = "disabled";
-       };
-
-       sdhi3: sd@ee160000 {
-               compatible = "renesas,sdhi-r8a77990";
-               reg = <0 0xee160000 0 0x2000>;
-               clocks = <&cpg CPG_MOD 311>;
-               max-frequency = <200000000>;
-               status = "disabled";
+/ {
+       soc {
+               rpc: rpc@0xee200000 {
+                       compatible = "renesas,rpc-r8a77990", "renesas,rpc";
+                       reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
+                       clocks = <&cpg CPG_MOD 917>;
+                       bank-width = <2>;
+                       status = "disabled";
+               };
        };
 };
index ae89260baad9fd4d3ad1ec6dbef9c6a7bf1e118f..d2ad665fe2d925db040e50d2d9341b5535ddd167 100644 (file)
@@ -1,11 +1,11 @@
 /* SPDX-License-Identifier: GPL-2.0 */
 /*
- * Device Tree Source for the r8a77990 SoC
+ * Device Tree Source for the R-Car E3 (R8A77990) SoC
  *
- * Copyright (C) 2018 Renesas Electronics Corp.
+ * Copyright (C) 2018-2019 Renesas Electronics Corp.
  */
 
-#include <dt-bindings/clock/renesas-cpg-mssr.h>
+#include <dt-bindings/clock/r8a77990-cpg-mssr.h>
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 #include <dt-bindings/power/r8a77990-sysc.h>
 
        #address-cells = <2>;
        #size-cells = <2>;
 
+       aliases {
+               i2c0 = &i2c0;
+               i2c1 = &i2c1;
+               i2c2 = &i2c2;
+               i2c3 = &i2c3;
+               i2c4 = &i2c4;
+               i2c5 = &i2c5;
+               i2c6 = &i2c6;
+               i2c7 = &i2c7;
+       };
+
+       /*
+        * The external audio clocks are configured as 0 Hz fixed frequency
+        * clocks by default.
+        * Boards that provide audio clocks should override them.
+        */
+       audio_clk_a: audio_clk_a {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <0>;
+       };
+
+       audio_clk_b: audio_clk_b {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <0>;
+       };
+
+       audio_clk_c: audio_clk_c {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <0>;
+       };
+
+       /* External CAN clock - to be overridden by boards that provide it */
+       can_clk: can {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <0>;
+       };
+
+       cluster1_opp: opp_table10 {
+               compatible = "operating-points-v2";
+               opp-shared;
+               opp-800000000 {
+                       opp-hz = /bits/ 64 <800000000>;
+                       opp-microvolt = <820000>;
+                       clock-latency-ns = <300000>;
+               };
+               opp-1000000000 {
+                       opp-hz = /bits/ 64 <1000000000>;
+                       opp-microvolt = <820000>;
+                       clock-latency-ns = <300000>;
+               };
+               opp-1200000000 {
+                       opp-hz = /bits/ 64 <1200000000>;
+                       opp-microvolt = <820000>;
+                       clock-latency-ns = <300000>;
+                       opp-suspend;
+               };
+       };
+
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
 
                a53_0: cpu@0 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0>;
                        device_type = "cpu";
-                       power-domains = <&sysc 5>;
+                       power-domains = <&sysc R8A77990_PD_CA53_CPU0>;
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
+                       clocks =<&cpg CPG_CORE R8A77990_CLK_Z2>;
+                       operating-points-v2 = <&cluster1_opp>;
                };
 
                a53_1: cpu@1 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <1>;
                        device_type = "cpu";
-                       power-domains = <&sysc 6>;
+                       power-domains = <&sysc R8A77990_PD_CA53_CPU1>;
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
+                       clocks =<&cpg CPG_CORE R8A77990_CLK_Z2>;
+                       operating-points-v2 = <&cluster1_opp>;
                };
 
                L2_CA53: cache-controller-0 {
                        compatible = "cache";
-                       power-domains = <&sysc 21>;
+                       power-domains = <&sysc R8A77990_PD_CA53_SCU>;
                        cache-unified;
                        cache-level = <2>;
                };
                clock-frequency = <0>;
        };
 
+       /* External PCIe clock - can be overridden by the board */
+       pcie_bus_clk: pcie_bus {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <0>;
+       };
+
        pmu_a53 {
                compatible = "arm,cortex-a53-pmu";
                interrupts-extended = <&gic GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>,
                method = "smc";
        };
 
+       /* External SCIF clock - to be overridden by boards that provide it */
+       scif_clk: scif {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <0>;
+       };
+
        soc: soc {
                compatible = "simple-bus";
                interrupt-parent = <&gic>;
                                     "renesas,rcar-gen3-wdt";
                        reg = <0 0xe6020000 0 0x0c>;
                        clocks = <&cpg CPG_MOD 402>;
-                       power-domains = <&sysc 32>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
                        resets = <&cpg 402>;
                        status = "disabled";
                };
                        #interrupt-cells = <2>;
                        interrupt-controller;
                        clocks = <&cpg CPG_MOD 912>;
-                       power-domains = <&sysc 32>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
                        resets = <&cpg 912>;
                };
 
                        #interrupt-cells = <2>;
                        interrupt-controller;
                        clocks = <&cpg CPG_MOD 911>;
-                       power-domains = <&sysc 32>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
                        resets = <&cpg 911>;
                };
 
                        #interrupt-cells = <2>;
                        interrupt-controller;
                        clocks = <&cpg CPG_MOD 910>;
-                       power-domains = <&sysc 32>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
                        resets = <&cpg 910>;
                };
 
                        #interrupt-cells = <2>;
                        interrupt-controller;
                        clocks = <&cpg CPG_MOD 909>;
-                       power-domains = <&sysc 32>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
                        resets = <&cpg 909>;
                };
 
                        #interrupt-cells = <2>;
                        interrupt-controller;
                        clocks = <&cpg CPG_MOD 908>;
-                       power-domains = <&sysc 32>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
                        resets = <&cpg 908>;
                };
 
                        #interrupt-cells = <2>;
                        interrupt-controller;
                        clocks = <&cpg CPG_MOD 907>;
-                       power-domains = <&sysc 32>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
                        resets = <&cpg 907>;
                };
 
                        #interrupt-cells = <2>;
                        interrupt-controller;
                        clocks = <&cpg CPG_MOD 906>;
-                       power-domains = <&sysc 32>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
                        resets = <&cpg 906>;
                };
 
                        reg = <0 0xe6060000 0 0x508>;
                };
 
+               i2c_dvfs: i2c@e60b0000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "renesas,iic-r8a77990";
+                       reg = <0 0xe60b0000 0 0x15>;
+                       interrupts = <GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 926>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 926>;
+                       dmas = <&dmac0 0x11>, <&dmac0 0x10>;
+                       dma-names = "tx", "rx";
+                       status = "disabled";
+               };
+
                cpg: clock-controller@e6150000 {
                        compatible = "renesas,r8a77990-cpg-mssr";
                        reg = <0 0xe6150000 0 0x1000>;
                        #power-domain-cells = <1>;
                };
 
+               thermal: thermal@e6190000 {
+                       compatible = "renesas,thermal-r8a77990";
+                       reg = <0 0xe6190000 0 0x10>, <0 0xe6190100 0 0x38>;
+                       interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 522>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 522>;
+                       #thermal-sensor-cells = <0>;
+               };
+
+               intc_ex: interrupt-controller@e61c0000 {
+                       compatible = "renesas,intc-ex-r8a77990", "renesas,irqc";
+                       #interrupt-cells = <2>;
+                       interrupt-controller;
+                       reg = <0 0xe61c0000 0 0x200>;
+                       interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 407>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 407>;
+               };
+
+               i2c0: i2c@e6500000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "renesas,i2c-r8a77990",
+                                    "renesas,rcar-gen3-i2c";
+                       reg = <0 0xe6500000 0 0x40>;
+                       interrupts = <GIC_SPI 287 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 931>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 931>;
+                       dmas = <&dmac1 0x91>, <&dmac1 0x90>,
+                              <&dmac2 0x91>, <&dmac2 0x90>;
+                       dma-names = "tx", "rx", "tx", "rx";
+                       i2c-scl-internal-delay-ns = <110>;
+                       status = "disabled";
+               };
+
+               i2c1: i2c@e6508000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "renesas,i2c-r8a77990",
+                                    "renesas,rcar-gen3-i2c";
+                       reg = <0 0xe6508000 0 0x40>;
+                       interrupts = <GIC_SPI 288 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 930>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 930>;
+                       dmas = <&dmac1 0x93>, <&dmac1 0x92>,
+                              <&dmac2 0x93>, <&dmac2 0x92>;
+                       dma-names = "tx", "rx", "tx", "rx";
+                       i2c-scl-internal-delay-ns = <6>;
+                       status = "disabled";
+               };
+
+               i2c2: i2c@e6510000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "renesas,i2c-r8a77990",
+                                    "renesas,rcar-gen3-i2c";
+                       reg = <0 0xe6510000 0 0x40>;
+                       interrupts = <GIC_SPI 286 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 929>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 929>;
+                       dmas = <&dmac1 0x95>, <&dmac1 0x94>,
+                              <&dmac2 0x95>, <&dmac2 0x94>;
+                       dma-names = "tx", "rx", "tx", "rx";
+                       i2c-scl-internal-delay-ns = <6>;
+                       status = "disabled";
+               };
+
+               i2c3: i2c@e66d0000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "renesas,i2c-r8a77990",
+                                    "renesas,rcar-gen3-i2c";
+                       reg = <0 0xe66d0000 0 0x40>;
+                       interrupts = <GIC_SPI 290 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 928>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 928>;
+                       dmas = <&dmac0 0x97>, <&dmac0 0x96>;
+                       dma-names = "tx", "rx";
+                       i2c-scl-internal-delay-ns = <110>;
+                       status = "disabled";
+               };
+
+               i2c4: i2c@e66d8000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "renesas,i2c-r8a77990",
+                                    "renesas,rcar-gen3-i2c";
+                       reg = <0 0xe66d8000 0 0x40>;
+                       interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 927>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 927>;
+                       dmas = <&dmac0 0x99>, <&dmac0 0x98>;
+                       dma-names = "tx", "rx";
+                       i2c-scl-internal-delay-ns = <6>;
+                       status = "disabled";
+               };
+
+               i2c5: i2c@e66e0000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "renesas,i2c-r8a77990",
+                                    "renesas,rcar-gen3-i2c";
+                       reg = <0 0xe66e0000 0 0x40>;
+                       interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 919>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 919>;
+                       dmas = <&dmac0 0x9b>, <&dmac0 0x9a>;
+                       dma-names = "tx", "rx";
+                       i2c-scl-internal-delay-ns = <6>;
+                       status = "disabled";
+               };
+
+               i2c6: i2c@e66e8000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "renesas,i2c-r8a77990",
+                                    "renesas,rcar-gen3-i2c";
+                       reg = <0 0xe66e8000 0 0x40>;
+                       interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 918>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 918>;
+                       dmas = <&dmac0 0x9d>, <&dmac0 0x9c>;
+                       dma-names = "tx", "rx";
+                       i2c-scl-internal-delay-ns = <6>;
+                       status = "disabled";
+               };
+
+               i2c7: i2c@e6690000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "renesas,i2c-r8a77990",
+                                    "renesas,rcar-gen3-i2c";
+                       reg = <0 0xe6690000 0 0x40>;
+                       interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 1003>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 1003>;
+                       i2c-scl-internal-delay-ns = <6>;
+                       status = "disabled";
+               };
+
+               hscif0: serial@e6540000 {
+                       compatible = "renesas,hscif-r8a77990",
+                                    "renesas,rcar-gen3-hscif",
+                                    "renesas,hscif";
+                       reg = <0 0xe6540000 0 0x60>;
+                       interrupts = <GIC_SPI 154 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 520>,
+                                <&cpg CPG_CORE R8A77990_CLK_S3D1C>,
+                                <&scif_clk>;
+                       clock-names = "fck", "brg_int", "scif_clk";
+                       dmas = <&dmac1 0x31>, <&dmac1 0x30>,
+                              <&dmac2 0x31>, <&dmac2 0x30>;
+                       dma-names = "tx", "rx", "tx", "rx";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 520>;
+                       status = "disabled";
+               };
+
+               hscif1: serial@e6550000 {
+                       compatible = "renesas,hscif-r8a77990",
+                                    "renesas,rcar-gen3-hscif",
+                                    "renesas,hscif";
+                       reg = <0 0xe6550000 0 0x60>;
+                       interrupts = <GIC_SPI 155 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 519>,
+                                <&cpg CPG_CORE R8A77990_CLK_S3D1C>,
+                                <&scif_clk>;
+                       clock-names = "fck", "brg_int", "scif_clk";
+                       dmas = <&dmac1 0x33>, <&dmac1 0x32>,
+                              <&dmac2 0x33>, <&dmac2 0x32>;
+                       dma-names = "tx", "rx", "tx", "rx";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 519>;
+                       status = "disabled";
+               };
+
+               hscif2: serial@e6560000 {
+                       compatible = "renesas,hscif-r8a77990",
+                                    "renesas,rcar-gen3-hscif",
+                                    "renesas,hscif";
+                       reg = <0 0xe6560000 0 0x60>;
+                       interrupts = <GIC_SPI 144 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 518>,
+                                <&cpg CPG_CORE R8A77990_CLK_S3D1C>,
+                                <&scif_clk>;
+                       clock-names = "fck", "brg_int", "scif_clk";
+                       dmas = <&dmac1 0x35>, <&dmac1 0x34>,
+                              <&dmac2 0x35>, <&dmac2 0x34>;
+                       dma-names = "tx", "rx", "tx", "rx";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 518>;
+                       status = "disabled";
+               };
+
+               hscif3: serial@e66a0000 {
+                       compatible = "renesas,hscif-r8a77990",
+                                    "renesas,rcar-gen3-hscif",
+                                    "renesas,hscif";
+                       reg = <0 0xe66a0000 0 0x60>;
+                       interrupts = <GIC_SPI 145 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 517>,
+                                <&cpg CPG_CORE R8A77990_CLK_S3D1C>,
+                                <&scif_clk>;
+                       clock-names = "fck", "brg_int", "scif_clk";
+                       dmas = <&dmac0 0x37>, <&dmac0 0x36>;
+                       dma-names = "tx", "rx";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 517>;
+                       status = "disabled";
+               };
+
+               hscif4: serial@e66b0000 {
+                       compatible = "renesas,hscif-r8a77990",
+                                    "renesas,rcar-gen3-hscif",
+                                    "renesas,hscif";
+                       reg = <0 0xe66b0000 0 0x60>;
+                       interrupts = <GIC_SPI 146 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 516>,
+                                <&cpg CPG_CORE R8A77990_CLK_S3D1C>,
+                                <&scif_clk>;
+                       clock-names = "fck", "brg_int", "scif_clk";
+                       dmas = <&dmac0 0x39>, <&dmac0 0x38>;
+                       dma-names = "tx", "rx";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 516>;
+                       status = "disabled";
+               };
+
+               hsusb: usb@e6590000 {
+                       compatible = "renesas,usbhs-r8a77990",
+                                    "renesas,rcar-gen3-usbhs";
+                       reg = <0 0xe6590000 0 0x200>;
+                       interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 704>, <&cpg CPG_MOD 703>;
+                       dmas = <&usb_dmac0 0>, <&usb_dmac0 1>,
+                              <&usb_dmac1 0>, <&usb_dmac1 1>;
+                       dma-names = "ch0", "ch1", "ch2", "ch3";
+                       renesas,buswait = <11>;
+                       phys = <&usb2_phy0>;
+                       phy-names = "usb";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 704>, <&cpg 703>;
+                       status = "disabled";
+               };
+
+               usb_dmac0: dma-controller@e65a0000 {
+                       compatible = "renesas,r8a77990-usb-dmac",
+                                    "renesas,usb-dmac";
+                       reg = <0 0xe65a0000 0 0x100>;
+                       interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "ch0", "ch1";
+                       clocks = <&cpg CPG_MOD 330>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 330>;
+                       #dma-cells = <1>;
+                       dma-channels = <2>;
+               };
+
+               usb_dmac1: dma-controller@e65b0000 {
+                       compatible = "renesas,r8a77990-usb-dmac",
+                                    "renesas,usb-dmac";
+                       reg = <0 0xe65b0000 0 0x100>;
+                       interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "ch0", "ch1";
+                       clocks = <&cpg CPG_MOD 331>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 331>;
+                       #dma-cells = <1>;
+                       dma-channels = <2>;
+               };
+
+               dmac0: dma-controller@e6700000 {
+                       compatible = "renesas,dmac-r8a77990",
+                                    "renesas,rcar-dmac";
+                       reg = <0 0xe6700000 0 0x10000>;
+                       interrupts = <GIC_SPI 199 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 200 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 201 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 202 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 203 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 204 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 205 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 206 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 207 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 208 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 209 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 210 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 211 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 212 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 213 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 214 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 215 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "error",
+                                       "ch0", "ch1", "ch2", "ch3",
+                                       "ch4", "ch5", "ch6", "ch7",
+                                       "ch8", "ch9", "ch10", "ch11",
+                                       "ch12", "ch13", "ch14", "ch15";
+                       clocks = <&cpg CPG_MOD 219>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 219>;
+                       #dma-cells = <1>;
+                       dma-channels = <16>;
+                       iommus = <&ipmmu_ds0 0>, <&ipmmu_ds0 1>,
+                              <&ipmmu_ds0 2>, <&ipmmu_ds0 3>,
+                              <&ipmmu_ds0 4>, <&ipmmu_ds0 5>,
+                              <&ipmmu_ds0 6>, <&ipmmu_ds0 7>,
+                              <&ipmmu_ds0 8>, <&ipmmu_ds0 9>,
+                              <&ipmmu_ds0 10>, <&ipmmu_ds0 11>,
+                              <&ipmmu_ds0 12>, <&ipmmu_ds0 13>,
+                              <&ipmmu_ds0 14>, <&ipmmu_ds0 15>;
+               };
+
+               dmac1: dma-controller@e7300000 {
+                       compatible = "renesas,dmac-r8a77990",
+                                    "renesas,rcar-dmac";
+                       reg = <0 0xe7300000 0 0x10000>;
+                       interrupts = <GIC_SPI 220 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 216 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 217 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 218 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 219 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 308 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 309 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 310 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 311 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 312 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 313 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 314 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 315 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 316 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 317 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 318 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 319 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "error",
+                                       "ch0", "ch1", "ch2", "ch3",
+                                       "ch4", "ch5", "ch6", "ch7",
+                                       "ch8", "ch9", "ch10", "ch11",
+                                       "ch12", "ch13", "ch14", "ch15";
+                       clocks = <&cpg CPG_MOD 218>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 218>;
+                       #dma-cells = <1>;
+                       dma-channels = <16>;
+                       iommus = <&ipmmu_ds1 0>, <&ipmmu_ds1 1>,
+                              <&ipmmu_ds1 2>, <&ipmmu_ds1 3>,
+                              <&ipmmu_ds1 4>, <&ipmmu_ds1 5>,
+                              <&ipmmu_ds1 6>, <&ipmmu_ds1 7>,
+                              <&ipmmu_ds1 8>, <&ipmmu_ds1 9>,
+                              <&ipmmu_ds1 10>, <&ipmmu_ds1 11>,
+                              <&ipmmu_ds1 12>, <&ipmmu_ds1 13>,
+                              <&ipmmu_ds1 14>, <&ipmmu_ds1 15>;
+               };
+
+               dmac2: dma-controller@e7310000 {
+                       compatible = "renesas,dmac-r8a77990",
+                                    "renesas,rcar-dmac";
+                       reg = <0 0xe7310000 0 0x10000>;
+                       interrupts = <GIC_SPI 416 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 417 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 418 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 419 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 420 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 421 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 422 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 423 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 424 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 425 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 426 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 427 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 428 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 429 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 430 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 431 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 397 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "error",
+                                       "ch0", "ch1", "ch2", "ch3",
+                                       "ch4", "ch5", "ch6", "ch7",
+                                       "ch8", "ch9", "ch10", "ch11",
+                                       "ch12", "ch13", "ch14", "ch15";
+                       clocks = <&cpg CPG_MOD 217>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 217>;
+                       #dma-cells = <1>;
+                       dma-channels = <16>;
+                       iommus = <&ipmmu_ds1 16>, <&ipmmu_ds1 17>,
+                              <&ipmmu_ds1 18>, <&ipmmu_ds1 19>,
+                              <&ipmmu_ds1 20>, <&ipmmu_ds1 21>,
+                              <&ipmmu_ds1 22>, <&ipmmu_ds1 23>,
+                              <&ipmmu_ds1 24>, <&ipmmu_ds1 25>,
+                              <&ipmmu_ds1 26>, <&ipmmu_ds1 27>,
+                              <&ipmmu_ds1 28>, <&ipmmu_ds1 29>,
+                              <&ipmmu_ds1 30>, <&ipmmu_ds1 31>;
+               };
+
                ipmmu_ds0: mmu@e6740000 {
                        compatible = "renesas,ipmmu-r8a77990";
                        reg = <0 0xe6740000 0 0x1000>;
                                          "ch20", "ch21", "ch22", "ch23",
                                          "ch24";
                        clocks = <&cpg CPG_MOD 812>;
-                       power-domains = <&sysc 32>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        phy-mode = "rgmii";
+                       iommus = <&ipmmu_ds0 16>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "disabled";
                };
 
+               can0: can@e6c30000 {
+                       compatible = "renesas,can-r8a77990",
+                                    "renesas,rcar-gen3-can";
+                       reg = <0 0xe6c30000 0 0x1000>;
+                       interrupts = <GIC_SPI 186 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 916>,
+                              <&cpg CPG_CORE R8A77990_CLK_CANFD>,
+                              <&can_clk>;
+                       clock-names = "clkp1", "clkp2", "can_clk";
+                       assigned-clocks = <&cpg CPG_CORE R8A77990_CLK_CANFD>;
+                       assigned-clock-rates = <40000000>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 916>;
+                       status = "disabled";
+               };
+
+               can1: can@e6c38000 {
+                       compatible = "renesas,can-r8a77990",
+                                    "renesas,rcar-gen3-can";
+                       reg = <0 0xe6c38000 0 0x1000>;
+                       interrupts = <GIC_SPI 187 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 915>,
+                              <&cpg CPG_CORE R8A77990_CLK_CANFD>,
+                              <&can_clk>;
+                       clock-names = "clkp1", "clkp2", "can_clk";
+                       assigned-clocks = <&cpg CPG_CORE R8A77990_CLK_CANFD>;
+                       assigned-clock-rates = <40000000>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 915>;
+                       status = "disabled";
+               };
+
+               canfd: can@e66c0000 {
+                       compatible = "renesas,r8a77990-canfd",
+                                    "renesas,rcar-gen3-canfd";
+                       reg = <0 0xe66c0000 0 0x8000>;
+                       interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>,
+                                  <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 914>,
+                              <&cpg CPG_CORE R8A77990_CLK_CANFD>,
+                              <&can_clk>;
+                       clock-names = "fck", "canfd", "can_clk";
+                       assigned-clocks = <&cpg CPG_CORE R8A77990_CLK_CANFD>;
+                       assigned-clock-rates = <40000000>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 914>;
+                       status = "disabled";
+
+                       channel0 {
+                               status = "disabled";
+                       };
+
+                       channel1 {
+                               status = "disabled";
+                       };
+               };
+
+               pwm0: pwm@e6e30000 {
+                       compatible = "renesas,pwm-r8a77990", "renesas,pwm-rcar";
+                       reg = <0 0xe6e30000 0 0x8>;
+                       clocks = <&cpg CPG_MOD 523>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 523>;
+                       #pwm-cells = <2>;
+                       status = "disabled";
+               };
+
+               pwm1: pwm@e6e31000 {
+                       compatible = "renesas,pwm-r8a77990", "renesas,pwm-rcar";
+                       reg = <0 0xe6e31000 0 0x8>;
+                       clocks = <&cpg CPG_MOD 523>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 523>;
+                       #pwm-cells = <2>;
+                       status = "disabled";
+               };
+
+               pwm2: pwm@e6e32000 {
+                       compatible = "renesas,pwm-r8a77990", "renesas,pwm-rcar";
+                       reg = <0 0xe6e32000 0 0x8>;
+                       clocks = <&cpg CPG_MOD 523>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 523>;
+                       #pwm-cells = <2>;
+                       status = "disabled";
+               };
+
+               pwm3: pwm@e6e33000 {
+                       compatible = "renesas,pwm-r8a77990", "renesas,pwm-rcar";
+                       reg = <0 0xe6e33000 0 0x8>;
+                       clocks = <&cpg CPG_MOD 523>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 523>;
+                       #pwm-cells = <2>;
+                       status = "disabled";
+               };
+
+               pwm4: pwm@e6e34000 {
+                       compatible = "renesas,pwm-r8a77990", "renesas,pwm-rcar";
+                       reg = <0 0xe6e34000 0 0x8>;
+                       clocks = <&cpg CPG_MOD 523>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 523>;
+                       #pwm-cells = <2>;
+                       status = "disabled";
+               };
+
+               pwm5: pwm@e6e35000 {
+                       compatible = "renesas,pwm-r8a77990", "renesas,pwm-rcar";
+                       reg = <0 0xe6e35000 0 0x8>;
+                       clocks = <&cpg CPG_MOD 523>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 523>;
+                       #pwm-cells = <2>;
+                       status = "disabled";
+               };
+
+               pwm6: pwm@e6e36000 {
+                       compatible = "renesas,pwm-r8a77990", "renesas,pwm-rcar";
+                       reg = <0 0xe6e36000 0 0x8>;
+                       clocks = <&cpg CPG_MOD 523>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 523>;
+                       #pwm-cells = <2>;
+                       status = "disabled";
+               };
+
+               scif0: serial@e6e60000 {
+                       compatible = "renesas,scif-r8a77990",
+                                    "renesas,rcar-gen3-scif", "renesas,scif";
+                       reg = <0 0xe6e60000 0 64>;
+                       interrupts = <GIC_SPI 152 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 207>,
+                                <&cpg CPG_CORE R8A77990_CLK_S3D1C>,
+                                <&scif_clk>;
+                       clock-names = "fck", "brg_int", "scif_clk";
+                       dmas = <&dmac1 0x51>, <&dmac1 0x50>,
+                              <&dmac2 0x51>, <&dmac2 0x50>;
+                       dma-names = "tx", "rx", "tx", "rx";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 207>;
+                       status = "disabled";
+               };
+
+               scif1: serial@e6e68000 {
+                       compatible = "renesas,scif-r8a77990",
+                                    "renesas,rcar-gen3-scif", "renesas,scif";
+                       reg = <0 0xe6e68000 0 64>;
+                       interrupts = <GIC_SPI 153 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 206>,
+                                <&cpg CPG_CORE R8A77990_CLK_S3D1C>,
+                                <&scif_clk>;
+                       clock-names = "fck", "brg_int", "scif_clk";
+                       dmas = <&dmac1 0x53>, <&dmac1 0x52>,
+                              <&dmac2 0x53>, <&dmac2 0x52>;
+                       dma-names = "tx", "rx", "tx", "rx";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 206>;
+                       status = "disabled";
+               };
+
                scif2: serial@e6e88000 {
                        compatible = "renesas,scif-r8a77990",
                                     "renesas,rcar-gen3-scif", "renesas,scif";
                        reg = <0 0xe6e88000 0 64>;
                        interrupts = <GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 310>;
-                       clock-names = "fck";
-                       power-domains = <&sysc 32>;
+                       clocks = <&cpg CPG_MOD 310>,
+                                <&cpg CPG_CORE R8A77990_CLK_S3D1C>,
+                                <&scif_clk>;
+                       clock-names = "fck", "brg_int", "scif_clk";
+                       dmas = <&dmac1 0x13>, <&dmac1 0x12>,
+                              <&dmac2 0x13>, <&dmac2 0x12>;
+                       dma-names = "tx", "rx", "tx", "rx";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
                        resets = <&cpg 310>;
                        status = "disabled";
                };
 
+               scif3: serial@e6c50000 {
+                       compatible = "renesas,scif-r8a77990",
+                                    "renesas,rcar-gen3-scif", "renesas,scif";
+                       reg = <0 0xe6c50000 0 64>;
+                       interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 204>,
+                                <&cpg CPG_CORE R8A77990_CLK_S3D1C>,
+                                <&scif_clk>;
+                       clock-names = "fck", "brg_int", "scif_clk";
+                       dmas = <&dmac0 0x57>, <&dmac0 0x56>;
+                       dma-names = "tx", "rx";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 204>;
+                       status = "disabled";
+               };
+
+               scif4: serial@e6c40000 {
+                       compatible = "renesas,scif-r8a77990",
+                                    "renesas,rcar-gen3-scif", "renesas,scif";
+                       reg = <0 0xe6c40000 0 64>;
+                       interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 203>,
+                                <&cpg CPG_CORE R8A77990_CLK_S3D1C>,
+                                <&scif_clk>;
+                       clock-names = "fck", "brg_int", "scif_clk";
+                       dmas = <&dmac0 0x59>, <&dmac0 0x58>;
+                       dma-names = "tx", "rx";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 203>;
+                       status = "disabled";
+               };
+
+               scif5: serial@e6f30000 {
+                       compatible = "renesas,scif-r8a77990",
+                                    "renesas,rcar-gen3-scif", "renesas,scif";
+                       reg = <0 0xe6f30000 0 64>;
+                       interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 202>,
+                                <&cpg CPG_CORE R8A77990_CLK_S3D1C>,
+                                <&scif_clk>;
+                       clock-names = "fck", "brg_int", "scif_clk";
+                       dmas = <&dmac0 0x5b>, <&dmac0 0x5a>;
+                       dma-names = "tx", "rx";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 202>;
+                       status = "disabled";
+               };
+
+               msiof0: spi@e6e90000 {
+                       compatible = "renesas,msiof-r8a77990",
+                                    "renesas,rcar-gen3-msiof";
+                       reg = <0 0xe6e90000 0 0x0064>;
+                       interrupts = <GIC_SPI 156 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 211>;
+                       dmas = <&dmac1 0x41>, <&dmac1 0x40>,
+                              <&dmac2 0x41>, <&dmac2 0x40>;
+                       dma-names = "tx", "rx", "tx", "rx";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 211>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               msiof1: spi@e6ea0000 {
+                       compatible = "renesas,msiof-r8a77990",
+                                    "renesas,rcar-gen3-msiof";
+                       reg = <0 0xe6ea0000 0 0x0064>;
+                       interrupts = <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 210>;
+                       dmas = <&dmac1 0x43>, <&dmac1 0x42>,
+                              <&dmac2 0x43>, <&dmac2 0x42>;
+                       dma-names = "tx", "rx", "tx", "rx";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 210>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               msiof2: spi@e6c00000 {
+                       compatible = "renesas,msiof-r8a77990",
+                                    "renesas,rcar-gen3-msiof";
+                       reg = <0 0xe6c00000 0 0x0064>;
+                       interrupts = <GIC_SPI 158 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 209>;
+                       dmas = <&dmac0 0x45>, <&dmac0 0x44>;
+                       dma-names = "tx", "rx";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 209>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               msiof3: spi@e6c10000 {
+                       compatible = "renesas,msiof-r8a77990",
+                                    "renesas,rcar-gen3-msiof";
+                       reg = <0 0xe6c10000 0 0x0064>;
+                       interrupts = <GIC_SPI 159 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 208>;
+                       dmas = <&dmac0 0x47>, <&dmac0 0x46>;
+                       dma-names = "tx", "rx";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 208>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               vin4: video@e6ef4000 {
+                       compatible = "renesas,vin-r8a77990";
+                       reg = <0 0xe6ef4000 0 0x1000>;
+                       interrupts = <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 807>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 807>;
+                       renesas,id = <4>;
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@1 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       reg = <1>;
+
+                                       vin4csi40: endpoint@2 {
+                                               reg = <2>;
+                                               remote-endpoint= <&csi40vin4>;
+                                       };
+                               };
+                       };
+               };
+
+               vin5: video@e6ef5000 {
+                       compatible = "renesas,vin-r8a77990";
+                       reg = <0 0xe6ef5000 0 0x1000>;
+                       interrupts = <GIC_SPI 175 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 806>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 806>;
+                       renesas,id = <5>;
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@1 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       reg = <1>;
+
+                                       vin5csi40: endpoint@2 {
+                                               reg = <2>;
+                                               remote-endpoint= <&csi40vin5>;
+                                       };
+                               };
+                       };
+               };
+
+               rcar_sound: sound@ec500000 {
+                       /*
+                        * #sound-dai-cells is required
+                        *
+                        * Single DAI : #sound-dai-cells = <0>; <&rcar_sound>;
+                        * Multi  DAI : #sound-dai-cells = <1>; <&rcar_sound N>;
+                        */
+                       /*
+                        * #clock-cells is required for audio_clkout0/1/2/3
+                        *
+                        * clkout       : #clock-cells = <0>;   <&rcar_sound>;
+                        * clkout0/1/2/3: #clock-cells = <1>;   <&rcar_sound N>;
+                        */
+                       compatible =  "renesas,rcar_sound-r8a77990", "renesas,rcar_sound-gen3";
+                       reg =   <0 0xec500000 0 0x1000>, /* SCU */
+                               <0 0xec5a0000 0 0x100>,  /* ADG */
+                               <0 0xec540000 0 0x1000>, /* SSIU */
+                               <0 0xec541000 0 0x280>,  /* SSI */
+                               <0 0xec760000 0 0x200>;  /* Audio DMAC peri peri*/
+                       reg-names = "scu", "adg", "ssiu", "ssi", "audmapp";
+
+                       clocks = <&cpg CPG_MOD 1005>,
+                                <&cpg CPG_MOD 1006>, <&cpg CPG_MOD 1007>,
+                                <&cpg CPG_MOD 1008>, <&cpg CPG_MOD 1009>,
+                                <&cpg CPG_MOD 1010>, <&cpg CPG_MOD 1011>,
+                                <&cpg CPG_MOD 1012>, <&cpg CPG_MOD 1013>,
+                                <&cpg CPG_MOD 1014>, <&cpg CPG_MOD 1015>,
+                                <&cpg CPG_MOD 1022>, <&cpg CPG_MOD 1023>,
+                                <&cpg CPG_MOD 1024>, <&cpg CPG_MOD 1025>,
+                                <&cpg CPG_MOD 1026>, <&cpg CPG_MOD 1027>,
+                                <&cpg CPG_MOD 1028>, <&cpg CPG_MOD 1029>,
+                                <&cpg CPG_MOD 1030>, <&cpg CPG_MOD 1031>,
+                                <&cpg CPG_MOD 1020>, <&cpg CPG_MOD 1021>,
+                                <&cpg CPG_MOD 1020>, <&cpg CPG_MOD 1021>,
+                                <&cpg CPG_MOD 1019>, <&cpg CPG_MOD 1018>,
+                                <&audio_clk_a>, <&audio_clk_b>,
+                                <&audio_clk_c>,
+                                <&cpg CPG_CORE R8A77990_CLK_ZA2>;
+                       clock-names = "ssi-all",
+                                     "ssi.9", "ssi.8", "ssi.7", "ssi.6",
+                                     "ssi.5", "ssi.4", "ssi.3", "ssi.2",
+                                     "ssi.1", "ssi.0",
+                                     "src.9", "src.8", "src.7", "src.6",
+                                     "src.5", "src.4", "src.3", "src.2",
+                                     "src.1", "src.0",
+                                     "mix.1", "mix.0",
+                                     "ctu.1", "ctu.0",
+                                     "dvc.0", "dvc.1",
+                                     "clk_a", "clk_b", "clk_c", "clk_i";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 1005>,
+                                <&cpg 1006>, <&cpg 1007>,
+                                <&cpg 1008>, <&cpg 1009>,
+                                <&cpg 1010>, <&cpg 1011>,
+                                <&cpg 1012>, <&cpg 1013>,
+                                <&cpg 1014>, <&cpg 1015>;
+                       reset-names = "ssi-all",
+                                     "ssi.9", "ssi.8", "ssi.7", "ssi.6",
+                                     "ssi.5", "ssi.4", "ssi.3", "ssi.2",
+                                     "ssi.1", "ssi.0";
+                       status = "disabled";
+
+                       rcar_sound,dvc {
+                               dvc0: dvc-0 {
+                                       dmas = <&audma0 0xbc>;
+                                       dma-names = "tx";
+                               };
+                               dvc1: dvc-1 {
+                                       dmas = <&audma0 0xbe>;
+                                       dma-names = "tx";
+                               };
+                       };
+
+                       rcar_sound,mix {
+                               mix0: mix-0 { };
+                               mix1: mix-1 { };
+                       };
+
+                       rcar_sound,ctu {
+                               ctu00: ctu-0 { };
+                               ctu01: ctu-1 { };
+                               ctu02: ctu-2 { };
+                               ctu03: ctu-3 { };
+                               ctu10: ctu-4 { };
+                               ctu11: ctu-5 { };
+                               ctu12: ctu-6 { };
+                               ctu13: ctu-7 { };
+                       };
+
+                       rcar_sound,src {
+                               src0: src-0 {
+                                       interrupts = <GIC_SPI 352 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x85>, <&audma0 0x9a>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src1: src-1 {
+                                       interrupts = <GIC_SPI 353 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x87>, <&audma0 0x9c>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src2: src-2 {
+                                       interrupts = <GIC_SPI 354 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x89>, <&audma0 0x9e>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src3: src-3 {
+                                       interrupts = <GIC_SPI 355 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x8b>, <&audma0 0xa0>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src4: src-4 {
+                                       interrupts = <GIC_SPI 356 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x8d>, <&audma0 0xb0>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src5: src-5 {
+                                       interrupts = <GIC_SPI 357 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x8f>, <&audma0 0xb2>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src6: src-6 {
+                                       interrupts = <GIC_SPI 358 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x91>, <&audma0 0xb4>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src7: src-7 {
+                                       interrupts = <GIC_SPI 359 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x93>, <&audma0 0xb6>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src8: src-8 {
+                                       interrupts = <GIC_SPI 360 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x95>, <&audma0 0xb8>;
+                                       dma-names = "rx", "tx";
+                               };
+                               src9: src-9 {
+                                       interrupts = <GIC_SPI 361 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x97>, <&audma0 0xba>;
+                                       dma-names = "rx", "tx";
+                               };
+                       };
+
+                       rcar_sound,ssi {
+                               ssi0: ssi-0 {
+                                       interrupts = <GIC_SPI 370 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x01>, <&audma0 0x02>,
+                                              <&audma0 0x15>, <&audma0 0x16>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
+                               };
+                               ssi1: ssi-1 {
+                                       interrupts = <GIC_SPI 371 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x03>, <&audma0 0x04>,
+                                              <&audma0 0x49>, <&audma0 0x4a>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
+                               };
+                               ssi2: ssi-2 {
+                                       interrupts = <GIC_SPI 372 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x05>, <&audma0 0x06>,
+                                              <&audma0 0x63>, <&audma0 0x64>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
+                               };
+                               ssi3: ssi-3 {
+                                       interrupts = <GIC_SPI 373 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x07>, <&audma0 0x08>,
+                                              <&audma0 0x6f>, <&audma0 0x70>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
+                               };
+                               ssi4: ssi-4 {
+                                       interrupts = <GIC_SPI 374 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x09>, <&audma0 0x0a>,
+                                              <&audma0 0x71>, <&audma0 0x72>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
+                               };
+                               ssi5: ssi-5 {
+                                       interrupts = <GIC_SPI 375 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x0b>, <&audma0 0x0c>,
+                                              <&audma0 0x73>, <&audma0 0x74>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
+                               };
+                               ssi6: ssi-6 {
+                                       interrupts = <GIC_SPI 376 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x0d>, <&audma0 0x0e>,
+                                              <&audma0 0x75>, <&audma0 0x76>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
+                               };
+                               ssi7: ssi-7 {
+                                       interrupts = <GIC_SPI 377 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x0f>, <&audma0 0x10>,
+                                              <&audma0 0x79>, <&audma0 0x7a>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
+                               };
+                               ssi8: ssi-8 {
+                                       interrupts = <GIC_SPI 378 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x11>, <&audma0 0x12>,
+                                              <&audma0 0x7b>, <&audma0 0x7c>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
+                               };
+                               ssi9: ssi-9 {
+                                       interrupts = <GIC_SPI 379 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&audma0 0x13>, <&audma0 0x14>,
+                                              <&audma0 0x7d>, <&audma0 0x7e>;
+                                       dma-names = "rx", "tx", "rxu", "txu";
+                               };
+                       };
+               };
+
+               audma0: dma-controller@ec700000 {
+                       compatible = "renesas,dmac-r8a77990",
+                                    "renesas,rcar-dmac";
+                       reg = <0 0xec700000 0 0x10000>;
+                       interrupts = <GIC_SPI 350 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 320 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 321 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 322 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 323 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 324 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 325 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 326 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 327 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 328 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 329 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 330 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 331 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 332 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 333 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 334 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 335 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "error",
+                                       "ch0", "ch1", "ch2", "ch3",
+                                       "ch4", "ch5", "ch6", "ch7",
+                                       "ch8", "ch9", "ch10", "ch11",
+                                       "ch12", "ch13", "ch14", "ch15";
+                       clocks = <&cpg CPG_MOD 502>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 502>;
+                       #dma-cells = <1>;
+                       dma-channels = <16>;
+                       iommus = <&ipmmu_mp 0>, <&ipmmu_mp 1>,
+                                <&ipmmu_mp 2>, <&ipmmu_mp 3>,
+                                <&ipmmu_mp 4>, <&ipmmu_mp 5>,
+                                <&ipmmu_mp 6>, <&ipmmu_mp 7>,
+                                <&ipmmu_mp 8>, <&ipmmu_mp 9>,
+                                <&ipmmu_mp 10>, <&ipmmu_mp 11>,
+                                <&ipmmu_mp 12>, <&ipmmu_mp 13>,
+                                <&ipmmu_mp 14>, <&ipmmu_mp 15>;
+               };
+
                xhci0: usb@ee000000 {
                        compatible = "renesas,xhci-r8a77990",
                                     "renesas,rcar-gen3-xhci";
                        status = "disabled";
                };
 
+               usb3_peri0: usb@ee020000 {
+                       compatible = "renesas,r8a77990-usb3-peri",
+                                    "renesas,rcar-gen3-usb3-peri";
+                       reg = <0 0xee020000 0 0x400>;
+                       interrupts = <GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 328>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 328>;
+                       status = "disabled";
+               };
+
                ohci0: usb@ee080000 {
                        compatible = "generic-ohci";
                        reg = <0 0xee080000 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        phys = <&usb2_phy0>;
                        phy-names = "usb";
-                       power-domains = <&sysc 32>;
-                       resets = <&cpg 703>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        status = "disabled";
                };
 
                        compatible = "generic-ehci";
                        reg = <0 0xee080100 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        phys = <&usb2_phy0>;
                        phy-names = "usb";
                        companion = <&ohci0>;
-                       power-domains = <&sysc 32>;
-                       resets = <&cpg 703>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        status = "disabled";
                };
 
                                     "renesas,rcar-gen3-usb2-phy";
                        reg = <0 0xee080200 0 0x700>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
-                       power-domains = <&sysc 32>;
-                       resets = <&cpg 703>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        #phy-cells = <0>;
                        status = "disabled";
                };
 
+               sdhi0: sd@ee100000 {
+                       compatible = "renesas,sdhi-r8a77990",
+                                    "renesas,rcar-gen3-sdhi";
+                       reg = <0 0xee100000 0 0x2000>;
+                       interrupts = <GIC_SPI 165 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 314>;
+                       max-frequency = <200000000>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 314>;
+                       status = "disabled";
+               };
+
+               sdhi1: sd@ee120000 {
+                       compatible = "renesas,sdhi-r8a77990",
+                                    "renesas,rcar-gen3-sdhi";
+                       reg = <0 0xee120000 0 0x2000>;
+                       interrupts = <GIC_SPI 166 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 313>;
+                       max-frequency = <200000000>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 313>;
+                       status = "disabled";
+               };
+
+               sdhi3: sd@ee160000 {
+                       compatible = "renesas,sdhi-r8a77990",
+                                    "renesas,rcar-gen3-sdhi";
+                       reg = <0 0xee160000 0 0x2000>;
+                       interrupts = <GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 311>;
+                       max-frequency = <200000000>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 311>;
+                       status = "disabled";
+               };
+
                gic: interrupt-controller@f1010000 {
                        compatible = "arm,gic-400";
                        #interrupt-cells = <3>;
                                        (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_HIGH)>;
                        clocks = <&cpg CPG_MOD 408>;
                        clock-names = "clk";
-                       power-domains = <&sysc 32>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
                        resets = <&cpg 408>;
                };
 
+               pciec0: pcie@fe000000 {
+                       compatible = "renesas,pcie-r8a77990",
+                                    "renesas,pcie-rcar-gen3";
+                       reg = <0 0xfe000000 0 0x80000>;
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       bus-range = <0x00 0xff>;
+                       device_type = "pci";
+                       ranges = <0x01000000 0 0x00000000 0 0xfe100000 0 0x00100000
+                                 0x02000000 0 0xfe200000 0 0xfe200000 0 0x00200000
+                                 0x02000000 0 0x30000000 0 0x30000000 0 0x08000000
+                                 0x42000000 0 0x38000000 0 0x38000000 0 0x08000000>;
+                       /* Map all possible DDR as inbound ranges */
+                       dma-ranges = <0x42000000 0 0x40000000 0 0x40000000 0 0x40000000>;
+                       interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>;
+                       #interrupt-cells = <1>;
+                       interrupt-map-mask = <0 0 0 0>;
+                       interrupt-map = <0 0 0 0 &gic GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 319>, <&pcie_bus_clk>;
+                       clock-names = "pcie", "pcie_bus";
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 319>;
+                       status = "disabled";
+               };
+
+               vspb0: vsp@fe960000 {
+                       compatible = "renesas,vsp2";
+                       reg = <0 0xfe960000 0 0x8000>;
+                       interrupts = <GIC_SPI 266 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 626>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 626>;
+                       renesas,fcp = <&fcpvb0>;
+               };
+
+               fcpvb0: fcp@fe96f000 {
+                       compatible = "renesas,fcpv";
+                       reg = <0 0xfe96f000 0 0x200>;
+                       clocks = <&cpg CPG_MOD 607>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 607>;
+                       iommus = <&ipmmu_vp0 5>;
+               };
+
+               vspi0: vsp@fe9a0000 {
+                       compatible = "renesas,vsp2";
+                       reg = <0 0xfe9a0000 0 0x8000>;
+                       interrupts = <GIC_SPI 444 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 631>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 631>;
+                       renesas,fcp = <&fcpvi0>;
+               };
+
+               fcpvi0: fcp@fe9af000 {
+                       compatible = "renesas,fcpv";
+                       reg = <0 0xfe9af000 0 0x200>;
+                       clocks = <&cpg CPG_MOD 611>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 611>;
+                       iommus = <&ipmmu_vp0 8>;
+               };
+
+               vspd0: vsp@fea20000 {
+                       compatible = "renesas,vsp2";
+                       reg = <0 0xfea20000 0 0x7000>;
+                       interrupts = <GIC_SPI 466 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 623>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 623>;
+                       renesas,fcp = <&fcpvd0>;
+               };
+
+               fcpvd0: fcp@fea27000 {
+                       compatible = "renesas,fcpv";
+                       reg = <0 0xfea27000 0 0x200>;
+                       clocks = <&cpg CPG_MOD 603>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 603>;
+                       iommus = <&ipmmu_vi0 8>;
+               };
+
+               vspd1: vsp@fea28000 {
+                       compatible = "renesas,vsp2";
+                       reg = <0 0xfea28000 0 0x7000>;
+                       interrupts = <GIC_SPI 467 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 622>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 622>;
+                       renesas,fcp = <&fcpvd1>;
+               };
+
+               fcpvd1: fcp@fea2f000 {
+                       compatible = "renesas,fcpv";
+                       reg = <0 0xfea2f000 0 0x200>;
+                       clocks = <&cpg CPG_MOD 602>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 602>;
+                       iommus = <&ipmmu_vi0 9>;
+               };
+
+               csi40: csi2@feaa0000 {
+                       compatible = "renesas,r8a77990-csi2", "renesas,rcar-gen3-csi2";
+                       reg = <0 0xfeaa0000 0 0x10000>;
+                       interrupts = <GIC_SPI 246 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 716>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 716>;
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@1 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       reg = <1>;
+
+                                       csi40vin4: endpoint@0 {
+                                               reg = <0>;
+                                               remote-endpoint = <&vin4csi40>;
+                                       };
+                                       csi40vin5: endpoint@1 {
+                                               reg = <1>;
+                                               remote-endpoint = <&vin5csi40>;
+                                       };
+                               };
+                       };
+               };
+
+               du: display@feb00000 {
+                       compatible = "renesas,du-r8a77990";
+                       reg = <0 0xfeb00000 0 0x80000>;
+                       interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 724>,
+                                <&cpg CPG_MOD 723>;
+                       clock-names = "du.0", "du.1";
+                       vsps = <&vspd0 0 &vspd1 0>;
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+                                       du_out_rgb: endpoint {
+                                       };
+                               };
+
+                               port@1 {
+                                       reg = <1>;
+                                       du_out_lvds0: endpoint {
+                                               remote-endpoint = <&lvds0_in>;
+                                       };
+                               };
+
+                               port@2 {
+                                       reg = <2>;
+                                       du_out_lvds1: endpoint {
+                                               remote-endpoint = <&lvds1_in>;
+                                       };
+                               };
+                       };
+               };
+
+               lvds0: lvds-encoder@feb90000 {
+                       compatible = "renesas,r8a77990-lvds";
+                       reg = <0 0xfeb90000 0 0x20>;
+                       clocks = <&cpg CPG_MOD 727>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 727>;
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+                                       lvds0_in: endpoint {
+                                               remote-endpoint = <&du_out_lvds0>;
+                                       };
+                               };
+
+                               port@1 {
+                                       reg = <1>;
+                                       lvds0_out: endpoint {
+                                       };
+                               };
+                       };
+               };
+
+               lvds1: lvds-encoder@feb90100 {
+                       compatible = "renesas,r8a77990-lvds";
+                       reg = <0 0xfeb90100 0 0x20>;
+                       clocks = <&cpg CPG_MOD 727>;
+                       power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
+                       resets = <&cpg 726>;
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+                                       lvds1_in: endpoint {
+                                               remote-endpoint = <&du_out_lvds1>;
+                                       };
+                               };
+
+                               port@1 {
+                                       reg = <1>;
+                                       lvds1_out: endpoint {
+                                       };
+                               };
+                       };
+               };
+
                prr: chipid@fff00044 {
                        compatible = "renesas,prr";
                        reg = <0 0xfff00044 0 4>;
                };
        };
 
+       thermal-zones {
+               cpu-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <1000>;
+                       thermal-sensors = <&thermal>;
+
+                       trips {
+                               cpu-crit {
+                                       temperature = <120000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                       };
+               };
+       };
+
        timer {
                compatible = "arm,armv8-timer";
                interrupts-extended = <&gic GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
index a8e8f2669d4c53ae7492dc489107d3fbac30eebe..db2bed1751b8d308c814fc25c4e96000a819a6f1 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * Device Tree Source for the Draak board
  *
- * Copyright (C) 2016 Renesas Electronics Corp.
+ * Copyright (C) 2016-2018 Renesas Electronics Corp.
  * Copyright (C) 2017 Glider bvba
  */
 
                stdout-path = "serial0:115200n8";
        };
 
-       vga {
-               compatible = "vga-connector";
+       backlight: backlight {
+               compatible = "pwm-backlight";
+               pwms = <&pwm1 0 50000>;
 
-               port {
-                       vga_in: endpoint {
-                               remote-endpoint = <&adv7123_out>;
-                       };
-               };
-       };
-
-       vga-encoder {
-               compatible = "adi,adv7123";
+               brightness-levels = <512 511 505 494 473 440 392 327 241 133 0>;
+               default-brightness-level = <10>;
 
-               ports {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-
-                       port@0 {
-                               reg = <0>;
-                               adv7123_in: endpoint {
-                                       remote-endpoint = <&du_out_rgb>;
-                               };
-                       };
-                       port@1 {
-                               reg = <1>;
-                               adv7123_out: endpoint {
-                                       remote-endpoint = <&vga_in>;
-                               };
-                       };
-               };
+               power-supply = <&reg_12p0v>;
+               enable-gpios = <&gpio4 0 GPIO_ACTIVE_HIGH>;
        };
 
        composite-in {
                };
        };
 
+       hdmi-out {
+               compatible = "hdmi-connector";
+               type = "a";
+
+               port {
+                       hdmi_con_out: endpoint {
+                               remote-endpoint = <&adv7511_out>;
+                       };
+               };
+       };
+
+       lvds-decoder {
+               compatible = "thine,thc63lvd1024";
+               vcc-supply = <&reg_3p3v>;
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       port@0 {
+                               reg = <0>;
+                               thc63lvd1024_in: endpoint {
+                                       remote-endpoint = <&lvds0_out>;
+                               };
+                       };
+
+                       port@2 {
+                               reg = <2>;
+                               thc63lvd1024_out: endpoint {
+                                       remote-endpoint = <&adv7511_in>;
+                               };
+                       };
+               };
+       };
+
        memory@48000000 {
                device_type = "memory";
                /* first 128MB is reserved for secure area. */
                regulator-always-on;
        };
 
-       x12_clk: x12 {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <74250000>;
+       reg_12p0v: regulator1 {
+               compatible = "regulator-fixed";
+               regulator-name = "D12.0V";
+               regulator-min-microvolt = <12000000>;
+               regulator-max-microvolt = <12000000>;
+               regulator-boot-on;
+               regulator-always-on;
        };
-};
 
-&extal_clk {
-       clock-frequency = <48000000>;
-};
+       vga {
+               compatible = "vga-connector";
 
-&pfc {
-       avb0_pins: avb {
-               mux {
-                       groups = "avb0_link", "avb0_mdio", "avb0_mii";
-                       function = "avb0";
+               port {
+                       vga_in: endpoint {
+                               remote-endpoint = <&adv7123_out>;
+                       };
                };
        };
 
-       du_pins: du {
-               groups = "du_rgb888", "du_sync", "du_disp", "du_clk_out_0";
-               function = "du";
-       };
+       vga-encoder {
+               compatible = "adi,adv7123";
 
-       i2c0_pins: i2c0 {
-               groups = "i2c0";
-               function = "i2c0";
-       };
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
 
-       i2c1_pins: i2c1 {
-               groups = "i2c1";
-               function = "i2c1";
+                       port@0 {
+                               reg = <0>;
+                               adv7123_in: endpoint {
+                                       remote-endpoint = <&du_out_rgb>;
+                               };
+                       };
+                       port@1 {
+                               reg = <1>;
+                               adv7123_out: endpoint {
+                                       remote-endpoint = <&vga_in>;
+                               };
+                       };
+               };
        };
 
-       pwm0_pins: pwm0 {
-               groups = "pwm0_c";
-               function = "pwm0";
+       x12_clk: x12 {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <74250000>;
        };
+};
 
-       pwm1_pins: pwm1 {
-               groups = "pwm1_c";
-               function = "pwm1";
-       };
+&avb {
+       pinctrl-0 = <&avb0_pins>;
+       pinctrl-names = "default";
+       renesas,no-ether-link;
+       phy-handle = <&phy0>;
+       phy-mode = "rgmii-txid";
+       status = "okay";
 
-       scif2_pins: scif2 {
-               groups = "scif2_data";
-               function = "scif2";
+       phy0: ethernet-phy@0 {
+               rxc-skew-ps = <1500>;
+               reg = <0>;
+               interrupt-parent = <&gpio5>;
+               interrupts = <19 IRQ_TYPE_LEVEL_LOW>;
        };
+};
 
-       sdhi2_pins: sd2 {
-               groups = "mmc_data8", "mmc_ctrl";
-               function = "mmc";
-               power-source = <1800>;
-       };
+&du {
+       pinctrl-0 = <&du_pins>;
+       pinctrl-names = "default";
+       status = "okay";
 
-       sdhi2_pins_uhs: sd2_uhs {
-               groups = "mmc_data8", "mmc_ctrl";
-               function = "mmc";
-               power-source = <1800>;
-       };
+       clocks = <&cpg CPG_MOD 724>,
+                <&cpg CPG_MOD 723>,
+                <&x12_clk>;
+       clock-names = "du.0", "du.1", "dclkin.0";
 
-       usb0_pins: usb0 {
-               groups = "usb0";
-               function = "usb0";
+       ports {
+               port@0 {
+                       endpoint {
+                               remote-endpoint = <&adv7123_in>;
+                       };
+               };
        };
+};
 
-       vin4_pins_cvbs: vin4 {
-               groups = "vin4_data8", "vin4_sync", "vin4_clk";
-               function = "vin4";
-       };
+&ehci0 {
+       dr_mode = "host";
+       status = "okay";
+};
+
+&extal_clk {
+       clock-frequency = <48000000>;
+};
+
+&hsusb {
+       dr_mode = "host";
+       status = "okay";
 };
 
 &i2c0 {
        pinctrl-names = "default";
        status = "okay";
 
-       eeprom@50 {
-               compatible = "rohm,br24t01", "atmel,24c01";
-               reg = <0x50>;
-               pagesize = <8>;
-       };
-
        composite-in@20 {
                compatible = "adi,adv7180cp";
                reg = <0x20>;
 
-               port {
+               ports {
                        #address-cells = <1>;
                        #size-cells = <0>;
 
 
        };
 
+       hdmi-encoder@39 {
+               compatible = "adi,adv7511w";
+               reg = <0x39>, <0x3f>, <0x38>, <0x3c>;
+               reg-names = "main", "edid", "packet", "cec";
+               interrupt-parent = <&gpio1>;
+               interrupts = <28 IRQ_TYPE_LEVEL_LOW>;
+
+               /* Depends on LVDS */
+               max-clock = <135000000>;
+               min-vrefresh = <50>;
+
+               adi,input-depth = <8>;
+               adi,input-colorspace = "rgb";
+               adi,input-clock = "1x";
+               adi,input-style = <1>;
+               adi,input-justification = "evenly";
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       port@0 {
+                               reg = <0>;
+                               adv7511_in: endpoint {
+                                       remote-endpoint = <&thc63lvd1024_out>;
+                               };
+                       };
+
+                       port@1 {
+                               reg = <1>;
+                               adv7511_out: endpoint {
+                                       remote-endpoint = <&hdmi_con_out>;
+                               };
+                       };
+               };
+       };
+
        hdmi-decoder@4c {
                compatible = "adi,adv7612";
                reg = <0x4c>;
                        };
                };
        };
+
+       eeprom@50 {
+               compatible = "rohm,br24t01", "atmel,24c01";
+               reg = <0x50>;
+               pagesize = <8>;
+       };
 };
 
 &i2c1 {
        status = "okay";
 };
 
-&du {
-       pinctrl-0 = <&du_pins>;
-       pinctrl-names = "default";
+&lvds0 {
        status = "okay";
 
-       clocks = <&cpg CPG_MOD 724>,
-                <&cpg CPG_MOD 723>,
-                <&x12_clk>;
-       clock-names = "du.0", "du.1", "dclkin.0";
+       clocks = <&cpg CPG_MOD 727>,
+                <&x12_clk>,
+                <&extal_clk>;
+       clock-names = "fck", "dclkin.0", "extal";
 
        ports {
-               port@0 {
-                       endpoint {
-                               remote-endpoint = <&adv7123_in>;
+               port@1 {
+                       lvds0_out: endpoint {
+                               remote-endpoint = <&thc63lvd1024_in>;
                        };
                };
        };
 };
 
-&ehci0 {
-       status = "okay";
+&lvds1 {
+       clocks = <&cpg CPG_MOD 727>,
+                <&x12_clk>,
+                <&extal_clk>;
+       clock-names = "fck", "dclkin.0", "extal";
 };
 
 &ohci0 {
+       dr_mode = "host";
        status = "okay";
 };
 
-&avb {
-       pinctrl-0 = <&avb0_pins>;
+&pfc {
+       avb0_pins: avb {
+               mux {
+                       groups = "avb0_link", "avb0_mdio", "avb0_mii";
+                       function = "avb0";
+               };
+       };
+
+       du_pins: du {
+               groups = "du_rgb888", "du_sync", "du_disp", "du_clk_out_0";
+               function = "du";
+       };
+
+       i2c0_pins: i2c0 {
+               groups = "i2c0";
+               function = "i2c0";
+       };
+
+       i2c1_pins: i2c1 {
+               groups = "i2c1";
+               function = "i2c1";
+       };
+
+       pwm0_pins: pwm0 {
+               groups = "pwm0_c";
+               function = "pwm0";
+       };
+
+       pwm1_pins: pwm1 {
+               groups = "pwm1_c";
+               function = "pwm1";
+       };
+
+       scif2_pins: scif2 {
+               groups = "scif2_data";
+               function = "scif2";
+       };
+
+       sdhi2_pins: sd2 {
+               groups = "mmc_data8", "mmc_ctrl";
+               function = "mmc";
+               power-source = <1800>;
+       };
+
+       sdhi2_pins_uhs: sd2_uhs {
+               groups = "mmc_data8", "mmc_ctrl";
+               function = "mmc";
+               power-source = <1800>;
+       };
+
+       usb0_pins: usb0 {
+               groups = "usb0";
+               function = "usb0";
+       };
+
+       vin4_pins_cvbs: vin4 {
+               groups = "vin4_data8", "vin4_sync", "vin4_clk";
+               function = "vin4";
+       };
+};
+
+&pwm0 {
+       pinctrl-0 = <&pwm0_pins>;
        pinctrl-names = "default";
-       renesas,no-ether-link;
-       phy-handle = <&phy0>;
-       phy-mode = "rgmii-txid";
+
        status = "okay";
+};
 
-       phy0: ethernet-phy@0 {
-               rxc-skew-ps = <1500>;
-               reg = <0>;
-               interrupt-parent = <&gpio5>;
-               interrupts = <19 IRQ_TYPE_LEVEL_LOW>;
-       };
+&pwm1 {
+       pinctrl-0 = <&pwm1_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
+};
+
+&rwdt {
+       timeout-sec = <60>;
+       status = "okay";
 };
 
 &scif2 {
        pinctrl-0 = <&usb0_pins>;
        pinctrl-names = "default";
 
-       status = "okay";
-};
-
-&pwm0 {
-       pinctrl-0 = <&pwm0_pins>;
-       pinctrl-names = "default";
-
-       status = "okay";
-};
-
-&pwm1 {
-       pinctrl-0 = <&pwm1_pins>;
-       pinctrl-names = "default";
-
-       status = "okay";
-};
-
-&rwdt {
-       timeout-sec = <60>;
+       renesas,no-otg-pins;
        status = "okay";
 };
 
index 1f6efafb8b4519f3bc69060de92cea22b145cef3..8e9f6b7a7d5e60d376f2ae851e309aba9e83080f 100644 (file)
@@ -7,12 +7,14 @@
 
 #include "r8a779x-u-boot.dtsi"
 
-&soc {
-       rpc: rpc@0xee200000 {
-               compatible = "renesas,rpc-r8a77995", "renesas,rpc";
-               reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
-               clocks = <&cpg CPG_MOD 917>;
-               bank-width = <2>;
-               status = "disabled";
+/ {
+       soc {
+               rpc: rpc@0xee200000 {
+                       compatible = "renesas,rpc-r8a77995", "renesas,rpc";
+                       reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
+                       clocks = <&cpg CPG_MOD 917>;
+                       bank-width = <2>;
+                       status = "disabled";
+               };
        };
 };
index 1efef62182d1c38d05ba5ba1907c55313769583c..5bf3af246e14c29f313899df7d75c02dc7799010 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * Device Tree Source for the r8a77995 SoC
+ * Device Tree Source for the R-Car D3 (R8A77995) SoC
  *
  * Copyright (C) 2016 Renesas Electronics Corp.
  * Copyright (C) 2017 Glider bvba
@@ -27,7 +27,7 @@
                #size-cells = <0>;
 
                a53_0: cpu@0 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x0>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A77995_PD_CA53_CPU0>;
@@ -66,7 +66,7 @@
                clock-frequency = <0>;
        };
 
-       soc: soc {
+       soc {
                compatible = "simple-bus";
                interrupt-parent = <&gic>;
                #address-cells = <2>;
                        status = "disabled";
                };
 
+               hsusb: usb@e6590000 {
+                       compatible = "renesas,usbhs-r8a77995",
+                                    "renesas,rcar-gen3-usbhs";
+                       reg = <0 0xe6590000 0 0x200>;
+                       interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 704>, <&cpg CPG_MOD 703>;
+                       dmas = <&usb_dmac0 0>, <&usb_dmac0 1>,
+                              <&usb_dmac1 0>, <&usb_dmac1 1>;
+                       dma-names = "ch0", "ch1", "ch2", "ch3";
+                       renesas,buswait = <11>;
+                       phys = <&usb2_phy0>;
+                       phy-names = "usb";
+                       power-domains = <&sysc R8A77995_PD_ALWAYS_ON>;
+                       resets = <&cpg 704>, <&cpg 703>;
+                       status = "disabled";
+               };
+
+               usb_dmac0: dma-controller@e65a0000 {
+                       compatible = "renesas,r8a77995-usb-dmac",
+                                    "renesas,usb-dmac";
+                       reg = <0 0xe65a0000 0 0x100>;
+                       interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "ch0", "ch1";
+                       clocks = <&cpg CPG_MOD 330>;
+                       power-domains = <&sysc R8A77995_PD_ALWAYS_ON>;
+                       resets = <&cpg 330>;
+                       #dma-cells = <1>;
+                       dma-channels = <2>;
+               };
+
+               usb_dmac1: dma-controller@e65b0000 {
+                       compatible = "renesas,r8a77995-usb-dmac",
+                                    "renesas,usb-dmac";
+                       reg = <0 0xe65b0000 0 0x100>;
+                       interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH
+                                     GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "ch0", "ch1";
+                       clocks = <&cpg CPG_MOD 331>;
+                       power-domains = <&sysc R8A77995_PD_ALWAYS_ON>;
+                       resets = <&cpg 331>;
+                       #dma-cells = <1>;
+                       dma-channels = <2>;
+               };
+
                canfd: can@e66c0000 {
                        compatible = "renesas,r8a77995-canfd",
                                     "renesas,rcar-gen3-canfd";
                        resets = <&cpg 219>;
                        #dma-cells = <1>;
                        dma-channels = <8>;
+                       iommus = <&ipmmu_ds0 0>, <&ipmmu_ds0 1>,
+                              <&ipmmu_ds0 2>, <&ipmmu_ds0 3>,
+                              <&ipmmu_ds0 4>, <&ipmmu_ds0 5>,
+                              <&ipmmu_ds0 6>, <&ipmmu_ds0 7>;
                };
 
                dmac1: dma-controller@e7300000 {
                        resets = <&cpg 218>;
                        #dma-cells = <1>;
                        dma-channels = <8>;
+                       iommus = <&ipmmu_ds1 0>, <&ipmmu_ds1 1>,
+                              <&ipmmu_ds1 2>, <&ipmmu_ds1 3>,
+                              <&ipmmu_ds1 4>, <&ipmmu_ds1 5>,
+                              <&ipmmu_ds1 6>, <&ipmmu_ds1 7>;
                };
 
                dmac2: dma-controller@e7310000 {
                        resets = <&cpg 217>;
                        #dma-cells = <1>;
                        dma-channels = <8>;
+                       iommus = <&ipmmu_ds1 16>, <&ipmmu_ds1 17>,
+                              <&ipmmu_ds1 18>, <&ipmmu_ds1 19>,
+                              <&ipmmu_ds1 20>, <&ipmmu_ds1 21>,
+                              <&ipmmu_ds1 22>, <&ipmmu_ds1 23>;
                };
 
                ipmmu_ds0: mmu@e6740000 {
                        compatible = "generic-ohci";
                        reg = <0 0xee080000 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        phys = <&usb2_phy0>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A77995_PD_ALWAYS_ON>;
-                       resets = <&cpg 703>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        status = "disabled";
                };
 
                        compatible = "generic-ehci";
                        reg = <0 0xee080100 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        phys = <&usb2_phy0>;
                        phy-names = "usb";
                        companion = <&ohci0>;
                        power-domains = <&sysc R8A77995_PD_ALWAYS_ON>;
-                       resets = <&cpg 703>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        status = "disabled";
                };
 
                                     "renesas,rcar-gen3-usb2-phy";
                        reg = <0 0xee080200 0 0x700>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        power-domains = <&sysc R8A77995_PD_ALWAYS_ON>;
-                       resets = <&cpg 703>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        #phy-cells = <0>;
                        status = "disabled";
                };
                                port@1 {
                                        reg = <1>;
                                        du_out_lvds0: endpoint {
+                                               remote-endpoint = <&lvds0_in>;
                                        };
                                };
 
                                port@2 {
                                        reg = <2>;
                                        du_out_lvds1: endpoint {
+                                               remote-endpoint = <&lvds1_in>;
+                                       };
+                               };
+                       };
+               };
+
+               lvds0: lvds-encoder@feb90000 {
+                       compatible = "renesas,r8a77995-lvds";
+                       reg = <0 0xfeb90000 0 0x20>;
+                       clocks = <&cpg CPG_MOD 727>;
+                       power-domains = <&sysc R8A77995_PD_ALWAYS_ON>;
+                       resets = <&cpg 727>;
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+                                       lvds0_in: endpoint {
+                                               remote-endpoint = <&du_out_lvds0>;
+                                       };
+                               };
+
+                               port@1 {
+                                       reg = <1>;
+                                       lvds0_out: endpoint {
+                                       };
+                               };
+                       };
+               };
+
+               lvds1: lvds-encoder@feb90100 {
+                       compatible = "renesas,r8a77995-lvds";
+                       reg = <0 0xfeb90100 0 0x20>;
+                       clocks = <&cpg CPG_MOD 727>;
+                       power-domains = <&sysc R8A77995_PD_ALWAYS_ON>;
+                       resets = <&cpg 726>;
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+                                       lvds1_in: endpoint {
+                                               remote-endpoint = <&du_out_lvds1>;
+                                       };
+                               };
+
+                               port@1 {
+                                       reg = <1>;
+                                       lvds1_out: endpoint {
                                        };
                                };
                        };
index 49ba3f3f1432c8345dc9f187960e67feb898910a..916dd486de094f95358d5eac76dc9ee6ad98769c 100644 (file)
 
        spi_flash: spiflash@0 {
                u-boot,dm-pre-reloc;
-               compatible = "spidev", "spi-flash";
+               compatible = "spidev", "jedec,spi-nor";
                spi-max-frequency = <20000000>; /* Reduce for Dediprog em100 pro */
                reg = <0>;
        };
index 5e578b175b5e7fb13eb4da8c67da3a7f32872eaf..28145420837a573c36746b770f1a112644ebe39c 100644 (file)
        #size-cells = <0>;
 
        spiflash: w25q32dw@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                reg = <0>;
                spi-max-frequency = <49500000>;
                spi-cpol;
index df19263accb1790b9867b371b3da8bb3f8465eff..4cdb4320b76cb48a6e794ccc74475ee8e6be3b57 100644 (file)
@@ -552,7 +552,7 @@ ap_i2c_audio: &i2c8 {
 
        spi_flash: spiflash@0 {
                u-boot,dm-pre-reloc;
-               compatible = "jedec,spi-nor", "spi-flash";
+               compatible = "jedec,spi-nor";
                reg = <0>;
 
                /* May run faster once verified. */
index 8304f67192cfdb5c9d8a04799c8be6e192c29881..aec13a28f1abc340ae9e035959fdc4fe99191e9b 100644 (file)
        spiflash: w25q32dw@0 {
                u-boot,dm-pre-reloc;
 
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                reg = <0>;
                spi-max-frequency = <49500000>;
                spi-cpol;
index ccb9969da0e324c43194e648b17f7bd77fe93e38..c91776bc106eb355f81f060de203f81bcde7eecf 100644 (file)
@@ -45,7 +45,7 @@
 &sfc {
        status = "okay";
        flash@0 {
-               compatible = "gd25q256","spi-flash";
+               compatible = "gd25q256","jedec,spi-nor";
                reg = <0>;
                spi-tx-bus-width = <1>;
                spi-rx-bus-width = <1>;
index 7d3d866a006352ac196b52002c9c9ce8899f5208..a225c2457274763fd558ad3aa72153c228afa51a 100644 (file)
 
        video-receiver@70 {
                compatible = "adi,adv7482";
-               reg = <0x70>;
+               reg = <0x70 0x71 0x72 0x73 0x74 0x75
+                      0x60 0x61 0x62 0x63 0x64 0x65>;
+               reg-names = "main", "dpll", "cp", "hdmi", "edid", "repeater",
+                           "infoframe", "cbus", "cec", "sdp", "txa", "txb" ;
 
                #address-cells = <1>;
                #size-cells = <0>;
 &i2c_dvfs {
        status = "okay";
 
+       clock-frequency = <400000>;
+
        pmic: pmic@30 {
                pinctrl-0 = <&irq0_pins>;
                pinctrl-names = "default";
        };
 
        sdhi2_pins: sd2 {
-               groups = "sdhi2_data8", "sdhi2_ctrl", "sdhi2_ds";
-               function = "sdhi2";
-               power-source = <3300>;
-       };
-
-       sdhi2_pins_uhs: sd2_uhs {
                groups = "sdhi2_data8", "sdhi2_ctrl", "sdhi2_ds";
                function = "sdhi2";
                power-source = <1800>;
                 <&cpg CPG_CORE CPG_AUDIO_CLK_I>;
 
        ports {
+               #address-cells = <1>;
+               #size-cells = <0>;
                rsnd_port0: port@0 {
+                       reg = <0>;
                        rsnd_endpoint0: endpoint {
                                remote-endpoint = <&ak4613_endpoint>;
 
        wp-gpios = <&gpio3 13 GPIO_ACTIVE_HIGH>;
        bus-width = <4>;
        sd-uhs-sdr50;
+       sd-uhs-sdr104;
        status = "okay";
 };
 
 &sdhi2 {
        /* used for on-board 8bit eMMC */
        pinctrl-0 = <&sdhi2_pins>;
-       pinctrl-1 = <&sdhi2_pins_uhs>;
+       pinctrl-1 = <&sdhi2_pins>;
        pinctrl-names = "default", "state_uhs";
 
        vmmc-supply = <&reg_3p3v>;
        vqmmc-supply = <&reg_1p8v>;
        bus-width = <8>;
        mmc-hs200-1_8v;
+       mmc-hs400-1_8v;
        non-removable;
        fixed-emmc-driver-type = <1>;
        status = "okay";
        wp-gpios = <&gpio4 16 GPIO_ACTIVE_HIGH>;
        bus-width = <4>;
        sd-uhs-sdr50;
+       sd-uhs-sdr104;
        status = "okay";
 };
 
        phys = <&usb3_phy0>;
        phy-names = "usb";
 
+       companion = <&xhci0>;
+
        status = "okay";
 };
 
index 9efcf635ad5100147b11488627ef68a788da70f6..ea7540bcfcf7278ba73167002a860051ddb4dc83 100644 (file)
@@ -66,7 +66,7 @@
                                u-boot,dm-pre-reloc;
 
                                spi_flash@0 {
-                                       compatible = "spi-flash";
+                                       compatible = "jedec,spi-nor";
                                        reg = <0>;
                                        spi-max-frequency = <50000000>;
                                        spi-rx-bus-width = <4>;
index f9ef905ff541952e075ab7f3546193dae7d03981..c75b76aef2a4da7c28544e5e6e55cf1dfcef5cb3 100644 (file)
@@ -35,7 +35,7 @@
                                u-boot,dm-pre-reloc;
 
                                spi_flash@0 {
-                                       compatible = "spi-flash";
+                                       compatible = "jedec,spi-nor";
                                        spi-max-frequency = <50000000>;
                                        reg = <0>;
                                        u-boot,dm-pre-reloc;
index 9792b2a9d08f74a7b1fa883f972ffcccca6c23e7..5566fde51489cc73a05a054d4c7c2593153bfb64 100644 (file)
@@ -32,7 +32,7 @@
                                dmas = <0>, <0>;        /*  Do not use DMA for spi0 */
 
                                spi_flash@0 {
-                                       compatible = "spi-flash";
+                                       compatible = "jedec,spi-nor";
                                        spi-max-frequency = <50000000>;
                                        reg = <0>;
                                };
diff --git a/arch/arm/dts/socfpga-common-u-boot.dtsi b/arch/arm/dts/socfpga-common-u-boot.dtsi
new file mode 100644 (file)
index 0000000..322c858
--- /dev/null
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * U-Boot additions
+ *
+ * Copyright (c) 2019 Simon Goldschmidt
+ */
+/{
+       soc {
+               u-boot,dm-pre-reloc;
+       };
+};
+
+&rst {
+       u-boot,dm-pre-reloc;
+};
+
+&sdr {
+       u-boot,dm-pre-reloc;
+};
index 2458d6707dc566953cd3d7f71ad06a58011d3b7c..51a6a51b5380e920b6db44e095b096fbfbca81a5 100644 (file)
@@ -84,6 +84,7 @@
                                #dma-requests = <32>;
                                clocks = <&l4_main_clk>;
                                clock-names = "apb_pclk";
+                               resets = <&rst DMA_RESET>;
                        };
                };
 
                        reg = <0xffc00000 0x1000>;
                        interrupts = <0 131 4>, <0 132 4>, <0 133 4>, <0 134 4>;
                        clocks = <&can0_clk>;
+                       resets = <&rst CAN0_RESET>;
                        status = "disabled";
                };
 
                        reg = <0xffc01000 0x1000>;
                        interrupts = <0 135 4>, <0 136 4>, <0 137 4>, <0 138 4>;
                        clocks = <&can1_clk>;
+                       resets = <&rst CAN1_RESET>;
                        status = "disabled";
                };
 
                        compatible = "snps,dw-apb-gpio";
                        reg = <0xff708000 0x1000>;
                        clocks = <&l4_mp_clk>;
+                       resets = <&rst GPIO0_RESET>;
                        status = "disabled";
 
                        porta: gpio-controller@0 {
                        compatible = "snps,dw-apb-gpio";
                        reg = <0xff709000 0x1000>;
                        clocks = <&l4_mp_clk>;
+                       resets = <&rst GPIO1_RESET>;
                        status = "disabled";
 
                        portb: gpio-controller@0 {
                        compatible = "snps,dw-apb-gpio";
                        reg = <0xff70a000 0x1000>;
                        clocks = <&l4_mp_clk>;
+                       resets = <&rst GPIO2_RESET>;
                        status = "disabled";
 
                        portc: gpio-controller@0 {
                        #size-cells = <0>;
                        clocks = <&l4_mp_clk>, <&sdmmc_clk_divided>;
                        clock-names = "biu", "ciu";
+                       resets = <&rst SDMMC_RESET>;
                        status = "disabled";
                };
 
                              <0xffb80000 0x10000>;
                        reg-names = "nand_data", "denali_reg";
                        interrupts = <0x0 0x90 0x4>;
-                       dma-mask = <0xffffffff>;
                        clocks = <&nand_clk>, <&nand_x_clk>, <&nand_ecc_clk>;
                        clock-names = "nand", "nand_x", "ecc";
+                       resets = <&rst NAND_RESET>;
                        status = "disabled";
                };
 
 
                qspi: spi@ff705000 {
                        compatible = "cdns,qspi-nor";
-                        #address-cells = <1>;
+                       #address-cells = <1>;
                        #size-cells = <0>;
                        reg = <0xff705000 0x1000>,
                              <0xffa00000 0x1000>;
                        cdns,fifo-width = <4>;
                        cdns,trigger-address = <0x00000000>;
                        clocks = <&qspi_clk>;
+                       resets = <&rst QSPI_RESET>;
                        status = "disabled";
                };
 
                        reg = <0xfffec000 0x100>;
                };
 
-               sdr: sdr@ffc25000 {
+               sdr: sdr@ffc20000 {
                        compatible = "altr,sdr-ctl", "syscon";
-                       reg = <0xffc25000 0x1000>;
+                       reg = <0xffc20000 0x6000>;
+                       resets = <&rst SDR_RESET>;
                };
 
                sdramedac {
                        interrupts = <0 154 4>;
                        num-cs = <4>;
                        clocks = <&spi_m_clk>;
+                       resets = <&rst SPIM0_RESET>;
                        status = "disabled";
                };
 
                        interrupts = <0 155 4>;
                        num-cs = <4>;
                        clocks = <&spi_m_clk>;
+                       resets = <&rst SPIM1_RESET>;
                        status = "disabled";
                };
 
                        dmas = <&pdma 28>,
                               <&pdma 29>;
                        dma-names = "tx", "rx";
+                       resets = <&rst UART0_RESET>;
                };
 
                uart1: serial1@ffc03000 {
                        dmas = <&pdma 30>,
                               <&pdma 31>;
                        dma-names = "tx", "rx";
+                       resets = <&rst UART1_RESET>;
                };
 
                usbphy0: usbphy {
                        reg = <0xffd02000 0x1000>;
                        interrupts = <0 171 4>;
                        clocks = <&osc1>;
+                       resets = <&rst L4WD0_RESET>;
                        status = "disabled";
                };
 
                        reg = <0xffd03000 0x1000>;
                        interrupts = <0 172 4>;
                        clocks = <&osc1>;
+                       resets = <&rst L4WD1_RESET>;
                        status = "disabled";
                };
        };
index c44d1ee2fa188b7262e70499865a7b5b4e2e63e7..dfaff4c0f7bb8e2a1e20de4ad6aa40b3f8022191 100644 (file)
@@ -6,15 +6,13 @@
  * Copyright (c) 2018 Simon Goldschmidt
  */
 
+#include "socfpga-common-u-boot.dtsi"
+
 /{
        aliases {
                spi0 = "/soc/spi@ff705000";
                udc0 = &usb1;
        };
-
-       soc {
-               u-boot,dm-pre-reloc;
-       };
 };
 
 &watchdog0 {
@@ -30,7 +28,7 @@
 };
 
 &flash {
-       compatible = "n25q00", "spi-flash";
+       compatible = "n25q00", "jedec,spi-nor";
        u-boot,dm-pre-reloc;
 };
 
index a3870716740f03edc0c1f9ab1667be074e48e34a..6439daa525d9ec4a315fec9b3eaa96d3234380e4 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 #include "socfpga_cyclone5.dtsi"
+#include "socfpga-common-u-boot.dtsi"
 
 / {
        model = "Devboards.de DBM-SoC1";
                device_type = "memory";
                reg = <0x0 0x40000000>; /* 1GB */
        };
-
-       soc {
-               u-boot,dm-pre-reloc;
-       };
 };
 
 &gmac1 {
index 08d81da16907f18d79b808fe539251442b659329..0219c6948d4f4a600a0756db3b69aa72564d8a13 100644 (file)
@@ -6,14 +6,12 @@
  * Copyright (c) 2018 Simon Goldschmidt
  */
 
+#include "socfpga-common-u-boot.dtsi"
+
 /{
        aliases {
                udc0 = &usb1;
        };
-
-       soc {
-               u-boot,dm-pre-reloc;
-       };
 };
 
 &watchdog0 {
index e9105743ea039f376a5902f7ce4c7bdb5dbbdd1a..b620dd8dda560823c9a507d652c092844a9d2409 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include "socfpga_cyclone5.dtsi"
+#include "socfpga-common-u-boot.dtsi"
 
 / {
        model = "Terasic DE10-Nano";
                device_type = "memory";
                reg = <0x0 0x40000000>; /* 1GB */
        };
-
-       soc {
-               u-boot,dm-pre-reloc;
-       };
 };
 
 &gmac1 {
index 4f076bce93ebd8c1e9b2e71c1bfef312f120516b..ff1e61e0cbe9ed87b1231137deb6595af987ea36 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 #include "socfpga_cyclone5.dtsi"
+#include "socfpga-common-u-boot.dtsi"
 
 / {
        model = "Terasic DE1-SoC";
                device_type = "memory";
                reg = <0x0 0x40000000>; /* 1GB */
        };
-
-       soc {
-               u-boot,dm-pre-reloc;
-       };
 };
 
 &gmac1 {
index b7054bfd5af514bc4ba0fc21b48757aa88cb7dab..2d314129230cf5e9082ae12eb5891c082c4a8406 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 #include "socfpga_cyclone5.dtsi"
+#include "socfpga-common-u-boot.dtsi"
 
 / {
        model = "SoCFPGA Cyclone V IS1";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
        };
-
-       soc {
-               u-boot,dm-pre-reloc;
-       };
 };
 
 &gmac1 {
@@ -91,7 +88,7 @@
                u-boot,dm-pre-reloc;
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "n25q00", "spi-flash";
+               compatible = "n25q00", "jedec,spi-nor";
                reg = <0>;      /* chip select */
                spi-max-frequency = <100000000>;
                m25p,fast-read;
index 9436e0fa8b1ba725821ea69aefa324d69ff93cf5..7d9874cafa0bc63d7c6ebad28fab9d5fceabe199 100644 (file)
@@ -6,15 +6,13 @@
  * Copyright (c) 2018 Simon Goldschmidt
  */
 
+#include "socfpga-common-u-boot.dtsi"
+
 /{
        aliases {
                spi0 = "/soc/spi@ff705000";
                udc0 = &usb1;
        };
-
-       soc {
-               u-boot,dm-pre-reloc;
-       };
 };
 
 &can0 {
@@ -34,7 +32,7 @@
 };
 
 &flash0 {
-       compatible = "n25q00", "spi-flash";
+       compatible = "n25q00", "jedec,spi-nor";
        u-boot,dm-pre-reloc;
 
        partition@qspi-boot {
index 648f1bd01d74fc7b177641529e1dcc08b23913d7..85cc396a701586521a9a2e85e52d8bfef848263f 100644 (file)
@@ -6,15 +6,13 @@
  * Copyright (c) 2018 Simon Goldschmidt
  */
 
+#include "socfpga-common-u-boot.dtsi"
+
 /{
        aliases {
                spi0 = "/soc/spi@ff705000";
                udc0 = &usb1;
        };
-
-       soc {
-               u-boot,dm-pre-reloc;
-       };
 };
 
 &watchdog0 {
@@ -30,7 +28,7 @@
 };
 
 &flash {
-       compatible = "n25q00", "spi-flash";
+       compatible = "n25q00", "jedec,spi-nor";
        u-boot,dm-pre-reloc;
 };
 
index 31bd1dba0ffcc39a5f695a6ccdb82dbb2b8fa9bb..0a4d54e30479f9f5854a362c3c0f06b2c8d4283c 100644 (file)
@@ -6,15 +6,13 @@
  * Copyright (c) 2018 Simon Goldschmidt
  */
 
+#include "socfpga-common-u-boot.dtsi"
+
 /{
        aliases {
                spi0 = "/soc/spi@ff705000";
                udc0 = &usb1;
        };
-
-       soc {
-               u-boot,dm-pre-reloc;
-       };
 };
 
 &watchdog0 {
@@ -30,7 +28,7 @@
 };
 
 &flash {
-       compatible = "n25q256a", "spi-flash";
+       compatible = "n25q256a", "jedec,spi-nor";
        u-boot,dm-pre-reloc;
 };
 
index 93c3fa4a48aad05f588ae7d4772205bb23bec5cb..8d5d3996f6f27122412d68072767d621fa11ae8f 100644 (file)
@@ -76,7 +76,6 @@
 
 &qspi {
        status = "okay";
-       u-boot,dm-pre-reloc;
 
        flash: flash@0 {
                #address-cells = <1>;
@@ -91,6 +90,5 @@
                cdns,tchsh-ns = <4>;
                cdns,tslch-ns = <4>;
                status = "okay";
-               u-boot,dm-pre-reloc;
        };
 };
index 6a6c29be79be91a2235a702c741c45edb454b692..bb29da6d6c926c24138bf3aa5b9e69f015a4b288 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 #include "socfpga_cyclone5.dtsi"
+#include "socfpga-common-u-boot.dtsi"
 
 / {
        model = "SoCFPGA Cyclone V SR1500";
                device_type = "memory";
                reg = <0x0 0x40000000>; /* 1GB */
        };
-
-       soc {
-               u-boot,dm-pre-reloc;
-       };
 };
 
 &gmac1 {
@@ -99,7 +96,7 @@
                u-boot,dm-pre-reloc;
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "n25q00", "spi-flash";
+               compatible = "n25q00", "jedec,spi-nor";
                reg = <0>;      /* chip select */
                spi-max-frequency = <100000000>;
                m25p,fast-read;
index 360b946ba2350f61d7a2fab045a7c1d66b68dd84..db55a4ecadbc8666146c0515630851b09ba36291 100644 (file)
@@ -6,15 +6,13 @@
  * Copyright (c) 2018 Simon Goldschmidt
  */
 
+#include "socfpga-common-u-boot.dtsi"
+
 /{
        aliases {
                spi0 = "/soc/spi@ff705000";
                udc0 = &usb0;
        };
-
-       soc {
-               u-boot,dm-pre-reloc;
-       };
 };
 
 &watchdog0 {
        u-boot,dm-pre-reloc;
 
        n25q128@0 {
-               compatible = "n25q128", "spi-flash";
+               compatible = "n25q128", "jedec,spi-nor";
                u-boot,dm-pre-reloc;
        };
        n25q00@1 {
-               compatible = "n25q00", "spi-flash";
+               compatible = "n25q00", "jedec,spi-nor";
                u-boot,dm-pre-reloc;
        };
 };
old mode 100644 (file)
new mode 100755 (executable)
index ee93725..d1ae2fa
                        reg = <0xffe00000 0x100000>;
                };
 
+               qspi: spi@ff8d2000 {
+                       compatible = "cdns,qspi-nor";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0xff8d2000 0x100>,
+                             <0xff900000 0x100000>;
+                       interrupts = <0 3 4>;
+                       cdns,fifo-depth = <128>;
+                       cdns,fifo-width = <4>;
+                       cdns,trigger-address = <0x00000000>;
+                       status = "disabled";
+               };
+
                rst: rstmgr@ffd11000 {
                        #reset-cells = <1>;
                        compatible = "altr,rst-mgr";
diff --git a/arch/arm/dts/socfpga_stratix10_socdk-u-boot.dtsi b/arch/arm/dts/socfpga_stratix10_socdk-u-boot.dtsi
new file mode 100755 (executable)
index 0000000..e1cfb52
--- /dev/null
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * U-Boot additions
+ *
+ * Copyright (C) 2019 Intel Corporation <www.intel.com>
+ */
+
+/{
+       aliases {
+               spi0 = &qspi;
+       };
+};
+
+&qspi {
+       status = "okay";
+       u-boot,dm-pre-reloc;
+};
+
+&flash0 {
+       compatible = "jedec,spi-nor";
+       spi-max-frequency = <100000000>;
+       spi-tx-bus-width = <4>;
+       spi-rx-bus-width = <4>;
+       u-boot,dm-pre-reloc;
+};
old mode 100644 (file)
new mode 100755 (executable)
index 6e8ddcd..2745050
@@ -36,7 +36,9 @@
 
        memory {
                device_type = "memory";
-               reg = <0 0 0 0x80000000>; /* 2GB */
+               /* 4GB */
+               reg = <0 0x00000000 0 0x80000000>,
+                     <1 0x80000000 0 0x80000000>;
                u-boot,dm-pre-reloc;
        };
 };
        smplsel = <0>;
 };
 
+&qspi {
+       flash0: flash@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "n25q00a";
+               reg = <0>;
+               spi-max-frequency = <50000000>;
+
+               m25p,fast-read;
+               cdns,page-size = <256>;
+               cdns,block-size = <16>;
+               cdns,read-delay = <1>;
+               cdns,tshsl-ns = <50>;
+               cdns,tsd2d-ns = <50>;
+               cdns,tchsh-ns = <4>;
+               cdns,tslch-ns = <4>;
+
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       qspi_boot: partition@0 {
+                               label = "Boot and fpga data";
+                               reg = <0x0 0x4000000>;
+                       };
+
+                       qspi_rootfs: partition@4000000 {
+                               label = "Root Filesystem - JFFS2";
+                               reg = <0x4000000 0x4000000>;
+                       };
+               };
+       };
+};
+
 &uart0 {
        status = "okay";
 };
index 7ef33d6381304c495079af06656b2a93fff0602c..babd37f1c11b57c269e58e48ae70535eba6eb85d 100644 (file)
        qflash0: n25q128a {
                        #address-cells = <1>;
                        #size-cells = <1>;
-                       compatible = "micron,n25q128a13", "spi-flash";
+                       compatible = "micron,n25q128a13", "jedec,spi-nor";
                        spi-max-frequency = <108000000>;
                        spi-tx-bus-width = <1>;
                        spi-rx-bus-width = <1>;
index 1e8ef742ceade6994ca5be12f20cdc35169dd983..a23d02d3008751570eb3026401c2efd4f8339360 100644 (file)
        qflash0: n25q128a {
                        #address-cells = <1>;
                        #size-cells = <1>;
-                       compatible = "micron,n25q128a13", "spi-flash";
+                       compatible = "micron,n25q128a13", "jedec,spi-nor";
                        spi-max-frequency = <108000000>;
                        spi-tx-bus-width = <1>;
                        spi-rx-bus-width = <1>;
diff --git a/arch/arm/dts/stm32mp15-ddr3-1x4Gb-1066-binG.dtsi b/arch/arm/dts/stm32mp15-ddr3-1x4Gb-1066-binG.dtsi
new file mode 100644 (file)
index 0000000..7d9b95c
--- /dev/null
@@ -0,0 +1,120 @@
+// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
+/*
+ * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
+ *
+ * STM32MP157C DK1/DK2 BOARD configuration
+ * 1x DDR3L 4Gb, 16-bit, 533MHz.
+ * Reference used NT5CC256M16DP-DI from NANYA
+ *
+ * DDR type / Platform DDR3/3L
+ * freq                533MHz
+ * width       16
+ * datasheet   0  = MT41J256M16-187 / DDR3-1066 bin G
+ * DDR density 4
+ * timing mode optimized
+ * Scheduling/QoS options : type = 2
+ * address mapping : RBC
+ * Tc > + 85C : N
+ */
+#define DDR_MEM_NAME "DDR3-1066/888 bin G 1x4Gb 533MHz v1.43"
+#define DDR_MEM_SPEED 533
+#define DDR_MEM_SIZE 0x20000000
+
+#define DDR_MSTR 0x00041401
+#define DDR_MRCTRL0 0x00000010
+#define DDR_MRCTRL1 0x00000000
+#define DDR_DERATEEN 0x00000000
+#define DDR_DERATEINT 0x00800000
+#define DDR_PWRCTL 0x00000000
+#define DDR_PWRTMG 0x00400010
+#define DDR_HWLPCTL 0x00000000
+#define DDR_RFSHCTL0 0x00210000
+#define DDR_RFSHCTL3 0x00000000
+#define DDR_RFSHTMG 0x0081008B
+#define DDR_CRCPARCTL0 0x00000000
+#define DDR_DRAMTMG0 0x121B2414
+#define DDR_DRAMTMG1 0x000A041C
+#define DDR_DRAMTMG2 0x0608090F
+#define DDR_DRAMTMG3 0x0050400C
+#define DDR_DRAMTMG4 0x08040608
+#define DDR_DRAMTMG5 0x06060403
+#define DDR_DRAMTMG6 0x02020002
+#define DDR_DRAMTMG7 0x00000202
+#define DDR_DRAMTMG8 0x00001005
+#define DDR_DRAMTMG14 0x000000A0
+#define DDR_ZQCTL0 0xC2000040
+#define DDR_DFITMG0 0x02060105
+#define DDR_DFITMG1 0x00000202
+#define DDR_DFILPCFG0 0x07000000
+#define DDR_DFIUPD0 0xC0400003
+#define DDR_DFIUPD1 0x00000000
+#define DDR_DFIUPD2 0x00000000
+#define DDR_DFIPHYMSTR 0x00000000
+#define DDR_ADDRMAP1 0x00070707
+#define DDR_ADDRMAP2 0x00000000
+#define DDR_ADDRMAP3 0x1F000000
+#define DDR_ADDRMAP4 0x00001F1F
+#define DDR_ADDRMAP5 0x06060606
+#define DDR_ADDRMAP6 0x0F060606
+#define DDR_ADDRMAP9 0x00000000
+#define DDR_ADDRMAP10 0x00000000
+#define DDR_ADDRMAP11 0x00000000
+#define DDR_ODTCFG 0x06000600
+#define DDR_ODTMAP 0x00000001
+#define DDR_SCHED 0x00000C01
+#define DDR_SCHED1 0x00000000
+#define DDR_PERFHPR1 0x01000001
+#define DDR_PERFLPR1 0x08000200
+#define DDR_PERFWR1 0x08000400
+#define DDR_DBG0 0x00000000
+#define DDR_DBG1 0x00000000
+#define DDR_DBGCMD 0x00000000
+#define DDR_POISONCFG 0x00000000
+#define DDR_PCCFG 0x00000010
+#define DDR_PCFGR_0 0x00010000
+#define DDR_PCFGW_0 0x00000000
+#define DDR_PCFGQOS0_0 0x02100C03
+#define DDR_PCFGQOS1_0 0x00800100
+#define DDR_PCFGWQOS0_0 0x01100C03
+#define DDR_PCFGWQOS1_0 0x01000200
+#define DDR_PCFGR_1 0x00010000
+#define DDR_PCFGW_1 0x00000000
+#define DDR_PCFGQOS0_1 0x02100C03
+#define DDR_PCFGQOS1_1 0x00800040
+#define DDR_PCFGWQOS0_1 0x01100C03
+#define DDR_PCFGWQOS1_1 0x01000200
+#define DDR_PGCR 0x01442E02
+#define DDR_PTR0 0x0022AA5B
+#define DDR_PTR1 0x04841104
+#define DDR_PTR2 0x042DA068
+#define DDR_ACIOCR 0x10400812
+#define DDR_DXCCR 0x00000C40
+#define DDR_DSGCR 0xF200001F
+#define DDR_DCR 0x0000000B
+#define DDR_DTPR0 0x38D488D0
+#define DDR_DTPR1 0x098B00D8
+#define DDR_DTPR2 0x10023600
+#define DDR_MR0 0x00000840
+#define DDR_MR1 0x00000000
+#define DDR_MR2 0x00000208
+#define DDR_MR3 0x00000000
+#define DDR_ODTCR 0x00010000
+#define DDR_ZQ0CR1 0x00000038
+#define DDR_DX0GCR 0x0000CE81
+#define DDR_DX0DLLCR 0x40000000
+#define DDR_DX0DQTR 0xFFFFFFFF
+#define DDR_DX0DQSTR 0x3DB02000
+#define DDR_DX1GCR 0x0000CE81
+#define DDR_DX1DLLCR 0x40000000
+#define DDR_DX1DQTR 0xFFFFFFFF
+#define DDR_DX1DQSTR 0x3DB02000
+#define DDR_DX2GCR 0x0000CE81
+#define DDR_DX2DLLCR 0x40000000
+#define DDR_DX2DQTR 0xFFFFFFFF
+#define DDR_DX2DQSTR 0x3DB02000
+#define DDR_DX3GCR 0x0000CE81
+#define DDR_DX3DLLCR 0x40000000
+#define DDR_DX3DQTR 0xFFFFFFFF
+#define DDR_DX3DQSTR 0x3DB02000
+
+#include "stm32mp15-ddr.dtsi"
index 85da5926551c608124ae54288c5762d147517aae..0aae69b0a04818a8e94075dfdf7ba3d8d88bc9d6 100644 (file)
                                gpio-ranges = <&pinctrl 0 160 8>;
                        };
 
+                       adc12_usb_pwr_pins_a: adc12-usb-pwr-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)>;
                                };
                        };
 
+                       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('A', 2, AF11)>, /* ETH_MDIO */
+                                                <STM32_PINMUX('C', 1, AF11)>; /* ETH_MDC */
+                                       bias-disable;
+                                       drive-push-pull;
+                                       slew-rate = <3>;
+                               };
+                               pins2 {
+                                       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 */
+                               };
+                       };
+
                        i2c1_pins_a: i2c1-0 {
                                pins {
                                        pinmux = <STM32_PINMUX('D', 12, AF5)>, /* I2C1_SCL */
                                };
                        };
 
+                       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;
+                               };
+                       };
+
                        pwm2_pins_a: pwm2-0 {
                                pins {
                                        pinmux = <STM32_PINMUX('A', 3, AF1)>; /* TIM2_CH4 */
                                };
                        };
 
+                       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 */
                                        slew-rate = <0>;
                                };
                        };
+
+                       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;
+                               };
+                       };
                };
        };
 };
index 90d13f35c4622f61f3f38b10c2b36caa4949d0dd..ab6f673ea24c78885550618e9e9f1a32102e8cd1 100644 (file)
@@ -17,6 +17,8 @@
                gpio9 = &gpioj;
                gpio10 = &gpiok;
                gpio25 = &gpioz;
+               pinctrl0 = &pinctrl;
+               pinctrl1 = &pinctrl_z;
        };
 
        config {
        };
 };
 
+&bsec {
+       u-boot,dm-pre-reloc;
+};
+
 &clk_hsi {
        u-boot,dm-pre-reloc;
 };
diff --git a/arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi b/arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi
new file mode 100644 (file)
index 0000000..0f32a38
--- /dev/null
@@ -0,0 +1,200 @@
+// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
+/*
+ * Copyright : STMicroelectronics 2018
+ */
+
+#include <dt-bindings/clock/stm32mp1-clksrc.h>
+#include "stm32mp157-u-boot.dtsi"
+#include "stm32mp15-ddr3-1x4Gb-1066-binG.dtsi"
+
+/ {
+       aliases {
+               i2c3 = &i2c4;
+               mmc0 = &sdmmc1;
+               usb0 = &usbotg_hs;
+       };
+       config {
+               u-boot,boot-led = "heartbeat";
+               u-boot,error-led = "error";
+               st,adc_usb_pd = <&adc1 18>, <&adc1 19>;
+       };
+       led {
+               red {
+                       label = "error";
+                       gpios = <&gpioa 13 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+                       status = "okay";
+               };
+
+               blue {
+                       default-state = "on";
+               };
+       };
+};
+
+&adc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&adc12_usb_pwr_pins_a>;
+       vdd-supply = <&vdd>;
+       vdda-supply = <&vdd>;
+       vref-supply = <&vrefbuf>;
+       status = "okay";
+       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. 5µs).
+                */
+               st,min-sample-time-nsecs = <5000>;
+               /* ANA0, ANA1, USB Type-C CC1 & CC2 */
+               st,adc-channels = <0 1 18 19>;
+               status = "okay";
+       };
+};
+
+&clk_hse {
+       st,digbypass;
+};
+
+&i2c4 {
+       u-boot,dm-pre-reloc;
+};
+
+&i2c4_pins_a {
+       u-boot,dm-pre-reloc;
+       pins {
+               u-boot,dm-pre-reloc;
+       };
+};
+
+&pmic {
+       u-boot,dm-pre-reloc;
+};
+
+&rcc {
+       st,clksrc = <
+               CLK_MPU_PLL1P
+               CLK_AXI_PLL2P
+               CLK_MCU_PLL3P
+               CLK_PLL12_HSE
+               CLK_PLL3_HSE
+               CLK_PLL4_HSE
+               CLK_RTC_LSE
+               CLK_MCO1_DISABLED
+               CLK_MCO2_DISABLED
+       >;
+
+       st,clkdiv = <
+               1 /*MPU*/
+               0 /*AXI*/
+               0 /*MCU*/
+               1 /*APB1*/
+               1 /*APB2*/
+               1 /*APB3*/
+               1 /*APB4*/
+               2 /*APB5*/
+               23 /*RTC*/
+               0 /*MCO1*/
+               0 /*MCO2*/
+       >;
+
+       st,pkcs = <
+               CLK_CKPER_HSE
+               CLK_FMC_ACLK
+               CLK_QSPI_ACLK
+               CLK_ETH_DISABLED
+               CLK_SDMMC12_PLL4P
+               CLK_DSI_DSIPLL
+               CLK_STGEN_HSE
+               CLK_USBPHY_HSE
+               CLK_SPI2S1_PLL3Q
+               CLK_SPI2S23_PLL3Q
+               CLK_SPI45_HSI
+               CLK_SPI6_HSI
+               CLK_I2C46_HSI
+               CLK_SDMMC3_PLL4P
+               CLK_USBO_USBPHY
+               CLK_ADC_CKPER
+               CLK_CEC_LSE
+               CLK_I2C12_HSI
+               CLK_I2C35_HSI
+               CLK_UART1_HSI
+               CLK_UART24_HSI
+               CLK_UART35_HSI
+               CLK_UART6_HSI
+               CLK_UART78_HSI
+               CLK_SPDIF_PLL4P
+               CLK_FDCAN_PLL4Q
+               CLK_SAI1_PLL3Q
+               CLK_SAI2_PLL3Q
+               CLK_SAI3_PLL3Q
+               CLK_SAI4_PLL3Q
+               CLK_RNG1_LSI
+               CLK_RNG2_LSI
+               CLK_LPTIM1_PCLK1
+               CLK_LPTIM23_PCLK3
+               CLK_LPTIM45_LSE
+       >;
+
+       /* VCO = 1300.0 MHz => P = 650 (CPU) */
+       pll1: st,pll@0 {
+               cfg = < 2 80 0 0 0 PQR(1,0,0) >;
+               frac = < 0x800 >;
+               u-boot,dm-pre-reloc;
+       };
+
+       /* VCO = 1066.0 MHz => P = 266 (AXI), Q = 533 (GPU), R = 533 (DDR) */
+       pll2: st,pll@1 {
+               cfg = < 2 65 1 0 0 PQR(1,1,1) >;
+               frac = < 0x1400 >;
+               u-boot,dm-pre-reloc;
+       };
+
+       /* VCO = 417.8 MHz => P = 209, Q = 24, R = 11 */
+       pll3: st,pll@2 {
+               cfg = < 1 33 1 16 36 PQR(1,1,1) >;
+               frac = < 0x1a04 >;
+               u-boot,dm-pre-reloc;
+       };
+
+       /* VCO = 594.0 MHz => P = 99, Q = 74, R = 74 */
+       pll4: st,pll@3 {
+               cfg = < 3 98 5 7 7 PQR(1,1,1) >;
+               u-boot,dm-pre-reloc;
+       };
+};
+
+&sdmmc1 {
+       u-boot,dm-spl;
+};
+
+&sdmmc1_b4_pins_a {
+       u-boot,dm-spl;
+       pins {
+               u-boot,dm-spl;
+       };
+};
+
+&uart4 {
+       u-boot,dm-pre-reloc;
+};
+
+&uart4_pins_a {
+       u-boot,dm-pre-reloc;
+       pins1 {
+               u-boot,dm-pre-reloc;
+       };
+       pins2 {
+               u-boot,dm-pre-reloc;
+       };
+};
+
+&usbotg_hs {
+       u-boot,force-b-session-valid;
+       hnp-srp-disable;
+};
+
+&v3v3 {
+       regulator-always-on;
+};
diff --git a/arch/arm/dts/stm32mp157a-dk1.dts b/arch/arm/dts/stm32mp157a-dk1.dts
new file mode 100644 (file)
index 0000000..e36773d
--- /dev/null
@@ -0,0 +1,294 @@
+// 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.
+ */
+
+/dts-v1/;
+
+#include "stm32mp157c.dtsi"
+#include "stm32mp157-pinctrl.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/mfd/st,stpmic1.h>
+
+/ {
+       model = "STMicroelectronics STM32MP157A-DK1 Discovery Board";
+       compatible = "st,stm32mp157a-dk1", "st,stm32mp157";
+
+       aliases {
+               ethernet0 = &ethernet0;
+               serial0 = &uart4;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       memory@c0000000 {
+               reg = <0xc0000000 0x20000000>;
+       };
+
+       led {
+               compatible = "gpio-leds";
+               blue {
+                       label = "heartbeat";
+                       gpios = <&gpiod 11 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "heartbeat";
+                       default-state = "off";
+               };
+       };
+};
+
+&ethernet0 {
+       status = "okay";
+       pinctrl-0 = <&ethernet0_rgmii_pins_a>;
+       pinctrl-1 = <&ethernet0_rgmii_pins_sleep_a>;
+       pinctrl-names = "default", "sleep";
+       phy-mode = "rgmii";
+       max-speed = <1000>;
+       phy-handle = <&phy0>;
+
+       mdio0 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "snps,dwmac-mdio";
+               phy0: ethernet-phy@0 {
+                       reg = <0>;
+               };
+       };
+};
+
+&i2c4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c4_pins_a>;
+       i2c-scl-rising-time-ns = <185>;
+       i2c-scl-falling-time-ns = <20>;
+       status = "okay";
+       /delete-property/dmas;
+       /delete-property/dma-names;
+
+       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>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+               status = "okay";
+
+               st,main-control-register = <0x04>;
+               st,vin-control-register = <0xc0>;
+               st,usb-control-register = <0x20>;
+
+               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>;
+                               regulator-active-discharge;
+                        };
+
+                        vbus_sw: pwr_sw2 {
+                               regulator-name = "vbus_sw";
+                               interrupts = <IT_OCP_SWOUT 0>;
+                               regulator-active-discharge;
+                        };
+               };
+
+               onkey {
+                       compatible = "st,stpmic1-onkey";
+                       interrupts = <IT_PONKEY_F 0>, <IT_PONKEY_R 1>;
+                       interrupt-names = "onkey-falling", "onkey-rising";
+                       status = "okay";
+               };
+
+               watchdog {
+                       compatible = "st,stpmic1-wdt";
+                       status = "disabled";
+               };
+       };
+};
+
+&iwdg2 {
+       timeout-sec = <32>;
+       status = "okay";
+};
+
+&pwr {
+       pwr-supply = <&vdd>;
+};
+
+&rng1 {
+       status = "okay";
+};
+
+&rtc {
+       status = "okay";
+};
+
+&sdmmc1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&sdmmc1_b4_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";
+};
diff --git a/arch/arm/dts/stm32mp157c-dk2-u-boot.dtsi b/arch/arm/dts/stm32mp157c-dk2-u-boot.dtsi
new file mode 100644 (file)
index 0000000..06ef3a4
--- /dev/null
@@ -0,0 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
+/*
+ * Copyright : STMicroelectronics 2018
+ */
+
+#include "stm32mp157a-dk1-u-boot.dtsi"
diff --git a/arch/arm/dts/stm32mp157c-dk2.dts b/arch/arm/dts/stm32mp157c-dk2.dts
new file mode 100644 (file)
index 0000000..9a81d2d
--- /dev/null
@@ -0,0 +1,67 @@
+// 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.
+ */
+
+/dts-v1/;
+
+#include "stm32mp157a-dk1.dts"
+
+/ {
+       model = "STMicroelectronics STM32MP157C-DK2 Discovery Board";
+       compatible = "st,stm32mp157c-dk2", "st,stm32mp157";
+};
+
+&dsi {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       status = "okay";
+       phy-dsi-supply = <&reg18>;
+
+       ports {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               port@0 {
+                       reg = <0>;
+                       dsi_in: endpoint {
+                               remote-endpoint = <&ltdc_ep1_out>;
+                       };
+               };
+
+               port@1 {
+                       reg = <1>;
+                       dsi_out: endpoint {
+                               remote-endpoint = <&panel_in>;
+                       };
+               };
+       };
+
+       panel@0 {
+               compatible = "orisetech,otm8009a";
+               reg = <0>;
+               reset-gpios = <&gpioe 4 GPIO_ACTIVE_LOW>;
+               status = "okay";
+
+               port {
+                       panel_in: endpoint {
+                               remote-endpoint = <&dsi_out>;
+                       };
+               };
+       };
+};
+
+&ltdc {
+       status = "okay";
+
+       port {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               ltdc_ep1_out: endpoint@1 {
+                       reg = <1>;
+                       remote-endpoint = <&dsi_in>;
+               };
+       };
+};
index 70bbf66704262ba55eb4b2cb8a8d5369e58acfa9..55f99037b2683d94223c5f1d7e467b0d7cfdc79f 100644 (file)
@@ -9,9 +9,14 @@
 
 / {
        aliases {
+               i2c3 = &i2c4;
                mmc0 = &sdmmc1;
                mmc1 = &sdmmc2;
-               i2c3 = &i2c4;
+       };
+
+       config {
+               st,fastboot-gpios = <&gpioa 13 GPIO_ACTIVE_LOW>;
+               st,stm32prog-gpios = <&gpioa 14 GPIO_ACTIVE_LOW>;
        };
 
        led {
        st,digbypass;
 };
 
-&uart4_pins_a {
+&i2c4 {
        u-boot,dm-pre-reloc;
-       pins1 {
-               u-boot,dm-pre-reloc;
-       };
-       pins2 {
-               u-boot,dm-pre-reloc;
-       };
 };
 
 &i2c4_pins_a {
        };
 };
 
-&uart4 {
-       u-boot,dm-pre-reloc;
-};
-
-&i2c4 {
-       u-boot,dm-pre-reloc;
-};
-
 &pmic {
        u-boot,dm-pre-reloc;
 };
        };
 };
 
-/* SPL part **************************************/
-/* MMC1 boot */
 &sdmmc1_b4_pins_a {
        u-boot,dm-spl;
        pins {
        u-boot,dm-spl;
 };
 
-/* MMC2 boot */
 &sdmmc2_b4_pins_a {
        u-boot,dm-spl;
        pins {
 &sdmmc2 {
        u-boot,dm-spl;
 };
+
+&uart4 {
+       u-boot,dm-pre-reloc;
+};
+
+&uart4_pins_a {
+       u-boot,dm-pre-reloc;
+       pins1 {
+               u-boot,dm-pre-reloc;
+       };
+       pins2 {
+               u-boot,dm-pre-reloc;
+       };
+};
index 7a9b742d364ff0b7bc146efd5f18f74ede97f1d5..0366782fda9b1b49b73a60d24798dcd400e03067 100644 (file)
@@ -8,20 +8,24 @@
 #include "stm32mp157c.dtsi"
 #include "stm32mp157-pinctrl.dtsi"
 #include <dt-bindings/gpio/gpio.h>
-#include <dt-bindings/mfd/st,stpmu1.h>
+#include <dt-bindings/mfd/st,stpmic1.h>
 
 / {
        model = "STMicroelectronics STM32MP157C eval daughter";
        compatible = "st,stm32mp157c-ed1", "st,stm32mp157";
 
        chosen {
-               stdout-path = "serial3:115200n8";
+               stdout-path = "serial0:115200n8";
        };
 
        memory@c0000000 {
                reg = <0xC0000000 0x40000000>;
        };
 
+       aliases {
+               serial0 = &uart4;
+       };
+
        sd_switch: regulator-sd_switch {
                compatible = "regulator-gpio";
                regulator-name = "sd_switch";
        };
 };
 
-&rng1 {
-       status = "okay";
-};
-
-&timers6 {
+&hwspinlock {
        status = "okay";
-       timer@5 {
-               status = "okay";
-       };
 };
 
 &i2c4 {
@@ -54,8 +51,8 @@
        i2c-scl-falling-time-ns = <20>;
        status = "okay";
 
-       pmic: stpmu1@33 {
-               compatible = "st,stpmu1";
+       pmic: stpmic1@33 {
+               compatible = "st,stpmic1";
                reg = <0x33>;
                interrupts = <0 2>;
                interrupt-parent = <&gpioa>;
@@ -68,7 +65,7 @@
                st,usb_control_register = <0x30>;
 
                regulators {
-                       compatible = "st,stpmu1-regulators";
+                       compatible = "st,stpmic1-regulators";
 
                        ldo1-supply = <&v3v3>;
                        ldo2-supply = <&v3v3>;
        };
 };
 
+&iwdg2 {
+       timeout-sec = <32>;
+       status = "okay";
+};
+
+&pinctrl {
+       hwlocks = <&hwspinlock 0>;
+};
+
 &pwr {
        pwr-supply = <&vdd>;
 };
 
+&rng1 {
+       status = "okay";
+};
+
+&rtc {
+       status = "okay";
+};
+
 &sdmmc1 {
        pinctrl-0 = <&sdmmc1_b4_pins_a &sdmmc1_dir_pins_a>;
        broken-cd;
        status = "okay";
 };
 
-&uart4 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&uart4_pins_a>;
+&timers6 {
        status = "okay";
+       timer@5 {
+               status = "okay";
+       };
 };
 
-&usbotg_hs {
-       usb33d-supply = <&usb33>;
-};
-
-&hwspinlock {
+&uart4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart4_pins_a>;
        status = "okay";
 };
 
-&pinctrl {
-       hwlocks = <&hwspinlock 0>;
-};
-
 &usbphyc_port0 {
        phy-supply = <&vdd_usb>;
-       vdda1v1-supply = <&reg11>;
-       vdda1v8-supply = <&reg18>;
 };
 
 &usbphyc_port1 {
        phy-supply = <&vdd_usb>;
-       vdda1v1-supply = <&reg11>;
-       vdda1v8-supply = <&reg18>;
 };
index 30b173478c6ca8a1243090b23f891b6edefd8e37..5b19e44d2fb4627d9448bd61d7ab2ee6ef44ee78 100644 (file)
@@ -7,29 +7,24 @@
 
 / {
        aliases {
-               spi0 = &qspi;
+               gpio26 = &stmfx_pinctrl;
                i2c1 = &i2c2;
                i2c4 = &i2c5;
+               pinctrl2 = &stmfx_pinctrl;
+               spi0 = &qspi;
+               usb0 = &usbotg_hs;
        };
 };
 
 &flash0 {
-       compatible = "spi-flash";
+       compatible = "jedec,spi-nor";
+       u-boot,dm-spl;
 };
 
 &flash1 {
-       compatible = "spi-flash";
-};
-
-&v3v3 {
-       regulator-always-on;
-};
-
-&usbotg_hs {
-       g-tx-fifo-size = <576>;
+       compatible = "jedec,spi-nor";
 };
 
-/* SPL part **************************************/
 &qspi {
        u-boot,dm-spl;
 };
        };
 };
 
-&flash0 {
-       u-boot,dm-spl;
+&usbotg_hs {
+       g-tx-fifo-size = <576>;
 };
 
+&v3v3 {
+       regulator-always-on;
+};
index 902a42bee290a9e9b90576faf1e8a115e9e5f6e6..a6ee37924fe18fe574add7271b21358dfd678376 100644 (file)
        model = "STMicroelectronics STM32MP157C eval daughter on eval mother";
        compatible = "st,stm32mp157c-ev1", "st,stm32mp157c-ed1", "st,stm32mp157";
 
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       aliases {
+               serial0 = &uart4;
+               ethernet0 = &ethernet0;
+       };
+
+       panel_backlight: panel-backlight {
+               compatible = "gpio-backlight";
+               gpios = <&gpiod 13 GPIO_ACTIVE_LOW>;
+               default-on;
+               status = "okay";
+       };
 };
 
 &cec {
        status = "okay";
 };
 
+&dsi {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       status = "okay";
+
+       ports {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               port@0 {
+                       reg = <0>;
+                       dsi_in: endpoint {
+                               remote-endpoint = <&ltdc_ep0_out>;
+                       };
+               };
+
+               port@1 {
+                       reg = <1>;
+                       dsi_out: endpoint {
+                               remote-endpoint = <&dsi_panel_in>;
+                       };
+               };
+       };
+
+       panel-dsi@0 {
+               compatible = "raydium,rm68200";
+               reg = <0>;
+               reset-gpios = <&gpiof 15 GPIO_ACTIVE_LOW>;
+               backlight = <&panel_backlight>;
+               status = "okay";
+
+               port {
+                       dsi_panel_in: endpoint {
+                               remote-endpoint = <&dsi_out>;
+                       };
+               };
+       };
+};
+
+&ethernet0 {
+       status = "okay";
+       pinctrl-0 = <&ethernet0_rgmii_pins_a>;
+       pinctrl-1 = <&ethernet0_rgmii_pins_sleep_a>;
+       pinctrl-names = "default", "sleep";
+       phy-mode = "rgmii";
+       max-speed = <1000>;
+       phy-handle = <&phy0>;
+
+       mdio0 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "snps,dwmac-mdio";
+               phy0: ethernet-phy@0 {
+                       reg = <0>;
+               };
+       };
+};
+
 &i2c2 {
        pinctrl-names = "default";
        pinctrl-0 = <&i2c2_pins_a>;
        i2c-scl-rising-time-ns = <185>;
        i2c-scl-falling-time-ns = <20>;
        status = "okay";
+
+       stmfx: stmfx@42 {
+               compatible = "st,stmfx-0300";
+               reg = <0x42>;
+               interrupts = <8 IRQ_TYPE_EDGE_RISING>;
+               interrupt-parent = <&gpioi>;
+               vdd-supply = <&v3v3>;
+
+               stmfx_pinctrl: stmfx-pin-controller {
+                       compatible = "st,stmfx-0300-pinctrl";
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+                       gpio-ranges = <&stmfx_pinctrl 0 0 24>;
+                       status = "disabled";
+               };
+       };
 };
 
 &i2c5 {
        status = "okay";
 };
 
+&ltdc {
+       status = "okay";
+
+       port {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               ltdc_ep0_out: endpoint@0 {
+                       reg = <0>;
+                       remote-endpoint = <&dsi_in>;
+               };
+       };
+};
+
+&m_can1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&m_can1_pins_a>;
+       status = "okay";
+};
+
 &qspi {
        pinctrl-names = "default";
        pinctrl-0 = <&qspi_clk_pins_a &qspi_bk1_pins_a &qspi_bk2_pins_a>;
        };
 };
 
+&spi1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&spi1_pins_a>;
+       status = "disabled";
+};
+
 &timers2 {
        status = "disabled";
        pwm {
 &usbotg_hs {
        pinctrl-names = "default";
        pinctrl-0 = <&usbotg_hs_pins_a>;
+       dr_mode = "peripheral";
        phys = <&usbphyc_port1 0>;
        phy-names = "usb2-phy";
        status = "okay";
index 37cadfa30c90ff6d11875e06b549ced37855a81a..94634336a5e17eb5dadfd4dcfdadedb8363a00be 100644 (file)
@@ -29,7 +29,7 @@
        };
 
        psci {
-               compatible = "arm,psci";
+               compatible = "arm,psci-1.0";
                method = "smc";
                cpu_off = <0x84000002>;
                cpu_on = <0x84000003>;
                };
        };
 
-       pm_domain {
-               #address-cells = <1>;
-               #size-cells = <0>;
-               compatible = "st,stm32mp157c-pd";
-
-               pd_core_ret: core-ret-power-domain@1 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       reg = <1>;
-                       #power-domain-cells = <0>;
-                       label = "CORE-RETENTION";
-
-                       pd_core: core-power-domain@2 {
-                               reg = <2>;
-                               #power-domain-cells = <0>;
-                               label = "CORE";
-                       };
-               };
-       };
-
        soc {
                compatible = "simple-bus";
                #address-cells = <1>;
                        };
                };
 
+               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";
+               };
+
+               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";
+               };
+
                usart2: serial@4000e000 {
                        compatible = "st,stm32h7-uart";
                        reg = <0x4000e000 0x400>;
                        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";
+               };
+
+               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>;
                        };
                };
 
+               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";
+               };
+
+               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 0x2800>;
+                       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 = <0x0 0 0 32 0 0 2 2>;
+                       status = "disabled";
+               };
+
                dma1: dma@48000000 {
                        compatible = "st,stm32-dma";
                        reg = <0x48000000 0x400>;
                                reg = <0x0>;
                                interrupt-parent = <&adc>;
                                interrupts = <0>;
+                               dmas = <&dmamux1 9 0x400 0x01>;
+                               dma-names = "rx";
                                status = "disabled";
                        };
 
                                reg = <0x100>;
                                interrupt-parent = <&adc>;
                                interrupts = <1>;
+                               dmas = <&dmamux1 10 0x400 0x01>;
+                               dma-names = "rx";
                                status = "disabled";
                        };
                };
                        g-np-tx-fifo-size = <32>;
                        g-tx-fifo-size = <128 128 64 64 64 64 32 32>;
                        dr_mode = "otg";
-                       power-domains = <&pd_core>;
+                       usb33d-supply = <&usb33>;
                        status = "disabled";
                };
 
                        reg = <0x5000d000 0x400>;
                };
 
-               syscfg: system-config@50020000 {
-                       compatible = "st,stm32-syscfg", "syscon";
+               syscfg: syscon@50020000 {
+                       compatible = "st,stm32mp157-syscfg", "syscon";
                        reg = <0x50020000 0x400>;
                };
 
                        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>;
                        dma-requests = <48>;
                };
 
-               qspi: qspi@58003000 {
+               qspi: spi@58003000 {
                        compatible = "st,stm32f469-qspi";
                        reg = <0x58003000 0x1000>, <0x70000000 0x10000000>;
                        reg-names = "qspi", "qspi_mm";
                        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",
+                                     "ethstp",
+                                     "syscfg-clk";
+                       clocks = <&rcc ETHMAC>,
+                                <&rcc ETHTX>,
+                                <&rcc ETHRX>,
+                                <&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>;
                        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>;
                        reg = <0x5a006000 0x1000>;
                        clocks = <&rcc USBPHY_K>;
                        resets = <&rcc USBPHY_R>;
+                       vdda1v1-supply = <&reg11>;
+                       vdda1v8-supply = <&reg18>;
                        status = "disabled";
 
                        usbphyc_port0: usb-phy@0 {
                        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>;
                        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>;
+               };
+
                i2c6: i2c@5c009000 {
                        compatible = "st,stm32f7-i2c";
                        reg = <0x5c009000 0x400>;
index 98bd5dfc70f237942f2d8d1d7d5fccc58b2ea592..b04e89971c77b9d9abc080609bdad882554f8bea 100644 (file)
@@ -40,7 +40,7 @@
                        flash0: n25q32@0 {
                                #address-cells = <1>;
                                #size-cells = <1>;
-                               compatible = "spi-flash";
+                               compatible = "jedec,spi-nor";
                                reg = <0>;              /* chip select */
                                spi-max-frequency = <50000000>;
                                m25p,fast-read;
diff --git a/arch/arm/dts/sun50i-a64-oceanic-5205-5inmfd.dts b/arch/arm/dts/sun50i-a64-oceanic-5205-5inmfd.dts
new file mode 100644 (file)
index 0000000..6a21545
--- /dev/null
@@ -0,0 +1,68 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (C) 2019 Oceanic Systems (UK) Ltd.
+ * Copyright (C) 2019 Amarula Solutions B.V.
+ * Author: Jagan Teki <jagan@amarulasolutions.com>
+ */
+
+/dts-v1/;
+
+#include "sun50i-a64-sopine.dtsi"
+
+/ {
+       model = "Oceanic 5205 5inMFD";
+       compatible = "oceanic,5205-5inmfd", "allwinner,sun50i-a64";
+
+       aliases {
+               ethernet0 = &emac;
+               serial0 = &uart0;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+};
+
+&ehci0 {
+       status = "okay";
+};
+
+&emac {
+       pinctrl-names = "default";
+       pinctrl-0 = <&rgmii_pins>;
+       phy-mode = "rgmii";
+       phy-handle = <&ext_rgmii_phy>;
+       phy-supply = <&reg_dc1sw>;
+       allwinner,tx-delay-ps = <600>;
+       status = "okay";
+};
+
+&mdio {
+       ext_rgmii_phy: ethernet-phy@1 {
+               compatible = "ethernet-phy-ieee802.3-c22";
+               reg = <1>;
+       };
+};
+
+&ohci0 {
+       status = "okay";
+};
+
+&reg_dc1sw {
+       regulator-name = "vcc-phy";
+};
+
+&uart0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart0_pb_pins>;
+       status = "okay";
+};
+
+&usb_otg {
+       dr_mode = "host";
+       status = "okay";
+};
+
+&usbphy {
+       status = "okay";
+};
index 0612c19cd9943427a0c4e21939af2e83213b7d1c..62e27948a3faed9d7ae7f022fedf2b1cd2cd6eb5 100644 (file)
        chosen {
                stdout-path = "serial0:115200n8";
        };
+
+       leds {
+               compatible = "gpio-leds";
+
+               power {
+                       label = "orangepi:red:power";
+                       gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */
+                       default-state = "on";
+               };
+
+               status {
+                       label = "orangepi:green:status";
+                       gpios = <&r_pio 0 7 GPIO_ACTIVE_HIGH>; /* PL7 */
+               };
+       };
+
+       reg_vcc5v: vcc5v {
+               /* board wide 5V supply directly from the DC jack */
+               compatible = "regulator-fixed";
+               regulator-name = "vcc-5v";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               regulator-always-on;
+       };
+};
+
+&ehci0 {
+       status = "okay";
+};
+
+&ehci3 {
+       status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins>;
        vmmc-supply = <&reg_cldo1>;
        cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>;
        bus-width = <4>;
        status = "okay";
 };
 
+&ohci0 {
+       status = "okay";
+};
+
+&ohci3 {
+       status = "okay";
+};
+
 &r_i2c {
        status = "okay";
 
                interrupt-controller;
                #interrupt-cells = <1>;
                x-powers,self-working-mode;
+               vina-supply = <&reg_vcc5v>;
+               vinb-supply = <&reg_vcc5v>;
+               vinc-supply = <&reg_vcc5v>;
+               vind-supply = <&reg_vcc5v>;
+               vine-supply = <&reg_vcc5v>;
+               aldoin-supply = <&reg_vcc5v>;
+               bldoin-supply = <&reg_vcc5v>;
+               cldoin-supply = <&reg_vcc5v>;
 
                regulators {
                        reg_aldo1: aldo1 {
        pinctrl-0 = <&uart0_ph_pins>;
        status = "okay";
 };
+
+&usb2otg {
+       dr_mode = "otg";
+       status = "okay";
+};
+
+&usb2phy {
+       usb0_id_det-gpios = <&pio 2 6 GPIO_ACTIVE_HIGH>; /* PC6 */
+       usb0_vbus-supply = <&reg_vcc5v>;
+       usb3_vbus-supply = <&reg_vcc5v>;
+       status = "okay";
+};
index ceffc40810eec42e3655f80fcd39d66965617c73..4802902e128f980d58baf7bbdd93094230840b30 100644 (file)
@@ -14,6 +14,7 @@
        compatible = "pine64,pine-h64", "allwinner,sun50i-h6";
 
        aliases {
+               ethernet0 = &emac;
                serial0 = &uart0;
        };
 
                stdout-path = "serial0:115200n8";
        };
 
+       connector {
+               compatible = "hdmi-connector";
+               type = "a";
+
+               port {
+                       hdmi_con_in: endpoint {
+                               remote-endpoint = <&hdmi_out_con>;
+                       };
+               };
+       };
+
        leds {
                compatible = "gpio-leds";
 
                        gpios = <&r_pio 0 7 GPIO_ACTIVE_HIGH>; /* PL7 */
                };
        };
+
+       reg_usb_vbus: vbus {
+               compatible = "regulator-fixed";
+               regulator-name = "usb-vbus";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               startup-delay-us = <100000>;
+               gpio = <&r_pio 0 5 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
 };
 
-&mmc0 {
+&emac {
        pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins>;
+       pinctrl-0 = <&ext_rgmii_pins>;
+       phy-mode = "rgmii";
+       phy-handle = <&ext_rgmii_phy>;
+       phy-supply = <&reg_aldo2>;
+       allwinner,rx-delay-ps = <200>;
+       allwinner,tx-delay-ps = <200>;
+       status = "okay";
+};
+
+&mdio {
+       ext_rgmii_phy: ethernet-phy@1 {
+               compatible = "ethernet-phy-ieee802.3-c22";
+               reg = <1>;
+       };
+};
+
+&de {
+       status = "okay";
+};
+
+&hdmi {
+       status = "okay";
+};
+
+&hdmi_out {
+       hdmi_out_con: endpoint {
+               remote-endpoint = <&hdmi_con_in>;
+       };
+};
+
+&ehci0 {
+       status = "okay";
+};
+
+&ehci3 {
+       status = "okay";
+};
+
+&mmc0 {
        vmmc-supply = <&reg_cldo1>;
        cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>;
+       bus-width = <4>;
        status = "okay";
 };
 
 &mmc2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc2_pins>;
        vmmc-supply = <&reg_cldo1>;
        vqmmc-supply = <&reg_bldo2>;
        non-removable;
        cap-mmc-hw-reset;
+       bus-width = <8>;
+       status = "okay";
+};
+
+&ohci0 {
+       status = "okay";
+};
+
+&ohci3 {
        status = "okay";
 };
 
                                regulator-min-microvolt = <3300000>;
                                regulator-max-microvolt = <3300000>;
                                regulator-name = "vcc-ac200";
+                               regulator-enable-ramp-delay = <100000>;
                        };
 
                        reg_aldo3: aldo3 {
        pinctrl-0 = <&uart0_ph_pins>;
        status = "okay";
 };
+
+&usb2otg {
+       dr_mode = "host";
+       status = "okay";
+};
+
+&usb2phy {
+       usb0_vbus-supply = <&reg_usb_vbus>;
+       usb3_vbus-supply = <&reg_usb_vbus>;
+       status = "okay";
+};
index cfa5fffcf62b437c60a9fde4b601767ecc7548b3..e0dc4a05c1ba0273e2c3fced95c063e38f4f0d17 100644 (file)
@@ -6,8 +6,11 @@
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 #include <dt-bindings/clock/sun50i-h6-ccu.h>
 #include <dt-bindings/clock/sun50i-h6-r-ccu.h>
+#include <dt-bindings/clock/sun8i-de2.h>
+#include <dt-bindings/clock/sun8i-tcon-top.h>
 #include <dt-bindings/reset/sun50i-h6-ccu.h>
 #include <dt-bindings/reset/sun50i-h6-r-ccu.h>
+#include <dt-bindings/reset/sun8i-de2.h>
 
 / {
        interrupt-parent = <&gic>;
                #size-cells = <0>;
 
                cpu0: cpu@0 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        device_type = "cpu";
                        reg = <0>;
                        enable-method = "psci";
                };
 
                cpu1: cpu@1 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        device_type = "cpu";
                        reg = <1>;
                        enable-method = "psci";
                };
 
                cpu2: cpu@2 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        device_type = "cpu";
                        reg = <2>;
                        enable-method = "psci";
                };
 
                cpu3: cpu@3 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        device_type = "cpu";
                        reg = <3>;
                        enable-method = "psci";
                };
        };
 
+       de: display-engine {
+               compatible = "allwinner,sun50i-h6-display-engine";
+               allwinner,pipelines = <&mixer0>;
+               status = "disabled";
+       };
+
        iosc: internal-osc-clk {
                #clock-cells = <0>;
                compatible = "fixed-clock";
                #size-cells = <1>;
                ranges;
 
+               display-engine@1000000 {
+                       compatible = "allwinner,sun50i-h6-de3",
+                                    "allwinner,sun50i-a64-de2";
+                       reg = <0x1000000 0x400000>;
+                       allwinner,sram = <&de2_sram 1>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0 0x1000000 0x400000>;
+
+                       display_clocks: clock@0 {
+                               compatible = "allwinner,sun50i-h6-de3-clk";
+                               reg = <0x0 0x10000>;
+                               clocks = <&ccu CLK_DE>,
+                                        <&ccu CLK_BUS_DE>;
+                               clock-names = "mod",
+                                             "bus";
+                               resets = <&ccu RST_BUS_DE>;
+                               #clock-cells = <1>;
+                               #reset-cells = <1>;
+                       };
+
+                       mixer0: mixer@100000 {
+                               compatible = "allwinner,sun50i-h6-de3-mixer-0";
+                               reg = <0x100000 0x100000>;
+                               clocks = <&display_clocks CLK_BUS_MIXER0>,
+                                        <&display_clocks CLK_MIXER0>;
+                               clock-names = "bus",
+                                             "mod";
+                               resets = <&display_clocks RST_MIXER0>;
+
+                               ports {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       mixer0_out: port@1 {
+                                               reg = <1>;
+
+                                               mixer0_out_tcon_top_mixer0: endpoint {
+                                                       remote-endpoint = <&tcon_top_mixer0_in_mixer0>;
+                                               };
+                                       };
+                               };
+                       };
+               };
+
+               video-codec@1c0e000 {
+                       compatible = "allwinner,sun50i-h6-video-engine";
+                       reg = <0x01c0e000 0x2000>;
+                       clocks = <&ccu CLK_BUS_VE>, <&ccu CLK_VE>,
+                                <&ccu CLK_MBUS_VE>;
+                       clock-names = "ahb", "mod", "ram";
+                       resets = <&ccu RST_BUS_VE>;
+                       interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
+                       allwinner,sram = <&ve_sram 1>;
+               };
+
+               syscon: syscon@3000000 {
+                       compatible = "allwinner,sun50i-h6-system-control",
+                                    "allwinner,sun50i-a64-system-control";
+                       reg = <0x03000000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges;
+
+                       sram_c: sram@28000 {
+                               compatible = "mmio-sram";
+                               reg = <0x00028000 0x1e000>;
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               ranges = <0 0x00028000 0x1e000>;
+
+                               de2_sram: sram-section@0 {
+                                       compatible = "allwinner,sun50i-h6-sram-c",
+                                                    "allwinner,sun50i-a64-sram-c";
+                                       reg = <0x0000 0x1e000>;
+                               };
+                       };
+
+                       sram_c1: sram@1a00000 {
+                               compatible = "mmio-sram";
+                               reg = <0x01a00000 0x200000>;
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               ranges = <0 0x01a00000 0x200000>;
+
+                               ve_sram: sram-section@0 {
+                                       compatible = "allwinner,sun50i-h6-sram-c1",
+                                                    "allwinner,sun4i-a10-sram-c1";
+                                       reg = <0x000000 0x200000>;
+                               };
+                       };
+               };
+
                ccu: clock@3001000 {
                        compatible = "allwinner,sun50i-h6-ccu";
                        reg = <0x03001000 0x1000>;
                        #reset-cells = <1>;
                };
 
-               gic: interrupt-controller@3021000 {
-                       compatible = "arm,gic-400";
-                       reg = <0x03021000 0x1000>,
-                             <0x03022000 0x2000>,
-                             <0x03024000 0x2000>,
-                             <0x03026000 0x2000>;
-                       interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
-                       interrupt-controller;
-                       #interrupt-cells = <3>;
+               sid: sid@3006000 {
+                       compatible = "allwinner,sun50i-h6-sid";
+                       reg = <0x03006000 0x400>;
                };
 
                pio: pinctrl@300b000 {
                        interrupt-controller;
                        #interrupt-cells = <3>;
 
+                       ext_rgmii_pins: rgmii-pins {
+                               pins = "PD0", "PD1", "PD2", "PD3", "PD4",
+                                      "PD5", "PD7", "PD8", "PD9", "PD10",
+                                      "PD11", "PD12", "PD13", "PD19", "PD20";
+                               function = "emac";
+                               drive-strength = <40>;
+                       };
+
+                       hdmi_pins: hdmi-pins {
+                               pins = "PH8", "PH9", "PH10";
+                               function = "hdmi";
+                       };
+
                        mmc0_pins: mmc0-pins {
                                pins = "PF0", "PF1", "PF2", "PF3",
                                       "PF4", "PF5";
                                bias-pull-up;
                        };
 
-                       uart0_ph_pins: uart0-ph {
+                       uart0_ph_pins: uart0-ph-pins {
                                pins = "PH0", "PH1";
                                function = "uart0";
                        };
                };
 
+               gic: interrupt-controller@3021000 {
+                       compatible = "arm,gic-400";
+                       reg = <0x03021000 0x1000>,
+                             <0x03022000 0x2000>,
+                             <0x03024000 0x2000>,
+                             <0x03026000 0x2000>;
+                       interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
+                       interrupt-controller;
+                       #interrupt-cells = <3>;
+               };
+
                mmc0: mmc@4020000 {
                        compatible = "allwinner,sun50i-h6-mmc",
                                     "allwinner,sun50i-a64-mmc";
                        resets = <&ccu RST_BUS_MMC0>;
                        reset-names = "ahb";
                        interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&mmc0_pins>;
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        resets = <&ccu RST_BUS_MMC2>;
                        reset-names = "ahb";
                        interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&mmc2_pins>;
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "disabled";
                };
 
+               emac: ethernet@5020000 {
+                       compatible = "allwinner,sun50i-h6-emac",
+                                    "allwinner,sun50i-a64-emac";
+                       syscon = <&syscon>;
+                       reg = <0x05020000 0x10000>;
+                       interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "macirq";
+                       resets = <&ccu RST_BUS_EMAC>;
+                       reset-names = "stmmaceth";
+                       clocks = <&ccu CLK_BUS_EMAC>;
+                       clock-names = "stmmaceth";
+                       status = "disabled";
+
+                       mdio: mdio {
+                               compatible = "snps,dwmac-mdio";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                       };
+               };
+
+               usb2otg: usb@5100000 {
+                       compatible = "allwinner,sun50i-h6-musb",
+                                    "allwinner,sun8i-a33-musb";
+                       reg = <0x05100000 0x0400>;
+                       clocks = <&ccu CLK_BUS_OTG>;
+                       resets = <&ccu RST_BUS_OTG>;
+                       interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "mc";
+                       phys = <&usb2phy 0>;
+                       phy-names = "usb";
+                       extcon = <&usb2phy 0>;
+                       status = "disabled";
+               };
+
+               usb2phy: phy@5100400 {
+                       compatible = "allwinner,sun50i-h6-usb-phy";
+                       reg = <0x05100400 0x24>,
+                             <0x05101800 0x4>,
+                             <0x05311800 0x4>;
+                       reg-names = "phy_ctrl",
+                                   "pmu0",
+                                   "pmu3";
+                       clocks = <&ccu CLK_USB_PHY0>,
+                                <&ccu CLK_USB_PHY3>;
+                       clock-names = "usb0_phy",
+                                     "usb3_phy";
+                       resets = <&ccu RST_USB_PHY0>,
+                                <&ccu RST_USB_PHY3>;
+                       reset-names = "usb0_reset",
+                                     "usb3_reset";
+                       status = "disabled";
+                       #phy-cells = <1>;
+               };
+
+               ehci0: usb@5101000 {
+                       compatible = "allwinner,sun50i-h6-ehci", "generic-ehci";
+                       reg = <0x05101000 0x100>;
+                       interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_OHCI0>,
+                                <&ccu CLK_BUS_EHCI0>,
+                                <&ccu CLK_USB_OHCI0>;
+                       resets = <&ccu RST_BUS_OHCI0>,
+                                <&ccu RST_BUS_EHCI0>;
+                       status = "disabled";
+               };
+
+               ohci0: usb@5101400 {
+                       compatible = "allwinner,sun50i-h6-ohci", "generic-ohci";
+                       reg = <0x05101400 0x100>;
+                       interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_OHCI0>,
+                                <&ccu CLK_USB_OHCI0>;
+                       resets = <&ccu RST_BUS_OHCI0>;
+                       status = "disabled";
+               };
+
+               ehci3: usb@5311000 {
+                       compatible = "allwinner,sun50i-h6-ehci", "generic-ehci";
+                       reg = <0x05311000 0x100>;
+                       interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_OHCI3>,
+                                <&ccu CLK_BUS_EHCI3>,
+                                <&ccu CLK_USB_OHCI3>;
+                       resets = <&ccu RST_BUS_OHCI3>,
+                                <&ccu RST_BUS_EHCI3>;
+                       phys = <&usb2phy 3>;
+                       phy-names = "usb";
+                       status = "disabled";
+               };
+
+               ohci3: usb@5311400 {
+                       compatible = "allwinner,sun50i-h6-ohci", "generic-ohci";
+                       reg = <0x05311400 0x100>;
+                       interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_OHCI3>,
+                                <&ccu CLK_USB_OHCI3>;
+                       resets = <&ccu RST_BUS_OHCI3>;
+                       phys = <&usb2phy 3>;
+                       phy-names = "usb";
+                       status = "disabled";
+               };
+
+               hdmi: hdmi@6000000 {
+                       compatible = "allwinner,sun50i-h6-dw-hdmi";
+                       reg = <0x06000000 0x10000>;
+                       reg-io-width = <1>;
+                       interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_HDMI>, <&ccu CLK_HDMI_SLOW>,
+                                <&ccu CLK_HDMI>, <&ccu CLK_HDMI_CEC>,
+                                <&ccu CLK_HDCP>, <&ccu CLK_BUS_HDCP>;
+                       clock-names = "iahb", "isfr", "tmds", "cec", "hdcp",
+                                     "hdcp-bus";
+                       resets = <&ccu RST_BUS_HDMI_SUB>, <&ccu RST_BUS_HDCP>;
+                       reset-names = "ctrl", "hdcp";
+                       phys = <&hdmi_phy>;
+                       phy-names = "hdmi-phy";
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&hdmi_pins>;
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               hdmi_in: port@0 {
+                                       reg = <0>;
+
+                                       hdmi_in_tcon_top: endpoint {
+                                               remote-endpoint = <&tcon_top_hdmi_out_hdmi>;
+                                       };
+                               };
+
+                               hdmi_out: port@1 {
+                                       reg = <1>;
+                               };
+                       };
+               };
+
+               hdmi_phy: hdmi-phy@6010000 {
+                       compatible = "allwinner,sun50i-h6-hdmi-phy";
+                       reg = <0x06010000 0x10000>;
+                       clocks = <&ccu CLK_BUS_HDMI>, <&ccu CLK_HDMI_SLOW>;
+                       clock-names = "bus", "mod";
+                       resets = <&ccu RST_BUS_HDMI>;
+                       reset-names = "phy";
+                       #phy-cells = <0>;
+               };
+
+               tcon_top: tcon-top@6510000 {
+                       compatible = "allwinner,sun50i-h6-tcon-top";
+                       reg = <0x06510000 0x1000>;
+                       clocks = <&ccu CLK_BUS_TCON_TOP>,
+                                <&ccu CLK_TCON_TV0>;
+                       clock-names = "bus",
+                                     "tcon-tv0";
+                       clock-output-names = "tcon-top-tv0";
+                       resets = <&ccu RST_BUS_TCON_TOP>;
+                       reset-names = "rst";
+                       #clock-cells = <1>;
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               tcon_top_mixer0_in: port@0 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <0>;
+
+                                       tcon_top_mixer0_in_mixer0: endpoint@0 {
+                                               reg = <0>;
+                                               remote-endpoint = <&mixer0_out_tcon_top_mixer0>;
+                                       };
+                               };
+
+                               tcon_top_mixer0_out: port@1 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <1>;
+
+                                       tcon_top_mixer0_out_tcon_tv: endpoint@2 {
+                                               reg = <2>;
+                                               remote-endpoint = <&tcon_tv_in_tcon_top_mixer0>;
+                                       };
+                               };
+
+                               tcon_top_hdmi_in: port@4 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <4>;
+
+                                       tcon_top_hdmi_in_tcon_tv: endpoint@0 {
+                                               reg = <0>;
+                                               remote-endpoint = <&tcon_tv_out_tcon_top>;
+                                       };
+                               };
+
+                               tcon_top_hdmi_out: port@5 {
+                                       reg = <5>;
+
+                                       tcon_top_hdmi_out_hdmi: endpoint {
+                                               remote-endpoint = <&hdmi_in_tcon_top>;
+                                       };
+                               };
+                       };
+               };
+
+               tcon_tv: lcd-controller@6515000 {
+                       compatible = "allwinner,sun50i-h6-tcon-tv",
+                                    "allwinner,sun8i-r40-tcon-tv";
+                       reg = <0x06515000 0x1000>;
+                       interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_TCON_TV0>,
+                                <&tcon_top CLK_TCON_TOP_TV0>;
+                       clock-names = "ahb",
+                                     "tcon-ch1";
+                       resets = <&ccu RST_BUS_TCON_TV0>;
+                       reset-names = "lcd";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               tcon_tv_in: port@0 {
+                                       reg = <0>;
+
+                                       tcon_tv_in_tcon_top_mixer0: endpoint {
+                                               remote-endpoint = <&tcon_top_mixer0_out_tcon_tv>;
+                                       };
+                               };
+
+                               tcon_tv_out: port@1 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <1>;
+
+                                       tcon_tv_out_tcon_top: endpoint@1 {
+                                               reg = <1>;
+                                               remote-endpoint = <&tcon_top_hdmi_in_tcon_tv>;
+                                       };
+                               };
+                       };
+               };
+
                r_ccu: clock@7010000 {
                        compatible = "allwinner,sun50i-h6-r-ccu";
                        reg = <0x07010000 0x400>;
                        interrupt-controller;
                        #interrupt-cells = <3>;
 
-                       r_i2c_pins: r-i2c {
+                       r_i2c_pins: r-i2c-pins {
                                pins = "PL0", "PL1";
                                function = "s_i2c";
                        };
index 57fe0066cb4f4efdd38aa42e13c282eb738735e4..5914c919d4a97c725f41ae5e6d42539fa8fd3562 100644 (file)
@@ -23,6 +23,6 @@
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
index 763cb03033c46f5d380d2cdb897606b0ffafe937..e2bfe0058830fd12c14cf0b033871ba35f390d21 100644 (file)
@@ -73,8 +73,6 @@
 
        leds {
                compatible = "gpio-leds";
-               pinctrl-names = "default";
-               pinctrl-0 = <&led_pins_bpi_m1p>;
 
                green {
                        label = "bananapi-m1-plus:green:usr";
 
        mmc3_pwrseq: mmc3_pwrseq {
                compatible = "mmc-pwrseq-simple";
-               pinctrl-names = "default";
-               pinctrl-0 = <&mmc3_pwrseq_pin_bpi_m1p>;
                reset-gpios = <&pio 7 22 GPIO_ACTIVE_LOW>; /* PH22 WL-PMU-EN */
        };
 
        reg_gmac_3v3: gmac-3v3 {
                compatible = "regulator-fixed";
-               pinctrl-names = "default";
-               pinctrl-0 = <&gmac_power_pin_bpi_m1p>;
                regulator-name = "gmac-3v3";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_rgmii_a>;
+       pinctrl-0 = <&gmac_rgmii_pins>;
        phy = <&phy1>;
        phy-mode = "rgmii";
        phy-supply = <&reg_gmac_3v3>;
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 
 &ir0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&ir0_rx_pins_a>;
+       pinctrl-0 = <&ir0_rx_pin>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_bpi_m1p>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 10 GPIO_ACTIVE_LOW>; /* PH10 */
 &mmc3 {
        #address-cells = <1>;
        #size-cells = <0>;
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc3_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        mmc-pwrseq = <&mmc3_pwrseq>;
        bus-width = <4>;
        };
 };
 
-&mmc3_pins_a {
-       /* AP6210 requires pull-up */
-       bias-pull-up;
-};
-
 &ohci0 {
        status = "okay";
 };
        status = "okay";
 };
 
-&pio {
-       gmac_power_pin_bpi_m1p: gmac_power_pin@0 {
-               pins = "PH23";
-               function = "gpio_out";
-       };
-
-       led_pins_bpi_m1p: led_pins@0 {
-               pins = "PH24", "PH25";
-               function = "gpio_out";
-       };
-
-       mmc0_cd_pin_bpi_m1p: mmc0_cd_pin@0 {
-               pins = "PH10";
-               function = "gpio_in";
-               bias-pull-up;
-       };
-
-       mmc3_pwrseq_pin_bpi_m1p: mmc3_pwrseq_pin@0 {
-               pins = "PH22";
-               function = "gpio_out";
-       };
-};
-
 &reg_dcdc2 {
        regulator-always-on;
        regulator-min-microvolt = <1000000>;
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
index 70dfc4ac0bb5fb7607dab5cf3f891d3c345b02fc..81bc85d398c155573b128af188673a762591fba9 100644 (file)
@@ -76,8 +76,6 @@
 
        leds {
                compatible = "gpio-leds";
-               pinctrl-names = "default";
-               pinctrl-0 = <&led_pins_bananapi>;
 
                green {
                        label = "bananapi:green:usr";
@@ -87,8 +85,6 @@
 
        reg_gmac_3v3: gmac-3v3 {
                compatible = "regulator-fixed";
-               pinctrl-names = "default";
-               pinctrl-0 = <&gmac_power_pin_bananapi>;
                regulator-name = "gmac-3v3";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_rgmii_a>;
+       pinctrl-0 = <&gmac_rgmii_pins>;
        phy = <&phy1>;
        phy-mode = "rgmii";
        phy-supply = <&reg_gmac_3v3>;
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 };
 
 &i2c2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c2_pins_a>;
        status = "okay";
 };
 
 &ir0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&ir0_rx_pins_a>;
+       pinctrl-0 = <&ir0_rx_pin>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_bananapi>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 10 GPIO_ACTIVE_LOW>; /* PH10 */
 };
 
 &pio {
+       vcc-pa-supply = <&reg_vcc3v3>;
+       vcc-pc-supply = <&reg_vcc3v3>;
+       vcc-pe-supply = <&reg_vcc3v3>;
+       vcc-pf-supply = <&reg_vcc3v3>;
+       vcc-pg-supply = <&reg_vcc3v3>;
        gpio-line-names =
                /* PA */
                "ERXD3", "ERXD2", "ERXD1", "ERXD0", "ETXD3",
                "IO-6", "IO-3", "IO-2", "IO-0", "", "", "", "",
                "", "", "", "", "", "", "", "";
 
-       usb0_id_detect_pin: usb0_id_detect_pin@0 {
+       usb0_id_detect_pin: usb0-id-detect-pin {
                pins = "PH4";
                function = "gpio_in";
                bias-pull-up;
        };
-
-       mmc0_cd_pin_bananapi: mmc0_cd_pin@0 {
-               pins = "PH10";
-               function = "gpio_in";
-               bias-pull-up;
-       };
-
-       gmac_power_pin_bananapi: gmac_power_pin@0 {
-               pins = "PH23";
-               function = "gpio_out";
-       };
-
-       led_pins_bananapi: led_pins@0 {
-               pins = "PH24";
-               function = "gpio_out";
-       };
 };
 
 #include "axp209.dtsi"
 
 &spi0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&spi0_pins_a>,
-                   <&spi0_cs0_pins_a>,
-                   <&spi0_cs1_pins_a>;
+       pinctrl-0 = <&spi0_pi_pins>,
+                   <&spi0_cs0_pi_pin>,
+                   <&spi0_cs1_pi_pin>;
        status = "okay";
 };
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
 &uart3 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart3_pins_b>;
+       pinctrl-0 = <&uart3_ph_pins>;
        status = "okay";
 };
 
 &uart7 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart7_pins_a>;
+       pinctrl-0 = <&uart7_pi_pins>;
        status = "okay";
 };
 
index 0898eb6162f59b8613f9573250762f6d2b3e5c39..0176e9de018033201cbf04b735d48a5530e9b22e 100644 (file)
@@ -62,8 +62,6 @@
 
        leds {
                compatible = "gpio-leds";
-               pinctrl-names = "default";
-               pinctrl-0 = <&led_pins_bananapro>;
 
                blue {
                        label = "bananapro:blue:usr";
 
        wifi_pwrseq: wifi-pwrseq {
                compatible = "mmc-pwrseq-simple";
-               pinctrl-names = "default";
-               pinctrl-0 = <&vmmc3_pin_bananapro>;
                reset-gpios = <&pio 7 22 GPIO_ACTIVE_LOW>;
        };
 
        reg_gmac_3v3: gmac-3v3 {
                compatible = "regulator-fixed";
-               pinctrl-names = "default";
-               pinctrl-0 = <&gmac_power_pin_bananapro>;
                regulator-name = "gmac-3v3";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_rgmii_a>;
+       pinctrl-0 = <&gmac_rgmii_pins>;
        phy = <&phy1>;
        phy-mode = "rgmii";
        phy-supply = <&reg_gmac_3v3>;
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 };
 
 &i2c2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c2_pins_a>;
        status = "okay";
 };
 
 &ir0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&ir0_rx_pins_a>;
+       pinctrl-0 = <&ir0_rx_pin>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_bananapro>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 10 GPIO_ACTIVE_LOW>; /* PH10 */
 };
 
 &mmc3 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc3_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        mmc-pwrseq = <&wifi_pwrseq>;
        bus-width = <4>;
        status = "okay";
 };
 
-&pio {
-       gmac_power_pin_bananapro: gmac_power_pin@0 {
-               pins = "PH23";
-               function = "gpio_out";
-       };
-
-       led_pins_bananapro: led_pins@0 {
-               pins = "PH24", "PG2";
-               function = "gpio_out";
-       };
-
-       mmc0_cd_pin_bananapro: mmc0_cd_pin@0 {
-               pins = "PH10";
-               function = "gpio_in";
-               bias-pull-up;
-       };
-
-       usb1_vbus_pin_bananapro: usb1_vbus_pin@0 {
-               pins = "PH0";
-               function = "gpio_out";
-       };
-
-       usb2_vbus_pin_bananapro: usb2_vbus_pin@0 {
-               pins = "PH1";
-               function = "gpio_out";
-       };
-
-       vmmc3_pin_bananapro: vmmc3_pin@0 {
-               pins = "PH22";
-               function = "gpio_out";
-       };
-};
-
 &reg_usb1_vbus {
-       pinctrl-0 = <&usb1_vbus_pin_bananapro>;
        gpio = <&pio 7 0 GPIO_ACTIVE_HIGH>; /* PH0 */
        status = "okay";
 };
 
 &reg_usb2_vbus {
-       pinctrl-0 = <&usb2_vbus_pin_bananapro>;
        gpio = <&pio 7 1 GPIO_ACTIVE_HIGH>; /* PH1 */
        status = "okay";
 };
 
 &spi0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&spi0_pins_a>,
-                   <&spi0_cs0_pins_a>,
-                   <&spi0_cs1_pins_a>;
+       pinctrl-0 = <&spi0_pi_pins>,
+                   <&spi0_cs0_pi_pin>,
+                   <&spi0_cs1_pi_pin>;
        status = "okay";
 };
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
 &uart4 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart4_pins_b>;
+       pinctrl-0 = <&uart4_ph_pins>;
        status = "okay";
 };
 
 &uart7 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart7_pins_a>;
+       pinctrl-0 = <&uart7_pi_pins>;
        status = "okay";
 };
 
index 942ac9dfd4a5a7a45f369fbe6854c07f3dc56dfa..200685b0b1cb2ae30ccf06f81ca7cd0e8eb787f2 100644 (file)
@@ -74,8 +74,6 @@
 
        leds {
                compatible = "gpio-leds";
-               pinctrl-names = "default";
-               pinctrl-0 = <&led_pins_cubieboard2>;
 
                blue {
                        label = "cubieboard2:blue:usr";
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_mii_a>;
+       pinctrl-0 = <&gmac_mii_pins>;
        phy = <&phy1>;
        phy-mode = "mii";
        status = "okay";
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 };
 
 &i2c1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins_a>;
        status = "okay";
 };
 
 &ir0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&ir0_rx_pins_a>;
+       pinctrl-0 = <&ir0_rx_pin>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>; /* PH1 */
 };
 
 &pio {
-       led_pins_cubieboard2: led_pins@0 {
-               pins = "PH20", "PH21";
-               function = "gpio_out";
-       };
-
-       usb0_id_detect_pin: usb0_id_detect_pin@0 {
+       usb0_id_detect_pin: usb0-id-detect-pin {
                pins = "PH4";
                function = "gpio_in";
                bias-pull-up;
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
index 5649161de1d7235872ab44f6a1da33ac01a0522d..99f531b8d2a78a2676bd34812e4a1127d214394e 100644 (file)
@@ -74,8 +74,6 @@
 
        leds {
                compatible = "gpio-leds";
-               pinctrl-names = "default";
-               pinctrl-0 = <&led_pins_cubietruck>;
 
                blue {
                        label = "cubietruck:blue:usr";
 
        mmc3_pwrseq: mmc3_pwrseq {
                compatible = "mmc-pwrseq-simple";
-               pinctrl-names = "default";
-               pinctrl-0 = <&mmc3_pwrseq_pin_cubietruck>;
                reset-gpios = <&pio 7 9 GPIO_ACTIVE_LOW>; /* PH9 WIFI_EN */
+               clocks = <&ccu CLK_OUT_A>;
+               clock-names = "ext_clock";
        };
 
        sound {
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_rgmii_a>;
+       pinctrl-0 = <&gmac_rgmii_pins>;
        phy = <&phy1>;
        phy-mode = "rgmii";
        status = "okay";
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 
 &i2c1 {
        pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins_a>;
        status = "okay";
 };
 
 &i2c2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c2_pins_a>;
        status = "okay";
 };
 
 &ir0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&ir0_rx_pins_a>;
+       pinctrl-0 = <&ir0_rx_pin>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>; /* PH1 */
 };
 
 &mmc3 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc3_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        mmc-pwrseq = <&mmc3_pwrseq>;
        bus-width = <4>;
        };
 };
 
-&mmc3_pins_a {
-       /* AP6210 requires pull-up */
-       bias-pull-up;
-};
-
 &ohci0 {
        status = "okay";
 };
 };
 
 &pio {
-       ahci_pwr_pin_cubietruck: ahci_pwr_pin@1 {
-               pins = "PH12";
-               function = "gpio_out";
-       };
-
-       led_pins_cubietruck: led_pins@0 {
-               pins = "PH7", "PH11", "PH20", "PH21";
-               function = "gpio_out";
-       };
-
-       mmc3_pwrseq_pin_cubietruck: mmc3_pwrseq_pin@0 {
-               pins = "PH9";
-               function = "gpio_out";
-       };
-
-       usb0_vbus_pin_a: usb0_vbus_pin@0 {
-               pins = "PH17";
-               function = "gpio_out";
-       };
-
-       usb0_id_detect_pin: usb0_id_detect_pin@0 {
-               pins = "PH19";
-               function = "gpio_in";
-       };
-
-       usb0_vbus_detect_pin: usb0_vbus_detect_pin@0 {
-               pins = "PH22";
-               function = "gpio_in";
-       };
+       /* Pin outputs low power clock for WiFi and BT */
+       pinctrl-0 = <&clk_out_a_pin>;
+       pinctrl-names = "default";
 };
 
 &pwm {
        pinctrl-names = "default";
-       pinctrl-0 = <&pwm0_pins_a>, <&pwm1_pins_a>;
+       pinctrl-0 = <&pwm0_pin>, <&pwm1_pin>;
        status = "okay";
 };
 
 &reg_ahci_5v {
-       pinctrl-0 = <&ahci_pwr_pin_cubietruck>;
        gpio = <&pio 7 12 GPIO_ACTIVE_HIGH>;
        status = "okay";
 };
 };
 
 &reg_usb0_vbus {
-       pinctrl-0 = <&usb0_vbus_pin_a>;
        gpio = <&pio 7 17 GPIO_ACTIVE_HIGH>;
        status = "okay";
 };
 
 &spdif {
        pinctrl-names = "default";
-       pinctrl-0 = <&spdif_tx_pins_a>;
+       pinctrl-0 = <&spdif_tx_pin>;
        status = "okay";
 };
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
+       status = "okay";
+};
+
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart2_pi_pins>, <&uart2_cts_rts_pi_pins>;
+       uart-has-rtscts;
        status = "okay";
+
+       bluetooth {
+               compatible = "brcm,bcm20702a1";
+               clocks = <&ccu CLK_OUT_A>;
+               clock-names = "lpo";
+               device-wakeup-gpios = <&pio 7 24 GPIO_ACTIVE_LOW>; /* PH24 */
+               host-wakeup-gpios = <&pio 7 25 GPIO_ACTIVE_LOW>; /* PH25 */
+               shutdown-gpios = <&pio 7 18 GPIO_ACTIVE_HIGH>; /* PH18 */
+               max-speed = <1500000>;
+       };
 };
 
 &usb_otg {
 };
 
 &usbphy {
-       pinctrl-names = "default";
-       pinctrl-0 = <&usb0_id_detect_pin>, <&usb0_vbus_detect_pin>;
        usb0_id_det-gpios = <&pio 7 19 GPIO_ACTIVE_HIGH>; /* PH19 */
        usb0_vbus_det-gpios = <&pio 7 22 GPIO_ACTIVE_HIGH>; /* PH22 */
        usb0_vbus_power-supply = <&usb_power_supply>;
index 1f0e5ecbf0c489adddd969630dbcb706ae6937f8..fd0153f65685618edacc77875d49fb558e3f9f4e 100644 (file)
@@ -67,8 +67,6 @@
 
        reg_mmc3_vdd: mmc3_vdd {
                compatible = "regulator-fixed";
-               pinctrl-names = "default";
-               pinctrl-0 = <&mmc3_vdd_pin_a20_hummingbird>;
                regulator-name = "mmc3_vdd";
                regulator-min-microvolt = <3000000>;
                regulator-max-microvolt = <3000000>;
@@ -78,8 +76,6 @@
 
        reg_gmac_vdd: gmac_vdd {
                compatible = "regulator-fixed";
-               pinctrl-names = "default";
-               pinctrl-0 = <&gmac_vdd_pin_a20_hummingbird>;
                regulator-name = "gmac_vdd";
                regulator-min-microvolt = <3000000>;
                regulator-max-microvolt = <3000000>;
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_rgmii_a>;
+       pinctrl-0 = <&gmac_rgmii_pins>;
        phy = <&phy1>;
        phy-mode = "rgmii";
        phy-supply = <&reg_gmac_vdd>;
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 };
 
 &i2c1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins_a>;
        status = "okay";
 };
 
 &i2c2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c2_pins_a>;
        status = "okay";
 };
 
 &i2c3 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c3_pins_a>;
        status = "okay";
 };
 
 &ir0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&ir0_rx_pins_a>;
+       pinctrl-0 = <&ir0_rx_pin>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v0>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>; /* PH1 */
 };
 
 &mmc3 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc3_pins_a>;
        vmmc-supply = <&reg_mmc3_vdd>;
        bus-width = <4>;
        non-removable;
        status = "okay";
 };
 
-&pio {
-       ahci_pwr_pin_a20_hummingbird: ahci_pwr_pin@0 {
-               pins = "PH15";
-               function = "gpio_out";
-       };
-
-       usb1_vbus_pin_a20_hummingbird: usb1_vbus_pin@0 {
-               pins = "PH2";
-               function = "gpio_out";
-       };
-
-       mmc3_vdd_pin_a20_hummingbird: mmc3_vdd_pin@0 {
-               pins = "PH9";
-               function = "gpio_out";
-       };
-
-       gmac_vdd_pin_a20_hummingbird: gmac_vdd_pin@0 {
-               pins = "PH16";
-               function = "gpio_out";
-       };
-};
-
 &pwm {
        pinctrl-names = "default";
-       pinctrl-0 = <&pwm0_pins_a>;
+       pinctrl-0 = <&pwm0_pin>;
        status = "okay";
 };
 
 &reg_ahci_5v {
-       pinctrl-0 = <&ahci_pwr_pin_a20_hummingbird>;
        gpio = <&pio 7 15 GPIO_ACTIVE_HIGH>; /* PH15 */
        status = "okay";
 };
 
 &reg_usb1_vbus {
-       pinctrl-0 = <&usb1_vbus_pin_a20_hummingbird>;
        gpio = <&pio 7 2 GPIO_ACTIVE_HIGH>; /* PH2 */
        status = "okay";
 };
 
 &spi2 {
        pinctrl-names = "default";
-       pinctrl-0 = <&spi2_pins_b>,
-                   <&spi2_cs0_pins_b>;
+       pinctrl-0 = <&spi2_pb_pins>,
+                   <&spi2_cs0_pb_pin>;
        status = "okay";
 };
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
 &uart2 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart2_pins_a>;
+       pinctrl-0 = <&uart2_pi_pins>, <&uart2_cts_rts_pi_pins>;
        status = "okay";
 };
 
 &uart3 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart3_pins_a>;
+       pinctrl-0 = <&uart3_pg_pins>, <&uart3_cts_rts_pg_pins>;
        status = "okay";
 };
 
 &uart4 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart4_pins_a>;
+       pinctrl-0 = <&uart4_pg_pins>;
        status = "okay";
 };
 
 &uart5 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart5_pins_a>;
+       pinctrl-0 = <&uart5_pi_pins>;
        status = "okay";
 };
 
index 2e3f2f29d124a036c9d45a15707bf460e1ade81a..5f1c4f573d3eac3cbb3c900014119b97a629a78f 100644 (file)
@@ -61,8 +61,6 @@
 
        leds {
                compatible = "gpio-leds";
-               pinctrl-names = "default";
-               pinctrl-0 = <&led_pins_i12_tvbox>;
 
                red {
                        label = "i12_tvbox:red:usr";
@@ -77,8 +75,6 @@
 
        reg_vmmc3: vmmc3 {
                compatible = "regulator-fixed";
-               pinctrl-names = "default";
-               pinctrl-0 = <&vmmc3_pin_i12_tvbox>;
                regulator-name = "vmmc3";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
@@ -88,8 +84,6 @@
 
        reg_vmmc3_io: vmmc3-io {
                compatible = "regulator-fixed";
-               pinctrl-names = "default";
-               pinctrl-0 = <&vmmc3_io_pin_i12_tvbox>;
                regulator-name = "vmmc3-io";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
 
        reg_gmac_3v3: gmac-3v3 {
                compatible = "regulator-fixed";
-               pinctrl-names = "default";
-               pinctrl-0 = <&gmac_power_pin_i12_tvbox>;
                regulator-name = "gmac-3v3";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_mii_a>;
+       pinctrl-0 = <&gmac_mii_pins>;
        phy = <&phy1>;
        phy-mode = "mii";
        phy-supply = <&reg_gmac_3v3>;
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 
 &ir0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&ir0_rx_pins_a>;
+       pinctrl-0 = <&ir0_rx_pin>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>; /* PH1 */
 };
 
 &mmc3 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc3_pins_a>;
        vmmc-supply = <&reg_vmmc3>;
        bus-width = <4>;
        non-removable;
        };
 };
 
-&mmc3_pins_a {
-       /* AP6210 / AP6330 requires pull-up */
-       bias-pull-up;
-};
-
 &ohci0 {
        status = "okay";
 };
        status = "okay";
 };
 
-&pio {
-       vmmc3_pin_i12_tvbox: vmmc3_pin@0 {
-               pins = "PH2";
-               function = "gpio_out";
-       };
-
-       vmmc3_io_pin_i12_tvbox: vmmc3_io_pin@0 {
-               pins = "PH12";
-               function = "gpio_out";
-       };
-
-       gmac_power_pin_i12_tvbox: gmac_power_pin@0 {
-               pins = "PH21";
-               function = "gpio_out";
-       };
-
-       led_pins_i12_tvbox: led_pins@0 {
-               pins = "PH9", "PH20";
-               function = "gpio_out";
-       };
-};
-
 &reg_usb1_vbus {
        status = "okay";
 };
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
index 926fa194eb1b417b46f278f479b3ed871992e4bf..949494730aee9cfba54624b0cd6b7985481dcef8 100644 (file)
@@ -74,7 +74,7 @@
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_mii_a>;
+       pinctrl-0 = <&gmac_mii_pins>;
        phy = <&phy1>;
        phy-mode = "mii";
        status = "okay";
@@ -85,8 +85,6 @@
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 };
 
 &i2c1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins_a>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 8 5 GPIO_ACTIVE_LOW>; /* PI5 */
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
index 1b05ba466e7d94253d57e333376ee0d6f8feb857..b90a7607d0699514738ae04bb43f72c1e92b60cd 100644 (file)
@@ -96,7 +96,7 @@
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_mii_a>;
+       pinctrl-0 = <&gmac_mii_pins>;
        phy = <&phy1>;
        phy-mode = "mii";
        status = "okay";
 
 &ir0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&ir0_rx_pins_a>;
+       pinctrl-0 = <&ir0_rx_pin>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>; /* PH1 */
 };
 
 &pio {
-       led_pins_itead_core: led_pins@0 {
+       led_pins_itead_core: led-pins {
                pins = "PH20","PH21";
                function = "gpio_out";
                drive-strength = <20>;
 
 &spdif {
        pinctrl-names = "default";
-       pinctrl-0 = <&spdif_tx_pins_a>;
+       pinctrl-0 = <&spdif_tx_pin>;
        status = "okay";
 };
index b1ab7c1c33e32938597756bda3cdca4eb10d673a..f91e1bee44e8c3454d5214f72df87726adfb91a4 100644 (file)
@@ -74,8 +74,6 @@
 
        leds {
                compatible = "gpio-leds";
-               pinctrl-names = "default";
-               pinctrl-0 = <&led_pins_lamobo_r1>;
 
                green {
                        label = "lamobo_r1:green:usr";
@@ -85,8 +83,6 @@
 
        reg_gmac_3v3: gmac-3v3 {
                compatible = "regulator-fixed";
-               pinctrl-names = "default";
-               pinctrl-0 = <&gmac_power_pin_lamobo_r1>;
                regulator-name = "gmac-3v3";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_rgmii_a>;
+       pinctrl-0 = <&gmac_rgmii_pins>;
        phy-mode = "rgmii";
        phy-supply = <&reg_gmac_3v3>;
        status = "okay";
+       /delete-property/#address-cells;
+       /delete-property/#size-cells;
 
        fixed-link {
                speed = <1000>;
                switch: ethernet-switch@1e {
                        compatible = "brcm,bcm53125";
                        reg = <30>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
 
                        ports {
                                #address-cells = <1>;
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 };
 
 &i2c2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c2_pins_a>;
        status = "okay";
 };
 
 &ir0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&ir0_rx_pins_a>;
+       pinctrl-0 = <&ir0_rx_pin>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_lamobo_r1>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 10 GPIO_ACTIVE_LOW>; /* PH10 */
 };
 
 &pio {
-       usb0_id_detect_pin: usb0_id_detect_pin@0 {
+       usb0_id_detect_pin: usb0-id-detect-pin {
                pins = "PH4";
                function = "gpio_in";
                bias-pull-up;
        };
-
-       mmc0_cd_pin_lamobo_r1: mmc0_cd_pin@0 {
-               pins = "PH10";
-               function = "gpio_in";
-               bias-pull-up;
-       };
-
-       gmac_power_pin_lamobo_r1: gmac_power_pin@0 {
-               pins = "PH23";
-               function = "gpio_out";
-       };
-
-       led_pins_lamobo_r1: led_pins@0 {
-               pins = "PH24";
-               function = "gpio_out";
-       };
 };
 
 #include "axp209.dtsi"
 
 &spi0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&spi0_pins_a>,
-                   <&spi0_cs0_pins_a>,
-                   <&spi0_cs1_pins_a>;
+       pinctrl-0 = <&spi0_pi_pins>,
+                   <&spi0_cs0_pi_pin>,
+                   <&spi0_cs1_pi_pin>;
        status = "okay";
 };
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
 &uart3 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart3_pins_b>;
+       pinctrl-0 = <&uart3_ph_pins>;
        status = "okay";
 };
 
 &uart7 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart7_pins_a>;
+       pinctrl-0 = <&uart7_pi_pins>;
        status = "okay";
 };
 
index e91a209850bc58d74462d74ee302b1d67f5a5d28..b8a1aaaf3976527d6bea57966a60f5b3868132a6 100644 (file)
@@ -63,8 +63,6 @@
 
        leds {
                compatible = "gpio-leds";
-               pinctrl-names = "default";
-               pinctrl-0 = <&led_pins_m3>;
 
                blue {
                        label = "m3:blue:usr";
@@ -83,7 +81,7 @@
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_mii_a>;
+       pinctrl-0 = <&gmac_mii_pins>;
        phy = <&phy1>;
        phy-mode = "mii";
        status = "okay";
@@ -94,8 +92,6 @@
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 
 &ir0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&ir0_rx_pins_a>;
+       pinctrl-0 = <&ir0_rx_pin>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>; /* PH1 */
 };
 
 &mmc2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc2_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        non-removable;
        status = "okay";
 };
 
-&pio {
-       led_pins_m3: led_pins@0 {
-               pins = "PH20";
-               function = "gpio_out";
-       };
-};
-
 &reg_usb1_vbus {
        status = "okay";
 };
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
index 00c3ffd32388f3a8c1d07dab64750ea8101e0746..6de52c7c314fb2efa79357ca96aa696682ffb1b8 100644 (file)
        };
 };
 
+&ahci {
+       status = "okay";
+};
+
 &ehci0 {
        status = "okay";
 };
@@ -31,7 +35,7 @@
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_mii_a>;
+       pinctrl-0 = <&gmac_rgmii_pins>;
        phy = <&phy1>;
        phy-mode = "mii";
        status = "okay";
@@ -51,6 +55,6 @@
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
index 6109f794a9c1007278eeda4e5769029e1cd46c56..1491c603f6614725bb5f8553a1bb731a88e5faaa 100644 (file)
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 };
 
 &i2c1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins_a>;
        status = "okay";
 };
 
 &i2c2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c2_pins_a>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v0>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>; /* PH1 */
        status = "okay";
 };
 
-&pio {
-       usb0_id_detect_pin: usb0_id_detect_pin@0 {
-               pins = "PH4";
-               function = "gpio_in";
-       };
-
-       usb0_vbus_detect_pin: usb0_vbus_detect_pin@0 {
-               pins = "PH5";
-               function = "gpio_in";
-       };
-};
-
 &reg_usb0_vbus {
        status = "okay";
 };
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
 &uart2 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart2_pins_a>;
+       pinctrl-0 = <&uart2_pi_pins>, <&uart2_cts_rts_pi_pins>;
        status = "okay";
 };
 
 };
 
 &usbphy {
-       pinctrl-names = "default";
-       pinctrl-0 = <&usb0_id_detect_pin>, <&usb0_vbus_detect_pin>;
        usb0_id_det-gpios = <&pio 7 4 GPIO_ACTIVE_HIGH>; /* PH4 */
        usb0_vbus_det-gpios = <&pio 7 5 GPIO_ACTIVE_HIGH>; /* PH5 */
        usb0_vbus-supply = <&reg_usb0_vbus>;
diff --git a/arch/arm/dts/sun7i-a20-olimex-som-evb-emmc.dts b/arch/arm/dts/sun7i-a20-olimex-som-evb-emmc.dts
new file mode 100644 (file)
index 0000000..20bf09b
--- /dev/null
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Device Tree Source for A20-Olimex-SOM-EVB-eMMC Board
+ *
+ * Copyright (C) 2018 Olimex Ltd.
+ *   Author: Stefan Mavrodiev <stefan@olimex.com>
+ */
+
+/dts-v1/;
+#include "sun7i-a20-olimex-som-evb.dts"
+
+/ {
+
+       model = "Olimex A20-Olimex-SOM-EVB-eMMC";
+       compatible = "olimex,a20-olimex-som-evb-emmc", "allwinner,sun7i-a20";
+
+       mmc2_pwrseq: mmc2_pwrseq {
+               compatible = "mmc-pwrseq-emmc";
+               reset-gpios = <&pio 2 18 GPIO_ACTIVE_LOW>;
+       };
+};
+
+&mmc2 {
+       vmmc-supply = <&reg_vcc3v3>;
+       mmc-pwrseq = <&mmc2_pwrseq>;
+       bus-width = <4>;
+       non-removable;
+       status = "okay";
+
+       emmc: emmc@0 {
+               reg = <0>;
+               compatible = "mmc-card";
+               broken-hpi;
+       };
+};
index f080f82b58efdf65314aed7d0c622b999868087d..f0e6a96e5785bcd1f1721a97ba15bf9667be4f97 100644 (file)
@@ -74,8 +74,6 @@
 
        leds {
                compatible = "gpio-leds";
-               pinctrl-names = "default";
-               pinctrl-0 = <&led_pins_olimex_som_evb>;
 
                green {
                        label = "a20-olimex-som-evb:green:usr";
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_rgmii_a>;
+       pinctrl-0 = <&gmac_rgmii_pins>;
        phy = <&phy1>;
        phy-mode = "rgmii";
        status = "okay";
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 };
 
 &i2c1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins_a>;
        status = "okay";
 };
 
 &i2c2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c2_pins_a>;
        status = "okay";
 };
 
        vref-supply = <&reg_vcc3v0>;
        status = "okay";
 
-       button@190 {
+       button-190 {
                label = "Volume Up";
                linux,code = <KEY_VOLUMEUP>;
                channel = <0>;
                voltage = <190000>;
        };
 
-       button@390 {
+       button-390 {
                label = "Volume Down";
                linux,code = <KEY_VOLUMEDOWN>;
                channel = <0>;
                voltage = <390000>;
        };
 
-       button@600 {
+       button-600 {
                label = "Menu";
                linux,code = <KEY_MENU>;
                channel = <0>;
                voltage = <600000>;
        };
 
-       button@800 {
+       button-800 {
                label = "Search";
                linux,code = <KEY_SEARCH>;
                channel = <0>;
                voltage = <800000>;
        };
 
-       button@980 {
+       button-980 {
                label = "Home";
                linux,code = <KEY_HOMEPAGE>;
                channel = <0>;
                voltage = <980000>;
        };
 
-       button@1180 {
+       button-1180 {
                label = "Esc";
                linux,code = <KEY_ESC>;
                channel = <0>;
                voltage = <1180000>;
        };
 
-       button@1400 {
+       button-1400 {
                label = "Enter";
                linux,code = <KEY_ENTER>;
                channel = <0>;
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>; /* PH1 */
 };
 
 &mmc3 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc3_pins_a>, <&mmc3_cd_pin_olimex_som_evb>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 0 GPIO_ACTIVE_LOW>; /* PH0 */
 };
 
 &pio {
-       ahci_pwr_pin_olimex_som_evb: ahci_pwr_pin@1 {
-               pins = "PC3";
-               function = "gpio_out";
-       };
-
-       led_pins_olimex_som_evb: led_pins@0 {
+       led_pins_olimex_som_evb: led-pins {
                pins = "PH2";
                function = "gpio_out";
                drive-strength = <20>;
        };
-
-       mmc3_cd_pin_olimex_som_evb: mmc3_cd_pin@0 {
-               pins = "PH0";
-               function = "gpio_in";
-               bias-pull-up;
-       };
-
-       usb0_id_detect_pin: usb0_id_detect_pin@0 {
-               pins = "PH4";
-               function = "gpio_in";
-       };
-
-       usb0_vbus_detect_pin: usb0_vbus_detect_pin@0 {
-               pins = "PH5";
-               function = "gpio_in";
-       };
 };
 
 &reg_ahci_5v {
-       pinctrl-0 = <&ahci_pwr_pin_olimex_som_evb>;
        gpio = <&pio 2 3 GPIO_ACTIVE_HIGH>;
        status = "okay";
 };
 
 &spi1 {
        pinctrl-names = "default";
-       pinctrl-0 = <&spi1_pins_a>,
-                   <&spi1_cs0_pins_a>;
+       pinctrl-0 = <&spi1_pi_pins>,
+                   <&spi1_cs0_pi_pin>;
        status = "okay";
 };
 
 &spi2 {
        pinctrl-names = "default";
-       pinctrl-0 = <&spi2_pins_a>,
-                   <&spi2_cs0_pins_a>;
+       pinctrl-0 = <&spi2_pc_pins>,
+                   <&spi2_cs0_pc_pin>;
        status = "okay";
 };
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
 &uart6 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart6_pins_a>;
+       pinctrl-0 = <&uart6_pi_pins>;
        status = "okay";
 };
 
 &uart7 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart7_pins_a>;
+       pinctrl-0 = <&uart7_pi_pins>;
        status = "okay";
 };
 
 };
 
 &usbphy {
-       pinctrl-names = "default";
-       pinctrl-0 = <&usb0_id_detect_pin>, <&usb0_vbus_detect_pin>;
        usb0_id_det-gpios = <&pio 7 4 GPIO_ACTIVE_HIGH>; /* PH04 */
        usb0_vbus_det-gpios = <&pio 7 5 GPIO_ACTIVE_HIGH>; /* PH05 */
        usb0_vbus-supply = <&reg_usb0_vbus>;
index c56620a8fb20f7bfbdb4fd21fb33355c7780b039..a59755a2e7a9db9e2fa8baf06f18571663da78ad 100644 (file)
@@ -20,8 +20,6 @@
 };
 
 &mmc2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc2_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        mmc-pwrseq = <&mmc2_pwrseq>;
        bus-width = <4>;
index 3d7b5c848fefe5940aed9e3b68d32f6a28543ade..823aabce046253fac96dbd92e96771a7c0e40d74 100644 (file)
@@ -78,7 +78,7 @@
 
 &can0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&can0_pins_a>;
+       pinctrl-0 = <&can_ph_pins>;
        status = "okay";
 };
 
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_rgmii_a>;
+       pinctrl-0 = <&gmac_rgmii_pins>;
        phy = <&phy3>;
        phy-mode = "rgmii";
        phy-supply = <&reg_vcc3v3>;
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 
 /* Exposed to UEXT1 */
 &i2c1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins_a>;
        status = "okay";
 
        eeprom: eeprom@50 {
 
 /* Exposed to UEXT2 */
 &i2c2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c2_pins_a>;
        status = "okay";
 };
 
 &ir0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&ir0_rx_pins_a>;
+       pinctrl-0 = <&ir0_rx_pin>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>;
 };
 
 &mmc3 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc3_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        mmc-pwrseq = <&rtl_pwrseq>;
        bus-width = <4>;
 };
 
 &pio {
-       bt_uart_pins: bt_uart_pins@0 {
-               pins = "PG6", "PG7", "PG8";
+       uart3_rts_pin: uart3-rts-pin {
+               pins = "PG8";
                function = "uart3";
        };
 };
 /* Exposed to UEXT1 */
 &spi1 {
        pinctrl-names = "default";
-       pinctrl-0 = <&spi1_pins_a>,
-                   <&spi1_cs0_pins_a>;
+       pinctrl-0 = <&spi1_pi_pins>,
+                   <&spi1_cs0_pi_pin>;
        status = "okay";
 };
 
 /* Exposed to UEXT2 */
 &spi2 {
        pinctrl-names = "default";
-       pinctrl-0 = <&spi2_pins_a>,
-                   <&spi2_cs0_pins_a>;
+       pinctrl-0 = <&spi2_pc_pins>,
+                   <&spi2_cs0_pc_pin>;
        status = "okay";
 };
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
 /* Used for RTL8723BS bluetooth */
 &uart3 {
        pinctrl-names = "default";
-       pinctrl-0 = <&bt_uart_pins>;
+       pinctrl-0 = <&uart3_pg_pins>, <&uart3_rts_pin>;
        status = "okay";
 };
 
 /* Exposed to UEXT1 */
 &uart4 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart4_pins_a>;
+       pinctrl-0 = <&uart4_pg_pins>;
        status = "okay";
 };
 
 /* Exposed to UEXT2 */
 &uart7 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart7_pins_a>;
+       pinctrl-0 = <&uart7_pi_pins>;
        status = "okay";
 };
 
index d20fd03596e9389e948eddb291d141de40d5f522..5e411194bf62bbd876176c2e30ecbeea128d82b4 100644 (file)
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_mii_a>;
+       pinctrl-0 = <&gmac_mii_pins>;
        phy = <&phy1>;
        phy-mode = "mii";
        status = "okay";
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 };
 
 &i2c1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins_a>;
        status = "okay";
 
        eeprom: eeprom@50 {
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>; /* PH1 */
 };
 
 &pio {
-       ahci_pwr_pin_olinuxinolime: ahci_pwr_pin@1 {
-               pins = "PC3";
-               function = "gpio_out";
-       };
-
-       led_pins_olinuxinolime: led_pins@0 {
+       led_pins_olinuxinolime: led-pins {
                pins = "PH2";
                function = "gpio_out";
                drive-strength = <20>;
        };
 
-       usb0_id_detect_pin: usb0_id_detect_pin@0 {
+       usb0_id_detect_pin: usb0-id-detect-pin {
                pins = "PH4";
                function = "gpio_in";
                bias-pull-up;
        };
 
-       usb0_vbus_detect_pin: usb0_vbus_detect_pin@0 {
+       usb0_vbus_detect_pin: usb0-vbus-detect-pin {
                pins = "PH5";
                function = "gpio_in";
                bias-pull-down;
 };
 
 &reg_ahci_5v {
-       pinctrl-0 = <&ahci_pwr_pin_olinuxinolime>;
        gpio = <&pio 2 3 GPIO_ACTIVE_HIGH>;
        status = "okay";
 };
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
index 81f376f2a44d17eec47200b56bb08a62839ac193..decb014a382b8b7f8ca6140b01e52693e6aa6599 100644 (file)
        compatible = "olimex,a20-olinuxino-lime2-emmc", "allwinner,sun7i-a20";
 
        mmc2_pwrseq: pwrseq {
-               pinctrl-0 = <&mmc2_pins_nrst>;
-               pinctrl-names = "default";
                compatible = "mmc-pwrseq-emmc";
                reset-gpios = <&pio 2 16 GPIO_ACTIVE_LOW>;
        };
 };
 
-&pio {
-       mmc2_pins_nrst: mmc2-rst-pin {
-               pins = "PC16";
-               function = "gpio_out";
-       };
-};
-
 &mmc2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc2_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        vqmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
index b828677f331d5d6c89763d3e5a76d1779bd583af..4e1c590eb09821bb7827029c203542e9e4e1eed1 100644 (file)
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_rgmii_a>;
+       pinctrl-0 = <&gmac_rgmii_pins>;
        phy = <&phy1>;
        phy-mode = "rgmii";
        status = "okay";
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 };
 
 &i2c1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins_a>;
        status = "okay";
 
        eeprom: eeprom@50 {
        };
 };
 
+&lradc {
+       vref-supply = <&reg_vcc3v0>;
+};
+
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>; /* PH1 */
 };
 
 &pio {
-       ahci_pwr_pin_olinuxinolime: ahci_pwr_pin@1 {
-               pins = "PC3";
-               function = "gpio_out";
-       };
-
-       led_pins_olinuxinolime: led_pins@0 {
+       led_pins_olinuxinolime: led-pins {
                pins = "PH2";
                function = "gpio_out";
                drive-strength = <20>;
        };
 
-       usb0_id_detect_pin: usb0_id_detect_pin@0 {
+       usb0_id_detect_pin: usb0-id-detect-pin {
                pins = "PH4";
                function = "gpio_in";
                bias-pull-up;
        };
 
-       usb0_vbus_detect_pin: usb0_vbus_detect_pin@0 {
+       usb0_vbus_detect_pin: usb0-vbus-detect-pin {
                pins = "PH5";
                function = "gpio_in";
                bias-pull-down;
        };
-
-       usb0_vbus_pin_lime2: usb0_vbus_pin@0 {
-               pins = "PC17";
-               function = "gpio_out";
-       };
 };
 
 &reg_ahci_5v {
-       pinctrl-0 = <&ahci_pwr_pin_olinuxinolime>;
        gpio = <&pio 2 3 GPIO_ACTIVE_HIGH>;
        status = "okay";
 };
        regulator-min-microvolt = <2800000>;
        regulator-max-microvolt = <2800000>;
        regulator-name = "vddio-csi0";
+       regulator-soft-start;
+       regulator-ramp-delay = <1600>;
 };
 
 &reg_ldo4 {
 };
 
 &reg_usb0_vbus {
-       pinctrl-0 = <&usb0_vbus_pin_lime2>;
        gpio = <&pio 2 17 GPIO_ACTIVE_HIGH>;
        status = "okay";
 };
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
index d99e7b193efe39550f1b4a18f39bb7d8521c68f6..2337b44a88aa18de9fbd8657624f10294dd7c901 100644 (file)
@@ -54,8 +54,6 @@
 };
 
 &mmc2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc2_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        non-removable;
index 866d230593be407dc9b3f5d28f66a732b1b03f18..840ae1194a66d90bc71f098466ea06a03f95de4a 100644 (file)
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_mii_a>, <&gmac_txerr>;
+       pinctrl-0 = <&gmac_mii_pins>, <&gmac_txerr>;
        phy = <&phy1>;
        phy-mode = "mii";
        status = "okay";
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 };
 
 &i2c1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins_a>;
        status = "okay";
 
        eeprom: eeprom@50 {
 };
 
 &i2c2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c2_pins_a>;
        status = "okay";
 };
 
        vref-supply = <&reg_vcc3v0>;
        status = "okay";
 
-       button@191 {
+       button-191 {
                label = "Volume Up";
                linux,code = <KEY_VOLUMEUP>;
                channel = <0>;
                voltage = <191274>;
        };
 
-       button@392 {
+       button-392 {
                label = "Volume Down";
                linux,code = <KEY_VOLUMEDOWN>;
                channel = <0>;
                voltage = <392644>;
        };
 
-       button@601 {
+       button-601 {
                label = "Menu";
                linux,code = <KEY_MENU>;
                channel = <0>;
                voltage = <601151>;
        };
 
-       button@795 {
+       button-795 {
                label = "Search";
                linux,code = <KEY_SEARCH>;
                channel = <0>;
                voltage = <795090>;
        };
 
-       button@987 {
+       button-987 {
                label = "Home";
                linux,code = <KEY_HOMEPAGE>;
                channel = <0>;
                voltage = <987387>;
        };
 
-       button@1184 {
+       button-1184 {
                label = "Esc";
                linux,code = <KEY_ESC>;
                channel = <0>;
                voltage = <1184678>;
        };
 
-       button@1398 {
+       button-1398 {
                label = "Enter";
                linux,code = <KEY_ENTER>;
                channel = <0>;
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>; /* PH1 */
 };
 
 &mmc3 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc3_pins_a>, <&mmc3_cd_pin_olinuxinom>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 11 GPIO_ACTIVE_LOW>; /* PH11 */
 };
 
 &pio {
-       gmac_txerr: gmac_txerr@0 {
+       gmac_txerr: gmac-txerr-pin {
                pins = "PA17";
                function = "gmac";
        };
 
-       mmc3_cd_pin_olinuxinom: mmc3_cd_pin@0 {
-               pins = "PH11";
-               function = "gpio_in";
-               bias-pull-up;
-       };
-
-       led_pins_olinuxino: led_pins@0 {
+       led_pins_olinuxino: led-pins {
                pins = "PH2";
                function = "gpio_out";
                drive-strength = <20>;
        };
 
-       usb0_id_detect_pin: usb0_id_detect_pin@0 {
+       usb0_id_detect_pin: usb0-id-detect-pin {
                pins = "PH4";
                function = "gpio_in";
                bias-pull-up;
        };
 
-       usb0_vbus_detect_pin: usb0_vbus_detect_pin@0 {
+       usb0_vbus_detect_pin: usb0-vbus-detect-pin {
                pins = "PH5";
                function = "gpio_in";
                bias-pull-down;
 
 &spi1 {
        pinctrl-names = "default";
-       pinctrl-0 = <&spi1_pins_a>,
-                   <&spi1_cs0_pins_a>;
+       pinctrl-0 = <&spi1_pi_pins>,
+                   <&spi1_cs0_pi_pin>;
        status = "okay";
 };
 
 &spi2 {
        pinctrl-names = "default";
-       pinctrl-0 = <&spi2_pins_a>,
-                   <&spi2_cs0_pins_a>;
+       pinctrl-0 = <&spi2_pc_pins>,
+                   <&spi2_cs0_pc_pin>;
        status = "okay";
 };
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
 &uart6 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart6_pins_a>;
+       pinctrl-0 = <&uart6_pi_pins>;
        status = "okay";
 };
 
 &uart7 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart7_pins_a>;
+       pinctrl-0 = <&uart7_pi_pins>;
        status = "okay";
 };
 
index f5c7178eb0635a49c84f6b459608c53db634d1ef..15881081cac403375ab643ca7594d4ccbf9b3a5b 100644 (file)
@@ -74,8 +74,6 @@
 
        leds {
                compatible = "gpio-leds";
-               pinctrl-names = "default";
-               pinctrl-0 = <&led_pins_orangepi>;
 
                green {
                        label = "orangepi:green:usr";
@@ -90,8 +88,6 @@
 
        reg_gmac_3v3: gmac-3v3 {
                compatible = "regulator-fixed";
-               pinctrl-names = "default";
-               pinctrl-0 = <&gmac_power_pin_orangepi>;
                regulator-name = "gmac-3v3";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_rgmii_a>;
+       pinctrl-0 = <&gmac_rgmii_pins>;
        phy = <&phy1>;
        phy-mode = "rgmii";
        phy-supply = <&reg_gmac_3v3>;
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 
 &ir0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&ir0_rx_pins_a>;
+       pinctrl-0 = <&ir0_rx_pin>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_orangepi>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 10 GPIO_ACTIVE_LOW>; /* PH10 */
 };
 
 &mmc3 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc3_pins_a>, <&mmc3_cd_pin_orangepi>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 11 GPIO_ACTIVE_LOW>; /* PH11 */
 };
 
 &pio {
-       usb0_id_detect_pin: usb0_id_detect_pin@0 {
+       usb0_id_detect_pin: usb0-id-detect-pin {
                pins = "PH4";
                function = "gpio_in";
                bias-pull-up;
        };
-
-       mmc0_cd_pin_orangepi: mmc0_cd_pin@0 {
-               pins = "PH10";
-               function = "gpio_in";
-               bias-pull-up;
-       };
-
-       mmc3_cd_pin_orangepi: mmc3_cd_pin@0 {
-               pins = "PH11";
-               function = "gpio_in";
-               bias-pull-up;
-       };
-
-       usb2_vbus_pin_bananapro: usb2_vbus_pin@0 {
-               pins = "PH22";
-               function = "gpio_out";
-       };
-
-       gmac_power_pin_orangepi: gmac_power_pin@0 {
-               pins = "PH23";
-               function = "gpio_out";
-       };
-
-       led_pins_orangepi: led_pins@0 {
-               pins = "PH24", "PH25";
-               function = "gpio_out";
-       };
-
-       usb1_vbus_pin_bananapro: usb1_vbus_pin@0 {
-               pins = "PH26";
-               function = "gpio_out";
-       };
 };
 
 &reg_dcdc2 {
 };
 
 &reg_usb1_vbus {
-       pinctrl-0 = <&usb1_vbus_pin_bananapro>;
        gpio = <&pio 7 26 GPIO_ACTIVE_HIGH>; /* PH26 */
        status = "okay";
 };
 
 &reg_usb2_vbus {
-       pinctrl-0 = <&usb2_vbus_pin_bananapro>;
        gpio = <&pio 7 22 GPIO_ACTIVE_HIGH>; /* PH22 */
        status = "okay";
 };
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
index 7a4244e575893daf46aa5ce53e1ddcabb8bb1ba9..d64de2e73a9f5cfcf0126b973660cb82e8f51c59 100644 (file)
@@ -63,8 +63,6 @@
 
        leds {
                compatible = "gpio-leds";
-               pinctrl-names = "default";
-               pinctrl-0 = <&led_pins_orangepi>;
 
                green {
                        label = "orangepi:green:usr";
@@ -74,8 +72,6 @@
 
        reg_gmac_3v3: gmac-3v3 {
                compatible = "regulator-fixed";
-               pinctrl-names = "default";
-               pinctrl-0 = <&gmac_power_pin_orangepi>;
                regulator-name = "gmac-3v3";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
@@ -99,7 +95,7 @@
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_rgmii_a>;
+       pinctrl-0 = <&gmac_rgmii_pins>;
        phy = <&phy1>;
        phy-mode = "rgmii";
        phy-supply = <&reg_gmac_3v3>;
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 
 &ir0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&ir0_rx_pins_a>;
+       pinctrl-0 = <&ir0_rx_pin>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_orangepi>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 10 GPIO_ACTIVE_LOW>; /* PH10 */
 };
 
 &pio {
-       usb0_id_detect_pin: usb0_id_detect_pin@0 {
+       usb0_id_detect_pin: usb0-id-detect-pin {
                pins = "PH4";
                function = "gpio_in";
                bias-pull-up;
        };
-
-       mmc0_cd_pin_orangepi: mmc0_cd_pin@0 {
-               pins = "PH10";
-               function = "gpio_in";
-               bias-pull-up;
-       };
-
-       usb2_vbus_pin_bananapro: usb2_vbus_pin@0 {
-               pins = "PH22";
-               function = "gpio_out";
-       };
-
-       gmac_power_pin_orangepi: gmac_power_pin@0 {
-               pins = "PH23";
-               function = "gpio_out";
-       };
-
-       led_pins_orangepi: led_pins@0 {
-               pins = "PH24";
-               function = "gpio_out";
-       };
-
-       usb1_vbus_pin_bananapro: usb1_vbus_pin@0 {
-               pins = "PH26";
-               function = "gpio_out";
-       };
 };
 
 &reg_dcdc2 {
 };
 
 &reg_usb1_vbus {
-       pinctrl-0 = <&usb1_vbus_pin_bananapro>;
        gpio = <&pio 7 26 GPIO_ACTIVE_HIGH>; /* PH26 */
        status = "okay";
 };
 
 &reg_usb2_vbus {
-       pinctrl-0 = <&usb2_vbus_pin_bananapro>;
        gpio = <&pio 7 22 GPIO_ACTIVE_HIGH>; /* PH22 */
        status = "okay";
 };
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
index bfca960b03e03e9e7991b77f1bb9aeb89d8d0f22..538ea15fa32fe981eb5be25727ac82a6babdb3e5 100644 (file)
@@ -71,8 +71,6 @@
 
        leds {
                compatible = "gpio-leds";
-               pinctrl-names = "default";
-               pinctrl-0 = <&led_pins_pcduino3_nano>;
 
                /* Marked "LED3" on the PCB. */
                usr1 {
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_rgmii_a>;
+       pinctrl-0 = <&gmac_rgmii_pins>;
        phy = <&phy1>;
        phy-mode = "rgmii";
        status = "okay";
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 
 &ir0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&ir0_rx_pins_a>;
+       pinctrl-0 = <&ir0_rx_pin>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>; /* PH1 */
 };
 
 &pio {
-       ahci_pwr_pin_pcduino3_nano: ahci_pwr_pin@0 {
-               pins = "PH2";
-               function = "gpio_out";
-       };
-
-       led_pins_pcduino3_nano: led_pins@0 {
-               pins = "PH16", "PH15";
-               function = "gpio_out";
-       };
-
-       usb0_id_detect_pin: usb0_id_detect_pin@0 {
+       usb0_id_detect_pin: usb0-id-detect-pin {
                pins = "PH4";
                function = "gpio_in";
                bias-pull-up;
        };
-
-       usb1_vbus_pin_pcduino3_nano: usb1_vbus_pin@0 {
-               pins = "PD2";
-               function = "gpio_out";
-       };
 };
 
 &reg_ahci_5v {
-       pinctrl-0 = <&ahci_pwr_pin_pcduino3_nano>;
        gpio = <&pio 7 2 GPIO_ACTIVE_HIGH>; /* PH2 */
        status = "okay";
 };
 
 /* A single regulator (U24) powers both USB host ports. */
 &reg_usb1_vbus {
-       pinctrl-0 = <&usb1_vbus_pin_pcduino3_nano>;
        gpio = <&pio 3 2 GPIO_ACTIVE_HIGH>; /* PD2 */
        status = "okay";
 };
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
index c576f101fbdef366b893873f01c8cd5bd2bb32fb..a72ed4318d044fc3bc844010777118d6921adf7e 100644 (file)
@@ -63,8 +63,6 @@
 
        leds {
                compatible = "gpio-leds";
-               pinctrl-names = "default";
-               pinctrl-0 = <&led_pins_pcduino3>;
 
                tx {
                        label = "pcduino3:green:tx";
                };
        };
 
-       gpio_keys {
+       gpio-keys {
                compatible = "gpio-keys";
-               pinctrl-names = "default";
-               pinctrl-0 = <&key_pins_pcduino3>;
-               #address-cells = <1>;
-               #size-cells = <0>;
-               button@0 {
+
+               back {
                        label = "Key Back";
                        linux,code = <KEY_BACK>;
                        gpios = <&pio 7 17 GPIO_ACTIVE_LOW>;
                };
-               button@1 {
+
+               home {
                        label = "Key Home";
                        linux,code = <KEY_HOME>;
                        gpios = <&pio 7 18 GPIO_ACTIVE_LOW>;
                };
-               button@2 {
+
+               menu {
                        label = "Key Menu";
                        linux,code = <KEY_MENU>;
                        gpios = <&pio 7 19 GPIO_ACTIVE_LOW>;
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_mii_a>;
+       pinctrl-0 = <&gmac_mii_pins>;
        phy = <&phy1>;
        phy-mode = "mii";
        status = "okay";
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 
 &ir0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&ir0_rx_pins_a>;
+       pinctrl-0 = <&ir0_rx_pin>;
        status = "okay";
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>; /* PH1 */
 };
 
 &pio {
-       led_pins_pcduino3: led_pins@0 {
-               pins = "PH15", "PH16";
-               function = "gpio_out";
-       };
-
-       key_pins_pcduino3: key_pins@0 {
-               pins = "PH17", "PH18", "PH19";
-               function = "gpio_in";
-       };
-
-       usb0_id_detect_pin: usb0_id_detect_pin@0 {
+       usb0_id_detect_pin: usb0-id-detect-pin {
                pins = "PH4";
                function = "gpio_in";
                bias-pull-up;
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
index b7294e0348cc7a9b767088b8023d7053b854a8bb..ac0175f79547068f8c941e7cfe144ecf2f158717 100644 (file)
@@ -67,8 +67,6 @@
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>; /* PH1 */
@@ -82,7 +80,7 @@
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
index 8202c87ca6a3a2bc2058113cde7712638fdfb511..ffade253d129614f6821040daf6e56db839ec7f7 100644 (file)
@@ -63,8 +63,6 @@
                pwms = <&pwm 0 50000 PWM_POLARITY_INVERTED>;
                brightness-levels = <0 10 20 30 40 50 60 70 80 90 100>;
                default-brightness-level = <8>;
-               pinctrl-names = "default";
-               pinctrl-0 = <&bl_enable_pin>;
                enable-gpios = <&pio 7 7 GPIO_ACTIVE_HIGH>; /* PH7 */
        };
 
@@ -74,8 +72,6 @@
 };
 
 &codec {
-       pinctrl-names = "default";
-       pinctrl-0 = <&codec_pa_pin>;
        allwinner,pa-gpios = <&pio 7 15 GPIO_ACTIVE_HIGH>; /* PH15 */
        status = "okay";
 };
@@ -93,8 +89,6 @@
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 #include "axp209.dtsi"
 
 &i2c1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins_a>;
        status = "okay";
 };
 
 &i2c2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c2_pins_a>;
        status = "okay";
 
        gt911: touchscreen@5d {
                reg = <0x5d>;
                interrupt-parent = <&pio>;
                interrupts = <7 21 IRQ_TYPE_EDGE_FALLING>; /* EINT21 (PH21) */
-               pinctrl-names = "default";
-               pinctrl-0 = <&ts_reset_pin>;
                irq-gpios = <&pio 7 21 GPIO_ACTIVE_HIGH>; /* INT (PH21) */
                reset-gpios = <&pio 1 13 GPIO_ACTIVE_HIGH>; /* RST (PB13) */
                touchscreen-swapped-x-y;
        vref-supply = <&reg_vcc3v0>;
        status = "okay";
 
-       button@571 {
+       button-571 {
                label = "Volume Up";
                linux,code = <KEY_VOLUMEUP>;
                channel = <0>;
                voltage = <571428>;
        };
 
-       button@761 {
+       button-761 {
                label = "Volume Down";
                linux,code = <KEY_VOLUMEDOWN>;
                channel = <0>;
 };
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>; /* PH1 */
 };
 
 &pio {
-       bl_enable_pin: bl_enable_pin@0 {
-               pins = "PH7";
-               function = "gpio_out";
-       };
-
-       codec_pa_pin: codec_pa_pin@0 {
-               pins = "PH15";
-               function = "gpio_out";
-       };
-
-       ts_reset_pin: ts_reset_pin@0 {
-               pins = "PB13";
-               function = "gpio_out";
-       };
-
-       usb0_id_detect_pin: usb0_id_detect_pin@0 {
+       usb0_id_detect_pin: usb0-id-detect-pin {
                pins = "PH4";
                function = "gpio_in";
                bias-pull-up;
 
 &pwm {
        pinctrl-names = "default";
-       pinctrl-0 = <&pwm0_pins_a>;
+       pinctrl-0 = <&pwm0_pin>;
        status = "okay";
 };
 
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
diff --git a/arch/arm/dts/sun7i-a20-wits-pro-a20-dkt-u-boot.dtsi b/arch/arm/dts/sun7i-a20-wits-pro-a20-dkt-u-boot.dtsi
new file mode 100644 (file)
index 0000000..8a1c468
--- /dev/null
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019 Jagan Teki <jagan@amarulasolutions.com>
+ */
+
+#include "sunxi-u-boot.dtsi"
+
+&ahci {
+       status = "okay";
+};
index ff5c1086585ca4baa2daebad1c4bdbcbc679b694..c27e56091fb19cb471b54b735cc2ffa106bcfcdc 100644 (file)
@@ -62,8 +62,6 @@
 
        mmc3_pwrseq: mmc3_pwrseq {
                compatible = "mmc-pwrseq-simple";
-               pinctrl-names = "default";
-               pinctrl-0 = <&vmmc3_pin_ap6xxx_wl_regon>;
                reset-gpios = <&pio 7 9 GPIO_ACTIVE_LOW>; /* PH9 WIFI_EN */
        };
 };
@@ -82,7 +80,7 @@
 
 &gmac {
        pinctrl-names = "default";
-       pinctrl-0 = <&gmac_pins_rgmii_a>;
+       pinctrl-0 = <&gmac_rgmii_pins>;
        phy = <&phy1>;
        phy-mode = "rgmii";
        status = "okay";
@@ -93,8 +91,6 @@
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
 };
 
 &i2c1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins_a>;
        status = "okay";
 };
 
 &i2c2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c2_pins_a>;
        status = "okay";
 };
 
 #include "axp209.dtsi"
 
 &mmc0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc0_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        bus-width = <4>;
        cd-gpios = <&pio 7 1 GPIO_ACTIVE_LOW>; /* PH1 */
 };
 
 &mmc3 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&mmc3_pins_a>;
        vmmc-supply = <&reg_vcc3v3>;
        mmc-pwrseq = <&mmc3_pwrseq>;
        bus-width = <4>;
 };
 
 &pio {
-       vmmc3_pin_ap6xxx_wl_regon: vmmc3_pin@0 {
-               pins = "PH9";
-               function = "gpio_out";
-       };
-
-       usb0_id_detect_pin: usb0_id_detect_pin@0 {
+       usb0_id_detect_pin: usb0-id-detect-pin {
                pins = "PH4";
                function = "gpio_in";
                bias-pull-up;
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
index f1fb97d3fb51331af944639bfae2241611a8fec6..11142ae6e7171f780226e3fb30ceb02af0d39180 100644 (file)
@@ -23,6 +23,6 @@
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
index e529e4ff21749b31d83a0690f2e7ada3afb7f5d1..641a8fa6d4289a6d90642def481b82d92a7dee48 100644 (file)
@@ -42,8 +42,6 @@
  *     OTHER DEALINGS IN THE SOFTWARE.
  */
 
-#include "skeleton.dtsi"
-
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 #include <dt-bindings/thermal/thermal.h>
 #include <dt-bindings/dma/sun4i-a10.h>
@@ -52,6 +50,8 @@
 
 / {
        interrupt-parent = <&gic>;
+       #address-cells = <1>;
+       #size-cells = <1>;
 
        aliases {
                ethernet0 = &gmac;
@@ -62,7 +62,7 @@
                #size-cells = <1>;
                ranges;
 
-               framebuffer@0 {
+               framebuffer-lcd0-hdmi {
                        compatible = "allwinner,simple-framebuffer",
                                     "simple-framebuffer";
                        allwinner,pipeline = "de_be0-lcd0-hdmi";
@@ -73,7 +73,7 @@
                        status = "disabled";
                };
 
-               framebuffer@1 {
+               framebuffer-lcd0 {
                        compatible = "allwinner,simple-framebuffer",
                                     "simple-framebuffer";
                        allwinner,pipeline = "de_be0-lcd0";
@@ -83,7 +83,7 @@
                        status = "disabled";
                };
 
-               framebuffer@2 {
+               framebuffer-lcd0-tve0 {
                        compatible = "allwinner,simple-framebuffer",
                                     "simple-framebuffer";
                        allwinner,pipeline = "de_be0-lcd0-tve0";
                        #cooling-cells = <2>;
                };
 
-               cpu@1 {
+               cpu1: cpu@1 {
                        compatible = "arm,cortex-a7";
                        device_type = "cpu";
                        reg = <1>;
+                       clocks = <&ccu CLK_CPU>;
+                       clock-latency = <244144>; /* 8 32k periods */
+                       operating-points = <
+                               /* kHz    uV */
+                               960000  1400000
+                               912000  1400000
+                               864000  1300000
+                               720000  1200000
+                               528000  1100000
+                               312000  1000000
+                               144000  1000000
+                               >;
+                       #cooling-cells = <2>;
                };
        };
 
                        cooling-maps {
                                map0 {
                                        trip = <&cpu_alert0>;
-                                       cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                                       cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
                                };
                        };
 
                };
        };
 
-       memory {
-               reg = <0x40000000 0x80000000>;
+       reserved-memory {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               /* Address must be kept in the lower 256 MiBs of DRAM for VE. */
+               default-pool {
+                       compatible = "shared-dma-pool";
+                       size = <0x6000000>;
+                       alloc-ranges = <0x4a000000 0x6000000>;
+                       reusable;
+                       linux,cma-default;
+               };
        };
 
        timer {
        };
 
        pmu {
-               compatible = "arm,cortex-a7-pmu", "arm,cortex-a15-pmu";
+               compatible = "arm,cortex-a7-pmu";
                interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
                             <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
        };
                #size-cells = <1>;
                ranges;
 
-               osc24M: clk@1c20050 {
+               osc24M: clk-24M {
                        #clock-cells = <0>;
                        compatible = "fixed-clock";
                        clock-frequency = <24000000>;
                        clock-output-names = "osc24M";
                };
 
-               osc32k: clk@0 {
+               osc32k: clk-32k {
                        #clock-cells = <0>;
                        compatible = "fixed-clock";
                        clock-frequency = <32768>;
                 * The actual TX clock rate is not controlled by the
                 * gmac_tx clock.
                 */
-               mii_phy_tx_clk: clk@1 {
+               mii_phy_tx_clk: clk-mii-phy-tx {
                        #clock-cells = <0>;
                        compatible = "fixed-clock";
                        clock-frequency = <25000000>;
                        clock-output-names = "mii_phy_tx";
                };
 
-               gmac_int_tx_clk: clk@2 {
+               gmac_int_tx_clk: clk-gmac-int-tx {
                        #clock-cells = <0>;
                        compatible = "fixed-clock";
                        clock-frequency = <125000000>;
                status = "disabled";
        };
 
-       soc@1c00000 {
+       soc {
                compatible = "simple-bus";
                #address-cells = <1>;
                #size-cells = <1>;
                ranges;
 
-               sram-controller@1c00000 {
-                       compatible = "allwinner,sun4i-a10-sram-controller";
+               system-control@1c00000 {
+                       compatible = "allwinner,sun7i-a20-system-control",
+                                    "allwinner,sun4i-a10-system-control";
                        reg = <0x01c00000 0x30>;
                        #address-cells = <1>;
                        #size-cells = <1>;
                                ranges = <0 0x00000000 0xc000>;
 
                                emac_sram: sram-section@8000 {
-                                       compatible = "allwinner,sun4i-a10-sram-a3-a4";
+                                       compatible = "allwinner,sun7i-a20-sram-a3-a4",
+                                                    "allwinner,sun4i-a10-sram-a3-a4";
                                        reg = <0x8000 0x4000>;
                                        status = "disabled";
                                };
                                ranges = <0 0x00010000 0x1000>;
 
                                otg_sram: sram-section@0 {
-                                       compatible = "allwinner,sun4i-a10-sram-d";
+                                       compatible = "allwinner,sun7i-a20-sram-d",
+                                                    "allwinner,sun4i-a10-sram-d";
                                        reg = <0x0000 0x1000>;
                                        status = "disabled";
                                };
                        };
+
+                       sram_c: sram@1d00000 {
+                               compatible = "mmio-sram";
+                               reg = <0x01d00000 0xd0000>;
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               ranges = <0 0x01d00000 0xd0000>;
+
+                               ve_sram: sram-section@0 {
+                                       compatible = "allwinner,sun7i-a20-sram-c1",
+                                                    "allwinner,sun4i-a10-sram-c1";
+                                       reg = <0x000000 0x80000>;
+                               };
+                       };
                };
 
                nmi_intc: interrupt-controller@1c00030 {
                        };
                };
 
+               video-codec@1c0e000 {
+                       compatible = "allwinner,sun7i-a20-video-engine";
+                       reg = <0x01c0e000 0x1000>;
+                       clocks = <&ccu CLK_AHB_VE>, <&ccu CLK_VE>,
+                                <&ccu CLK_DRAM_VE>;
+                       clock-names = "ahb", "mod", "ram";
+                       resets = <&ccu RST_VE>;
+                       interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>;
+                       allwinner,sram = <&ve_sram 1>;
+               };
+
                mmc0: mmc@1c0f000 {
                        compatible = "allwinner,sun7i-a20-mmc";
                        reg = <0x01c0f000 0x1000>;
                                      "output",
                                      "sample";
                        interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&mmc0_pins>;
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
                                      "output",
                                      "sample";
                        interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&mmc2_pins>;
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
                                      "output",
                                      "sample";
                        interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&mmc3_pins>;
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
                                };
 
                                hdmi_out: port@1 {
-                                       #address-cells = <1>;
-                                       #size-cells = <0>;
                                        reg = <1>;
                                };
                        };
                        #interrupt-cells = <3>;
                        #gpio-cells = <3>;
 
-                       can0_pins_a: can0@0 {
+                       can_ph_pins: can-ph-pins {
                                pins = "PH20", "PH21";
                                function = "can";
                        };
 
-                       clk_out_a_pins_a: clk_out_a@0 {
+                       clk_out_a_pin: clk-out-a-pin {
                                pins = "PI12";
                                function = "clk_out_a";
                        };
 
-                       clk_out_b_pins_a: clk_out_b@0 {
+                       clk_out_b_pin: clk-out-b-pin {
                                pins = "PI13";
                                function = "clk_out_b";
                        };
 
-                       emac_pins_a: emac0@0 {
+                       emac_pa_pins: emac-pa-pins {
                                pins = "PA0", "PA1", "PA2",
                                       "PA3", "PA4", "PA5", "PA6",
                                       "PA7", "PA8", "PA9", "PA10",
                                function = "emac";
                        };
 
-                       gmac_pins_mii_a: gmac_mii@0 {
+                       gmac_mii_pins: gmac-mii-pins {
                                pins = "PA0", "PA1", "PA2",
                                       "PA3", "PA4", "PA5", "PA6",
                                       "PA7", "PA8", "PA9", "PA10",
                                function = "gmac";
                        };
 
-                       gmac_pins_rgmii_a: gmac_rgmii@0 {
+                       gmac_rgmii_pins: gmac-rgmii-pins {
                                pins = "PA0", "PA1", "PA2",
                                       "PA3", "PA4", "PA5", "PA6",
                                        "PA7", "PA8", "PA10",
                                drive-strength = <40>;
                        };
 
-                       i2c0_pins_a: i2c0@0 {
+                       i2c0_pins: i2c0-pins {
                                pins = "PB0", "PB1";
                                function = "i2c0";
                        };
 
-                       i2c1_pins_a: i2c1@0 {
+                       i2c1_pins: i2c1-pins {
                                pins = "PB18", "PB19";
                                function = "i2c1";
                        };
 
-                       i2c2_pins_a: i2c2@0 {
+                       i2c2_pins: i2c2-pins {
                                pins = "PB20", "PB21";
                                function = "i2c2";
                        };
 
-                       i2c3_pins_a: i2c3@0 {
+                       i2c3_pins: i2c3-pins {
                                pins = "PI0", "PI1";
                                function = "i2c3";
                        };
 
-                       ir0_rx_pins_a: ir0@0 {
+                       ir0_rx_pin: ir0-rx-pin {
                                pins = "PB4";
                                function = "ir0";
                        };
 
-                       ir0_tx_pins_a: ir0@1 {
+                       ir0_tx_pin: ir0-tx-pin {
                                pins = "PB3";
                                function = "ir0";
                        };
 
-                       ir1_rx_pins_a: ir1@0 {
+                       ir1_rx_pin: ir1-rx-pin {
                                pins = "PB23";
                                function = "ir1";
                        };
 
-                       ir1_tx_pins_a: ir1@1 {
+                       ir1_tx_pin: ir1-tx-pin {
                                pins = "PB22";
                                function = "ir1";
                        };
 
-                       mmc0_pins_a: mmc0@0 {
+                       mmc0_pins: mmc0-pins {
                                pins = "PF0", "PF1", "PF2",
                                       "PF3", "PF4", "PF5";
                                function = "mmc0";
                                bias-pull-up;
                        };
 
-                       mmc2_pins_a: mmc2@0 {
+                       mmc2_pins: mmc2-pins {
                                pins = "PC6", "PC7", "PC8",
                                       "PC9", "PC10", "PC11";
                                function = "mmc2";
                                bias-pull-up;
                        };
 
-                       mmc3_pins_a: mmc3@0 {
+                       mmc3_pins: mmc3-pins {
                                pins = "PI4", "PI5", "PI6",
                                       "PI7", "PI8", "PI9";
                                function = "mmc3";
                                bias-pull-up;
                        };
 
-                       ps20_pins_a: ps20@0 {
+                       ps2_0_pins: ps2-0-pins {
                                pins = "PI20", "PI21";
                                function = "ps2";
                        };
 
-                       ps21_pins_a: ps21@0 {
+                       ps2_1_ph_pins: ps2-1-ph-pins {
                                pins = "PH12", "PH13";
                                function = "ps2";
                        };
 
-                       pwm0_pins_a: pwm0@0 {
+                       pwm0_pin: pwm0-pin {
                                pins = "PB2";
                                function = "pwm";
                        };
 
-                       pwm1_pins_a: pwm1@0 {
+                       pwm1_pin: pwm1-pin {
                                pins = "PI3";
                                function = "pwm";
                        };
 
-                       spdif_tx_pins_a: spdif@0 {
+                       spdif_tx_pin: spdif-tx-pin {
                                pins = "PB13";
                                function = "spdif";
                                bias-pull-up;
                        };
 
-                       spi0_pins_a: spi0@0 {
+                       spi0_pi_pins: spi0-pi-pins {
                                pins = "PI11", "PI12", "PI13";
                                function = "spi0";
                        };
 
-                       spi0_cs0_pins_a: spi0_cs0@0 {
+                       spi0_cs0_pi_pin: spi0-cs0-pi-pin {
                                pins = "PI10";
                                function = "spi0";
                        };
 
-                       spi0_cs1_pins_a: spi0_cs1@0 {
+                       spi0_cs1_pi_pin: spi0-cs1-pi-pin {
                                pins = "PI14";
                                function = "spi0";
                        };
 
-                       spi1_pins_a: spi1@0 {
+                       spi1_pi_pins: spi1-pi-pins {
                                pins = "PI17", "PI18", "PI19";
                                function = "spi1";
                        };
 
-                       spi1_cs0_pins_a: spi1_cs0@0 {
+                       spi1_cs0_pi_pin: spi1-cs0-pi-pin {
                                pins = "PI16";
                                function = "spi1";
                        };
 
-                       spi2_pins_a: spi2@0 {
-                               pins = "PC20", "PC21", "PC22";
+                       spi2_pb_pins: spi2-pb-pins {
+                               pins = "PB15", "PB16", "PB17";
                                function = "spi2";
                        };
 
-                       spi2_pins_b: spi2@1 {
-                               pins = "PB15", "PB16", "PB17";
+                       spi2_cs0_pb_pin: spi2-cs0-pb-pin {
+                               pins = "PB14";
                                function = "spi2";
                        };
 
-                       spi2_cs0_pins_a: spi2_cs0@0 {
-                               pins = "PC19";
+                       spi2_pc_pins: spi2-pc-pins {
+                               pins = "PC20", "PC21", "PC22";
                                function = "spi2";
                        };
 
-                       spi2_cs0_pins_b: spi2_cs0@1 {
-                               pins = "PB14";
+                       spi2_cs0_pc_pin: spi2-cs0-pc-pin {
+                               pins = "PC19";
                                function = "spi2";
                        };
 
-                       uart0_pins_a: uart0@0 {
+                       uart0_pb_pins: uart0-pb-pins {
                                pins = "PB22", "PB23";
                                function = "uart0";
                        };
 
-                       uart2_pins_a: uart2@0 {
-                               pins = "PI16", "PI17", "PI18", "PI19";
+                       uart2_pi_pins: uart2-pi-pins {
+                               pins = "PI18", "PI19";
                                function = "uart2";
                        };
 
-                       uart3_pins_a: uart3@0 {
-                               pins = "PG6", "PG7", "PG8", "PG9";
+                       uart2_cts_rts_pi_pins: uart2-cts-rts-pi-pins {
+                               pins = "PI16", "PI17";
+                               function = "uart2";
+                       };
+
+                       uart3_pg_pins: uart3-pg-pins {
+                               pins = "PG6", "PG7";
+                               function = "uart3";
+                       };
+
+                       uart3_cts_rts_pg_pins: uart3-cts-rts-pg-pins {
+                               pins = "PG8", "PG9";
                                function = "uart3";
                        };
 
-                       uart3_pins_b: uart3@1 {
+                       uart3_ph_pins: uart3-ph-pins {
                                pins = "PH0", "PH1";
                                function = "uart3";
                        };
 
-                       uart4_pins_a: uart4@0 {
+                       uart4_pg_pins: uart4-pg-pins {
                                pins = "PG10", "PG11";
                                function = "uart4";
                        };
 
-                       uart4_pins_b: uart4@1 {
+                       uart4_ph_pins: uart4-ph-pins {
                                pins = "PH4", "PH5";
                                function = "uart4";
                        };
 
-                       uart5_pins_a: uart5@0 {
+                       uart5_pi_pins: uart5-pi-pins {
                                pins = "PI10", "PI11";
                                function = "uart5";
                        };
 
-                       uart6_pins_a: uart6@0 {
+                       uart6_pi_pins: uart6-pi-pins {
                                pins = "PI12", "PI13";
                                function = "uart6";
                        };
 
-                       uart7_pins_a: uart7@0 {
+                       uart7_pi_pins: uart7-pi-pins {
                                pins = "PI20", "PI21";
                                function = "uart7";
                        };
                        reg = <0x01c2ac00 0x400>;
                        interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&ccu CLK_APB1_I2C0>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c0_pins>;
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        reg = <0x01c2b000 0x400>;
                        interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&ccu CLK_APB1_I2C1>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c1_pins>;
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        reg = <0x01c2b400 0x400>;
                        interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&ccu CLK_APB1_I2C2>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c2_pins>;
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        reg = <0x01c2b800 0x400>;
                        interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&ccu CLK_APB1_I2C3>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c3_pins>;
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
index 25fb048c7df2389a5d9ded7f44886efafb36b5d0..c488aaacbd68b087d2dec9e936e13d40d6a8458a 100644 (file)
                stdout-path = "serial0:115200n8";
        };
 
+       connector {
+               compatible = "hdmi-connector";
+               type = "a";
+
+               port {
+                       hdmi_con_in: endpoint {
+                               remote-endpoint = <&hdmi_out_con>;
+                       };
+               };
+       };
+
        leds {
                compatible = "gpio-leds";
 
        wifi_pwrseq: wifi_pwrseq {
                compatible = "mmc-pwrseq-simple";
                reset-gpios = <&pio 6 10 GPIO_ACTIVE_LOW>; /* PG10 WIFI_EN */
+               clocks = <&ccu CLK_OUTA>;
+               clock-names = "ext_clock";
        };
 };
 
+&ahci {
+       ahci-supply = <&reg_dldo4>;
+       phy-supply = <&reg_eldo3>;
+       status = "okay";
+};
+
+&de {
+       status = "okay";
+};
+
 &ehci1 {
        status = "okay";
 };
        };
 };
 
+&hdmi {
+       status = "okay";
+};
+
+&hdmi_out {
+       hdmi_out_con: endpoint {
+               remote-endpoint = <&hdmi_con_in>;
+       };
+};
+
 &i2c0 {
        status = "okay";
 
 &mmc0 {
        vmmc-supply = <&reg_dcdc1>;
        bus-width = <4>;
-       cd-gpios = <&pio 7 13 GPIO_ACTIVE_HIGH>; /* PH13 */
-       cd-inverted;
+       cd-gpios = <&pio 7 13 GPIO_ACTIVE_LOW>; /* PH13 */
        status = "okay";
 };
 
        status = "okay";
 };
 
+&pio {
+       pinctrl-names = "default";
+       pinctrl-0 = <&clk_out_a_pin>;
+};
+
 &reg_aldo2 {
        regulator-always-on;
        regulator-min-microvolt = <2500000>;
        regulator-name = "vcc-wifi-io";
 };
 
+/*
+ * Our WiFi chip needs both DLDO2 and DLDO3 to be powered at the same
+ * time, with the two being in sync, to be able to meet maximum power
+ * consumption during transmits. Since this is not really supported
+ * right now, just use the two as always on, and we will fix it later.
+ */
+
 &reg_dldo2 {
+       regulator-always-on;
        regulator-min-microvolt = <3300000>;
        regulator-max-microvolt = <3300000>;
        regulator-name = "vcc-wifi";
 };
 
+&reg_dldo3 {
+       regulator-always-on;
+       regulator-min-microvolt = <3300000>;
+       regulator-max-microvolt = <3300000>;
+       regulator-name = "vcc-wifi-2";
+};
+
+&reg_dldo4 {
+       regulator-min-microvolt = <2500000>;
+       regulator-max-microvolt = <2500000>;
+       regulator-name = "vdd2v5-sata";
+};
+
+&reg_eldo3 {
+       regulator-min-microvolt = <1200000>;
+       regulator-max-microvolt = <1200000>;
+       regulator-name = "vdd1v2-sata";
+};
+
+&tcon_tv0 {
+       status = "okay";
+};
+
 &uart0 {
        pinctrl-names = "default";
        pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
+&uart3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart3_pg_pins>, <&uart3_rts_cts_pg_pins>;
+       uart-has-rtscts;
+       status = "okay";
+
+       bluetooth {
+               compatible = "brcm,bcm43438-bt";
+               clocks = <&ccu CLK_OUTA>;
+               clock-names = "lpo";
+               vbat-supply = <&reg_dldo2>;
+               vddio-supply = <&reg_dldo1>;
+               device-wakeup-gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>; /* PG11 */
+               /* TODO host wake line connected to PMIC GPIO pins */
+               shutdown-gpios = <&pio 7 12 GPIO_ACTIVE_HIGH>; /* PH12 */
+               max-speed = <1500000>;
+       };
+};
+
 &usbphy {
        usb1_vbus-supply = <&reg_vcc5v0>;
        usb2_vbus-supply = <&reg_vcc5v0>;
index bd97ca3dc2fa0ca264144af345870cea784deac6..06b685869f52d44b685b1db5878a65c3455658b7 100644 (file)
  */
 
 #include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/clock/sun8i-de2.h>
 #include <dt-bindings/clock/sun8i-r40-ccu.h>
 #include <dt-bindings/reset/sun8i-r40-ccu.h>
+#include <dt-bindings/reset/sun8i-de2.h>
 
 / {
        #address-cells = <1>;
@@ -59,6 +61,7 @@
                        #clock-cells = <0>;
                        compatible = "fixed-clock";
                        clock-frequency = <24000000>;
+                       clock-accuracy = <50000>;
                        clock-output-names = "osc24M";
                };
 
@@ -66,7 +69,8 @@
                        #clock-cells = <0>;
                        compatible = "fixed-clock";
                        clock-frequency = <32768>;
-                       clock-output-names = "osc32k";
+                       clock-accuracy = <20000>;
+                       clock-output-names = "ext-osc32k";
                };
        };
 
                };
        };
 
+       de: display-engine {
+               compatible = "allwinner,sun8i-r40-display-engine";
+               allwinner,pipelines = <&mixer0>, <&mixer1>;
+               status = "disabled";
+       };
+
        soc {
                compatible = "simple-bus";
                #address-cells = <1>;
                #size-cells = <1>;
                ranges;
 
+               display_clocks: clock@1000000 {
+                       compatible = "allwinner,sun8i-r40-de2-clk",
+                                    "allwinner,sun8i-h3-de2-clk";
+                       reg = <0x01000000 0x100000>;
+                       clocks = <&ccu CLK_DE>,
+                                <&ccu CLK_BUS_DE>;
+                       clock-names = "mod",
+                                     "bus";
+                       resets = <&ccu RST_BUS_DE>;
+                       #clock-cells = <1>;
+                       #reset-cells = <1>;
+               };
+
+               mixer0: mixer@1100000 {
+                       compatible = "allwinner,sun8i-r40-de2-mixer-0";
+                       reg = <0x01100000 0x100000>;
+                       clocks = <&display_clocks CLK_BUS_MIXER0>,
+                                <&display_clocks CLK_MIXER0>;
+                       clock-names = "bus",
+                                     "mod";
+                       resets = <&display_clocks RST_MIXER0>;
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               mixer0_out: port@1 {
+                                       reg = <1>;
+                                       mixer0_out_tcon_top: endpoint {
+                                               remote-endpoint = <&tcon_top_mixer0_in_mixer0>;
+                                       };
+                               };
+                       };
+               };
+
+               mixer1: mixer@1200000 {
+                       compatible = "allwinner,sun8i-r40-de2-mixer-1";
+                       reg = <0x01200000 0x100000>;
+                       clocks = <&display_clocks CLK_BUS_MIXER1>,
+                                <&display_clocks CLK_MIXER1>;
+                       clock-names = "bus",
+                                     "mod";
+                       resets = <&display_clocks RST_WB>;
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               mixer1_out: port@1 {
+                                       reg = <1>;
+                                       mixer1_out_tcon_top: endpoint {
+                                               remote-endpoint = <&tcon_top_mixer1_in_mixer1>;
+                                       };
+                               };
+                       };
+               };
+
                nmi_intc: interrupt-controller@1c00030 {
                        compatible = "allwinner,sun7i-a20-sc-nmi";
                        interrupt-controller;
                ccu: clock@1c20000 {
                        compatible = "allwinner,sun8i-r40-ccu";
                        reg = <0x01c20000 0x400>;
-                       clocks = <&osc24M>, <&osc32k>;
+                       clocks = <&osc24M>, <&rtc 0>;
                        clock-names = "hosc", "losc";
                        #clock-cells = <1>;
                        #reset-cells = <1>;
                };
 
+               rtc: rtc@1c20400 {
+                       compatible = "allwinner,sun8i-r40-rtc",
+                                    "allwinner,sun8i-h3-rtc";
+                       reg = <0x01c20400 0x400>;
+                       interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
+                       clock-output-names = "osc32k", "osc32k-out";
+                       clocks = <&osc32k>;
+                       #clock-cells = <1>;
+               };
+
                pio: pinctrl@1c20800 {
                        compatible = "allwinner,sun8i-r40-pinctrl";
                        reg = <0x01c20800 0x400>;
                        interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&ccu CLK_BUS_PIO>, <&osc24M>, <&osc32k>;
+                       clocks = <&ccu CLK_BUS_PIO>, <&osc24M>, <&rtc 0>;
                        clock-names = "apb", "hosc", "losc";
                        gpio-controller;
                        interrupt-controller;
                        #interrupt-cells = <3>;
                        #gpio-cells = <3>;
 
+                       clk_out_a_pin: clk-out-a-pin {
+                               pins = "PI12";
+                               function = "clk_out_a";
+                       };
+
                        gmac_rgmii_pins: gmac-rgmii-pins {
                                pins = "PA0", "PA1", "PA2", "PA3",
                                       "PA4", "PA5", "PA6", "PA7",
                                pins = "PB22", "PB23";
                                function = "uart0";
                        };
+
+                       uart3_pg_pins: uart3-pg-pins {
+                               pins = "PG6", "PG7";
+                               function = "uart3";
+                       };
+
+                       uart3_rts_cts_pg_pins: uart3-rts-cts-pg-pins {
+                               pins = "PG8", "PG9";
+                               function = "uart3";
+                       };
                };
 
                wdt: watchdog@1c20c90 {
                        #size-cells = <0>;
                };
 
+               ahci: sata@1c18000 {
+                       compatible = "allwinner,sun8i-r40-ahci";
+                       reg = <0x01c18000 0x1000>;
+                       interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_SATA>, <&ccu CLK_SATA>;
+                       resets = <&ccu RST_BUS_SATA>;
+                       resets-name = "ahci";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+
+               };
+
                gmac: ethernet@1c50000 {
                        compatible = "allwinner,sun8i-r40-gmac";
                        syscon = <&ccu>;
                        reset-names = "stmmaceth";
                        clocks = <&ccu CLK_BUS_GMAC>;
                        clock-names = "stmmaceth";
-                       #address-cells = <1>;
-                       #size-cells = <0>;
                        status = "disabled";
 
                        gmac_mdio: mdio {
                        };
                };
 
+               tcon_top: tcon-top@1c70000 {
+                       compatible = "allwinner,sun8i-r40-tcon-top";
+                       reg = <0x01c70000 0x1000>;
+                       clocks = <&ccu CLK_BUS_TCON_TOP>,
+                                <&ccu CLK_TCON_TV0>,
+                                <&ccu CLK_TVE0>,
+                                <&ccu CLK_TCON_TV1>,
+                                <&ccu CLK_TVE1>,
+                                <&ccu CLK_DSI_DPHY>;
+                       clock-names = "bus",
+                                     "tcon-tv0",
+                                     "tve0",
+                                     "tcon-tv1",
+                                     "tve1",
+                                     "dsi";
+                       clock-output-names = "tcon-top-tv0",
+                                            "tcon-top-tv1",
+                                            "tcon-top-dsi";
+                       resets = <&ccu RST_BUS_TCON_TOP>;
+                       #clock-cells = <1>;
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               tcon_top_mixer0_in: port@0 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <0>;
+
+                                       tcon_top_mixer0_in_mixer0: endpoint@0 {
+                                               reg = <0>;
+                                               remote-endpoint = <&mixer0_out_tcon_top>;
+                                       };
+                               };
+
+                               tcon_top_mixer0_out: port@1 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <1>;
+
+                                       tcon_top_mixer0_out_tcon_lcd0: endpoint@0 {
+                                               reg = <0>;
+                                       };
+
+                                       tcon_top_mixer0_out_tcon_lcd1: endpoint@1 {
+                                               reg = <1>;
+                                       };
+
+                                       tcon_top_mixer0_out_tcon_tv0: endpoint@2 {
+                                               reg = <2>;
+                                               remote-endpoint = <&tcon_tv0_in_tcon_top_mixer0>;
+                                       };
+
+                                       tcon_top_mixer0_out_tcon_tv1: endpoint@3 {
+                                               reg = <3>;
+                                               remote-endpoint = <&tcon_tv1_in_tcon_top_mixer0>;
+                                       };
+                               };
+
+                               tcon_top_mixer1_in: port@2 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <2>;
+
+                                       tcon_top_mixer1_in_mixer1: endpoint@1 {
+                                               reg = <1>;
+                                               remote-endpoint = <&mixer1_out_tcon_top>;
+                                       };
+                               };
+
+                               tcon_top_mixer1_out: port@3 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <3>;
+
+                                       tcon_top_mixer1_out_tcon_lcd0: endpoint@0 {
+                                               reg = <0>;
+                                       };
+
+                                       tcon_top_mixer1_out_tcon_lcd1: endpoint@1 {
+                                               reg = <1>;
+                                       };
+
+                                       tcon_top_mixer1_out_tcon_tv0: endpoint@2 {
+                                               reg = <2>;
+                                               remote-endpoint = <&tcon_tv0_in_tcon_top_mixer1>;
+                                       };
+
+                                       tcon_top_mixer1_out_tcon_tv1: endpoint@3 {
+                                               reg = <3>;
+                                               remote-endpoint = <&tcon_tv1_in_tcon_top_mixer1>;
+                                       };
+                               };
+
+                               tcon_top_hdmi_in: port@4 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <4>;
+
+                                       tcon_top_hdmi_in_tcon_tv0: endpoint@0 {
+                                               reg = <0>;
+                                               remote-endpoint = <&tcon_tv0_out_tcon_top>;
+                                       };
+
+                                       tcon_top_hdmi_in_tcon_tv1: endpoint@1 {
+                                               reg = <1>;
+                                               remote-endpoint = <&tcon_tv1_out_tcon_top>;
+                                       };
+                               };
+
+                               tcon_top_hdmi_out: port@5 {
+                                       reg = <5>;
+
+                                       tcon_top_hdmi_out_hdmi: endpoint {
+                                               remote-endpoint = <&hdmi_in_tcon_top>;
+                                       };
+                               };
+                       };
+               };
+
+               tcon_tv0: lcd-controller@1c73000 {
+                       compatible = "allwinner,sun8i-r40-tcon-tv";
+                       reg = <0x01c73000 0x1000>;
+                       interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_TCON_TV0>, <&tcon_top 0>;
+                       clock-names = "ahb", "tcon-ch1";
+                       resets = <&ccu RST_BUS_TCON_TV0>;
+                       reset-names = "lcd";
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               tcon_tv0_in: port@0 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <0>;
+
+                                       tcon_tv0_in_tcon_top_mixer0: endpoint@0 {
+                                               reg = <0>;
+                                               remote-endpoint = <&tcon_top_mixer0_out_tcon_tv0>;
+                                       };
+
+                                       tcon_tv0_in_tcon_top_mixer1: endpoint@1 {
+                                               reg = <1>;
+                                               remote-endpoint = <&tcon_top_mixer1_out_tcon_tv0>;
+                                       };
+                               };
+
+                               tcon_tv0_out: port@1 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <1>;
+
+                                       tcon_tv0_out_tcon_top: endpoint@1 {
+                                               reg = <1>;
+                                               remote-endpoint = <&tcon_top_hdmi_in_tcon_tv0>;
+                                       };
+                               };
+                       };
+               };
+
+               tcon_tv1: lcd-controller@1c74000 {
+                       compatible = "allwinner,sun8i-r40-tcon-tv";
+                       reg = <0x01c74000 0x1000>;
+                       interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_TCON_TV1>, <&tcon_top 1>;
+                       clock-names = "ahb", "tcon-ch1";
+                       resets = <&ccu RST_BUS_TCON_TV1>;
+                       reset-names = "lcd";
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               tcon_tv1_in: port@0 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <0>;
+
+                                       tcon_tv1_in_tcon_top_mixer0: endpoint@0 {
+                                               reg = <0>;
+                                               remote-endpoint = <&tcon_top_mixer0_out_tcon_tv1>;
+                                       };
+
+                                       tcon_tv1_in_tcon_top_mixer1: endpoint@1 {
+                                               reg = <1>;
+                                               remote-endpoint = <&tcon_top_mixer1_out_tcon_tv1>;
+                                       };
+                               };
+
+                               tcon_tv1_out: port@1 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <1>;
+
+                                       tcon_tv1_out_tcon_top: endpoint@1 {
+                                               reg = <1>;
+                                               remote-endpoint = <&tcon_top_hdmi_in_tcon_tv1>;
+                                       };
+                               };
+                       };
+               };
+
                gic: interrupt-controller@1c81000 {
                        compatible = "arm,gic-400";
                        reg = <0x01c81000 0x1000>,
                        #interrupt-cells = <3>;
                        interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
                };
+
+               hdmi: hdmi@1ee0000 {
+                       compatible = "allwinner,sun8i-r40-dw-hdmi",
+                                    "allwinner,sun8i-a83t-dw-hdmi";
+                       reg = <0x01ee0000 0x10000>;
+                       reg-io-width = <1>;
+                       interrupts = <GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_HDMI0>, <&ccu CLK_HDMI_SLOW>,
+                                <&ccu CLK_HDMI>;
+                       clock-names = "iahb", "isfr", "tmds";
+                       resets = <&ccu RST_BUS_HDMI1>;
+                       reset-names = "ctrl";
+                       phys = <&hdmi_phy>;
+                       phy-names = "hdmi-phy";
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               hdmi_in: port@0 {
+                                       reg = <0>;
+
+                                       hdmi_in_tcon_top: endpoint {
+                                               remote-endpoint = <&tcon_top_hdmi_out_hdmi>;
+                                       };
+                               };
+
+                               hdmi_out: port@1 {
+                                       reg = <1>;
+                               };
+                       };
+               };
+
+               hdmi_phy: hdmi-phy@1ef0000 {
+                       compatible = "allwinner,sun8i-r40-hdmi-phy";
+                       reg = <0x01ef0000 0x10000>;
+                       clocks = <&ccu CLK_BUS_HDMI1>, <&ccu CLK_HDMI_SLOW>,
+                                <&ccu 7>, <&ccu 16>;
+                       clock-names = "bus", "mod", "pll-0", "pll-1";
+                       resets = <&ccu RST_BUS_HDMI0>;
+                       reset-names = "phy";
+                       #phy-cells = <0>;
+               };
        };
 
        timer {
index 35859d8f3267fd2a1d6fa7e716e97094895f3530..54ad4db468af7fcfe95a4f2ad02d44cb8927c067 100644 (file)
        };
 };
 
+&ahci {
+       phy-supply = <&reg_eldo3>;      /* VDD12-SATA */
+       ahci-supply = <&reg_dldo4>;     /* VDD25-SATA */
+       status = "okay";
+};
+
 &ehci1 {
        /* Terminus Tech FE 1.1s 4-port USB 2.0 hub here */
        status = "okay";
 &i2c0 {
        status = "okay";
 
-       axp22x: pmic@68 {
+       axp22x: pmic@34 {
                compatible = "x-powers,axp221";
                reg = <0x34>;
                interrupt-parent = <&nmi_intc>;
        regulator-name = "vcc-wifi";
 };
 
+&reg_dldo4 {
+       regulator-min-microvolt = <2500000>;
+       regulator-max-microvolt = <2500000>;
+       regulator-name = "vdd2v5-sata";
+};
+
+&reg_eldo3 {
+       regulator-min-microvolt = <1200000>;
+       regulator-max-microvolt = <1200000>;
+       regulator-name = "vdd1v2-sata";
+};
+
 &mmc0 {
        vmmc-supply = <&reg_dcdc1>;
        bus-width = <4>;
index 2565d5137a17e300c4f9274277303d5626e761f2..0d002f83a259c73b53d2dba9500b650950875c86 100644 (file)
@@ -65,8 +65,6 @@
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins_a>;
        status = "okay";
 
        axp209: pmic@34 {
@@ -75,8 +73,6 @@
 };
 
 &i2c1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins_a>;
        status = "okay";
 };
 
 
 &uart0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&uart0_pins_a>;
+       pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
index 0ead552d7eae9678cda710c897b84b3f45964c13..e70e1bac2be408d2df1434adf609e65a29807816 100644 (file)
@@ -6,6 +6,14 @@
  * Copyright (C) 2016 Cogent Embedded, Inc.
  */
 
+/*
+ * SSI-AK4613
+ *     aplay   -D plughw:0,0 xxx.wav
+ *     arecord -D plughw:0,0 xxx.wav
+ * SSI-HDMI
+ *     aplay   -D plughw:0,1 xxx.wav
+ */
+
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/input/input.h>
 
@@ -18,6 +26,7 @@
        };
 
        chosen {
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
                stdout-path = "serial0:115200n8";
        };
 
                regulator-always-on;
        };
 
-       rsnd_ak4613: sound {
-               compatible = "simple-audio-card";
-
-               simple-audio-card,format = "left_j";
-               simple-audio-card,bitclock-master = <&sndcpu>;
-               simple-audio-card,frame-master = <&sndcpu>;
+       sound_card: sound {
+               compatible = "audio-graph-card";
+               label = "rcar-sound";
 
-               sndcpu: simple-audio-card,cpu {
-                       sound-dai = <&rcar_sound>;
-               };
-
-               sndcodec: simple-audio-card,codec {
-                       sound-dai = <&ak4613>;
-               };
+               dais = <&rsnd_port0     /* ak4613 */
+                       &rsnd_port1     /* HDMI0  */
+                       >;
        };
 
        vcc_sdhi0: regulator-vcc-sdhi0 {
                                remote-endpoint = <&hdmi0_con>;
                        };
                };
+               port@2 {
+                       reg = <2>;
+                       dw_hdmi0_snd_in: endpoint {
+                               remote-endpoint = <&rsnd_for_hdmi>;
+                       };
+               };
        };
 };
 
                asahi-kasei,out4-single-end;
                asahi-kasei,out5-single-end;
                asahi-kasei,out6-single-end;
+
+               port {
+                       ak4613_endpoint: endpoint {
+                               remote-endpoint = <&rsnd_for_ak4613>;
+                       };
+               };
        };
 
        cs2000: clk-multiplier@4f {
 &i2c_dvfs {
        status = "okay";
 
+       clock-frequency = <400000>;
+
        pmic: pmic@30 {
                pinctrl-0 = <&irq0_pins>;
                pinctrl-names = "default";
        };
 
        sdhi2_pins: sd2 {
-               groups = "sdhi2_data8", "sdhi2_ctrl", "sdhi2_ds";
-               function = "sdhi2";
-               power-source = <3300>;
-       };
-
-       sdhi2_pins_uhs: sd2_uhs {
                groups = "sdhi2_data8", "sdhi2_ctrl", "sdhi2_ds";
                function = "sdhi2";
                power-source = <1800>;
                 <&audio_clk_c>,
                 <&cpg CPG_CORE CPG_AUDIO_CLK_I>;
 
-       rcar_sound,dai {
-               dai0 {
-                       playback = <&ssi0 &src0 &dvc0>;
-                       capture  = <&ssi1 &src1 &dvc1>;
+       ports {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               rsnd_port0: port@0 {
+                       reg = <0>;
+                       rsnd_for_ak4613: endpoint {
+                               remote-endpoint = <&ak4613_endpoint>;
+
+                               dai-format = "left_j";
+                               bitclock-master = <&rsnd_for_ak4613>;
+                               frame-master = <&rsnd_for_ak4613>;
+
+                               playback = <&ssi0 &src0 &dvc0>;
+                               capture  = <&ssi1 &src1 &dvc1>;
+                       };
+               };
+               rsnd_port1: port@1 {
+                       reg = <1>;
+                       rsnd_for_hdmi: endpoint {
+                               remote-endpoint = <&dw_hdmi0_snd_in>;
+
+                               dai-format = "i2s";
+                               bitclock-master = <&rsnd_for_hdmi>;
+                               frame-master = <&rsnd_for_hdmi>;
+
+                               playback = <&ssi2>;
+                       };
                };
        };
 };
        cd-gpios = <&gpio3 12 GPIO_ACTIVE_LOW>;
        bus-width = <4>;
        sd-uhs-sdr50;
+       sd-uhs-sdr104;
        status = "okay";
 };
 
 &sdhi2 {
        /* used for on-board 8bit eMMC */
        pinctrl-0 = <&sdhi2_pins>;
-       pinctrl-1 = <&sdhi2_pins_uhs>;
+       pinctrl-1 = <&sdhi2_pins>;
        pinctrl-names = "default", "state_uhs";
 
        vmmc-supply = <&reg_3p3v>;
        vqmmc-supply = <&reg_1p8v>;
        bus-width = <8>;
        mmc-hs200-1_8v;
+       mmc-hs400-1_8v;
        non-removable;
        status = "okay";
 };
index 31ba52b14e99bac5fcb916502cad710a8569a250..a3cd475b48d2bace6ee45bb78fcbe63955b2a923 100644 (file)
@@ -33,7 +33,7 @@
 
                cpu0: cpu@0 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0 0x000>;
                        clocks = <&sys_clk 33>;
                        enable-method = "psci";
@@ -42,7 +42,7 @@
 
                cpu1: cpu@1 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0 0x001>;
                        clocks = <&sys_clk 33>;
                        enable-method = "psci";
index b9ed613ace9ae45bb5e4f6941d8f36088de55ba4..baf23268366f0f73fdaec6bfff5c6a095e1b3704 100644 (file)
@@ -43,7 +43,7 @@
 
                cpu0: cpu@0 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a72", "arm,armv8";
+                       compatible = "arm,cortex-a72";
                        reg = <0 0x000>;
                        clocks = <&sys_clk 32>;
                        enable-method = "psci";
@@ -53,7 +53,7 @@
 
                cpu1: cpu@1 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a72", "arm,armv8";
+                       compatible = "arm,cortex-a72";
                        reg = <0 0x001>;
                        clocks = <&sys_clk 32>;
                        enable-method = "psci";
@@ -63,7 +63,7 @@
 
                cpu2: cpu@100 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0 0x100>;
                        clocks = <&sys_clk 33>;
                        enable-method = "psci";
@@ -73,7 +73,7 @@
 
                cpu3: cpu@101 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0 0x101>;
                        clocks = <&sys_clk 33>;
                        enable-method = "psci";
                        cooling-maps {
                                map0 {
                                        trip = <&cpu_alert>;
-                                       cooling-device = <&cpu0
-                                           THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
-                               };
-                               map1 {
-                                       trip = <&cpu_alert>;
-                                       cooling-device = <&cpu2
-                                           THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                                       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>;
                                };
                        };
                };
                        };
                };
 
+               pcie: pcie@66000000 {
+                       compatible = "socionext,uniphier-pcie", "snps,dw-pcie";
+                       status = "disabled";
+                       reg-names = "dbi", "link", "config";
+                       reg = <0x66000000 0x1000>, <0x66010000 0x10000>,
+                             <0x2fff0000 0x10000>;
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       clocks = <&sys_clk 24>;
+                       resets = <&sys_rst 24>;
+                       num-lanes = <1>;
+                       num-viewport = <1>;
+                       bus-range = <0x0 0xff>;
+                       device_type = "pci";
+                       ranges =
+                       /* downstream I/O */
+                               <0x81000000 0 0x00000000 0x2ffe0000 0 0x00010000>,
+                       /* non-prefetchable memory */
+                               <0x82000000 0 0x20000000 0x20000000 0 0x0ffe0000>;
+                       #interrupt-cells = <1>;
+                       interrupt-names = "dma", "msi";
+                       interrupts = <0 224 4>, <0 225 4>;
+                       interrupt-map-mask = <0 0 0 7>;
+                       interrupt-map = <0 0 0 1 &pcie_intc 0>, /* INTA */
+                                       <0 0 0 2 &pcie_intc 1>, /* INTB */
+                                       <0 0 0 3 &pcie_intc 2>, /* INTC */
+                                       <0 0 0 4 &pcie_intc 3>; /* INTD */
+                       phy-names = "pcie-phy";
+                       phys = <&pcie_phy>;
+
+                       pcie_intc: legacy-interrupt-controller {
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                               interrupt-parent = <&gic>;
+                               interrupts = <0 226 4>;
+                       };
+               };
+
+               pcie_phy: phy@66038000 {
+                       compatible = "socionext,uniphier-ld20-pcie-phy";
+                       reg = <0x66038000 0x4000>;
+                       #phy-cells = <0>;
+                       clocks = <&sys_clk 24>;
+                       resets = <&sys_rst 24>;
+                       socionext,syscon = <&soc_glue>;
+               };
+
                nand: nand@68000000 {
                        compatible = "socionext,uniphier-denali-nand-v5b";
                        status = "disabled";
index b73d594b6dcd472de158e2e98a9223719160624b..c2706cef0b8a1105ab539f3be9efd18c1dcab1ee 100644 (file)
                        };
                };
 
+               dmac: dma-controller@5a000000 {
+                       compatible = "socionext,uniphier-mio-dmac";
+                       reg = <0x5a000000 0x1000>;
+                       interrupts = <0 68 4>, <0 68 4>, <0 69 4>, <0 70 4>,
+                                    <0 71 4>, <0 72 4>, <0 73 4>;
+                       clocks = <&mio_clk 7>;
+                       resets = <&mio_rst 7>;
+                       #dma-cells = <1>;
+               };
+
                sd: sdhc@5a400000 {
                        compatible = "socionext,uniphier-sd-v2.91";
                        status = "disabled";
                        clocks = <&mio_clk 0>;
                        reset-names = "host", "bridge";
                        resets = <&mio_rst 0>, <&mio_rst 3>;
+                       dma-names = "rx-tx";
+                       dmas = <&dmac 4>;
                        bus-width = <4>;
                        cap-sd-highspeed;
                        sd-uhs-sdr12;
                        clocks = <&mio_clk 1>;
                        reset-names = "host", "bridge", "hw";
                        resets = <&mio_rst 1>, <&mio_rst 4>, <&mio_rst 6>;
+                       dma-names = "rx-tx";
+                       dmas = <&dmac 6>;
                        bus-width = <8>;
                        cap-mmc-highspeed;
                        cap-mmc-hw-reset;
index ef342088e1c562d388b7bb3eee6df1739fb172d4..d090fc7e2d8bdc849f053ba5db6bf02ac2148afd 100644 (file)
                        };
                };
 
+               dmac: dma-controller@5a000000 {
+                       compatible = "socionext,uniphier-mio-dmac";
+                       reg = <0x5a000000 0x1000>;
+                       interrupts = <0 68 4>, <0 68 4>, <0 69 4>, <0 70 4>,
+                                    <0 71 4>, <0 72 4>, <0 73 4>, <0 74 4>;
+                       clocks = <&mio_clk 7>;
+                       resets = <&mio_rst 7>;
+                       #dma-cells = <1>;
+               };
+
                sd: sdhc@5a400000 {
                        compatible = "socionext,uniphier-sd-v2.91";
                        status = "disabled";
                        clocks = <&mio_clk 0>;
                        reset-names = "host", "bridge";
                        resets = <&mio_rst 0>, <&mio_rst 3>;
+                       dma-names = "rx-tx";
+                       dmas = <&dmac 4>;
                        bus-width = <4>;
                        cap-sd-highspeed;
                        sd-uhs-sdr12;
                        clocks = <&mio_clk 1>;
                        reset-names = "host", "bridge", "hw";
                        resets = <&mio_rst 1>, <&mio_rst 4>, <&mio_rst 6>;
+                       dma-names = "rx-tx";
+                       dmas = <&dmac 5>;
                        bus-width = <8>;
                        cap-mmc-highspeed;
                        cap-mmc-hw-reset;
                        clocks = <&mio_clk 2>;
                        reset-names = "host", "bridge";
                        resets = <&mio_rst 2>, <&mio_rst 5>;
+                       dma-names = "rx-tx";
+                       dmas = <&dmac 6>;
                        bus-width = <4>;
                        cap-sd-highspeed;
                };
index fa25ffd97f63449acc6100f227c952474234399d..4e11e85d8dd71e954c075edf93ff2d7a97f438d4 100644 (file)
                        cooling-maps {
                                map {
                                        trip = <&cpu_alert>;
-                                       cooling-device = <&cpu0
-                                           THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                                       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 4fb12b8a675edbfac8154f2f3e06961c0a242595..1965e4dfe4a4778de7b914605d8c78f96560f0d0 100644 (file)
        status = "okay";
 };
 
+&pcie {
+       status = "okay";
+};
+
 &nand {
        status = "okay";
 };
index f629c6a862f7a81b49606f6bea60188fa14a2cc9..961d4d3621f4fd39c5e23adb0f257362f5b3576f 100644 (file)
@@ -39,7 +39,7 @@
 
                cpu0: cpu@0 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0 0x000>;
                        clocks = <&sys_clk 33>;
                        enable-method = "psci";
@@ -48,7 +48,7 @@
 
                cpu1: cpu@1 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0 0x001>;
                        clocks = <&sys_clk 33>;
                        enable-method = "psci";
@@ -57,7 +57,7 @@
 
                cpu2: cpu@2 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0 0x002>;
                        clocks = <&sys_clk 33>;
                        enable-method = "psci";
@@ -66,7 +66,7 @@
 
                cpu3: cpu@3 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0 0x003>;
                        clocks = <&sys_clk 33>;
                        enable-method = "psci";
                        };
                };
 
+               pcie: pcie@66000000 {
+                       compatible = "socionext,uniphier-pcie", "snps,dw-pcie";
+                       status = "disabled";
+                       reg-names = "dbi", "link", "config";
+                       reg = <0x66000000 0x1000>, <0x66010000 0x10000>,
+                             <0x2fff0000 0x10000>;
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       clocks = <&sys_clk 24>;
+                       resets = <&sys_rst 24>;
+                       num-lanes = <1>;
+                       num-viewport = <1>;
+                       bus-range = <0x0 0xff>;
+                       device_type = "pci";
+                       ranges =
+                       /* downstream I/O */
+                               <0x81000000 0 0x00000000 0x2ffe0000 0 0x00010000>,
+                       /* non-prefetchable memory */
+                               <0x82000000 0 0x20000000 0x20000000 0 0x0ffe0000>;
+                       #interrupt-cells = <1>;
+                       interrupt-names = "dma", "msi";
+                       interrupts = <0 224 4>, <0 225 4>;
+                       interrupt-map-mask = <0 0 0 7>;
+                       interrupt-map = <0 0 0 1 &pcie_intc 0>, /* INTA */
+                                       <0 0 0 2 &pcie_intc 1>, /* INTB */
+                                       <0 0 0 3 &pcie_intc 2>, /* INTC */
+                                       <0 0 0 4 &pcie_intc 3>; /* INTD */
+                       phy-names = "pcie-phy";
+                       phys = <&pcie_phy>;
+
+                       pcie_intc: legacy-interrupt-controller {
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                               interrupt-parent = <&gic>;
+                               interrupts = <0 226 4>;
+                       };
+               };
+
+               pcie_phy: phy@66038000 {
+                       compatible = "socionext,uniphier-pxs3-pcie-phy";
+                       reg = <0x66038000 0x4000>;
+                       #phy-cells = <0>;
+                       clocks = <&sys_clk 24>;
+                       resets = <&sys_rst 24>;
+                       socionext,syscon = <&soc_glue>;
+               };
+
                nand: nand@68000000 {
                        compatible = "socionext,uniphier-denali-nand-v5b";
                        status = "disabled";
index f7fcf6b45995953e08dd0157ff6d14f4d00c97ec..efce02768b6fb5b44798ca291f1c5d699a7e00c4 100644 (file)
                        };
                };
 
+               dmac: dma-controller@5a000000 {
+                       compatible = "socionext,uniphier-mio-dmac";
+                       reg = <0x5a000000 0x1000>;
+                       interrupts = <0 68 4>, <0 68 4>, <0 69 4>, <0 70 4>,
+                                    <0 71 4>, <0 72 4>, <0 73 4>;
+                       clocks = <&mio_clk 7>;
+                       resets = <&mio_rst 7>;
+                       #dma-cells = <1>;
+               };
+
                sd: sdhc@5a400000 {
                        compatible = "socionext,uniphier-sd-v2.91";
                        status = "disabled";
                        clocks = <&mio_clk 0>;
                        reset-names = "host", "bridge";
                        resets = <&mio_rst 0>, <&mio_rst 3>;
+                       dma-names = "rx-tx";
+                       dmas = <&dmac 4>;
                        bus-width = <4>;
                        cap-sd-highspeed;
                        sd-uhs-sdr12;
                        clocks = <&mio_clk 1>;
                        reset-names = "host", "bridge", "hw";
                        resets = <&mio_rst 1>, <&mio_rst 4>, <&mio_rst 6>;
+                       dma-names = "rx-tx";
+                       dmas = <&dmac 6>;
                        bus-width = <8>;
                        cap-mmc-highspeed;
                        cap-mmc-hw-reset;
diff --git a/arch/arm/dts/vf-colibri-u-boot.dtsi b/arch/arm/dts/vf-colibri-u-boot.dtsi
new file mode 100644 (file)
index 0000000..db86739
--- /dev/null
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+
+/ {
+       soc {
+               u-boot,dm-pre-reloc;
+       };
+};
+
+&aips0 {
+       u-boot,dm-pre-reloc;
+};
+
+&pinctrl_ddr {
+       u-boot,dm-pre-reloc;
+};
+
+&pinctrl_uart0 {
+       u-boot,dm-pre-reloc;
+};
+
+&uart0 {
+       u-boot,dm-pre-reloc;
+};
index 923dc2451cd2c794d0fe60aec77d2062c1e51dae..5ce17076e9cecec0669d0ccba89e5787ed974d86 100644 (file)
@@ -1,18 +1,37 @@
 // SPDX-License-Identifier: GPL-2.0+ OR X11
 /*
- * Copyright 2014 Toradex AG
+ * Copyright 2014-2019 Toradex AG
  */
+
+/dts-v1/;
 #include "vf.dtsi"
+#include "vf610-pinfunc.h"
 
 / {
        chosen {
                stdout-path = &uart0;
        };
+
+       aliases {
+               usb0 = &ehci0; /* required for ums */
+       };
+
+       reg_usbh_vbus: regulator-usbh-vbus {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_usbh1_reg>;
+               regulator-name = "VCC_USB[1-4]";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               gpio = <&gpio2 19 GPIO_ACTIVE_LOW>; /* USBH_PEN */
+       };
 };
 
 &dspi1 {
-       status = "okay";
        bus-num = <1>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_dspi1>;
+       status = "okay";
 
        spi_cmd: sspi@0 {
                reg = <0>;
 &ehci1 {
        dr_mode = "host";
        status = "okay";
+       vbus-supply = <&reg_usbh_vbus>;
+};
+
+&esdhc1 {
+       bus-width = <4>;
+       cd-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>;
+       disable-wp;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_esdhc1>;
+       status = "okay";
+};
+
+&fec1 {
+       phy-mode = "rmii";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_fec1>;
+       status = "okay";
+};
+
+&i2c0 {
+       clock-frequency = <400000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c0>;
+       status = "okay";
+
+       /* M41T0M6 real time clock on carrier board */
+       rtc: m41t0m6@68 {
+               compatible = "st,m41t0";
+               reg = <0x68>;
+       };
+};
+
+&iomuxc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ddr>;
+
+       pinctrl_ddr: ddrgrp {
+               fsl,pins = <
+                       VF610_PAD_DDR_A15__DDR_A_15             0x180
+                       VF610_PAD_DDR_A14__DDR_A_14             0x180
+                       VF610_PAD_DDR_A13__DDR_A_13             0x180
+                       VF610_PAD_DDR_A12__DDR_A_12             0x180
+                       VF610_PAD_DDR_A11__DDR_A_11             0x180
+                       VF610_PAD_DDR_A10__DDR_A_10             0x180
+                       VF610_PAD_DDR_A9__DDR_A_9               0x180
+                       VF610_PAD_DDR_A8__DDR_A_8               0x180
+                       VF610_PAD_DDR_A7__DDR_A_7               0x180
+                       VF610_PAD_DDR_A6__DDR_A_6               0x180
+                       VF610_PAD_DDR_A5__DDR_A_5               0x180
+                       VF610_PAD_DDR_A4__DDR_A_4               0x180
+                       VF610_PAD_DDR_A3__DDR_A_3               0x180
+                       VF610_PAD_DDR_A2__DDR_A_2               0x180
+                       VF610_PAD_DDR_A1__DDR_A_1               0x180
+                       VF610_PAD_DDR_A0__DDR_A_0               0x180
+                       VF610_PAD_DDR_BA2__DDR_BA_2             0x180
+                       VF610_PAD_DDR_BA1__DDR_BA_1             0x180
+                       VF610_PAD_DDR_BA0__DDR_BA_0             0x180
+                       VF610_PAD_DDR_CAS__DDR_CAS_B            0x180
+                       VF610_PAD_DDR_CKE__DDR_CKE_0            0x180
+                       VF610_PAD_DDR_CLK__DDR_CLK_0            0x180
+                       VF610_PAD_DDR_CS__DDR_CS_B_0            0x180
+                       VF610_PAD_DDR_D15__DDR_D_15             0x10180
+                       VF610_PAD_DDR_D14__DDR_D_14             0x10180
+                       VF610_PAD_DDR_D13__DDR_D_13             0x10180
+                       VF610_PAD_DDR_D12__DDR_D_12             0x10180
+                       VF610_PAD_DDR_D11__DDR_D_11             0x10180
+                       VF610_PAD_DDR_D10__DDR_D_10             0x10180
+                       VF610_PAD_DDR_D9__DDR_D_9               0x10180
+                       VF610_PAD_DDR_D8__DDR_D_8               0x10180
+                       VF610_PAD_DDR_D7__DDR_D_7               0x10180
+                       VF610_PAD_DDR_D6__DDR_D_6               0x10180
+                       VF610_PAD_DDR_D5__DDR_D_5               0x10180
+                       VF610_PAD_DDR_D4__DDR_D_4               0x10180
+                       VF610_PAD_DDR_D3__DDR_D_3               0x10180
+                       VF610_PAD_DDR_D2__DDR_D_2               0x10180
+                       VF610_PAD_DDR_D1__DDR_D_1               0x10180
+                       VF610_PAD_DDR_D0__DDR_D_0               0x10180
+                       VF610_PAD_DDR_DQM1__DDR_DQM_1           0x10180
+                       VF610_PAD_DDR_DQM0__DDR_DQM_0           0x10180
+                       VF610_PAD_DDR_DQS1__DDR_DQS_1           0x10180
+                       VF610_PAD_DDR_DQS0__DDR_DQS_0           0x10180
+                       VF610_PAD_DDR_RAS__DDR_RAS_B            0x180
+                       VF610_PAD_DDR_WE__DDR_WE_B              0x180
+                       VF610_PAD_DDR_ODT1__DDR_ODT_0           0x180
+                       VF610_PAD_DDR_ODT0__DDR_ODT_1           0x180
+                       VF610_PAD_DDR_DDRBYTE1__DDR_DDRBYTE1    0x180
+                       VF610_PAD_DDR_DDRBYTE2__DDR_DDRBYTE2    0x180
+                       VF610_PAD_DDR_RESETB                    0x180
+               >;
+       };
+
+       pinctrl_dspi1: dspi1grp {
+               fsl,pins = <
+                       VF610_PAD_PTD5__DSPI1_CS0               0x33e2
+                       VF610_PAD_PTD6__DSPI1_SIN               0x33e1
+                       VF610_PAD_PTD7__DSPI1_SOUT              0x33e2
+                       VF610_PAD_PTD8__DSPI1_SCK               0x33e2
+               >;
+       };
+
+       pinctrl_esdhc1: esdhc1grp {
+               fsl,pins = <
+                       VF610_PAD_PTA24__ESDHC1_CLK             0x31ef
+                       VF610_PAD_PTA25__ESDHC1_CMD             0x31ef
+                       VF610_PAD_PTA26__ESDHC1_DAT0            0x31ef
+                       VF610_PAD_PTA27__ESDHC1_DAT1            0x31ef
+                       VF610_PAD_PTA28__ESDHC1_DATA2           0x31ef
+                       VF610_PAD_PTA29__ESDHC1_DAT3            0x31ef
+                       VF610_PAD_PTB20__GPIO_42                0x219d
+               >;
+       };
+
+       pinctrl_fec1: fec1grp {
+               fsl,pins = <
+                       VF610_PAD_PTA6__RMII_CLKOUT             0x30df
+                       VF610_PAD_PTC9__ENET_RMII1_MDC          0x30df
+                       VF610_PAD_PTC10__ENET_RMII1_MDIO        0x30df
+                       VF610_PAD_PTC11__ENET_RMII1_CRS         0x30df
+                       VF610_PAD_PTC12__ENET_RMII1_RXD1        0x30df
+                       VF610_PAD_PTC13__ENET_RMII1_RXD0        0x30df
+                       VF610_PAD_PTC14__ENET_RMII1_RXER        0x30df
+                       VF610_PAD_PTC15__ENET_RMII1_TXD1        0x30df
+                       VF610_PAD_PTC16__ENET_RMII1_TXD0        0x30df
+                       VF610_PAD_PTC17__ENET_RMII1_TXEN        0x30df
+               >;
+       };
+
+       pinctrl_i2c0: i2c0grp {
+               fsl,pins = <
+                       VF610_PAD_PTB14__I2C0_SCL               0x37ff
+                       VF610_PAD_PTB15__I2C0_SDA               0x37ff
+               >;
+       };
+
+       pinctrl_nfc: nfcgrp {
+               fsl,pins = <
+                       VF610_PAD_PTD23__NF_IO7                 0x28df
+                       VF610_PAD_PTD22__NF_IO6                 0x28df
+                       VF610_PAD_PTD21__NF_IO5                 0x28df
+                       VF610_PAD_PTD20__NF_IO4                 0x28df
+                       VF610_PAD_PTD19__NF_IO3                 0x28df
+                       VF610_PAD_PTD18__NF_IO2                 0x28df
+                       VF610_PAD_PTD17__NF_IO1                 0x28df
+                       VF610_PAD_PTD16__NF_IO0                 0x28df
+                       VF610_PAD_PTB24__NF_WE_B                0x28c2
+                       VF610_PAD_PTB25__NF_CE0_B               0x28c2
+                       VF610_PAD_PTB27__NF_RE_B                0x28c2
+                       VF610_PAD_PTC26__NF_RB_B                0x283d
+                       VF610_PAD_PTC27__NF_ALE                 0x28c2
+                       VF610_PAD_PTC28__NF_CLE                 0x28c2
+               >;
+       };
+
+       pinctrl_uart0: uart0grp {
+               fsl,pins = <
+                       VF610_PAD_PTB10__UART0_TX               0x11af
+                       VF610_PAD_PTB11__UART0_RX               0x11af
+                       VF610_PAD_PTB12__UART0_RTS              0x11af
+                       VF610_PAD_PTB13__UART0_CTS              0x11af
+               >;
+       };
+
+       pinctrl_usbh1_reg: gpio_usb_vbus {
+               fsl,pins = <
+                       VF610_PAD_PTD4__GPIO_83                 0x22ed
+               >;
+       };
+};
+
+&nfc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_nfc>;
+       status = "okay";
 };
 
 &uart0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart0>;
        status = "okay";
 };
index ad30059b9ab39a947bae3f6cdff9c74139acaf70..5e3b2c5b9dcfa2b061ba45da4f225a212b6bf0b6 100644 (file)
                spi1 = &dspi1;
                ehci0 = &ehci0;
                ehci1 = &ehci1;
+               i2c0 = &i2c0;
+               i2c1 = &i2c1;
+               i2c2 = &i2c2;
+               i2c3 = &i2c3;
        };
 
        soc {
                                status = "disabled";
                        };
 
+                       i2c0: i2c@40066000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,vf610-i2c";
+                               reg = <0x40066000 0x1000>;
+                               status = "disabled";
+                       };
+
+                       i2c1: i2c@40067000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,vf610-i2c";
+                               reg = <0x40067000 0x1000>;
+                               status = "disabled";
+                       };
+
                        iomuxc: iomuxc@40048000 {
                                compatible = "fsl,vf610-iomuxc";
                                reg = <0x40048000 0x1000>;
                                reg = <0x400b4000 0x800>;
                                status = "disabled";
                        };
+
+                       esdhc1: esdhc@400b2000 {
+                               compatible = "fsl,esdhc";
+                               reg = <0x400b2000 0x1000>;
+                               status = "disabled";
+                       };
+
+                       fec0: fec@400d0000 {
+                             compatible = "fsl,mvf600-fec";
+                             reg = <0x400d0000 0x1000>;
+                             status = "disabled";
+                       };
+
+                       fec1: fec@400d1000 {
+                             compatible = "fsl,mvf600-fec";
+                             reg = <0x400d1000 0x1000>;
+                             status = "disabled";
+                       };
+
+                       nfc: nand@400e0000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,vf610-nfc";
+                               reg = <0x400e0000 0x4000>;
+                               status = "disabled";
+                       };
+
+                       i2c2: i2c@400e6000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,vf610-i2c";
+                               reg = <0x400e6000 0x1000>;
+                               status = "disabled";
+                       };
+
+                       i2c3: i2c@400e7000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,vf610-i2c";
+                               reg = <0x400e7000 0x1000>;
+                               status = "disabled";
+                       };
                };
        };
 };
index 3f33d970e0eec320431aaf9767aced4f7e9cc689..c83a16fdcb82251242834135e1464ce32dc18bbc 100644 (file)
@@ -5,6 +5,7 @@
 
 /dts-v1/;
 #include "vf-colibri.dtsi"
+#include "vf-colibri-u-boot.dtsi"
 
 / {
        model = "Toradex Colibri VF50";
diff --git a/arch/arm/dts/vf610-bk4r1-u-boot.dtsi b/arch/arm/dts/vf610-bk4r1-u-boot.dtsi
new file mode 100644 (file)
index 0000000..088926b
--- /dev/null
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright 2019
+ * Lukasz Majewski, DENX Software Engineering, lukma@denx.de
+ */
+
+/ {
+       soc {
+               u-boot,dm-pre-reloc;
+       };
+};
+
+&aips0 {
+       u-boot,dm-pre-reloc;
+};
+
+&pinctrl_ddr {
+       u-boot,dm-pre-reloc;
+};
+
+&pinctrl_uart1 {
+       u-boot,dm-pre-reloc;
+};
+
+&uart1 {
+       u-boot,dm-pre-reloc;
+};
diff --git a/arch/arm/dts/vf610-bk4r1.dts b/arch/arm/dts/vf610-bk4r1.dts
new file mode 100644 (file)
index 0000000..55cd533
--- /dev/null
@@ -0,0 +1,97 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * (C) Copyright 2018
+ * Lukasz Majewski, DENX Software Engineering, lukma@denx.de.
+ *
+ * Copyright 2016 Toradex AG
+ */
+
+/dts-v1/;
+#include "vf610-pcm052.dtsi"
+#include "vf610-pinfunc.h"
+
+/ {
+       model = "Liebherr (LVF) BK4 Vybrid Board";
+       compatible = "lvf,bk4", "fsl,vf610";
+
+       leds {
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_gpio_leds>;
+
+               compatible = "gpio-leds";
+
+               /* PTE15 PORT3[24] H6 green */
+               led@0 {
+                       label = "0";
+                       gpios = <&gpio3 24 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+               };
+
+               /* PTA12 PORT0[5] H5 green */
+               led@1 {
+                       label = "1";
+                       gpios = <&gpio0 5 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+               };
+
+               /* PTE20 PORT3[39] H4 green */
+               led@2 {
+                       label = "2";
+                       gpios = <&gpio3 29 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+               };
+
+               /* PTE12 PORT3[21] H3 green */
+               led@3 {
+                       label = "3";
+                       gpios = <&gpio3 21 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+               };
+
+               /* LED6 is now PRESET ETH -> PTA16 PORT0[6]  H6 red */
+               /* PTE9  PORT3[18] H5 red */
+               led@4 {
+                       label = "5";
+                       gpios = <&gpio3 18 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+               };
+
+               /* PTE23 PORT4[0]  H4 red */
+               led@5 {
+                       label = "6";
+                       gpios = <&gpio4 0 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+               };
+
+               /* PTE16 PORT3[25] H3 red */
+               led@6 {
+                       label = "7";
+                       gpios = <&gpio3 25 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+               };
+       };
+};
+
+&iomuxc {
+       pinctrl-0 = <&pinctrl_ddr &pinctrl_hog>;
+
+       pinctrl_hog: hoggrp {
+               fsl,pins = <
+                       /* ETH control pins */
+                       VF610_PAD_PTE17__GPIO_122               0x1183
+                       VF610_PAD_PTA16__GPIO_6 0x1183
+               >;
+       };
+
+       pinctrl_gpio_leds: gpioledsgrp {
+               fsl,pins = <
+                       /* LEDS */
+                       VF610_PAD_PTE15__GPIO_120       0x1183
+                       VF610_PAD_PTA12__GPIO_5 0x1183
+                       VF610_PAD_PTE9__GPIO_114        0x1183
+                       VF610_PAD_PTE20__GPIO_125       0x1183
+                       VF610_PAD_PTE23__GPIO_128       0x1183
+                       VF610_PAD_PTE16__GPIO_121       0x1183
+               >;
+       };
+};
index 0a6b937feea6def1e424ed9e1157b8a21329d899..7275fec279ffd5623376907b636b69d5537cade9 100644 (file)
@@ -5,6 +5,7 @@
 
 /dts-v1/;
 #include "vf-colibri.dtsi"
+#include "vf-colibri-u-boot.dtsi"
 
 / {
        model = "Toradex Colibri VF61";
similarity index 81%
rename from arch/arm/dts/pcm052.dts
rename to arch/arm/dts/vf610-pcm052.dts
index 6489fdc6f41287c1aa3761b0c173ccf88dc93ed3..22026024eabd08b9e4a53b515aed4fb1a88f8ad4 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 /dts-v1/;
-#include "vf.dtsi"
+#include "vf610-pcm052.dtsi"
 
 / {
        model = "Phytec phyCORE-Vybrid";
@@ -15,7 +15,3 @@
        };
 
 };
-
-&uart1 {
-       status = "okay";
-};
diff --git a/arch/arm/dts/vf610-pcm052.dtsi b/arch/arm/dts/vf610-pcm052.dtsi
new file mode 100644 (file)
index 0000000..1383d03
--- /dev/null
@@ -0,0 +1,259 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * (C) Copyright 2018
+ * Lukasz Majewski, DENX Software Engineering, lukma@denx.de.
+ *
+ */
+
+/dts-v1/;
+#include "vf.dtsi"
+#include "vf610-pinfunc.h"
+
+/ {
+       chosen {
+               stdout-path = &uart1;
+       };
+
+       aliases {
+               spi0 = &qspi0;
+               mmc0 = &esdhc1;
+       };
+};
+
+&esdhc1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_esdhc1>;
+       bus-width = <4>;
+       cd-gpios = <&gpio3 2 GPIO_ACTIVE_LOW>;
+       status = "okay";
+};
+
+&fec0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_eth>;
+
+       phy-mode = "rmii";
+       status = "okay";
+};
+
+&fec1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_eth1>;
+
+       phy-mode = "rmii";
+       status = "okay";
+};
+
+&i2c2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c2>;
+       status = "okay";
+
+       eeprom: eeprom@50 {
+               compatible = "atmel,24c256";
+               reg = <0x50>;
+               pagesize = <64>;
+               u-boot,i2c-offset-len = <2>;
+       };
+
+       m41t62: rtc@68 {
+               compatible = "st,m41t62";
+               reg = <0x68>;
+       };
+};
+
+&iomuxc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ddr>;
+
+       pinctrl_ddr: ddrgrp {
+               fsl,pins = <
+                       VF610_PAD_DDR_A15__DDR_A_15             0x1c0
+                       VF610_PAD_DDR_A14__DDR_A_14             0x1c0
+                       VF610_PAD_DDR_A13__DDR_A_13             0x1c0
+                       VF610_PAD_DDR_A12__DDR_A_12             0x1c0
+                       VF610_PAD_DDR_A11__DDR_A_11             0x1c0
+                       VF610_PAD_DDR_A10__DDR_A_10             0x1c0
+                       VF610_PAD_DDR_A9__DDR_A_9               0x1c0
+                       VF610_PAD_DDR_A8__DDR_A_8               0x1c0
+                       VF610_PAD_DDR_A7__DDR_A_7               0x1c0
+                       VF610_PAD_DDR_A6__DDR_A_6               0x1c0
+                       VF610_PAD_DDR_A5__DDR_A_5               0x1c0
+                       VF610_PAD_DDR_A4__DDR_A_4               0x1c0
+                       VF610_PAD_DDR_A3__DDR_A_3               0x1c0
+                       VF610_PAD_DDR_A2__DDR_A_2               0x1c0
+                       VF610_PAD_DDR_A1__DDR_A_1               0x1c0
+                       VF610_PAD_DDR_A0__DDR_A_0               0x1c0
+                       VF610_PAD_DDR_BA2__DDR_BA_2             0x1c0
+                       VF610_PAD_DDR_BA1__DDR_BA_1             0x1c0
+                       VF610_PAD_DDR_BA0__DDR_BA_0             0x1c0
+                       VF610_PAD_DDR_CAS__DDR_CAS_B            0x1c0
+                       VF610_PAD_DDR_CKE__DDR_CKE_0            0x1c0
+                       VF610_PAD_DDR_CLK__DDR_CLK_0            0x101c0
+                       VF610_PAD_DDR_CS__DDR_CS_B_0            0x1c0
+                       VF610_PAD_DDR_D15__DDR_D_15             0x1c0
+                       VF610_PAD_DDR_D14__DDR_D_14             0x1c0
+                       VF610_PAD_DDR_D13__DDR_D_13             0x1c0
+                       VF610_PAD_DDR_D12__DDR_D_12             0x1c0
+                       VF610_PAD_DDR_D11__DDR_D_11             0x1c0
+                       VF610_PAD_DDR_D10__DDR_D_10             0x1c0
+                       VF610_PAD_DDR_D9__DDR_D_9               0x1c0
+                       VF610_PAD_DDR_D8__DDR_D_8               0x1c0
+                       VF610_PAD_DDR_D7__DDR_D_7               0x1c0
+                       VF610_PAD_DDR_D6__DDR_D_6               0x1c0
+                       VF610_PAD_DDR_D5__DDR_D_5               0x1c0
+                       VF610_PAD_DDR_D4__DDR_D_4               0x1c0
+                       VF610_PAD_DDR_D3__DDR_D_3               0x1c0
+                       VF610_PAD_DDR_D2__DDR_D_2               0x1c0
+                       VF610_PAD_DDR_D1__DDR_D_1               0x1c0
+                       VF610_PAD_DDR_D0__DDR_D_0               0x1c0
+                       VF610_PAD_DDR_DQM1__DDR_DQM_1           0x1c0
+                       VF610_PAD_DDR_DQM0__DDR_DQM_0           0x1c0
+                       VF610_PAD_DDR_DQS1__DDR_DQS_1           0x101c0
+                       VF610_PAD_DDR_DQS0__DDR_DQS_0           0x101c0
+                       VF610_PAD_DDR_RAS__DDR_RAS_B            0x1c0
+                       VF610_PAD_DDR_WE__DDR_WE_B              0x1c0
+                       VF610_PAD_DDR_ODT1__DDR_ODT_0           0x1c0
+                       VF610_PAD_DDR_ODT0__DDR_ODT_1           0x1c0
+                       VF610_PAD_DDR_DDRBYTE1__DDR_DDRBYTE1    0x1c0
+                       VF610_PAD_DDR_DDRBYTE2__DDR_DDRBYTE2    0x1c0
+                       VF610_PAD_DDR_RESETB                    0x1006c
+               >;
+       };
+
+       pinctrl_esdhc1: esdhc1grp {
+               fsl,pins = <
+                       VF610_PAD_PTA24__ESDHC1_CLK             0x31ef
+                       VF610_PAD_PTA25__ESDHC1_CMD             0x31ef
+                       VF610_PAD_PTA26__ESDHC1_DAT0            0x31ef
+                       VF610_PAD_PTA27__ESDHC1_DAT1            0x31ef
+                       VF610_PAD_PTA28__ESDHC1_DATA2           0x31ef
+                       VF610_PAD_PTA29__ESDHC1_DAT3            0x31ef
+                       VF610_PAD_PTB28__GPIO_98                0x219d
+               >;
+       };
+
+       pinctrl_eth: ethgrp {
+               fsl,pins = <
+                       VF610_PAD_PTA6__RMII_CLKIN              0x30dd
+                       VF610_PAD_PTC0__ENET_RMII0_MDC          0x30de
+                       VF610_PAD_PTC1__ENET_RMII0_MDIO 0x30df
+                       VF610_PAD_PTC2__ENET_RMII0_CRS          0x30dd
+                       VF610_PAD_PTC3__ENET_RMII0_RXD1 0x30dd
+                       VF610_PAD_PTC4__ENET_RMII0_RXD0 0x30dd
+                       VF610_PAD_PTC5__ENET_RMII0_RXER 0x30dd
+                       VF610_PAD_PTC6__ENET_RMII0_TXD1 0x30de
+                       VF610_PAD_PTC7__ENET_RMII0_TXD0 0x30de
+                       VF610_PAD_PTC8__ENET_RMII0_TXEN 0x30de
+               >;
+       };
+
+       pinctrl_eth1: eth1grp {
+               fsl,pins = <
+                       VF610_PAD_PTC9__ENET_RMII1_MDC          0x30de
+                       VF610_PAD_PTC10__ENET_RMII1_MDIO        0x30df
+                       VF610_PAD_PTC11__ENET_RMII1_CRS 0x30dd
+                       VF610_PAD_PTC12__ENET_RMII1_RXD1        0x30dd
+                       VF610_PAD_PTC13__ENET_RMII1_RXD0        0x30dd
+                       VF610_PAD_PTC14__ENET_RMII1_RXER        0x30dd
+                       VF610_PAD_PTC15__ENET_RMII1_TXD1        0x30de
+                       VF610_PAD_PTC16__ENET_RMII1_TXD0        0x30de
+                       VF610_PAD_PTC17__ENET_RMII1_TXEN        0x30de
+               >;
+       };
+
+       pinctrl_i2c2: i2c2grp {
+               fsl,pins = <
+                       VF610_PAD_PTA22__I2C2_SCL               0x34df
+                       VF610_PAD_PTA23__I2C2_SDA               0x34df
+               >;
+       };
+
+       pinctrl_nfc: nfcgrp {
+               fsl,pins = <
+                       VF610_PAD_PTD31__NF_IO15                0x28df
+                       VF610_PAD_PTD30__NF_IO14                0x28df
+                       VF610_PAD_PTD29__NF_IO13                0x28df
+                       VF610_PAD_PTD28__NF_IO12                0x28df
+                       VF610_PAD_PTD27__NF_IO11                0x28df
+                       VF610_PAD_PTD26__NF_IO10                0x28df
+                       VF610_PAD_PTD25__NF_IO9         0x28df
+                       VF610_PAD_PTD24__NF_IO8         0x28df
+                       VF610_PAD_PTD23__NF_IO7         0x28df
+                       VF610_PAD_PTD22__NF_IO6         0x28df
+                       VF610_PAD_PTD21__NF_IO5         0x28df
+                       VF610_PAD_PTD20__NF_IO4         0x28df
+                       VF610_PAD_PTD19__NF_IO3         0x28df
+                       VF610_PAD_PTD18__NF_IO2         0x28df
+                       VF610_PAD_PTD17__NF_IO1         0x28df
+                       VF610_PAD_PTD16__NF_IO0         0x28df
+                       VF610_PAD_PTB24__NF_WE_B                0x28c2
+                       VF610_PAD_PTB25__NF_CE0_B               0x28c2
+                       VF610_PAD_PTB27__NF_RE_B                0x28c2
+                       VF610_PAD_PTC26__NF_RB_B                0x283d
+                       VF610_PAD_PTC27__NF_ALE         0x28c2
+                       VF610_PAD_PTC28__NF_CLE         0x28c2
+               >;
+       };
+
+       pinctrl_qspi0: qspi0grp {
+               fsl,pins = <
+                       VF610_PAD_PTD0__QSPI0_A_QSCK    0x397f
+                       VF610_PAD_PTD1__QSPI0_A_CS0     0x397f
+                       VF610_PAD_PTD2__QSPI0_A_DATA3   0x397f
+                       VF610_PAD_PTD3__QSPI0_A_DATA2   0x397f
+                       VF610_PAD_PTD4__QSPI0_A_DATA1   0x397f
+                       VF610_PAD_PTD5__QSPI0_A_DATA0   0x397f
+                       VF610_PAD_PTD7__QSPI0_B_QSCK    0x397f
+                       VF610_PAD_PTD8__QSPI0_B_CS0     0x397f
+                       VF610_PAD_PTD11__QSPI0_B_DATA1  0x397f
+                       VF610_PAD_PTD12__QSPI0_B_DATA0  0x397f
+               >;
+       };
+
+       pinctrl_uart1: uart1grp {
+               fsl,pins = <
+                       VF610_PAD_PTB4__UART1_TX                0x21a2
+                       VF610_PAD_PTB5__UART1_RX                0x21a1
+               >;
+       };
+};
+
+&nfc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_nfc>;
+
+       status = "okay";
+};
+
+&uart1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart1>;
+
+       status = "okay";
+};
+
+&qspi0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_qspi0>;
+
+       bus-num = <0>;
+       num-cs = <2>;
+       status = "okay";
+
+       qflash0: spi_flash@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "spi-flash";
+               spi-max-frequency = <108000000>;
+               reg = <0>;
+       };
+
+       qflash1: spi_flash@1 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "spi-flash";
+               spi-max-frequency = <66000000>;
+               reg = <1>;
+       };
+};
index fcad7132c871f01e98a3a46dd66536f7945eaf75..94567190746883617da462ecb83f3920556fc974 100644 (file)
 #define VF610_PAD_PTA7__GPIO_134               0x218 0x000 ALT0 0x0
 #define VF610_PAD_PTA7__VIU_PIX_CLK            0x218 0x3AC ALT1 0x1
 
+#define VF610_PAD_DDR_RESETB                   0x21c 0x000 ALT0 0x0
+#define VF610_PAD_DDR_A15__DDR_A_15            0x220 0x000 ALT0 0x0
+#define VF610_PAD_DDR_A14__DDR_A_14            0x224 0x000 ALT0 0x0
+#define VF610_PAD_DDR_A13__DDR_A_13            0x228 0x000 ALT0 0x0
+#define VF610_PAD_DDR_A12__DDR_A_12            0x22c 0x000 ALT0 0x0
+#define VF610_PAD_DDR_A11__DDR_A_11            0x230 0x000 ALT0 0x0
+#define VF610_PAD_DDR_A10__DDR_A_10            0x234 0x000 ALT0 0x0
+#define VF610_PAD_DDR_A9__DDR_A_9              0x238 0x000 ALT0 0x0
+#define VF610_PAD_DDR_A8__DDR_A_8              0x23c 0x000 ALT0 0x0
+#define VF610_PAD_DDR_A7__DDR_A_7              0x240 0x000 ALT0 0x0
+#define VF610_PAD_DDR_A6__DDR_A_6              0x244 0x000 ALT0 0x0
+#define VF610_PAD_DDR_A5__DDR_A_5              0x248 0x000 ALT0 0x0
+#define VF610_PAD_DDR_A4__DDR_A_4              0x24c 0x000 ALT0 0x0
+#define VF610_PAD_DDR_A3__DDR_A_3              0x250 0x000 ALT0 0x0
+#define VF610_PAD_DDR_A2__DDR_A_2              0x254 0x000 ALT0 0x0
+#define VF610_PAD_DDR_A1__DDR_A_1              0x258 0x000 ALT0 0x0
+#define VF610_PAD_DDR_A0__DDR_A_0              0x25c 0x000 ALT0 0x0
+#define VF610_PAD_DDR_BA2__DDR_BA_2            0x260 0x000 ALT0 0x0
+#define VF610_PAD_DDR_BA1__DDR_BA_1            0x264 0x000 ALT0 0x0
+#define VF610_PAD_DDR_BA0__DDR_BA_0            0x268 0x000 ALT0 0x0
+#define VF610_PAD_DDR_CAS__DDR_CAS_B           0x26c 0x000 ALT0 0x0
+#define VF610_PAD_DDR_CKE__DDR_CKE_0           0x270 0x000 ALT0 0x0
+#define VF610_PAD_DDR_CLK__DDR_CLK_0           0x274 0x000 ALT0 0x0
+#define VF610_PAD_DDR_CS__DDR_CS_B_0           0x278 0x000 ALT0 0x0
+#define VF610_PAD_DDR_D15__DDR_D_15            0x27c 0x000 ALT0 0x0
+#define VF610_PAD_DDR_D14__DDR_D_14            0x280 0x000 ALT0 0x0
+#define VF610_PAD_DDR_D13__DDR_D_13            0x284 0x000 ALT0 0x0
+#define VF610_PAD_DDR_D12__DDR_D_12            0x288 0x000 ALT0 0x0
+#define VF610_PAD_DDR_D11__DDR_D_11            0x28c 0x000 ALT0 0x0
+#define VF610_PAD_DDR_D10__DDR_D_10            0x290 0x000 ALT0 0x0
+#define VF610_PAD_DDR_D9__DDR_D_9              0x294 0x000 ALT0 0x0
+#define VF610_PAD_DDR_D8__DDR_D_8              0x298 0x000 ALT0 0x0
+#define VF610_PAD_DDR_D7__DDR_D_7              0x29c 0x000 ALT0 0x0
+#define VF610_PAD_DDR_D6__DDR_D_6              0x2a0 0x000 ALT0 0x0
+#define VF610_PAD_DDR_D5__DDR_D_5              0x2a4 0x000 ALT0 0x0
+#define VF610_PAD_DDR_D4__DDR_D_4              0x2a8 0x000 ALT0 0x0
+#define VF610_PAD_DDR_D3__DDR_D_3              0x2ac 0x000 ALT0 0x0
+#define VF610_PAD_DDR_D2__DDR_D_2              0x2b0 0x000 ALT0 0x0
+#define VF610_PAD_DDR_D1__DDR_D_1              0x2b4 0x000 ALT0 0x0
+#define VF610_PAD_DDR_D0__DDR_D_0              0x2b8 0x000 ALT0 0x0
+#define VF610_PAD_DDR_DQM1__DDR_DQM_1          0x2bc 0x000 ALT0 0x0
+#define VF610_PAD_DDR_DQM0__DDR_DQM_0          0x2c0 0x000 ALT0 0x0
+#define VF610_PAD_DDR_DQS1__DDR_DQS_1          0x2c4 0x000 ALT0 0x0
+#define VF610_PAD_DDR_DQS0__DDR_DQS_0          0x2c8 0x000 ALT0 0x0
+#define VF610_PAD_DDR_RAS__DDR_RAS_B           0x2cc 0x000 ALT0 0x0
+#define VF610_PAD_DDR_WE__DDR_WE_B             0x2d0 0x000 ALT0 0x0
+#define VF610_PAD_DDR_ODT1__DDR_ODT_0          0x2d4 0x000 ALT0 0x0
+#define VF610_PAD_DDR_ODT0__DDR_ODT_1          0x2d8 0x000 ALT0 0x0
+#define VF610_PAD_DDR_DDRBYTE1__DDR_DDRBYTE1   0x2dc 0x000 ALT0 0x0
+#define VF610_PAD_DDR_DDRBYTE2__DDR_DDRBYTE2   0x2e0 0x000 ALT0 0x0
 #endif
index d2b7fc2c994b1cc1526a2d9504c3a533bfdcdd9e..7a540b63f47135584710e0c7d0b51b8fde63cc5b 100644 (file)
@@ -53,7 +53,7 @@
        status = "okay";
        num-cs = <1>;
        flash@0 {
-               compatible = "spansion,s25fl256s", "spi-flash";
+               compatible = "spansion,s25fl256s", "jedec,spi-nor";
                reg = <0>;
                spi-max-frequency = <30000000>;
                m25p,fast-read;
index c235a5f731d992a8be2816ba8ef4a6620a965622..1716d5179ddf52f5b4406b42dfc1f1102f4bb391 100644 (file)
@@ -63,8 +63,8 @@
 
 &qspi {
        status = "okay";
-       flash@0 {
-               compatible = "n25q512a11";
+       flash0: flash@0 {
+               compatible = "n25q512a11", "spi-flash";
                #address-cells = <1>;
                #size-cells = <1>;
                reg = <0x0>;
index 5c212ba468e6ba3141d22e244d60c1255d24c9fb..6117f83c474e89cf4cf74c615b00dcba1cb4591a 100644 (file)
@@ -41,7 +41,7 @@
 &qspi {
        status = "okay";
        flash@0 {
-               compatible = "m25p80", "spi-flash"; /* 32MB FIXME */
+               compatible = "m25p80", "jedec,spi-nor"; /* 32MB FIXME */
                #address-cells = <1>;
                #size-cells = <1>;
                reg = <0x0>;
index 881aacc582536b281d6bdff4c0fc41053ce1b6ae..6ac8346d23d913e4c66ff50a7928442176acaca9 100644 (file)
@@ -41,7 +41,7 @@
 &qspi {
        status = "okay";
        flash@0 {
-               compatible = "m25p80", "spi-flash"; /* 32MB */
+               compatible = "m25p80", "jedec,spi-nor"; /* 32MB */
                #address-cells = <1>;
                #size-cells = <1>;
                reg = <0x0>;
index 7403f153e44729bfcb0462b1b3236a4e7fef0889..82c30a3fbef0e66d1bddc28186f8d17fbbe2b52a 100644 (file)
@@ -41,7 +41,7 @@
 &qspi {
        status = "okay";
        flash@0 {
-               compatible = "m25p80", "spi-flash"; /* 32MB */
+               compatible = "m25p80", "jedec,spi-nor"; /* 32MB */
                #address-cells = <1>;
                #size-cells = <1>;
                reg = <0x0>;
index 1a7975b551d13c4f3a16e1e2750e4f0713383119..0473503afafd8360399cd4696a682424e9b1228f 100644 (file)
@@ -42,7 +42,7 @@
 &qspi {
        status = "okay";
        flash@0 {
-               compatible = "m25p80", "spi-flash"; /* 32MB */
+               compatible = "m25p80", "jedec,spi-nor"; /* 32MB */
                #address-cells = <1>;
                #size-cells = <1>;
                reg = <0x0>;
index 9768dfe0446c45d68bd12db6ef1fff7e1ca6a4d0..8824f5cc02729535f31428176fe5a02d273e0396 100644 (file)
 &qspi {
        status = "okay";
        flash@0 {
-               compatible = "m25p80", "spi-flash"; /* Micron MT25QU512ABB8ESF */
+               compatible = "m25p80", "jedec,spi-nor"; /* Micron MT25QU512ABB8ESF */
                #address-cells = <1>;
                #size-cells = <1>;
                reg = <0x0>;
index 9afbbb63b49b54a80045bcbc97caceb1999590d8..84c2904dc202a59e2fcdb47f367140fa3657e156 100644 (file)
 &qspi {
        status = "okay";
        flash@0 {
-               compatible = "m25p80", "spi-flash"; /* 32MB */
+               compatible = "m25p80", "jedec,spi-nor"; /* 32MB */
                #address-cells = <1>;
                #size-cells = <1>;
                reg = <0x0>;
index 0e96a3618821f3da5174aec4d4177e3b20da9ae8..6e22871713139517ad5f7f1d2e659690233bd946 100644 (file)
        status = "okay";
        is-dual = <1>;
        flash@0 {
-               compatible = "m25p80", "spi-flash"; /* 32MB */
+               compatible = "m25p80", "jedec,spi-nor"; /* 32MB */
                #address-cells = <1>;
                #size-cells = <1>;
                reg = <0x0>;
index 431dff52fe6434f9cd705639f8afa7846a2f982e..c7a3cdcf61df9fdbef05134766eddea8856b01c4 100644 (file)
 &qspi {
        status = "okay";
        flash@0 {
-               compatible = "m25p80", "spi-flash"; /* n25q512a 128MiB */
+               compatible = "m25p80", "jedec,spi-nor"; /* n25q512a 128MiB */
                #address-cells = <1>;
                #size-cells = <1>;
                reg = <0x0>;
index 623d2c96cda4f193777dcf67bfadb282d0862cfd..7df16b047ceb01b595313dee316bc194eb94db51 100644 (file)
 &qspi {
        status = "okay";
        flash@0 {
-               compatible = "m25p80", "spi-flash"; /* n25q512a 128MiB */
+               compatible = "m25p80", "jedec,spi-nor"; /* n25q512a 128MiB */
                #address-cells = <1>;
                #size-cells = <1>;
                reg = <0x0>;
index 00f6e30ef34d17212126eb39b90dd9c4607c7812..9fd3953fb44bb1ff578128f7f518b0fc0cffbeb9 100644 (file)
        status = "okay";
        is-dual = <1>;
        flash@0 {
-               compatible = "m25p80", "spi-flash"; /* 32MB */
+               compatible = "m25p80", "jedec,spi-nor"; /* 32MB */
                #address-cells = <1>;
                #size-cells = <1>;
                reg = <0x0>;
index 58021be9bfda357c1060a7cec77f932c8087172d..2e28a3934fd307d39993d3aaf5a63a8e1f60c44b 100644 (file)
        status = "okay";
        is-dual = <1>;
        flash@0 {
-               compatible = "m25p80", "spi-flash"; /* 32MB */
+               compatible = "m25p80", "jedec,spi-nor"; /* 32MB */
                #address-cells = <1>;
                #size-cells = <1>;
                reg = <0x0>;
index d8ddecc0bd2f4a9356164196116ee2d53cebe8ff..15a5b641ffa259d3f525520bc2efec1e4e47702a 100644 (file)
 #define MT41K128MJT187E_PHY_FIFO_WE            0x100
 #define MT41K128MJT187E_IOCTRL_VALUE           0x18B
 
+/* Micron MT41K128M16JT-125 IT:K (256 MB) at 400MHz */
+#define MT41K128M16JT125K_EMIF_READ_LATENCY     0x07
+#define MT41K128M16JT125K_EMIF_TIM1             0x0AAAD4DB
+#define MT41K128M16JT125K_EMIF_TIM2             0x2A437FDA
+#define MT41K128M16JT125K_EMIF_TIM3             0x501F83FF
+#define MT41K128M16JT125K_EMIF_SDCFG            0x61A052B2
+#define MT41K128M16JT125K_EMIF_SDREF            0x00000C30
+#define MT41K128M16JT125K_ZQ_CFG                0x50074BE4
+#define MT41K128M16JT125K_RATIO                 0x80
+#define MT41K128M16JT125K_INVERT_CLKOUT         0x0
+#define MT41K128M16JT125K_RD_DQS                0x38
+#define MT41K128M16JT125K_WR_DQS                0x46
+#define MT41K128M16JT125K_PHY_WR_DATA           0x7D
+#define MT41K128M16JT125K_PHY_FIFO_WE           0x9B
+#define MT41K128M16JT125K_IOCTRL_VALUE          0x18B
+
 /* Micron MT41J64M16JT-125 */
 #define MT41J64MJT125_EMIF_SDCFG               0x61C04A32
 
index 4baba38b0045c4e327355c2a7d59f70fda748e50..8c916e8c752994199ea84397c072c8bb8117d685 100644 (file)
@@ -28,6 +28,8 @@
 #define SUNXI_BOOTED_FROM_NAND 1
 #define SUNXI_BOOTED_FROM_MMC2 2
 #define SUNXI_BOOTED_FROM_SPI  3
+#define SUNXI_BOOTED_FROM_MMC0_HIGH    0x10
+#define SUNXI_BOOTED_FROM_MMC2_HIGH    0x12
 
 /* boot head definition from sun4i boot code */
 struct boot_file_head {
index 3bd73a01f3bf939ce99bdfc9fcbd0e3decfbd0d2..72184fd60834db22d0d7b6489f6fc2340951abca 100644 (file)
@@ -22,6 +22,9 @@ enum mxc_clock {
 void enable_ocotp_clk(unsigned char enable);
 unsigned int mxc_get_clock(enum mxc_clock clk);
 u32 get_lpuart_clk(void);
+#ifdef CONFIG_SYS_I2C_MXC
+int enable_i2c_clk(unsigned char enable, unsigned int i2c_num);
+#endif
 
 #define imx_get_fecclk() mxc_get_clock(MXC_FEC_CLK)
 
index 9fce49ddc6489396c947c1c3c5241cb8d59d50c8..0c9ed529338e753ece7bb58927f94e6d0d1ce495 100644 (file)
@@ -200,6 +200,7 @@ struct anadig_reg {
 #define CCM_REG_CTRL_MASK                      0xffffffff
 #define CCM_CCGR0_UART0_CTRL_MASK               (0x3 << 14)
 #define CCM_CCGR0_UART1_CTRL_MASK              (0x3 << 16)
+#define CCM_CCGR0_UART2_CTRL_MASK              (0x3 << 18)
 #define CCM_CCGR0_DSPI0_CTRL_MASK              (0x3 << 24)
 #define CCM_CCGR0_DSPI1_CTRL_MASK              (0x3 << 26)
 #define CCM_CCGR1_USBC0_CTRL_MASK       (0x3 << 8)
index c7da2b8a5e31f7fc2c07eb45ef198b0b6ffb4f15..03e3cecb95a090c35a4311238d3d31b8857370cb 100644 (file)
@@ -10,6 +10,8 @@
 #ifndef __ASM_ARCH_VF610_DDRMC_H
 #define __ASM_ARCH_VF610_DDRMC_H
 
+#include <asm/arch/iomux-vf610.h>
+
 struct ddr3_jedec_timings {
        u8 tinit;
        u32 trst_pwron;
index 5d1f63c98bfeaa64ab63efee47f59bd5fa7253b4..ae0a187c4db85e7132df9e0219bc1e1a9c985982 100644 (file)
 #define SRC_SRSR_WDOG_M4                               (0x1 << 4)
 #define SRC_SRSR_WDOG_A5                               (0x1 << 3)
 #define SRC_SRSR_POR_RST                               (0x1 << 0)
+#define SRC_SBMR1_BOOTCFG1_SDMMC        BIT(6)
+#define SRC_SBMR1_BOOTCFG1_MMC          BIT(4)
 #define SRC_SBMR2_BMOD_MASK             (0x3 << 24)
 #define SRC_SBMR2_BMOD_SHIFT            24
 #define SRC_SBMR2_BMOD_FUSES            0x0
index 01bc2998b81ece22821d4dce0e527595b7cea5d3..8ba03e5a17f2fcbc002f9f9150e1245a655b78c7 100644 (file)
@@ -132,10 +132,14 @@ enum {
        VF610_PAD_PTD24__GPIO_70                = IOMUX_PAD(0x0118, 0x0118, 0, __NA_, 0, VF610_GPIO_PAD_CTRL),
        VF610_PAD_PTD23__NF_IO7                 = IOMUX_PAD(0x011c, 0x011c, 2, __NA_, 0, VF610_NFC_IO_PAD_CTRL),
        VF610_PAD_PTD0__QSPI0_A_QSCK            = IOMUX_PAD(0x013c, 0x013c, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
+       VF610_PAD_PTD0__UART2_TX                = IOMUX_PAD(0x013c, 0x013c, 2, 0x38c, 2, VF610_UART_PAD_CTRL),
        VF610_PAD_PTD1__QSPI0_A_CS0             = IOMUX_PAD(0x0140, 0x0140, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
+       VF610_PAD_PTD1__UART2_RX                = IOMUX_PAD(0x0140, 0x0140, 2, 0x388, 2, VF610_UART_PAD_CTRL),
        VF610_PAD_PTD2__QSPI0_A_DATA3           = IOMUX_PAD(0x0144, 0x0144, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
+       VF610_PAD_PTD2__GPIO_81                 = IOMUX_PAD(0x0144, 0x0144, 0, __NA_, 0, VF610_GPIO_PAD_CTRL),
        VF610_PAD_PTD3__QSPI0_A_DATA2           = IOMUX_PAD(0x0148, 0x0148, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
-       VF610_PAD_PTD4__GPIO_83         = IOMUX_PAD(0x014C, 0x014C, 0, __NA_, 0, VF610_GPIO_PAD_CTRL),
+       VF610_PAD_PTD3__GPIO_82                 = IOMUX_PAD(0x0148, 0x0148, 0, __NA_, 0, VF610_GPIO_PAD_CTRL),
+       VF610_PAD_PTD4__GPIO_83                 = IOMUX_PAD(0x014C, 0x014C, 0, __NA_, 0, VF610_GPIO_PAD_CTRL),
        VF610_PAD_PTD4__QSPI0_A_DATA1           = IOMUX_PAD(0x014c, 0x014c, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
        VF610_PAD_PTD5__QSPI0_A_DATA0           = IOMUX_PAD(0x0150, 0x0150, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
        VF610_PAD_PTD7__QSPI0_B_QSCK            = IOMUX_PAD(0x0158, 0x0158, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
index 3039e66bf9f2250117d075667a3f3dea5f108607..992a84152cfae333edd0606912e6e1533276714b 100644 (file)
@@ -1,5 +1,6 @@
 #if !defined(CONFIG_ARCH_UNIPHIER) && !defined(CONFIG_ARCH_STI) && \
-       !defined(CONFIG_ARCH_K3)
+       !defined(CONFIG_ARCH_K3) && !defined(CONFIG_ARCH_BCM6858) && \
+       !defined(CONFIG_ARCH_BCM63158)
 #include <asm/arch/gpio.h>
 #endif
 #include <asm-generic/gpio.h>
index 12bc7fbe06e83cd4ab442c81bd55d5368082eece..e6d27b69f936043a880826648d59f46bf36274b4 100644 (file)
@@ -122,6 +122,27 @@ static inline void __raw_readsl(unsigned long addr, void *data, int longlen)
 #define readl(c)       ({ u32 __v = __arch_getl(c); __iormb(); __v; })
 #define readq(c)       ({ u64 __v = __arch_getq(c); __iormb(); __v; })
 
+/*
+ * Relaxed I/O memory access primitives. These follow the Device memory
+ * ordering rules but do not guarantee any ordering relative to Normal memory
+ * accesses.
+ */
+#define readb_relaxed(c)       ({ u8  __r = __raw_readb(c); __r; })
+#define readw_relaxed(c)       ({ u16 __r = le16_to_cpu((__force __le16) \
+                                               __raw_readw(c)); __r; })
+#define readl_relaxed(c)       ({ u32 __r = le32_to_cpu((__force __le32) \
+                                               __raw_readl(c)); __r; })
+#define readq_relaxed(c)       ({ u64 __r = le64_to_cpu((__force __le64) \
+                                               __raw_readq(c)); __r; })
+
+#define writeb_relaxed(v, c)   ((void)__raw_writeb((v), (c)))
+#define writew_relaxed(v, c)   ((void)__raw_writew((__force u16) \
+                                                   cpu_to_le16(v), (c)))
+#define writel_relaxed(v, c)   ((void)__raw_writel((__force u32) \
+                                                   cpu_to_le32(v), (c)))
+#define writeq_relaxed(v, c)   ((void)__raw_writeq((__force u64) \
+                                                   cpu_to_le64(v), (c)))
+
 /*
  * The compiler seems to be incapable of optimising constants
  * properly.  Spell it out to the compiler in some cases.
index 812e6f85e4346e21b1df812b20bc9d4aef6a4238..d1a14ad7d348256fd14a165b6cd692b3b8606983 100644 (file)
@@ -26,4 +26,5 @@ extern size_t display_count;
 #endif
 
 int ipu_set_ldb_clock(int rate);
+int ipu_displays_init(void);
 #endif
index d23044a1c368a1d7fd5435db1ba84280f18be5d5..50582c972b7ab2cabe6adbc737a1bbfcdda8b907 100644 (file)
@@ -6,6 +6,37 @@
 #define __secure __attribute__ ((section ("._secure.text")))
 #define __secure_data __attribute__ ((section ("._secure.data")))
 
+#ifndef __ASSEMBLY__
+
+typedef struct secure_svc_tbl {
+       u32     id;
+#ifdef CONFIG_ARMV8_PSCI
+       u8      pad[4];
+#endif
+       void    *func;
+} secure_svc_tbl_t;
+
+/*
+ * Macro to declare a SiP function service in '_secure_svc_tbl_entries' section
+ */
+#define DECLARE_SECURE_SVC(_name, _id, _fn) \
+       static const secure_svc_tbl_t __secure_svc_ ## _name \
+               __attribute__((used, section("._secure_svc_tbl_entries"))) \
+                        = { \
+                               .id = _id, \
+                               .func = _fn }
+
+#else
+
+#ifdef CONFIG_ARMV8_PSCI
+#define SECURE_SVC_TBL_OFFSET          16
+#else
+#define SECURE_SVC_TBL_OFFSET          8
+
+#endif
+
+#endif /* __ASSEMBLY__ */
+
 #if defined(CONFIG_ARMV7_SECURE_BASE) || defined(CONFIG_ARMV8_SECURE_BASE)
 /*
  * Warning, horror ahead.
index 458319ab4878865dec7f8f0f1e5324e2a28968ff..0bfdb8d93d256656d8fc2f5969d51fec56c47ef3 100644 (file)
@@ -25,6 +25,11 @@ int disable_interrupts(void)
        return 0;
 }
 
+static void show_efi_loaded_images(struct pt_regs *regs)
+{
+       efi_print_image_infos((void *)regs->elr);
+}
+
 void show_regs(struct pt_regs *regs)
 {
        int i;
@@ -49,6 +54,7 @@ void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr)
        efi_restore_gd();
        printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr);
        show_regs(pt_regs);
+       show_efi_loaded_images(pt_regs);
        panic("Resetting CPU ...\n");
 }
 
@@ -60,6 +66,7 @@ void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr)
        efi_restore_gd();
        printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr);
        show_regs(pt_regs);
+       show_efi_loaded_images(pt_regs);
        panic("Resetting CPU ...\n");
 }
 
@@ -71,6 +78,7 @@ void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr)
        efi_restore_gd();
        printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr);
        show_regs(pt_regs);
+       show_efi_loaded_images(pt_regs);
        panic("Resetting CPU ...\n");
 }
 
@@ -82,6 +90,7 @@ void do_bad_error(struct pt_regs *pt_regs, unsigned int esr)
        efi_restore_gd();
        printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr);
        show_regs(pt_regs);
+       show_efi_loaded_images(pt_regs);
        panic("Resetting CPU ...\n");
 }
 
@@ -93,6 +102,7 @@ void do_sync(struct pt_regs *pt_regs, unsigned int esr)
        efi_restore_gd();
        printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr);
        show_regs(pt_regs);
+       show_efi_loaded_images(pt_regs);
        panic("Resetting CPU ...\n");
 }
 
@@ -104,6 +114,7 @@ void do_irq(struct pt_regs *pt_regs, unsigned int esr)
        efi_restore_gd();
        printf("\"Irq\" handler, esr 0x%08x\n", esr);
        show_regs(pt_regs);
+       show_efi_loaded_images(pt_regs);
        panic("Resetting CPU ...\n");
 }
 
@@ -115,6 +126,7 @@ void do_fiq(struct pt_regs *pt_regs, unsigned int esr)
        efi_restore_gd();
        printf("\"Fiq\" handler, esr 0x%08x\n", esr);
        show_regs(pt_regs);
+       show_efi_loaded_images(pt_regs);
        panic("Resetting CPU ...\n");
 }
 
@@ -129,5 +141,6 @@ void __weak do_error(struct pt_regs *pt_regs, unsigned int esr)
        efi_restore_gd();
        printf("\"Error\" handler, esr 0x%08x\n", esr);
        show_regs(pt_regs);
+       show_efi_loaded_images(pt_regs);
        panic("Resetting CPU ...\n");
 }
index 7603f527748f4232e184fbe60eb38ebecb4985e2..26d29c5324ac695c1b7ef3fb86b3032373eef8a3 100644 (file)
@@ -26,9 +26,10 @@ ENTRY(relocate_code)
        /*
         * Copy u-boot from flash to RAM
         */
-       adr     x1, __image_copy_start  /* x1 <- Run &__image_copy_start */
-       subs    x9, x0, x1              /* x8 <- Run to copy offset */
-       b.eq    relocate_done           /* skip relocation */
+       adrp    x1, __image_copy_start          /* x1 <- address bits [31:12] */
+       add     x1, x1, :lo12:__image_copy_start/* x1 <- address bits [11:00] */
+       subs    x9, x0, x1                      /* x9 <- Run to copy offset */
+       b.eq    relocate_done                   /* skip relocation */
        /*
         * Don't ldr x1, __image_copy_start here, since if the code is already
         * running at an address other than it was linked to, that instruction
@@ -42,8 +43,10 @@ ENTRY(relocate_code)
        ldr     x1, _TEXT_BASE          /* x1 <- Linked &__image_copy_start */
        subs    x9, x0, x1              /* x9 <- Link to copy offset */
 
-       adr     x1, __image_copy_start  /* x1 <- Run &__image_copy_start */
-       adr     x2, __image_copy_end    /* x2 <- Run &__image_copy_end */
+       adrp    x1, __image_copy_start          /* x1 <- address bits [31:12] */
+       add     x1, x1, :lo12:__image_copy_start/* x1 <- address bits [11:00] */
+       adrp    x2, __image_copy_end            /* x2 <- address bits [31:12] */
+       add     x2, x2, :lo12:__image_copy_end  /* x2 <- address bits [11:00] */
 copy_loop:
        ldp     x10, x11, [x1], #16     /* copy from source address [x1] */
        stp     x10, x11, [x0], #16     /* copy to   target address [x0] */
@@ -54,8 +57,10 @@ copy_loop:
        /*
         * Fix .rela.dyn relocations
         */
-       adr     x2, __rel_dyn_start     /* x2 <- Run &__rel_dyn_start */
-       adr     x3, __rel_dyn_end       /* x3 <- Run &__rel_dyn_end */
+       adrp    x2, __rel_dyn_start             /* x2 <- address bits [31:12] */
+       add     x2, x2, :lo12:__rel_dyn_start   /* x2 <- address bits [11:00] */
+       adrp    x3, __rel_dyn_end               /* x3 <- address bits [31:12] */
+       add     x3, x3, :lo12:__rel_dyn_end     /* x3 <- address bits [11:00] */
 fixloop:
        ldp     x0, x1, [x2], #16       /* (x0,x1) <- (SRC location, fixup) */
        ldr     x4, [x2], #8            /* x4 <- addend */
index a089e9439ec72a2781debc51e794f8f1a851ca68..c3b21b7557e64828d2d37a237ba5493b0354ea54 100644 (file)
@@ -180,6 +180,17 @@ config TARGET_SAMA5D27_SOM1_EK
          processor-based SAMA5D2 MPU with up to 1 Gbit DDR2-SDRAM
          in a single package.
 
+config TARGET_SAMA5D2_ICP
+       bool "SAMA5D2 Industrial Connectivity Platform (ICP)"
+       select CPU_V7A
+       select SUPPORT_SPL
+       select BOARD_EARLY_INIT_F
+       select BOARD_LATE_INIT
+       help
+         The SAMA5D2 ICP embeds SAMA5D27 rev. C SoC, together with
+         a 64Mbit QSPI flash, 3xMikrobus connectors, 4xUSB ,
+         EtherCat and WILC3000 devices on board.
+
 config TARGET_SAMA5D3_XPLAINED
        bool "SAMA5D3 Xplained board"
        select BOARD_EARLY_INIT_F
@@ -281,6 +292,7 @@ source "board/atmel/at91sam9x5ek/Kconfig"
 source "board/atmel/sama5d2_ptc_ek/Kconfig"
 source "board/atmel/sama5d2_xplained/Kconfig"
 source "board/atmel/sama5d27_som1_ek/Kconfig"
+source "board/atmel/sama5d2_icp/Kconfig"
 source "board/atmel/sama5d3_xplained/Kconfig"
 source "board/atmel/sama5d3xek/Kconfig"
 source "board/atmel/sama5d4_xplained/Kconfig"
index 8631fbd481e0bcf56d622fb65aa6bf7f3a4c6c1c..ec09ef240feedb6326460c08efe5d89b71500f95 100644 (file)
@@ -23,7 +23,7 @@ config IMX_RDC
 
 config IMX_BOOTAUX
        bool "Support boot auxiliary core"
-       depends on ARCH_MX7 || ARCH_MX6
+       depends on ARCH_MX7 || ARCH_MX6 || ARCH_VF610
        help
          bootaux [addr] to boot auxiliary core.
 
index 953fe53cb49a3a0d4a80e2e03f34cf29c3e21688..22a371a212d6c471d8fc6b5854152c3d738cf651 100644 (file)
@@ -4,6 +4,17 @@
 #include <linux/errno.h>
 #include <asm/mach-imx/video.h>
 
+#ifdef CONFIG_IMX_HDMI
+#include <asm/arch/mxc_hdmi.h>
+#include <asm/io.h>
+
+int detect_hdmi(struct display_info_t const *dev)
+{
+       struct hdmi_regs *hdmi  = (struct hdmi_regs *)HDMI_ARB_BASE_ADDR;
+       return readb(&hdmi->phy_stat0) & HDMI_DVI_STAT;
+}
+#endif
+
 int board_video_skip(void)
 {
        int i;
@@ -42,6 +53,11 @@ int board_video_skip(void)
                               displays[i].mode.name,
                               displays[i].mode.xres,
                               displays[i].mode.yres);
+
+#ifdef CONFIG_IMX_HDMI
+                       if (!strcmp(displays[i].mode.name, "HDMI"))
+                               imx_enable_hdmi_phy();
+#endif
                } else
                        printf("LCD %s cannot be configured: %d\n",
                               displays[i].mode.name, ret);
@@ -53,12 +69,7 @@ int board_video_skip(void)
        return ret;
 }
 
-#ifdef CONFIG_IMX_HDMI
-#include <asm/arch/mxc_hdmi.h>
-#include <asm/io.h>
-int detect_hdmi(struct display_info_t const *dev)
+int ipu_displays_init(void)
 {
-       struct hdmi_regs *hdmi  = (struct hdmi_regs *)HDMI_ARB_BASE_ADDR;
-       return readb(&hdmi->phy_stat0) & HDMI_DVI_STAT;
+       return board_video_skip();
 }
-#endif
index a5553190b431e7292452aeed154cc4540e3e2f80..77cd15f388c40cb68b006dd27f9bd2d040ae3f53 100644 (file)
@@ -83,10 +83,8 @@ void board_init_f(ulong dummy)
 
 #ifdef CONFIG_K3_AM654_DDRSS
        ret = uclass_get_device(UCLASS_RAM, 0, &dev);
-       if (ret) {
-               printf("DRAM init failed: %d\n", ret);
-               return;
-       }
+       if (ret)
+               panic("DRAM init failed: %d\n", ret);
 #endif
 }
 
index 5909bbfa8f5ac5dce697c496edec86aa2543a457..03f01d07eacf7c551f234c873a0d8a78a4e3e0ce 100644 (file)
 #include "common.h"
 #include <dm.h>
 #include <remoteproc.h>
+#include <linux/soc/ti/ti_sci_protocol.h>
+#include <fdt_support.h>
+
+struct ti_sci_handle *get_ti_sci_handle(void)
+{
+       struct udevice *dev;
+       int ret;
+
+       ret = uclass_get_device_by_name(UCLASS_FIRMWARE, "dmsc", &dev);
+       if (ret)
+               panic("Failed to get SYSFW (%d)\n", ret);
+
+       return (struct ti_sci_handle *)ti_sci_get_handle_from_sysfw(dev);
+}
 
 #ifdef CONFIG_SYS_K3_SPL_ATF
 void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
@@ -42,3 +56,77 @@ void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
                asm volatile("wfe");
 }
 #endif
+
+#if defined(CONFIG_OF_LIBFDT)
+int fdt_fixup_msmc_ram(void *blob, char *parent_path, char *node_name)
+{
+       u64 msmc_start = 0, msmc_end = 0, msmc_size, reg[2];
+       struct ti_sci_handle *ti_sci = get_ti_sci_handle();
+       int ret, node, subnode, len, prev_node;
+       u32 range[4], addr, size;
+       const fdt32_t *sub_reg;
+
+       ti_sci->ops.core_ops.query_msmc(ti_sci, &msmc_start, &msmc_end);
+       msmc_size = msmc_end - msmc_start + 1;
+       debug("%s: msmc_start = 0x%llx, msmc_size = 0x%llx\n", __func__,
+             msmc_start, msmc_size);
+
+       /* find or create "msmc_sram node */
+       ret = fdt_path_offset(blob, parent_path);
+       if (ret < 0)
+               return ret;
+
+       node = fdt_find_or_add_subnode(blob, ret, node_name);
+       if (node < 0)
+               return node;
+
+       ret = fdt_setprop_string(blob, node, "compatible", "mmio-sram");
+       if (ret < 0)
+               return ret;
+
+       reg[0] = cpu_to_fdt64(msmc_start);
+       reg[1] = cpu_to_fdt64(msmc_size);
+       ret = fdt_setprop(blob, node, "reg", reg, sizeof(reg));
+       if (ret < 0)
+               return ret;
+
+       fdt_setprop_cell(blob, node, "#address-cells", 1);
+       fdt_setprop_cell(blob, node, "#size-cells", 1);
+
+       range[0] = 0;
+       range[1] = cpu_to_fdt32(msmc_start >> 32);
+       range[2] = cpu_to_fdt32(msmc_start & 0xffffffff);
+       range[3] = cpu_to_fdt32(msmc_size);
+       ret = fdt_setprop(blob, node, "ranges", range, sizeof(range));
+       if (ret < 0)
+               return ret;
+
+       subnode = fdt_first_subnode(blob, node);
+       prev_node = 0;
+
+       /* Look for invalid subnodes and delete them */
+       while (subnode >= 0) {
+               sub_reg = fdt_getprop(blob, subnode, "reg", &len);
+               addr = fdt_read_number(sub_reg, 1);
+               sub_reg++;
+               size = fdt_read_number(sub_reg, 1);
+               debug("%s: subnode = %d, addr = 0x%x. size = 0x%x\n", __func__,
+                     subnode, addr, size);
+               if (addr + size > msmc_size ||
+                   !strncmp(fdt_get_name(blob, subnode, &len), "sysfw", 5) ||
+                   !strncmp(fdt_get_name(blob, subnode, &len), "l3cache", 7)) {
+                       fdt_del_node(blob, subnode);
+                       debug("%s: deleting subnode %d\n", __func__, subnode);
+                       if (!prev_node)
+                               subnode = fdt_first_subnode(blob, node);
+                       else
+                               subnode = fdt_next_subnode(blob, prev_node);
+               } else {
+                       prev_node = subnode;
+                       subnode = fdt_next_subnode(blob, prev_node);
+               }
+       }
+
+       return 0;
+}
+#endif
index 0b2007981a498648742bcdf3185f49cda5e72955..018725b4d128fbafd46df8317ac52c5be333201c 100644 (file)
@@ -10,5 +10,6 @@
 void sdelay(unsigned long loops);
 u32 wait_on_value(u32 read_bit_mask, u32 match_value, void *read_addr,
                  u32 bound);
-
+struct ti_sci_handle *get_ti_sci_handle(void);
+int fdt_fixup_msmc_ram(void *blob, char *parent_path, char *node_name);
 #endif
index d24596eccb0dfd7a94ef6622242e005907c5c21a..e06eba5aea1fb25c27528559326f1514855ef607 100644 (file)
@@ -9,18 +9,24 @@ config TARGET_K2HK_EVM
        select SPL_BOARD_INIT if SPL
        select CMD_DDR3
        imply DM_I2C
+       imply SOC_TI
+       imply TI_KEYSTONE_SERDES
 
 config TARGET_K2E_EVM
        bool "TI Keystone 2 Edison EVM"
        select SPL_BOARD_INIT if SPL
        select CMD_DDR3
        imply DM_I2C
+       imply SOC_TI
+       imply TI_KEYSTONE_SERDES
 
 config TARGET_K2L_EVM
        bool "TI Keystone 2 Lamar EVM"
        select SPL_BOARD_INIT if SPL
        select CMD_DDR3
        imply DM_I2C
+       imply SOC_TI
+       imply TI_KEYSTONE_SERDES
 
 config TARGET_K2G_EVM
        bool "TI Keystone 2 Galileo EVM"
@@ -29,6 +35,8 @@ config TARGET_K2G_EVM
         select TI_I2C_BOARD_DETECT
        select CMD_DDR3
        imply DM_I2C
+       imply SOC_TI
+       imply TI_KEYSTONE_SERDES
 
 endchoice
 
index 8b902641ec9ac84cf0add25555451448512cea0f..971c081bb3c3b9303ae05ab3fcacf1162280366f 100644 (file)
 
 #define K2G_GPIO0_BASE                 0X02603000
 #define K2G_GPIO1_BASE                 0X0260a000
+#define K2G_GPIO0_BANK0_BASE           K2G_GPIO0_BASE + 0x10
 #define K2G_GPIO1_BANK2_BASE           K2G_GPIO1_BASE + 0x38
 #define K2G_GPIO_DIR_OFFSET            0x0
+#define K2G_GPIO_OUTDATA_OFFSET                0x4
 #define K2G_GPIO_SETDATA_OFFSET                0x8
+#define K2G_GPIO_CLRDATA_OFFSET                0xC
 
 /* BOOTCFG RESETMUX8 */
 #define KS2_RSTMUX8                    (KS2_DEVICE_STATE_CTRL_BASE + 0x328)
index 809b72d5bf9dd08dc3eab825b0d5e9f03b6f9d15..67d47f8172167ea30423c0bff401793bbb537d43 100644 (file)
 #define PIN_PTU        (1 << 17) /* pull up */
 #define PIN_PTD        (0 << 17) /* pull down */
 
+#define BUFFER_CLASS_B (0 << 19)
+#define BUFFER_CLASS_C (1 << 19)
+#define BUFFER_CLASS_D (2 << 19)
+#define BUFFER_CLASS_E (3 << 19)
+
 #define MODE(m)        ((m) & 0x7)
 #define MAX_PIN_N      260
 
index d54de53f31dc049c785bd3ca7c043aa790f02f56..8f8e3003854c213d7b04c2e974058230f90b605b 100644 (file)
@@ -46,69 +46,31 @@ unsigned int kw_winctrl_calcsize(unsigned int sizeval)
        return (0x0000ffff & j);
 }
 
-/*
- * kw_config_adr_windows - Configure address Windows
- *
- * There are 8 address windows supported by Kirkwood Soc to addess different
- * devices. Each window can be configured for size, BAR and remap addr
- * Below configuration is standard for most of the cases
- *
- * If remap function not used, remap_lo must be set as base
- *
- * Reference Documentation:
- * Mbus-L to Mbus Bridge Registers Configuration.
- * (Sec 25.1 and 25.3 of Datasheet)
- */
-int kw_config_adr_windows(void)
-{
-       struct kwwin_registers *winregs =
-               (struct kwwin_registers *)KW_CPU_WIN_BASE;
-
+static struct mbus_win windows[] = {
        /* Window 0: PCIE MEM address space */
-       writel(KWCPU_WIN_CTRL_DATA(1024 * 1024 * 256, KWCPU_TARGET_PCIE,
-               KWCPU_ATTR_PCIE_MEM, KWCPU_WIN_ENABLE), &winregs[0].ctrl);
-
-       writel(KW_DEFADR_PCI_MEM, &winregs[0].base);
-       writel(KW_DEFADR_PCI_MEM, &winregs[0].remap_lo);
-       writel(0x0, &winregs[0].remap_hi);
+       { KW_DEFADR_PCI_MEM, 1024 * 1024 * 256,
+         KWCPU_TARGET_PCIE, KWCPU_ATTR_PCIE_MEM },
 
        /* Window 1: PCIE IO address space */
-       writel(KWCPU_WIN_CTRL_DATA(1024 * 64, KWCPU_TARGET_PCIE,
-               KWCPU_ATTR_PCIE_IO, KWCPU_WIN_ENABLE), &winregs[1].ctrl);
-       writel(KW_DEFADR_PCI_IO, &winregs[1].base);
-       writel(KW_DEFADR_PCI_IO_REMAP, &winregs[1].remap_lo);
-       writel(0x0, &winregs[1].remap_hi);
+       { KW_DEFADR_PCI_IO, 1024 * 64,
+         KWCPU_TARGET_PCIE, KWCPU_ATTR_PCIE_IO },
 
        /* Window 2: NAND Flash address space */
-       writel(KWCPU_WIN_CTRL_DATA(1024 * 1024 * 128, KWCPU_TARGET_MEMORY,
-               KWCPU_ATTR_NANDFLASH, KWCPU_WIN_ENABLE), &winregs[2].ctrl);
-       writel(KW_DEFADR_NANDF, &winregs[2].base);
-       writel(KW_DEFADR_NANDF, &winregs[2].remap_lo);
-       writel(0x0, &winregs[2].remap_hi);
+       { KW_DEFADR_NANDF, 1024 * 1024 * 128,
+         KWCPU_TARGET_MEMORY, KWCPU_ATTR_NANDFLASH },
 
        /* Window 3: SPI Flash address space */
-       writel(KWCPU_WIN_CTRL_DATA(1024 * 1024 * 128, KWCPU_TARGET_MEMORY,
-               KWCPU_ATTR_SPIFLASH, KWCPU_WIN_ENABLE), &winregs[3].ctrl);
-       writel(KW_DEFADR_SPIF, &winregs[3].base);
-       writel(KW_DEFADR_SPIF, &winregs[3].remap_lo);
-       writel(0x0, &winregs[3].remap_hi);
+       { KW_DEFADR_SPIF, 1024 * 1024 * 128,
+         KWCPU_TARGET_MEMORY, KWCPU_ATTR_SPIFLASH },
 
        /* Window 4: BOOT Memory address space */
-       writel(KWCPU_WIN_CTRL_DATA(1024 * 1024 * 128, KWCPU_TARGET_MEMORY,
-               KWCPU_ATTR_BOOTROM, KWCPU_WIN_ENABLE), &winregs[4].ctrl);
-       writel(KW_DEFADR_BOOTROM, &winregs[4].base);
+       { KW_DEFADR_BOOTROM, 1024 * 1024 * 128,
+         KWCPU_TARGET_MEMORY, KWCPU_ATTR_BOOTROM },
 
        /* Window 5: Security SRAM address space */
-       writel(KWCPU_WIN_CTRL_DATA(1024 * 64, KWCPU_TARGET_SASRAM,
-               KWCPU_ATTR_SASRAM, KWCPU_WIN_ENABLE), &winregs[5].ctrl);
-       writel(KW_DEFADR_SASRAM, &winregs[5].base);
-
-       /* Window 6-7: Disabled */
-       writel(KWCPU_WIN_DISABLE, &winregs[6].ctrl);
-       writel(KWCPU_WIN_DISABLE, &winregs[7].ctrl);
-
-       return 0;
-}
+       { KW_DEFADR_SASRAM, 1024 * 64,
+         KWCPU_TARGET_SASRAM, KWCPU_ATTR_SASRAM },
+};
 
 /*
  * SYSRSTn Duration Counter Support
@@ -221,15 +183,13 @@ int arch_cpu_init(void)
        struct kwcpu_registers *cpureg =
                (struct kwcpu_registers *)KW_CPU_REG_BASE;
 
-       /* Linux expects` the internal registers to be at 0xf1000000 */
+       /* Linux expects the internal registers to be at 0xf1000000 */
        writel(KW_REGS_PHY_BASE, KW_OFFSET_REG);
 
        /* Enable and invalidate L2 cache in write through mode */
        writel(readl(&cpureg->l2_cfg) | 0x18, &cpureg->l2_cfg);
        invalidate_l2_cache();
 
-       kw_config_adr_windows();
-
 #ifdef CONFIG_KIRKWOOD_RGMII_PAD_1V8
        /*
         * Configures the I/O voltage of the pads connected to Egigabit
@@ -291,11 +251,13 @@ int arch_misc_init(void)
        temp |= (1 << 22);
        writefr_extra_feature_reg(temp);
 
-       icache_enable();
        /* Change reset vector to address 0x0 */
        temp = get_cr();
        set_cr(temp & ~CR_V);
 
+       /* Configure mbus windows */
+       mvebu_mbus_probe(windows, ARRAY_SIZE(windows));
+
        /* checks and execute resset to factory event */
        kw_sysrst_check();
 
index 91d21518d852fd816fc344dc796dbc9c8c10339c..ea42182cf9c609332bc5d88c5c829f28468a9f07 100644 (file)
@@ -63,12 +63,18 @@ enum kwcpu_attrib {
  */
 #define KW_DEFADR_PCI_MEM      0x90000000
 #define KW_DEFADR_PCI_IO       0xC0000000
-#define KW_DEFADR_PCI_IO_REMAP 0xC0000000
 #define KW_DEFADR_SASRAM       0xC8010000
 #define KW_DEFADR_NANDF                0xD8000000
 #define KW_DEFADR_SPIF         0xE8000000
 #define KW_DEFADR_BOOTROM      0xF8000000
 
+struct mbus_win {
+       u32 base;
+       u32 size;
+       u8 target;
+       u8 attr;
+};
+
 /*
  * read feroceon/sheeva core extra feature register
  * using co-proc instruction
@@ -135,13 +141,16 @@ struct kwgpio_registers {
        u32 irq_level;
 };
 
+/* Needed for dynamic (board-specific) mbus configuration */
+extern struct mvebu_mbus_state mbus_state;
+
 /*
  * functions
  */
 unsigned int mvebu_sdram_bar(enum memory_bank bank);
 unsigned int mvebu_sdram_bs(enum memory_bank bank);
 void mvebu_sdram_size_adjust(enum memory_bank bank);
-int kw_config_adr_windows(void);
+int mvebu_mbus_probe(struct mbus_win windows[], int count);
 void mvebu_config_gpio(unsigned int gpp0_oe_val, unsigned int gpp1_oe_val,
                unsigned int gpp0_oe, unsigned int gpp1_oe);
 int kw_config_mpp(unsigned int mpp0_7, unsigned int mpp8_15,
index 227707ae4c95c7afd47313766f268298951c5a79..1d7f2828cd38288d2937ea81756faad65c7406ef 100644 (file)
@@ -31,7 +31,7 @@
 #define KW_RTC_BASE                    (KW_REGISTER(0x10300))
 #define KW_NANDF_BASE                  (KW_REGISTER(0x10418))
 #define MVEBU_SPI_BASE                 (KW_REGISTER(0x10600))
-#define KW_CPU_WIN_BASE                        (KW_REGISTER(0x20000))
+#define MVEBU_CPU_WIN_BASE                     (KW_REGISTER(0x20000))
 #define KW_CPU_REG_BASE                        (KW_REGISTER(0x20100))
 #define MVEBU_TIMER_BASE                       (KW_REGISTER(0x20300))
 #define KW_REG_PCIE_BASE               (KW_REGISTER(0x40000))
index 7a733e95df31d6468f6a3aacff84154aa7d017e2..b5e91d4a7d40c5a118a1c8ada5a4129232a75e0c 100644 (file)
@@ -31,6 +31,16 @@ config TARGET_MT7629
          including DDR3, crypto engine, 3x3 11n/ac Wi-Fi, Gigabit Ethernet,
          switch, USB3.0, PCIe, UART, SPI, I2C and PWM.
 
+config TARGET_MT8516
+       bool "MediaTek MT8516 SoC"
+       select ARM64
+       select ARCH_MISC_INIT
+       help
+         The MediaTek MT8516 is a ARM64-based SoC with a quad-core Cortex-A35.
+         including UART, SPI, USB2.0 and OTG, SD and MMC cards, NAND, PWM,
+         Ethernet, IR TX/RX, I2C, I2S, S/PDIF, and built-in Wi-Fi / Bluetooth combo
+         chip and several DDR3 and DDR4 options.
+
 endchoice
 
 source "board/mediatek/mt7623/Kconfig"
index b5d3a379bccd3295f38cd80ff02a4145e763b68d..ea414dc407bd6fb21cb1438d56026bb945438a81 100644 (file)
@@ -5,3 +5,4 @@ obj-$(CONFIG_SPL_BUILD) += spl.o
 
 obj-$(CONFIG_TARGET_MT7623) += mt7623/
 obj-$(CONFIG_TARGET_MT7629) += mt7629/
+obj-$(CONFIG_TARGET_MT8516) += mt8516/
diff --git a/arch/arm/mach-mediatek/mt8516/Makefile b/arch/arm/mach-mediatek/mt8516/Makefile
new file mode 100644 (file)
index 0000000..886ab7e
--- /dev/null
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier:     GPL-2.0
+
+obj-y += init.o
diff --git a/arch/arm/mach-mediatek/mt8516/init.c b/arch/arm/mach-mediatek/mt8516/init.c
new file mode 100644 (file)
index 0000000..26a215a
--- /dev/null
@@ -0,0 +1,120 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 MediaTek Inc.
+ * Copyright (C) 2019 BayLibre, SAS
+ * Author: Fabien Parent <fparent@baylibre.com>
+ */
+
+#include <clk.h>
+#include <common.h>
+#include <dm.h>
+#include <fdtdec.h>
+#include <ram.h>
+#include <asm/arch/misc.h>
+#include <asm/armv8/mmu.h>
+#include <asm/sections.h>
+#include <dm/uclass.h>
+#include <linux/io.h>
+#include <dt-bindings/clock/mt8516-clk.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define WDOG_SWRST             0x10007014
+#define WDOG_SWRST_KEY         0x1209
+
+int dram_init(void)
+{
+       int ret;
+
+       ret = fdtdec_setup_memory_banksize();
+       if (ret)
+               return ret;
+
+       return fdtdec_setup_mem_size_base();
+}
+
+int dram_init_banksize(void)
+{
+       gd->bd->bi_dram[0].start = gd->ram_base;
+       gd->bd->bi_dram[0].size = gd->ram_size;
+
+       return 0;
+}
+
+int mtk_pll_early_init(void)
+{
+       unsigned long pll_rates[] = {
+               [CLK_APMIXED_ARMPLL] =   1300000000,
+               [CLK_APMIXED_MAINPLL] =  1501000000,
+               [CLK_APMIXED_UNIVPLL] =  1248000000,
+               [CLK_APMIXED_MMPLL] =     380000000,
+       };
+       struct udevice *dev;
+       int ret, i;
+
+       ret = uclass_get_device_by_driver(UCLASS_CLK,
+                       DM_GET_DRIVER(mtk_clk_apmixedsys), &dev);
+       if (ret)
+               return ret;
+
+       /* configure default rate then enable apmixedsys */
+       for (i = 0; i < ARRAY_SIZE(pll_rates); i++) {
+               struct clk clk = { .id = i, .dev = dev };
+
+               ret = clk_set_rate(&clk, pll_rates[i]);
+               if (ret)
+                       return ret;
+
+               ret = clk_enable(&clk);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
+int mtk_soc_early_init(void)
+{
+       int ret;
+
+       /* initialize early clocks */
+       ret = mtk_pll_early_init();
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+void reset_cpu(ulong addr)
+{
+       while (1) {
+               writel(WDOG_SWRST_KEY, WDOG_SWRST);
+               mdelay(5);
+       }
+}
+
+int print_cpuinfo(void)
+{
+       printf("CPU:   MediaTek MT8516\n");
+       return 0;
+}
+
+static struct mm_region mt8516_mem_map[] = {
+       {
+               /* DDR */
+               .virt = 0x40000000UL,
+               .phys = 0x40000000UL,
+               .size = 0x20000000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | PTE_BLOCK_OUTER_SHARE,
+       }, {
+               .virt = 0x00000000UL,
+               .phys = 0x00000000UL,
+               .size = 0x20000000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+                        PTE_BLOCK_NON_SHARE |
+                        PTE_BLOCK_PXN | PTE_BLOCK_UXN
+       }, {
+               0,
+       }
+};
+struct mm_region *mem_map = mt8516_mem_map;
index 7dda04e0e34e11f24c2218e76a9ecc12647f8c66..f5fd60d784560336ddd4170e10ffaff83f0c8f8c 100644 (file)
@@ -9,10 +9,10 @@ config ARMADA_32BIT
        select ARCH_MISC_INIT
        select BOARD_EARLY_INIT_F
        select CPU_V7A
-       select SPL_DM
-       select SPL_DM_SEQ_ALIAS
-       select SPL_OF_CONTROL
-       select SPL_SIMPLE_BUS
+       select SPL_DM if SPL
+       select SPL_DM_SEQ_ALIAS if SPL
+       select SPL_OF_CONTROL if SPL
+       select SPL_SIMPLE_BUS if SPL
        select SUPPORT_SPL
 
 config ARMADA_64BIT
@@ -46,7 +46,7 @@ config ARMADA_8K
 # Armada PLL frequency (used for NAND clock generation)
 config SYS_MVEBU_PLL_CLOCK
        int
-       default "2000000000" if ARMADA_XP || ARMADA_3700 || ARMADA_8K
+       default "2000000000" if ARMADA_XP || ARMADA_3700 || ARMADA_8K || ARMADA_MSYS
        default "1000000000" if ARMADA_38X || ARMADA_375
 
 # Armada XP/38x SoC types...
@@ -63,6 +63,22 @@ config MV78460
        bool
        select ARMADA_XP
 
+config ARMADA_MSYS
+       bool
+       select ARMADA_32BIT
+
+config 98DX4251
+       bool
+       select ARMADA_MSYS
+
+config 98DX3336
+       bool
+       select ARMADA_MSYS
+
+config 98DX3236
+       bool
+       select ARMADA_MSYS
+
 config 88F6820
        bool
        select ARMADA_38X
@@ -136,6 +152,10 @@ config TARGET_X530
        bool "Support Allied Telesis x530"
        select 88F6820
 
+config TARGET_DB_XC3_24G4XG
+       bool "Support DB-XC3-24G4XG"
+       select 98DX3336
+
 endchoice
 
 config SYS_BOARD
@@ -154,6 +174,7 @@ config SYS_BOARD
        default "theadorable" if TARGET_THEADORABLE
        default "a38x" if TARGET_CONTROLCENTERDC
        default "x530" if TARGET_X530
+       default "db-xc3-24g4xg" if TARGET_DB_XC3_24G4XG
 
 config SYS_CONFIG_NAME
        default "clearfog" if TARGET_CLEARFOG
@@ -171,6 +192,7 @@ config SYS_CONFIG_NAME
        default "turris_mox" if TARGET_TURRIS_MOX
        default "controlcenterdc" if TARGET_CONTROLCENTERDC
        default "x530" if TARGET_X530
+       default "db-xc3-24g4xg" if TARGET_DB_XC3_24G4XG
 
 config SYS_VENDOR
        default "Marvell" if TARGET_DB_MV784MP_GP
@@ -179,6 +201,8 @@ config SYS_VENDOR
        default "Marvell" if TARGET_DB_88F6820_GP
        default "Marvell" if TARGET_DB_88F6820_AMC
        default "Marvell" if TARGET_MVEBU_ARMADA_8K
+       default "Marvell" if TARGET_DB_XC3_24G4XG
+       default "Marvell" if TARGET_MVEBU_DB_88F7040
        default "solidrun" if TARGET_CLEARFOG
        default "kobol" if TARGET_HELIOS4
        default "Synology" if TARGET_DS414
index ee2eca91348483fbd0f81ee990ae211ddb8ffd4c..02d3ce27ee74189ac0d156f39b56a98a0764d24f 100644 (file)
@@ -14,6 +14,7 @@ ifdef CONFIG_KIRKWOOD
 
 obj-y  = dram.o
 obj-y  += gpio.o
+obj-y  += mbus.o
 obj-y  += timer.o
 
 else # CONFIG_KIRKWOOD
@@ -24,6 +25,7 @@ ifndef CONFIG_SPL_BUILD
 obj-$(CONFIG_ARMADA_375) += ../../../drivers/ddr/marvell/axp/xor.o
 obj-$(CONFIG_ARMADA_38X) += ../../../drivers/ddr/marvell/a38x/xor.o
 obj-$(CONFIG_ARMADA_XP) += ../../../drivers/ddr/marvell/axp/xor.o
+obj-$(CONFIG_ARMADA_MSYS) += ../../../drivers/ddr/marvell/axp/xor.o
 obj-$(CONFIG_MVEBU_EFUSE) += efuse.o
 
 extra-y += kwbimage.cfg
index 919d05c88c7724113c512e53ae5f97a427dba1c0..c5b3df46aab765076a19fa6b43e67366f7e92156 100644 (file)
@@ -23,6 +23,11 @@ static struct mbus_win windows[] = {
        /* NOR */
        { MBUS_BOOTROM_BASE, MBUS_BOOTROM_SIZE,
          CPU_TARGET_DEVICEBUS_BOOTROM_SPI, CPU_ATTR_BOOTROM },
+
+#ifdef CONFIG_ARMADA_MSYS
+       /* DFX */
+       { MBUS_DFX_BASE, MBUS_DFX_SIZE, CPU_TARGET_DFX, 0 },
+#endif
 };
 
 void lowlevel_init(void)
@@ -121,6 +126,14 @@ static const struct sar_freq_modes sar_freq_tab[] = {
        { 0x13,  0x0, 2000, 1000, 933 },
        { 0xff, 0xff,    0,    0,   0 } /* 0xff marks end of array */
 };
+#elif defined(CONFIG_ARMADA_MSYS)
+static const struct sar_freq_modes sar_freq_tab[] = {
+       {  0x0, 0x0,  400,  400, 400 },
+       {  0x2, 0x0,  667,  333, 667 },
+       {  0x3, 0x0,  800,  400, 800 },
+       {  0x5, 0x0,  800,  400, 800 },
+       { 0xff, 0xff,    0,   0,   0 }  /* 0xff marks end of array */
+};
 #else
 /* SAR frequency values for Armada XP */
 static const struct sar_freq_modes sar_freq_tab[] = {
@@ -144,7 +157,7 @@ void get_sar_freq(struct sar_freq_modes *sar_freq)
        u32 freq;
        int i;
 
-#if defined(CONFIG_ARMADA_375)
+#if defined(CONFIG_ARMADA_375) || defined(CONFIG_ARMADA_MSYS)
        val = readl(CONFIG_SAR2_REG);   /* SAR - Sample At Reset */
 #else
        val = readl(CONFIG_SAR_REG);    /* SAR - Sample At Reset */
@@ -160,7 +173,7 @@ void get_sar_freq(struct sar_freq_modes *sar_freq)
 #endif
        for (i = 0; sar_freq_tab[i].val != 0xff; i++) {
                if (sar_freq_tab[i].val == freq) {
-#if defined(CONFIG_ARMADA_375) || defined(CONFIG_ARMADA_38X)
+#if defined(CONFIG_ARMADA_375) || defined(CONFIG_ARMADA_38X) || defined(CONFIG_ARMADA_MSYS)
                        *sar_freq = sar_freq_tab[i];
                        return;
 #else
@@ -270,6 +283,20 @@ int print_cpuinfo(void)
                }
        }
 
+       if (mvebu_soc_family() == MVEBU_SOC_MSYS) {
+               switch (revid) {
+               case 3:
+                       puts("A0");
+                       break;
+               case 4:
+                       puts("A1");
+                       break;
+               default:
+                       printf("?? (%x)", revid);
+                       break;
+               }
+       }
+
        get_sar_freq(&sar_freq);
        printf(" at %d MHz\n", sar_freq.p_clk);
 
@@ -472,6 +499,8 @@ u32 mvebu_get_nand_clock(void)
 
        if (mvebu_soc_family() == MVEBU_SOC_A38X)
                reg = MVEBU_DFX_DIV_CLK_CTRL(1);
+       else if (mvebu_soc_family() == MVEBU_SOC_MSYS)
+               reg = MVEBU_DFX_DIV_CLK_CTRL(8);
        else
                reg = MVEBU_CORE_DIV_CLK_CTRL(1);
 
@@ -501,7 +530,6 @@ int board_mmc_init(bd_t *bis)
 }
 #endif
 
-#ifdef CONFIG_SCSI_AHCI_PLAT
 #define AHCI_VENDOR_SPECIFIC_0_ADDR    0xa0
 #define AHCI_VENDOR_SPECIFIC_0_DATA    0xa4
 
@@ -545,11 +573,19 @@ static void ahci_mvebu_regret_option(void __iomem *base)
        writel(0x80, base + AHCI_VENDOR_SPECIFIC_0_DATA);
 }
 
-void scsi_init(void)
+int board_ahci_enable(void)
 {
-       printf("MVEBU SATA INIT\n");
        ahci_mvebu_mbus_config((void __iomem *)MVEBU_SATA0_BASE);
        ahci_mvebu_regret_option((void __iomem *)MVEBU_SATA0_BASE);
+
+       return 0;
+}
+
+#ifdef CONFIG_SCSI_AHCI_PLAT
+void scsi_init(void)
+{
+       printf("MVEBU SATA INIT\n");
+       board_ahci_enable();
        ahci_init((void __iomem *)MVEBU_SATA0_BASE);
 }
 #endif
index 71c4f70efc9e56b0cde72e5b636f735ed9cee539..bbcfcfd1419b01464ce688001d57ed04a715410f 100644 (file)
@@ -17,7 +17,7 @@
 #include <asm/arch/soc.h>
 
 #if defined(CONFIG_ARMADA_XP) || defined(CONFIG_ARMADA_375) \
-       || defined(CONFIG_ARMADA_38X)
+       || defined(CONFIG_ARMADA_38X) || defined(CONFIG_ARMADA_MSYS)
 /*
  * Set this for the common xor register definitions needed in dram.c
  * for A38x as well here.
index 9e23043a4857bc9ba91ffd00f6e12e3e29ffb069..b9153d86c669378242dc791eeb10c0c00cd4a644 100644 (file)
@@ -34,6 +34,7 @@ enum cpu_target {
        CPU_TARGET_PCIE02 = 0x4,
        CPU_TARGET_ETH01 = 0x7,
        CPU_TARGET_PCIE13 = 0x8,
+       CPU_TARGET_DFX = 0x8,
        CPU_TARGET_SASRAM = 0x9,
        CPU_TARGET_SATA01 = 0xa, /* A38X */
        CPU_TARGET_NAND = 0xd,
@@ -79,6 +80,8 @@ enum {
 #define MBUS_PCI_IO_SIZE       (64 << 10)
 #define MBUS_SPI_BASE          0xF4000000
 #define MBUS_SPI_SIZE          (8 << 20)
+#define MBUS_DFX_BASE          0xF6000000
+#define MBUS_DFX_SIZE          (1 << 20)
 #define MBUS_BOOTROM_BASE      0xF8000000
 #define MBUS_BOOTROM_SIZE      (8 << 20)
 
index 01577f469b0e6bbc44a486ce59fa4639e612a816..f666ee24243b4cd06ced9b5291c2488d1e43fb03 100644 (file)
 #define MVEBU_NAND_BASE                (MVEBU_REGISTER(0xd0000))
 #define MVEBU_SDIO_BASE                (MVEBU_REGISTER(0xd8000))
 #define MVEBU_LCD_BASE         (MVEBU_REGISTER(0xe0000))
+#ifdef CONFIG_ARMADA_MSYS
+#define MVEBU_DFX_BASE         (MBUS_DFX_BASE)
+#else
 #define MVEBU_DFX_BASE         (MVEBU_REGISTER(0xe4000))
+#endif
 
 #define SOC_COHERENCY_FABRIC_CTRL_REG  (MVEBU_REGISTER(0x20200))
 #define MBUS_ERR_PROP_EN       (1 << 8)
 #define SPI_PUP_EN             BIT(5)
 
 #define MVEBU_CORE_DIV_CLK_CTRL(i)     (MVEBU_CLOCK_BASE + ((i) * 0x8))
+#ifdef CONFIG_ARMADA_MSYS
+#define MVEBU_DFX_DIV_CLK_CTRL(i)      (MVEBU_DFX_BASE + 0xf8000 + 0x250 + ((i) * 0x4))
+#define NAND_ECC_DIVCKL_RATIO_OFFS     6
+#define NAND_ECC_DIVCKL_RATIO_MASK     (0xF << NAND_ECC_DIVCKL_RATIO_OFFS)
+#else
 #define MVEBU_DFX_DIV_CLK_CTRL(i)      (MVEBU_DFX_BASE + 0x250 + ((i) * 0x4))
+#endif
+#ifdef CONFIG_ARMADA_MSYS
+#define NAND_ECC_DIVCKL_RATIO_OFFS     6
+#define NAND_ECC_DIVCKL_RATIO_MASK     (0xF << NAND_ECC_DIVCKL_RATIO_OFFS)
+#else
 #define NAND_ECC_DIVCKL_RATIO_OFFS     8
 #define NAND_ECC_DIVCKL_RATIO_MASK     (0x3F << NAND_ECC_DIVCKL_RATIO_OFFS)
+#endif
 
 #define SDRAM_MAX_CS           4
 #define SDRAM_ADDR_MASK                0xFF000000
 #define BOOT_FROM_SPI          0x32
 #define BOOT_FROM_MMC          0x30
 #define BOOT_FROM_MMC_ALT      0x31
+#elif defined(CONFIG_ARMADA_MSYS)
+/* SAR values for MSYS */
+#define CONFIG_SAR_REG         (MBUS_DFX_BASE  + 0xf8200)
+#define CONFIG_SAR2_REG                (MBUS_DFX_BASE  + 0xf8204)
+
+#define SAR_CPU_FREQ_OFFS      18
+#define SAR_CPU_FREQ_MASK      (0x7 << SAR_CPU_FREQ_OFFS)
+#define SAR_BOOT_DEVICE_OFFS   11
+#define SAR_BOOT_DEVICE_MASK   (0x7 << SAR_BOOT_DEVICE_OFFS)
+
+#define BOOT_DEV_SEL_OFFS      11
+#define BOOT_DEV_SEL_MASK      (0x7 << BOOT_DEV_SEL_OFFS)
+
+#define BOOT_FROM_NAND         0x1
+#define BOOT_FROM_UART         0x2
+#define BOOT_FROM_SPI          0x3
 #else
 /* SAR values for Armada XP */
 #define CONFIG_SAR_REG         (MVEBU_REGISTER(0x18230))
index df4c5cb2d71825dfd128a83090e6dd4e72de3644..c68e93ba10070e17ac2c4e2acea754abbf8f91a6 100644 (file)
@@ -344,6 +344,11 @@ static void mvebu_mbus_default_setup_cpu_target(struct mvebu_mbus_state *mbus)
                }
        }
        mbus_dram_info.num_cs = cs;
+
+#if defined(CONFIG_ARMADA_MSYS)
+       /* Disable MBUS Err Prop - in order to avoid data aborts */
+       clrbits_le32(mbus->mbuswins_base + 0x200, BIT(8));
+#endif
 }
 
 static const struct mvebu_mbus_soc_data
@@ -405,6 +410,7 @@ int mvebu_mbus_del_window(phys_addr_t base, size_t size)
        return 0;
 }
 
+#ifndef CONFIG_KIRKWOOD
 static void mvebu_mbus_get_lowest_base(struct mvebu_mbus_state *mbus,
                                       phys_addr_t *base)
 {
@@ -451,6 +457,7 @@ static void mvebu_config_mbus_bridge(struct mvebu_mbus_state *mbus)
        val = (size / (64 << 10)) - 1;
        writel((val << 16) | 0x1, MBUS_BRIDGE_WIN_CTRL_REG);
 }
+#endif
 
 int mbus_dt_setup_win(struct mvebu_mbus_state *mbus,
                      u32 base, u32 size, u8 target, u8 attr)
@@ -471,12 +478,14 @@ int mbus_dt_setup_win(struct mvebu_mbus_state *mbus,
                        return -ENOMEM;
        }
 
+#ifndef CONFIG_KIRKWOOD
        /*
         * Re-configure the mbus bridge registers each time this function
         * is called. Since it may get called from the board code in
         * later boot stages as well.
         */
        mvebu_config_mbus_bridge(mbus);
+#endif
 
        return 0;
 }
index 569840ff47186da2b38c2ce7f83c50479f7e4c1b..c8c92988645f27e4f6c02f8f3cd9c72408b28983 100644 (file)
@@ -35,7 +35,7 @@ int pex_local_dev_num_set(u32 pex_if, u32 dev_num);
 #define        ETM_MODULE_DETECT               2
 
 #define PEX_MODE_GET(satr)             ((satr & 0x6) >> 1)
-#define PEX_CAPABILITY_GET(satr)       (satr & 1)
+#define PEX_CAPABILITY_GET(satr, port) ((satr >> port) & 1)
 #define MV_PEX_UNIT_TO_IF(pex_unit)    ((pex_unit < 3) ? (pex_unit * 4) : 9)
 
 /* Static parametes */
@@ -176,7 +176,7 @@ u8 board_cpu_freq_get(void)
        return ((sar_msb & 0x100000) >> 17) | ((sar & 0xe00000) >> 21);
 }
 
-__weak MV_BIN_SERDES_CFG *board_serdes_cfg_get(u8 pex_mode)
+__weak MV_BIN_SERDES_CFG *board_serdes_cfg_get(void)
 {
        u32 board_id;
        u32 serdes_cfg_val = 0; /* default */
@@ -352,7 +352,7 @@ int serdes_phy_config(void)
                DEBUG_WR_REG(CPU_AVS_CONTROL2_REG, cpu_avs);
        }
 
-       info = board_serdes_cfg_get(PEX_MODE_GET(satr11));
+       info = board_serdes_cfg_get();
 
        if (info == NULL) {
                DEBUG_INIT_S("Hight speed PHY Error #1\n");
@@ -675,7 +675,7 @@ int serdes_phy_config(void)
                                tmp |= (0x1 << 4);
                        if (info->pex_mode[pex_unit] == PEX_BUS_MODE_X4)
                                tmp |= (0x4 << 4);
-                       if (0 == PEX_CAPABILITY_GET(satr11))
+                       if (0 == PEX_CAPABILITY_GET(satr11, pex_unit))
                                tmp |= 0x1;
                        else
                                tmp |= 0x2;
index 1cac4437d72c9d6c3d13ae988622495ebfa2ccc3..d29f1ca0b58b250f817681f53a7bd57d60a51a67 100644 (file)
@@ -167,21 +167,6 @@ config TI_SECURE_EMIF_PROTECTED_REGION_SIZE
          using hardware memory firewalls. This value must be smaller than the
          TI_SECURE_EMIF_TOTAL_REGION_SIZE value.
 
-if AM43XX || AM33XX || OMAP54XX
-config ISW_ENTRY_ADDR
-       hex "Address in memory or XIP address of bootloader entry point"
-       default 0x402F4000 if AM43XX
-       default 0x402F0400 if AM33XX
-       default 0x40301350 if OMAP54XX
-       help
-         After any reset, the boot ROM searches the boot media for a valid
-         boot image. For non-XIP devices, the ROM then copies the image into
-         internal memory. For all boot modes, after the ROM processes the
-         boot image it eventually computes the entry point address depending
-         on the device type (secure/non-secure), boot media (xip/non-xip) and
-         image headers.
-endif
-
 source "arch/arm/mach-omap2/omap3/Kconfig"
 
 source "arch/arm/mach-omap2/omap4/Kconfig"
index 85ea8946b0fd1a2f1808222d8c44a285c9f8f02e..500df1aa11d1990b7a1180de46299477c8e26068 100644 (file)
@@ -87,6 +87,13 @@ config TARGET_AM335X_SHC
        imply CMD_DM
        imply CMD_SPL
 
+config TARGET_AM335X_GUARDIAN
+       bool "Support am335x based guardian board from bosch"
+       select DM
+       select DM_SERIAL
+       select DM_GPIO
+       select DM_USB
+
 config TARGET_AM335X_SL50
        bool "Support am335x_sl50"
        select BOARD_LATE_INIT
index f083a4a385c588be1e0d2709470df53e237f2b87..fddbac9dec1175ad1b862d6d979803485458886e 100644 (file)
@@ -9,10 +9,6 @@ choice
        prompt "OMAP5 board select"
        optional
 
-config TARGET_CL_SOM_AM57X
-       bool "CompuLab CL-SOM-AM57x"
-       select DRA7XX
-
 config TARGET_CM_T54
        bool "CompuLab CM-T54"
 
@@ -160,7 +156,6 @@ endchoice
 endmenu
 endif
 
-source "board/compulab/cl-som-am57x/Kconfig"
 source "board/compulab/cm_t54/Kconfig"
 source "board/ti/omap5_uevm/Kconfig"
 source "board/ti/dra7xx/Kconfig"
index b2ac1cdad717cc0f61a58352081407a050694620..27d29f797fc4a35e4965ebf4f5a811bcf1306203 100644 (file)
@@ -12,6 +12,11 @@ config R8A7796
        imply CLK_R8A7796
        imply PINCTRL_PFC_R8A7796
 
+config R8A77965
+       bool "Renesas SoC R8A77965"
+       imply CLK_R8A77965
+       imply PINCTRL_PFC_R8A77965
+
 config R8A77970
        bool "Renesas SoC R8A77970"
        imply CLK_R8A77970
@@ -55,6 +60,10 @@ config TARGET_SALVATOR_X
        bool "Salvator-X board"
        imply R8A7795
        imply R8A7796
+       imply R8A77965
+       imply SYS_MALLOC_F
+       imply MULTI_DTB_FIT
+       imply MULTI_DTB_FIT_USER_DEFINED_AREA
        help
           Support for Renesas R-Car Gen3 platform
 
@@ -62,6 +71,10 @@ config TARGET_ULCB
        bool "ULCB board"
        imply R8A7795
        imply R8A7796
+       imply R8A77965
+       imply SYS_MALLOC_F
+       imply MULTI_DTB_FIT
+       imply MULTI_DTB_FIT_USER_DEFINED_AREA
        help
           Support for Renesas R-Car Gen3 ULCB platform
 
@@ -76,4 +89,15 @@ source "board/renesas/ebisu/Kconfig"
 source "board/renesas/salvator-x/Kconfig"
 source "board/renesas/ulcb/Kconfig"
 
+config MULTI_DTB_FIT_UNCOMPRESS_SZ
+       default 0x80000 if TARGET_SALVATOR_X
+       default 0x80000 if TARGET_ULCB
+
+config MULTI_DTB_FIT_USER_DEF_ADDR
+       default 0x49000000 if TARGET_SALVATOR_X
+       default 0x49000000 if TARGET_ULCB
+
+config SYS_MALLOC_F_LEN
+       default 0x8000 if RCAR_GEN3
+
 endif
index f42b53fd88ace9fe49e75651df05e2a184de8553..213ec143e2774cf1c48a60feb566610ee3b81375 100644 (file)
 #include <linux/linkage.h>
 #include <asm/macro.h>
 
+.align 8
+.globl rcar_atf_boot_args
+rcar_atf_boot_args:
+       .dword 0
+       .dword 0
+       .dword 0
+       .dword 0
+
+ENTRY(save_boot_params)
+       adr     x8, rcar_atf_boot_args
+       stp     x0, x1, [x8], #16
+       stp     x2, x3, [x8], #16
+       b       save_boot_params_ret
+ENDPROC(save_boot_params)
+
 ENTRY(lowlevel_init)
        mov     x29, lr                 /* Save LR */
 
index 31b73edabe211aebe85e2acedd56c42fdd6769eb..e18629679161e5f104a3dbfa649b470efdba7880 100644 (file)
@@ -9,6 +9,7 @@
 
 void reset_cpu(ulong addr);
 void reset_deassert_peripherals_handoff(void);
+int cpu_has_been_warmreset(void);
 
 void socfpga_bridges_reset(int enable);
 
@@ -47,6 +48,8 @@ struct socfpga_reset_manager {
 #define RSTMGR_MPUMODRST_CORE0         0
 #define RSTMGR_PER0MODRST_OCP_MASK     0x0020bf00
 #define RSTMGR_BRGMODRST_DDRSCH_MASK   0X00000040
+/* Watchdogs and MPU warm reset mask */
+#define RSTMGR_L4WD_MPU_WARMRESET_MASK 0x000F0F00
 
 /*
  * Define a reset identifier, from which a permodrst bank ID
index a238d5d17fe92a1f2dbe390b33fc9f0ffc278e74..c41208591a1f03523afe8e9155bbafd3fde12c44 100644 (file)
@@ -7,10 +7,6 @@
 
 #ifndef __ASSEMBLY__
 
-unsigned long sdram_calculate_size(void);
-int sdram_mmr_init_full(unsigned int sdr_phy_reg);
-int sdram_calibration_full(void);
-
 const struct socfpga_sdram_config *socfpga_get_sdram_config(void);
 
 void socfpga_get_seq_ac_init(const u32 **init, unsigned int *nelem);
index ca685944453dfb8b44ba8042d8fc96312809487b..f39206ca1eee26ae385371c2f8d652523dc61758 100644 (file)
@@ -22,6 +22,7 @@ int sdram_calibration_full(void);
 #define ECCCTRL1                       0x100
 #define ECCCTRL2                       0x104
 #define ERRINTEN                       0x110
+#define ERRINTENS                      0x114
 #define INTMODE                                0x11c
 #define INTSTAT                                0x120
 #define AUTOWB_CORRADDR                        0x138
@@ -52,6 +53,10 @@ int sdram_calibration_full(void);
 #define DDR_HMC_SEQ2CORE_INT_RESP_MASK         BIT(3)
 #define DDR_HMC_HPSINTFCSEL_ENABLE_MASK                0x001f1f1f
 
+#define        DDR_HMC_ERRINTEN_INTMASK                                \
+               (DDR_HMC_ERRINTEN_SERRINTEN_EN_SET_MSK |        \
+                DDR_HMC_ERRINTEN_DERRINTEN_EN_SET_MSK)
+
 /* NOC DDR scheduler */
 #define DDR_SCH_ID_COREID              0
 #define DDR_SCH_ID_REVID               0x4
@@ -180,4 +185,8 @@ int sdram_calibration_full(void);
 #define CALTIMING9_CFG_4_ACT_TO_ACT(x)                 \
        (((x) >> 0) & 0xFF)
 
+/* Firewall DDR scheduler MPFE */
+#define FW_HMC_ADAPTOR_REG_ADDR                        0xf8020004
+#define FW_HMC_ADAPTOR_MPU_MASK                        BIT(0)
+
 #endif /* _SDRAM_S10_H_ */
index 6e11ba6cb24e00c4a93e0e5d672be6c82c23e98c..9865f5b5b12065cf739e5669d7843ed51c6635ec 100644 (file)
@@ -201,16 +201,6 @@ int arch_early_init_r(void)
        /* Add device descriptor to FPGA device table */
        socfpga_fpga_add(&altera_fpga[0]);
 
-#ifdef CONFIG_DESIGNWARE_SPI
-       /* Get Designware SPI controller out of reset */
-       socfpga_per_reset(SOCFPGA_RESET(SPIM0), 0);
-       socfpga_per_reset(SOCFPGA_RESET(SPIM1), 0);
-#endif
-
-#ifdef CONFIG_NAND_DENALI
-       socfpga_per_reset(SOCFPGA_RESET(NAND), 0);
-#endif
-
        return 0;
 }
 
index f176c384951a2cb191edc1606c831ee701cda251..f8dd787cc6ae41069222d96e1d7f362ba81b0501 100644 (file)
@@ -103,3 +103,12 @@ void reset_deassert_peripherals_handoff(void)
        writel(~RSTMGR_PER0MODRST_OCP_MASK, &reset_manager_base->per0modrst);
        writel(0, &reset_manager_base->per0modrst);
 }
+
+/*
+ * Return non-zero if the CPU has been warm reset
+ */
+int cpu_has_been_warmreset(void)
+{
+       return readl(&reset_manager_base->status) &
+               RSTMGR_L4WD_MPU_WARMRESET_MASK;
+}
index 142b60f887d3edce87ba0fdad105b54a086c8388..9dd0afb4bcacd905e2287a52acdd011d09182b26 100644 (file)
@@ -21,6 +21,7 @@
 #include <debug_uart.h>
 #include <fdtdec.h>
 #include <watchdog.h>
+#include <dm/uclass.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -38,16 +39,12 @@ u32 spl_boot_device(void)
                return BOOT_DEVICE_RAM;
        case 0x2:       /* NAND Flash (1.8V) */
        case 0x3:       /* NAND Flash (3.0V) */
-               socfpga_per_reset(SOCFPGA_RESET(NAND), 0);
                return BOOT_DEVICE_NAND;
        case 0x4:       /* SD/MMC External Transceiver (1.8V) */
        case 0x5:       /* SD/MMC Internal Transceiver (3.0V) */
-               socfpga_per_reset(SOCFPGA_RESET(SDMMC), 0);
-               socfpga_per_reset(SOCFPGA_RESET(DMA), 0);
                return BOOT_DEVICE_MMC1;
        case 0x6:       /* QSPI Flash (1.8V) */
        case 0x7:       /* QSPI Flash (3.0V) */
-               socfpga_per_reset(SOCFPGA_RESET(QSPI), 0);
                return BOOT_DEVICE_SPI;
        default:
                printf("Invalid boot device (bsel=%08x)!\n", bsel);
@@ -123,9 +120,9 @@ static void socfpga_pl310_clear(void)
 void board_init_f(ulong dummy)
 {
        const struct cm_config *cm_default_cfg = cm_get_default_config();
-       unsigned long sdram_size;
        unsigned long reg;
        int ret;
+       struct udevice *dev;
 
        /*
         * First C code to run. Clear fake OCRAM ECC first as SBE
@@ -156,10 +153,7 @@ void board_init_f(ulong dummy)
                socfpga_bridges_reset(1);
        }
 
-       socfpga_per_reset(SOCFPGA_RESET(SDR), 0);
-       socfpga_per_reset(SOCFPGA_RESET(UART0), 0);
        socfpga_per_reset(SOCFPGA_RESET(OSC1TIMER0), 0);
-
        timer_init();
 
        debug("Reconfigure Clock Manager\n");
@@ -181,8 +175,7 @@ void board_init_f(ulong dummy)
        sysmgr_pinmux_init();
        sysmgr_config_warmrstcfgio(0);
 
-       /* De-assert reset for peripherals and bridges based on handoff */
-       reset_deassert_peripherals_handoff();
+       /* De-assert reset for bridges based on handoff */
        socfpga_bridges_reset(0);
 
        debug("Unfreezing/Thaw all I/O banks\n");
@@ -200,27 +193,16 @@ void board_init_f(ulong dummy)
                hang();
        }
 
+       ret = uclass_get_device(UCLASS_RESET, 0, &dev);
+       if (ret)
+               debug("Reset init failed: %d\n", ret);
+
        /* enable console uart printing */
        preloader_console_init();
 
-       if (sdram_mmr_init_full(0xffffffff) != 0) {
-               puts("SDRAM init failed.\n");
-               hang();
-       }
-
-       debug("SDRAM: Calibrating PHY\n");
-       /* SDRAM calibration */
-       if (sdram_calibration_full() == 0) {
-               puts("SDRAM calibration failed.\n");
-               hang();
-       }
-
-       sdram_size = sdram_calculate_size();
-       debug("SDRAM: %ld MiB\n", sdram_size >> 20);
-
-       /* Sanity check ensure correct SDRAM size specified */
-       if (get_ram_size(0, sdram_size) != sdram_size) {
-               puts("SDRAM size check failed!\n");
+       ret = uclass_get_device(UCLASS_RAM, 0, &dev);
+       if (ret) {
+               debug("DRAM init failed: %d\n", ret);
                hang();
        }
 
index a3db20a819aeac6d341c9e8682ad84188bfef9eb..a141ffe82a89ef3809948c721014a074211f46ad 100644 (file)
@@ -181,17 +181,6 @@ void board_init_f(ulong dummy)
                hang();
        }
 
-       gd->ram_size = sdram_calculate_size();
-       printf("DDR: %d MiB\n", (int)(gd->ram_size >> 20));
-
-       /* Sanity check ensure correct SDRAM size specified */
-       debug("DDR: Running SDRAM size sanity check\n");
-       if (get_ram_size(0, gd->ram_size) != gd->ram_size) {
-               puts("DDR: SDRAM size check failed!\n");
-               hang();
-       }
-       debug("DDR: SDRAM size check passed!\n");
-
        mbox_init();
 
 #ifdef CONFIG_CADENCE_QSPI
index 8a929fa91322dc3252932f874ab715541242d629..73aa382712268ddcb14477e651e7f6b31b0566d6 100644 (file)
@@ -17,7 +17,7 @@ config SPL
        select SPL_DM_RESET
        select SPL_SERIAL_SUPPORT
        select SPL_SYSCON
-       select SPL_DRIVERS_MISC_SUPPORT
+       imply SPL_DISPLAY_PRINT
        imply SPL_LIBDISK_SUPPORT
 
 config SYS_SOC
@@ -25,18 +25,31 @@ config SYS_SOC
 
 config TARGET_STM32MP1
        bool "Support stm32mp1xx"
-       select ARCH_SUPPORT_PSCI
+       select ARCH_SUPPORT_PSCI if !STM32MP1_TRUSTED
        select CPU_V7A
-       select CPU_V7_HAS_NONSEC
+       select CPU_V7_HAS_NONSEC if !STM32MP1_TRUSTED
        select CPU_V7_HAS_VIRT
        select PINCTRL_STM32
        select STM32_RCC
        select STM32_RESET
        select SYS_ARCH_TIMER
-       select SYSRESET_SYSCON
+       imply SYSRESET_PSCI if STM32MP1_TRUSTED
+       imply SYSRESET_SYSCON if !STM32MP1_TRUSTED
        help
                target STMicroelectronics SOC STM32MP1 family
+               STM32MP157, STM32MP153 or STM32MP151
                STMicroelectronics MPU with core ARMv7
+               dual core A7 for STM32MP157/3, monocore for STM32MP151
+
+config STM32MP1_TRUSTED
+       bool "Support trusted boot with TF-A"
+       default y if !SPL
+       select ARM_SMCCC
+       help
+               Say Y here to enable boot with TF-A
+               Trusted boot chain is :
+               BootRom => TF-A.stm32 (clock & DDR) => U-Boot.stm32
+               TF-A monitor provides proprietary smc to manage secure devices
 
 config SYS_TEXT_BASE
        prompt "U-Boot base address"
@@ -46,6 +59,9 @@ config SYS_TEXT_BASE
                when DDR driver is used:
                  DDR + 1MB (0xC0100000)
 
+config NR_DRAM_BANKS
+       default 1
+
 config SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION_MMC2
        hex "Partition on MMC2 to use to load U-Boot from"
        depends on SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
@@ -54,9 +70,6 @@ config SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION_MMC2
          Partition on the second MMC to load U-Boot from when the MMC is being
          used in raw mode
 
-source "board/st/stm32mp1/Kconfig"
-
-# currently activated for debug / should be deactivated for real product
 if DEBUG_UART
 
 config DEBUG_UART_BOARD_INIT
@@ -71,4 +84,6 @@ config DEBUG_UART_CLOCK
        default 64000000
 endif
 
+source "board/st/stm32mp1/Kconfig"
+
 endif
index f59ced5ee1b1a5904328b4f8b4ee24903675b55c..1493914a110d3cc8be870017cc71521383a68dc8 100644 (file)
@@ -11,6 +11,9 @@ ifdef CONFIG_SPL_BUILD
 obj-y += spl.o
 else
 obj-y += bsec.o
+ifndef CONFIG_STM32MP1_TRUSTED
+obj-$(CONFIG_SYSRESET) += cmd_poweroff.o
+endif
 endif
 obj-$(CONFIG_ARMV7_PSCI) += psci.o
 obj-$(CONFIG_$(SPL_)DM_REGULATOR) += pwr_regulator.o
index d087a313892603fbc3a7868807a2fd86982aba70..9ed8d8c56c3c4c811eeef7b75867de1b8b7853eb 100644 (file)
@@ -8,9 +8,12 @@
 #include <misc.h>
 #include <asm/io.h>
 #include <linux/iopoll.h>
+#include <asm/arch/stm32mp1_smc.h>
+#include <linux/arm-smccc.h>
 
 #define BSEC_OTP_MAX_VALUE             95
 
+#ifndef CONFIG_STM32MP1_TRUSTED
 #define BSEC_TIMEOUT_US                        10000
 
 /* BSEC REGISTER OFFSET (base relative) */
@@ -168,7 +171,7 @@ static int bsec_shadow_register(u32 base, u32 otp)
                ret = bsec_power_safmem(base, true);
                if (ret)
                        return ret;
-               power_up = 1;
+               power_up = true;
        }
        /* set BSEC_OTP_CTRL_OFF with the otp value*/
        writel(otp | BSEC_READ, base + BSEC_OTP_CTRL_OFF);
@@ -270,6 +273,7 @@ static int bsec_program_otp(long base, u32 val, u32 otp)
 
        return ret;
 }
+#endif /* CONFIG_STM32MP1_TRUSTED */
 
 /* BSEC MISC driver *******************************************************/
 struct stm32mp_bsec_platdata {
@@ -278,6 +282,11 @@ struct stm32mp_bsec_platdata {
 
 static int stm32mp_bsec_read_otp(struct udevice *dev, u32 *val, u32 otp)
 {
+#ifdef CONFIG_STM32MP1_TRUSTED
+       return stm32_smc(STM32_SMC_BSEC,
+                        STM32_SMC_READ_OTP,
+                        otp, 0, val);
+#else
        struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
        u32 tmp_data = 0;
        int ret;
@@ -299,27 +308,46 @@ static int stm32mp_bsec_read_otp(struct udevice *dev, u32 *val, u32 otp)
        /* restore shadow value */
        ret = bsec_write_shadow(plat->base, tmp_data, otp);
        return ret;
+#endif
 }
 
 static int stm32mp_bsec_read_shadow(struct udevice *dev, u32 *val, u32 otp)
 {
+#ifdef CONFIG_STM32MP1_TRUSTED
+       return stm32_smc(STM32_SMC_BSEC,
+                        STM32_SMC_READ_SHADOW,
+                        otp, 0, val);
+#else
        struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
 
        return bsec_read_shadow(plat->base, val, otp);
+#endif
 }
 
 static int stm32mp_bsec_write_otp(struct udevice *dev, u32 val, u32 otp)
 {
+#ifdef CONFIG_STM32MP1_TRUSTED
+       return stm32_smc_exec(STM32_SMC_BSEC,
+                             STM32_SMC_PROG_OTP,
+                             otp, val);
+#else
        struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
 
        return bsec_program_otp(plat->base, val, otp);
+#endif
 }
 
 static int stm32mp_bsec_write_shadow(struct udevice *dev, u32 val, u32 otp)
 {
+#ifdef CONFIG_STM32MP1_TRUSTED
+       return stm32_smc_exec(STM32_SMC_BSEC,
+                             STM32_SMC_WRITE_SHADOW,
+                             otp, val);
+#else
        struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
 
        return bsec_write_shadow(plat->base, val, otp);
+#endif
 }
 
 static int stm32mp_bsec_read(struct udevice *dev, int offset,
@@ -405,8 +433,23 @@ static int stm32mp_bsec_ofdata_to_platdata(struct udevice *dev)
        return 0;
 }
 
+#ifndef CONFIG_STM32MP1_TRUSTED
+static int stm32mp_bsec_probe(struct udevice *dev)
+{
+       int otp;
+       struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
+
+       /* update unlocked shadow for OTP cleared by the rom code */
+       for (otp = 57; otp <= BSEC_OTP_MAX_VALUE; otp++)
+               if (!bsec_read_SR_lock(plat->base, otp))
+                       bsec_shadow_register(plat->base, otp);
+
+       return 0;
+}
+#endif
+
 static const struct udevice_id stm32mp_bsec_ids[] = {
-       { .compatible = "st,stm32mp-bsec" },
+       { .compatible = "st,stm32mp15-bsec" },
        {}
 };
 
@@ -417,14 +460,7 @@ U_BOOT_DRIVER(stm32mp_bsec) = {
        .ofdata_to_platdata = stm32mp_bsec_ofdata_to_platdata,
        .platdata_auto_alloc_size = sizeof(struct stm32mp_bsec_platdata),
        .ops = &stm32mp_bsec_ops,
-};
-
-/* bsec IP is not present in device tee, manage IP address by platdata */
-static struct stm32mp_bsec_platdata stm32_bsec_platdata = {
-       .base = STM32_BSEC_BASE,
-};
-
-U_BOOT_DEVICE(stm32mp_bsec) = {
-       .name = "stm32mp_bsec",
-       .platdata = &stm32_bsec_platdata,
+#ifndef CONFIG_STM32MP1_TRUSTED
+       .probe = stm32mp_bsec_probe,
+#endif
 };
diff --git a/arch/arm/mach-stm32mp/cmd_poweroff.c b/arch/arm/mach-stm32mp/cmd_poweroff.c
new file mode 100644 (file)
index 0000000..f54dd1d
--- /dev/null
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
+/*
+ * Copyright (C) 2019, STMicroelectronics - All Rights Reserved
+ */
+
+#include <common.h>
+#include <command.h>
+#include <sysreset.h>
+
+int do_poweroff(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       int ret;
+
+       puts("poweroff ...\n");
+       mdelay(100);
+
+       ret = sysreset_walk(SYSRESET_POWER);
+
+       if (ret == -EINPROGRESS)
+               mdelay(1000);
+
+       /*NOTREACHED when power off*/
+       return CMD_RET_FAILURE;
+}
index f371aac75bde48fd3025908ced7fb300ed1542fd..403af2a225e69ea025634543c324eb13a95ad75b 100644 (file)
@@ -3,7 +3,20 @@
 # Copyright (C) 2018, STMicroelectronics - All Rights Reserved
 #
 
-ALL-$(CONFIG_SPL_BUILD) += u-boot-spl.stm32
+ifndef CONFIG_SPL
+ALL-y += u-boot.stm32
+else
+ifdef CONFIG_SPL_BUILD
+ALL-y += u-boot-spl.stm32
+endif
+endif
+
+MKIMAGEFLAGS_u-boot.stm32 = -T stm32image -a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_TEXT_BASE)
+
+u-boot.stm32: MKIMAGEOUTPUT = u-boot.stm32.log
+
+u-boot.stm32: u-boot.bin FORCE
+       $(call if_changed,mkimage)
 
 MKIMAGEFLAGS_u-boot-spl.stm32 = -T stm32image -a $(CONFIG_SPL_TEXT_BASE) -e $(CONFIG_SPL_TEXT_BASE)
 
index b8933587adb37eb951abd97fcd68db3142892b96..7b4431c9c75cf3035a6fc7d0bb189907f259ecfb 100644 (file)
@@ -18,6 +18,7 @@
 #define RCC_DBGCFGR            (STM32_RCC_BASE + 0x080C)
 #define RCC_BDCR               (STM32_RCC_BASE + 0x0140)
 #define RCC_MP_APB5ENSETR      (STM32_RCC_BASE + 0x0208)
+#define RCC_MP_AHB5ENSETR      (STM32_RCC_BASE + 0x0210)
 #define RCC_BDCR_VSWRST                BIT(31)
 #define RCC_BDCR_RTCSRC                GENMASK(17, 16)
 #define RCC_DBGCFGR_DBGCKEN    BIT(8)
@@ -44,6 +45,9 @@
 #define DBGMCU_IDC_REV_ID_MASK GENMASK(31, 16)
 #define DBGMCU_IDC_REV_ID_SHIFT        16
 
+/* GPIOZ registers */
+#define GPIOZ_SECCFGR          0x54004030
+
 /* boot interface from Bootrom
  * - boot instance = bit 31:16
  * - boot device = bit 15:0
 #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)
+
+/* Package = bit 27:29 of OTP16
+ * - 100: LBGA448 (FFI) => AA = LFBGA 18x18mm 448 balls p. 0.8mm
+ * - 011: LBGA354 (LCI) => AB = LFBGA 16x16mm 359 balls p. 0.8mm
+ * - 010: TFBGA361 (FFC) => AC = TFBGA 12x12mm 361 balls p. 0.5mm
+ * - 001: TFBGA257 (LCC) => AD = TFBGA 10x10mm 257 balls p. 0.5mm
+ * - others: Reserved
+ */
+#define PKG_SHIFT      27
+#define PKG_MASK       GENMASK(2, 0)
+
+#define PKG_AA_LBGA448 4
+#define PKG_AB_LBGA354 3
+#define PKG_AC_TFBGA361        2
+#define PKG_AD_TFBGA257        1
+
 #if !defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD)
+#ifndef CONFIG_STM32MP1_TRUSTED
 static void security_init(void)
 {
        /* Disable the backup domain write protection */
@@ -113,7 +139,12 @@ static void security_init(void)
         * Bit 16 ITAMP1E: RTC power domain supply monitoring
         */
        writel(0x0, TAMP_CR1);
+
+       /* GPIOZ: deactivate the security */
+       writel(BIT(0), RCC_MP_AHB5ENSETR);
+       writel(0x0, GPIOZ_SECCFGR);
 }
+#endif /* CONFIG_STM32MP1_TRUSTED */
 
 /*
  * Debug init
@@ -127,13 +158,19 @@ static void dbgmcu_init(void)
 }
 #endif /* !defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD) */
 
-static u32 get_bootmode(void)
+#if !defined(CONFIG_STM32MP1_TRUSTED) && \
+       (!defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD))
+/* get bootmode from ROM code boot context: saved in TAMP register */
+static void update_bootmode(void)
 {
        u32 boot_mode;
-#if !defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD)
        u32 bootrom_itf = readl(BOOTROM_PARAM_ADDR);
        u32 bootrom_device, bootrom_instance;
 
+       /* enable TAMP clock = RTCAPBEN */
+       writel(BIT(8), RCC_MP_APB5ENSETR);
+
+       /* read bootrom context */
        bootrom_device =
                (bootrom_itf & BOOTROM_MODE_MASK) >> BOOTROM_MODE_SHIFT;
        bootrom_instance =
@@ -147,12 +184,14 @@ static u32 get_bootmode(void)
        clrsetbits_le32(TAMP_BOOT_CONTEXT,
                        TAMP_BOOT_MODE_MASK,
                        boot_mode << TAMP_BOOT_MODE_SHIFT);
-#else
-       /* read TAMP backup register */
-       boot_mode = (readl(TAMP_BOOT_CONTEXT) & TAMP_BOOT_MODE_MASK) >>
-                   TAMP_BOOT_MODE_SHIFT;
+}
 #endif
-       return boot_mode;
+
+u32 get_bootmode(void)
+{
+       /* read bootmode from TAMP backup register */
+       return (readl(TAMP_BOOT_CONTEXT) & TAMP_BOOT_MODE_MASK) >>
+                   TAMP_BOOT_MODE_SHIFT;
 }
 
 /*
@@ -167,16 +206,18 @@ int arch_cpu_init(void)
 
 #if !defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD)
        dbgmcu_init();
-
+#ifndef CONFIG_STM32MP1_TRUSTED
        security_init();
+       update_bootmode();
+#endif
 #endif
 
-       /* get bootmode from BootRom context: saved in TAMP register */
        boot_mode = get_bootmode();
 
        if ((boot_mode & TAMP_BOOT_DEVICE_MASK) == BOOT_SERIAL_UART)
                gd->flags |= GD_FLG_SILENT | GD_FLG_DISABLE_CONSOLE;
 #if defined(CONFIG_DEBUG_UART) && \
+       !defined(CONFIG_STM32MP1_TRUSTED) && \
        (!defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD))
        else
                debug_uart_init();
@@ -203,25 +244,94 @@ u32 get_cpu_rev(void)
        return (read_idc() & DBGMCU_IDC_REV_ID_MASK) >> DBGMCU_IDC_REV_ID_SHIFT;
 }
 
+static u32 get_otp(int index, int shift, int mask)
+{
+       int ret;
+       struct udevice *dev;
+       u32 otp = 0;
+
+       ret = uclass_get_device_by_driver(UCLASS_MISC,
+                                         DM_GET_DRIVER(stm32mp_bsec),
+                                         &dev);
+
+       if (!ret)
+               ret = misc_read(dev, STM32_BSEC_SHADOW(index),
+                               &otp, sizeof(otp));
+
+       return (otp >> shift) & mask;
+}
+
+/* Get Device Part Number (RPN) from OTP */
+static u32 get_cpu_rpn(void)
+{
+       return get_otp(BSEC_OTP_RPN, RPN_SHIFT, RPN_MASK);
+}
+
 u32 get_cpu_type(void)
 {
-       return (read_idc() & DBGMCU_IDC_DEV_ID_MASK) >> DBGMCU_IDC_DEV_ID_SHIFT;
+       u32 id;
+
+       id = (read_idc() & DBGMCU_IDC_DEV_ID_MASK) >> DBGMCU_IDC_DEV_ID_SHIFT;
+
+       return (id << 16) | get_cpu_rpn();
+}
+
+/* Get Package options from OTP */
+static u32 get_cpu_package(void)
+{
+       return get_otp(BSEC_OTP_PKG, PKG_SHIFT, PKG_MASK);
 }
 
 #if defined(CONFIG_DISPLAY_CPUINFO)
 int print_cpuinfo(void)
 {
-       char *cpu_s, *cpu_r;
+       char *cpu_s, *cpu_r, *pkg;
 
+       /* MPUs Part Numbers */
        switch (get_cpu_type()) {
-       case CPU_STMP32MP15x:
-               cpu_s = "15x";
+       case CPU_STM32MP157Cxx:
+               cpu_s = "157C";
+               break;
+       case CPU_STM32MP157Axx:
+               cpu_s = "157A";
+               break;
+       case CPU_STM32MP153Cxx:
+               cpu_s = "153C";
+               break;
+       case CPU_STM32MP153Axx:
+               cpu_s = "153A";
+               break;
+       case CPU_STM32MP151Cxx:
+               cpu_s = "151C";
+               break;
+       case CPU_STM32MP151Axx:
+               cpu_s = "151A";
+               break;
+       default:
+               cpu_s = "????";
+               break;
+       }
+
+       /* Package */
+       switch (get_cpu_package()) {
+       case PKG_AA_LBGA448:
+               pkg = "AA";
+               break;
+       case PKG_AB_LBGA354:
+               pkg = "AB";
+               break;
+       case PKG_AC_TFBGA361:
+               pkg = "AC";
+               break;
+       case PKG_AD_TFBGA257:
+               pkg = "AD";
                break;
        default:
-               cpu_s = "?";
+               pkg = "??";
                break;
        }
 
+       /* REVISION */
        switch (get_cpu_rev()) {
        case CPU_REVA:
                cpu_r = "A";
@@ -234,7 +344,7 @@ int print_cpuinfo(void)
                break;
        }
 
-       printf("CPU: STM32MP%s.%s\n", cpu_s, cpu_r);
+       printf("CPU: STM32MP%s%s Rev.%s\n", cpu_s, pkg, cpu_r);
 
        return 0;
 }
@@ -242,20 +352,48 @@ int print_cpuinfo(void)
 
 static void setup_boot_mode(void)
 {
+       const u32 serial_addr[] = {
+               STM32_USART1_BASE,
+               STM32_USART2_BASE,
+               STM32_USART3_BASE,
+               STM32_UART4_BASE,
+               STM32_UART5_BASE,
+               STM32_USART6_BASE,
+               STM32_UART7_BASE,
+               STM32_UART8_BASE
+       };
        char cmd[60];
        u32 boot_ctx = readl(TAMP_BOOT_CONTEXT);
        u32 boot_mode =
                (boot_ctx & TAMP_BOOT_MODE_MASK) >> TAMP_BOOT_MODE_SHIFT;
        int instance = (boot_mode & TAMP_BOOT_INSTANCE_MASK) - 1;
+       u32 forced_mode = (boot_ctx & TAMP_BOOT_FORCED_MASK);
+       struct udevice *dev;
+       int alias;
 
-       pr_debug("%s: boot_ctx=0x%x => boot_mode=%x, instance=%d\n",
-                __func__, boot_ctx, boot_mode, instance);
-
+       pr_debug("%s: boot_ctx=0x%x => boot_mode=%x, instance=%d forced=%x\n",
+                __func__, boot_ctx, boot_mode, instance, forced_mode);
        switch (boot_mode & TAMP_BOOT_DEVICE_MASK) {
        case BOOT_SERIAL_UART:
-               sprintf(cmd, "%d", instance);
-               env_set("boot_device", "uart");
+               if (instance > ARRAY_SIZE(serial_addr))
+                       break;
+               /* serial : search associated alias in devicetree */
+               sprintf(cmd, "serial@%x", serial_addr[instance]);
+               if (uclass_get_device_by_name(UCLASS_SERIAL, cmd, &dev))
+                       break;
+               if (fdtdec_get_alias_seq(gd->fdt_blob, "serial",
+                                        dev_of_offset(dev), &alias))
+                       break;
+               sprintf(cmd, "%d", alias);
+               env_set("boot_device", "serial");
                env_set("boot_instance", cmd);
+
+               /* restore console on uart when not used */
+               if (gd->cur_serial_dev != dev) {
+                       gd->flags &= ~(GD_FLG_SILENT |
+                                      GD_FLG_DISABLE_CONSOLE);
+                       printf("serial boot with console enabled!\n");
+               }
                break;
        case BOOT_SERIAL_USB:
                env_set("boot_device", "usb");
@@ -279,6 +417,36 @@ static void setup_boot_mode(void)
                pr_debug("unexpected boot mode = %x\n", boot_mode);
                break;
        }
+
+       switch (forced_mode) {
+       case BOOT_FASTBOOT:
+               printf("Enter fastboot!\n");
+               env_set("preboot", "env set preboot; fastboot 0");
+               break;
+       case BOOT_STM32PROG:
+               env_set("boot_device", "usb");
+               env_set("boot_instance", "0");
+               break;
+       case BOOT_UMS_MMC0:
+       case BOOT_UMS_MMC1:
+       case BOOT_UMS_MMC2:
+               printf("Enter UMS!\n");
+               instance = forced_mode - BOOT_UMS_MMC0;
+               sprintf(cmd, "env set preboot; ums 0 mmc %d", instance);
+               env_set("preboot", cmd);
+               break;
+       case BOOT_RECOVERY:
+               env_set("preboot", "env set preboot; run altbootcmd");
+               break;
+       case BOOT_NORMAL:
+               break;
+       default:
+               pr_debug("unexpected forced boot mode = %x\n", forced_mode);
+               break;
+       }
+
+       /* clear TAMP for next reboot */
+       clrsetbits_le32(TAMP_BOOT_CONTEXT, TAMP_BOOT_FORCED_MASK, BOOT_NORMAL);
 }
 
 /*
@@ -304,7 +472,7 @@ static int setup_mac_address(void)
        if (ret)
                return ret;
 
-       ret = misc_read(dev, BSEC_OTP_MAC * 4 + STM32_BSEC_OTP_OFFSET,
+       ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_MAC),
                        otp, sizeof(otp));
        if (ret < 0)
                return ret;
@@ -342,12 +510,12 @@ static int setup_serial_number(void)
        if (ret)
                return ret;
 
-       ret = misc_read(dev, BSEC_OTP_SERIAL * 4 + STM32_BSEC_OTP_OFFSET,
+       ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_SERIAL),
                        otp, sizeof(otp));
        if (ret < 0)
                return ret;
 
-       sprintf(serial_string, "%08x%08x%08x", otp[0], otp[1], otp[2]);
+       sprintf(serial_string, "%08X%08X%08X", otp[0], otp[1], otp[2]);
        env_set("serial#", serial_string);
 
        return 0;
index 5d0bdca1787d6c7c853ced6cbf13d06ec9fa08f7..c526c88e3ee9caf25558c66c80d976c8bacdb37b 100644 (file)
 #define STM32_RCC_BASE                 0x50000000
 #define STM32_PWR_BASE                 0x50001000
 #define STM32_DBGMCU_BASE              0x50081000
-#define STM32_BSEC_BASE                        0x5C005000
 #define STM32_TZC_BASE                 0x5C006000
 #define STM32_ETZPC_BASE               0x5C007000
 #define STM32_TAMP_BASE                        0x5C00A000
 
-#ifdef CONFIG_DEBUG_UART_BASE
-/* hardcoded value can be only used for DEBUG UART */
 #define STM32_USART1_BASE              0x5C000000
 #define STM32_USART2_BASE              0x4000E000
 #define STM32_USART3_BASE              0x4000F000
@@ -28,7 +25,6 @@
 #define STM32_USART6_BASE              0x44003000
 #define STM32_UART7_BASE               0x40018000
 #define STM32_UART8_BASE               0x40019000
-#endif
 
 #define STM32_SYSRAM_BASE              0x2FFC0000
 #define STM32_SYSRAM_SIZE              SZ_256K
 /* enumerated used to identify the SYSCON driver instance */
 enum {
        STM32MP_SYSCON_UNKNOWN,
-       STM32MP_SYSCON_STGEN,
+       STM32MP_SYSCON_ETZPC,
        STM32MP_SYSCON_PWR,
+       STM32MP_SYSCON_STGEN,
+       STM32MP_SYSCON_SYSCFG,
 };
 
 /*
@@ -95,10 +93,25 @@ enum boot_device {
 #define TAMP_BOOT_MODE_SHIFT           8
 #define TAMP_BOOT_DEVICE_MASK          GENMASK(7, 4)
 #define TAMP_BOOT_INSTANCE_MASK                GENMASK(3, 0)
+#define TAMP_BOOT_FORCED_MASK          GENMASK(7, 0)
+
+enum forced_boot_mode {
+       BOOT_NORMAL = 0x00,
+       BOOT_FASTBOOT = 0x01,
+       BOOT_RECOVERY = 0x02,
+       BOOT_STM32PROG = 0x03,
+       BOOT_UMS_MMC0 = 0x10,
+       BOOT_UMS_MMC1 = 0x11,
+       BOOT_UMS_MMC2 = 0x12,
+};
 
 /* offset used for BSEC driver: misc_read and misc_write */
 #define STM32_BSEC_SHADOW_OFFSET       0x0
+#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 BSEC_OTP_BOARD 59
 
 #endif /* __ASSEMBLY__*/
 #endif /* _MACH_STM32_H_ */
diff --git a/arch/arm/mach-stm32mp/include/mach/stm32mp1_smc.h b/arch/arm/mach-stm32mp/include/mach/stm32mp1_smc.h
new file mode 100644 (file)
index 0000000..8130546
--- /dev/null
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
+/*
+ * Copyright (C) 2019, STMicroelectronics - All Rights Reserved
+ */
+
+#ifndef __STM32MP1_SMC_H__
+#define __STM32MP1_SMC_H__
+
+#include <linux/arm-smccc.h>
+
+/*
+ * SMC function IDs for STM32 Service queries
+ * STM32 SMC services use the space between 0x82000000 and 0x8200FFFF
+ * like this is defined in SMC calling Convention by ARM
+ * for SiP (silicon Partner)
+ * http://infocenter.arm.com/help/topic/com.arm.doc.den0028a/index.html
+ */
+#define STM32_SMC_VERSION              0x82000000
+
+/* Secure Service access from Non-secure */
+#define STM32_SMC_BSEC                 0x82001003
+
+/* Service for BSEC */
+#define STM32_SMC_READ_SHADOW          0x01
+#define STM32_SMC_PROG_OTP             0x02
+#define STM32_SMC_WRITE_SHADOW         0x03
+#define STM32_SMC_READ_OTP             0x04
+#define STM32_SMC_READ_ALL             0x05
+#define STM32_SMC_WRITE_ALL            0x06
+
+/* SMC error codes */
+#define STM32_SMC_OK                   0x0
+#define STM32_SMC_NOT_SUPPORTED                -1
+#define STM32_SMC_FAILED               -2
+#define STM32_SMC_INVALID_PARAMS       -3
+
+#define stm32_smc_exec(svc, op, data1, data2) \
+       stm32_smc(svc, op, data1, data2, NULL)
+
+#ifdef CONFIG_ARM_SMCCC
+static inline u32 stm32_smc(u32 svc, u8 op, u32 data1, u32 data2, u32 *result)
+{
+       struct arm_smccc_res res;
+
+       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);
+               return -EINVAL;
+       }
+       if (result)
+               *result = (u32)res.a1;
+
+       return 0;
+}
+#else
+static inline u32 stm32_smc(u32 svc, u8 op, u32 data1, u32 data2, u32 *result)
+{
+       return 0;
+}
+#endif
+
+#endif /* __STM32MP1_SMC_H__ */
index 41d4b40bcb4fccb0975cf4a78285465ec73230b6..71a3ba794d11b8f90b61bf5bb23ea3229798dfbe 100644 (file)
@@ -3,9 +3,15 @@
  * Copyright (C) 2015-2017, STMicroelectronics - All Rights Reserved
  */
 
-#define CPU_STMP32MP15x        0x500
+/* ID = Device Version (bit31:16) + Device Part Number (RPN) (bit15: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
 
-/* return CPU_STMP32MPxx constants */
+/* return CPU_STMP32MP...Xxx constants */
 u32 get_cpu_type(void);
 
 #define CPU_REVA       0x1000
@@ -13,3 +19,5 @@ u32 get_cpu_type(void);
 
 /* return CPU_REV constants */
 u32 get_cpu_rev(void);
+/* return boot mode */
+u32 get_bootmode(void);
index 6ed2482080c1dcf578c1dc073388451c4151256f..c2dff38c368c9f6c540651157212015d14519cc9 100644 (file)
@@ -103,7 +103,13 @@ int __secure psci_affinity_info(u32 function_id, u32 target_affinity,
 
 int __secure psci_migrate_info_type(u32 function_id)
 {
-       /* Trusted OS is either not present or does not require migration */
+       /*
+        * in Power_State_Coordination_Interface_PDD_v1_1_DEN0022D.pdf
+        * return 2 = Trusted OS is either not present or does not require
+        * migration, system of this type does not require the caller
+        * to use the MIGRATE function.
+        * MIGRATE function calls return NOT_SUPPORTED.
+        */
        return 2;
 }
 
index 790973e8b6e9101bcfb9a10f896f36c68776c8cc..a3b0d6f38252a63a4e564e86e4adb1f6aaf52a2f 100644 (file)
@@ -7,13 +7,14 @@
 #include <dm.h>
 #include <spl.h>
 #include <asm/io.h>
+#include <asm/arch/sys_proto.h>
+#include <linux/libfdt.h>
 
 u32 spl_boot_device(void)
 {
        u32 boot_mode;
 
-       boot_mode = (readl(TAMP_BOOT_CONTEXT) & TAMP_BOOT_MODE_MASK) >>
-                   TAMP_BOOT_MODE_SHIFT;
+       boot_mode = get_bootmode();
 
        switch (boot_mode) {
        case BOOT_FLASH_SD_1:
@@ -22,6 +23,21 @@ u32 spl_boot_device(void)
        case BOOT_FLASH_SD_2:
        case BOOT_FLASH_EMMC_2:
                return BOOT_DEVICE_MMC2;
+       case BOOT_SERIAL_UART_1:
+       case BOOT_SERIAL_UART_2:
+       case BOOT_SERIAL_UART_3:
+       case BOOT_SERIAL_UART_4:
+       case BOOT_SERIAL_UART_5:
+       case BOOT_SERIAL_UART_6:
+       case BOOT_SERIAL_UART_7:
+       case BOOT_SERIAL_UART_8:
+               return BOOT_DEVICE_UART;
+       case BOOT_SERIAL_USB_OTG:
+               return BOOT_DEVICE_USB;
+       case BOOT_FLASH_NAND_FMC:
+               return BOOT_DEVICE_NAND;
+       case BOOT_FLASH_NOR_QSPI:
+               return BOOT_DEVICE_SPI;
        }
 
        return BOOT_DEVICE_MMC1;
@@ -44,6 +60,21 @@ int spl_boot_partition(const u32 boot_device)
        }
 }
 
+#ifdef CONFIG_SPL_DISPLAY_PRINT
+void spl_display_print(void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+       const char *model;
+
+       /* same code than show_board_info() but not compiled for SPL
+        * see CONFIG_DISPLAY_BOARDINFO & common/board_info.c
+        */
+       model = fdt_getprop(gd->fdt_blob, 0, "model", NULL);
+       if (model)
+               printf("Model: %s\n", model);
+}
+#endif
+
 void board_init_f(ulong dummy)
 {
        struct udevice *dev;
@@ -80,7 +111,7 @@ void board_init_f(ulong dummy)
 
        ret = uclass_get_device(UCLASS_RAM, 0, &dev);
        if (ret) {
-               debug("DRAM init failed: %d\n", ret);
-               return;
+               printf("DRAM init failed: %d\n", ret);
+               hang();
        }
 }
index eb7f435f10caefbdc9b7ee14952a9504c3da2ea8..242f8340abb459d1ff492c9401a19d1b99fdd575 100644 (file)
@@ -9,10 +9,11 @@
 #include <asm/arch/stm32.h>
 
 static const struct udevice_id stm32mp_syscon_ids[] = {
-       { .compatible = "st,stm32-stgen",
-         .data = STM32MP_SYSCON_STGEN },
-       { .compatible = "st,stm32mp1-pwr",
-         .data = STM32MP_SYSCON_PWR },
+       { .compatible = "st,stm32mp1-etzpc", .data = STM32MP_SYSCON_ETZPC },
+       { .compatible = "st,stm32mp1-pwr", .data = STM32MP_SYSCON_PWR },
+       { .compatible = "st,stm32-stgen", .data = STM32MP_SYSCON_STGEN },
+       { .compatible = "st,stm32mp157-syscfg",
+         .data = STM32MP_SYSCON_SYSCFG },
        { }
 };
 
index 152deb04e9003d28aef086eade0dd8fb449b2897..1669e62a6d2e3dea7974dd91f421a90e625f03a3 100644 (file)
@@ -154,8 +154,6 @@ config MACH_SUN4I
        bool "sun4i (Allwinner A10)"
        select CPU_V7A
        select ARM_CORTEX_CPU_IS_UP
-       select DM_MMC if MMC
-       select DM_SCSI if SCSI
        select PHY_SUN4I_USB
        select DRAM_SUN4I
        select SUNXI_GEN_SUN4I
@@ -165,7 +163,6 @@ config MACH_SUN5I
        bool "sun5i (Allwinner A13)"
        select CPU_V7A
        select ARM_CORTEX_CPU_IS_UP
-       select DM_MMC if MMC
        select DRAM_SUN4I
        select PHY_SUN4I_USB
        select SUNXI_GEN_SUN4I
@@ -178,7 +175,6 @@ config MACH_SUN6I
        select CPU_V7_HAS_NONSEC
        select CPU_V7_HAS_VIRT
        select ARCH_SUPPORT_PSCI
-       select DM_MMC if MMC
        select DRAM_SUN6I
        select PHY_SUN4I_USB
        select SUN6I_P2WI
@@ -205,7 +201,6 @@ config MACH_SUN8I_A23
        select CPU_V7_HAS_NONSEC
        select CPU_V7_HAS_VIRT
        select ARCH_SUPPORT_PSCI
-       select DM_MMC if MMC
        select DRAM_SUN8I_A23
        select PHY_SUN4I_USB
        select SUNXI_GEN_SUN6I
@@ -219,7 +214,6 @@ config MACH_SUN8I_A33
        select CPU_V7_HAS_NONSEC
        select CPU_V7_HAS_VIRT
        select ARCH_SUPPORT_PSCI
-       select DM_MMC if MMC
        select DRAM_SUN8I_A33
        select PHY_SUN4I_USB
        select SUNXI_GEN_SUN6I
@@ -230,7 +224,6 @@ config MACH_SUN8I_A33
 config MACH_SUN8I_A83T
        bool "sun8i (Allwinner A83T)"
        select CPU_V7A
-       select DM_MMC if MMC
        select DRAM_SUN8I_A83T
        select PHY_SUN4I_USB
        select SUNXI_GEN_SUN6I
@@ -246,7 +239,6 @@ config MACH_SUN8I_H3
        select ARCH_SUPPORT_PSCI
        select MACH_SUNXI_H3_H5
        select ARMV7_BOOT_SEC_DEFAULT if OLD_SUNXI_KERNEL_COMPAT
-       select DM_MMC if MMC
 
 config MACH_SUN8I_R40
        bool "sun8i (Allwinner R40)"
@@ -265,7 +257,6 @@ config MACH_SUN8I_V3S
        select CPU_V7_HAS_NONSEC
        select CPU_V7_HAS_VIRT
        select ARCH_SUPPORT_PSCI
-       select DM_MMC if MMC
        select SUNXI_GEN_SUN6I
        select SUNXI_DRAM_DW
        select SUNXI_DRAM_DW_16BIT
@@ -280,13 +271,11 @@ config MACH_SUN9I
        select SUNXI_GEN_SUN6I
        select SUN8I_RSB
        select SUPPORT_SPL
-       select DM_MMC if MMC
 
 config MACH_SUN50I
        bool "sun50i (Allwinner A64)"
        select ARM64
        select DM_I2C
-       select DM_MMC if MMC
        select PHY_SUN4I_USB
        select SUN6I_PRCM
        select SUNXI_DE2
@@ -303,7 +292,6 @@ config MACH_SUN50I_H5
        bool "sun50i (Allwinner H5)"
        select ARM64
        select MACH_SUNXI_H3_H5
-       select DM_MMC if MMC
        select FIT
        select SPL_LOAD_FIT
 
@@ -311,7 +299,6 @@ config MACH_SUN50I_H6
        bool "sun50i (Allwinner H6)"
        select ARM64
        select SUPPORT_SPL
-       select DM_MMC if MMC
        select FIT
        select SPL_LOAD_FIT
        select DRAM_SUN50I_H6
@@ -426,10 +413,11 @@ endif
 
 config DRAM_ZQ
        int "sunxi dram zq value"
-       default 123 if MACH_SUN4I || MACH_SUN5I || MACH_SUN6I || MACH_SUN8I
+       default 123 if MACH_SUN4I || MACH_SUN5I || MACH_SUN6I || \
+                      MACH_SUN8I_A23 || MACH_SUN8I_A33 || MACH_SUN8I_A83T
        default 127 if MACH_SUN7I
        default 14779 if MACH_SUN8I_V3S
-       default 3881979 if MACH_SUN8I_R40 || MACH_SUN50I_H6
+       default 3881979 if MACH_SUNXI_H3_H5 || MACH_SUN8I_R40 || MACH_SUN50I_H6
        default 4145117 if MACH_SUN9I
        default 3881915 if MACH_SUN50I
        ---help---
@@ -438,6 +426,7 @@ config DRAM_ZQ
 config DRAM_ODT_EN
        bool "sunxi dram odt enable"
        default y if MACH_SUN8I_A23
+       default y if MACH_SUNXI_H3_H5
        default y if MACH_SUN8I_R40
        default y if MACH_SUN50I
        default y if MACH_SUN50I_H6
index b74eaf2a0e474836ae776869dd1a3265a0a664ee..c6dd7b8e54b05c74c04394064cdb7d6139ec7a03 100644 (file)
@@ -240,10 +240,12 @@ uint32_t sunxi_get_boot_device(void)
        boot_source = readb(SPL_ADDR + 0x28);
        switch (boot_source) {
        case SUNXI_BOOTED_FROM_MMC0:
+       case SUNXI_BOOTED_FROM_MMC0_HIGH:
                return BOOT_DEVICE_MMC1;
        case SUNXI_BOOTED_FROM_NAND:
                return BOOT_DEVICE_NAND;
        case SUNXI_BOOTED_FROM_MMC2:
+       case SUNXI_BOOTED_FROM_MMC2_HIGH:
                return BOOT_DEVICE_MMC2;
        case SUNXI_BOOTED_FROM_SPI:
                return BOOT_DEVICE_SPI;
index 1da2727f987420acdb164a3d5693d4ddcfe3efa0..5da01922bfaf69034ae4a8ebc24c18a1f9bde127 100644 (file)
@@ -152,7 +152,7 @@ static void auto_set_timing_para(struct dram_para *para)
        reg_val &= ~(0xff << 8);
        reg_val &= ~(0xff << 0);
        reg_val |= (0x33 << 8);
-       reg_val |= (0x8 << 0);
+       reg_val |= (0x10 << 0);
        writel(reg_val, &mctl_ctl->dramtmg8);
        /* Set phy interface time */
        reg_val = (0x2 << 24) | (t_rdata_en << 16) | (0x1 << 8)
index f6f5414201b520b2d1ed854f4b448a66b4d6f12e..b52ac1785352bfc4b39c9113d1397c25061e70b0 100644 (file)
@@ -27,6 +27,7 @@ void board_init_f(ulong dummy)
        /* Delay is required for clocks to be propagated */
        udelay(1000000);
 
+       debug("Clearing BSS 0x%p - 0x%p\n", __bss_start, __bss_end);
        /* Clear the BSS */
        memset(__bss_start, 0, __bss_end - __bss_start);
 
@@ -85,7 +86,7 @@ u32 spl_boot_device(void)
        case SD_MODE1:
        case SD1_LSHFT_MODE: /* not working on silicon v1 */
 /* if both controllers enabled, then these two are the second controller */
-#if defined(SPL_ZYNQMP_TWO_SDHCI)
+#ifdef CONFIG_SPL_ZYNQMP_TWO_SDHCI
                return BOOT_DEVICE_MMC2;
 /* else, fall through, the one SDHCI controller that is enabled is number 1 */
 #endif
index 665d3cc8c1ca71d81aaebfdfa9a5513a317c4fd3..3522e6cdc82e5662424569a471d3202a11ce082f 100644 (file)
@@ -5,6 +5,7 @@ dtb-$(CONFIG_ARCH_MT7620) += \
        linkit-smart-7688.dtb
 dtb-$(CONFIG_TARGET_AP121) += ap121.dtb
 dtb-$(CONFIG_TARGET_AP143) += ap143.dtb
+dtb-$(CONFIG_TARGET_AP152) += ap152.dtb
 dtb-$(CONFIG_TARGET_BOSTON) += img,boston.dtb
 dtb-$(CONFIG_TARGET_MALTA) += mti,malta.dtb
 dtb-$(CONFIG_TARGET_PIC32MZDASK) += pic32mzda_sk.dtb
index 4ca1c704ca4ecba38ccd4d76773dc3a7d01388ab..f30af502161c92842c2fd4152452da53cfa1737e 100644 (file)
@@ -34,7 +34,7 @@
        spi-flash@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                memory-map = <0x9f000000 0x00800000>;
                spi-max-frequency = <25000000>;
                reg = <0>;
index 6aedd87db9a85595f00f3c701f51c9094da2c1d3..93a098052c79de37b8492a585b24fddb36c3cdd4 100644 (file)
        spi-flash@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                memory-map = <0x9f000000 0x00800000>;
                spi-max-frequency = <25000000>;
                reg = <0>;
        };
 };
+
+&gmac1 {
+       status = "okay";
+       phy-mode = "rgmii";
+};
diff --git a/arch/mips/dts/ap152.dts b/arch/mips/dts/ap152.dts
new file mode 100644 (file)
index 0000000..1722290
--- /dev/null
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018 Rosy Song <rosysong@rosinson.com>
+ */
+
+/dts-v1/;
+#include "qca956x.dtsi"
+
+/ {
+       model = "AP152 Reference Board";
+       compatible = "qca,ap152", "qca,qca956x";
+
+       aliases {
+               spi0 = &spi0;
+               serial0 = &uart0;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+};
+
+&gmac0 {
+       phy-mode = "sgmii";
+       status = "okay";
+};
+
+&xtal {
+       clock-frequency = <25000000>;
+};
+
+&uart0 {
+       clock-frequency = <25000000>;
+       status = "okay";
+};
+
+&spi0 {
+       spi-max-frequency = <25000000>;
+       status = "okay";
+       spi-flash@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "spi-flash";
+               memory-map = <0x9f000000 0x01000000>;
+               spi-max-frequency = <25000000>;
+               reg = <0>;
+       };
+};
index b6f95591476d8ac32901d4ad258dc92948130300..6676f83b2aac319c9a417384eeefbe85d0baba7a 100644 (file)
 
                        status = "disabled";
                };
+
+               gpio_lo: gpio-controller@14e00100 {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x14e00100 0x4>, <0x14e0012c 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               gpio_mid0: gpio-controller@14e00104 {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x14e00104 0x4>, <0x14e00130 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               gpio_mid1: gpio-controller@14e00108 {
+                       compatible = "brcm,bcm6345-gpio";
+                       reg = <0x14e00108 0x4>, <0x14e00134 0x4>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       status = "disabled";
+               };
+
+               nand: nand-controller@14e02200 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "brcm,nand-bcm6838",
+                                    "brcm,brcmnand-v5.0",
+                                    "brcm,brcmnand";
+                       reg-names = "nand", "nand-int-base", "nand-cache";
+                       reg = <0x14e02200 0x180>,
+                             <0x14e000f0 0x10>,
+                             <0x14e02600 0x180>;
+                       status = "disabled";
+               };
        };
 };
index 513045ee0519d81c28dda66da06c99a478d8c65a..5a5ac0ea7d9707842b70a9848e6a13e0c316e97f 100644 (file)
                label = "bcm968380gerg:green:usb";
        };
 };
+
+&gpio_lo {
+       status = "okay";
+};
+
+&gpio_mid0 {
+       status = "okay";
+};
+
+&gpio_mid1 {
+       status = "okay";
+};
+
+&nand {
+       status = "okay";
+
+       nandcs@0 {
+               compatible = "brcm,nandcs";
+               reg = <0>;
+               nand-ecc-strength = <4>;
+               nand-ecc-step-size = <512>;
+               brcm,nand-oob-sector-size = <16>;
+       };
+};
index eb60aaa8d5f832f1ff2a094a68eed644f8f3e2d2..28443b3b0fd9fbc4481ba19b5768e6736d95761c 100644 (file)
        status = "okay";
 
        spi-flash@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                reg = <0>;
                #address-cells = <1>;
                #size-cells = <1>;
index 03e3851ab15b61e462e91823778baa8ddd5f9598..12ace64621bf2c0d89b78510af6e32afd2b96fd7 100644 (file)
@@ -94,7 +94,7 @@
        status = "okay";
 
        spi-flash@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                reg = <0>;
                #address-cells = <1>;
                #size-cells = <1>;
index 75f6037e96a8d4a55b4ef306e9be1f5c509408ba..eedde89dfd8a719cf3647ef0e1c7704c66ec0822 100644 (file)
@@ -10,7 +10,7 @@
 
 / {
        compatible = "gardena,smart-gateway-mt7688", "ralink,mt7628a-soc";
-       model = "Gardena smart-Gateway-MT7688";
+       model = "GARDENA smart Gateway (MT7688)";
 
        aliases {
                serial0 = &uart0;
@@ -97,7 +97,7 @@
        spi-flash@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash", "jedec,spi-nor";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <40000000>;
                reg = <0>;
        };
index ddc30ff76a9b89a775732498ac31a0a5b3bca976..6562221794e170a4345217f90d6ee3e9d4cab0d8 100644 (file)
@@ -5,6 +5,7 @@
 
 /dts-v1/;
 #include "mscc,jr2.dtsi"
+#include <dt-bindings/mscc/jr2_data.h>
 
 / {
        model = "Jaguar2 Cu8-Sfp16 PCB110 Reference Board";
@@ -43,7 +44,7 @@
 &spi0 {
        status = "okay";
        spi-flash@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <18000000>; /* input clock */
                reg = <0>; /* CS0 */
        };
        sgpio-ports = <0x3f00ffff>;
        gpio-ranges = <&sgpio2 0 0 96>;
 };
+
+&mdio1 {
+       status = "okay";
+
+       phy0: ethernet-phy@0 {
+               reg = <0>;
+       };
+       phy1: ethernet-phy@1 {
+               reg = <1>;
+       };
+       phy2: ethernet-phy@2 {
+               reg = <2>;
+       };
+       phy3: ethernet-phy@3 {
+               reg = <3>;
+       };
+       phy4: ethernet-phy@4 {
+               reg = <4>;
+       };
+       phy5: ethernet-phy@5 {
+               reg = <5>;
+       };
+       phy6: ethernet-phy@6 {
+               reg = <6>;
+       };
+       phy7: ethernet-phy@7 {
+               reg = <7>;
+       };
+};
+
+&switch {
+       ethernet-ports {
+
+               port0: port@0 {
+                       reg = <0>;
+                       phy-handle = <&phy0>;
+                       phys = <&serdes_hsio 0 SERDES1G(1) PHY_MODE_SGMII>;
+               };
+               port1: port@1 {
+                       reg = <1>;
+                       phy-handle = <&phy1>;
+                       phys = <&serdes_hsio 1 SERDES1G(2) PHY_MODE_SGMII>;
+               };
+               port2: port@2 {
+                       reg = <2>;
+                       phy-handle = <&phy2>;
+                       phys = <&serdes_hsio 2 SERDES1G(3) PHY_MODE_SGMII>;
+               };
+               port3: port@3 {
+                       reg = <3>;
+                       phy-handle = <&phy3>;
+                       phys = <&serdes_hsio 3 SERDES1G(4) PHY_MODE_SGMII>;
+               };
+               port4: port@4 {
+                       reg = <4>;
+                       phy-handle = <&phy4>;
+                       phys = <&serdes_hsio 4 SERDES1G(5) PHY_MODE_SGMII>;
+               };
+               port5: port@5 {
+                       reg = <5>;
+                       phy-handle = <&phy5>;
+                       phys = <&serdes_hsio 5 SERDES1G(6) PHY_MODE_SGMII>;
+               };
+               port6: port@6 {
+                       reg = <6>;
+                       phy-handle = <&phy6>;
+                       phys = <&serdes_hsio 6 SERDES1G(7) PHY_MODE_SGMII>;
+               };
+               port7: port@7 {
+                       reg = <7>;
+                       phy-handle = <&phy7>;
+                       phys = <&serdes_hsio 7 SERDES1G(8) PHY_MODE_SGMII>;
+               };
+       };
+};
index 4d411b6dc4ea4df18e0c637232ae494e010ed19c..74305a8f3310730487259eb9c5ede0b62e488345 100644 (file)
@@ -5,6 +5,7 @@
 
 /dts-v1/;
 #include "mscc,jr2.dtsi"
+#include <dt-bindings/mscc/jr2_data.h>
 
 / {
        model = "Jaguar2 Cu48 PCB111 Reference Board";
@@ -43,7 +44,7 @@
 &spi0 {
        status = "okay";
        spi-flash@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <18000000>; /* input clock */
                reg = <0>; /* CS0 */
        };
        sgpio-ports = <0xff000000>;
        gpio-ranges = <&sgpio2 0 0 96>;
 };
+
+&mdio1 {
+       status = "okay";
+
+       phy0: ethernet-phy@0 {
+               reg = <0>;
+       };
+       phy1: ethernet-phy@1 {
+               reg = <1>;
+       };
+       phy2: ethernet-phy@2 {
+               reg = <2>;
+       };
+       phy3: ethernet-phy@3 {
+               reg = <3>;
+       };
+       phy4: ethernet-phy@4 {
+               reg = <4>;
+       };
+       phy5: ethernet-phy@5 {
+               reg = <5>;
+       };
+       phy6: ethernet-phy@6 {
+               reg = <6>;
+       };
+       phy7: ethernet-phy@7 {
+               reg = <7>;
+       };
+       phy8: ethernet-phy@8 {
+               reg = <8>;
+       };
+       phy9: ethernet-phy@9 {
+               reg = <9>;
+       };
+       phy10: ethernet-phy@10 {
+               reg = <10>;
+       };
+       phy11: ethernet-phy@11 {
+               reg = <11>;
+       };
+       phy12: ethernet-phy@12 {
+               reg = <12>;
+       };
+       phy13: ethernet-phy@13 {
+               reg = <13>;
+       };
+       phy14: ethernet-phy@14 {
+               reg = <14>;
+       };
+       phy15: ethernet-phy@15 {
+               reg = <15>;
+       };
+       phy16: ethernet-phy@16 {
+               reg = <16>;
+       };
+       phy17: ethernet-phy@17 {
+               reg = <17>;
+       };
+       phy18: ethernet-phy@18 {
+               reg = <18>;
+       };
+       phy19: ethernet-phy@19 {
+               reg = <19>;
+       };
+       phy20: ethernet-phy@20 {
+               reg = <20>;
+       };
+       phy21: ethernet-phy@21 {
+               reg = <21>;
+       };
+       phy22: ethernet-phy@22 {
+               reg = <22>;
+       };
+       phy23: ethernet-phy@23 {
+               reg = <23>;
+       };
+};
+
+&mdio2 {
+       status = "okay";
+
+       phy24: ethernet-phy@24 {
+               reg = <0>;
+       };
+       phy25: ethernet-phy@25 {
+               reg = <1>;
+       };
+       phy26: ethernet-phy@26 {
+               reg = <2>;
+       };
+       phy27: ethernet-phy@27 {
+               reg = <3>;
+       };
+       phy28: ethernet-phy@28 {
+               reg = <4>;
+       };
+       phy29: ethernet-phy@29 {
+               reg = <5>;
+       };
+       phy30: ethernet-phy@30 {
+               reg = <6>;
+       };
+       phy31: ethernet-phy@31 {
+               reg = <7>;
+       };
+       phy32: ethernet-phy@32 {
+               reg = <8>;
+       };
+       phy33: ethernet-phy@33 {
+               reg = <9>;
+       };
+       phy34: ethernet-phy@34 {
+               reg = <10>;
+       };
+       phy35: ethernet-phy@35 {
+               reg = <11>;
+       };
+       phy36: ethernet-phy@36 {
+               reg = <12>;
+       };
+       phy37: ethernet-phy@37 {
+               reg = <13>;
+       };
+       phy38: ethernet-phy@38 {
+               reg = <14>;
+       };
+       phy39: ethernet-phy@39 {
+               reg = <15>;
+       };
+       phy40: ethernet-phy@40 {
+               reg = <16>;
+       };
+       phy41: ethernet-phy@41 {
+               reg = <17>;
+       };
+       phy42: ethernet-phy@42 {
+               reg = <18>;
+       };
+       phy43: ethernet-phy@43 {
+               reg = <19>;
+       };
+       phy44: ethernet-phy@44 {
+               reg = <20>;
+       };
+       phy45: ethernet-phy@45 {
+               reg = <21>;
+       };
+       phy46: ethernet-phy@46 {
+               reg = <22>;
+       };
+       phy47: ethernet-phy@47 {
+               reg = <23>;
+       };
+};
+
+&switch {
+       ethernet-ports {
+               port0: port@0 {
+                       reg = <0>;
+                       phy-handle = <&phy0>;
+                       phys = <&serdes_hsio 0 SERDES6G(4) PHY_MODE_QSGMII>;
+               };
+               port1: port@1 {
+                       reg = <1>;
+                       phy-handle = <&phy1>;
+                       phys = <&serdes_hsio 1 0xff PHY_MODE_QSGMII>;
+               };
+               port2: port@2 {
+                       reg = <2>;
+                       phy-handle = <&phy2>;
+                       phys = <&serdes_hsio 2 0xff PHY_MODE_QSGMII>;
+               };
+               port3: port@3 {
+                       reg = <3>;
+                       phy-handle = <&phy3>;
+                       phys = <&serdes_hsio 3 0xff PHY_MODE_QSGMII>;
+               };
+               port4: port@4 {
+                       reg = <4>;
+                       phy-handle = <&phy4>;
+                       phys = <&serdes_hsio 4 SERDES6G(5) PHY_MODE_QSGMII>;
+               };
+               port5: port@5 {
+                       reg = <5>;
+                       phy-handle = <&phy5>;
+                       phys = <&serdes_hsio 5 0xff PHY_MODE_QSGMII>;
+               };
+               port6: port@6 {
+                       reg = <6>;
+                       phy-handle = <&phy6>;
+                       phys = <&serdes_hsio 6 0xff PHY_MODE_QSGMII>;
+               };
+               port7: port@7 {
+                       reg = <7>;
+                       phy-handle = <&phy7>;
+                       phys = <&serdes_hsio 7 0xff PHY_MODE_QSGMII>;
+               };
+               port8: port@8 {
+                       reg = <8>;
+                       phy-handle = <&phy8>;
+                       phys = <&serdes_hsio 8 SERDES6G(6) PHY_MODE_QSGMII>;
+               };
+               port9: port@9 {
+                       reg = <9>;
+                       phy-handle = <&phy9>;
+                       phys = <&serdes_hsio 9 0xff PHY_MODE_QSGMII>;
+               };
+               port10: port@10 {
+                       reg = <10>;
+                       phy-handle = <&phy10>;
+                       phys = <&serdes_hsio 10 0xff PHY_MODE_QSGMII>;
+               };
+               port11: port@11 {
+                       reg = <11>;
+                       phy-handle = <&phy11>;
+                       phys = <&serdes_hsio 11 0xff PHY_MODE_QSGMII>;
+               };
+               port12: port@12 {
+                       reg = <12>;
+                       phy-handle = <&phy12>;
+                       phys = <&serdes_hsio 12 SERDES6G(7) PHY_MODE_QSGMII>;
+               };
+               port13: port@13 {
+                       reg = <13>;
+                       phy-handle = <&phy13>;
+                       phys = <&serdes_hsio 13 0xff PHY_MODE_QSGMII>;
+               };
+               port14: port@14 {
+                       reg = <14>;
+                       phy-handle = <&phy14>;
+                       phys = <&serdes_hsio 14 0xff PHY_MODE_QSGMII>;
+               };
+               port15: port@15 {
+                       reg = <15>;
+                       phy-handle = <&phy15>;
+                       phys = <&serdes_hsio 15 0xff PHY_MODE_QSGMII>;
+               };
+               port16: port@16 {
+                       reg = <16>;
+                       phy-handle = <&phy16>;
+                       phys = <&serdes_hsio 16 SERDES6G(8) PHY_MODE_QSGMII>;
+               };
+               port17: port@17 {
+                       reg = <17>;
+                       phy-handle = <&phy17>;
+                       phys = <&serdes_hsio 17 0xff PHY_MODE_QSGMII>;
+               };
+               port18: port@18 {
+                       reg = <18>;
+                       phy-handle = <&phy18>;
+                       phys = <&serdes_hsio 18 0xff PHY_MODE_QSGMII>;
+               };
+               port19: port@19 {
+                       reg = <19>;
+                       phy-handle = <&phy19>;
+                       phys = <&serdes_hsio 19 0xff PHY_MODE_QSGMII>;
+               };
+               port20: port@20 {
+                       reg = <20>;
+                       phy-handle = <&phy20>;
+                       phys = <&serdes_hsio 20 SERDES6G(9) PHY_MODE_QSGMII>;
+               };
+               port21: port@21 {
+                       reg = <21>;
+                       phy-handle = <&phy21>;
+                       phys = <&serdes_hsio 21 0xff PHY_MODE_QSGMII>;
+               };
+               port22: port@22 {
+                       reg = <22>;
+                       phy-handle = <&phy22>;
+                       phys = <&serdes_hsio 22 0xff PHY_MODE_QSGMII>;
+               };
+               port23: port@23 {
+                       reg = <23>;
+                       phy-handle = <&phy23>;
+                       phys = <&serdes_hsio 23 0xff PHY_MODE_QSGMII>;
+               };
+               port24: port@24 {
+                       reg = <24>;
+                       phy-handle = <&phy24>;
+                       phys = <&serdes_hsio 24 SERDES6G(10) PHY_MODE_QSGMII>;
+               };
+               port25: port@25 {
+                       reg = <25>;
+                       phy-handle = <&phy25>;
+                       phys = <&serdes_hsio 25 0xff PHY_MODE_QSGMII>;
+               };
+               port26: port@26 {
+                       reg = <26>;
+                       phy-handle = <&phy26>;
+                       phys = <&serdes_hsio 26 0xff PHY_MODE_QSGMII>;
+               };
+               port27: port@27 {
+                       reg = <27>;
+                       phy-handle = <&phy27>;
+                       phys = <&serdes_hsio 27 0xff PHY_MODE_QSGMII>;
+               };
+               port28: port@28 {
+                       reg = <28>;
+                       phy-handle = <&phy28>;
+                       phys = <&serdes_hsio 28 SERDES6G(11) PHY_MODE_QSGMII>;
+               };
+               port29: port@29 {
+                       reg = <29>;
+                       phy-handle = <&phy29>;
+                       phys = <&serdes_hsio 29 0xff PHY_MODE_QSGMII>;
+               };
+               port30: port@30 {
+                       reg = <30>;
+                       phy-handle = <&phy30>;
+                       phys = <&serdes_hsio 30 0xff PHY_MODE_QSGMII>;
+               };
+               port31: port@31 {
+                       reg = <31>;
+                       phy-handle = <&phy31>;
+                       phys = <&serdes_hsio 31 0xff PHY_MODE_QSGMII>;
+               };
+               port32: port@32 {
+                       reg = <32>;
+                       phy-handle = <&phy32>;
+                       phys = <&serdes_hsio 32 SERDES6G(12) PHY_MODE_QSGMII>;
+               };
+               port33: port@33 {
+                       reg = <33>;
+                       phy-handle = <&phy33>;
+                       phys = <&serdes_hsio 33 0xff PHY_MODE_QSGMII>;
+               };
+               port34: port@34 {
+                       reg = <34>;
+                       phy-handle = <&phy34>;
+                       phys = <&serdes_hsio 34 0xff PHY_MODE_QSGMII>;
+               };
+               port35: port@35 {
+                       reg = <35>;
+                       phy-handle = <&phy35>;
+                       phys = <&serdes_hsio 35 0xff PHY_MODE_QSGMII>;
+               };
+               port36: port@36 {
+                       reg = <36>;
+                       phy-handle = <&phy36>;
+                       phys = <&serdes_hsio 36 SERDES6G(13) PHY_MODE_QSGMII>;
+               };
+               port37: port@37 {
+                       reg = <37>;
+                       phy-handle = <&phy37>;
+                       phys = <&serdes_hsio 37 0xff PHY_MODE_QSGMII>;
+               };
+               port38: port@38 {
+                       reg = <38>;
+                       phy-handle = <&phy38>;
+                       phys = <&serdes_hsio 38 0xff PHY_MODE_QSGMII>;
+               };
+               port39: port@39 {
+                       reg = <39>;
+                       phy-handle = <&phy39>;
+                       phys = <&serdes_hsio 39 0xff PHY_MODE_QSGMII>;
+               };
+               port40: port@40 {
+                       reg = <40>;
+                       phy-handle = <&phy40>;
+                       phys = <&serdes_hsio 40 SERDES6G(14) PHY_MODE_QSGMII>;
+               };
+               port41: port@41 {
+                       reg = <41>;
+                       phy-handle = <&phy41>;
+                       phys = <&serdes_hsio 41 0xff PHY_MODE_QSGMII>;
+               };
+               port42: port@42 {
+                       reg = <42>;
+                       phy-handle = <&phy42>;
+                       phys = <&serdes_hsio 42 0xff PHY_MODE_QSGMII>;
+               };
+               port43: port@43 {
+                       reg = <43>;
+                       phy-handle = <&phy43>;
+                       phys = <&serdes_hsio 43 0xff PHY_MODE_QSGMII>;
+               };
+               port44: port@44 {
+                       reg = <44>;
+                       phy-handle = <&phy44>;
+                       phys = <&serdes_hsio 44 SERDES6G(15) PHY_MODE_QSGMII>;
+               };
+               port45: port@45 {
+                       reg = <45>;
+                       phy-handle = <&phy45>;
+                       phys = <&serdes_hsio 45 0xff PHY_MODE_QSGMII>;
+               };
+               port46: port@46 {
+                       reg = <46>;
+                       phy-handle = <&phy46>;
+                       phys = <&serdes_hsio 46 0xff PHY_MODE_QSGMII>;
+               };
+               port47: port@47 {
+                       reg = <47>;
+                       phy-handle = <&phy47>;
+                       phys = <&serdes_hsio 47 0xff PHY_MODE_QSGMII>;
+               };
+       };
+};
index c9db136f30f6f2f340182e9d4c5a69b38c17dfa2..bb104021747a55a7c13aaa35f6e8a2eb3b7658db 100644 (file)
@@ -38,7 +38,7 @@
        spi-flash@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash", "jedec,spi-nor";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <25000000>;
                reg = <0>;
        };
index 315172b19c54a1274eb7f95a67dcb062093a018e..fe457bae9d56e6ab49b2b051d0cf8de85c5c59d8 100644 (file)
@@ -48,7 +48,7 @@
 &spi0 {
        status = "okay";
        spi-flash@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <18000000>; /* input clock */
                reg = <0>; /* CS0 */
                spi-cs-high;
index 9b4d628797e4174eae2d9dd5db7a76e459abb473..f684cc8dd6332eb0c584030342ad04da1fdc932e 100644 (file)
@@ -54,7 +54,7 @@
 &spi0 {
        status = "okay";
        spi-flash@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <18000000>; /* input clock */
                reg = <0>; /* CS0 */
                spi-cs-high;
index 090092607b52010247acf05ec0fed439aad6082c..7f5a96fecdc625b307beaed8470d26d404af3c86 100644 (file)
                        gpio-bank-name = "sgpio2_";
                        sgpio-clock = <0x14>;
                };
+
+               switch: switch@1010000 {
+                       compatible = "mscc,vsc7454-switch";
+                       reg = <0x01040000 0x0100>,   // VTSS_TO_DEV_0
+                             <0x01050000 0x0100>,   // VTSS_TO_DEV_1
+                             <0x01060000 0x0100>,   // VTSS_TO_DEV_2
+                             <0x01070000 0x0100>,   // VTSS_TO_DEV_3
+                             <0x01080000 0x0100>,   // VTSS_TO_DEV_4
+                             <0x01090000 0x0100>,   // VTSS_TO_DEV_5
+                             <0x010a0000 0x0100>,   // VTSS_TO_DEV_6
+                             <0x010b0000 0x0100>,   // VTSS_TO_DEV_7
+                             <0x010c0000 0x0100>,   // VTSS_TO_DEV_8
+                             <0x010d0000 0x0100>,   // VTSS_TO_DEV_9
+                             <0x010e0000 0x0100>,   // VTSS_TO_DEV_10
+                             <0x010f0000 0x0100>,   // VTSS_TO_DEV_11
+                             <0x01100000 0x0100>,   // VTSS_TO_DEV_12
+                             <0x01110000 0x0100>,   // VTSS_TO_DEV_13
+                             <0x01120000 0x0100>,   // VTSS_TO_DEV_14
+                             <0x01130000 0x0100>,   // VTSS_TO_DEV_15
+                             <0x01140000 0x0100>,   // VTSS_TO_DEV_16
+                             <0x01150000 0x0100>,   // VTSS_TO_DEV_17
+                             <0x01160000 0x0100>,   // VTSS_TO_DEV_18
+                             <0x01170000 0x0100>,   // VTSS_TO_DEV_19
+                             <0x01180000 0x0100>,   // VTSS_TO_DEV_20
+                             <0x01190000 0x0100>,   // VTSS_TO_DEV_21
+                             <0x011a0000 0x0100>,   // VTSS_TO_DEV_22
+                             <0x011b0000 0x0100>,   // VTSS_TO_DEV_23
+                             <0x011c0000 0x0100>,   // VTSS_TO_DEV_24
+                             <0x011d0000 0x0100>,   // VTSS_TO_DEV_25
+                             <0x011e0000 0x0100>,   // VTSS_TO_DEV_26
+                             <0x011f0000 0x0100>,   // VTSS_TO_DEV_27
+                             <0x01200000 0x0100>,   // VTSS_TO_DEV_28
+                             <0x01210000 0x0100>,   // VTSS_TO_DEV_29
+                             <0x01220000 0x0100>,   // VTSS_TO_DEV_30
+                             <0x01230000 0x0100>,   // VTSS_TO_DEV_31
+                             <0x01240000 0x0100>,   // VTSS_TO_DEV_32
+                             <0x01250000 0x0100>,   // VTSS_TO_DEV_33
+                             <0x01260000 0x0100>,   // VTSS_TO_DEV_34
+                             <0x01270000 0x0100>,   // VTSS_TO_DEV_35
+                             <0x01280000 0x0100>,   // VTSS_TO_DEV_36
+                             <0x01290000 0x0100>,   // VTSS_TO_DEV_37
+                             <0x012a0000 0x0100>,   // VTSS_TO_DEV_38
+                             <0x012b0000 0x0100>,   // VTSS_TO_DEV_39
+                             <0x012c0000 0x0100>,   // VTSS_TO_DEV_40
+                             <0x012d0000 0x0100>,   // VTSS_TO_DEV_41
+                             <0x012e0000 0x0100>,   // VTSS_TO_DEV_42
+                             <0x012f0000 0x0100>,   // VTSS_TO_DEV_43
+                             <0x01300000 0x0100>,   // VTSS_TO_DEV_44
+                             <0x01310000 0x0100>,   // VTSS_TO_DEV_45
+                             <0x01320000 0x0100>,   // VTSS_TO_DEV_46
+                             <0x01330000 0x0100>,   // VTSS_TO_DEV_47
+                             <0x01f00000 0x100000>, // ANA_AC
+                             <0x01d00000 0x100000>, // ANA_CL
+                             <0x01e00000 0x100000>, // ANA_L2
+                             <0x01410000 0x10000>,  // ASM
+                             <0x01460000 0x10000>,  // HSIO
+                             <0x01420000 0x00000>,  // LRN
+                             <0x017d0000 0x10000>,  // QFWD
+                             <0x01020000 0x20000>,  // QS
+                             <0x017e0000 0x10000>,  // QSYS
+                             <0x01b00000 0x80000>;  // REW
+                       reg-names = "port0", "port1", "port2", "port3", "port4",
+                                   "port5", "port6", "port7", "port8", "port9",
+                                   "port10", "port11", "port12", "port13",
+                                   "port14", "port15", "port16", "port17",
+                                   "port18", "port19", "port20", "port21",
+                                   "port22", "port23", "port24", "port25",
+                                   "port26", "port27", "port28", "port29",
+                                   "port30", "port31", "port32", "port33",
+                                   "port34", "port35", "port36", "port37",
+                                   "port38", "port39", "port40", "port41",
+                                   "port42", "port43", "port44", "port45",
+                                   "port46", "port47", "ana_ac", "ana_cl",
+                                   "ana_l2", "asm", "hsio", "lrn", "qfwd",
+                                   "qs", "qsys", "rew";
+                       status = "okay";
+
+                       ethernet-ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                       };
+               };
+
+               mdio0: mdio@010100c8 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "mscc,jr2-miim";
+                       reg = <0x010100c8 0x24>;
+                       status = "disabled";
+               };
+
+               mdio1: mdio@010100ec {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "mscc,jr2-miim";
+                       reg = <0x010100ec 0x24>;
+                       status = "disabled";
+               };
+
+               mdio2: mdio@01010110 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "mscc,jr2-miim";
+                       reg = <0x01010110 0x24>;
+                       status = "disabled";
+               };
+
+               hsio: syscon@10d0000 {
+                       compatible = "mscc,jr2-hsio", "syscon", "simple-mfd";
+                       reg = <0x10d0000 0x10000>;
+
+                       serdes_hsio: serdes_hsio {
+                               compatible = "mscc,vsc7454-serdes";
+                               #phy-cells = <3>;
+                       };
+               };
        };
 };
index 90725d3b94143e65fdf336e5baeafa0bbc8c22c9..885b5643f7c9c7bb6469548324af8aa302da7537 100644 (file)
@@ -29,7 +29,7 @@
        pinctrl-names = "default";
 
        spi-flash@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <18000000>; /* input clock */
                reg = <0>; /* CS0 */
        };
index 4beb7a38d0cedaf59acd8fa06c2e42302c3b301f..45ae2de5e876a1420294a9314fce7625b2e6e07b 100644 (file)
                        #gpio-cells = <2>;
                        gpio-ranges = <&sgpio 0 0 128>;
                };
+
+               switch: switch@1010000 {
+                       compatible = "mscc,vsc7437-switch";
+                       reg = <0x01030000 0x0100>,   // VTSS_TO_DEV_0
+                             <0x01040000 0x0100>,   // VTSS_TO_DEV_1
+                             <0x01f00000 0x100000>, // ANA_AC
+                             <0x01d00000 0x100000>, // ANA_CL
+                             <0x01e00000 0x100000>, // ANA_L2
+                             <0x01120000 0x10000>,  // ASM
+                             <0x01130000 0x00000>,  // LRN
+                             <0x017d0000 0x10000>,  // QFWD
+                             <0x01020000 0x20000>,  // QS
+                             <0x017e0000 0x10000>,  // QSYS
+                             <0x01b00000 0x80000>;  // REW
+                       reg-names = "port0", "port1",
+                                   "ana_ac", "ana_cl", "ana_l2", "asm", "lrn",
+                                   "qfwd", "qs", "qsys", "rew";
+                       status = "okay";
+
+                       ethernet-ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                       };
+               };
+
+               mdio0: mdio@010100c4 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "mscc,jr2-miim";
+                       reg = <0x010100c4 0x24>;
+                       status = "disabled";
+               };
+
+               mdio1: mdio@010100e8 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "mscc,jr2-miim";
+                       reg = <0x010100e8 0x24>;
+                       status = "disabled";
+               };
        };
 };
index a3d4cd56a23ff6d724e696a51198cc3bfe83bf7e..a42a0da2dd64e2646baef4351fc2167b62e5db0f 100644 (file)
@@ -93,7 +93,7 @@
        status = "okay";
 
        spi-flash@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                reg = <0>;
                #address-cells = <1>;
                #size-cells = <1>;
index ba29ea287e2bab3dfaddd3b6fdd2ac9740d7c4eb..90d34ddbbfbcabdf8829e68fd002ccbfa3e8979a 100644 (file)
 
                                status = "disabled";
                        };
+
+                       gmac0: eth0@0x19000000 {
+                               compatible = "qca,ag953x-mac";
+                               reg = <0x19000000 0x200>;
+                               phy = <&phy4>;
+                               phy-mode = "rmii";
+
+                               status = "disabled";
+                       };
+
+                       gmac1: eth1@0x1a000000 {
+                               compatible = "qca,ag953x-mac";
+                               reg = <0x1a000000 0x200>;
+                               phy = <&phy0>;
+                               phy-mode = "rgmii";
+
+                               status = "disabled";
+
+                               mdio {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       phy0: ethernet-phy@0 {
+                                               reg = <0>;
+                                               phy-mode = "rmii";
+                                       };
+                                       phy4: ethernet-phy@4 {
+                                               reg = <4>;
+                                               phy-mode = "rmii";
+                                       };
+                               };
+                       };
                };
 
                spi0: spi@1f000000 {
diff --git a/arch/mips/dts/qca956x.dtsi b/arch/mips/dts/qca956x.dtsi
new file mode 100644 (file)
index 0000000..6cb360b
--- /dev/null
@@ -0,0 +1,87 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018 Rosy Song <rosysong@rosinson.com>
+ */
+
+#include "skeleton.dtsi"
+
+/ {
+       compatible = "qca,qca956x";
+
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "mips,mips74Kc";
+                       reg = <0>;
+               };
+       };
+
+       clocks {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               xtal: xtal {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-output-names = "xtal";
+               };
+       };
+
+       ahb {
+               compatible = "simple-bus";
+               ranges;
+
+               #address-cells = <1>;
+               #size-cells = <1>;
+
+               apb {
+                       compatible = "simple-bus";
+                       ranges;
+
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       uart0: uart@18020000 {
+                               compatible = "ns16550";
+                               reg = <0x18020000 0x20>;
+                               reg-shift = <2>;
+
+                               status = "disabled";
+                       };
+
+                       gmac0: eth@0x19000000 {
+                               compatible = "qca,ag956x-mac";
+                               reg = <0x19000000 0x200>;
+                               phy = <&phy0>;
+                               phy-mode = "sgmii";
+
+                               status = "disabled";
+
+                               mdio {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       phy0: ethernet-phy@0 {
+                                               reg = <0>;
+                                       };
+                               };
+                       };
+               };
+
+               spi0: spi@1f000000 {
+                       compatible = "qca,ar7100-spi";
+                       reg = <0x1f000000 0x10>;
+
+                       status = "disabled";
+
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+       };
+};
index ec6846dd9f2577a842b09e070f366690a7cbdff2..98ed353f2079b80edac3d0f47c695cbb797b71dc 100644 (file)
@@ -59,7 +59,7 @@
        status = "okay";
 
        spi-flash@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                reg = <0>;
                #address-cells = <1>;
                #size-cells = <1>;
index fe025f4c42a7185a23155348512785e477063c3d..5777a773b1716b01b7447008a5a75e6801e50ff3 100644 (file)
@@ -5,6 +5,7 @@
 
 /dts-v1/;
 #include "mscc,jr2.dtsi"
+#include <dt-bindings/mscc/jr2_data.h>
 
 / {
        model = "Serval2 NID PCB112 Reference Board";
@@ -43,7 +44,7 @@
 &spi0 {
        status = "okay";
        spi-flash@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <18000000>; /* input clock */
                reg = <0>; /* CS0 */
        };
        status = "okay";
        sgpio-ports = <0x3fe0ffff>;
 };
+
+&mdio0 {
+       status = "okay";
+
+       phy16: ethernet-phy@16 {
+               reg = <16>;
+       };
+       phy17: ethernet-phy@17 {
+               reg = <17>;
+       };
+       phy18: ethernet-phy@18 {
+               reg = <18>;
+       };
+       phy19: ethernet-phy@19 {
+               reg = <19>;
+       };
+};
+
+&switch {
+       ethernet-ports {
+
+               port0: port@0 {
+                       reg = <24>;
+                       phy-handle = <&phy16>;
+                       phys = <&serdes_hsio 24 SERDES6G(0) PHY_MODE_SGMII>;
+               };
+               port1: port@1 {
+                       reg = <25>;
+                       phy-handle = <&phy17>;
+                       phys = <&serdes_hsio 25 SERDES6G(1) PHY_MODE_SGMII>;
+               };
+               port2: port@2 {
+                       reg = <26>;
+                       phy-handle = <&phy18>;
+                       phys = <&serdes_hsio 26 SERDES6G(2) PHY_MODE_SGMII>;
+               };
+               port3: port@3 {
+                       reg = <27>;
+                       phy-handle = <&phy19>;
+                       phys = <&serdes_hsio 27 SERDES6G(3) PHY_MODE_SGMII>;
+               };
+       };
+};
index d0d6facba2285964b7f751bf29a8c625e67703bc..1598669447fdd0a9cbe04674ac3fea3762122cdf 100644 (file)
@@ -43,7 +43,7 @@
 &spi0 {
        status = "okay";
        spi-flash@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <18000000>; /* input clock */
                reg = <0>; /* CS0 */
                spi-cs-high;
index 11982498d71f542c01bd7d676e3de0934e495d92..fb3524bb31e0cab2aab8ea9a028ab34acc38bd04 100644 (file)
@@ -43,7 +43,7 @@
 &spi0 {
        status = "okay";
        spi-flash@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <18000000>; /* input clock */
                reg = <0>; /* CS0 */
                spi-cs-high;
index fb3331204b3e80f52a507ea87088a2d3f9a964cf..313b0998e6bfefbdbd27b61774f377c34212b26f 100644 (file)
@@ -43,7 +43,7 @@
 &spi0 {
        status = "okay";
        spi-flash@0 {
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <18000000>; /* input clock */
                reg = <0>; /* CS0 */
                spi-cs-high;
        status = "okay";
        sgpio-ports = <0x0000fe7f>;
 };
+
+&mdio0 {
+       status = "okay";
+
+       phy0: ethernet-phy@0 {
+               reg = <0>;
+       };
+       phy1: ethernet-phy@1 {
+               reg = <1>;
+       };
+};
+
+&switch {
+       ethernet-ports {
+
+               port0: port@0 {
+                       reg = <0>;
+                       phy-handle = <&phy0>;
+               };
+               port1: port@1 {
+                       reg = <1>;
+                       phy-handle = <&phy1>;
+               };
+       };
+};
index 96cf0da5bfb3f778e3d017f8ca49f314ecfc9cdf..2bcad6d201be1f6ffc87a166f239998aa05d3294 100644 (file)
@@ -35,7 +35,7 @@
        spi-flash@0 {
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "spi-flash";
+               compatible = "jedec,spi-nor";
                memory-map = <0x1e000000 0x00800000>;
                spi-max-frequency = <25000000>;
                reg = <0>;
index deca5189e33f93c285c7cc68596e9a4c916187c3..35152cb3f64afe122c1defb58b40fa006fe38d8a 100644 (file)
@@ -215,23 +215,6 @@ static void linux_env_legacy(bootm_headers_t *images)
        }
 }
 
-static int boot_reloc_ramdisk(bootm_headers_t *images)
-{
-       ulong rd_len = images->rd_end - images->rd_start;
-
-       /*
-        * In case of legacy uImage's, relocation of ramdisk is already done
-        * by do_bootm_states() and should not repeated in 'bootm prep'.
-        */
-       if (images->state & BOOTM_STATE_RAMDISK) {
-               debug("## Ramdisk already relocated\n");
-               return 0;
-       }
-
-       return boot_ramdisk_high(&images->lmb, images->rd_start,
-               rd_len, &images->initrd_start, &images->initrd_end);
-}
-
 static int boot_reloc_fdt(bootm_headers_t *images)
 {
        /*
@@ -270,8 +253,6 @@ static int boot_setup_fdt(bootm_headers_t *images)
 
 static void boot_prep_linux(bootm_headers_t *images)
 {
-       boot_reloc_ramdisk(images);
-
        if (CONFIG_IS_ENABLED(MIPS_BOOT_FDT) && images->ft_len) {
                boot_reloc_fdt(images);
                boot_setup_fdt(images);
index bc86f591df83a342f85440d59709cdfa1be8fc37..bdb23b57658fb77bee2681943f9cf4f1785b5a49 100644 (file)
@@ -33,6 +33,15 @@ config SOC_QCA953X
        help
          This supports QCA/Atheros qca953x family SOCs.
 
+config SOC_QCA956X
+       bool
+       select MIPS_TUNE_74KC
+       select SUPPORTS_BIG_ENDIAN
+       select SUPPORTS_CPU_MIPS32_R1
+       select SUPPORTS_CPU_MIPS32_R2
+       help
+         This supports QCA/Atheros qca956x family SOCs.
+
 choice
        prompt "Board select"
 
@@ -44,6 +53,10 @@ config TARGET_AP143
        bool "AP143 Reference Board"
        select SOC_QCA953X
 
+config TARGET_AP152
+       bool "AP152 Reference Board"
+       select SOC_QCA956X
+
 config BOARD_TPLINK_WDR4300
        bool "TP-Link WDR4300 Board"
        select SOC_AR934X
@@ -52,6 +65,7 @@ endchoice
 
 source "board/qca/ap121/Kconfig"
 source "board/qca/ap143/Kconfig"
+source "board/qca/ap152/Kconfig"
 source "board/tplink/wdr4300/Kconfig"
 
 endmenu
index 7aa40c65d3005be867f1b2257ec515ed946b2040..fbd40c02becb9f4123426b66709ceeffbff21589 100644 (file)
@@ -7,3 +7,4 @@ obj-y += dram.o
 obj-$(CONFIG_SOC_AR933X)       += ar933x/
 obj-$(CONFIG_SOC_AR934X)       += ar934x/
 obj-$(CONFIG_SOC_QCA953X)      += qca953x/
+obj-$(CONFIG_SOC_QCA956X)      += qca956x/
index 5d371bb5828d013898a78c45085f036d213b19a3..5888f6eb288d303cb9fb1a3dc312141e76e1c58c 100644 (file)
 #define QCA956X_WMAC_BASE \
        (AR71XX_APB_BASE + 0x00100000)
 #define QCA956X_WMAC_SIZE                              0x20000
+#define QCA956X_RTC_BASE \
+       (AR71XX_APB_BASE + 0x00107000)
+#define QCA956X_RTC_SIZE                                       0x1000
 #define QCA956X_EHCI0_BASE                             0x1b000000
 #define QCA956X_EHCI1_BASE                             0x1b400000
 #define QCA956X_EHCI_SIZE                              0x200
        (AR71XX_APB_BASE + 0x00070000)
 #define QCA956X_GMAC_SIZE                              0x64
 
+#define QCA956X_SRIF_BASE \
+       (AR71XX_APB_BASE + 0x00116000)
+#define QCA956X_SRIF_SIZE                              0x1000
+
 /*
  * DDR_CTRL block
  */
 #define QCA953X_DDR_REG_CTL_CONF                       0x108
 #define QCA953X_DDR_REG_CONFIG3                                0x15c
 
+#define QCA956X_DDR_REG_TAP_CTRL2                      0x24
+#define QCA956X_DDR_REG_TAP_CTRL3                      0x28
+#define QCA956X_DDR_REG_DDR2_CONFIG                    0xb8
+#define QCA956X_DDR_REG_DDR2_EMR2                      0xbc
+#define QCA956X_DDR_REG_DDR2_EMR3                      0xc0
+#define QCA956X_DDR_REG_BURST                          0xc4
+#define QCA956X_DDR_REG_BURST2                         0xc8
+#define QCA956X_DDR_REG_TIMEOUT_MAX                    0xcc
+#define QCA956X_DDR_REG_FSM_WAIT_CTRL                  0xe4
+#define QCA956X_DDR_REG_CTL_CONF                       0x108
+#define QCA956X_DDR_REG_DDR3_CONFIG                    0x15c
+
 /*
  * PLL block
  */
 #define QCA956X_PLL_DDR_CONFIG_REG                     0x08
 #define QCA956X_PLL_DDR_CONFIG1_REG                    0x0c
 #define QCA956X_PLL_CLK_CTRL_REG                       0x10
+#define QCA956X_PLL_SWITCH_CLK_CTRL_REG                        0x28
+#define QCA956X_PLL_ETH_XMII_CTRL_REG                  0x30
+#define QCA956X_PLL_DDR_DIT_FRAC_REG                   0x38
+#define QCA956X_PLL_DDR_DIT2_FRAC_REG                  0x3c
+#define QCA956X_PLL_CPU_DIT_FRAC_REG                   0x40
+#define QCA956X_PLL_CPU_DIT2_FRAC_REG                  0x44
+#define QCA956X_PLL_ETH_SGMII_SERDES_REG               0x4c
 
 #define QCA956X_PLL_CPU_CONFIG_REFDIV_SHIFT            12
 #define QCA956X_PLL_CPU_CONFIG_REFDIV_MASK             0x1f
 #define QCA956X_PLL_CPU_CONFIG1_NFRAC_L_SHIFT          0
 #define QCA956X_PLL_CPU_CONFIG1_NFRAC_L_MASK           0x1f
 #define QCA956X_PLL_CPU_CONFIG1_NFRAC_H_SHIFT          5
-#define QCA956X_PLL_CPU_CONFIG1_NFRAC_H_MASK           0x3fff
+#define QCA956X_PLL_CPU_CONFIG1_NFRAC_H_MASK           0x1fff
 #define QCA956X_PLL_CPU_CONFIG1_NINT_SHIFT             18
 #define QCA956X_PLL_CPU_CONFIG1_NINT_MASK              0x1ff
 
 #define QCA956X_PLL_DDR_CONFIG1_NFRAC_L_SHIFT          0
 #define QCA956X_PLL_DDR_CONFIG1_NFRAC_L_MASK           0x1f
 #define QCA956X_PLL_DDR_CONFIG1_NFRAC_H_SHIFT          5
-#define QCA956X_PLL_DDR_CONFIG1_NFRAC_H_MASK           0x3fff
+#define QCA956X_PLL_DDR_CONFIG1_NFRAC_H_MASK           0x1fff
 #define QCA956X_PLL_DDR_CONFIG1_NINT_SHIFT             18
 #define QCA956X_PLL_DDR_CONFIG1_NINT_MASK              0x1ff
 
 #define QCA955X_RESET_MBOX                             BIT(1)
 #define QCA955X_RESET_I2S                              BIT(0)
 
+#define QCA956X_RESET_EXTERNAL                         BIT(28)
+#define QCA956X_RESET_FULL_CHIP                                BIT(24)
+#define QCA956X_RESET_GE1_MDIO                         BIT(23) /* Reserved in datasheet */
+#define QCA956X_RESET_GE0_MDIO                         BIT(22)
+#define QCA956X_RESET_GE1_MAC                          BIT(13) /* Reserved in datasheet */
+#define QCA956X_RESET_SGMII_ASSERT                     BIT(12)
+#define QCA956X_RESET_GE0_MAC                          BIT(9)
+#define QCA956X_RESET_SGMII                            BIT(8)
+#define QCA956X_RESET_SGMII_ANALOG                             BIT(2)
+#define QCA956X_RESET_SWITCH                           BIT(0)
+
 #define AR933X_BOOTSTRAP_MDIO_GPIO_EN                  BIT(18)
 #define AR933X_BOOTSTRAP_DDR2                          BIT(13)
 #define AR933X_BOOTSTRAP_EEPBUSY                       BIT(4)
 #define QCA953X_GPIO_IN_MUX_UART0_SIN                  9
 #define QCA953X_GPIO_IN_MUX_SPI_DATA_IN                        8
 
+#define QCA956X_GPIO(x)                                        BIT(x)
+#define QCA956X_GPIO_MUX_MASK(x)                       (0xff << (x))
 #define QCA956X_GPIO_OUT_MUX_GE0_MDO                   32
 #define QCA956X_GPIO_OUT_MUX_GE0_MDC                   33
+#define QCA956X_GPIO_IN_MUX_UART0_SIN                  0x12
+#define QCA956X_GPIO_OUT_MUX_UART0_SOUT                        0x16
 
 #define AR71XX_GPIO_COUNT                              16
 #define AR7240_GPIO_COUNT                              18
 #define QCA953X_SRIF_DPLL2_OUTDIV_SHIFT                        13
 #define QCA953X_SRIF_DPLL2_OUTDIV_MASK                 0x7
 
+#define QCA956X_SRIF_BB_DPLL1_REG                      0x180
+#define QCA956X_SRIF_BB_DPLL2_REG                      0x184
+#define QCA956X_SRIF_BB_DPLL3_REG                      0x188
+
+#define QCA956X_SRIF_CPU_DPLL1_REG                     0xf00
+#define QCA956X_SRIF_CPU_DPLL2_REG                     0xf04
+#define QCA956X_SRIF_CPU_DPLL3_REG                     0xf08
+
+#define QCA956X_SRIF_DDR_DPLL1_REG                     0xec0
+#define QCA956X_SRIF_DDR_DPLL2_REG                     0xec4
+#define QCA956X_SRIF_DDR_DPLL3_REG                     0xec8
+
+#define QCA956X_SRIF_PCIE_DPLL1_REG                    0xc80
+#define QCA956X_SRIF_PCIE_DPLL2_REG                    0xc84
+#define QCA956X_SRIF_PCIE_DPLL3_REG                    0xc88
+
+#define QCA956X_SRIF_PMU1_REG                          0xcc0
+#define QCA956X_SRIF_PMU2_REG                          0xcc4
+
 /*
  * MII_CTRL block
  */
 #define QCA955X_ETH_CFG_RGMII_EN                       BIT(0)
 #define QCA955X_ETH_CFG_GE0_SGMII                      BIT(6)
 
+/*
+ * QCA956X GMAC Interface
+ */
+
+#define QCA956X_GMAC_REG_ETH_CFG                       0x00
+#define QCA956X_GMAC_REG_SGMII_RESET                   0x14
+#define QCA956X_GMAC_REG_SGMII_SERDES                  0x18
+#define QCA956X_GMAC_REG_MR_AN_CTRL                    0x1c
+#define QCA956X_GMAC_REG_SGMII_CONFIG                  0x34
+#define QCA956X_GMAC_REG_SGMII_DEBUG                   0x58
+
+#define QCA956X_ETH_CFG_GE0_SGMII                      BIT(6)
+
 #endif /* __ASM_AR71XX_H */
index 5de7a43f79ead4e0f0c39a1f0635920b78294f98..0fde5079b16780c5da07dededcc0fd518af9ded7 100644 (file)
@@ -2,6 +2,7 @@
 /*
  * Atheros AR71XX/AR724X/AR913X common definitions
  *
+ * Copyright (C) 2018-2019 Rosy Song <rosysong@rosinson.com>
  * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
  * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
  * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
@@ -146,4 +147,6 @@ int ath79_usb_reset(void);
 void ar934x_pll_init(const u16 cpu_mhz, const u16 ddr_mhz, const u16 ahb_mhz);
 void ar934x_ddr_init(const u16 cpu_mhz, const u16 ddr_mhz, const u16 ahb_mhz);
 
+void qca956x_pll_init(void);
+void qca956x_ddr_init(void);
 #endif /* __ASM_MACH_ATH79_H */
diff --git a/arch/mips/mach-ath79/qca956x/Makefile b/arch/mips/mach-ath79/qca956x/Makefile
new file mode 100644 (file)
index 0000000..3f5fc03
--- /dev/null
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0+
+
+obj-y += cpu.o
+obj-y += clk.o
+obj-y += ddr.o qca956x-ddr-tap.o
diff --git a/arch/mips/mach-ath79/qca956x/clk.c b/arch/mips/mach-ath79/qca956x/clk.c
new file mode 100644 (file)
index 0000000..33a44cf
--- /dev/null
@@ -0,0 +1,419 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019 Rosy Song <rosysong@rosinson.com>
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/ath79.h>
+#include <wait_bit.h>
+
+#define PLL_SRIF_DPLL2_KI_LSB 29
+#define PLL_SRIF_DPLL2_KI_MASK 0x60000000
+#define PLL_SRIF_DPLL2_KI_SET(x) \
+       (((x) << PLL_SRIF_DPLL2_KI_LSB) & PLL_SRIF_DPLL2_KI_MASK)
+#define PLL_SRIF_DPLL2_KD_LSB 25
+#define PLL_SRIF_DPLL2_KD_MASK 0x1e000000
+#define PLL_SRIF_DPLL2_KD_SET(x) \
+       (((x) << PLL_SRIF_DPLL2_KD_LSB) & PLL_SRIF_DPLL2_KD_MASK)
+#define PLL_SRIF_DPLL2_PLL_PWD_LSB 22
+#define PLL_SRIF_DPLL2_PLL_PWD_MASK 0x00400000
+#define PLL_SRIF_DPLL2_PLL_PWD_SET(x) \
+       (((x) << PLL_SRIF_DPLL2_PLL_PWD_LSB) & PLL_SRIF_DPLL2_PLL_PWD_MASK)
+#define PLL_SRIF_DPLL2_OUTDIV_LSB 19
+#define PLL_SRIF_DPLL2_OUTDIV_MASK 0x00380000
+#define PLL_SRIF_DPLL2_OUTDIV_SET(x) \
+       (((x) << PLL_SRIF_DPLL2_OUTDIV_LSB) & PLL_SRIF_DPLL2_OUTDIV_MASK)
+#define PLL_SRIF_DPLL2_PHASE_SHIFT_LSB 12
+#define PLL_SRIF_DPLL2_PHASE_SHIFT_MASK 0x0007f000
+#define PLL_SRIF_DPLL2_PHASE_SHIFT_SET(x) \
+       (((x) << PLL_SRIF_DPLL2_PHASE_SHIFT_LSB) & PLL_SRIF_DPLL2_PHASE_SHIFT_MASK)
+#define CPU_PLL_CONFIG_PLLPWD_LSB 30
+#define CPU_PLL_CONFIG_PLLPWD_MASK 0x40000000
+#define CPU_PLL_CONFIG_PLLPWD_SET(x) \
+       (((x) << CPU_PLL_CONFIG_PLLPWD_LSB) & CPU_PLL_CONFIG_PLLPWD_MASK)
+#define CPU_PLL_CONFIG_OUTDIV_LSB 19
+#define CPU_PLL_CONFIG_OUTDIV_MASK 0x00380000
+#define CPU_PLL_CONFIG_OUTDIV_SET(x) \
+       (((x) << CPU_PLL_CONFIG_OUTDIV_LSB) & CPU_PLL_CONFIG_OUTDIV_MASK)
+#define CPU_PLL_CONFIG_RANGE_LSB 17
+#define CPU_PLL_CONFIG_RANGE_MASK 0x00060000
+#define CPU_PLL_CONFIG_RANGE_SET(x) \
+       (((x) << CPU_PLL_CONFIG_RANGE_LSB) & CPU_PLL_CONFIG_RANGE_MASK)
+#define CPU_PLL_CONFIG_REFDIV_LSB 12
+#define CPU_PLL_CONFIG_REFDIV_MASK 0x0001f000
+#define CPU_PLL_CONFIG_REFDIV_SET(x) \
+       (((x) << CPU_PLL_CONFIG_REFDIV_LSB) & CPU_PLL_CONFIG_REFDIV_MASK)
+#define CPU_PLL_CONFIG1_NINT_LSB 18
+#define CPU_PLL_CONFIG1_NINT_MASK 0x07fc0000
+#define CPU_PLL_CONFIG1_NINT_SET(x) \
+       (((x) << CPU_PLL_CONFIG1_NINT_LSB) & CPU_PLL_CONFIG1_NINT_MASK)
+#define CPU_PLL_DITHER1_DITHER_EN_LSB 31
+#define CPU_PLL_DITHER1_DITHER_EN_MASK 0x80000000
+#define CPU_PLL_DITHER1_DITHER_EN_SET(x) \
+       (((x) << CPU_PLL_DITHER1_DITHER_EN_LSB) & CPU_PLL_DITHER1_DITHER_EN_MASK)
+#define CPU_PLL_DITHER1_UPDATE_COUNT_LSB 24
+#define CPU_PLL_DITHER1_UPDATE_COUNT_MASK 0x3f000000
+#define CPU_PLL_DITHER1_UPDATE_COUNT_SET(x) \
+       (((x) << CPU_PLL_DITHER1_UPDATE_COUNT_LSB) & CPU_PLL_DITHER1_UPDATE_COUNT_MASK)
+#define CPU_PLL_DITHER1_NFRAC_STEP_LSB 18
+#define CPU_PLL_DITHER1_NFRAC_STEP_MASK 0x00fc0000
+#define CPU_PLL_DITHER1_NFRAC_STEP_SET(x) \
+       (((x) << CPU_PLL_DITHER1_NFRAC_STEP_LSB) & CPU_PLL_DITHER1_NFRAC_STEP_MASK)
+#define CPU_PLL_DITHER1_NFRAC_MIN_LSB 0
+#define CPU_PLL_DITHER1_NFRAC_MIN_MASK 0x0003ffff
+#define CPU_PLL_DITHER1_NFRAC_MIN_SET(x) \
+       (((x) << CPU_PLL_DITHER1_NFRAC_MIN_LSB) & CPU_PLL_DITHER1_NFRAC_MIN_MASK)
+#define CPU_PLL_DITHER2_NFRAC_MAX_LSB 0
+#define CPU_PLL_DITHER2_NFRAC_MAX_MASK 0x0003ffff
+#define CPU_PLL_DITHER2_NFRAC_MAX_SET(x) \
+       (((x) << CPU_PLL_DITHER2_NFRAC_MAX_LSB) & CPU_PLL_DITHER2_NFRAC_MAX_MASK)
+#define DDR_PLL_CONFIG_PLLPWD_LSB 30
+#define DDR_PLL_CONFIG_PLLPWD_MASK 0x40000000
+#define DDR_PLL_CONFIG_PLLPWD_SET(x) \
+       (((x) << DDR_PLL_CONFIG_PLLPWD_LSB) & DDR_PLL_CONFIG_PLLPWD_MASK)
+#define DDR_PLL_CONFIG_OUTDIV_LSB 23
+#define DDR_PLL_CONFIG_OUTDIV_MASK 0x03800000
+#define DDR_PLL_CONFIG_OUTDIV_SET(x) \
+       (((x) << DDR_PLL_CONFIG_OUTDIV_LSB) & DDR_PLL_CONFIG_OUTDIV_MASK)
+#define DDR_PLL_CONFIG_RANGE_LSB 21
+#define DDR_PLL_CONFIG_RANGE_MASK 0x00600000
+#define DDR_PLL_CONFIG_RANGE_SET(x) \
+       (((x) << DDR_PLL_CONFIG_RANGE_LSB) & DDR_PLL_CONFIG_RANGE_MASK)
+#define DDR_PLL_CONFIG_REFDIV_LSB 16
+#define DDR_PLL_CONFIG_REFDIV_MASK 0x001f0000
+#define DDR_PLL_CONFIG_REFDIV_SET(x) \
+       (((x) << DDR_PLL_CONFIG_REFDIV_LSB) & DDR_PLL_CONFIG_REFDIV_MASK)
+#define DDR_PLL_CONFIG1_NINT_LSB 18
+#define DDR_PLL_CONFIG1_NINT_MASK 0x07fc0000
+#define DDR_PLL_CONFIG1_NINT_SET(x) \
+       (((x) << DDR_PLL_CONFIG1_NINT_LSB) & DDR_PLL_CONFIG1_NINT_MASK)
+#define DDR_PLL_DITHER1_DITHER_EN_LSB 31
+#define DDR_PLL_DITHER1_DITHER_EN_MASK 0x80000000
+#define DDR_PLL_DITHER1_DITHER_EN_SET(x) \
+       (((x) << DDR_PLL_DITHER1_DITHER_EN_LSB) & DDR_PLL_DITHER1_DITHER_EN_MASK)
+#define DDR_PLL_DITHER1_UPDATE_COUNT_LSB 27
+#define DDR_PLL_DITHER1_UPDATE_COUNT_MASK 0x78000000
+#define DDR_PLL_DITHER1_UPDATE_COUNT_SET(x) \
+       (((x) << DDR_PLL_DITHER1_UPDATE_COUNT_LSB) & DDR_PLL_DITHER1_UPDATE_COUNT_MASK)
+#define DDR_PLL_DITHER1_NFRAC_STEP_LSB 20
+#define DDR_PLL_DITHER1_NFRAC_STEP_MASK 0x07f00000
+#define DDR_PLL_DITHER1_NFRAC_STEP_SET(x) \
+       (((x) << DDR_PLL_DITHER1_NFRAC_STEP_LSB) & DDR_PLL_DITHER1_NFRAC_STEP_MASK)
+#define DDR_PLL_DITHER1_NFRAC_MIN_LSB 0
+#define DDR_PLL_DITHER1_NFRAC_MIN_MASK 0x0003ffff
+#define DDR_PLL_DITHER1_NFRAC_MIN_SET(x) \
+       (((x) << DDR_PLL_DITHER1_NFRAC_MIN_LSB) & DDR_PLL_DITHER1_NFRAC_MIN_MASK)
+#define DDR_PLL_DITHER2_NFRAC_MAX_LSB 0
+#define DDR_PLL_DITHER2_NFRAC_MAX_MASK 0x0003ffff
+#define DDR_PLL_DITHER2_NFRAC_MAX_SET(x) \
+       (((x) << DDR_PLL_DITHER2_NFRAC_MAX_LSB) & DDR_PLL_DITHER2_NFRAC_MAX_MASK)
+#define CPU_DDR_CLOCK_CONTROL_AHBCLK_FROM_DDRPLL_LSB 24
+#define CPU_DDR_CLOCK_CONTROL_AHBCLK_FROM_DDRPLL_MASK 0x01000000
+#define CPU_DDR_CLOCK_CONTROL_AHBCLK_FROM_DDRPLL_SET(x) \
+       (((x) << CPU_DDR_CLOCK_CONTROL_AHBCLK_FROM_DDRPLL_LSB) & CPU_DDR_CLOCK_CONTROL_AHBCLK_FROM_DDRPLL_MASK)
+#define CPU_DDR_CLOCK_CONTROL_CPU_DDR_CLK_FROM_CPUPLL_LSB 21
+#define CPU_DDR_CLOCK_CONTROL_CPU_DDR_CLK_FROM_CPUPLL_MASK 0x00200000
+#define CPU_DDR_CLOCK_CONTROL_CPU_DDR_CLK_FROM_CPUPLL_SET(x) \
+       (((x) << CPU_DDR_CLOCK_CONTROL_CPU_DDR_CLK_FROM_CPUPLL_LSB) & CPU_DDR_CLOCK_CONTROL_CPU_DDR_CLK_FROM_CPUPLL_MASK)
+#define CPU_DDR_CLOCK_CONTROL_CPU_DDR_CLK_FROM_DDRPLL_LSB 20
+#define CPU_DDR_CLOCK_CONTROL_CPU_DDR_CLK_FROM_DDRPLL_MASK 0x00100000
+#define CPU_DDR_CLOCK_CONTROL_CPU_DDR_CLK_FROM_DDRPLL_SET(x) \
+       (((x) << CPU_DDR_CLOCK_CONTROL_CPU_DDR_CLK_FROM_DDRPLL_LSB) & CPU_DDR_CLOCK_CONTROL_CPU_DDR_CLK_FROM_DDRPLL_MASK)
+#define CPU_DDR_CLOCK_CONTROL_AHB_POST_DIV_LSB 15
+#define CPU_DDR_CLOCK_CONTROL_AHB_POST_DIV_MASK 0x000f8000
+#define CPU_DDR_CLOCK_CONTROL_AHB_POST_DIV_SET(x) \
+       (((x) << CPU_DDR_CLOCK_CONTROL_AHB_POST_DIV_LSB) & CPU_DDR_CLOCK_CONTROL_AHB_POST_DIV_MASK)
+#define CPU_DDR_CLOCK_CONTROL_DDR_POST_DIV_LSB 10
+#define CPU_DDR_CLOCK_CONTROL_DDR_POST_DIV_MASK 0x00007c00
+#define CPU_DDR_CLOCK_CONTROL_DDR_POST_DIV_SET(x) \
+       (((x) << CPU_DDR_CLOCK_CONTROL_DDR_POST_DIV_LSB) & CPU_DDR_CLOCK_CONTROL_DDR_POST_DIV_MASK)
+#define CPU_DDR_CLOCK_CONTROL_CPU_POST_DIV_LSB 5
+#define CPU_DDR_CLOCK_CONTROL_CPU_POST_DIV_MASK 0x000003e0
+#define CPU_DDR_CLOCK_CONTROL_CPU_POST_DIV_SET(x) \
+       (((x) << CPU_DDR_CLOCK_CONTROL_CPU_POST_DIV_LSB) & CPU_DDR_CLOCK_CONTROL_CPU_POST_DIV_MASK)
+#define CPU_DDR_CLOCK_CONTROL_AHB_PLL_BYPASS_LSB 4
+#define CPU_DDR_CLOCK_CONTROL_AHB_PLL_BYPASS_MASK 0x00000010
+#define CPU_DDR_CLOCK_CONTROL_AHB_PLL_BYPASS_SET(x) \
+       (((x) << CPU_DDR_CLOCK_CONTROL_AHB_PLL_BYPASS_LSB) & CPU_DDR_CLOCK_CONTROL_AHB_PLL_BYPASS_MASK)
+#define CPU_DDR_CLOCK_CONTROL_DDR_PLL_BYPASS_LSB 3
+#define CPU_DDR_CLOCK_CONTROL_DDR_PLL_BYPASS_MASK 0x00000008
+#define CPU_DDR_CLOCK_CONTROL_DDR_PLL_BYPASS_SET(x) \
+       (((x) << CPU_DDR_CLOCK_CONTROL_DDR_PLL_BYPASS_LSB) & CPU_DDR_CLOCK_CONTROL_DDR_PLL_BYPASS_MASK)
+#define CPU_DDR_CLOCK_CONTROL_CPU_PLL_BYPASS_LSB 2
+#define CPU_DDR_CLOCK_CONTROL_CPU_PLL_BYPASS_MASK 0x00000004
+#define CPU_DDR_CLOCK_CONTROL_CPU_PLL_BYPASS_SET(x) \
+       (((x) << CPU_DDR_CLOCK_CONTROL_CPU_PLL_BYPASS_LSB) & CPU_DDR_CLOCK_CONTROL_CPU_PLL_BYPASS_MASK)
+
+#define CPU_PLL_CONFIG1_NINT_VAL CPU_PLL_CONFIG1_NINT_SET(0x1f)
+#define CPU_PLL_CONFIG_REF_DIV_VAL CPU_PLL_CONFIG_REFDIV_SET(0x1)
+#define CPU_PLL_CONFIG_RANGE_VAL CPU_PLL_CONFIG_RANGE_SET(0)
+#define CPU_PLL_CONFIG_OUT_DIV_VAL1 CPU_PLL_CONFIG_OUTDIV_SET(0)
+#define CPU_PLL_CONFIG_OUT_DIV_VAL2 CPU_PLL_CONFIG_OUTDIV_SET(0)
+#define CPU_PLL_DITHER1_VAL CPU_PLL_DITHER1_DITHER_EN_SET(0) | \
+       CPU_PLL_DITHER1_NFRAC_MIN_SET(0) | \
+       CPU_PLL_DITHER1_NFRAC_STEP_SET(0) | \
+       CPU_PLL_DITHER1_UPDATE_COUNT_SET(0x0)
+#define CPU_PLL_DITHER2_VAL CPU_PLL_DITHER2_NFRAC_MAX_SET(0x0)
+#define DDR_PLL_CONFIG1_NINT_VAL DDR_PLL_CONFIG1_NINT_SET(0x1a)
+#define DDR_PLL_CONFIG_REF_DIV_VAL DDR_PLL_CONFIG_REFDIV_SET(0x1)
+#define DDR_PLL_CONFIG_RANGE_VAL DDR_PLL_CONFIG_RANGE_SET(0)
+#define DDR_PLL_CONFIG_OUT_DIV_VAL1 DDR_PLL_CONFIG_OUTDIV_SET(0)
+#define DDR_PLL_CONFIG_OUT_DIV_VAL2 DDR_PLL_CONFIG_OUTDIV_SET(0)
+#define DDR_PLL_DITHER1_VAL DDR_PLL_DITHER1_DITHER_EN_SET(0) | \
+       DDR_PLL_DITHER1_NFRAC_MIN_SET(0) | \
+       DDR_PLL_DITHER1_NFRAC_STEP_SET(0) | \
+       DDR_PLL_DITHER1_UPDATE_COUNT_SET(0x0)
+#define DDR_PLL_DITHER2_VAL DDR_PLL_DITHER2_NFRAC_MAX_SET(0x0)
+#define AHB_CLK_FROM_DDR CPU_DDR_CLOCK_CONTROL_AHBCLK_FROM_DDRPLL_SET(0)
+#define CPU_AND_DDR_CLK_FROM_DDR \
+       CPU_DDR_CLOCK_CONTROL_CPU_DDR_CLK_FROM_DDRPLL_SET(0)
+#define CPU_AND_DDR_CLK_FROM_CPU \
+       CPU_DDR_CLOCK_CONTROL_CPU_DDR_CLK_FROM_CPUPLL_SET(0)
+#define CPU_DDR_CLOCK_CONTROL_AHB_DIV_VAL \
+       CPU_DDR_CLOCK_CONTROL_AHB_POST_DIV_SET(0x2)
+#define CPU_DDR_CLOCK_CONTROL_DDR_POST_DIV \
+       CPU_DDR_CLOCK_CONTROL_DDR_POST_DIV_SET(0)
+#define CPU_DDR_CLOCK_CONTROL_CPU_POST_DIV \
+       CPU_DDR_CLOCK_CONTROL_CPU_POST_DIV_SET(0)
+
+static inline void set_val(u32 _reg, u32 _mask, u32 _val)
+{
+       void __iomem *pll_regs = map_physmem(AR71XX_PLL_BASE,
+                                            AR71XX_PLL_SIZE, MAP_NOCACHE);
+       writel((readl(pll_regs + _reg) & (~(_mask))) | _val, pll_regs + _reg);
+}
+
+#define cpu_pll_set(_mask, _val)       \
+       set_val(QCA956X_PLL_CPU_CONFIG_REG, _mask, _val)
+
+#define ddr_pll_set(_mask, _val)       \
+       set_val(QCA956X_PLL_DDR_CONFIG_REG, _mask, _val)
+
+#define cpu_ddr_control_set(_mask, _val)       \
+       set_val(QCA956X_PLL_CLK_CTRL_REG, _mask, _val)
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static u32 qca956x_get_xtal(void)
+{
+       u32 val;
+
+       val = ath79_get_bootstrap();
+       if (val & QCA956X_BOOTSTRAP_REF_CLK_40)
+               return 40000000;
+       else
+               return 25000000;
+}
+
+int get_serial_clock(void)
+{
+       return qca956x_get_xtal();
+}
+
+void qca956x_pll_init(void)
+{
+       void __iomem *srif_regs = map_physmem(QCA956X_SRIF_BASE,
+                                             QCA956X_SRIF_SIZE, MAP_NOCACHE);
+       void __iomem *pll_regs = map_physmem(AR71XX_PLL_BASE,
+                                            AR71XX_PLL_SIZE, MAP_NOCACHE);
+
+       /* 8.16.2 Baseband DPLL2 */
+       writel(PLL_SRIF_DPLL2_KI_SET(2) | PLL_SRIF_DPLL2_KD_SET(0xa) |
+               PLL_SRIF_DPLL2_PLL_PWD_SET(1) | PLL_SRIF_DPLL2_OUTDIV_SET(1) |
+               PLL_SRIF_DPLL2_PHASE_SHIFT_SET(6), srif_regs + QCA956X_SRIF_BB_DPLL2_REG);
+
+       /* 8.16.2 PCIE DPLL2 */
+       writel(PLL_SRIF_DPLL2_KI_SET(2) | PLL_SRIF_DPLL2_KD_SET(0xa) |
+               PLL_SRIF_DPLL2_PLL_PWD_SET(1) | PLL_SRIF_DPLL2_OUTDIV_SET(3) |
+               PLL_SRIF_DPLL2_PHASE_SHIFT_SET(6), srif_regs + QCA956X_SRIF_PCIE_DPLL2_REG);
+
+       /* 8.16.2 DDR DPLL2 */
+       writel(PLL_SRIF_DPLL2_KI_SET(2) | PLL_SRIF_DPLL2_KD_SET(0xa) |
+               PLL_SRIF_DPLL2_PLL_PWD_SET(1) | PLL_SRIF_DPLL2_PHASE_SHIFT_SET(6),
+               srif_regs + QCA956X_SRIF_DDR_DPLL2_REG);
+
+       /* 8.16.2 CPU DPLL2 */
+       writel(PLL_SRIF_DPLL2_KI_SET(1) | PLL_SRIF_DPLL2_KD_SET(7) |
+                         PLL_SRIF_DPLL2_PLL_PWD_SET(1) | PLL_SRIF_DPLL2_PHASE_SHIFT_SET(6),
+                         srif_regs + QCA956X_SRIF_CPU_DPLL2_REG);
+
+       /* pll_bypass_set */
+       cpu_ddr_control_set(CPU_DDR_CLOCK_CONTROL_CPU_PLL_BYPASS_MASK,
+                           CPU_DDR_CLOCK_CONTROL_CPU_PLL_BYPASS_SET(1));
+       cpu_ddr_control_set(CPU_DDR_CLOCK_CONTROL_DDR_PLL_BYPASS_MASK,
+                           CPU_DDR_CLOCK_CONTROL_DDR_PLL_BYPASS_SET(1));
+       cpu_ddr_control_set(CPU_DDR_CLOCK_CONTROL_AHB_PLL_BYPASS_MASK,
+                           CPU_DDR_CLOCK_CONTROL_AHB_PLL_BYPASS_SET(1));
+
+       /* init_cpu_pll */
+       cpu_pll_set(CPU_PLL_CONFIG_PLLPWD_MASK,  CPU_PLL_CONFIG_PLLPWD_SET(1));
+       cpu_pll_set(CPU_PLL_CONFIG_REFDIV_MASK, CPU_PLL_CONFIG_REF_DIV_VAL);
+       cpu_pll_set(CPU_PLL_CONFIG_RANGE_MASK, CPU_PLL_CONFIG_RANGE_VAL);
+       cpu_pll_set(CPU_PLL_CONFIG_OUTDIV_MASK, CPU_PLL_CONFIG_OUT_DIV_VAL1);
+       set_val(QCA956X_PLL_CPU_CONFIG1_REG, CPU_PLL_CONFIG1_NINT_MASK, \
+               CPU_PLL_CONFIG1_NINT_VAL);
+
+       /* init_ddr_pll */
+       ddr_pll_set(DDR_PLL_CONFIG_PLLPWD_MASK,  DDR_PLL_CONFIG_PLLPWD_SET(1));
+       ddr_pll_set(DDR_PLL_CONFIG_REFDIV_MASK, DDR_PLL_CONFIG_REF_DIV_VAL);
+       ddr_pll_set(DDR_PLL_CONFIG_RANGE_MASK, DDR_PLL_CONFIG_RANGE_VAL);
+       ddr_pll_set(DDR_PLL_CONFIG_OUTDIV_MASK, DDR_PLL_CONFIG_OUT_DIV_VAL1);
+       set_val(QCA956X_PLL_DDR_CONFIG1_REG, DDR_PLL_CONFIG1_NINT_MASK,
+               DDR_PLL_CONFIG1_NINT_VAL);
+
+       /* init_ahb_pll */
+       writel(CPU_DDR_CLOCK_CONTROL_AHB_DIV_VAL | AHB_CLK_FROM_DDR |
+               CPU_AND_DDR_CLK_FROM_DDR | CPU_AND_DDR_CLK_FROM_CPU |
+               CPU_DDR_CLOCK_CONTROL_DDR_POST_DIV | CPU_DDR_CLOCK_CONTROL_CPU_POST_DIV |
+               CPU_DDR_CLOCK_CONTROL_CPU_PLL_BYPASS_SET(1) |
+               CPU_DDR_CLOCK_CONTROL_DDR_PLL_BYPASS_SET(1) |
+               CPU_DDR_CLOCK_CONTROL_AHB_PLL_BYPASS_SET(1), pll_regs + QCA956X_PLL_CLK_CTRL_REG);
+
+       /* ddr_pll_dither_unset */
+       writel(DDR_PLL_DITHER1_VAL, pll_regs + QCA956X_PLL_DDR_DIT_FRAC_REG);
+       writel(DDR_PLL_DITHER2_VAL, pll_regs + QCA956X_PLL_DDR_DIT2_FRAC_REG);
+
+       /* cpu_pll_dither_unset */
+       writel(CPU_PLL_DITHER1_VAL, pll_regs + QCA956X_PLL_CPU_DIT_FRAC_REG);
+       writel(CPU_PLL_DITHER2_VAL, pll_regs + QCA956X_PLL_CPU_DIT2_FRAC_REG);
+
+       /* pll_pwd_unset */
+       cpu_pll_set(CPU_PLL_CONFIG_PLLPWD_MASK, CPU_PLL_CONFIG_PLLPWD_SET(0));
+       ddr_pll_set(DDR_PLL_CONFIG_PLLPWD_MASK, DDR_PLL_CONFIG_PLLPWD_SET(0));
+
+       /* outdiv_unset */
+       cpu_pll_set(CPU_PLL_CONFIG_OUTDIV_MASK, CPU_PLL_CONFIG_OUT_DIV_VAL2);
+       ddr_pll_set(DDR_PLL_CONFIG_OUTDIV_MASK, DDR_PLL_CONFIG_OUT_DIV_VAL2);
+
+       /* pll_bypass_unset */
+       cpu_ddr_control_set(CPU_DDR_CLOCK_CONTROL_CPU_PLL_BYPASS_MASK,
+                           CPU_DDR_CLOCK_CONTROL_CPU_PLL_BYPASS_SET(0));
+       cpu_ddr_control_set(CPU_DDR_CLOCK_CONTROL_DDR_PLL_BYPASS_MASK,
+                           CPU_DDR_CLOCK_CONTROL_DDR_PLL_BYPASS_SET(0));
+       cpu_ddr_control_set(CPU_DDR_CLOCK_CONTROL_AHB_PLL_BYPASS_MASK,
+                           CPU_DDR_CLOCK_CONTROL_AHB_PLL_BYPASS_SET(0));
+
+       while (readl(pll_regs + QCA956X_PLL_CPU_CONFIG_REG) & 0x8000000)
+               /* NOP */;
+
+       while (readl(pll_regs + QCA956X_PLL_DDR_CONFIG_REG) & 0x8000000)
+               /* NOP */;
+}
+
+int get_clocks(void)
+{
+       void __iomem *regs;
+       u32 ref_rate, cpu_rate, ddr_rate, ahb_rate;
+       u32 out_div, ref_div, postdiv, nint, hfrac, lfrac, clk_ctrl;
+       u32 pll, cpu_pll, ddr_pll, misc;
+
+       /*
+        * QCA956x timer init workaround has to be applied right before setting
+        * up the clock. Else, there will be no jiffies
+        */
+       regs = map_physmem(AR71XX_RESET_BASE, AR71XX_RESET_SIZE,
+                          MAP_NOCACHE);
+       misc = readl(regs + AR71XX_RESET_REG_MISC_INT_ENABLE);
+       misc |= MISC_INT_MIPS_SI_TIMERINT_MASK;
+       writel(misc, regs + AR71XX_RESET_REG_MISC_INT_ENABLE);
+
+       regs = map_physmem(AR71XX_PLL_BASE, AR71XX_PLL_SIZE,
+                          MAP_NOCACHE);
+       pll = readl(regs + QCA956X_PLL_CPU_CONFIG_REG);
+       out_div = (pll >> QCA956X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
+                         QCA956X_PLL_CPU_CONFIG_OUTDIV_MASK;
+       ref_div = (pll >> QCA956X_PLL_CPU_CONFIG_REFDIV_SHIFT) &
+                         QCA956X_PLL_CPU_CONFIG_REFDIV_MASK;
+
+       pll = readl(regs + QCA956X_PLL_CPU_CONFIG1_REG);
+       nint = (pll >> QCA956X_PLL_CPU_CONFIG1_NINT_SHIFT) &
+                         QCA956X_PLL_CPU_CONFIG1_NINT_MASK;
+       hfrac = (pll >> QCA956X_PLL_CPU_CONFIG1_NFRAC_H_SHIFT) &
+                         QCA956X_PLL_CPU_CONFIG1_NFRAC_H_MASK;
+       lfrac = (pll >> QCA956X_PLL_CPU_CONFIG1_NFRAC_L_SHIFT) &
+                         QCA956X_PLL_CPU_CONFIG1_NFRAC_L_MASK;
+
+       ref_rate = qca956x_get_xtal();
+
+       cpu_pll = nint * ref_rate / ref_div;
+       cpu_pll += (lfrac * ref_rate) / ((ref_div * 25) << 13);
+       cpu_pll += (hfrac >> 13) * ref_rate / ref_div;
+       cpu_pll /= (1 << out_div);
+
+       pll = readl(regs + QCA956X_PLL_DDR_CONFIG_REG);
+       out_div = (pll >> QCA956X_PLL_DDR_CONFIG_OUTDIV_SHIFT) &
+                         QCA956X_PLL_DDR_CONFIG_OUTDIV_MASK;
+       ref_div = (pll >> QCA956X_PLL_DDR_CONFIG_REFDIV_SHIFT) &
+                         QCA956X_PLL_DDR_CONFIG_REFDIV_MASK;
+       pll = readl(regs + QCA956X_PLL_DDR_CONFIG1_REG);
+       nint = (pll >> QCA956X_PLL_DDR_CONFIG1_NINT_SHIFT) &
+               QCA956X_PLL_DDR_CONFIG1_NINT_MASK;
+       hfrac = (pll >> QCA956X_PLL_DDR_CONFIG1_NFRAC_H_SHIFT) &
+               QCA956X_PLL_DDR_CONFIG1_NFRAC_H_MASK;
+       lfrac = (pll >> QCA956X_PLL_DDR_CONFIG1_NFRAC_L_SHIFT) &
+               QCA956X_PLL_DDR_CONFIG1_NFRAC_L_MASK;
+
+       ddr_pll = nint * ref_rate / ref_div;
+       ddr_pll += (lfrac * ref_rate) / ((ref_div * 25) << 13);
+       ddr_pll += (hfrac >> 13) * ref_rate / ref_div;
+       ddr_pll /= (1 << out_div);
+
+       clk_ctrl = readl(regs + QCA956X_PLL_CLK_CTRL_REG);
+
+       postdiv = (clk_ctrl >> QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT) &
+                 QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_MASK;
+
+       if (clk_ctrl & QCA956X_PLL_CLK_CTRL_CPU_PLL_BYPASS)
+               cpu_rate = ref_rate;
+       else if (clk_ctrl & QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_CPUPLL)
+               cpu_rate = ddr_pll / (postdiv + 1);
+       else
+               cpu_rate = cpu_pll / (postdiv + 1);
+
+       postdiv = (clk_ctrl >> QCA956X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT) &
+                 QCA956X_PLL_CLK_CTRL_DDR_POST_DIV_MASK;
+
+       if (clk_ctrl & QCA956X_PLL_CLK_CTRL_DDR_PLL_BYPASS)
+               ddr_rate = ref_rate;
+       else if (clk_ctrl & QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_DDRPLL)
+               ddr_rate = cpu_pll / (postdiv + 1);
+       else
+               ddr_rate = ddr_pll / (postdiv + 1);
+
+       postdiv = (clk_ctrl >> QCA956X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT) &
+                 QCA956X_PLL_CLK_CTRL_AHB_POST_DIV_MASK;
+
+       if (clk_ctrl & QCA956X_PLL_CLK_CTRL_AHB_PLL_BYPASS)
+               ahb_rate = ref_rate;
+       else if (clk_ctrl & QCA956X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL)
+               ahb_rate = ddr_pll / (postdiv + 1);
+       else
+               ahb_rate = cpu_pll / (postdiv + 1);
+
+       gd->cpu_clk = cpu_rate;
+       gd->mem_clk = ddr_rate;
+       gd->bus_clk = ahb_rate;
+
+       debug("cpu_clk=%u, ddr_clk=%u, bus_clk=%u\n",
+             cpu_rate, ddr_rate, ahb_rate);
+
+       return 0;
+}
+
+ulong get_bus_freq(ulong dummy)
+{
+       if (!gd->bus_clk)
+               get_clocks();
+       return gd->bus_clk;
+}
+
+ulong get_ddr_freq(ulong dummy)
+{
+       if (!gd->mem_clk)
+               get_clocks();
+       return gd->mem_clk;
+}
diff --git a/arch/mips/mach-ath79/qca956x/cpu.c b/arch/mips/mach-ath79/qca956x/cpu.c
new file mode 100644 (file)
index 0000000..08a8c84
--- /dev/null
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019 Rosy Song <rosysong@rosinson.com>
+ */
+
+#include <common.h>
+
+/* The lowlevel_init() is not needed on QCA956X */
+void lowlevel_init(void) {}
diff --git a/arch/mips/mach-ath79/qca956x/ddr.c b/arch/mips/mach-ath79/qca956x/ddr.c
new file mode 100644 (file)
index 0000000..fb22304
--- /dev/null
@@ -0,0 +1,308 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019 Rosy Song <rosysong@rosinson.com>
+ *
+ * Based on QSDK
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/ath79.h>
+
+#define DDR_FSM_WAIT_CTRL_VAL 0xa12
+#define DDR_CTL_CONFIG_SRAM_TSEL_LSB 30
+#define DDR_CTL_CONFIG_SRAM_TSEL_MASK 0xc0000000
+#define DDR_CTL_CONFIG_SRAM_TSEL_SET(x) \
+       (((x) << DDR_CTL_CONFIG_SRAM_TSEL_LSB) & DDR_CTL_CONFIG_SRAM_TSEL_MASK)
+#define DDR_CTL_CONFIG_GE0_SRAM_SYNC_LSB 20
+#define DDR_CTL_CONFIG_GE0_SRAM_SYNC_MASK 0x00100000
+#define DDR_CTL_CONFIG_GE0_SRAM_SYNC_SET(x) \
+       (((x) << DDR_CTL_CONFIG_GE0_SRAM_SYNC_LSB) & DDR_CTL_CONFIG_GE0_SRAM_SYNC_MASK)
+#define DDR_CTL_CONFIG_GE1_SRAM_SYNC_LSB 19
+#define DDR_CTL_CONFIG_GE1_SRAM_SYNC_MASK 0x00080000
+#define DDR_CTL_CONFIG_GE1_SRAM_SYNC_SET(x) \
+       (((x) << DDR_CTL_CONFIG_GE1_SRAM_SYNC_LSB) & DDR_CTL_CONFIG_GE1_SRAM_SYNC_MASK)
+#define DDR_CTL_CONFIG_USB_SRAM_SYNC_LSB 18
+#define DDR_CTL_CONFIG_USB_SRAM_SYNC_MASK 0x00040000
+#define DDR_CTL_CONFIG_USB_SRAM_SYNC_SET(x) \
+       (((x) << DDR_CTL_CONFIG_USB_SRAM_SYNC_LSB) & DDR_CTL_CONFIG_USB_SRAM_SYNC_MASK)
+#define DDR_CTL_CONFIG_PCIE_SRAM_SYNC_LSB 17
+#define DDR_CTL_CONFIG_PCIE_SRAM_SYNC_MASK 0x00020000
+#define DDR_CTL_CONFIG_PCIE_SRAM_SYNC_SET(x) \
+       (((x) << DDR_CTL_CONFIG_PCIE_SRAM_SYNC_LSB) & DDR_CTL_CONFIG_PCIE_SRAM_SYNC_MASK)
+#define DDR_CTL_CONFIG_WMAC_SRAM_SYNC_LSB 16
+#define DDR_CTL_CONFIG_WMAC_SRAM_SYNC_MASK 0x00010000
+#define DDR_CTL_CONFIG_WMAC_SRAM_SYNC_SET(x) \
+       (((x) << DDR_CTL_CONFIG_WMAC_SRAM_SYNC_LSB) & DDR_CTL_CONFIG_WMAC_SRAM_SYNC_MASK)
+#define DDR_CTL_CONFIG_MISC_SRC1_SRAM_SYNC_LSB 15
+#define DDR_CTL_CONFIG_MISC_SRC1_SRAM_SYNC_MASK 0x00008000
+#define DDR_CTL_CONFIG_MISC_SRC1_SRAM_SYNC_SET(x) \
+       (((x) << DDR_CTL_CONFIG_MISC_SRC1_SRAM_SYNC_LSB) & DDR_CTL_CONFIG_MISC_SRC1_SRAM_SYNC_MASK)
+#define DDR_CTL_CONFIG_MISC_SRC2_SRAM_SYNC_LSB 14
+#define DDR_CTL_CONFIG_MISC_SRC2_SRAM_SYNC_MASK 0x00004000
+#define DDR_CTL_CONFIG_MISC_SRC2_SRAM_SYNC_SET(x) \
+       (((x) << DDR_CTL_CONFIG_MISC_SRC2_SRAM_SYNC_LSB) & DDR_CTL_CONFIG_MISC_SRC2_SRAM_SYNC_MASK)
+#define DDR_CTL_CONFIG_PAD_DDR2_SEL_LSB 6
+#define DDR_CTL_CONFIG_PAD_DDR2_SEL_MASK 0x00000040
+#define DDR_CTL_CONFIG_PAD_DDR2_SEL_SET(x) \
+       (((x) << DDR_CTL_CONFIG_PAD_DDR2_SEL_LSB) & DDR_CTL_CONFIG_PAD_DDR2_SEL_MASK)
+#define DDR_CTL_CONFIG_CPU_DDR_SYNC_LSB 2
+#define DDR_CTL_CONFIG_CPU_DDR_SYNC_MASK 0x00000004
+#define DDR_CTL_CONFIG_CPU_DDR_SYNC_SET(x) \
+       (((x) << DDR_CTL_CONFIG_CPU_DDR_SYNC_LSB) & DDR_CTL_CONFIG_CPU_DDR_SYNC_MASK)
+#define DDR_CTL_CONFIG_HALF_WIDTH_LSB 1
+#define DDR_CTL_CONFIG_HALF_WIDTH_MASK 0x00000002
+#define DDR_CTL_CONFIG_HALF_WIDTH_SET(x) \
+       (((x) << DDR_CTL_CONFIG_HALF_WIDTH_LSB) & DDR_CTL_CONFIG_HALF_WIDTH_MASK)
+#define DDR_CONFIG_CAS_LATENCY_MSB_LSB 31
+#define DDR_CONFIG_CAS_LATENCY_MSB_MASK 0x80000000
+#define DDR_CONFIG_CAS_LATENCY_MSB_SET(x) \
+       (((x) << DDR_CONFIG_CAS_LATENCY_MSB_LSB) & DDR_CONFIG_CAS_LATENCY_MSB_MASK)
+#define DDR_CONFIG_OPEN_PAGE_LSB 30
+#define DDR_CONFIG_OPEN_PAGE_MASK 0x40000000
+#define DDR_CONFIG_OPEN_PAGE_SET(x) \
+       (((x) << DDR_CONFIG_OPEN_PAGE_LSB) & DDR_CONFIG_OPEN_PAGE_MASK)
+#define DDR_CONFIG_CAS_LATENCY_LSB 27
+#define DDR_CONFIG_CAS_LATENCY_MASK 0x38000000
+#define DDR_CONFIG_CAS_LATENCY_SET(x) \
+       (((x) << DDR_CONFIG_CAS_LATENCY_LSB) & DDR_CONFIG_CAS_LATENCY_MASK)
+#define DDR_CONFIG_TMRD_LSB 23
+#define DDR_CONFIG_TMRD_MASK 0x07800000
+#define DDR_CONFIG_TMRD_SET(x) \
+       (((x) << DDR_CONFIG_TMRD_LSB) & DDR_CONFIG_TMRD_MASK)
+#define DDR_CONFIG_TRFC_LSB 17
+#define DDR_CONFIG_TRFC_MASK 0x007e0000
+#define DDR_CONFIG_TRFC_SET(x) \
+       (((x) << DDR_CONFIG_TRFC_LSB) & DDR_CONFIG_TRFC_MASK)
+#define DDR_CONFIG_TRRD_LSB 13
+#define DDR_CONFIG_TRRD_MASK 0x0001e000
+#define DDR_CONFIG_TRRD_SET(x) \
+       (((x) << DDR_CONFIG_TRRD_LSB) & DDR_CONFIG_TRRD_MASK)
+#define DDR_CONFIG_TRP_LSB 9
+#define DDR_CONFIG_TRP_MASK 0x00001e00
+#define DDR_CONFIG_TRP_SET(x) \
+       (((x) << DDR_CONFIG_TRP_LSB) & DDR_CONFIG_TRP_MASK)
+#define DDR_CONFIG_TRCD_LSB 5
+#define DDR_CONFIG_TRCD_MASK 0x000001e0
+#define DDR_CONFIG_TRCD_SET(x) \
+       (((x) << DDR_CONFIG_TRCD_LSB) & DDR_CONFIG_TRCD_MASK)
+#define DDR_CONFIG_TRAS_LSB 0
+#define DDR_CONFIG_TRAS_MASK 0x0000001f
+#define DDR_CONFIG_TRAS_SET(x) \
+       (((x) << DDR_CONFIG_TRAS_LSB) & DDR_CONFIG_TRAS_MASK)
+#define DDR_CONFIG2_HALF_WIDTH_LOW_LSB 31
+#define DDR_CONFIG2_HALF_WIDTH_LOW_MASK 0x80000000
+#define DDR_CONFIG2_HALF_WIDTH_LOW_SET(x) \
+       (((x) << DDR_CONFIG2_HALF_WIDTH_LOW_LSB) & DDR_CONFIG2_HALF_WIDTH_LOW_MASK)
+#define DDR_CONFIG2_SWAP_A26_A27_LSB 30
+#define DDR_CONFIG2_SWAP_A26_A27_MASK 0x40000000
+#define DDR_CONFIG2_SWAP_A26_A27_SET(x) \
+       (((x) << DDR_CONFIG2_SWAP_A26_A27_LSB) & DDR_CONFIG2_SWAP_A26_A27_MASK)
+#define DDR_CONFIG2_GATE_OPEN_LATENCY_LSB 26
+#define DDR_CONFIG2_GATE_OPEN_LATENCY_MASK 0x3c000000
+#define DDR_CONFIG2_GATE_OPEN_LATENCY_SET(x) \
+       (((x) << DDR_CONFIG2_GATE_OPEN_LATENCY_LSB) & DDR_CONFIG2_GATE_OPEN_LATENCY_MASK)
+#define DDR_CONFIG2_TWTR_LSB 21
+#define DDR_CONFIG2_TWTR_MASK 0x03e00000
+#define DDR_CONFIG2_TWTR_SET(x) \
+       (((x) << DDR_CONFIG2_TWTR_LSB) & DDR_CONFIG2_TWTR_MASK)
+#define DDR_CONFIG2_TRTP_LSB 17
+#define DDR_CONFIG2_TRTP_MASK 0x001e0000
+#define DDR_CONFIG2_TRTP_SET(x) \
+       (((x) << DDR_CONFIG2_TRTP_LSB) & DDR_CONFIG2_TRTP_MASK)
+#define DDR_CONFIG2_TRTW_LSB 12
+#define DDR_CONFIG2_TRTW_MASK 0x0001f000
+#define DDR_CONFIG2_TRTW_SET(x) \
+       (((x) << DDR_CONFIG2_TRTW_LSB) & DDR_CONFIG2_TRTW_MASK)
+#define DDR_CONFIG2_TWR_LSB 8
+#define DDR_CONFIG2_TWR_MASK 0x00000f00
+#define DDR_CONFIG2_TWR_SET(x) \
+       (((x) << DDR_CONFIG2_TWR_LSB) & DDR_CONFIG2_TWR_MASK)
+#define DDR_CONFIG2_CKE_LSB 7
+#define DDR_CONFIG2_CKE_MASK 0x00000080
+#define DDR_CONFIG2_CKE_SET(x) \
+       (((x) << DDR_CONFIG2_CKE_LSB) & DDR_CONFIG2_CKE_MASK)
+#define DDR_CONFIG2_CNTL_OE_EN_LSB 5
+#define DDR_CONFIG2_CNTL_OE_EN_MASK 0x00000020
+#define DDR_CONFIG2_CNTL_OE_EN_SET(x) \
+       (((x) << DDR_CONFIG2_CNTL_OE_EN_LSB) & DDR_CONFIG2_CNTL_OE_EN_MASK)
+#define DDR_CONFIG2_BURST_LENGTH_LSB 0
+#define DDR_CONFIG2_BURST_LENGTH_MASK 0x0000000f
+#define DDR_CONFIG2_BURST_LENGTH_SET(x) \
+       (((x) << DDR_CONFIG2_BURST_LENGTH_LSB) & DDR_CONFIG2_BURST_LENGTH_MASK)
+#define RST_BOOTSTRAP_ADDRESS          0x180600b0
+#define PMU2_SWREGMSB_LSB 22
+#define PMU2_SWREGMSB_MASK 0xffc00000
+#define PMU2_SWREGMSB_SET(x) \
+       (((x) << PMU2_SWREGMSB_LSB) & PMU2_SWREGMSB_MASK)
+#define PMU2_PGM_LSB 21
+#define PMU2_PGM_MASK 0x00200000
+#define PMU2_PGM_SET(x) \
+       (((x) << PMU2_PGM_LSB) & PMU2_PGM_MASK)
+
+#define CPU_DDR_SYNC_MODE DDR_CTL_CONFIG_CPU_DDR_SYNC_SET(0)
+
+/*
+* DDR2                      DDR1
+* 0x40c3   25MHz            0x4186   25Mhz
+* 0x4138   40MHz            0x4270   40Mhz
+*/
+#define CFG_DDR2_REFRESH_VAL 0x40c3
+#define CFG_DDR2_CONFIG_VAL DDR_CONFIG_CAS_LATENCY_MSB_SET(0x1) | \
+       DDR_CONFIG_OPEN_PAGE_SET(0x1) | DDR_CONFIG_CAS_LATENCY_SET(0x4) | \
+       DDR_CONFIG_TMRD_SET(0x6) | DDR_CONFIG_TRFC_SET(0x16) | \
+       DDR_CONFIG_TRRD_SET(0x7) | DDR_CONFIG_TRP_SET(0xb) | \
+       DDR_CONFIG_TRCD_SET(0xb) | DDR_CONFIG_TRAS_SET(0)
+#define CFG_DDR2_CONFIG2_VAL DDR_CONFIG2_HALF_WIDTH_LOW_SET(0x1) | \
+       DDR_CONFIG2_SWAP_A26_A27_SET(0x0) | DDR_CONFIG2_GATE_OPEN_LATENCY_SET(0xa) | \
+       DDR_CONFIG2_TWTR_SET(0x16) | DDR_CONFIG2_TRTP_SET(0xa) | \
+       DDR_CONFIG2_TRTW_SET(0xe) | DDR_CONFIG2_TWR_SET(0x2) | \
+       DDR_CONFIG2_CKE_SET(0x1) | DDR_CONFIG2_CNTL_OE_EN_SET(0x1) | \
+       DDR_CONFIG2_BURST_LENGTH_SET(0x8)
+
+#define CFG_DDR2_CONFIG3_VAL 0x0000000e
+#define CFG_DDR2_EXT_MODE_VAL1 0x782
+#define CFG_DDR2_EXT_MODE_VAL2 0x402
+#define CFG_DDR2_MODE_VAL_INIT 0xb53
+#define CFG_DDR2_MODE_VAL 0xa53
+#define CFG_DDR2_TAP_VAL 0x10
+#define CFG_DDR2_EN_TWL_VAL 0x00001e91
+#define CFG_DDR2_RD_DATA_THIS_CYCLE_VAL_16 0xffff
+
+#define CFG_DDR_CTL_CONFIG DDR_CTL_CONFIG_SRAM_TSEL_SET(0x1) | \
+       DDR_CTL_CONFIG_GE0_SRAM_SYNC_SET(0x1) | \
+       DDR_CTL_CONFIG_GE1_SRAM_SYNC_SET(0x1) | \
+       DDR_CTL_CONFIG_USB_SRAM_SYNC_SET(0x1) | \
+       DDR_CTL_CONFIG_PCIE_SRAM_SYNC_SET(0x1) | \
+       DDR_CTL_CONFIG_WMAC_SRAM_SYNC_SET(0x1) | \
+       DDR_CTL_CONFIG_MISC_SRC1_SRAM_SYNC_SET(0x1) | \
+       DDR_CTL_CONFIG_MISC_SRC2_SRAM_SYNC_SET(0x1)
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void qca956x_ddr_init(void)
+{
+       u32 ddr_config, ddr_config2, ddr_config3, mod_val, \
+               mod_val_init, cycle_val, tap_val, ctl_config;
+       void __iomem *ddr_regs = map_physmem(AR71XX_DDR_CTRL_BASE, AR71XX_DDR_CTRL_SIZE,
+                              MAP_NOCACHE);
+       void __iomem *srif_regs = map_physmem(QCA956X_SRIF_BASE, QCA956X_SRIF_SIZE,
+                              MAP_NOCACHE);
+
+       ddr_config = CFG_DDR2_CONFIG_VAL;
+       ddr_config2 = CFG_DDR2_CONFIG2_VAL;
+       ddr_config3 = CFG_DDR2_CONFIG3_VAL;
+       mod_val_init = CFG_DDR2_MODE_VAL_INIT;
+       mod_val = CFG_DDR2_MODE_VAL;
+       tap_val = CFG_DDR2_TAP_VAL;
+       cycle_val = CFG_DDR2_RD_DATA_THIS_CYCLE_VAL_16;
+       ctl_config = CFG_DDR_CTL_CONFIG | DDR_CTL_CONFIG_PAD_DDR2_SEL_SET(0x1) |
+                        DDR_CTL_CONFIG_HALF_WIDTH_SET(0x1) | CPU_DDR_SYNC_MODE;
+
+       writel(0x10, ddr_regs + AR71XX_DDR_REG_CONTROL);
+       udelay(10);
+
+       writel(0x20, ddr_regs + AR71XX_DDR_REG_CONTROL);
+       udelay(10);
+
+       writel(ctl_config, ddr_regs + QCA956X_DDR_REG_CTL_CONF);
+       udelay(10);
+
+       writel(cycle_val, ddr_regs + AR71XX_DDR_REG_RD_CYCLE);
+       udelay(100);
+
+       writel(0x74444444, ddr_regs + QCA956X_DDR_REG_BURST);
+       udelay(100);
+
+       writel(0x44444444, ddr_regs + QCA956X_DDR_REG_BURST2);
+       udelay(100);
+
+       writel(DDR_FSM_WAIT_CTRL_VAL, ddr_regs + QCA956X_DDR_REG_FSM_WAIT_CTRL);
+       udelay(100);
+
+       writel(0xfffff, ddr_regs + QCA956X_DDR_REG_TIMEOUT_MAX);
+       udelay(100);
+
+       writel(ddr_config, ddr_regs + AR71XX_DDR_REG_CONFIG);
+       udelay(100);
+
+       writel(ddr_config2, ddr_regs + AR71XX_DDR_REG_CONFIG2);
+       udelay(100);
+
+       writel(ddr_config3, ddr_regs + QCA956X_DDR_REG_DDR3_CONFIG);
+       udelay(100);
+
+       writel(CFG_DDR2_EN_TWL_VAL, ddr_regs + QCA956X_DDR_REG_DDR2_CONFIG);
+       udelay(100);
+
+       writel(ddr_config2 | 0x80, ddr_regs + AR71XX_DDR_REG_CONFIG2);  /* CKE Enable */
+       udelay(100);
+
+       writel(0x8, ddr_regs + AR71XX_DDR_REG_CONTROL); /* Precharge */
+       udelay(10);
+
+       writel(0, ddr_regs + QCA956X_DDR_REG_DDR2_EMR2);
+       writel(0x10, ddr_regs + AR71XX_DDR_REG_CONTROL);        /* EMR2 */
+       udelay(10);
+
+       writel(0, ddr_regs + QCA956X_DDR_REG_DDR2_EMR3);
+       writel(0x20, ddr_regs + AR71XX_DDR_REG_CONTROL);        /* EMR3 */
+       udelay(10);
+
+       /* EMR DLL enable, Reduced Driver Impedance control, Differential DQS disabled */
+       writel(CFG_DDR2_EXT_MODE_VAL2, ddr_regs + AR71XX_DDR_REG_EMR);
+       udelay(100);
+
+       writel(0x2, ddr_regs + AR71XX_DDR_REG_CONTROL); /* EMR write */
+       udelay(10);
+
+       writel(mod_val_init, ddr_regs + AR71XX_DDR_REG_MODE);
+       udelay(1000);
+
+       writel(0x1, ddr_regs + AR71XX_DDR_REG_CONTROL); /* MR Write */
+       udelay(10);
+
+       writel(0x8, ddr_regs + AR71XX_DDR_REG_CONTROL); /* Precharge */
+       udelay(10);
+
+       writel(0x4, ddr_regs + AR71XX_DDR_REG_CONTROL); /* Auto Refresh */
+       udelay(10);
+
+       writel(0x4, ddr_regs + AR71XX_DDR_REG_CONTROL); /* Auto Refresh */
+       udelay(10);
+
+       /* Issue MRS to remove DLL out-of-reset */
+       writel(mod_val, ddr_regs + AR71XX_DDR_REG_MODE);
+       udelay(100);
+
+       writel(0x1, ddr_regs + AR71XX_DDR_REG_CONTROL); /* MR write */
+       udelay(100);
+
+       writel(CFG_DDR2_EXT_MODE_VAL1, ddr_regs + AR71XX_DDR_REG_EMR);
+       udelay(100);
+
+       writel(0x2, ddr_regs + AR71XX_DDR_REG_CONTROL); /* EMR write */
+       udelay(100);
+
+       writel(CFG_DDR2_EXT_MODE_VAL2, ddr_regs + AR71XX_DDR_REG_EMR);
+       udelay(100);
+
+       writel(0x2, ddr_regs + AR71XX_DDR_REG_CONTROL); /* EMR write */
+       udelay(100);
+
+       writel(CFG_DDR2_REFRESH_VAL, ddr_regs + AR71XX_DDR_REG_REFRESH);
+       udelay(100);
+
+       writel(tap_val, ddr_regs + AR71XX_DDR_REG_TAP_CTRL0);
+       writel(tap_val, ddr_regs + AR71XX_DDR_REG_TAP_CTRL1);
+       writel(tap_val, ddr_regs + QCA956X_DDR_REG_TAP_CTRL2);
+       writel(tap_val, ddr_regs + QCA956X_DDR_REG_TAP_CTRL3);
+
+       writel(0x633c8176, srif_regs + QCA956X_SRIF_PMU1_REG);
+       /* Set DDR2 Voltage to 1.8 volts */
+       writel(PMU2_SWREGMSB_SET(0x40) | PMU2_PGM_SET(0x1),
+              srif_regs + QCA956X_SRIF_PMU2_REG);
+}
diff --git a/arch/mips/mach-ath79/qca956x/qca956x-ddr-tap.S b/arch/mips/mach-ath79/qca956x/qca956x-ddr-tap.S
new file mode 100644 (file)
index 0000000..db54b57
--- /dev/null
@@ -0,0 +1,193 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019 Rosy Song <rosysong@rosinson.com>
+ *
+ * Based on QSDK
+ */
+
+#include <config.h>
+#include <asm/asm.h>
+#include <asm/regdef.h>
+#include <asm/mipsregs.h>
+#include <asm/addrspace.h>
+#include <mach/ar71xx_regs.h>
+
+    .set noreorder
+
+LEAF(ddr_tap_tuning)
+       li      a0, 0xbd001f00
+       sw      zero, 0x0(a0)                   /* Place where the tap values are saved and used for SWEEP */
+       sw      zero, 0x4(a0)                   /* Place where the number of passing taps are saved. */
+       sw      zero, 0x14(a0)          /* Place where the last pass tap value is stored */
+       li      a1, 0xaa55aa55          /* Indicates that the First pass tap value is not found */
+       sw      a1, 0x10(a0)            /* Place where the First pass tap value is stored */
+        nop
+
+       li      a0, CKSEG1ADDR(AR71XX_RESET_BASE)               /* RESET_BASE_ADDRESS */
+       lw      a1, 0x1c(a0)            /* Reading the RST_RESET_ADDRESS */
+       li      a2, 0x08000000          /* Setting the RST_RESET_RTC_RESET */
+       or      a1, a1, a2
+       sw      a1, 0x1c(a0)
+
+       li      a3, 0xffffffff
+       xor     a2, a2, a3
+       and     a1, a1, a2
+       sw      a1, 0x1c(a0)            /* Taking the RTC out of RESET */
+        nop
+
+       li      a0, CKSEG1ADDR(QCA956X_RTC_BASE)                /* RTC_BASE_ADDRESS */
+       li      a1, 0x1
+       sw      a1, 0x0040(a0)          /* RTC_SYNC_RESET_ADDRESS */
+
+       li      a2, 0x2
+
+_poll_for_RTC_ON:
+       lw      a1, 0x0044(a0)          /* RTC_SYNC_STATUS_ADDRESS */
+       and     a1, a2, a1
+       bne     a1, a2, _poll_for_RTC_ON
+         nop
+
+_CHANGE_TAPS:
+       li      t0, 0xbd001f00          /* Read the current value of the TAP for programming */
+       lw      t1, 0x0(t0)
+       li      t2, 0x00000000
+       or      t3, t1, t2
+
+       li      t0, 0xb8000000          /* DDR_BASE_ADDRESS */
+       sw      t3, 0x1c(t0)            /* TAP_CONTROL_0_ADDRESS */
+       sw      t3, 0x20(t0)            /* TAP_CONTROL_1_ADDRESS */
+       sw      t3, 0x24(t0)            /* TAP_CONTROL_2_ADDRESS */
+       sw      t3, 0x28(t0)            /* TAP_CONTROL_3_ADDRESS */
+
+       li      t1, 0x00000010          /* Running the test 8 times */
+       sw      t1, 0x0068(t0)          /* PERF_COMP_ADDR_1_ADDRESS */
+
+       li      t1, 0xfa5de83f          /* 4 Row Address Bits, 4 Column Address Bits, 2 BA bits */
+       sw      t1, 0x002c(t0)          /* PERF_MASK_ADDR_0_ADDRESS */
+
+       li      t1, 0x0000ffff
+       sw      t1, 0x0070(t0)          /* PERF_COMP_AHB_GE0_1_ADDRESS */
+
+       li      t1, 0x0000ffff
+       sw      t1, 0x0040(t0)          /* PERF_COMP_AHB_GE1_0_ADDRESS */
+
+       li      t1, 0x0000ffff
+       sw      t1, 0x0078(t0)          /* PERF_COMP_AHB_GE1_1_ADDRESS */
+
+       li      t1, 0x0000ffff
+       sw      t1, 0x0034(t0)          /* PERF_MASK_AHB_GE0_0_ADDRESS */
+
+       li      t1, 0x0000ffff
+       sw      t1, 0x006c(t0)          /* PERF_MASK_AHB_GE0_1_ADDRESS */
+
+       li      t1, 0x0000ffff
+       sw      t1, 0x003c(t0)          /* PERF_MASK_AHB_GE1_0_ADDRESS */
+
+       li      t1, 0x0000ffff
+       sw      t1, 0x0074(t0)          /* PERF_MASK_AHB_GE1_1_ADDRESS */
+
+       li      t1, 0x0000ffff
+       sw      t1, 0x0038(t0)          /* PERF_COMP_AHB_GE0_0_ADDRESS */
+
+       li      t1, 0x00000001
+       sw      t1, 0x011c(t0)          /* DDR_BIST_ADDRESS */
+
+       li      t2, 0x1
+
+_bist_done_poll:
+       lw      t1, 0x0120(t0)          /* DDR_BIST_STATUS_ADDRESS */
+       and     t1, t1, t2
+       bne     t1, t2, _bist_done_poll
+        nop
+
+       lw      t1, 0x0120(t0)          /* DDR_BIST_STATUS_ADDRESS */
+       li      t4, 0x000001fe
+       and     t2, t1, t4
+       srl     t2, t2, 0x1             /* no. of Pass Runs */
+
+       li      t5, 0x00000000
+       sw      t5, 0x011c(t0)          /* DDR_BIST_ADDRESS     - Stop the DDR BIST test */
+
+       li      t5, 0x0001fe00
+       and     t5, t5, t1
+       bnez    t5, _iterate_tap                /* This is a redundant compare but nevertheless - Comparing the FAILS */
+        nop
+
+       lw      t1, 0x0068(t0)          /* PERF_COMP_ADDR_1_ADDRESS */
+       li      t3, 0x000001fe
+       and     t3, t3, t1
+       srl     t3, t3, 0x1             /* No. of runs in the config register. */
+       bne     t3, t2, _iterate_tap
+        nop
+
+pass_tap:
+       li      t0, 0xbd001f00
+       lw      t1, 0x4(t0)
+       addiu   t1, t1, 0x1
+       sw      t1, 0x4(t0)
+
+       li      t0, 0xbd001f10
+       lw      t1, 0x0(t0)
+       li      t2, 0xaa55aa55
+       beq     t1, t2, _first_pass
+        nop
+
+       li      t0, 0xbd001f00
+       lw      t1, 0x0(t0)
+       li      t0, 0xbd001f10
+       sw      t1, 0x4(t0)
+        nop
+       b       _iterate_tap
+        nop
+
+_first_pass:
+       li      t0, 0xbd001f00
+       lw      t1, 0x0(t0)
+       li      t0, 0xbd001f10
+       sw      t1, 0x0(t0)
+       sw      t1, 0x4(t0)
+        nop
+
+_iterate_tap:
+       li      t0, 0xbd001f00
+       lw      t1, 0x0(t0)
+       li      t2, 0x3f
+       beq     t1, t2, _STOP_TEST
+        nop
+
+       addiu   t1, t1, 0x1
+       sw      t1, 0x0(t0)
+        nop
+       b       _CHANGE_TAPS
+        nop
+
+_STOP_TEST:
+       li      t0, 0xbd001f00
+       lw      t1, 0x4(t0)
+       bnez    t1, _load_center_tap
+        nop
+
+       li      t3, 0x8                 /* Default Tap to be used */
+       b       _load_tap_into_reg
+        nop
+
+_load_center_tap:
+       li      t0, 0xbd001f10
+       lw      t1, 0x0(t0)
+       lw      t2, 0x4(t0)
+       add     t3, t1, t2
+       srl     t3, t3, 0x1
+       li      t4, 0x3f
+       and     t3, t3, t4
+
+_load_tap_into_reg:
+       li      t0, 0xb8000000
+       sw      t3, 0x1c(t0)            /* TAP_CONTROL_0_ADDRESS */
+       sw      t3, 0x20(t0)            /* TAP_CONTROL_1_ADDRESS */
+       sw      t3, 0x24(t0)            /* TAP_CONTROL_2_ADDRESS */
+       sw      t3, 0x28(t0)            /* TAP_CONTROL_3_ADDRESS */
+
+        nop
+       jr ra
+        nop
+    END(ddr_tap_tuning)
index 6a94d886f94ff7832fc8ef3a2fd1598391c8d57a..0ab3ab6383c8cb33b8f5eecb24d30e4fd2de9b77 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ * Copyright (C) 2018-2019 Rosy Song <rosysong@rosinson.com>
  */
 
 #include <common.h>
 #include <mach/ath79.h>
 #include <mach/ar71xx_regs.h>
 
+/* QCA956X ETH_SGMII_SERDES Registers */
+#define SGMII_SERDES_RES_CALIBRATION_LSB 23
+#define SGMII_SERDES_RES_CALIBRATION_MASK 0x07800000
+#define SGMII_SERDES_RES_CALIBRATION_SET(x) \
+       (((x) << SGMII_SERDES_RES_CALIBRATION_LSB) & SGMII_SERDES_RES_CALIBRATION_MASK)
+#define SGMII_SERDES_CDR_BW_LSB 1
+#define SGMII_SERDES_CDR_BW_MASK 0x00000006
+#define SGMII_SERDES_CDR_BW_SET(x) \
+       (((x) << SGMII_SERDES_CDR_BW_LSB) & SGMII_SERDES_CDR_BW_MASK)
+#define SGMII_SERDES_TX_DR_CTRL_LSB 4
+#define SGMII_SERDES_TX_DR_CTRL_MASK 0x00000070
+#define SGMII_SERDES_TX_DR_CTRL_SET(x) \
+       (((x) << SGMII_SERDES_TX_DR_CTRL_LSB) & SGMII_SERDES_TX_DR_CTRL_MASK)
+#define SGMII_SERDES_PLL_BW_LSB 8
+#define SGMII_SERDES_PLL_BW_MASK 0x00000100
+#define SGMII_SERDES_PLL_BW_SET(x) \
+       (((x) << SGMII_SERDES_PLL_BW_LSB) & SGMII_SERDES_PLL_BW_MASK)
+#define SGMII_SERDES_EN_SIGNAL_DETECT_LSB 16
+#define SGMII_SERDES_EN_SIGNAL_DETECT_MASK 0x00010000
+#define SGMII_SERDES_EN_SIGNAL_DETECT_SET(x) \
+       (((x) << SGMII_SERDES_EN_SIGNAL_DETECT_LSB) & SGMII_SERDES_EN_SIGNAL_DETECT_MASK)
+#define SGMII_SERDES_FIBER_SDO_LSB 17
+#define SGMII_SERDES_FIBER_SDO_MASK 0x00020000
+#define SGMII_SERDES_FIBER_SDO_SET(x) \
+       (((x) << SGMII_SERDES_FIBER_SDO_LSB) & SGMII_SERDES_FIBER_SDO_MASK)
+#define SGMII_SERDES_VCO_REG_LSB 27
+#define SGMII_SERDES_VCO_REG_MASK 0x78000000
+#define SGMII_SERDES_VCO_REG_SET(x) \
+       (((x) << SGMII_SERDES_VCO_REG_LSB) & SGMII_SERDES_VCO_REG_MASK)
+#define SGMII_SERDES_VCO_FAST_LSB 9
+#define SGMII_SERDES_VCO_FAST_MASK 0x00000200
+#define SGMII_SERDES_VCO_FAST_GET(x) \
+       (((x) & SGMII_SERDES_VCO_FAST_MASK) >> SGMII_SERDES_VCO_FAST_LSB)
+#define SGMII_SERDES_VCO_SLOW_LSB 10
+#define SGMII_SERDES_VCO_SLOW_MASK 0x00000400
+#define SGMII_SERDES_VCO_SLOW_GET(x) \
+       (((x) & SGMII_SERDES_VCO_SLOW_MASK) >> SGMII_SERDES_VCO_SLOW_LSB)
+
 void _machine_restart(void)
 {
        void __iomem *base;
@@ -152,6 +191,236 @@ static int eth_init_qca953x(void)
        return 0;
 }
 
+static int qca956x_sgmii_cal(void)
+{
+       int i;
+       u32 reg, rev_sgmii_val;
+       u32 vco_fast, vco_slow;
+       u32 start_val = 0, end_val = 0;
+       void __iomem *gregs = map_physmem(AR71XX_MII_BASE, AR71XX_MII_SIZE,
+                                         MAP_NOCACHE);
+       void __iomem *pregs = map_physmem(AR71XX_PLL_BASE, AR71XX_PLL_SIZE,
+                                         MAP_NOCACHE);
+       void __iomem *rregs = map_physmem(AR71XX_RESET_BASE, AR71XX_RESET_SIZE,
+                                         MAP_NOCACHE);
+       const u32 mask = QCA956X_RESET_SGMII_ASSERT | QCA956X_RESET_SGMII;
+
+       writel(BIT(2) | BIT(0), pregs + QCA956X_PLL_ETH_SGMII_SERDES_REG);
+
+       reg = readl(gregs + QCA956X_GMAC_REG_SGMII_SERDES);
+       vco_fast = SGMII_SERDES_VCO_FAST_GET(reg);
+       vco_slow = SGMII_SERDES_VCO_SLOW_GET(reg);
+
+       /* Set resistor calibration from 0000 to 1111 */
+       for (i = 0; i < 0x10; i++) {
+               reg = (readl(gregs + QCA956X_GMAC_REG_SGMII_SERDES) &
+                     ~SGMII_SERDES_RES_CALIBRATION_MASK) |
+                     SGMII_SERDES_RES_CALIBRATION_SET(i);
+               writel(reg, gregs + QCA956X_GMAC_REG_SGMII_SERDES);
+
+               udelay(50);
+
+               reg = readl(gregs + QCA956X_GMAC_REG_SGMII_SERDES);
+               if (vco_fast != SGMII_SERDES_VCO_FAST_GET(reg) ||
+                   vco_slow != SGMII_SERDES_VCO_SLOW_GET(reg)) {
+                       if (start_val == 0) {
+                               start_val = i;
+                               end_val = i;
+                       } else {
+                               end_val = i;
+                       }
+               }
+               vco_fast = SGMII_SERDES_VCO_FAST_GET(reg);
+               vco_slow = SGMII_SERDES_VCO_SLOW_GET(reg);
+       }
+
+       if (start_val == 0)
+               rev_sgmii_val = 0x7;
+       else
+               rev_sgmii_val = (start_val + end_val) >> 1;
+
+       writel((readl(gregs + QCA956X_GMAC_REG_SGMII_SERDES) &
+              ~SGMII_SERDES_RES_CALIBRATION_MASK) |
+              SGMII_SERDES_RES_CALIBRATION_SET(rev_sgmii_val),
+              gregs + QCA956X_GMAC_REG_SGMII_SERDES);
+
+       writel(BIT(2) | BIT(0), pregs + QCA956X_PLL_ETH_SGMII_SERDES_REG);
+
+       reg = readl(gregs + QCA956X_GMAC_REG_SGMII_SERDES);
+       writel(SGMII_SERDES_CDR_BW_SET(3) | SGMII_SERDES_TX_DR_CTRL_SET(1) |
+              SGMII_SERDES_PLL_BW_SET(1) | SGMII_SERDES_EN_SIGNAL_DETECT_SET(1) |
+              SGMII_SERDES_FIBER_SDO_SET(1) | SGMII_SERDES_VCO_REG_SET(3) | reg,
+              gregs + QCA956X_GMAC_REG_SGMII_SERDES);
+
+       setbits_be32(rregs + QCA956X_RESET_REG_RESET_MODULE, mask);
+       mdelay(1);
+       clrbits_be32(rregs + QCA956X_RESET_REG_RESET_MODULE, mask);
+       mdelay(1);
+
+       while (!(readl(gregs + QCA956X_GMAC_REG_SGMII_SERDES) & BIT(15)))
+               /* NOP */;
+
+       return 0;
+}
+
+static int qca956x_sgmii_setup(void)
+{
+       int i;
+       u32 s = 0, reg = 0;
+       u32 _regs[] = {
+               BIT(4), /* HW_RX_125M_N */
+               BIT(2), /* RX_125M_N */
+               BIT(3), /* TX_125M_N */
+               BIT(0), /* RX_CLK_N */
+               BIT(1), /* TX_CLK_N */
+       };
+       void __iomem *gregs = map_physmem(AR71XX_MII_BASE, AR71XX_MII_SIZE,
+                                         MAP_NOCACHE);
+
+       /* Force sgmii mode */
+       writel(BIT(6) | BIT(15) | BIT(8), gregs + QCA956X_GMAC_REG_MR_AN_CTRL);
+       udelay(10);
+       writel(0x2 | BIT(5) | (0x2 << 6), gregs + QCA956X_GMAC_REG_SGMII_CONFIG);
+
+       /* SGMII reset sequence sugguest by qca systems team. */
+       writel(0, gregs + QCA956X_GMAC_REG_SGMII_RESET);
+       for (i = 0; i < ARRAY_SIZE(_regs); i++) {
+               reg |= _regs[i];
+               writel(reg, gregs + QCA956X_GMAC_REG_SGMII_RESET);
+       }
+
+       writel(readl(gregs + QCA956X_GMAC_REG_MR_AN_CTRL) & ~BIT(15),
+              gregs + QCA956X_GMAC_REG_MR_AN_CTRL);
+
+       /*
+        * WARNING: Across resets SGMII link status goes to weird state.
+        * if 0xb8070058 (SGMII_DEBUG Register) reads other than 0xf or 0x10
+        * for sure we are in bad state.
+        * Issue a PHY RESET in MR_AN_CONTROL_ADDRESS to keep going.
+        */
+       i = 0;
+       s = (readl(gregs + QCA956X_GMAC_REG_SGMII_DEBUG) & 0xff);
+       while (!(s == 0xf || s == 0x10)) {
+               writel(readl(gregs + QCA956X_GMAC_REG_MR_AN_CTRL) | BIT(15),
+                      gregs + QCA956X_GMAC_REG_MR_AN_CTRL);
+               udelay(100);
+               writel(readl(gregs + QCA956X_GMAC_REG_MR_AN_CTRL) & ~BIT(15),
+                      gregs + QCA956X_GMAC_REG_MR_AN_CTRL);
+               if (i++ == 10)
+                       break;
+               s = (readl(gregs + QCA956X_GMAC_REG_SGMII_DEBUG) & 0xff);
+       }
+
+       return 0;
+}
+
+static int qca956x_s17_reset(void)
+{
+       void __iomem *regs = map_physmem(AR71XX_GPIO_BASE, AR71XX_GPIO_SIZE,
+                                         MAP_NOCACHE);
+       void __iomem *rregs = map_physmem(AR71XX_RESET_BASE, AR71XX_RESET_SIZE,
+                                         MAP_NOCACHE);
+       const u32 mask = QCA956X_RESET_SGMII_ASSERT | QCA956X_RESET_SGMII |
+                        QCA956X_RESET_EXTERNAL | QCA956X_RESET_SGMII_ANALOG |
+                        QCA956X_RESET_SWITCH;
+       /* Bits(Reserved in datasheet) should be set to 1 */
+       const u32 mask_r = QCA956X_RESET_SGMII_ASSERT | QCA956X_RESET_SGMII |
+                        QCA956X_RESET_EXTERNAL;
+
+       setbits_be32(rregs + QCA956X_RESET_REG_RESET_MODULE, mask);
+       mdelay(1);
+       clrbits_be32(rregs + QCA956X_RESET_REG_RESET_MODULE, mask_r);
+       mdelay(1);
+
+       /* Reset s17 switch(GPIO11) SYS_RST_L */
+       writel(readl(regs + AR71XX_GPIO_REG_OE) & ~BIT(11),
+              regs + AR71XX_GPIO_REG_OE);
+       udelay(100);
+
+       writel(readl(regs + AR71XX_GPIO_REG_OUT) & ~BIT(11),
+              regs + AR71XX_GPIO_REG_OUT);
+       udelay(100);
+       writel(readl(regs + AR71XX_GPIO_REG_OUT) | BIT(11),
+              regs + AR71XX_GPIO_REG_OUT);
+
+       return 0;
+}
+
+static int qca956x_init_mdio(void)
+{
+       u32 reg;
+       void __iomem *regs = map_physmem(AR71XX_GPIO_BASE, AR71XX_GPIO_SIZE,
+                                               MAP_NOCACHE);
+       void __iomem *rregs = map_physmem(AR71XX_RESET_BASE, AR71XX_RESET_SIZE,
+                                         MAP_NOCACHE);
+       const u32 mask = QCA956X_RESET_GE0_MDIO | QCA956X_RESET_GE0_MAC |
+                        QCA956X_RESET_GE1_MDIO | QCA956X_RESET_GE1_MAC;
+
+       setbits_be32(rregs + QCA956X_RESET_REG_RESET_MODULE, mask);
+       mdelay(1);
+       clrbits_be32(rregs + QCA956X_RESET_REG_RESET_MODULE, mask);
+       mdelay(1);
+
+       /* GPIO4 as MDI */
+       reg = readl(regs + QCA956X_GPIO_REG_IN_ENABLE3);
+       reg &= ~(0xff << 16);
+       reg |= (0x4 << 16);
+       writel(reg, regs + QCA956X_GPIO_REG_IN_ENABLE3);
+
+       /* GPIO4 as MDO */
+       reg = readl(regs + QCA956X_GPIO_REG_OUT_FUNC1);
+       reg &= ~0xff;
+       reg |= 0x20;
+       writel(reg, regs + QCA956X_GPIO_REG_OUT_FUNC1);
+
+       /* Init MDC(GPIO3) / MDIO(GPIO4) */
+       reg = readl(regs + AR71XX_GPIO_REG_OE);
+       reg &= ~BIT(4);
+       writel(reg, regs + AR71XX_GPIO_REG_OE);
+       udelay(100);
+
+       reg = readl(regs + AR71XX_GPIO_REG_OE);
+       reg &= ~BIT(3);
+       writel(reg, regs + AR71XX_GPIO_REG_OE);
+       udelay(100);
+
+       /* GPIO3 as MDI */
+       reg = readl(regs + QCA956X_GPIO_REG_OUT_FUNC0);
+       reg &= ~(0xff << 24);
+       reg |= (0x21 << 24);
+       writel(reg, regs + QCA956X_GPIO_REG_OUT_FUNC0);
+
+       return 0;
+}
+
+static int eth_init_qca956x(void)
+{
+       void __iomem *pregs = map_physmem(AR71XX_PLL_BASE, AR71XX_PLL_SIZE,
+                                         MAP_NOCACHE);
+       void __iomem *gregs = map_physmem(AR71XX_MII_BASE, AR71XX_MII_SIZE,
+                                         MAP_NOCACHE);
+
+       qca956x_sgmii_cal();
+       qca956x_s17_reset();
+       qca956x_init_mdio();
+
+       if (ath79_get_bootstrap() & QCA956X_BOOTSTRAP_REF_CLK_40)
+               writel(0x45500, pregs + QCA956X_PLL_SWITCH_CLK_CTRL_REG);
+       else
+               writel(0xc5200, pregs + QCA956X_PLL_SWITCH_CLK_CTRL_REG);
+
+       qca956x_sgmii_setup();
+
+       writel((3 << 16) | (3 << 14) | (1 << 0) | (1 << 6),
+              gregs + QCA956X_GMAC_REG_ETH_CFG);
+
+       writel((1 << 31) | (2 << 28) | (2 << 26) | (1 << 25),
+              pregs + QCA956X_PLL_ETH_XMII_CTRL_REG);
+       mdelay(1);
+
+       return 0;
+}
+
 int ath79_eth_reset(void)
 {
        /*
@@ -164,6 +433,8 @@ int ath79_eth_reset(void)
                return eth_init_ar934x();
        if (soc_is_qca953x())
                return eth_init_qca953x();
+       if (soc_is_qca956x())
+               return eth_init_qca956x();
 
        return -EINVAL;
 }
index f6e724588a9c5fcb0b4617719e418a7352228ea1..493eaad1df7fdc4e93b4e6ebd12032944070850b 100644 (file)
@@ -17,4 +17,6 @@
 #define GPIO_GPIO_ALT(x)                                  (0x74 + 4 * (x))
 #define GPIO_GPIO_ALT1(x)                                 (0x7c + 4 * (x))
 
+#define GCB_PHY_CFG                                       0x118
+
 #endif
index 4ebcb4b053cb16a08c549309d46ea9440268d7ac..a9834439993de448bd132a8edade956fe0ea9885 100644 (file)
@@ -22,12 +22,12 @@ choice
        prompt "Board select"
 
 config BOARD_GARDENA_SMART_GATEWAY_MT7688
-       bool "Gardena Smart Gateway"
+       bool "GARDENA smart Gateway"
        depends on SOC_MT7620
        select BOARD_LATE_INIT
        select SUPPORTS_BOOT_RAM
        help
-         Gardena Smart Gateway boards have a MT7688 SoC with 128 MiB of RAM
+         GARDENA smart Gateway boards have a MT7688 SoC with 128 MiB of RAM
          and 8 MiB of flash (SPI NOR) and additional SPI NAND storage.
 
 config BOARD_LINKIT_SMART_7688
index 272eb3359abd45aed6597a79e685621248275be6..7bba2a2bf098d9ff6e8dc26ae6bd4d7c7767b64f 100644 (file)
@@ -93,7 +93,7 @@
                clocks = <&spiclk>;
                interrupts = <3 4>;
                        flash@0 {
-                       compatible = "spi-flash";
+                       compatible = "jedec,spi-nor";
                        spi-max-frequency = <50000000>;
                        reg = <0>;
                        spi-cpol;
index 2ec01a5ce795656efd3ef3001682e2bb2e6e3f9f..cb6ee13f16d0941ac79cc3e6dd420d321b849e82 100644 (file)
                interrupts = <4 4>;
                interrupt-parent = <&plic0>;
                flash@0 {
-                       compatible = "spi-flash";
+                       compatible = "jedec,spi-nor";
                        spi-max-frequency = <50000000>;
                        reg = <0>;
                        spi-cpol;
index cde5cdeff83ae793eb6ecaf011b3f16fe62f37af..705491a8e4d82da42b5c5852763cb30fc6790443 100644 (file)
                interrupts = <4 4>;
                interrupt-parent = <&plic0>;
                flash@0 {
-                       compatible = "spi-flash";
+                       compatible = "jedec,spi-nor";
                        spi-max-frequency = <50000000>;
                        reg = <0>;
                        spi-cpol;
index 87d8e5bcc98b4ac8e4cd774d60250e39f4c6b04c..8b2d6451c64375cf7d10b509c54fda8e8216a931 100644 (file)
                        compatible = "denx,u-boot-probe-test";
                        first-syscon = <&syscon0>;
                        second-sys-ctrl = <&another_system_controller>;
+                       third-syscon = <&syscon2>;
                };
        };
 
                cs-gpios = <0>, <&gpio_a 0>;
                spi.bin@0 {
                        reg = <0>;
-                       compatible = "spansion,m25p16", "spi-flash";
+                       compatible = "spansion,m25p16", "jedec,spi-nor";
                        spi-max-frequency = <40000000>;
                        sandbox,filename = "spi.bin";
                };
                        0x38 8>;
        };
 
-       syscon@2 {
+       syscon2: syscon@2 {
                compatible = "simple-mfd", "syscon";
                reg = <0x40 5
                        0x48 6
index 1027b59e7326b8d99e5748ceb514e1dff4460452..c45dbddd70003dfda2571cd343075bc307f31642 100644 (file)
@@ -104,7 +104,7 @@ static inline int sandbox_sdl_sound_start(uint frequency)
        return -ENODEV;
 }
 
-int sandbox_sdl_sound_play(const void *data, uint count)
+static inline int sandbox_sdl_sound_play(const void *data, uint count)
 {
        return -ENODEV;
 }
@@ -114,7 +114,7 @@ static inline int sandbox_sdl_sound_stop(void)
        return -ENODEV;
 }
 
-int sandbox_sdl_sound_init(int rate, int channels)
+static inline int sandbox_sdl_sound_init(int rate, int channels)
 {
        return -ENODEV;
 }
index 7cd56b41474fdc9387602cfee8e65e5db5c305b4..c1a5d2af8285b879fdfd30f831d42f333c5fe913 100644 (file)
@@ -18,21 +18,21 @@ typedef unsigned short umode_t;
 /*
  * Number of bits in a C 'long' on this architecture.
  */
-#ifdef CONFIG_PHYS64
+#ifdef CONFIG_PHYS_64BIT
 #define BITS_PER_LONG 64
-#else  /* CONFIG_PHYS64 */
+#else  /* CONFIG_PHYS_64BIT */
 #define BITS_PER_LONG 32
-#endif /* CONFIG_PHYS64 */
+#endif /* CONFIG_PHYS_64BIT */
 
-#ifdef CONFIG_PHYS64
+#ifdef CONFIG_PHYS_64BIT
 typedef unsigned long long dma_addr_t;
 typedef u64 phys_addr_t;
 typedef u64 phys_size_t;
-#else  /* CONFIG_PHYS64 */
+#else  /* CONFIG_PHYS_64BIT */
 typedef unsigned long dma_addr_t;
 typedef u32 phys_addr_t;
 typedef u32 phys_size_t;
-#endif /* CONFIG_PHYS64 */
+#endif /* CONFIG_PHYS_64BIT */
 
 #endif /* __KERNEL__ */
 
index 5039973cd7aff9e2c4aa365be5879725d99ea132..01822c606956cb04e74fd425afca688f2c331cb4 100644 (file)
@@ -34,7 +34,7 @@ int pci_map_physmem(phys_addr_t paddr, unsigned long *lenp,
                return 0;
        }
 
-       debug("%s: failed: addr=%x\n", __func__, paddr);
+       debug("%s: failed: addr=%pap\n", __func__, &paddr);
        return -ENOSYS;
 }
 
index 291dc07ff601174d6a41f87b24801e94614c49c3..d0168e88dbd8d84f0c056c13950a2e6d6ed081f3 100644 (file)
                                        #size-cells = <1>;
                                        reg = <0>;
                                        compatible = "winbond,w25q64dw",
-                                               "spi-flash";
+                                               "jedec,spi-nor";
                                        memory-map = <0xff800000 0x00800000>;
                                        rw-mrc-cache {
                                                label = "rw-mrc-cache";
index 4e8a761ce87a1bfd3c6009fd32e6bc0c014a7876..5abbc66ce98523fad0140fad45b17db69fccea88 100644 (file)
                                        #size-cells = <1>;
                                        reg = <0>;
                                        compatible = "macronix,mx25l6405d",
-                                               "spi-flash";
+                                               "jedec,spi-nor";
                                        memory-map = <0xff800000 0x00800000>;
                                        rw-mrc-cache {
                                                label = "rw-mrc-cache";
index 39e2d2fa4b222feb43194b31b296edb90b5c84d0..37146fde2ba93aff7b03f94e52930b8ed90fe23d 100644 (file)
                                        #address-cells = <1>;
                                        #size-cells = <1>;
                                        reg = <0>;
-                                       compatible = "macronix,mx25u6435f", "spi-flash";
+                                       compatible = "macronix,mx25u6435f", "jedec,spi-nor";
                                        memory-map = <0xff800000 0x00800000>;
                                        rw-mrc-cache {
                                                label = "rw-mrc-cache";
index c5653feac7241eb83eec7132bd65485bf2441310..09488f13b583e9d6182e0ad4ae0d2dee8e0019e1 100644 (file)
                                        u-boot,dm-pre-reloc;
                                        reg = <0>;
                                        compatible = "winbond,w25q64",
-                                                       "spi-flash";
+                                                       "jedec,spi-nor";
                                        memory-map = <0xff800000 0x00800000>;
                                        rw-mrc-cache {
                                                label = "rw-mrc-cache";
index ad687ce2cc3511816cb1728f8e0ae8a628597353..35211ed81b19005026e374b12dc5e5238e68d33b 100644 (file)
                                        #address-cells = <1>;
                                        reg = <0>;
                                        compatible = "winbond,w25q64",
-                                                       "spi-flash";
+                                                       "jedec,spi-nor";
                                        memory-map = <0xff800000 0x00800000>;
                                        rw-mrc-cache {
                                                label = "rw-mrc-cache";
index f56e482944bc3514ea6014fc0d81ebd3fba56477..bcd4c4d9c1bd25efa20b0798ff13882da511296e 100644 (file)
@@ -47,7 +47,7 @@
                                        #address-cells = <1>;
                                        reg = <0>;
                                        compatible = "winbond,w25q64",
-                                               "spi-flash";
+                                               "jedec,spi-nor";
                                        memory-map = <0xff800000 0x00800000>;
                                        rw-mrc-cache {
                                                label = "rw-mrc-cache";
index 5884dbc277d36e0507105d287e8d8d7dfaac4a05..70b8c045193c47254e5dbbfd29f7835eda493776 100644 (file)
                                        #size-cells = <1>;
                                        reg = <0>;
                                        compatible = "stmicro,n25q064a",
-                                               "spi-flash";
+                                               "jedec,spi-nor";
                                        memory-map = <0xff800000 0x00800000>;
                                        rw-mrc-cache {
                                                label = "rw-mrc-cache";
index 9801790083f9a9d54ef0c680d367ffacf70e4d1e..c6ba811e059e58b5a1594174db83c7e912035f17 100644 (file)
 
                                spi-flash@0 {
                                        reg = <0>;
-                                       compatible = "winbond,w25q64bv", "spi-flash";
+                                       compatible = "winbond,w25q64bv", "jedec,spi-nor";
                                        memory-map = <0xff800000 0x00800000>;
                                };
                        };
index 8938a94e7707c2c503cce2d533d7877ff4b47df1..f492c35875b65c39a43e155b0b449da8ecd54a4e 100644 (file)
                                spi-flash@0 {
                                        reg = <0>;
                                        compatible = "sst,25vf016b",
-                                               "spi-flash";
+                                               "jedec,spi-nor";
                                        memory-map = <0xffe00000 0x00200000>;
                                };
                        };
index 51d33e772fc8da8bee59b6127b32aeae7a5c50cf..e9930cb04363e2440245d693f618664eda29169f 100644 (file)
                                        #size-cells = <1>;
                                        reg = <0>;
                                        compatible = "stmicro,n25q064a",
-                                               "spi-flash";
+                                               "jedec,spi-nor";
                                        memory-map = <0xff800000 0x00800000>;
                                        rw-mrc-cache {
                                                label = "rw-mrc-cache";
index 3a5d168268d43e08dba0f7d5899898183e3ad3ef..5de4568679a46d0c5a3b001d0050d45f6f34d77e 100644 (file)
                                        #address-cells = <1>;
                                        reg = <0>;
                                        compatible = "winbond,w25q64",
-                                               "spi-flash";
+                                               "jedec,spi-nor";
                                        memory-map = <0xff800000 0x00800000>;
                                        rw-mrc-cache {
                                                label = "rw-mrc-cache";
index 6c65fb9611c2eaf35711f06d5e269cd103498c5b..f4cdb2c3cd2ca3707158ddc17ffbaef1fa30986e 100644 (file)
                                        #size-cells = <1>;
                                        reg = <0>;
                                        compatible = "stmicro,n25q064a",
-                                               "spi-flash";
+                                               "jedec,spi-nor";
                                        memory-map = <0xff800000 0x00800000>;
                                        rw-mrc-cache {
                                                label = "rw-mrc-cache";
index c7f6479a0cf040e4bedcc8cb3f680aad6e875492..c21d2f3ffa67f8304f470dbead2aa20fbd53059d 100644 (file)
@@ -379,7 +379,7 @@ int board_init(void)
                puts("Cannot find Armada 385 watchdog!\n");
        } else {
                puts("Enabling Armada 385 watchdog.\n");
-               wdt_start(watchdog_dev, (u32) 25000000 * 120, 0);
+               wdt_start(watchdog_dev, 120000, 0);
        }
 # endif
 
diff --git a/board/Marvell/db-xc3-24g4xg/.gitignore b/board/Marvell/db-xc3-24g4xg/.gitignore
new file mode 100644 (file)
index 0000000..775b934
--- /dev/null
@@ -0,0 +1 @@
+kwbimage.cfg
diff --git a/board/Marvell/db-xc3-24g4xg/MAINTAINERS b/board/Marvell/db-xc3-24g4xg/MAINTAINERS
new file mode 100644 (file)
index 0000000..2b27e48
--- /dev/null
@@ -0,0 +1,7 @@
+DB-XC3-24G4XG BOARD
+M:     Chris Packham <chris.packham@alliedtelesis.co.nz>
+S:     Maintained
+F:     board/Marvell/db-xc3-24g4xg/
+F:     include/configs/db-xc3-24g4xg.h
+F:     configs/db-xc3-24g4xg_defconfig
+F:     arch/arm/dts/armada-xp-db-xc3-24g4xg.dts
diff --git a/board/Marvell/db-xc3-24g4xg/Makefile b/board/Marvell/db-xc3-24g4xg/Makefile
new file mode 100644 (file)
index 0000000..4dd5790
--- /dev/null
@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2015 Stefan Roese <sr@denx.de>
+
+obj-y  := db-xc3-24g4xg.o
+extra-y        := kwbimage.cfg
+
+quiet_cmd_sed = SED     $@
+      cmd_sed = sed $(SEDFLAGS_$(@F)) $< >$(dir $<)$(@F)
+
+SEDFLAGS_kwbimage.cfg =-e "s|^BINARY.*|BINARY $(srctree)/$(@D)/binary.0 0000005b 00000068|"
+$(src)/kwbimage.cfg: $(src)/kwbimage.cfg.in include/autoconf.mk \
+               include/config/auto.conf
+         $(call if_changed,sed)
diff --git a/board/Marvell/db-xc3-24g4xg/README b/board/Marvell/db-xc3-24g4xg/README
new file mode 100644 (file)
index 0000000..5e479b4
--- /dev/null
@@ -0,0 +1,4 @@
+To generate binary.0 from Marvell's bin_hdr.elf use the following command
+
+    arm-softfloat-linux-gnueabi-objcopy -S -O binary bin_hdr.elf \
+       board/Marvell/db-xc3-24g4xg/binary.0
diff --git a/board/Marvell/db-xc3-24g4xg/binary.0 b/board/Marvell/db-xc3-24g4xg/binary.0
new file mode 100644 (file)
index 0000000..8dd6872
--- /dev/null
@@ -0,0 +1,11 @@
+--------
+WARNING:
+--------
+This file should contain the bin_hdr generated by the original Marvell
+U-Boot implementation. As this is currently not included in this
+U-Boot version, we have added this placeholder, so that the U-Boot
+image can be generated without errors.
+
+If you have a known to be working bin_hdr for your board, then you
+just need to replace this text file here with the binary header
+and recompile U-Boot.
diff --git a/board/Marvell/db-xc3-24g4xg/db-xc3-24g4xg.c b/board/Marvell/db-xc3-24g4xg/db-xc3-24g4xg.c
new file mode 100644 (file)
index 0000000..cae428f
--- /dev/null
@@ -0,0 +1,68 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2015 Stefan Roese <sr@denx.de>
+ */
+
+#include <common.h>
+#include <i2c.h>
+#include <asm/gpio.h>
+#include <linux/mbus.h>
+#include <linux/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * These values and defines are taken from the Marvell U-Boot version
+ * "u-boot-2013.01-2016_T1.0.eng_drop_v6"
+ */
+#define DB_DX_AC3_GPP_OUT_ENA_LOW      (~(BIT(0) | BIT(2) | BIT(3) | BIT(4) | BIT(6) | BIT(12) \
+                                       | BIT(13) | BIT(16) | BIT(17) | BIT(20) | BIT(29)  | BIT(30)))
+#define DB_DX_AC3_GPP_OUT_ENA_MID      (~(0))
+#define DB_DX_AC3_GPP_OUT_VAL_LOW      (BIT(0) | BIT(2) | BIT(3) | BIT(4) | BIT(6) | BIT(12) \
+                                       | BIT(13) | BIT(16) | BIT(17) | BIT(20) | BIT(29)  | BIT(30))
+#define DB_DX_AC3_GPP_OUT_VAL_MID      0x0
+#define DB_DX_AC3_GPP_POL_LOW          0x0
+#define DB_DX_AC3_GPP_POL_MID          0x0
+
+int board_early_init_f(void)
+{
+       /* Configure MPP */
+       writel(0x00142222, MVEBU_MPP_BASE + 0x00);
+       writel(0x11122000, MVEBU_MPP_BASE + 0x04);
+       writel(0x44444004, MVEBU_MPP_BASE + 0x08);
+       writel(0x14444444, MVEBU_MPP_BASE + 0x0c);
+       writel(0x00000001, MVEBU_MPP_BASE + 0x10);
+
+       /* Set GPP Out value */
+       writel(DB_DX_AC3_GPP_OUT_VAL_LOW, MVEBU_GPIO0_BASE + 0x00);
+       writel(DB_DX_AC3_GPP_OUT_VAL_MID, MVEBU_GPIO1_BASE + 0x00);
+
+       /* Set GPP Polarity */
+       writel(DB_DX_AC3_GPP_POL_LOW, MVEBU_GPIO0_BASE + 0x0c);
+       writel(DB_DX_AC3_GPP_POL_MID, MVEBU_GPIO1_BASE + 0x0c);
+
+       /* Set GPP Out Enable */
+       writel(DB_DX_AC3_GPP_OUT_ENA_LOW, MVEBU_GPIO0_BASE + 0x04);
+       writel(DB_DX_AC3_GPP_OUT_ENA_MID, MVEBU_GPIO1_BASE + 0x04);
+
+       return 0;
+}
+
+int board_init(void)
+{
+       /* address of boot parameters */
+       gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
+
+       return 0;
+}
+
+#ifdef CONFIG_DISPLAY_BOARDINFO
+int checkboard(void)
+{
+       puts("Board: " CONFIG_SYS_BOARD "\n");
+
+       return 0;
+}
+#endif
diff --git a/board/Marvell/db-xc3-24g4xg/kwbimage.cfg.in b/board/Marvell/db-xc3-24g4xg/kwbimage.cfg.in
new file mode 100644 (file)
index 0000000..b8bb7a6
--- /dev/null
@@ -0,0 +1,12 @@
+#
+# Copyright (C) 2014 Stefan Roese <sr@denx.de>
+#
+
+# Armada XP uses version 1 image format
+VERSION                1
+
+# Boot Media configurations
+BOOT_FROM      spi
+
+# Binary Header (bin_hdr) with DDR3 training code
+BINARY board/Marvell/db-xc3-24g4xg/binary.0 0000005b 00000068
index eb3694ea6e7c23eae75a3008b2cd01700513e149..d23e97c9b9165b3aafe2f8983538a4d1a7d73275 100644 (file)
@@ -115,14 +115,14 @@ MV_DRAM_MODES *ddr3_get_static_ddr_mode(void)
        return &ds414_ddr_modes[0];
 }
 
-MV_BIN_SERDES_CFG *board_serdes_cfg_get(u8 pex_mode)
+MV_BIN_SERDES_CFG *board_serdes_cfg_get(void)
 {
        return &ds414_serdes_cfg[0];
 }
 
 u8 board_sat_r_get(u8 dev_num, u8 reg)
 {
-       return (0x1 << 1 | 1);
+       return 0xf;     /* All PEX ports support PCIe Gen2 */
 }
 
 int board_early_init_f(void)
index d7d1942fe686aa59138894cff4a881c4a879e8eb..6934fd80173072c8ef5d1bf0624ff8819d7845ed 100644 (file)
@@ -7,6 +7,7 @@
 #include <command.h>
 #include <dm.h>
 #include <i2c.h>
+#include <wdt.h>
 #include <asm/gpio.h>
 #include <linux/mbus.h>
 #include <linux/io.h>
@@ -24,6 +25,10 @@ DECLARE_GLOBAL_DATA_PTR;
 #define CONFIG_NVS_LOCATION            0xf4800000
 #define CONFIG_NVS_SIZE                        (512 << 10)
 
+#ifdef CONFIG_WATCHDOG
+static struct udevice *watchdog_dev;
+#endif
+
 static struct serdes_map board_serdes_map[] = {
        {PEX0, SERDES_SPEED_5_GBPS, PEX_ROOT_COMPLEX_X1, 0, 0},
        {DEFAULT_SERDES, SERDES_SPEED_5_GBPS, SERDES_DEFAULT_MODE, 0, 0},
@@ -75,6 +80,10 @@ struct mv_ddr_topology_map *mv_ddr_topology_map_get(void)
 
 int board_early_init_f(void)
 {
+#ifdef CONFIG_WATCHDOG
+       watchdog_dev = NULL;
+#endif
+
        /* Configure MPP */
        writel(0x00001111, MVEBU_MPP_BASE + 0x00);
        writel(0x00000000, MVEBU_MPP_BASE + 0x04);
@@ -88,6 +97,17 @@ int board_early_init_f(void)
        return 0;
 }
 
+void spl_board_init(void)
+{
+#ifdef CONFIG_WATCHDOG
+       int ret;
+
+       ret = uclass_get_device(UCLASS_WDT, 0, &watchdog_dev);
+       if (!ret)
+               wdt_start(watchdog_dev, 120000, 0);
+#endif
+}
+
 int board_init(void)
 {
        /* address of boot parameters */
@@ -100,9 +120,37 @@ int board_init(void)
        /* DEV_READYn is not needed for NVS, ignore it when accessing CS1 */
        writel(0x00004001, MVEBU_DEV_BUS_BASE + 0xc8);
 
+       spl_board_init();
+
        return 0;
 }
 
+void arch_preboot_os(void)
+{
+#ifdef CONFIG_WATCHDOG
+       wdt_stop(watchdog_dev);
+#endif
+}
+
+#ifdef CONFIG_WATCHDOG
+void watchdog_reset(void)
+{
+       static ulong next_reset = 0;
+       ulong now;
+
+       if (!watchdog_dev)
+               return;
+
+       now = timer_get_us();
+
+       /* Do not reset the watchdog too often */
+       if (now > next_reset) {
+               wdt_reset(watchdog_dev);
+               next_reset = now + 1000;
+       }
+}
+#endif
+
 static int led_7seg_init(unsigned int segments)
 {
        int node;
index b33a75c82cdbb1d81f07e58587a658469cfff6a1..63b105755347566f706790b361a25776c51c2c09 100644 (file)
@@ -33,7 +33,7 @@
 #include <micrel.h>
 #include <spi.h>
 #include <video.h>
-#include <../drivers/video/ipu.h>
+#include <../drivers/video/imx/ipu.h>
 #if defined(CONFIG_VIDEO_BMP_LOGO)
        #include <bmp_logo.h>
 #endif
diff --git a/board/atmel/sama5d2_icp/Kconfig b/board/atmel/sama5d2_icp/Kconfig
new file mode 100644 (file)
index 0000000..3859845
--- /dev/null
@@ -0,0 +1,15 @@
+if TARGET_SAMA5D2_ICP
+
+config SYS_BOARD
+       default "sama5d2_icp"
+
+config SYS_VENDOR
+       default "atmel"
+
+config SYS_SOC
+       default "at91"
+
+config SYS_CONFIG_NAME
+       default "sama5d2_icp"
+
+endif
diff --git a/board/atmel/sama5d2_icp/MAINTAINERS b/board/atmel/sama5d2_icp/MAINTAINERS
new file mode 100644 (file)
index 0000000..db984b6
--- /dev/null
@@ -0,0 +1,7 @@
+SAMA5D2 ICP BOARD
+M:     Eugen Hristev <eugen.hristev@microchip.com>
+S:     Maintained
+F:     board/atmel/sama5d2_icp/
+F:     include/configs/sama5d2_icp.h
+F:     configs/sama5d2_icp_mmc_defconfig
+
diff --git a/board/atmel/sama5d2_icp/Makefile b/board/atmel/sama5d2_icp/Makefile
new file mode 100644 (file)
index 0000000..fd7e870
--- /dev/null
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier:     GPL-2.0+
+#
+# Copyright (C) 2018 Microchip Technology Inc.
+#                   Eugen Hristev <eugen.hristev@microchip.com>
+#
+
+obj-y += sama5d2_icp.o
diff --git a/board/atmel/sama5d2_icp/sama5d2_icp.c b/board/atmel/sama5d2_icp/sama5d2_icp.c
new file mode 100644 (file)
index 0000000..807cfcd
--- /dev/null
@@ -0,0 +1,191 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018 Microchip Technology, Inc.
+ *                   Eugen Hristev <eugen.hristev@microchip.com>
+ */
+
+#include <common.h>
+#include <debug_uart.h>
+#include <asm/io.h>
+#include <asm/arch/at91_common.h>
+#include <asm/arch/atmel_pio4.h>
+#include <asm/arch/atmel_mpddrc.h>
+#include <asm/arch/atmel_sdhci.h>
+#include <asm/arch/clk.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/sama5d2.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int board_late_init(void)
+{
+       return 0;
+}
+
+#ifdef CONFIG_DEBUG_UART_BOARD_INIT
+static void board_uart0_hw_init(void)
+{
+       atmel_pio4_set_c_periph(AT91_PIO_PORTB, 26, ATMEL_PIO_PUEN_MASK); /* URXD0 */
+       atmel_pio4_set_c_periph(AT91_PIO_PORTB, 27, 0); /* UTXD0 */
+
+       at91_periph_clk_enable(ATMEL_ID_UART0);
+}
+
+void board_debug_uart_init(void)
+{
+       board_uart0_hw_init();
+}
+#endif
+
+int board_early_init_f(void)
+{
+#ifdef CONFIG_DEBUG_UART
+       debug_uart_init();
+#endif
+       return 0;
+}
+
+int board_init(void)
+{
+       /* address of boot parameters */
+       gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
+
+       return 0;
+}
+
+int dram_init(void)
+{
+       gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
+                                   CONFIG_SYS_SDRAM_SIZE);
+       return 0;
+}
+
+#define MAC24AA_MAC_OFFSET     0xfa
+
+int misc_init_r(void)
+{
+#ifdef CONFIG_I2C_EEPROM
+       at91_set_ethaddr(MAC24AA_MAC_OFFSET);
+#endif
+       return 0;
+}
+
+/* SPL */
+#ifdef CONFIG_SPL_BUILD
+
+#ifdef CONFIG_SD_BOOT
+void spl_mmc_init(void)
+{
+       atmel_pio4_set_a_periph(AT91_PIO_PORTA, 1, 0);  /* CMD */
+       atmel_pio4_set_a_periph(AT91_PIO_PORTA, 2, 0);  /* DAT0 */
+       atmel_pio4_set_a_periph(AT91_PIO_PORTA, 3, 0);  /* DAT1 */
+       atmel_pio4_set_a_periph(AT91_PIO_PORTA, 4, 0);  /* DAT2 */
+       atmel_pio4_set_a_periph(AT91_PIO_PORTA, 5, 0);  /* DAT3 */
+       atmel_pio4_set_a_periph(AT91_PIO_PORTA, 0, 0);  /* CK */
+       atmel_pio4_set_a_periph(AT91_PIO_PORTA, 13, 0); /* CD */
+
+       at91_periph_clk_enable(ATMEL_ID_SDMMC0);
+}
+#endif
+
+void spl_board_init(void)
+{
+#ifdef CONFIG_SD_BOOT
+       spl_mmc_init();
+#endif
+}
+
+void spl_display_print(void)
+{
+}
+
+static void ddrc_conf(struct atmel_mpddrc_config *ddrc)
+{
+       ddrc->md = (ATMEL_MPDDRC_MD_DBW_32_BITS | ATMEL_MPDDRC_MD_DDR3_SDRAM);
+
+       ddrc->cr = (ATMEL_MPDDRC_CR_NC_COL_10 |
+                   ATMEL_MPDDRC_CR_NR_ROW_14 |
+                   ATMEL_MPDDRC_CR_CAS_DDR_CAS5 |
+                   ATMEL_MPDDRC_CR_DIC_DS |
+                   ATMEL_MPDDRC_CR_NB_8BANKS |
+                   ATMEL_MPDDRC_CR_DECOD_INTERLEAVED |
+                   ATMEL_MPDDRC_CR_UNAL_SUPPORTED);
+
+       ddrc->rtr = 0x298;
+
+       ddrc->tpr0 = ((6 << ATMEL_MPDDRC_TPR0_TRAS_OFFSET) |
+                     (3 << ATMEL_MPDDRC_TPR0_TRCD_OFFSET) |
+                     (3 << ATMEL_MPDDRC_TPR0_TWR_OFFSET) |
+                     (9 << ATMEL_MPDDRC_TPR0_TRC_OFFSET) |
+                     (3 << ATMEL_MPDDRC_TPR0_TRP_OFFSET) |
+                     (4 << ATMEL_MPDDRC_TPR0_TRRD_OFFSET) |
+                     (4 << ATMEL_MPDDRC_TPR0_TWTR_OFFSET) |
+                     (4 << ATMEL_MPDDRC_TPR0_TMRD_OFFSET));
+
+       ddrc->tpr1 = ((27 << ATMEL_MPDDRC_TPR1_TRFC_OFFSET) |
+                     (29 << ATMEL_MPDDRC_TPR1_TXSNR_OFFSET) |
+                     (0 << ATMEL_MPDDRC_TPR1_TXSRD_OFFSET) |
+                     (10 << ATMEL_MPDDRC_TPR1_TXP_OFFSET));
+
+       ddrc->tpr2 = ((0 << ATMEL_MPDDRC_TPR2_TXARD_OFFSET) |
+                     (0 << ATMEL_MPDDRC_TPR2_TXARDS_OFFSET) |
+                     (0 << ATMEL_MPDDRC_TPR2_TRPA_OFFSET) |
+                     (4 << ATMEL_MPDDRC_TPR2_TRTP_OFFSET) |
+                     (7 << ATMEL_MPDDRC_TPR2_TFAW_OFFSET));
+}
+
+void mem_init(void)
+{
+       struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+       struct atmel_mpddr *mpddrc = (struct atmel_mpddr *)ATMEL_BASE_MPDDRC;
+       struct atmel_mpddrc_config ddrc_config;
+       u32 reg;
+
+       ddrc_conf(&ddrc_config);
+
+       at91_periph_clk_enable(ATMEL_ID_MPDDRC);
+       writel(AT91_PMC_DDR, &pmc->scer);
+
+       reg = readl(&mpddrc->io_calibr);
+       reg &= ~ATMEL_MPDDRC_IO_CALIBR_RDIV;
+       reg |= ATMEL_MPDDRC_IO_CALIBR_DDR3_RZQ_55;
+       reg &= ~ATMEL_MPDDRC_IO_CALIBR_TZQIO;
+       reg |= ATMEL_MPDDRC_IO_CALIBR_TZQIO_(100);
+       writel(reg, &mpddrc->io_calibr);
+
+       writel(ATMEL_MPDDRC_RD_DATA_PATH_SHIFT_ONE_CYCLE,
+              &mpddrc->rd_data_path);
+
+       ddr3_init(ATMEL_BASE_MPDDRC, ATMEL_BASE_DDRCS, &ddrc_config);
+
+       writel(0x5355, &mpddrc->cal_mr4);
+       writel(64, &mpddrc->tim_cal);
+}
+
+void at91_pmc_init(void)
+{
+       u32 tmp;
+
+       /*
+        * while coming from the ROM code, we run on PLLA @ 492 MHz / 164 MHz
+        * so we need to slow down and configure MCKR accordingly.
+        * This is why we have a special flavor of the switching function.
+        */
+       tmp = AT91_PMC_MCKR_PLLADIV_2 |
+             AT91_PMC_MCKR_MDIV_3 |
+             AT91_PMC_MCKR_CSS_MAIN;
+       at91_mck_init_down(tmp);
+
+       tmp = AT91_PMC_PLLAR_29 |
+             AT91_PMC_PLLXR_PLLCOUNT(0x3f) |
+             AT91_PMC_PLLXR_MUL(82) |
+             AT91_PMC_PLLXR_DIV(1);
+       at91_plla_init(tmp);
+
+       tmp = AT91_PMC_MCKR_H32MXDIV |
+             AT91_PMC_MCKR_PLLADIV_2 |
+             AT91_PMC_MCKR_MDIV_3 |
+             AT91_PMC_MCKR_CSS_PLLA;
+       at91_mck_init(tmp);
+}
+#endif
diff --git a/board/bosch/guardian/Kconfig b/board/bosch/guardian/Kconfig
new file mode 100644 (file)
index 0000000..1417da6
--- /dev/null
@@ -0,0 +1,15 @@
+if TARGET_AM335X_GUARDIAN
+
+config SYS_BOARD
+       default "guardian"
+
+config SYS_VENDOR
+       default "bosch"
+
+config SYS_SOC
+       default "am33xx"
+
+config SYS_CONFIG_NAME
+       default "am335x_guardian"
+
+endif
diff --git a/board/bosch/guardian/MAINTAINERS b/board/bosch/guardian/MAINTAINERS
new file mode 100644 (file)
index 0000000..8d16ec0
--- /dev/null
@@ -0,0 +1,6 @@
+Guardian BOARD
+M:     Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+S:     Maintained
+F:     board/bosch/guardian/
+F:     include/configs/am335x_guardian.h
+F:     configs/am335x_guardian_defconfig
diff --git a/board/bosch/guardian/Makefile b/board/bosch/guardian/Makefile
new file mode 100644 (file)
index 0000000..11625c9
--- /dev/null
@@ -0,0 +1,12 @@
+# SPDX-License-Identifier:     GPL-2.0+
+#
+# Makefile
+#
+# Copyright (C) 2018 Robert Bosch Power Tools GmbH
+#
+
+ifeq ($(CONFIG_SKIP_LOWLEVEL_INIT),)
+obj-y  := mux.o
+endif
+
+obj-y  += board.o
diff --git a/board/bosch/guardian/board.c b/board/bosch/guardian/board.c
new file mode 100644 (file)
index 0000000..86ab180
--- /dev/null
@@ -0,0 +1,186 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * board.c
+ *
+ * Board functions for Bosch Guardian
+ *
+ * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
+ * Copyright (C) 2018 Robert Bosch Power Tools GmbH
+ */
+
+#include <common.h>
+#include <cpsw.h>
+#include <dm.h>
+#include <environment.h>
+#include <environment.h>
+#include <errno.h>
+#include <i2c.h>
+#include <miiphy.h>
+#include <panel.h>
+#include <power/tps65217.h>
+#include <power/tps65910.h>
+#include <spl.h>
+#include <watchdog.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/ddr_defs.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/mem.h>
+#include <asm/arch/mmc_host_def.h>
+#include <asm/arch/omap.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/emif.h>
+#include <asm/gpio.h>
+#include <asm/io.h>
+#include "board.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifndef CONFIG_SKIP_LOWLEVEL_INIT
+static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
+
+static const struct ddr_data ddr3_data = {
+       .datardsratio0 = MT41K128M16JT125K_RD_DQS,
+       .datawdsratio0 = MT41K128M16JT125K_WR_DQS,
+       .datafwsratio0 = MT41K128M16JT125K_PHY_FIFO_WE,
+       .datawrsratio0 = MT41K128M16JT125K_PHY_WR_DATA,
+};
+
+static const struct cmd_control ddr3_cmd_ctrl_data = {
+       .cmd0csratio = MT41K128M16JT125K_RATIO,
+       .cmd0iclkout = MT41K128M16JT125K_INVERT_CLKOUT,
+
+       .cmd1csratio = MT41K128M16JT125K_RATIO,
+       .cmd1iclkout = MT41K128M16JT125K_INVERT_CLKOUT,
+
+       .cmd2csratio = MT41K128M16JT125K_RATIO,
+       .cmd2iclkout = MT41K128M16JT125K_INVERT_CLKOUT,
+};
+
+static struct emif_regs ddr3_emif_reg_data = {
+       .sdram_config = MT41K128M16JT125K_EMIF_SDCFG,
+       .ref_ctrl = MT41K128M16JT125K_EMIF_SDREF,
+       .sdram_tim1 = MT41K128M16JT125K_EMIF_TIM1,
+       .sdram_tim2 = MT41K128M16JT125K_EMIF_TIM2,
+       .sdram_tim3 = MT41K128M16JT125K_EMIF_TIM3,
+       .zq_config = MT41K128M16JT125K_ZQ_CFG,
+       .emif_ddr_phy_ctlr_1 = MT41K128M16JT125K_EMIF_READ_LATENCY,
+};
+
+#define OSC    (V_OSCK / 1000000)
+const struct dpll_params dpll_ddr = {
+               400, OSC - 1, 1, -1, -1, -1, -1};
+
+void am33xx_spl_board_init(void)
+{
+       int mpu_vdd;
+       int usb_cur_lim;
+
+       /* Get the frequency */
+       dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev);
+
+       if (i2c_probe(TPS65217_CHIP_PM))
+               return;
+
+       /*
+        * Increase USB current limit to 1300mA or 1800mA and set
+        * the MPU voltage controller as needed.
+        */
+       if (dpll_mpu_opp100.m == MPUPLL_M_1000) {
+               usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA;
+               mpu_vdd = TPS65217_DCDC_VOLT_SEL_1325MV;
+       } else {
+               usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA;
+               mpu_vdd = TPS65217_DCDC_VOLT_SEL_1275MV;
+       }
+
+       if (tps65217_reg_write(TPS65217_PROT_LEVEL_NONE,
+                              TPS65217_POWER_PATH,
+                              usb_cur_lim,
+                              TPS65217_USB_INPUT_CUR_LIMIT_MASK))
+               puts("tps65217_reg_write failure\n");
+
+       /* Set DCDC3 (CORE) voltage to 1.125V */
+       if (tps65217_voltage_update(TPS65217_DEFDCDC3,
+                                   TPS65217_DCDC_VOLT_SEL_1125MV)) {
+               puts("tps65217_voltage_update failure\n");
+               return;
+       }
+
+       /* Set CORE Frequencies to OPP100 */
+       do_setup_dpll(&dpll_core_regs, &dpll_core_opp100);
+
+       /* Set DCDC2 (MPU) voltage */
+       if (tps65217_voltage_update(TPS65217_DEFDCDC2, mpu_vdd)) {
+               puts("tps65217_voltage_update failure\n");
+               return;
+       }
+
+       /*
+        * Set LDO3 to 1.8V and LDO4 to 3.3V
+        */
+       if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
+                              TPS65217_DEFLS1,
+                              TPS65217_LDO_VOLTAGE_OUT_1_8,
+                              TPS65217_LDO_MASK))
+               puts("tps65217_reg_write failure\n");
+
+       if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
+                              TPS65217_DEFLS2,
+                              TPS65217_LDO_VOLTAGE_OUT_3_3,
+                              TPS65217_LDO_MASK))
+               puts("tps65217_reg_write failure\n");
+
+       /* Set MPU Frequency to what we detected now that voltages are set */
+       do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100);
+}
+
+const struct dpll_params *get_dpll_ddr_params(void)
+{
+       enable_i2c0_pin_mux();
+       i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
+
+       return &dpll_ddr;
+}
+
+void set_uart_mux_conf(void)
+{
+       enable_uart0_pin_mux();
+}
+
+void set_mux_conf_regs(void)
+{
+       enable_board_pin_mux();
+}
+
+const struct ctrl_ioregs ioregs = {
+       .cm0ioctl               = MT41K128M16JT125K_IOCTRL_VALUE,
+       .cm1ioctl               = MT41K128M16JT125K_IOCTRL_VALUE,
+       .cm2ioctl               = MT41K128M16JT125K_IOCTRL_VALUE,
+       .dt0ioctl               = MT41K128M16JT125K_IOCTRL_VALUE,
+       .dt1ioctl               = MT41K128M16JT125K_IOCTRL_VALUE,
+};
+
+void sdram_init(void)
+{
+       config_ddr(400, &ioregs,
+                  &ddr3_data,
+                  &ddr3_cmd_ctrl_data,
+                  &ddr3_emif_reg_data, 0);
+}
+#endif
+
+int board_init(void)
+{
+#if defined(CONFIG_HW_WATCHDOG)
+       hw_watchdog_init();
+#endif
+
+       gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
+
+#ifdef CONFIG_NAND
+       gpmc_init();
+#endif
+       return 0;
+}
diff --git a/board/bosch/guardian/board.h b/board/bosch/guardian/board.h
new file mode 100644 (file)
index 0000000..b301caf
--- /dev/null
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * board.h
+ *
+ * Board header for Bosch Guardian
+ *
+ * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
+ * Copyright (C) 2018 Robert Bosch Power Tools GmbH
+ */
+
+#ifndef _BOARD_H_
+#define _BOARD_H_
+
+void enable_uart0_pin_mux(void);
+void enable_i2c0_pin_mux(void);
+void enable_board_pin_mux(void);
+#endif
diff --git a/board/bosch/guardian/mux.c b/board/bosch/guardian/mux.c
new file mode 100644 (file)
index 0000000..708c3e7
--- /dev/null
@@ -0,0 +1,99 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * mux.c
+ *
+ * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
+ * Copyright (C) 2018 Robert Bosch Power Tools GmbH
+ */
+
+#include <common.h>
+#include <i2c.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/mux.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/io.h>
+#include "board.h"
+
+static struct module_pin_mux uart0_pin_mux[] = {
+       {OFFSET(uart0_rxd), (MODE(0) | PULLUP_EN | RXACTIVE)},
+       {OFFSET(uart0_txd), (MODE(0) | PULLUDEN)},
+       {-1},
+};
+
+static struct module_pin_mux i2c0_pin_mux[] = {
+       {OFFSET(i2c0_sda), (MODE(0) | RXACTIVE | PULLUDEN | SLEWCTRL)},
+       {OFFSET(i2c0_scl), (MODE(0) | RXACTIVE | PULLUDEN | SLEWCTRL)},
+       {-1},
+};
+
+static struct module_pin_mux adc_voltages_en[] = {
+       {OFFSET(mcasp0_ahclkx), (MODE(7) | PULLUP_EN)},
+       {-1},
+};
+
+static struct module_pin_mux asp_power_en[] = {
+       {OFFSET(mcasp0_aclkx), (MODE(7) | PULLUP_EN)},
+       {-1},
+};
+
+static struct module_pin_mux switch_off_3v6_pin_mux[] = {
+       {OFFSET(mii1_txd0), (MODE(7) | PULLUP_EN)},
+       /*
+        * The uart1 lines are made floating inputs, based on the Guardian
+        * A2 Sample Power Supply Schematics
+        */
+       {OFFSET(uart1_rxd), (MODE(7) | PULLUDDIS)},
+       {OFFSET(uart1_txd), (MODE(7) | PULLUDDIS)},
+       {-1},
+};
+
+#ifdef CONFIG_NAND
+static struct module_pin_mux nand_pin_mux[] = {
+       {OFFSET(gpmc_ad0),      (MODE(0) | PULLUDDIS | RXACTIVE)},
+       {OFFSET(gpmc_ad1),      (MODE(0) | PULLUDDIS | RXACTIVE)},
+       {OFFSET(gpmc_ad2),      (MODE(0) | PULLUDDIS | RXACTIVE)},
+       {OFFSET(gpmc_ad3),      (MODE(0) | PULLUDDIS | RXACTIVE)},
+       {OFFSET(gpmc_ad4),      (MODE(0) | PULLUDDIS | RXACTIVE)},
+       {OFFSET(gpmc_ad5),      (MODE(0) | PULLUDDIS | RXACTIVE)},
+       {OFFSET(gpmc_ad6),      (MODE(0) | PULLUDDIS | RXACTIVE)},
+       {OFFSET(gpmc_ad7),      (MODE(0) | PULLUDDIS | RXACTIVE)},
+#ifdef CONFIG_SYS_NAND_BUSWIDTH_16BIT
+       {OFFSET(gpmc_ad8),      (MODE(0) | PULLUDDIS | RXACTIVE)},
+       {OFFSET(gpmc_ad9),      (MODE(0) | PULLUDDIS | RXACTIVE)},
+       {OFFSET(gpmc_ad10),     (MODE(0) | PULLUDDIS | RXACTIVE)},
+       {OFFSET(gpmc_ad11),     (MODE(0) | PULLUDDIS | RXACTIVE)},
+       {OFFSET(gpmc_ad12),     (MODE(0) | PULLUDDIS | RXACTIVE)},
+       {OFFSET(gpmc_ad13),     (MODE(0) | PULLUDDIS | RXACTIVE)},
+       {OFFSET(gpmc_ad14),     (MODE(0) | PULLUDDIS | RXACTIVE)},
+       {OFFSET(gpmc_ad15),     (MODE(0) | PULLUDDIS | RXACTIVE)},
+#endif
+       {OFFSET(gpmc_wait0),    (MODE(0) | PULLUP_EN | RXACTIVE)},
+       {OFFSET(gpmc_wpn),      (MODE(7) | PULLUP_EN)},
+       {OFFSET(gpmc_csn0),     (MODE(0) | PULLUP_EN)},
+       {OFFSET(gpmc_wen),      (MODE(0) | PULLDOWN_EN)},
+       {OFFSET(gpmc_oen_ren),  (MODE(0) | PULLDOWN_EN)},
+       {OFFSET(gpmc_advn_ale), (MODE(0) | PULLDOWN_EN)},
+       {OFFSET(gpmc_be0n_cle), (MODE(0) | PULLDOWN_EN)},
+       {-1},
+};
+#endif
+
+void enable_uart0_pin_mux(void)
+{
+       configure_module_pin_mux(uart0_pin_mux);
+}
+
+void enable_i2c0_pin_mux(void)
+{
+       configure_module_pin_mux(i2c0_pin_mux);
+}
+
+void enable_board_pin_mux(void)
+{
+#ifdef CONFIG_NAND
+       configure_module_pin_mux(nand_pin_mux);
+#endif
+       configure_module_pin_mux(adc_voltages_en);
+       configure_module_pin_mux(asp_power_en);
+       configure_module_pin_mux(switch_off_3v6_pin_mux);
+}
diff --git a/board/compulab/cl-som-am57x/Kconfig b/board/compulab/cl-som-am57x/Kconfig
deleted file mode 100644 (file)
index 85fc9a1..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-if TARGET_CL_SOM_AM57X
-
-config SYS_BOARD
-       default "cl-som-am57x"
-
-config SYS_VENDOR
-       default "compulab"
-
-config SYS_CONFIG_NAME
-       default "cl-som-am57x"
-
-endif
diff --git a/board/compulab/cl-som-am57x/MAINTAINERS b/board/compulab/cl-som-am57x/MAINTAINERS
deleted file mode 100644 (file)
index e0195f4..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-CL-SOM-AM57x BOARD
-M:     Uri Mashiach <uri.mashiach@compulab.co.il>
-S:     Maintained
-F:     board/compulab/cl-som-am57x/
-F:     include/configs/cl-som-am57x.h
-F:     configs/cl-som-am57x_defconfig
diff --git a/board/compulab/cl-som-am57x/Makefile b/board/compulab/cl-som-am57x/Makefile
deleted file mode 100644 (file)
index 566366b..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Makefile
-#
-# (C) Copyright 2016 CompuLab, Ltd. <www.compulab.co.il>
-#
-# Author: Dmitry Lifshitz <lifshitz@compulab.co.il>
-#
-# SPDX-License-Identifier:     GPL-2.0+
-#
-
-ifdef CONFIG_SPL_BUILD
-obj-y  += spl.o mux.o
-else
-obj-y  += cl-som-am57x.o mux.o
-endif
-
-obj-$(CONFIG_DRIVER_TI_CPSW)   += eth.o
diff --git a/board/compulab/cl-som-am57x/cl-som-am57x.c b/board/compulab/cl-som-am57x/cl-som-am57x.c
deleted file mode 100644 (file)
index fcba2a0..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Board functions for CompuLab cl_som_am57x board
- *
- * (C) Copyright 2016 CompuLab, Ltd. http://compulab.co.il/
- *
- * Author: Dmitry Lifshitz <lifshitz@compulab.co.il>
- */
-
-#include <common.h>
-#include <palmas.h>
-#include <usb.h>
-#include <asm/gpio.h>
-#include <asm/arch/mmc_host_def.h>
-#include <asm/arch/sys_proto.h>
-#include "../common/common.h"
-#include "../common/eeprom.h"
-#include <asm/omap_common.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-const struct omap_sysinfo sysinfo = {
-       "Board: CL-SOM-AM57x\n"
-};
-
-int board_init(void)
-{
-       /* Disable PMIC Powerhold feature, DEV_CTRL.DEV_ON = 1 */
-       palmas_i2c_write_u8(TPS65903X_CHIP_P1, 0xA0, 0x1);
-
-       gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
-
-       return 0;
-}
-
-#ifdef CONFIG_MMC
-#define SB_SOM_CD_GPIO 187
-#define SB_SOM_WP_GPIO 188
-
-int board_mmc_init(bd_t *bis)
-{
-       int ret0, ret1;
-
-       ret0 = omap_mmc_init(0, 0, 0, SB_SOM_CD_GPIO, SB_SOM_WP_GPIO);
-       if (ret0)
-               printf("cl-som-am57x: failed to initialize mmc0\n");
-
-       ret1 = omap_mmc_init(1, 0, 0, -1, -1);
-       if (ret1)
-               printf("cl-som-am57x: failed to initialize mmc1\n");
-
-       return ret0 && ret1;
-}
-#endif /* CONFIG_MMC */
-
-int misc_init_r(void)
-{
-       cl_print_pcb_info();
-
-       return 0;
-}
-
-u32 get_board_rev(void)
-{
-       return cl_eeprom_get_board_rev(CONFIG_SYS_I2C_EEPROM_BUS);
-}
-
-int board_usb_init(int index, enum usb_init_type init)
-{
-       enable_usb_clocks(index);
-       return 0;
-}
-
-int board_usb_cleanup(int index, enum usb_init_type init)
-{
-       disable_usb_clocks(index);
-       return 0;
-}
diff --git a/board/compulab/cl-som-am57x/eth.c b/board/compulab/cl-som-am57x/eth.c
deleted file mode 100644 (file)
index 3c59457..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Ethernet specific code for CompuLab CL-SOM-AM57x module
- *
- * (C) Copyright 2016 CompuLab, Ltd. http://compulab.co.il/
- *
- * Author: Uri Mashiach <uri.mashiach@compulab.co.il>
- */
-
-#include <common.h>
-#include <cpsw.h>
-#include <environment.h>
-#include <miiphy.h>
-#include <asm/gpio.h>
-#include <asm/arch/sys_proto.h>
-#include "../common/eeprom.h"
-
-static void cpsw_control(int enabled)
-{
-       /* VTP can be added here */
-}
-
-static struct cpsw_slave_data cl_som_am57x_cpsw_slaves[] = {
-       {
-               .slave_reg_ofs  = 0x208,
-               .sliver_reg_ofs = 0xd80,
-               .phy_addr       = 0,
-               .phy_if         = PHY_INTERFACE_MODE_RMII,
-       },
-       {
-               .slave_reg_ofs  = 0x308,
-               .sliver_reg_ofs = 0xdc0,
-               .phy_addr       = 1,
-               .phy_if         = PHY_INTERFACE_MODE_RMII,
-
-       },
-};
-
-static struct cpsw_platform_data cl_som_am57_cpsw_data = {
-       .mdio_base              = CPSW_MDIO_BASE,
-       .cpsw_base              = CPSW_BASE,
-       .mdio_div               = 0xff,
-       .channels               = 8,
-       .cpdma_reg_ofs          = 0x800,
-       .slaves                 = 2,
-       .slave_data             = cl_som_am57x_cpsw_slaves,
-       .ale_reg_ofs            = 0xd00,
-       .ale_entries            = 1024,
-       .host_port_reg_ofs      = 0x108,
-       .hw_stats_reg_ofs       = 0x900,
-       .bd_ram_ofs             = 0x2000,
-       .mac_control            = (1 << 5),
-       .control                = cpsw_control,
-       .host_port_num          = 0,
-       .version                = CPSW_CTRL_VERSION_2,
-};
-
-/*
- * cl_som_am57x_efuse_read_mac_addr() - read Ethernet port MAC address.
- *       The information is retrieved from the SOC's registers.
- * @buff: read buffer.
- * @port_num: port number.
- */
-static void cl_som_am57x_efuse_read_mac_addr(uchar *buff, uint port_num)
-{
-       uint32_t mac_hi, mac_lo;
-
-       if (port_num) {
-               mac_lo = readl((*ctrl)->control_core_mac_id_1_lo);
-               mac_hi = readl((*ctrl)->control_core_mac_id_1_hi);
-       } else {
-               mac_lo = readl((*ctrl)->control_core_mac_id_0_lo);
-               mac_hi = readl((*ctrl)->control_core_mac_id_0_hi);
-       }
-
-       buff[0] = (mac_hi & 0xFF0000) >> 16;
-       buff[1] = (mac_hi & 0xFF00) >> 8;
-       buff[2] = mac_hi & 0xFF;
-       buff[3] = (mac_lo & 0xFF0000) >> 16;
-       buff[4] = (mac_lo & 0xFF00) >> 8;
-       buff[5] = mac_lo & 0xFF;
-}
-
-/*
- * cl_som_am57x_handle_mac_address() - set MAC address in the U-Boot
- *     environment.
- *      The address is retrieved retrieved from an EEPROM field or from the
- *     SOC's registers.
- * @env_name: U-Boot environment name.
- * @field_name: EEPROM field name.
- * @port_num: SOC's port number.
- */
-static int cl_som_am57x_handle_mac_address(char *env_name, uint port_num)
-{
-       int ret;
-       uint8_t enetaddr[6];
-
-       ret = eth_env_get_enetaddr(env_name, enetaddr);
-       if (ret)
-               return 0;
-
-       ret = cl_eeprom_read_mac_addr(enetaddr, CONFIG_SYS_I2C_EEPROM_BUS);
-
-       if (ret || !is_valid_ethaddr(enetaddr))
-               cl_som_am57x_efuse_read_mac_addr(enetaddr, port_num);
-
-       if (!is_valid_ethaddr(enetaddr))
-               return -1;
-
-       ret = eth_env_set_enetaddr(env_name, enetaddr);
-       if (ret)
-               printf("cl-som-am57x: Failed to set Eth port %d MAC address\n",
-                      port_num);
-
-       return ret;
-}
-
-#define CL_SOM_AM57X_PHY_ADDR2                 0x01
-#define AR8033_PHY_DEBUG_ADDR_REG              0x1d
-#define AR8033_PHY_DEBUG_DATA_REG              0x1e
-#define AR8033_DEBUG_RGMII_RX_CLK_DLY_REG      0x00
-#define AR8033_DEBUG_RGMII_TX_CLK_DLY_REG      0x05
-#define AR8033_DEBUG_RGMII_RX_CLK_DLY_MASK     (1 << 15)
-#define AR8033_DEBUG_RGMII_TX_CLK_DLY_MASK     (1 << 8)
-
-/*
- * cl_som_am57x_rgmii_clk_delay() - Set RGMII clock delay.
- *     Enable RX delay, disable TX delay.
- */
-static void cl_som_am57x_rgmii_clk_delay(void)
-{
-       uint16_t mii_reg_val;
-       const char *devname;
-
-       devname = miiphy_get_current_dev();
-       /* PHY 2 */
-       miiphy_write(devname, CL_SOM_AM57X_PHY_ADDR2, AR8033_PHY_DEBUG_ADDR_REG,
-                    AR8033_DEBUG_RGMII_RX_CLK_DLY_REG);
-       miiphy_read(devname, CL_SOM_AM57X_PHY_ADDR2, AR8033_PHY_DEBUG_DATA_REG,
-                   &mii_reg_val);
-       mii_reg_val |= AR8033_DEBUG_RGMII_RX_CLK_DLY_MASK;
-       miiphy_write(devname, CL_SOM_AM57X_PHY_ADDR2, AR8033_PHY_DEBUG_DATA_REG,
-                    mii_reg_val);
-
-       miiphy_write(devname, CL_SOM_AM57X_PHY_ADDR2, AR8033_PHY_DEBUG_ADDR_REG,
-                    AR8033_DEBUG_RGMII_TX_CLK_DLY_REG);
-       miiphy_read(devname, CL_SOM_AM57X_PHY_ADDR2, AR8033_PHY_DEBUG_DATA_REG,
-                   &mii_reg_val);
-       mii_reg_val &= ~AR8033_DEBUG_RGMII_TX_CLK_DLY_MASK;
-       miiphy_write(devname, CL_SOM_AM57X_PHY_ADDR2, AR8033_PHY_DEBUG_DATA_REG,
-                    mii_reg_val);
-}
-
-#define CL_SOM_AM57X_GPIO_PHY1_RST 92 /* GPIO3_28 */
-#define CL_SOM_AM57X_RGMII_PORT1 1
-
-int board_eth_init(bd_t *bis)
-{
-       int ret;
-       uint32_t ctrl_val;
-       char *cpsw_phy_envval;
-       int cpsw_act_phy = 1;
-
-       /* SB-SOM-AM57x primary Eth (P21) is routed to RGMII1 */
-       ret = cl_som_am57x_handle_mac_address("ethaddr",
-                                             CL_SOM_AM57X_RGMII_PORT1);
-
-       if (ret)
-               return -1;
-
-       /* Select RGMII for GMII1_SEL */
-       ctrl_val = readl((*ctrl)->control_core_control_io1) & (~0x33);
-       ctrl_val |= 0x22;
-       writel(ctrl_val, (*ctrl)->control_core_control_io1);
-       mdelay(10);
-
-       gpio_request(CL_SOM_AM57X_GPIO_PHY1_RST, "phy1_rst");
-       gpio_direction_output(CL_SOM_AM57X_GPIO_PHY1_RST, 0);
-       mdelay(20);
-
-       gpio_set_value(CL_SOM_AM57X_GPIO_PHY1_RST, 1);
-       mdelay(20);
-
-       cpsw_phy_envval = env_get("cpsw_phy");
-       if (cpsw_phy_envval != NULL)
-               cpsw_act_phy = simple_strtoul(cpsw_phy_envval, NULL, 0);
-
-       cl_som_am57_cpsw_data.active_slave = cpsw_act_phy;
-
-       ret = cpsw_register(&cl_som_am57_cpsw_data);
-       if (ret < 0)
-               printf("Error %d registering CPSW switch\n", ret);
-
-       /* Set RGMII clock delay */
-       cl_som_am57x_rgmii_clk_delay();
-
-       return ret;
-}
diff --git a/board/compulab/cl-som-am57x/mux.c b/board/compulab/cl-som-am57x/mux.c
deleted file mode 100644 (file)
index 050f2aa..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Pinmux configuration for CompuLab CL-SOM-AM57x board
- *
- * (C) Copyright 2016 CompuLab, Ltd. http://compulab.co.il/
- *
- * Author: Dmitry Lifshitz <lifshitz@compulab.co.il>
- */
-#include <asm/arch/sys_proto.h>
-#include <asm/arch/mux_dra7xx.h>
-
-/* Serial console */
-static const struct pad_conf_entry cl_som_am57x_padconf_console[] = {
-       {UART3_RXD, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* UART3_RXD */
-       {UART3_TXD, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* UART3_TXD */
-};
-
-/* PMIC I2C */
-static const struct pad_conf_entry cl_som_am57x_padconf_pmic[] = {
-       {MCASP1_ACLKR, (M10 | PIN_INPUT)}, /* MCASP1_ACLKR.I2C4_SDA */
-       {MCASP1_FSR,   (M10 | PIN_INPUT)}, /* MCASP1_FSR.I2C4_SCL */
-};
-
-/* Green GPIO led */
-static const struct pad_conf_entry cl_som_am57x_padconf_green_led[] = {
-       {GPMC_A15, (M14 | PIN_OUTPUT_PULLDOWN)}, /* GPMC_A15.GPIO2_5 */
-};
-
-/* MMC/SD Card */
-static const struct pad_conf_entry cl_som_am57x_padconf_sd_card[] = {
-       {MMC1_CLK,  (M0  | PIN_INPUT_PULLUP)}, /* MMC1_CLK */
-       {MMC1_CMD,  (M0  | PIN_INPUT_PULLUP)}, /* MMC1_CMD */
-       {MMC1_DAT0, (M0  | PIN_INPUT_PULLUP)}, /* MMC1_DAT0 */
-       {MMC1_DAT1, (M0  | PIN_INPUT_PULLUP)}, /* MMC1_DAT1 */
-       {MMC1_DAT2, (M0  | PIN_INPUT_PULLUP)}, /* MMC1_DAT2 */
-       {MMC1_DAT3, (M0  | PIN_INPUT_PULLUP)}, /* MMC1_DAT3 */
-       {MMC1_SDCD, (M14 | PIN_INPUT)       }, /* MMC1_SDCD */
-       {MMC1_SDWP, (M14 | PIN_INPUT)       }, /* MMC1_SDWP */
-};
-
-/* WiFi - must be in the safe mode on boot */
-static const struct pad_conf_entry cl_som_am57x_padconf_wifi[] = {
-       {UART1_CTSN, (M15 | PIN_INPUT_PULLDOWN)}, /* UART1_CTSN */
-       {UART1_RTSN, (M15 | PIN_INPUT_PULLDOWN)}, /* UART1_RTSN */
-       {UART2_RXD,  (M15 | PIN_INPUT_PULLDOWN)}, /* UART2_RXD */
-       {UART2_TXD,  (M15 | PIN_INPUT_PULLDOWN)}, /* UART2_TXD */
-       {UART2_CTSN, (M15 | PIN_INPUT_PULLDOWN)}, /* UART2_CTSN */
-       {UART2_RTSN, (M15 | PIN_INPUT_PULLDOWN)}, /* UART2_RTSN */
-};
-
-/* QSPI */
-static const struct pad_conf_entry cl_som_am57x_padconf_qspi[] = {
-       {GPMC_A13, (M1 | PIN_INPUT)       }, /* GPMC_A13.QSPI1_RTCLK */
-       {GPMC_A18, (M1 | PIN_INPUT)       }, /* GPMC_A18.QSPI1_SCLK */
-       {GPMC_A16, (M1 | PIN_INPUT)       }, /* GPMC_A16.QSPI1_D0 */
-       {GPMC_A17, (M1 | PIN_INPUT)       }, /* GPMC_A17.QSPI1_D1 */
-       {GPMC_CS2, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_CS2.QSPI1_CS0 */
-};
-
-/* GPIO Expander I2C */
-static const struct pad_conf_entry cl_som_am57x_padconf_i2c_gpio[] = {
-       {MCASP1_AXR0, (M10 | PIN_INPUT)}, /* MCASP1_AXR0.I2C5_SDA */
-       {MCASP1_AXR1, (M10 | PIN_INPUT)}, /* MCASP1_AXR1.I2C5_SCL */
-};
-
-/* eMMC internal storage */
-static const struct pad_conf_entry cl_som_am57x_padconf_emmc[] = {
-       {GPMC_A19, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A19.MMC2_DAT4 */
-       {GPMC_A20, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A20.MMC2_DAT5 */
-       {GPMC_A21, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A21.MMC2_DAT6 */
-       {GPMC_A22, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A22.MMC2_DAT7 */
-       {GPMC_A23, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A23.MMC2_CLK */
-       {GPMC_A24, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A24.MMC2_DAT0 */
-       {GPMC_A25, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A25.MMC2_DAT1 */
-       {GPMC_A26, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A26.MMC2_DAT2 */
-       {GPMC_A27, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A27.MMC2_DAT3 */
-       {GPMC_CS1, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_CS1.MMC2_CMD */
-};
-
-/* usb1_drvvbus */
-static const struct pad_conf_entry cl_som_am57x_padconf_usb[] = {
-       /* USB1_DRVVBUS.USB1_DRVVBUS */
-       {USB1_DRVVBUS, (M0 | PIN_OUTPUT_PULLDOWN | SLEWCONTROL) },
-};
-
-/* Ethernet */
-static const struct pad_conf_entry cl_som_am57x_padconf_ethernet[] = {
-       /* MDIO bus */
-       {VIN2A_D10,  (M3  | PIN_OUTPUT_PULLUP) }, /* VIN2A_D10.MDIO_MCLK  */
-       {VIN2A_D11,  (M3  | PIN_INPUT_PULLUP)  }, /* VIN2A_D11.MDIO_D  */
-       /* EMAC Slave 1 at addr 0x1 - Default interface */
-       {VIN2A_D12,  (M3  | PIN_OUTPUT)         }, /* VIN2A_D12.RGMII1_TXC */
-       {VIN2A_D13,  (M3  | PIN_OUTPUT)         }, /* VIN2A_D13.RGMII1_TXCTL */
-       {VIN2A_D14,  (M3  | PIN_OUTPUT)         }, /* VIN2A_D14.RGMII1_TXD3 */
-       {VIN2A_D15,  (M3  | PIN_OUTPUT)         }, /* VIN2A_D15.RGMII1_TXD2 */
-       {VIN2A_D16,  (M3  | PIN_OUTPUT)         }, /* VIN2A_D16.RGMII1_TXD1 */
-       {VIN2A_D17,  (M3  | PIN_OUTPUT)         }, /* VIN2A_D17.RGMII1_TXD0 */
-       {VIN2A_D18,  (M3  | PIN_INPUT_PULLDOWN) }, /* VIN2A_D18.RGMII1_RXC */
-       {VIN2A_D19,  (M3  | PIN_INPUT_PULLDOWN) }, /* VIN2A_D19.RGMII1_RXCTL */
-       {VIN2A_D20,  (M3  | PIN_INPUT_PULLDOWN) }, /* VIN2A_D20.RGMII1_RXD3 */
-       {VIN2A_D21,  (M3  | PIN_INPUT_PULLDOWN) }, /* VIN2A_D21.RGMII1_RXD2 */
-       {VIN2A_D22,  (M3  | PIN_INPUT_PULLDOWN) }, /* VIN2A_D22.RGMII1_RXD1 */
-       {VIN2A_D23,  (M3  | PIN_INPUT_PULLDOWN) }, /* VIN2A_D23.RGMII1_RXD0 */
-       /* Eth PHY1 reset GPIOs*/
-       {VIN2A_CLK0, (M14 | PIN_OUTPUT_PULLDOWN)}, /* VIN2A_CLK0.GPIO3_28 */
-};
-
-#define SET_MUX(mux_array) do_set_mux32((*ctrl)->control_padconf_core_base, \
-                                       mux_array, ARRAY_SIZE(mux_array))
-
-void set_muxconf_regs(void)
-{
-       SET_MUX(cl_som_am57x_padconf_console);
-       SET_MUX(cl_som_am57x_padconf_pmic);
-       SET_MUX(cl_som_am57x_padconf_green_led);
-       SET_MUX(cl_som_am57x_padconf_sd_card);
-       SET_MUX(cl_som_am57x_padconf_wifi);
-       SET_MUX(cl_som_am57x_padconf_qspi);
-       SET_MUX(cl_som_am57x_padconf_i2c_gpio);
-       SET_MUX(cl_som_am57x_padconf_emmc);
-       SET_MUX(cl_som_am57x_padconf_usb);
-       SET_MUX(cl_som_am57x_padconf_ethernet);
-}
diff --git a/board/compulab/cl-som-am57x/spl.c b/board/compulab/cl-som-am57x/spl.c
deleted file mode 100644 (file)
index 0fb3d84..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * SPL data and initialization for CompuLab CL-SOM-AM57x board
- *
- * (C) Copyright 2016 CompuLab, Ltd. http://compulab.co.il/
- *
- * Author: Uri Mashiach <uri.mashiach@compulab.co.il>
- */
-
-#include <asm/emif.h>
-#include <asm/omap_common.h>
-#include <asm/arch/sys_proto.h>
-
-static const struct dmm_lisa_map_regs cl_som_am57x_lisa_regs = {
-       .dmm_lisa_map_3 = 0x80740300,
-       .is_ma_present  = 0x1
-};
-
-void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
-{
-       /* Disable SDRAM controller EMIF2 for single core SOC */
-       *dmm_lisa_regs = &cl_som_am57x_lisa_regs;
-       if (omap_revision() == DRA722_ES1_0) {
-               ((struct dmm_lisa_map_regs *) *dmm_lisa_regs)->dmm_lisa_map_3 =
-                 0x80640100;
-       }
-}
-
-static const struct emif_regs cl_som_am57x_emif1_ddr3_532mhz_emif_regs = {
-       .sdram_config_init      = 0x61852332,
-       .sdram_config           = 0x61852332,
-       .sdram_config2          = 0x00000000,
-       .ref_ctrl               = 0x000040f1,
-       .ref_ctrl_final         = 0x00001040,
-       .sdram_tim1             = 0xeeef36f3,
-       .sdram_tim2             = 0x348f7fda,
-       .sdram_tim3             = 0x027f88a8,
-       .read_idle_ctrl         = 0x00050000,
-       .zq_config              = 0x1007190b,
-       .temp_alert_config      = 0x00000000,
-       .emif_ddr_phy_ctlr_1_init = 0x0034400b,
-       .emif_ddr_phy_ctlr_1    = 0x0e34400b,
-       .emif_ddr_ext_phy_ctrl_1 = 0x04040100,
-       .emif_ddr_ext_phy_ctrl_2 = 0x00740074,
-       .emif_ddr_ext_phy_ctrl_3 = 0x00780078,
-       .emif_ddr_ext_phy_ctrl_4 = 0x007c007c,
-       .emif_ddr_ext_phy_ctrl_5 = 0x007b007b,
-       .emif_rd_wr_lvl_rmp_win = 0x00000000,
-       .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
-       .emif_rd_wr_lvl_ctl     = 0x00000000,
-       .emif_rd_wr_exec_thresh = 0x00000305
-};
-
-/* Ext phy ctrl regs 1-35 */
-static const u32 cl_som_am57x_emif1_ddr3_ext_phy_ctrl_regs[] = {
-       0x10040100,
-       0x00740074,
-       0x00780078,
-       0x007c007c,
-       0x007b007b,
-       0x00800080,
-       0x00360036,
-       0x00340034,
-       0x00360036,
-       0x00350035,
-       0x00350035,
-
-       0x01ff01ff,
-       0x01ff01ff,
-       0x01ff01ff,
-       0x01ff01ff,
-       0x01ff01ff,
-
-       0x00430043,
-       0x003e003e,
-       0x004a004a,
-       0x00470047,
-       0x00400040,
-
-       0x00000000,
-       0x00600020,
-       0x40011080,
-       0x08102040,
-
-       0x00400040,
-       0x00400040,
-       0x00400040,
-       0x00400040,
-       0x00400040,
-       0x0,
-       0x0,
-       0x0,
-       0x0,
-       0x0
-};
-
-static const struct emif_regs cl_som_am57x_emif2_ddr3_532mhz_emif_regs = {
-       .sdram_config_init      = 0x61852332,
-       .sdram_config           = 0x61852332,
-       .sdram_config2          = 0x00000000,
-       .ref_ctrl               = 0x000040f1,
-       .ref_ctrl_final         = 0x00001040,
-       .sdram_tim1             = 0xeeef36f3,
-       .sdram_tim2             = 0x348f7fda,
-       .sdram_tim3             = 0x027f88a8,
-       .read_idle_ctrl         = 0x00050000,
-       .zq_config              = 0x1007190b,
-       .temp_alert_config      = 0x00000000,
-       .emif_ddr_phy_ctlr_1_init = 0x0034400b,
-       .emif_ddr_phy_ctlr_1    = 0x0e34400b,
-       .emif_ddr_ext_phy_ctrl_1 = 0x04040100,
-       .emif_ddr_ext_phy_ctrl_2 = 0x00740074,
-       .emif_ddr_ext_phy_ctrl_3 = 0x00780078,
-       .emif_ddr_ext_phy_ctrl_4 = 0x007c007c,
-       .emif_ddr_ext_phy_ctrl_5 = 0x007b007b,
-       .emif_rd_wr_lvl_rmp_win = 0x00000000,
-       .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
-       .emif_rd_wr_lvl_ctl     = 0x00000000,
-       .emif_rd_wr_exec_thresh = 0x00000305
-};
-
-static const u32 cl_som_am57x_emif2_ddr3_ext_phy_ctrl_regs[] = {
-       0x10040100,
-       0x00820082,
-       0x008b008b,
-       0x00800080,
-       0x007e007e,
-       0x00800080,
-       0x00370037,
-       0x00390039,
-       0x00360036,
-       0x00370037,
-       0x00350035,
-       0x01ff01ff,
-       0x01ff01ff,
-       0x01ff01ff,
-       0x01ff01ff,
-       0x01ff01ff,
-       0x00540054,
-       0x00540054,
-       0x004e004e,
-       0x004c004c,
-       0x00400040,
-
-       0x00000000,
-       0x00600020,
-       0x40011080,
-       0x08102040,
-
-       0x00400040,
-       0x00400040,
-       0x00400040,
-       0x00400040,
-       0x00400040,
-       0x0,
-       0x0,
-       0x0,
-       0x0,
-       0x0
-};
-
-static struct vcores_data cl_som_am57x_volts = {
-       .mpu.value[OPP_NOM]     = VDD_MPU_DRA7_NOM,
-       .mpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_MPU_NOM,
-       .mpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
-       .mpu.addr               = TPS659038_REG_ADDR_SMPS12,
-       .mpu.pmic               = &tps659038,
-
-       .eve.value[OPP_NOM]     = VDD_EVE_DRA7_NOM,
-       .eve.value[OPP_OD]      = VDD_EVE_DRA7_OD,
-       .eve.value[OPP_HIGH]    = VDD_EVE_DRA7_HIGH,
-       .eve.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_DSPEVE_NOM,
-       .eve.efuse.reg[OPP_OD]  = STD_FUSE_OPP_VMIN_DSPEVE_OD,
-       .eve.efuse.reg[OPP_HIGH]        = STD_FUSE_OPP_VMIN_DSPEVE_HIGH,
-       .eve.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
-       .eve.addr               = TPS659038_REG_ADDR_SMPS45,
-       .eve.pmic               = &tps659038,
-
-       .gpu.value[OPP_NOM]     = VDD_GPU_DRA7_NOM,
-       .gpu.value[OPP_OD]      = VDD_GPU_DRA7_OD,
-       .gpu.value[OPP_HIGH]    = VDD_GPU_DRA7_HIGH,
-       .gpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_GPU_NOM,
-       .gpu.efuse.reg[OPP_OD]  = STD_FUSE_OPP_VMIN_GPU_OD,
-       .gpu.efuse.reg[OPP_HIGH]        = STD_FUSE_OPP_VMIN_GPU_HIGH,
-       .gpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
-       .gpu.addr               = TPS659038_REG_ADDR_SMPS6,
-       .gpu.pmic               = &tps659038,
-
-       .core.value[OPP_NOM]    = VDD_CORE_DRA7_NOM,
-       .core.efuse.reg[OPP_NOM]        = STD_FUSE_OPP_VMIN_CORE_NOM,
-       .core.efuse.reg_bits    = DRA752_EFUSE_REGBITS,
-       .core.addr              = TPS659038_REG_ADDR_SMPS7,
-       .core.pmic              = &tps659038,
-
-       .iva.value[OPP_NOM]     = VDD_IVA_DRA7_NOM,
-       .iva.value[OPP_OD]      = VDD_IVA_DRA7_OD,
-       .iva.value[OPP_HIGH]    = VDD_IVA_DRA7_HIGH,
-       .iva.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_IVA_NOM,
-       .iva.efuse.reg[OPP_OD]  = STD_FUSE_OPP_VMIN_IVA_OD,
-       .iva.efuse.reg[OPP_HIGH]        = STD_FUSE_OPP_VMIN_IVA_HIGH,
-       .iva.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
-       .iva.addr               = TPS659038_REG_ADDR_SMPS8,
-       .iva.pmic               = &tps659038,
-};
-
-void hw_data_init(void)
-{
-       *prcm = &dra7xx_prcm;
-       *dplls_data = &dra7xx_dplls;
-       *omap_vcores = &cl_som_am57x_volts;
-       *ctrl = &dra7xx_ctrl;
-}
-
-void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
-{
-       switch (emif_nr) {
-       case 1:
-               *regs = &cl_som_am57x_emif1_ddr3_532mhz_emif_regs;
-               break;
-       case 2:
-               *regs = &cl_som_am57x_emif2_ddr3_532mhz_emif_regs;
-               break;
-       }
-}
-
-void emif_get_ext_phy_ctrl_const_regs(u32 emif_nr, const u32 **regs, u32 *size)
-{
-       switch (emif_nr) {
-       case 1:
-               *regs = cl_som_am57x_emif1_ddr3_ext_phy_ctrl_regs;
-               *size = ARRAY_SIZE(cl_som_am57x_emif1_ddr3_ext_phy_ctrl_regs);
-               break;
-       case 2:
-               *regs = cl_som_am57x_emif2_ddr3_ext_phy_ctrl_regs;
-               *size = ARRAY_SIZE(cl_som_am57x_emif2_ddr3_ext_phy_ctrl_regs);
-               break;
-       }
-}
index b0b29b3887f54eb69d70be2a92357561a03f2a10..1bc26828bfa207fd28908766d57b8bfac4fa36ae 100644 (file)
@@ -49,33 +49,6 @@ DECLARE_GLOBAL_DATA_PTR;
 
 #define CFG_MAC_ADDR_OFFSET    (flash->size - SZ_64K)
 
-#ifdef CONFIG_SPL_BUILD
-#include <ns16550.h>
-#include <dm/platform_data/spi_davinci.h>
-
-static const struct ns16550_platdata da850evm_serial = {
-       .base = DAVINCI_UART2_BASE,
-       .reg_shift = 2,
-       .clock = 150000000,
-       .fcr = UART_FCR_DEFVAL,
-};
-
-U_BOOT_DEVICE(da850evm_uart) = {
-       .name = "ns16550_serial",
-       .platdata = &da850evm_serial,
-};
-
-static const struct davinci_spi_platdata davinci_spi_data = {
-        .regs = (struct davinci_spi_regs *)0x01f0e000,
-        .num_cs = 4,
-};
-
-U_BOOT_DEVICE(davinci_spi) = {
-        .name = "davinci_spi",
-        .platdata = &davinci_spi_data,
-};
-#endif
-
 #ifdef CONFIG_MAC_ADDR_IN_SPIFLASH
 static int get_mac_addr(u8 *addr)
 {
@@ -231,25 +204,6 @@ int misc_init_r(void)
        return 0;
 }
 
-#ifndef CONFIG_DM_MMC
-#ifdef CONFIG_MMC_DAVINCI
-static struct davinci_mmc mmc_sd0 = {
-       .reg_base = (struct davinci_mmc_regs *)DAVINCI_MMC_SD0_BASE,
-       .host_caps = MMC_MODE_4BIT,     /* DA850 supports only 4-bit SD/MMC */
-       .voltages = MMC_VDD_32_33 | MMC_VDD_33_34,
-       .version = MMC_CTLR_VERSION_2,
-};
-
-int board_mmc_init(bd_t *bis)
-{
-       mmc_sd0.input_clk = clk_get(DAVINCI_MMCSD_CLKID);
-
-       /* Add slot-0 to mmc subsystem */
-       return davinci_mmc_init(bis, &mmc_sd0);
-}
-#endif
-#endif
-
 static const struct pinmux_config gpio_pins[] = {
 #ifdef CONFIG_USE_NOR
        /* GP0[11] is required for NOR to work on Rev 3 EVMs */
index 7b5fab7756cb524ee545a14555cd266d83a9b499..8f04911306bc4127cea744fefcf73f9056e0630e 100644 (file)
@@ -10,6 +10,9 @@
 MEMORY { .sram : ORIGIN = IMAGE_TEXT_BASE,\
                LENGTH = CONFIG_SPL_MAX_FOOTPRINT }
 
+MEMORY { .sdram : ORIGIN = CONFIG_SPL_BSS_START_ADDR, \
+                LENGTH = CONFIG_SPL_BSS_MAX_SIZE }
+
 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
 OUTPUT_ARCH(arm)
 ENTRY(_start)
@@ -42,6 +45,15 @@ SECTIONS
                __rel_dyn_end = .;
        } >.sram
 
+       __image_copy_end = .;
+
+       .end :
+       {
+               *(.__end)
+       }
+
+       _image_binary_end = .;
+
        .bss :
        {
                . = ALIGN(4);
@@ -49,12 +61,5 @@ SECTIONS
                *(.bss*)
                . = ALIGN(4);
                __bss_end = .;
-       } >.sram
-
-       __image_copy_end = .;
-
-       .end :
-       {
-               *(.__end)
-       }
+       } >.sdram
 }
index a4c587a390834c8017197d8b2b9fa47e026cf535..63cd605b6abd6f155280daca22791bafd53a1cfb 100644 (file)
@@ -112,7 +112,7 @@ void build_info(void)
        sc_misc_build_info(-1, &sc_build, &sc_commit);
        if (!sc_build) {
                printf("SCFW does not support build info\n");
-               sc_commit = 0; /* Display 0 when the build info is not supported*/
+               sc_commit = 0; /* Display 0 when the build info is not supported */
        }
        printf("Build: SCFW %x\n", sc_commit);
 }
index 079d302fbecc0230db7be42fb734e92d06c3eab1..f42d2ceb79dc2c299ee95753fde5872b93421c19 100644 (file)
@@ -10,6 +10,7 @@
 #include <asm/arch/iomux.h>
 #include <asm/arch/mx6-pins.h>
 #include <linux/errno.h>
+#include <linux/libfdt.h>
 #include <asm/gpio.h>
 #include <asm/mach-imx/mxc_i2c.h>
 #include <asm/mach-imx/iomux-v3.h>
@@ -27,6 +28,7 @@
 #include <i2c.h>
 #include <input.h>
 #include <pwm.h>
+#include <version.h>
 #include <stdlib.h>
 #include "../common/ge_common.h"
 #include "../common/vpd_reader.h"
@@ -44,10 +46,6 @@ static struct vpd_cache vpd;
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
        PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |                   \
-       PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
-       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
-
 #define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP | PAD_CTL_PUE |    \
        PAD_CTL_SPEED_HIGH | PAD_CTL_DSE_48ohm | PAD_CTL_SRE_FAST)
 
@@ -57,9 +55,6 @@ static struct vpd_cache vpd;
 #define ENET_RX_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
        PAD_CTL_SPEED_HIGH   | PAD_CTL_SRE_FAST)
 
-#define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED | \
-                     PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
-
 #define I2C_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                   \
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
        PAD_CTL_ODE | PAD_CTL_SRE_FAST)
@@ -110,58 +105,13 @@ static void setup_iomux_enet(void)
        imx_iomux_v3_setup_multiple_pads(enet_pads, ARRAY_SIZE(enet_pads));
 
        /* Reset AR8033 PHY */
+       gpio_request(IMX_GPIO_NR(1, 28), "fec_rst");
        gpio_direction_output(IMX_GPIO_NR(1, 28), 0);
        mdelay(10);
        gpio_set_value(IMX_GPIO_NR(1, 28), 1);
        mdelay(1);
 }
 
-static iomux_v3_cfg_t const usdhc2_pads[] = {
-       MX6_PAD_SD2_CLK__SD2_CLK        | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD2_CMD__SD2_CMD        | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD2_DAT0__SD2_DATA0     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD2_DAT1__SD2_DATA1     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD2_DAT2__SD2_DATA2     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD2_DAT3__SD2_DATA3     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_GPIO_4__GPIO1_IO04      | MUX_PAD_CTRL(NO_PAD_CTRL),
-};
-
-static iomux_v3_cfg_t const usdhc3_pads[] = {
-       MX6_PAD_SD3_CLK__SD3_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_CMD__SD3_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_RST__SD3_RESET | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-};
-
-static iomux_v3_cfg_t const usdhc4_pads[] = {
-       MX6_PAD_SD4_CLK__SD4_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_CMD__SD4_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_DAT4__SD4_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_DAT5__SD4_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_DAT6__SD4_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_DAT7__SD4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_NANDF_CS0__GPIO6_IO11 | MUX_PAD_CTRL(NO_PAD_CTRL),
-       MX6_PAD_NANDF_CS1__GPIO6_IO14 | MUX_PAD_CTRL(NO_PAD_CTRL),
-};
-
-static iomux_v3_cfg_t const ecspi1_pads[] = {
-       MX6_PAD_EIM_D16__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL),
-       MX6_PAD_EIM_D17__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL),
-       MX6_PAD_EIM_D18__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL),
-       MX6_PAD_EIM_EB2__GPIO2_IO30 | MUX_PAD_CTRL(NO_PAD_CTRL),
-};
-
 static struct i2c_pads_info i2c_pad_info1 = {
        .scl = {
                .i2c_mode = MX6_PAD_CSI0_DAT9__I2C1_SCL | I2C_PAD,
@@ -201,18 +151,6 @@ static struct i2c_pads_info i2c_pad_info3 = {
        }
 };
 
-#ifdef CONFIG_MXC_SPI
-int board_spi_cs_gpio(unsigned bus, unsigned cs)
-{
-       return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(2, 30)) : -1;
-}
-
-static void setup_spi(void)
-{
-       imx_iomux_v3_setup_multiple_pads(ecspi1_pads, ARRAY_SIZE(ecspi1_pads));
-}
-#endif
-
 static iomux_v3_cfg_t const pcie_pads[] = {
        MX6_PAD_GPIO_5__GPIO1_IO05 | MUX_PAD_CTRL(NO_PAD_CTRL),
        MX6_PAD_GPIO_17__GPIO7_IO12 | MUX_PAD_CTRL(NO_PAD_CTRL),
@@ -229,76 +167,6 @@ static void setup_iomux_uart(void)
        imx_iomux_v3_setup_multiple_pads(uart4_pads, ARRAY_SIZE(uart4_pads));
 }
 
-#ifdef CONFIG_FSL_ESDHC
-struct fsl_esdhc_cfg usdhc_cfg[3] = {
-       {USDHC2_BASE_ADDR},
-       {USDHC3_BASE_ADDR},
-       {USDHC4_BASE_ADDR},
-};
-
-#define USDHC2_CD_GPIO IMX_GPIO_NR(1, 4)
-#define USDHC4_CD_GPIO IMX_GPIO_NR(6, 11)
-
-int board_mmc_getcd(struct mmc *mmc)
-{
-       struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
-       int ret = 0;
-
-       switch (cfg->esdhc_base) {
-       case USDHC2_BASE_ADDR:
-               ret = !gpio_get_value(USDHC2_CD_GPIO);
-               break;
-       case USDHC3_BASE_ADDR:
-               ret = 1; /* eMMC is always present */
-               break;
-       case USDHC4_BASE_ADDR:
-               ret = !gpio_get_value(USDHC4_CD_GPIO);
-               break;
-       }
-
-       return ret;
-}
-
-int board_mmc_init(bd_t *bis)
-{
-       int ret;
-       int i;
-
-       for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
-               switch (i) {
-               case 0:
-                       imx_iomux_v3_setup_multiple_pads(
-                               usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
-                       gpio_direction_input(USDHC2_CD_GPIO);
-                       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
-                       break;
-               case 1:
-                       imx_iomux_v3_setup_multiple_pads(
-                               usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
-                       usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
-                       break;
-               case 2:
-                       imx_iomux_v3_setup_multiple_pads(
-                               usdhc4_pads, ARRAY_SIZE(usdhc4_pads));
-                       gpio_direction_input(USDHC4_CD_GPIO);
-                       usdhc_cfg[2].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
-                       break;
-               default:
-                       printf("Warning: you configured more USDHC controllers\n"
-                              "(%d) then supported by the board (%d)\n",
-                              i + 1, CONFIG_SYS_FSL_USDHC_NUM);
-                       return -EINVAL;
-               }
-
-               ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
-               if (ret)
-                       return ret;
-       }
-
-       return 0;
-}
-#endif
-
 static int mx6_rgmii_rework(struct phy_device *phydev)
 {
        /* Configure AR8033 to ouput a 125MHz clk from CLK_25M */
@@ -533,8 +401,8 @@ static void setup_display_bx50v3(void)
        /* backlights off until needed */
        imx_iomux_v3_setup_multiple_pads(backlight_pads,
                                         ARRAY_SIZE(backlight_pads));
+       gpio_request(LVDS_POWER_GP, "lvds_power");
        gpio_direction_input(LVDS_POWER_GP);
-       gpio_direction_input(LVDS_BACKLIGHT_GP);
 }
 #endif /* CONFIG_VIDEO_IPUV3 */
 
@@ -687,20 +555,25 @@ int board_init(void)
                set_confidx(&vpd);
        }
 
+       gpio_request(SUS_S3_OUT, "sus_s3_out");
        gpio_direction_output(SUS_S3_OUT, 1);
+
+       gpio_request(WIFI_EN, "wifi_en");
        gpio_direction_output(WIFI_EN, 1);
+
 #if defined(CONFIG_VIDEO_IPUV3)
        if (is_b850v3())
                setup_display_b850v3();
        else
                setup_display_bx50v3();
+
+       gpio_request(LVDS_BACKLIGHT_GP, "lvds_backlight");
+       gpio_direction_input(LVDS_BACKLIGHT_GP);
 #endif
+
        /* address of boot parameters */
        gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
 
-#ifdef CONFIG_MXC_SPI
-       setup_spi();
-#endif
        return 0;
 }
 
@@ -818,6 +691,15 @@ int checkboard(void)
        return 0;
 }
 
+#ifdef CONFIG_OF_BOARD_SETUP
+int ft_board_setup(void *blob, bd_t *bd)
+{
+       fdt_setprop(blob, 0, "ge,boot-ver", version_string,
+                                           strlen(version_string) + 1);
+       return 0;
+}
+#endif
+
 static int do_backlight_enable(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
 #ifdef CONFIG_VIDEO_IPUV3
index 23bfe555417194791e3965f9763bf721beb1c8a9..5411e422acd9b53e5d7cb3d3ab4af593a4e20958 100644 (file)
@@ -17,6 +17,7 @@
 #include <asm/arch/iomux-mx53.h>
 #include <asm/arch/clock.h>
 #include <linux/errno.h>
+#include <linux/libfdt.h>
 #include <asm/mach-imx/mxc_i2c.h>
 #include <asm/mach-imx/mx5_video.h>
 #include <environment.h>
@@ -30,6 +31,7 @@
 #include <fsl_pmic.h>
 #include <linux/fb.h>
 #include <ipu_pixfmt.h>
+#include <version.h>
 #include <watchdog.h>
 #include "ppd_gpio.h"
 #include <stdlib.h>
@@ -122,79 +124,6 @@ static void setup_iomux_fec(void)
        imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
 }
 
-#ifdef CONFIG_FSL_ESDHC
-struct fsl_esdhc_cfg esdhc_cfg[2] = {
-       {MMC_SDHC3_BASE_ADDR},
-       {MMC_SDHC1_BASE_ADDR},
-};
-
-int board_mmc_getcd(struct mmc *mmc)
-{
-       return 1;
-}
-
-#define SD_CMD_PAD_CTRL                (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
-                                PAD_CTL_PUS_100K_UP)
-#define SD_PAD_CTRL            (PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | \
-                                PAD_CTL_DSE_HIGH)
-
-int board_mmc_init(bd_t *bis)
-{
-       static const iomux_v3_cfg_t sd1_pads[] = {
-               NEW_PAD_CTRL(MX53_PAD_PATA_RESET_B__ESDHC3_CMD,
-                            SD_CMD_PAD_CTRL),
-               NEW_PAD_CTRL(MX53_PAD_PATA_IORDY__ESDHC3_CLK, SD_PAD_CTRL),
-               NEW_PAD_CTRL(MX53_PAD_PATA_DATA8__ESDHC3_DAT0, SD_PAD_CTRL),
-               NEW_PAD_CTRL(MX53_PAD_PATA_DATA9__ESDHC3_DAT1, SD_PAD_CTRL),
-               NEW_PAD_CTRL(MX53_PAD_PATA_DATA10__ESDHC3_DAT2, SD_PAD_CTRL),
-               NEW_PAD_CTRL(MX53_PAD_PATA_DATA11__ESDHC3_DAT3, SD_PAD_CTRL),
-               NEW_PAD_CTRL(MX53_PAD_PATA_DATA0__ESDHC3_DAT4, SD_PAD_CTRL),
-               NEW_PAD_CTRL(MX53_PAD_PATA_DATA1__ESDHC3_DAT5, SD_PAD_CTRL),
-               NEW_PAD_CTRL(MX53_PAD_PATA_DATA2__ESDHC3_DAT6, SD_PAD_CTRL),
-               NEW_PAD_CTRL(MX53_PAD_PATA_DATA3__ESDHC3_DAT7, SD_PAD_CTRL),
-               MX53_PAD_EIM_DA11__GPIO3_11,
-       };
-
-       static const iomux_v3_cfg_t sd2_pads[] = {
-               NEW_PAD_CTRL(MX53_PAD_SD1_CMD__ESDHC1_CMD, SD_CMD_PAD_CTRL),
-               NEW_PAD_CTRL(MX53_PAD_SD1_CLK__ESDHC1_CLK, SD_PAD_CTRL),
-               NEW_PAD_CTRL(MX53_PAD_SD1_DATA0__ESDHC1_DAT0, SD_PAD_CTRL),
-               NEW_PAD_CTRL(MX53_PAD_SD1_DATA1__ESDHC1_DAT1, SD_PAD_CTRL),
-               NEW_PAD_CTRL(MX53_PAD_SD1_DATA2__ESDHC1_DAT2, SD_PAD_CTRL),
-               NEW_PAD_CTRL(MX53_PAD_SD1_DATA3__ESDHC1_DAT3, SD_PAD_CTRL),
-               MX53_PAD_EIM_DA13__GPIO3_13,
-       };
-
-       u32 index;
-       int ret;
-
-       esdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
-       esdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
-
-       for (index = 0; index < CONFIG_SYS_FSL_ESDHC_NUM; index++) {
-               switch (index) {
-               case 0:
-                       imx_iomux_v3_setup_multiple_pads(sd1_pads,
-                                                        ARRAY_SIZE(sd1_pads));
-                       break;
-               case 1:
-                       imx_iomux_v3_setup_multiple_pads(sd2_pads,
-                                                        ARRAY_SIZE(sd2_pads));
-                       break;
-               default:
-                       printf("Warning: you configured more ESDHC controller (%d) as supported by the board(2)\n",
-                              CONFIG_SYS_FSL_ESDHC_NUM);
-                       return -EINVAL;
-               }
-               ret = fsl_esdhc_initialize(bis, &esdhc_cfg[index]);
-               if (ret)
-                       return ret;
-       }
-
-       return 0;
-}
-#endif
-
 #define I2C_PAD_CTRL   (PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH | \
                         PAD_CTL_PUS_100K_UP | PAD_CTL_ODE)
 
@@ -380,3 +309,12 @@ int checkboard(void)
 
        return 0;
 }
+
+#ifdef CONFIG_OF_BOARD_SETUP
+int ft_board_setup(void *blob, bd_t *bd)
+{
+       fdt_setprop(blob, 0, "ge,boot-ver", version_string,
+                                           strlen(version_string) + 1);
+       return 0;
+}
+#endif
index e3b84c7a710128419d21e022f265a87b981ba294..ba2d1baf37bf26eb8cb81137cc6f48b630fc8a43 100644 (file)
@@ -36,6 +36,8 @@ static const iomux_v3_cfg_t ppd_pads[] = {
        MX53_PAD_KEY_COL2__GPIO4_10,
        MX53_PAD_KEY_ROW2__GPIO4_11,
        MX53_PAD_KEY_COL3__GPIO4_12,
+
+       MX53_PAD_PATA_DATA7__GPIO2_7,    /* BUFFERED_HOST_CONTROLLED_RESET_TO_DOCKING_CONNECTOR_N */
 };
 
 struct gpio_cfg {
@@ -61,6 +63,7 @@ struct gpio_cfg {
 #define ECSPI1_CS1 IMX_GPIO_NR(4, 10)
 #define ECSPI1_CS2 IMX_GPIO_NR(4, 11)
 #define ECSPI1_CS3 IMX_GPIO_NR(4, 12)
+#define BUFFERED_HOST_CONTROLLED_RESET_TO_DOCKING_CONNECTOR_N IMX_GPIO_NR(2, 7)
 
 static const struct gpio_cfg ppd_gpios[] = {
        /* FEC */
@@ -90,6 +93,7 @@ static const struct gpio_cfg ppd_gpios[] = {
        { ECSPI1_CS1, 1 },
        { ECSPI1_CS2, 1 },
        { ECSPI1_CS3, 1 },
+       { BUFFERED_HOST_CONTROLLED_RESET_TO_DOCKING_CONNECTOR_N, 1 },
 };
 
 #endif /* __PPD_GPIO_H_ */
index 6f728398c38dff1c6b8301574b2c9e6fb0cc225b..10031a48018fc9b13960fe0094756a0ee6b2ac78 100644 (file)
@@ -37,6 +37,15 @@ DECLARE_GLOBAL_DATA_PTR;
 #define CPGMACSS_SW_RST                (1 << 1)
 #define PHY_GPIO               30
 
+#if defined(CONFIG_SPL_BUILD)
+#if defined(CONFIG_SPL_OS_BOOT)
+int spl_start_uboot(void)
+{
+       /* break into full u-boot on 'c' */
+       return serial_tstc() && serial_getc() == 'c';
+}
+#endif
+#endif
 
 /*
  * Routine: board_init
index e8f8f7ba5b4775826ec4a190f46f74804f50625e..395904f8c87861648c214156c785736c6812e0f4 100644 (file)
@@ -95,7 +95,7 @@ MV_DRAM_MODES *ddr3_get_static_ddr_mode(void)
        return &maxbcm_ddr_modes[0];
 }
 
-MV_BIN_SERDES_CFG *board_serdes_cfg_get(u8 pex_mode)
+MV_BIN_SERDES_CFG *board_serdes_cfg_get(void)
 {
        return &maxbcm_serdes_cfg[0];
 }
index 58a4a04162b2e371bf8f5ef2be7d3159d1b579a4..6e5ef4c97f47e48fd9b07b0d76a7b7f837d6612e 100644 (file)
@@ -6,6 +6,7 @@
 #include <common.h>
 #include <asm/io.h>
 #include <led.h>
+#include <miiphy.h>
 
 enum {
        BOARD_TYPE_PCB110 = 0xAABBCE00,
@@ -64,6 +65,28 @@ static void vcoreiii_gpio_set_alternate(int gpio, int mode)
        }
 }
 
+int board_phy_config(struct phy_device *phydev)
+{
+       if (gd->board_type == BOARD_TYPE_PCB110 ||
+           gd->board_type == BOARD_TYPE_PCB112) {
+               phy_write(phydev, 0, 31, 0x10);
+               phy_write(phydev, 0, 18, 0x80F0);
+               while (phy_read(phydev, 0, 18) & 0x8000)
+                       ;
+               phy_write(phydev, 0, 31, 0);
+       }
+       if (gd->board_type == BOARD_TYPE_PCB111) {
+               phy_write(phydev, 0, 31, 0x10);
+               phy_write(phydev, 0, 18, 0x80A0);
+               while (phy_read(phydev, 0, 18) & 0x8000)
+                       ;
+               phy_write(phydev, 0, 14, 0x800);
+               phy_write(phydev, 0, 31, 0);
+       }
+
+       return 0;
+}
+
 void board_debug_uart_init(void)
 {
        /* too early for the pinctrl driver, so configure the UART pins here */
index f988af2abc08b2d7d30b49673a95c5884f65109a..c30df5df9dca2b302271085b9b56081f503c5532 100644 (file)
@@ -1,5 +1,8 @@
 // SPDX-License-Identifier: GPL-2.0+
 /*
+ * (C) Copyright 2018
+ * Lukasz Majewski, DENX Software Engineering, lukma@denx.de.
+ *
  * Copyright 2013 Freescale Semiconductor, Inc.
  */
 
 #include <asm/arch/ddrmc-vf610.h>
 #include <asm/arch/crm_regs.h>
 #include <asm/arch/clock.h>
-#include <mmc.h>
-#include <fsl_esdhc.h>
+#include <led.h>
+#include <environment.h>
 #include <miiphy.h>
-#include <netdev.h>
-#include <i2c.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-/*
- * Default DDR pad settings in arch/arm/include/asm/arch-vf610/iomux-vf610.h
- * do not match our settings. Let us (re)define our own settings here.
- */
-
-#define PCM052_VF610_DDR_PAD_CTRL      PAD_CTL_DSE_20ohm
-#define PCM052_VF610_DDR_PAD_CTRL_1    (PAD_CTL_DSE_20ohm | \
-                                       PAD_CTL_INPUT_DIFFERENTIAL)
-#define PCM052_VF610_DDR_RESET_PAD_CTL (PAD_CTL_DSE_150ohm | \
-                                       PAD_CTL_PUS_100K_UP | \
-                                       PAD_CTL_INPUT_DIFFERENTIAL)
-
-enum {
-       PCM052_VF610_PAD_DDR_RESETB                     = IOMUX_PAD(0x021c, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_RESET_PAD_CTL),
-       PCM052_VF610_PAD_DDR_A15__DDR_A_15              = IOMUX_PAD(0x0220, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_A14__DDR_A_14              = IOMUX_PAD(0x0224, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_A13__DDR_A_13              = IOMUX_PAD(0x0228, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_A12__DDR_A_12              = IOMUX_PAD(0x022c, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_A11__DDR_A_11              = IOMUX_PAD(0x0230, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_A10__DDR_A_10              = IOMUX_PAD(0x0234, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_A9__DDR_A_9                = IOMUX_PAD(0x0238, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_A8__DDR_A_8                = IOMUX_PAD(0x023c, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_A7__DDR_A_7                = IOMUX_PAD(0x0240, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_A6__DDR_A_6                = IOMUX_PAD(0x0244, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_A5__DDR_A_5                = IOMUX_PAD(0x0248, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_A4__DDR_A_4                = IOMUX_PAD(0x024c, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_A3__DDR_A_3                = IOMUX_PAD(0x0250, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_A2__DDR_A_2                = IOMUX_PAD(0x0254, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_A1__DDR_A_1                = IOMUX_PAD(0x0258, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_A0__DDR_A_0                = IOMUX_PAD(0x025c, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_BA2__DDR_BA_2              = IOMUX_PAD(0x0260, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_BA1__DDR_BA_1              = IOMUX_PAD(0x0264, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_BA0__DDR_BA_0              = IOMUX_PAD(0x0268, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_CAS__DDR_CAS_B             = IOMUX_PAD(0x026c, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_CKE__DDR_CKE_0             = IOMUX_PAD(0x0270, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_CLK__DDR_CLK_0             = IOMUX_PAD(0x0274, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL_1),
-       PCM052_VF610_PAD_DDR_CS__DDR_CS_B_0             = IOMUX_PAD(0x0278, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_D15__DDR_D_15              = IOMUX_PAD(0x027c, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_D14__DDR_D_14              = IOMUX_PAD(0x0280, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_D13__DDR_D_13              = IOMUX_PAD(0x0284, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_D12__DDR_D_12              = IOMUX_PAD(0x0288, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_D11__DDR_D_11              = IOMUX_PAD(0x028c, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_D10__DDR_D_10              = IOMUX_PAD(0x0290, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_D9__DDR_D_9                = IOMUX_PAD(0x0294, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_D8__DDR_D_8                = IOMUX_PAD(0x0298, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_D7__DDR_D_7                = IOMUX_PAD(0x029c, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_D6__DDR_D_6                = IOMUX_PAD(0x02a0, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_D5__DDR_D_5                = IOMUX_PAD(0x02a4, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_D4__DDR_D_4                = IOMUX_PAD(0x02a8, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_D3__DDR_D_3                = IOMUX_PAD(0x02ac, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_D2__DDR_D_2                = IOMUX_PAD(0x02b0, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_D1__DDR_D_1                = IOMUX_PAD(0x02b4, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_D0__DDR_D_0                = IOMUX_PAD(0x02b8, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_DQM1__DDR_DQM_1            = IOMUX_PAD(0x02bc, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_DQM0__DDR_DQM_0            = IOMUX_PAD(0x02c0, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_DQS1__DDR_DQS_1            = IOMUX_PAD(0x02c4, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL_1),
-       PCM052_VF610_PAD_DDR_DQS0__DDR_DQS_0            = IOMUX_PAD(0x02c8, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL_1),
-       PCM052_VF610_PAD_DDR_RAS__DDR_RAS_B             = IOMUX_PAD(0x02cc, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_WE__DDR_WE_B               = IOMUX_PAD(0x02d0, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_ODT1__DDR_ODT_0            = IOMUX_PAD(0x02d4, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_ODT0__DDR_ODT_1            = IOMUX_PAD(0x02d8, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_DDRBYTE1__DDR_DDRBYTE1     = IOMUX_PAD(0x02dc, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-       PCM052_VF610_PAD_DDR_DDRBYTE0__DDR_DDRBYTE0     = IOMUX_PAD(0x02e0, __NA_, 0, __NA_, 0, PCM052_VF610_DDR_PAD_CTRL),
-};
-
 static struct ddrmc_cr_setting pcm052_cr_settings[] = {
        /* not in the datasheets, but in the original code */
        { 0x00002000, 105 },
@@ -151,59 +87,6 @@ static struct ddrmc_phy_setting pcm052_phy_settings[] = {
 
 int dram_init(void)
 {
-       static const iomux_v3_cfg_t pcm052_pads[] = {
-               PCM052_VF610_PAD_DDR_A15__DDR_A_15,
-               PCM052_VF610_PAD_DDR_A14__DDR_A_14,
-               PCM052_VF610_PAD_DDR_A13__DDR_A_13,
-               PCM052_VF610_PAD_DDR_A12__DDR_A_12,
-               PCM052_VF610_PAD_DDR_A11__DDR_A_11,
-               PCM052_VF610_PAD_DDR_A10__DDR_A_10,
-               PCM052_VF610_PAD_DDR_A9__DDR_A_9,
-               PCM052_VF610_PAD_DDR_A8__DDR_A_8,
-               PCM052_VF610_PAD_DDR_A7__DDR_A_7,
-               PCM052_VF610_PAD_DDR_A6__DDR_A_6,
-               PCM052_VF610_PAD_DDR_A5__DDR_A_5,
-               PCM052_VF610_PAD_DDR_A4__DDR_A_4,
-               PCM052_VF610_PAD_DDR_A3__DDR_A_3,
-               PCM052_VF610_PAD_DDR_A2__DDR_A_2,
-               PCM052_VF610_PAD_DDR_A1__DDR_A_1,
-               PCM052_VF610_PAD_DDR_A0__DDR_A_0,
-               PCM052_VF610_PAD_DDR_BA2__DDR_BA_2,
-               PCM052_VF610_PAD_DDR_BA1__DDR_BA_1,
-               PCM052_VF610_PAD_DDR_BA0__DDR_BA_0,
-               PCM052_VF610_PAD_DDR_CAS__DDR_CAS_B,
-               PCM052_VF610_PAD_DDR_CKE__DDR_CKE_0,
-               PCM052_VF610_PAD_DDR_CLK__DDR_CLK_0,
-               PCM052_VF610_PAD_DDR_CS__DDR_CS_B_0,
-               PCM052_VF610_PAD_DDR_D15__DDR_D_15,
-               PCM052_VF610_PAD_DDR_D14__DDR_D_14,
-               PCM052_VF610_PAD_DDR_D13__DDR_D_13,
-               PCM052_VF610_PAD_DDR_D12__DDR_D_12,
-               PCM052_VF610_PAD_DDR_D11__DDR_D_11,
-               PCM052_VF610_PAD_DDR_D10__DDR_D_10,
-               PCM052_VF610_PAD_DDR_D9__DDR_D_9,
-               PCM052_VF610_PAD_DDR_D8__DDR_D_8,
-               PCM052_VF610_PAD_DDR_D7__DDR_D_7,
-               PCM052_VF610_PAD_DDR_D6__DDR_D_6,
-               PCM052_VF610_PAD_DDR_D5__DDR_D_5,
-               PCM052_VF610_PAD_DDR_D4__DDR_D_4,
-               PCM052_VF610_PAD_DDR_D3__DDR_D_3,
-               PCM052_VF610_PAD_DDR_D2__DDR_D_2,
-               PCM052_VF610_PAD_DDR_D1__DDR_D_1,
-               PCM052_VF610_PAD_DDR_D0__DDR_D_0,
-               PCM052_VF610_PAD_DDR_DQM1__DDR_DQM_1,
-               PCM052_VF610_PAD_DDR_DQM0__DDR_DQM_0,
-               PCM052_VF610_PAD_DDR_DQS1__DDR_DQS_1,
-               PCM052_VF610_PAD_DDR_DQS0__DDR_DQS_0,
-               PCM052_VF610_PAD_DDR_RAS__DDR_RAS_B,
-               PCM052_VF610_PAD_DDR_WE__DDR_WE_B,
-               PCM052_VF610_PAD_DDR_ODT1__DDR_ODT_0,
-               PCM052_VF610_PAD_DDR_ODT0__DDR_ODT_1,
-               PCM052_VF610_PAD_DDR_DDRBYTE1__DDR_DDRBYTE1,
-               PCM052_VF610_PAD_DDR_DDRBYTE0__DDR_DDRBYTE0,
-               PCM052_VF610_PAD_DDR_RESETB,
-       };
-
 #if defined(CONFIG_TARGET_PCM052)
 
        static const struct ddr3_jedec_timings pcm052_ddr_timings = {
@@ -320,8 +203,6 @@ int dram_init(void)
 
 #endif
 
-       imx_iomux_v3_setup_multiple_pads(pcm052_pads, ARRAY_SIZE(pcm052_pads));
-
        ddrmc_ctrl_init_ddr3(&pcm052_ddr_timings, pcm052_cr_settings,
                             pcm052_phy_settings, 1, row_diff);
 
@@ -330,135 +211,6 @@ int dram_init(void)
        return 0;
 }
 
-static void setup_iomux_uart(void)
-{
-       static const iomux_v3_cfg_t uart1_pads[] = {
-               NEW_PAD_CTRL(VF610_PAD_PTB4__UART1_TX, VF610_UART_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTB5__UART1_RX, VF610_UART_PAD_CTRL),
-       };
-
-       imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
-}
-
-#define ENET_PAD_CTRL  (PAD_CTL_PUS_47K_UP | PAD_CTL_SPEED_HIGH | \
-                       PAD_CTL_DSE_50ohm | PAD_CTL_OBE_IBE_ENABLE)
-
-static void setup_iomux_enet(void)
-{
-       static const iomux_v3_cfg_t enet0_pads[] = {
-               NEW_PAD_CTRL(VF610_PAD_PTA6__RMII0_CLKIN, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC1__RMII0_MDIO, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC0__RMII0_MDC, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC2__RMII0_CRS_DV, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC3__RMII0_RD1, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC4__RMII0_RD0, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC5__RMII0_RXER, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC6__RMII0_TD1, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC7__RMII0_TD0, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC8__RMII0_TXEN, ENET_PAD_CTRL),
-       };
-
-       imx_iomux_v3_setup_multiple_pads(enet0_pads, ARRAY_SIZE(enet0_pads));
-}
-
-/*
- * I2C2 is the only I2C used, on pads PTA22/PTA23.
- */
-
-static void setup_iomux_i2c(void)
-{
-       static const iomux_v3_cfg_t i2c_pads[] = {
-               VF610_PAD_PTA22__I2C2_SCL,
-               VF610_PAD_PTA23__I2C2_SDA,
-       };
-
-       imx_iomux_v3_setup_multiple_pads(i2c_pads, ARRAY_SIZE(i2c_pads));
-}
-
-#ifdef CONFIG_NAND_VF610_NFC
-static void setup_iomux_nfc(void)
-{
-       static const iomux_v3_cfg_t nfc_pads[] = {
-               VF610_PAD_PTD31__NF_IO15,
-               VF610_PAD_PTD30__NF_IO14,
-               VF610_PAD_PTD29__NF_IO13,
-               VF610_PAD_PTD28__NF_IO12,
-               VF610_PAD_PTD27__NF_IO11,
-               VF610_PAD_PTD26__NF_IO10,
-               VF610_PAD_PTD25__NF_IO9,
-               VF610_PAD_PTD24__NF_IO8,
-               VF610_PAD_PTD23__NF_IO7,
-               VF610_PAD_PTD22__NF_IO6,
-               VF610_PAD_PTD21__NF_IO5,
-               VF610_PAD_PTD20__NF_IO4,
-               VF610_PAD_PTD19__NF_IO3,
-               VF610_PAD_PTD18__NF_IO2,
-               VF610_PAD_PTD17__NF_IO1,
-               VF610_PAD_PTD16__NF_IO0,
-               VF610_PAD_PTB24__NF_WE_B,
-               VF610_PAD_PTB25__NF_CE0_B,
-               VF610_PAD_PTB27__NF_RE_B,
-               VF610_PAD_PTC26__NF_RB_B,
-               VF610_PAD_PTC27__NF_ALE,
-               VF610_PAD_PTC28__NF_CLE
-       };
-
-       imx_iomux_v3_setup_multiple_pads(nfc_pads, ARRAY_SIZE(nfc_pads));
-}
-#endif
-
-static void setup_iomux_qspi(void)
-{
-       static const iomux_v3_cfg_t qspi0_pads[] = {
-               VF610_PAD_PTD0__QSPI0_A_QSCK,
-               VF610_PAD_PTD1__QSPI0_A_CS0,
-               VF610_PAD_PTD2__QSPI0_A_DATA3,
-               VF610_PAD_PTD3__QSPI0_A_DATA2,
-               VF610_PAD_PTD4__QSPI0_A_DATA1,
-               VF610_PAD_PTD5__QSPI0_A_DATA0,
-               VF610_PAD_PTD7__QSPI0_B_QSCK,
-               VF610_PAD_PTD8__QSPI0_B_CS0,
-               VF610_PAD_PTD9__QSPI0_B_DATA3,
-               VF610_PAD_PTD10__QSPI0_B_DATA2,
-               VF610_PAD_PTD11__QSPI0_B_DATA1,
-               VF610_PAD_PTD12__QSPI0_B_DATA0,
-       };
-
-       imx_iomux_v3_setup_multiple_pads(qspi0_pads, ARRAY_SIZE(qspi0_pads));
-}
-
-#define ESDHC_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_HIGH | \
-                       PAD_CTL_DSE_20ohm | PAD_CTL_OBE_IBE_ENABLE)
-
-struct fsl_esdhc_cfg esdhc_cfg[1] = {
-       {ESDHC1_BASE_ADDR},
-};
-
-int board_mmc_getcd(struct mmc *mmc)
-{
-       /* eSDHC1 is always present */
-       return 1;
-}
-
-int board_mmc_init(bd_t *bis)
-{
-       static const iomux_v3_cfg_t esdhc1_pads[] = {
-               NEW_PAD_CTRL(VF610_PAD_PTA24__ESDHC1_CLK, ESDHC_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTA25__ESDHC1_CMD, ESDHC_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTA26__ESDHC1_DAT0, ESDHC_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTA27__ESDHC1_DAT1, ESDHC_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTA28__ESDHC1_DAT2, ESDHC_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTA29__ESDHC1_DAT3, ESDHC_PAD_CTRL),
-       };
-
-       esdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
-
-       imx_iomux_v3_setup_multiple_pads(
-               esdhc1_pads, ARRAY_SIZE(esdhc1_pads));
-
-       return fsl_esdhc_initialize(bis, &esdhc_cfg[0]);
-}
-
 static void clock_init(void)
 {
        struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
@@ -485,7 +237,7 @@ static void clock_init(void)
        clrsetbits_le32(&ccm->ccgr9, CCM_REG_CTRL_MASK,
                        CCM_CCGR9_FEC0_CTRL_MASK | CCM_CCGR9_FEC1_CTRL_MASK);
        clrsetbits_le32(&ccm->ccgr10, CCM_REG_CTRL_MASK,
-                       CCM_CCGR10_NFC_CTRL_MASK | CCM_CCGR10_I2C2_CTRL_MASK);
+                       CCM_CCGR10_NFC_CTRL_MASK);
 
        clrsetbits_le32(&anadig->pll2_ctrl, ANADIG_PLL2_CTRL_POWERDOWN,
                        ANADIG_PLL2_CTRL_ENABLE | ANADIG_PLL2_CTRL_DIV_SELECT);
@@ -531,23 +283,10 @@ static void mscm_init(void)
                writew(MSCM_IRSPRC_CP0_EN, &mscmir->irsprc[i]);
 }
 
-int board_phy_config(struct phy_device *phydev)
-{
-       if (phydev->drv->config)
-               phydev->drv->config(phydev);
-
-       return 0;
-}
-
 int board_early_init_f(void)
 {
        clock_init();
        mscm_init();
-       setup_iomux_uart();
-       setup_iomux_enet();
-       setup_iomux_i2c();
-       setup_iomux_qspi();
-       setup_iomux_nfc();
 
        return 0;
 }
@@ -571,47 +310,102 @@ int board_init(void)
        return 0;
 }
 
-int checkboard(void)
+#ifdef CONFIG_TARGET_BK4R1
+void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
 {
-       puts("Board: PCM-052\n");
+       struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
+       struct fuse_bank *bank = &ocotp->bank[4];
+       struct fuse_bank4_regs *fuse =
+               (struct fuse_bank4_regs *)bank->fuse_regs;
+       u32 value;
 
-       return 0;
+       /*
+        * BK4 has different layout of stored MAC address
+        * than one used in imx_get_mac_from_fuse() @ generic.c
+        */
+
+       switch (dev_id) {
+       case 0:
+               value = readl(&fuse->mac_addr1);
+
+               mac[0] = value >> 8;
+               mac[1] = value;
+
+               value = readl(&fuse->mac_addr0);
+               mac[2] = value >> 24;
+               mac[3] = value >> 16;
+               mac[4] = value >> 8;
+               mac[5] = value;
+               break;
+       case 1:
+               value = readl(&fuse->mac_addr2);
+
+               mac[0] = value >> 24;
+               mac[1] = value >> 16;
+               mac[2] = value >> 8;
+               mac[3] = value;
+
+               value = readl(&fuse->mac_addr1);
+               mac[4] = value >> 24;
+               mac[5] = value >> 16;
+               break;
+       }
 }
 
-static int do_m4go(cmd_tbl_t *cmdtp, int flag, int argc,
-                      char * const argv[])
+int board_late_init(void)
 {
-       ulong addr;
+       struct src *psrc = (struct src *)SRC_BASE_ADDR;
+       u32 reg;
 
-       /* Consume 'm4go' */
-       argc--; argv++;
+       if (IS_ENABLED(CONFIG_LED))
+               led_default_state();
 
        /*
-        * Parse provided address - default to load_addr in case not provided.
+        * BK4r1 handle emergency/service SD card boot
+        * Checking the SBMR1 register BOOTCFG1 byte:
+        * NAND:
+        *      bit [2] - NAND data width - 16
+        *      bit [5] - NAND fast boot
+        *      bit [7] = 1 - NAND as a source of booting
+        * SD card (0x64):
+        *      bit [4] = 0 - SD card source
+        *      bit [6] = 1 - SD/MMC source
         */
 
-       if (argc)
-               addr = simple_strtoul(argv[0], NULL, 16);
-       else
-               addr = load_addr;
+       reg = readl(&psrc->sbmr1);
+       if ((reg & SRC_SBMR1_BOOTCFG1_SDMMC) &&
+           !(reg & SRC_SBMR1_BOOTCFG1_MMC)) {
+               printf("------ SD card boot -------\n");
+               set_default_env("!LVFBootloader", 0);
+               env_set("bootcmd",
+                       "run prepare_install_bk4r1_envs; run install_bk4r1rs");
+       }
 
-       /*
-        * Write boot address in PERSISTENT_ENTRY1[31:0] aka SRC_GPR2[31:0]
-        */
-       writel(addr + 0x401, 0x4006E028);
+       return 0;
+}
 
-       /*
-        * Start secondary processor by enabling its clock
-        */
-       writel(0x15a5a, 0x4006B08C);
+/**
+ * KSZ8081
+ */
+#define MII_KSZ8081_REFERENCE_CLOCK_SELECT     0x1f
+#define RMII_50MHz_CLOCK       0x8180
 
-       return 1;
+int board_phy_config(struct phy_device *phydev)
+{
+       /* Set 50 MHz reference clock */
+       phy_write(phydev, MDIO_DEVAD_NONE, MII_KSZ8081_REFERENCE_CLOCK_SELECT,
+                 RMII_50MHz_CLOCK);
+
+       return genphy_config(phydev);
 }
+#endif /* CONFIG_TARGET_BK4R1 */
 
-U_BOOT_CMD(
-       m4go, 2 /* one arg max */, 1 /* repeatable */, do_m4go,
-       "start the secondary Cortex-M4 from scatter file image",
-       "[<addr>]\n"
-       "    - start secondary Cortex-M4 core using a scatter file image\n"
-       "The argument needs to be a scatter file\n"
-);
+int checkboard(void)
+{
+#ifdef CONFIG_TARGET_BK4R1
+       puts("Board: BK4r1 (L333)\n");
+#else
+       puts("Board: PCM-052\n");
+#endif
+       return 0;
+}
diff --git a/board/qca/ap152/Kconfig b/board/qca/ap152/Kconfig
new file mode 100644 (file)
index 0000000..f6ad498
--- /dev/null
@@ -0,0 +1,15 @@
+if TARGET_AP152
+
+config SYS_VENDOR
+       default "qca"
+
+config SYS_BOARD
+       default "ap152"
+
+config SYS_CONFIG_NAME
+       default "ap152"
+
+config SYS_TEXT_BASE
+       default 0x9f000000
+
+endif
diff --git a/board/qca/ap152/MAINTAINERS b/board/qca/ap152/MAINTAINERS
new file mode 100644 (file)
index 0000000..785ec27
--- /dev/null
@@ -0,0 +1,6 @@
+AP152 BOARD
+M:     Rosy Song <rosysong@rosinson.com>
+S:     Maintained
+F:     board/qca/ap152/
+F:     include/configs/ap152.h
+F:     configs/ap152_defconfig
diff --git a/board/qca/ap152/Makefile b/board/qca/ap152/Makefile
new file mode 100644 (file)
index 0000000..4270afa
--- /dev/null
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: GPL-2.0+
+
+obj-y  = ap152.o
diff --git a/board/qca/ap152/ap152.c b/board/qca/ap152/ap152.c
new file mode 100644 (file)
index 0000000..30cd565
--- /dev/null
@@ -0,0 +1,81 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018 Rosy Song <rosysong@rosinson.com>
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/ddr.h>
+#include <mach/ath79.h>
+#include <debug_uart.h>
+
+#define RST_RESET_RTC_RESET_LSB 27
+#define RST_RESET_RTC_RESET_MASK 0x08000000
+#define RST_RESET_RTC_RESET_SET(x) \
+       (((x) << RST_RESET_RTC_RESET_LSB) & RST_RESET_RTC_RESET_MASK)
+
+#ifdef CONFIG_DEBUG_UART_BOARD_INIT
+void board_debug_uart_init(void)
+{
+       void __iomem *regs;
+       u32 val;
+
+       regs = map_physmem(AR71XX_GPIO_BASE, AR71XX_GPIO_SIZE,
+                          MAP_NOCACHE);
+
+       /* UART : RX18, TX22 done
+        * GPIO18 as input, GPIO22 as output
+        */
+       val = readl(regs + AR71XX_GPIO_REG_OE);
+       val |= QCA956X_GPIO(18);
+       val &= ~QCA956X_GPIO(22);
+       writel(val, regs + AR71XX_GPIO_REG_OE);
+
+       /*
+        * Enable GPIO22 as UART0_SOUT
+        */
+       val = readl(regs + QCA956X_GPIO_REG_OUT_FUNC5);
+       val &= ~QCA956X_GPIO_MUX_MASK(16);
+       val |= QCA956X_GPIO_OUT_MUX_UART0_SOUT << 16;
+       writel(val, regs + QCA956X_GPIO_REG_OUT_FUNC5);
+
+       /*
+        * Enable GPIO18 as UART0_SIN
+        */
+       val = readl(regs + QCA956X_GPIO_REG_IN_ENABLE0);
+       val &= ~QCA956X_GPIO_MUX_MASK(8);
+       val |= QCA956X_GPIO_IN_MUX_UART0_SIN << 8;
+       writel(val, regs + QCA956X_GPIO_REG_IN_ENABLE0);
+
+       /*
+        * Enable GPIO22 output
+        */
+       val = readl(regs + AR71XX_GPIO_REG_OUT);
+       val |= QCA956X_GPIO(22);
+       writel(val, regs + AR71XX_GPIO_REG_OUT);
+}
+#endif
+
+int board_early_init_f(void)
+{
+       u32 reg;
+       void __iomem *rst_regs = map_physmem(AR71XX_RESET_BASE,
+                                                        AR71XX_RESET_SIZE, MAP_NOCACHE);
+
+#ifndef CONFIG_SKIP_LOWLEVEL_INIT
+       /* CPU:775, DDR:650, AHB:258 */
+       qca956x_pll_init();
+       qca956x_ddr_init();
+#endif
+
+       /* Take WMAC out of reset */
+       reg = readl(rst_regs + QCA956X_RESET_REG_RESET_MODULE);
+       reg &= (~RST_RESET_RTC_RESET_SET(1));
+       writel(reg, rst_regs + QCA956X_RESET_REG_RESET_MODULE);
+
+       ath79_eth_reset();
+       return 0;
+}
index 1129f4bf0c08b4d8369eccb795e74e6a1b519371..1ce6e2eac1bf5f47ea78b04ea76a966833fb21d3 100644 (file)
@@ -8,57 +8,4 @@
  */
 
 #include <common.h>
-#include <asm/io.h>
-#include <asm/arch/sys_proto.h>
 #include <asm/arch/rmobile.h>
-#include <asm/arch/rcar-mstp.h>
-
-#define TSTR0          0x04
-#define TSTR0_STR0     0x01
-
-static struct mstp_ctl mstptbl[] = {
-       { SMSTPCR0, MSTP0_BITS, CONFIG_SMSTP0_ENA,
-               RMSTPCR0, MSTP0_BITS, CONFIG_RMSTP0_ENA },
-       { SMSTPCR1, MSTP1_BITS, CONFIG_SMSTP1_ENA,
-               RMSTPCR1, MSTP1_BITS, CONFIG_RMSTP1_ENA },
-       { SMSTPCR2, MSTP2_BITS, CONFIG_SMSTP2_ENA,
-               RMSTPCR2, MSTP2_BITS, CONFIG_RMSTP2_ENA },
-       { SMSTPCR3, MSTP3_BITS, CONFIG_SMSTP3_ENA,
-               RMSTPCR3, MSTP3_BITS, CONFIG_RMSTP3_ENA },
-       { SMSTPCR4, MSTP4_BITS, CONFIG_SMSTP4_ENA,
-               RMSTPCR4, MSTP4_BITS, CONFIG_RMSTP4_ENA },
-       { SMSTPCR5, MSTP5_BITS, CONFIG_SMSTP5_ENA,
-               RMSTPCR5, MSTP5_BITS, CONFIG_RMSTP5_ENA },
-#ifdef CONFIG_RCAR_GEN3
-       { SMSTPCR6, MSTP6_BITS, CONFIG_SMSTP6_ENA,
-               RMSTPCR6, MSTP6_BITS, CONFIG_RMSTP6_ENA },
-#endif
-       { SMSTPCR7, MSTP7_BITS, CONFIG_SMSTP7_ENA,
-               RMSTPCR7, MSTP7_BITS, CONFIG_RMSTP7_ENA },
-       { SMSTPCR8, MSTP8_BITS, CONFIG_SMSTP8_ENA,
-               RMSTPCR8, MSTP8_BITS, CONFIG_RMSTP8_ENA },
-       { SMSTPCR9, MSTP9_BITS, CONFIG_SMSTP9_ENA,
-               RMSTPCR9, MSTP9_BITS, CONFIG_RMSTP9_ENA },
-       { SMSTPCR10, MSTP10_BITS, CONFIG_SMSTP10_ENA,
-                RMSTPCR10, MSTP10_BITS, CONFIG_RMSTP10_ENA },
-       { SMSTPCR11, MSTP11_BITS, CONFIG_SMSTP1_ENA,
-                RMSTPCR11, MSTP11_BITS, CONFIG_RMSTP11_ENA },
-};
-
-void arch_preboot_os(void)
-{
-       int i;
-
-       /* stop TMU0 */
-       mstp_clrbits_le32(TMU_BASE + TSTR0, TMU_BASE + TSTR0, TSTR0_STR0);
-
-       /* Stop module clock */
-       for (i = 0; i < ARRAY_SIZE(mstptbl); i++) {
-               mstp_setclrbits_le32((uintptr_t)mstptbl[i].s_addr,
-                                    mstptbl[i].s_dis,
-                                    mstptbl[i].s_ena);
-               mstp_setclrbits_le32((uintptr_t)mstptbl[i].r_addr,
-                                    mstptbl[i].r_dis,
-                                    mstptbl[i].r_ena);
-       }
-}
index e7cdc5217fb1b1ee37cb5c6d5142b297e6fefdc2..8549f543f481d2efaca5d2471e7daafed12501f0 100644 (file)
@@ -5,3 +5,4 @@ F:      board/renesas/ulcb/
 F:     include/configs/ulcb.h
 F:     configs/r8a7795_ulcb_defconfig
 F:     configs/r8a7796_ulcb_defconfig
+F:     configs/r8a77965_ulcb_defconfig
index 81d6f8f6f20772518ad64376f74c02a567be815d..9785107e56bba5f197dbe735e6d1ab89e38fadca 100644 (file)
@@ -97,6 +97,10 @@ int board_fit_config_name_match(const char *name)
            !strcmp(name, "r8a7796-m3ulcb-u-boot"))
                return 0;
 
+       if ((cpu_type == RMOBILE_CPU_TYPE_R8A77965) &&
+           !strcmp(name, "r8a77965-m3nulcb-u-boot"))
+               return 0;
+
        return -1;
 }
 #endif
index a7bc0d4e23fbe5946edd448830bc476e5ddd72a6..0b0e98de90a0b8905efe922b74d795b6ccf9780a 100644 (file)
@@ -17,6 +17,29 @@ $ sudo dd if=u-boot-spl.kwb of=/dev/sdX bs=512 seek=1
 Please use the correct device node for your setup instead
 of "/dev/sdX" here!
 
+Install U-Boot on eMMC:
+-----------------------
+
+The ROM loads the bootloader from eMMC first boot partition at offset 0. This
+is unlike load from SD card that is at offset 512. As a result, the offset of
+the main U-Boot image on the eMMC boot partition changes. Set
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR to 0x140 for SPL to load U-Boot from
+the correct location.
+
+To make SPL load the main U-Boot image from the eMMC boot partition enable
+eMMC boot acknowledgement and boot partition with the following U-Boot
+command:
+
+  mmc partconf 0 1 1 0
+
+Install U-Boot on eMMC boot partition from Linux running on Clearfog:
+
+  echo 0 > /sys/block/mmcblk0boot0/force_ro
+  dd if=u-boot-spl.kwb of=/dev/mmcblk0boot0
+
+Note that the SD card is not accessible when the Clearfog SOM has eMMC.
+Consider initial boot from UART (see below).
+
 Boot selection:
 ---------------
 
index 48d8fd2c3f2caf23583fc6410baf40fa0f1656ad..0a2eddbe03d87b6d1f8066c823303abc5fbf8845 100644 (file)
@@ -2,7 +2,8 @@ STM32MP1 BOARD
 M:     Patrick Delaunay <patrick.delaunay@st.com>
 L:     uboot-stm32@st-md-mailman.stormreply.com (moderated for non-subscribers)
 S:     Maintained
+F:     arch/arm/dts/stm32mp157*
 F:     board/st/stm32mp1
-F:     include/configs/stm32mp1.h
 F:     configs/stm32mp15_basic_defconfig
-F:     arch/arm/dts/stm32mp157*
+F:     configs/stm32mp15_trusted_defconfig
+F:     include/configs/stm32mp1.h
index 174e6db1484a60a363805c7731ba317d73f0472a..1cd3534ae4e7289a6dfaf4f8b9a15fc052f7a6a7 100644 (file)
@@ -28,14 +28,15 @@ Everything is supported in Linux but U-Boot is limited to:
 
 And the necessary drivers
 1. I2C
-2. STPMU1
-2. STPMU1 (PMIC and regulator)
+2. STPMIC1 (PMIC and regulator)
 3. Clock, Reset, Sysreset
 4. Fuse
 
 Currently the following boards are supported:
 + stm32mp157c-ev1
 + stm32mp157c-ed1
++ stm32mp157a-dk1
++ stm32mp157c-dk2
 
 3. Boot Sequences
 =================
@@ -45,15 +46,22 @@ BootRom => FSBL in SYSRAM => SSBL in DDR => OS (Linux Kernel)
 with FSBL = First Stage Bootloader
      SSBL = Second Stage Bootloader
 
-One boot configuration is supported:
+2 boot configurations are supported:
 
-   The "Basic" boot chain (defconfig_file : stm32mp15_basic_defconfig)
+1) The "Trusted" boot chain (defconfig_file : stm32mp15_trusted_defconfig)
+   BootRom => FSBL = Trusted Firmware-A (TF-A) => SSBL = U-Boot
+   TF-A performs a full initialization of Secure peripherals and installs a
+   secure monitor.
+   U-Boot is running in normal world and uses TF-A monitor
+   to access to secure resources
+
+2) The "Basic" boot chain (defconfig_file : stm32mp15_basic_defconfig)
    BootRom => FSBL = U-Boot SPL => SSBL = U-Boot
    SPL has limited security initialisation
    U-Boot is running in secure mode and provide a secure monitor to the kernel
    with only PSCI support (Power State Coordination Interface defined by ARM)
 
-All the STM32MP1 board supported by U-Boot use the same generic board
+All the STM32MP1 boards supported by U-Boot use the same generic board
 stm32mp1 which support all the bootable devices.
 
 Each board is configurated only with the associated device tree.
@@ -64,12 +72,18 @@ Each board is configurated only with the associated device tree.
 You need to select the appropriate device tree for your board,
 the supported device trees for stm32mp157 are:
 
-+ ev1: eval board with pmic stpmu1 (ev1 = mother board + daughter ed1)
++ ev1: eval board with pmic stpmic1 (ev1 = mother board + daughter ed1)
   dts: stm32mp157c-ev1
 
-+ ed1: daughter board with pmic stpmu1
++ ed1: daughter board with pmic stpmic1
   dts: stm32mp157c-ed1
 
++ dk1: Discovery board
+  dts: stm32mp157a-dk1
+
++ dk2: Discovery board = dk1 with a BT/WiFI combo and a DSI panel
+  dts: stm32mp157c-dk2
+
 5. Build Procedure
 ==================
 
@@ -90,12 +104,14 @@ the supported device trees for stm32mp157 are:
        # export KBUILD_OUTPUT=/path/to/output
 
        for example: use one output directory for each configuration
+       # export KBUILD_OUTPUT=stm32mp15_trusted
        # export KBUILD_OUTPUT=stm32mp15_basic
 
-4. Configure the U-Boot:
+4. Configure U-Boot:
 
        # make <defconfig_file>
 
+       - For trusted boot mode : "stm32mp15_trusted_defconfig"
        - For basic boot mode: "stm32mp15_basic_defconfig"
 
 5. Configure the device-tree and build the U-Boot image:
@@ -104,16 +120,26 @@ the supported device trees for stm32mp157 are:
 
 
   example:
-     basic boot on ev1
+  a) trusted boot on ev1
+       # export KBUILD_OUTPUT=stm32mp15_trusted
+       # make stm32mp15_trusted_defconfig
+       # make DEVICE_TREE=stm32mp157c-ev1 all
+
+  b) basic boot on ev1
        # export KBUILD_OUTPUT=stm32mp15_basic
        # make stm32mp15_basic_defconfig
        # make DEVICE_TREE=stm32mp157c-ev1 all
 
-     basic boot on ed1
+  c) basic boot on ed1
        # export KBUILD_OUTPUT=stm32mp15_basic
        # make stm32mp15_basic_defconfig
        # make DEVICE_TREE=stm32mp157c-ed1 all
 
+  d) basic boot on dk2
+       # export KBUILD_OUTPUT=stm32mp15_basic
+       # make stm32mp15_basic_defconfig
+       # make DEVICE_TREE=stm32mp157c-dk2 all
+
 6. Output files
 
   BootRom and TF-A expect binaries with STM32 image header
@@ -122,6 +148,11 @@ the supported device trees for stm32mp157 are:
   So in the output directory (selected by KBUILD_OUTPUT),
   you can found the needed files:
 
+  a) For Trusted boot
+   + FSBL = tf-a.stm32 (provided by TF-A compilation)
+   + SSBL = u-boot.stm32
+
+  b) For Basic boot
    + FSBL = spl/u-boot-spl.stm32
    + SSBL = u-boot.img
 
@@ -135,13 +166,22 @@ You can select the boot mode, on the board ed1 with the switch SW1
  -----------------------------------
   Reserved     0       0       0
   NOR          0       0       1
-  SD-Card      1       1       1
   SD-Card      1       0       1
   eMMC         0       1       0
   NAND         0       1       1
   Recovery     1       1       0
   Recovery     0       0       0
 
+- on board DK1/DK2 with the switch SW1 : BOOT0, BOOT2
+  (BOOT1 forced to 0, NOR not supported)
+
+ --------------------------
+  Boot Mode   BOOT2  BOOT0
+ --------------------------
+  Reserved     1      0
+  SD-Card      1      1
+  Recovery     0      0
+
 Recovery is a boot from serial link (UART/USB) and it is used with
 STM32CubeProgrammer tool to load executable in RAM and to update the flash
 devices available on the board (NOR/NAND/eMMC/SDCARD).
@@ -158,14 +198,14 @@ The minimal requirements for STMP32MP1 boot up to U-Boot are:
 - one ssbl partition for U-Boot
 
 Then the minimal GPT partition is:
-   ----- ------- --------- -------------
-  | Num | Name  | Size    |  Content    |
-   ----- ------- -------- --------------
+   ----- ------- --------- --------------
+  | Num | Name  | Size    |  Content     |
+   ----- ------- -------- ---------------
   |  1  | fsbl1 | 256 KiB |  TF-A or SPL |
   |  2  | fsbl2 | 256 KiB |  TF-A or SPL |
-  |  3  | ssbl  | enought |  U-Boot     |
-  |  *  |  -    |  -      |  Boot/Rootfs|
-   ----- ------- --------- -------------
+  |  3  | ssbl  | enought |  U-Boot      |
+  |  *  |  -    |  -      |  Boot/Rootfs |
+   ----- ------- --------- --------------
 
 (*) add bootable partition for extlinux.conf
     following Generic Distribution
@@ -189,7 +229,7 @@ for example: with gpt table with 128 entries
 
        you can add other partitions for kernel
        one partition rootfs for example:
-               -n 3:5154:              -c 4:rootfs
+               -n 4:5154:              -c 4:rootfs \
 
   c) copy the FSBL (2 times) and SSBL file on the correct partition.
      in this example in partition 1 to 3
@@ -199,6 +239,11 @@ for example: with gpt table with 128 entries
        # dd if=u-boot-spl.stm32 of=/dev/mmcblk0p2
        # dd if=u-boot.img of=/dev/mmcblk0p3
 
+     for trusted boot mode :
+       # dd if=tf-a.stm32 of=/dev/mmcblk0p1
+       # dd if=tf-a.stm32 of=/dev/mmcblk0p2
+       # dd if=u-boot.stm32 of=/dev/mmcblk0p3
+
 To boot from SDCard, select BootPinMode = 1 1 1 and reset.
 
 8. Prepare eMMC
@@ -208,7 +253,7 @@ You can use U-Boot to copy binary in eMMC.
 In the next example, you need to boot from SDCARD and the images (u-boot-spl.stm32, u-boot.img)
 are presents on SDCARD (mmc 0) in ext4 partition 4 (bootfs).
 
-To boot from SDCard, select BootPinMode = 1 1 1 and reset.
+To boot from SDCard, select BootPinMode = 1 0 1 and reset.
 
 Then you update the eMMC with the next U-Boot command :
 
@@ -227,7 +272,7 @@ b) copy SPL on eMMC on firts boot partition
        # mmc write ${fileaddr} 0 200
        # mmc partconf 1 1 1 0
 
-b) copy U-Boot in first GPT partition of eMMC
+c) copy U-Boot in first GPT partition of eMMC
 
        # ext4load mmc 0:4 0xC0000000 u-boot.img
        # mmc dev 1
index 5f31ea99f597d0ac0b02ce665250aafd066295ed..5c1acca20d79dd3213357d99f99b02a09affe550 100644 (file)
@@ -8,7 +8,7 @@
 #include <asm/io.h>
 #include <asm/arch/ddr.h>
 #include <power/pmic.h>
-#include <power/stpmu1.h>
+#include <power/stpmic1.h>
 
 #ifdef CONFIG_DEBUG_UART_BOARD_INIT
 void board_debug_uart_init(void)
@@ -37,64 +37,65 @@ void board_debug_uart_init(void)
 }
 #endif
 
-#ifdef CONFIG_PMIC_STPMU1
+#ifdef CONFIG_PMIC_STPMIC1
 int board_ddr_power_init(void)
 {
        struct udevice *dev;
        int ret;
 
        ret = uclass_get_device_by_driver(UCLASS_PMIC,
-                                         DM_GET_DRIVER(pmic_stpmu1), &dev);
+                                         DM_GET_DRIVER(pmic_stpmic1), &dev);
        if (ret)
                /* No PMIC on board */
                return 0;
 
-       /* Set LDO3 to sync mode */
-       ret = pmic_reg_read(dev, STPMU1_LDOX_CTRL_REG(STPMU1_LDO3));
+       /* VTT = Set LDO3 to sync mode */
+       ret = pmic_reg_read(dev, STPMIC1_LDOX_MAIN_CR(STPMIC1_LDO3));
        if (ret < 0)
                return ret;
 
-       ret &= ~STPMU1_LDO3_MODE;
-       ret &= ~STPMU1_LDO12356_OUTPUT_MASK;
-       ret |= STPMU1_LDO3_DDR_SEL << STPMU1_LDO12356_OUTPUT_SHIFT;
+       ret &= ~STPMIC1_LDO3_MODE;
+       ret &= ~STPMIC1_LDO12356_VOUT_MASK;
+       ret |= STPMIC1_LDO_VOUT(STPMIC1_LDO3_DDR_SEL);
 
-       ret = pmic_reg_write(dev, STPMU1_LDOX_CTRL_REG(STPMU1_LDO3),
+       ret = pmic_reg_write(dev, STPMIC1_LDOX_MAIN_CR(STPMIC1_LDO3),
                             ret);
        if (ret < 0)
                return ret;
 
-       /* Set BUCK2 to 1.35V */
+       /* VDD_DDR = Set BUCK2 to 1.35V */
        ret = pmic_clrsetbits(dev,
-                             STPMU1_BUCKX_CTRL_REG(STPMU1_BUCK2),
-                             STPMU1_BUCK_OUTPUT_MASK,
-                             STPMU1_BUCK2_1350000V);
+                             STPMIC1_BUCKX_MAIN_CR(STPMIC1_BUCK2),
+                             STPMIC1_BUCK_VOUT_MASK,
+                             STPMIC1_BUCK2_1350000V);
        if (ret < 0)
                return ret;
 
-       /* Enable BUCK2 and VREF */
+       /* Enable VDD_DDR = BUCK2 */
        ret = pmic_clrsetbits(dev,
-                             STPMU1_BUCKX_CTRL_REG(STPMU1_BUCK2),
-                             STPMU1_BUCK_EN, STPMU1_BUCK_EN);
+                             STPMIC1_BUCKX_MAIN_CR(STPMIC1_BUCK2),
+                             STPMIC1_BUCK_ENA, STPMIC1_BUCK_ENA);
        if (ret < 0)
                return ret;
 
-       mdelay(STPMU1_DEFAULT_START_UP_DELAY_MS);
+       mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS);
 
-       ret = pmic_clrsetbits(dev, STPMU1_VREF_CTRL_REG,
-                             STPMU1_VREF_EN, STPMU1_VREF_EN);
+       /* Enable VREF */
+       ret = pmic_clrsetbits(dev, STPMIC1_REFDDR_MAIN_CR,
+                             STPMIC1_VREF_ENA, STPMIC1_VREF_ENA);
        if (ret < 0)
                return ret;
 
-       mdelay(STPMU1_DEFAULT_START_UP_DELAY_MS);
+       mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS);
 
        /* Enable LDO3 */
        ret = pmic_clrsetbits(dev,
-                             STPMU1_LDOX_CTRL_REG(STPMU1_LDO3),
-                             STPMU1_LDO_EN, STPMU1_LDO_EN);
+                             STPMIC1_LDOX_MAIN_CR(STPMIC1_LDO3),
+                             STPMIC1_LDO_ENA, STPMIC1_LDO_ENA);
        if (ret < 0)
                return ret;
 
-       mdelay(STPMU1_DEFAULT_START_UP_DELAY_MS);
+       mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS);
 
        return 0;
 }
index f3db0d638539c8316037784fd6f765c8a356cbcb..a7844f244bc5ad5ef0fce871298060bedc9541bd 100644 (file)
 #include <asm/io.h>
 #include <post.h>
 #include <power/pmic.h>
-#include <power/stpmu1.h>
+#include <power/stpmic1.h>
 #include <asm/arch/ddr.h>
 
 void spl_board_init(void)
 {
        /* Keep vdd on during the reset cycle */
-#if defined(CONFIG_PMIC_STPMU1) && defined(CONFIG_SPL_POWER_SUPPORT)
+#if defined(CONFIG_PMIC_STPMIC1) && defined(CONFIG_SPL_POWER_SUPPORT)
        struct udevice *dev;
        int ret;
 
        ret = uclass_get_device_by_driver(UCLASS_PMIC,
-                                         DM_GET_DRIVER(pmic_stpmu1), &dev);
+                                         DM_GET_DRIVER(pmic_stpmic1), &dev);
        if (!ret)
                pmic_clrsetbits(dev,
-                               STPMU1_MASK_RESET_BUCK,
-                               STPMU1_MASK_RESET_BUCK3,
-                               STPMU1_MASK_RESET_BUCK3);
+                               STPMIC1_BUCKS_MRST_CR,
+                               STPMIC1_MRST_BUCK(STPMIC1_BUCK3),
+                               STPMIC1_MRST_BUCK(STPMIC1_BUCK3));
 #endif
 }
index 54feca0ecff5c3e9189824e316de0a2526fe1ab3..76917b022ede019176244bdd007b8f3b9b74c8d7 100644 (file)
 /*
  * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
  */
-#include <config.h>
 #include <common.h>
-#include <led.h>
+#include <adc.h>
+#include <config.h>
 #include <clk.h>
 #include <dm.h>
+#include <g_dnl.h>
 #include <generic-phy.h>
+#include <i2c.h>
+#include <led.h>
+#include <misc.h>
 #include <phy.h>
 #include <reset.h>
+#include <syscon.h>
 #include <usb.h>
-#include <asm/arch/stm32.h>
 #include <asm/io.h>
+#include <asm/gpio.h>
+#include <asm/arch/stm32.h>
 #include <power/regulator.h>
 #include <usb/dwc2_udc.h>
 
+/* SYSCFG registers */
+#define SYSCFG_BOOTR           0x00
+#define SYSCFG_PMCSETR         0x04
+#define SYSCFG_IOCTRLSETR      0x18
+#define SYSCFG_ICNR            0x1C
+#define SYSCFG_CMPCR           0x20
+#define SYSCFG_CMPENSETR       0x24
+#define SYSCFG_PMCCLRR         0x44
+
+#define SYSCFG_BOOTR_BOOT_MASK         GENMASK(2, 0)
+#define SYSCFG_BOOTR_BOOTPD_SHIFT      4
+
+#define SYSCFG_IOCTRLSETR_HSLVEN_TRACE         BIT(0)
+#define SYSCFG_IOCTRLSETR_HSLVEN_QUADSPI       BIT(1)
+#define SYSCFG_IOCTRLSETR_HSLVEN_ETH           BIT(2)
+#define SYSCFG_IOCTRLSETR_HSLVEN_SDMMC         BIT(3)
+#define SYSCFG_IOCTRLSETR_HSLVEN_SPI           BIT(4)
+
+#define SYSCFG_CMPCR_SW_CTRL           BIT(1)
+#define SYSCFG_CMPCR_READY             BIT(8)
+
+#define SYSCFG_CMPENSETR_MPU_EN                BIT(0)
+
+#define SYSCFG_PMCSETR_ETH_CLK_SEL     BIT(16)
+#define SYSCFG_PMCSETR_ETH_REF_CLK_SEL BIT(17)
+
+#define SYSCFG_PMCSETR_ETH_SELMII      BIT(20)
+
+#define SYSCFG_PMCSETR_ETH_SEL_MASK    GENMASK(23, 21)
+#define SYSCFG_PMCSETR_ETH_SEL_GMII_MII        (0 << 21)
+#define SYSCFG_PMCSETR_ETH_SEL_RGMII   (1 << 21)
+#define SYSCFG_PMCSETR_ETH_SEL_RMII    (4 << 21)
+
 /*
  * Get a global data pointer
  */
 DECLARE_GLOBAL_DATA_PTR;
 
-#define STM32MP_GUSBCFG 0x40002407
+#define USB_WARNING_LOW_THRESHOLD_UV   660000
+#define USB_START_LOW_THRESHOLD_UV     1230000
+#define USB_START_HIGH_THRESHOLD_UV    2100000
+
+int checkboard(void)
+{
+       int ret;
+       char *mode;
+       u32 otp;
+       struct udevice *dev;
+       const char *fdt_compat;
+       int fdt_compat_len;
+
+       if (IS_ENABLED(CONFIG_STM32MP1_TRUSTED))
+               mode = "trusted";
+       else
+               mode = "basic";
+
+       printf("Board: stm32mp1 in %s mode", mode);
+       fdt_compat = fdt_getprop(gd->fdt_blob, 0, "compatible",
+                                &fdt_compat_len);
+       if (fdt_compat && fdt_compat_len)
+               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 && otp) {
+               printf("Board: MB%04x Var%d Rev.%c-%02d\n",
+                      otp >> 16,
+                      (otp >> 12) & 0xF,
+                      ((otp >> 8) & 0xF) - 1 + 'A',
+                      otp & 0xF);
+       }
+
+       return 0;
+}
+
+static void board_key_check(void)
+{
+#if defined(CONFIG_FASTBOOT) || defined(CONFIG_CMD_STM32PROG)
+       ofnode node;
+       struct gpio_desc gpio;
+       enum forced_boot_mode boot_mode = BOOT_NORMAL;
+
+       node = ofnode_path("/config");
+       if (!ofnode_valid(node)) {
+               debug("%s: no /config node?\n", __func__);
+               return;
+       }
+#ifdef CONFIG_FASTBOOT
+       if (gpio_request_by_name_nodev(node, "st,fastboot-gpios", 0,
+                                      &gpio, GPIOD_IS_IN)) {
+               debug("%s: could not find a /config/st,fastboot-gpios\n",
+                     __func__);
+       } else {
+               if (dm_gpio_get_value(&gpio)) {
+                       puts("Fastboot key pressed, ");
+                       boot_mode = BOOT_FASTBOOT;
+               }
+
+               dm_gpio_free(NULL, &gpio);
+       }
+#endif
+#ifdef CONFIG_CMD_STM32PROG
+       if (gpio_request_by_name_nodev(node, "st,stm32prog-gpios", 0,
+                                      &gpio, GPIOD_IS_IN)) {
+               debug("%s: could not find a /config/st,stm32prog-gpios\n",
+                     __func__);
+       } else {
+               if (dm_gpio_get_value(&gpio)) {
+                       puts("STM32Programmer key pressed, ");
+                       boot_mode = BOOT_STM32PROG;
+               }
+               dm_gpio_free(NULL, &gpio);
+       }
+#endif
+
+       if (boot_mode != BOOT_NORMAL) {
+               puts("entering download mode...\n");
+               clrsetbits_le32(TAMP_BOOT_CONTEXT,
+                               TAMP_BOOT_FORCED_MASK,
+                               boot_mode);
+       }
+#endif
+}
 
-#define STM32MP_GGPIO 0x38
-#define STM32MP_GGPIO_VBUS_SENSING BIT(21)
+#if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG)
 
-static struct dwc2_plat_otg_data stm32mp_otg_data = {
-       .usb_gusbcfg = STM32MP_GUSBCFG,
-};
+/* STMicroelectronics STUSB1600 Type-C controller */
+#define STUSB1600_CC_CONNECTION_STATUS         0x0E
 
-static struct reset_ctl usbotg_reset;
+/* STUSB1600_CC_CONNECTION_STATUS bitfields */
+#define STUSB1600_CC_ATTACH                    BIT(0)
 
-int board_usb_init(int index, enum usb_init_type init)
+static int stusb1600_init(struct udevice **dev_stusb1600)
 {
-       struct fdtdec_phandle_args args;
-       struct udevice *dev;
-       const void *blob = gd->fdt_blob;
-       struct clk clk;
-       struct phy phy;
-       int node;
-       int phy_provider;
+       ofnode node;
+       struct udevice *dev, *bus;
        int ret;
+       u32 chip_addr;
 
-       /* find the usb otg node */
-       node = fdt_node_offset_by_compatible(blob, -1, "snps,dwc2");
-       if (node < 0) {
-               debug("Not found usb_otg device\n");
-               return -ENODEV;
-       }
+       *dev_stusb1600 = NULL;
 
-       if (!fdtdec_get_is_enabled(blob, node)) {
-               debug("stm32 usbotg is disabled in the device tree\n");
+       /* if node stusb1600 is present, means DK1 or DK2 board */
+       node = ofnode_by_compatible(ofnode_null(), "st,stusb1600");
+       if (!ofnode_valid(node))
                return -ENODEV;
-       }
 
-       /* Enable clock */
-       ret = fdtdec_parse_phandle_with_args(blob, node, "clocks",
-                                            "#clock-cells", 0, 0, &args);
+       ret = ofnode_read_u32(node, "reg", &chip_addr);
+       if (ret)
+               return -EINVAL;
+
+       ret = uclass_get_device_by_ofnode(UCLASS_I2C, ofnode_get_parent(node),
+                                         &bus);
        if (ret) {
-               debug("usbotg has no clocks defined in the device tree\n");
-               return ret;
+               printf("bus for stusb1600 not found\n");
+               return -ENODEV;
        }
 
-       ret = uclass_get_device_by_of_offset(UCLASS_CLK, args.node, &dev);
-       if (ret)
-               return ret;
+       ret = dm_i2c_probe(bus, chip_addr, 0, &dev);
+       if (!ret)
+               *dev_stusb1600 = dev;
 
-       if (args.args_count != 1) {
-               debug("Can't find clock ID in the device tree\n");
-               return -ENODATA;
-       }
+       return ret;
+}
+
+static int stusb1600_cable_connected(struct udevice *dev)
+{
+       u8 status;
+
+       if (dm_i2c_read(dev, STUSB1600_CC_CONNECTION_STATUS, &status, 1))
+               return 0;
 
-       clk.dev = dev;
-       clk.id = args.args[0];
+       return status & STUSB1600_CC_ATTACH;
+}
+
+#include <usb/dwc2_udc.h>
+int g_dnl_board_usb_cable_connected(void)
+{
+       struct udevice *stusb1600;
+       struct udevice *dwc2_udc_otg;
+       int ret;
+
+       if (!stusb1600_init(&stusb1600))
+               return stusb1600_cable_connected(stusb1600);
+
+       ret = uclass_get_device_by_driver(UCLASS_USB_GADGET_GENERIC,
+                                         DM_GET_DRIVER(dwc2_udc_otg),
+                                         &dwc2_udc_otg);
+       if (!ret)
+               debug("dwc2_udc_otg init failed\n");
+
+       return dwc2_udc_B_session_valid(dwc2_udc_otg);
+}
+#endif /* CONFIG_USB_GADGET */
+
+static int get_led(struct udevice **dev, char *led_string)
+{
+       char *led_name;
+       int ret;
 
-       ret = clk_enable(&clk);
+       led_name = fdtdec_get_config_string(gd->fdt_blob, led_string);
+       if (!led_name) {
+               pr_debug("%s: could not find %s config string\n",
+                        __func__, led_string);
+               return -ENOENT;
+       }
+       ret = led_get_by_label(led_name, dev);
        if (ret) {
-               debug("Failed to enable usbotg clock\n");
+               debug("%s: get=%d\n", __func__, ret);
                return ret;
        }
 
-       /* Reset */
-       ret = fdtdec_parse_phandle_with_args(blob, node, "resets",
-                                            "#reset-cells", 0, 0, &args);
-       if (ret) {
-               debug("usbotg has no resets defined in the device tree\n");
-               goto clk_err;
+       return 0;
+}
+
+static int setup_led(enum led_state_t cmd)
+{
+       struct udevice *dev;
+       int ret;
+
+       ret = get_led(&dev, "u-boot,boot-led");
+       if (ret)
+               return ret;
+
+       ret = led_set_state(dev, cmd);
+       return ret;
+}
+
+static int board_check_usb_power(void)
+{
+       struct ofnode_phandle_args adc_args;
+       struct udevice *adc;
+       struct udevice *led;
+       ofnode node;
+       unsigned int raw;
+       int max_uV = 0;
+       int ret, uV, adc_count;
+       u8 i, nb_blink;
+
+       node = ofnode_path("/config");
+       if (!ofnode_valid(node)) {
+               debug("%s: no /config node?\n", __func__);
+               return -ENOENT;
        }
 
-       ret = uclass_get_device_by_of_offset(UCLASS_RESET, args.node, &dev);
-       if (ret || args.args_count != 1)
-               goto clk_err;
+       /*
+        * Retrieve the ADC channels devices and get measurement
+        * for each of them
+        */
+       adc_count = ofnode_count_phandle_with_args(node, "st,adc_usb_pd",
+                                                  "#io-channel-cells");
+       if (adc_count < 0) {
+               if (adc_count == -ENOENT)
+                       return 0;
 
-       usbotg_reset.dev = dev;
-       usbotg_reset.id = args.args[0];
+               pr_err("%s: can't find adc channel (%d)\n", __func__,
+                      adc_count);
 
-       reset_assert(&usbotg_reset);
-       udelay(2);
-       reset_deassert(&usbotg_reset);
+               return adc_count;
+       }
 
-       /* Get USB PHY */
-       ret = fdtdec_parse_phandle_with_args(blob, node, "phys",
-                                            "#phy-cells", 0, 0, &args);
-       if (!ret) {
-               phy_provider = fdt_parent_offset(blob, args.node);
-               ret = uclass_get_device_by_of_offset(UCLASS_PHY,
-                                                    phy_provider, &dev);
-               if (ret)
-                       goto clk_err;
+       for (i = 0; i < adc_count; i++) {
+               if (ofnode_parse_phandle_with_args(node, "st,adc_usb_pd",
+                                                  "#io-channel-cells", 0, i,
+                                                  &adc_args)) {
+                       pr_debug("%s: can't find /config/st,adc_usb_pd\n",
+                                __func__);
+                       return 0;
+               }
 
-               phy.dev = dev;
-               phy.id = fdtdec_get_uint(blob, args.node, "reg", -1);
+               ret = uclass_get_device_by_ofnode(UCLASS_ADC, adc_args.node,
+                                                 &adc);
 
-               ret = generic_phy_power_on(&phy);
                if (ret) {
-                       debug("unable to power on the phy\n");
-                       goto clk_err;
+                       pr_err("%s: Can't get adc device(%d)\n", __func__,
+                              ret);
+                       return ret;
                }
 
-               ret = generic_phy_init(&phy);
+               ret = adc_channel_single_shot(adc->name, adc_args.args[0],
+                                             &raw);
                if (ret) {
-                       debug("failed to init usb phy\n");
-                       goto phy_power_err;
+                       pr_err("%s: single shot failed for %s[%d]!\n",
+                              __func__, adc->name, adc_args.args[0]);
+                       return ret;
                }
-       }
-
-       /* Parse and store data needed for gadget */
-       stm32mp_otg_data.regs_otg = fdtdec_get_addr(blob, node, "reg");
-       if (stm32mp_otg_data.regs_otg == FDT_ADDR_T_NONE) {
-               debug("usbotg: can't get base address\n");
-               ret = -ENODATA;
-               goto phy_init_err;
-       }
-
-       stm32mp_otg_data.rx_fifo_sz = fdtdec_get_int(blob, node,
-                                                    "g-rx-fifo-size", 0);
-       stm32mp_otg_data.np_tx_fifo_sz = fdtdec_get_int(blob, node,
-                                                       "g-np-tx-fifo-size", 0);
-       stm32mp_otg_data.tx_fifo_sz = fdtdec_get_int(blob, node,
-                                                    "g-tx-fifo-size", 0);
-       /* Enable voltage level detector */
-       if (!(fdtdec_parse_phandle_with_args(blob, node, "usb33d-supply",
-                                            NULL, 0, 0, &args))) {
-               if (!uclass_get_device_by_of_offset(UCLASS_REGULATOR,
-                                                   args.node, &dev)) {
-                       ret = regulator_set_enable(dev, true);
-                       if (ret) {
-                               debug("Failed to enable usb33d\n");
-                               goto phy_init_err;
-                       }
+               /* Convert to uV */
+               if (!adc_raw_to_uV(adc, raw, &uV)) {
+                       if (uV > max_uV)
+                               max_uV = uV;
+                       pr_debug("%s: %s[%02d] = %u, %d uV\n", __func__,
+                                adc->name, adc_args.args[0], raw, uV);
+               } else {
+                       pr_err("%s: Can't get uV value for %s[%d]\n",
+                              __func__, adc->name, adc_args.args[0]);
                }
        }
-               /* Enable vbus sensing */
-       setbits_le32(stm32mp_otg_data.regs_otg + STM32MP_GGPIO,
-                    STM32MP_GGPIO_VBUS_SENSING);
 
-       return dwc2_udc_probe(&stm32mp_otg_data);
+       /*
+        * If highest value is inside 1.23 Volts and 2.10 Volts, that means
+        * board is plugged on an USB-C 3A power supply and boot process can
+        * continue.
+        */
+       if (max_uV > USB_START_LOW_THRESHOLD_UV &&
+           max_uV < USB_START_HIGH_THRESHOLD_UV)
+               return 0;
+
+       /* Display warning message and make u-boot,error-led blinking */
+       pr_err("\n*******************************************\n");
+
+       if (max_uV < USB_WARNING_LOW_THRESHOLD_UV) {
+               pr_err("*   WARNING 500mA power supply detected   *\n");
+               nb_blink = 2;
+       } else {
+               pr_err("* WARNING 1.5A power supply detected      *\n");
+               nb_blink = 3;
+       }
 
-phy_init_err:
-       generic_phy_exit(&phy);
+       pr_err("* Current too low, use a 3A power supply! *\n");
+       pr_err("*******************************************\n\n");
 
-phy_power_err:
-       generic_phy_power_off(&phy);
+       ret = get_led(&led, "u-boot,error-led");
+       if (ret)
+               return ret;
 
-clk_err:
-       clk_disable(&clk);
+       for (i = 0; i < nb_blink * 2; i++) {
+               led_set_state(led, LEDST_TOGGLE);
+               mdelay(125);
+       }
+       led_set_state(led, LEDST_ON);
 
-       return ret;
+       return 0;
 }
 
-int board_usb_cleanup(int index, enum usb_init_type init)
+static void sysconf_init(void)
 {
-       /* Reset usbotg */
-       reset_assert(&usbotg_reset);
-       udelay(2);
-       reset_deassert(&usbotg_reset);
+#ifndef CONFIG_STM32MP1_TRUSTED
+       u8 *syscfg;
+#ifdef CONFIG_DM_REGULATOR
+       struct udevice *pwr_dev;
+       struct udevice *pwr_reg;
+       struct udevice *dev;
+       int ret;
+       u32 otp = 0;
+#endif
+       u32 bootr;
+
+       syscfg = (u8 *)syscon_get_first_range(STM32MP_SYSCON_SYSCFG);
+
+       /* interconnect update : select master using the port 1 */
+       /* LTDC = AXI_M9 */
+       /* GPU  = AXI_M8 */
+       /* today information is hardcoded in U-Boot */
+       writel(BIT(9), syscfg + SYSCFG_ICNR);
+
+       /* disable Pull-Down for boot pin connected to VDD */
+       bootr = readl(syscfg + SYSCFG_BOOTR);
+       bootr &= ~(SYSCFG_BOOTR_BOOT_MASK << SYSCFG_BOOTR_BOOTPD_SHIFT);
+       bootr |= (bootr & SYSCFG_BOOTR_BOOT_MASK) << SYSCFG_BOOTR_BOOTPD_SHIFT;
+       writel(bootr, syscfg + SYSCFG_BOOTR);
+
+#ifdef CONFIG_DM_REGULATOR
+       /* High Speed Low Voltage Pad mode Enable for SPI, SDMMC, ETH, QSPI
+        * and TRACE. Needed above ~50MHz and conditioned by AFMUX selection.
+        * The customer will have to disable this for low frequencies
+        * or if AFMUX is selected but the function not used, typically for
+        * TRACE. Otherwise, impact on power consumption.
+        *
+        * WARNING:
+        *   enabling High Speed mode while VDD>2.7V
+        *   with the OTP product_below_2v5 (OTP 18, BIT 13)
+        *   erroneously set to 1 can damage the IC!
+        *   => U-Boot set the register only if VDD < 2.7V (in DT)
+        *      but this value need to be consistent with board design
+        */
+       ret = syscon_get_by_driver_data(STM32MP_SYSCON_PWR, &pwr_dev);
+       if (!ret) {
+               ret = uclass_get_device_by_driver(UCLASS_MISC,
+                                                 DM_GET_DRIVER(stm32mp_bsec),
+                                                 &dev);
+               if (ret) {
+                       pr_err("Can't find stm32mp_bsec driver\n");
+                       return;
+               }
 
-       return 0;
-}
+               ret = misc_read(dev, STM32_BSEC_SHADOW(18), &otp, 4);
+               if (!ret)
+                       otp = otp & BIT(13);
+
+               /* get VDD = pwr-supply */
+               ret = device_get_supply_regulator(pwr_dev, "pwr-supply",
+                                                 &pwr_reg);
+
+               /* check if VDD is Low Voltage */
+               if (!ret) {
+                       if (regulator_get_value(pwr_reg) < 2700000) {
+                               writel(SYSCFG_IOCTRLSETR_HSLVEN_TRACE |
+                                      SYSCFG_IOCTRLSETR_HSLVEN_QUADSPI |
+                                      SYSCFG_IOCTRLSETR_HSLVEN_ETH |
+                                      SYSCFG_IOCTRLSETR_HSLVEN_SDMMC |
+                                      SYSCFG_IOCTRLSETR_HSLVEN_SPI,
+                                      syscfg + SYSCFG_IOCTRLSETR);
+
+                               if (!otp)
+                                       pr_err("product_below_2v5=0: HSLVEN protected by HW\n");
+                       } else {
+                               if (otp)
+                                       pr_err("product_below_2v5=1: HSLVEN update is destructive, no update as VDD>2.7V\n");
+                       }
+               } else {
+                       debug("VDD unknown");
+               }
+       }
+#endif
 
-int board_late_init(void)
-{
-       return 0;
+       /* activate automatic I/O compensation
+        * warning: need to ensure CSI enabled and ready in clock driver
+        */
+       writel(SYSCFG_CMPENSETR_MPU_EN, syscfg + SYSCFG_CMPENSETR);
+
+       while (!(readl(syscfg + SYSCFG_CMPCR) & SYSCFG_CMPCR_READY))
+               ;
+       clrbits_le32(syscfg + SYSCFG_CMPCR, SYSCFG_CMPCR_SW_CTRL);
+#endif
 }
 
 /* board dependent setup after realloc */
 int board_init(void)
 {
+       struct udevice *dev;
+
        /* address of boot parameters */
        gd->bd->bi_boot_params = STM32_DDR_BASE + 0x100;
 
+       /* probe all PINCTRL for hog */
+       for (uclass_first_device(UCLASS_PINCTRL, &dev);
+            dev;
+            uclass_next_device(&dev)) {
+               pr_debug("probe pincontrol = %s\n", dev->name);
+       }
+
+       board_key_check();
+
+       sysconf_init();
+
        if (IS_ENABLED(CONFIG_LED))
                led_default_state();
 
        return 0;
 }
+
+int board_late_init(void)
+{
+#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+       const void *fdt_compat;
+       int fdt_compat_len;
+
+       fdt_compat = fdt_getprop(gd->fdt_blob, 0, "compatible",
+                                &fdt_compat_len);
+       if (fdt_compat && fdt_compat_len) {
+               if (strncmp(fdt_compat, "st,", 3) != 0)
+                       env_set("board_name", fdt_compat);
+               else
+                       env_set("board_name", fdt_compat + 3);
+       }
+#endif
+
+       /* for DK1/DK2 boards */
+       board_check_usb_power();
+
+       return 0;
+}
+
+void board_quiesce_devices(void)
+{
+       setup_led(LEDST_OFF);
+}
index 8e2f90fc68c394665167c5d1aaad415f8790a95a..338f374e56ee543e8e43e1608d111a8cec24f803 100644 (file)
@@ -341,6 +341,11 @@ M: FUKAUMI Naoki <naobsd@gmail.com>
 S:     Maintained
 F:     configs/Nintendo_NES_Classic_Edition_defconfig
 
+OCEANIC 5205 5INMFD BOARD
+M:     Jagan Teki <jagan@amarulasolutions.com>
+S:     Maintained
+F:     configs/oceanic_5205_5inmfd_defconfig
+
 OLIMEX A20-SOM204 BOARD
 M:     Stefan Mavrodiev <stefan@olimex.com>
 S:     Maintained
@@ -348,7 +353,7 @@ F:  configs/A20-Olimex-SOM204-EVB_defconfig
 F:     configs/A20-Olimex-SOM204-EVB-eMMC_defconfig
 
 ORANGEPI LITE2 BOARD
-M:     Jagan Teki <jagan@openedev.com>
+M:     Jagan Teki <jagan@amarulasolutions.com>
 S:     Maintained
 F:     configs/orangepi_lite2_defconfig
 
index 4d6258d932403a179abaed0bed2d7adba0f47c5b..c4e13f8c38d720738df725071dec88e54012fa15 100644 (file)
@@ -8,9 +8,6 @@
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 obj-y  += board.o
 obj-$(CONFIG_SUN7I_GMAC)       += gmac.o
-ifndef CONFIG_SPL_BUILD
-obj-$(CONFIG_SUNXI_AHCI)       += ahci.o
-endif
 obj-$(CONFIG_MACH_SUN4I)       += dram_sun4i_auto.o
 obj-$(CONFIG_MACH_SUN5I)       += dram_sun5i_auto.o
 obj-$(CONFIG_MACH_SUN7I)       += dram_sun5i_auto.o
index 826650c89bc10d7a2a9fc730828af4846cfa0762..d8fdf7728e04537f27e4a301bbc1ba12f25eb79b 100644 (file)
@@ -12,14 +12,6 @@ void eth_init_board(void)
        struct sunxi_ccm_reg *const ccm =
                (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
 
-       /* Set up clock gating */
-#ifdef CONFIG_SUNXI_GEN_SUN6I
-       setbits_le32(&ccm->ahb_reset0_cfg, 0x1 << AHB_RESET_OFFSET_GMAC);
-       setbits_le32(&ccm->ahb_gate0, 0x1 << AHB_GATE_OFFSET_GMAC);
-#else
-       setbits_le32(&ccm->ahb_gate1, 0x1 << AHB_GATE_OFFSET_GMAC);
-#endif
-
        /* Set MII clock */
 #ifdef CONFIG_RGMII
        setbits_le32(&ccm->gmac_clk_cfg, CCM_GMAC_CTRL_TX_CLK_SRC_INT_RGMII |
index ffa7c154b5445b2859b668fc057537dde8e16dc1..7c4fcf281cbe59723d971a7991430ed33c99636e 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-int board_mmc_init(bd_t *bis)
-{
-       struct dwmci_host *host = NULL;
-
-       host = malloc(sizeof(struct dwmci_host));
-       if (!host) {
-               printf("dwmci_host malloc fail!\n");
-               return 1;
-       }
-
-       memset(host, 0, sizeof(struct dwmci_host));
-       host->name = "Synopsys Mobile storage";
-       host->ioaddr = (void *)ARC_DWMMC_BASE;
-       host->buswidth = 4;
-       host->dev_index = 0;
-       host->bus_hz = 50000000;
-
-       add_dwmci(host, host->bus_hz / 2, 400000);
-
-       return 0;
-}
-
-int board_mmc_getcd(struct mmc *mmc)
-{
-       struct dwmci_host *host = mmc->priv;
-
-       return !(dwmci_readl(host, DWMCI_CDETECT) & 1);
-}
-
 #define AXS_MB_CREG    0xE0011000
 
 int board_early_init_f(void)
index 8a2c201477c0450d99c40830e8dad5f5c360b833..ac4d980c49f40620a1222d04474be6dcec143f2e 100644 (file)
@@ -982,6 +982,12 @@ int board_early_init_f(void)
         */
        init_memory_bridge();
 
+       /*
+        * Switch SDIO external ciu clock divider from default div-by-8 to
+        * minimum possible div-by-2.
+        */
+       writel(SDIO_UHS_REG_EXT_DIV_2, (void __iomem *)SDIO_UHS_REG_EXT);
+
        return 0;
 }
 
@@ -1019,41 +1025,6 @@ int board_late_init(void)
        return 0;
 }
 
-int board_mmc_getcd(struct mmc *mmc)
-{
-       struct dwmci_host *host = mmc->priv;
-
-       return !(dwmci_readl(host, DWMCI_CDETECT) & 1);
-}
-
-int board_mmc_init(bd_t *bis)
-{
-       struct dwmci_host *host = NULL;
-
-       host = malloc(sizeof(struct dwmci_host));
-       if (!host) {
-               printf("dwmci_host malloc fail!\n");
-               return 1;
-       }
-
-       /*
-        * Switch SDIO external ciu clock divider from default div-by-8 to
-        * minimum possible div-by-2.
-        */
-       writel(SDIO_UHS_REG_EXT_DIV_2, (void __iomem *)SDIO_UHS_REG_EXT);
-
-       memset(host, 0, sizeof(struct dwmci_host));
-       host->name = "Synopsys Mobile storage";
-       host->ioaddr = (void *)ARC_DWMMC_BASE;
-       host->buswidth = 4;
-       host->dev_index = 0;
-       host->bus_hz = 50000000;
-
-       add_dwmci(host, host->bus_hz / 2, 400000);
-
-       return 0;
-}
-
 int checkboard(void)
 {
        puts("Board: Synopsys ARC HS Development Kit\n");
index bf176553d2433ed088eb990808724303febbb809..a3ad2f712a254b26dab7e51b2f88cc4e89daedfa 100644 (file)
@@ -1,6 +1,7 @@
 TBS2910 BOARD
 M:     Soeren Moch <smoch@web.de>
 S:     Maintained
+F:     arch/arm/dts/imx6q-tbs2910.dts
 F:     board/tbs/tbs2910/
 F:     configs/tbs2910_defconfig
 F:     include/configs/tbs2910.h
index ecb45f208d0c2a72be0468c01830525b9962aa69..fb0e773afc925f19fdc850b58eec3a0839e62a0c 100644 (file)
@@ -9,9 +9,7 @@
 #include <asm/arch/mx6-pins.h>
 #include <linux/errno.h>
 #include <asm/gpio.h>
-#include <asm/mach-imx/mxc_i2c.h>
 #include <asm/mach-imx/iomux-v3.h>
-#include <asm/mach-imx/sata.h>
 #include <asm/mach-imx/boot_mode.h>
 #include <asm/mach-imx/video.h>
 #include <mmc.h>
@@ -22,7 +20,6 @@
 #include <asm/arch/crm_regs.h>
 #include <asm/io.h>
 #include <asm/arch/sys_proto.h>
-#include <i2c.h>
 DECLARE_GLOBAL_DATA_PTR;
 
 #define WEAK_PULLUP    (PAD_CTL_PUS_47K_UP |                   \
@@ -33,63 +30,9 @@ DECLARE_GLOBAL_DATA_PTR;
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
        PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |                   \
-       PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
-       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
-
 #define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
 
-#define I2C_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                   \
-       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
-       PAD_CTL_ODE | PAD_CTL_SRE_FAST)
-
-#define I2C_PAD MUX_PAD_CTRL(I2C_PAD_CTRL)
-
-#ifdef CONFIG_SYS_I2C
-/* I2C1, SGTL5000 */
-static struct i2c_pads_info i2c_pad_info0 = {
-       .scl = {
-               .i2c_mode = MX6_PAD_CSI0_DAT9__I2C1_SCL | I2C_PAD,
-               .gpio_mode = MX6_PAD_CSI0_DAT9__GPIO5_IO27 | I2C_PAD,
-               .gp = IMX_GPIO_NR(5, 27)
-       },
-       .sda = {
-               .i2c_mode = MX6_PAD_CSI0_DAT8__I2C1_SDA | I2C_PAD,
-               .gpio_mode = MX6_PAD_CSI0_DAT8__GPIO5_IO26 | I2C_PAD,
-               .gp = IMX_GPIO_NR(5, 26)
-       }
-};
-
-/* I2C2 HDMI */
-static struct i2c_pads_info i2c_pad_info1 = {
-       .scl = {
-               .i2c_mode = MX6_PAD_KEY_COL3__I2C2_SCL | I2C_PAD,
-               .gpio_mode = MX6_PAD_KEY_COL3__GPIO4_IO12 | I2C_PAD,
-               .gp = IMX_GPIO_NR(4, 12)
-       },
-       .sda = {
-               .i2c_mode = MX6_PAD_KEY_ROW3__I2C2_SDA | I2C_PAD,
-               .gpio_mode = MX6_PAD_KEY_ROW3__GPIO4_IO13 | I2C_PAD,
-               .gp = IMX_GPIO_NR(4, 13)
-       }
-};
-
-/* I2C3, CON11, DS1307, PCIe_SMB */
-static struct i2c_pads_info i2c_pad_info2 = {
-       .scl = {
-               .i2c_mode = MX6_PAD_GPIO_3__I2C3_SCL | I2C_PAD,
-               .gpio_mode = MX6_PAD_GPIO_3__GPIO1_IO03 | I2C_PAD,
-               .gp = IMX_GPIO_NR(1, 3)
-       },
-       .sda = {
-               .i2c_mode = MX6_PAD_GPIO_6__I2C3_SDA | I2C_PAD,
-               .gpio_mode = MX6_PAD_GPIO_6__GPIO1_IO06 | I2C_PAD,
-               .gp = IMX_GPIO_NR(1, 6)
-       }
-};
-#endif /* CONFIG_SYS_I2C */
-
 static iomux_v3_cfg_t const uart1_pads[] = {
        MX6_PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
        MX6_PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
@@ -138,6 +81,7 @@ static void setup_iomux_enet(void)
        imx_iomux_v3_setup_multiple_pads(enet_pads, ARRAY_SIZE(enet_pads));
 
        /* Reset AR8035 PHY */
+       gpio_request(IMX_GPIO_NR(1, 25), "ETH_PHY_RESET");
        gpio_direction_output(IMX_GPIO_NR(1, 25) , 0);
        udelay(500);
        gpio_set_value(IMX_GPIO_NR(1, 25), 1);
@@ -155,108 +99,6 @@ static void setup_iomux_uart(void)
 }
 
 #ifdef CONFIG_FSL_ESDHC
-static iomux_v3_cfg_t const usdhc2_pads[] = {
-       MX6_PAD_SD2_CLK__SD2_CLK     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD2_CMD__SD2_CMD     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD2_DAT0__SD2_DATA0  | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD2_DAT1__SD2_DATA1  | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD2_DAT2__SD2_DATA2  | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD2_DAT3__SD2_DATA3  | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_NANDF_D2__GPIO2_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
-};
-
-static iomux_v3_cfg_t const usdhc3_pads[] = {
-       MX6_PAD_SD3_CLK__SD3_CLK     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_CMD__SD3_CMD     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT0__SD3_DATA0  | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT1__SD3_DATA1  | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT2__SD3_DATA2  | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT3__SD3_DATA3  | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_NANDF_D0__GPIO2_IO00 | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
-};
-
-static iomux_v3_cfg_t const usdhc4_pads[] = {
-       MX6_PAD_SD4_CLK__SD4_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_CMD__SD4_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_DAT4__SD4_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_DAT5__SD4_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_DAT6__SD4_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD4_DAT7__SD4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-};
-
-static struct fsl_esdhc_cfg usdhc_cfg[3] = {
-       {USDHC2_BASE_ADDR},
-       {USDHC3_BASE_ADDR},
-       {USDHC4_BASE_ADDR},
-};
-
-#define USDHC2_CD_GPIO IMX_GPIO_NR(2, 2)
-#define USDHC3_CD_GPIO IMX_GPIO_NR(2, 0)
-
-int board_mmc_getcd(struct mmc *mmc)
-{
-       struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
-       int ret = 0;
-
-       switch (cfg->esdhc_base) {
-       case USDHC2_BASE_ADDR:
-               ret = !gpio_get_value(USDHC2_CD_GPIO);
-               break;
-       case USDHC3_BASE_ADDR:
-               ret = !gpio_get_value(USDHC3_CD_GPIO);
-               break;
-       case USDHC4_BASE_ADDR:
-               ret = 1; /* eMMC/uSDHC4 is always present */
-               break;
-       }
-       return ret;
-}
-
-int board_mmc_init(bd_t *bis)
-{
-       /*
-        * (U-Boot device node)    (Physical Port)
-        * mmc0                    SD2
-        * mmc1                    SD3
-        * mmc2                    eMMC
-        */
-       int i, ret;
-       for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
-               switch (i) {
-               case 0:
-                       imx_iomux_v3_setup_multiple_pads(
-                               usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
-                       gpio_direction_input(USDHC2_CD_GPIO);
-                       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
-                       break;
-               case 1:
-                       imx_iomux_v3_setup_multiple_pads(
-                               usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
-                       gpio_direction_input(USDHC3_CD_GPIO);
-                       usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
-                       break;
-               case 2:
-                       imx_iomux_v3_setup_multiple_pads(
-                               usdhc4_pads, ARRAY_SIZE(usdhc4_pads));
-                       usdhc_cfg[2].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
-                       break;
-               default:
-                       printf("Warning: you configured more USDHC controllers"
-                              "(%d) then supported by the board (%d)\n",
-                              i + 1, CONFIG_SYS_FSL_USDHC_NUM);
-                       return -EINVAL;
-               }
-               ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
-               if (ret)
-                       return ret;
-       }
-       return 0;
-}
-
 /* set environment device to boot device when booting from SD */
 int board_mmc_get_env_dev(int devno)
 {
@@ -415,12 +257,6 @@ static const struct boot_mode board_boot_modes[] = {
 };
 #endif
 
-#ifdef CONFIG_USB_EHCI_MX6
-static iomux_v3_cfg_t const usb_otg_pads[] = {
-       MX6_PAD_ENET_RX_ER__USB_OTG_ID | MUX_PAD_CTRL(NO_PAD_CTRL),
-};
-#endif
-
 int board_init(void)
 {
        /* address of boot parameters */
@@ -429,26 +265,8 @@ int board_init(void)
 #ifdef CONFIG_VIDEO_IPUV3
        setup_display();
 #endif
-#ifdef CONFIG_SYS_I2C
-       setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info0);
-       setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
-       setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
-#endif
-#ifdef CONFIG_DWC_AHSATA
-       setup_sata();
-#endif
 #ifdef CONFIG_CMD_BMODE
        add_board_boot_modes(board_boot_modes);
 #endif
-#ifdef CONFIG_USB_EHCI_MX6
-       imx_iomux_v3_setup_multiple_pads(
-               usb_otg_pads, ARRAY_SIZE(usb_otg_pads));
-#endif
-       return 0;
-}
-
-int checkboard(void)
-{
-       puts("Board: TBS2910 Matrix ARM mini PC\n");
        return 0;
 }
index dd6def5e6e7910aea9d1ea0b96fbfcb5f6a4797a..d42350319cc4f2c9905443a143135a4c191ffc3c 100644 (file)
@@ -1,11 +1,15 @@
 // SPDX-License-Identifier: GPL-2.0+
 /*
- * Copyright (C) 2015-2016 Stefan Roese <sr@denx.de>
+ * Copyright (C) 2015-2019 Stefan Roese <sr@denx.de>
  */
 
 #include <common.h>
+#include <console.h>
 #include <i2c.h>
 #include <pci.h>
+#if !defined(CONFIG_SPL_BUILD)
+#include <bootcount.h>
+#endif
 #include <asm/gpio.h>
 #include <asm/io.h>
 #include <asm/arch/cpu.h>
@@ -42,6 +46,7 @@ DECLARE_GLOBAL_DATA_PTR;
 #define STM_I2C_BUS    1
 #define STM_I2C_ADDR   0x27
 #define REBOOT_DELAY   1000            /* reboot-delay in ms */
+#define ABORT_TIMEOUT  3000            /* 3 seconds reboot abort timeout */
 
 /* DDR3 static configuration */
 static MV_DRAM_MC_INIT ddr3_theadorable[MV_MAX_DDR3_STATIC_SIZE] = {
@@ -127,15 +132,15 @@ MV_DRAM_MODES *ddr3_get_static_ddr_mode(void)
        return &board_ddr_modes[0];
 }
 
-MV_BIN_SERDES_CFG *board_serdes_cfg_get(u8 pex_mode)
+MV_BIN_SERDES_CFG *board_serdes_cfg_get(void)
 {
        return &theadorable_serdes_cfg[0];
 }
 
 u8 board_sat_r_get(u8 dev_num, u8 reg)
 {
-       /* Bit 0 enables PCI 2.0 link capabilities instead of PCI 1.x */
-       return 0x01;
+       /* Bit x enables PCI 2.0 link capabilities instead of PCI 1.x */
+       return 0xe;     /* PEX port 0 is PCIe Gen1, PEX port 1..3 PCIe Gen2 */
 }
 
 int board_early_init_f(void)
@@ -218,7 +223,7 @@ int board_eth_init(bd_t *bis)
 }
 #endif
 
-#ifdef CONFIG_BOARD_LATE_INIT
+#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_BOARD_LATE_INIT)
 int board_late_init(void)
 {
        pci_dev_t bdf;
@@ -232,6 +237,7 @@ int board_late_init(void)
         */
        bdf = pci_find_device(PCI_VENDOR_ID_PLX, 0x8619, 0);
        if (bdf == -1) {
+               unsigned long start_time = get_timer(0);
                u8 i2c_buf[8];
                int ret;
 
@@ -239,6 +245,28 @@ int board_late_init(void)
                bootcount = bootcount_load();
                printf("Failed to find PLX PEX-switch (bootcount=%ld)\n",
                       bootcount);
+
+               /*
+                * The user can exit this boot-loop in the error case by
+                * hitting Ctrl-C. So wait some time for this key here.
+                */
+               printf("Continue booting with Ctrl-C, otherwise rebooting\n");
+               do {
+                       /* Handle control-c and timeouts */
+                       if (ctrlc()) {
+                               printf("PEX error boot-loop aborted!\n");
+                               return 0;
+                       }
+               } while (get_timer(start_time) < ABORT_TIMEOUT);
+
+
+               /*
+                * At this stage the bootcounter has not been incremented
+                * yet. We need to do this manually here to get an actually
+                * working bootcounter in this error case.
+                */
+               bootcount_inc();
+
                if (bootcount > PEX_SWITCH_NOT_FOUNT_LIMIT) {
                        printf("Issuing power-switch via uC!\n");
 
index d67f94ad47baec593946f51f4beffe9384915af8..2c32b92d940667916250585ca34b976cc51a562c 100644 (file)
@@ -875,157 +875,55 @@ int board_late_init(void)
 }
 #endif
 
-#ifndef CONFIG_DM_ETH
-
-#if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
-       (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
-static void cpsw_control(int enabled)
-{
-       /* VTP can be added here */
-
-       return;
-}
-
-static struct cpsw_slave_data cpsw_slaves[] = {
+/* CPSW platdata */
+#if !CONFIG_IS_ENABLED(OF_CONTROL)
+struct cpsw_slave_data slave_data[] = {
        {
-               .slave_reg_ofs  = 0x208,
-               .sliver_reg_ofs = 0xd80,
-               .phy_addr       = 0,
+               .slave_reg_ofs  = CPSW_SLAVE0_OFFSET,
+               .sliver_reg_ofs = CPSW_SLIVER0_OFFSET,
+               .phy_addr       = 0,
        },
        {
-               .slave_reg_ofs  = 0x308,
-               .sliver_reg_ofs = 0xdc0,
-               .phy_addr       = 1,
+               .slave_reg_ofs  = CPSW_SLAVE1_OFFSET,
+               .sliver_reg_ofs = CPSW_SLIVER1_OFFSET,
+               .phy_addr       = 1,
        },
 };
 
-static struct cpsw_platform_data cpsw_data = {
-       .mdio_base              = CPSW_MDIO_BASE,
+struct cpsw_platform_data am335_eth_data = {
        .cpsw_base              = CPSW_BASE,
-       .mdio_div               = 0xff,
+       .version                = CPSW_CTRL_VERSION_2,
+       .bd_ram_ofs             = CPSW_BD_OFFSET,
+       .ale_reg_ofs            = CPSW_ALE_OFFSET,
+       .cpdma_reg_ofs          = CPSW_CPDMA_OFFSET,
+       .mdio_div               = CPSW_MDIO_DIV,
+       .host_port_reg_ofs      = CPSW_HOST_PORT_OFFSET,
        .channels               = 8,
-       .cpdma_reg_ofs          = 0x800,
-       .slaves                 = 1,
-       .slave_data             = cpsw_slaves,
-       .ale_reg_ofs            = 0xd00,
+       .slaves                 = 2,
+       .slave_data             = slave_data,
        .ale_entries            = 1024,
-       .host_port_reg_ofs      = 0x108,
-       .hw_stats_reg_ofs       = 0x900,
        .bd_ram_ofs             = 0x2000,
-       .mac_control            = (1 << 5),
-       .control                = cpsw_control,
-       .host_port_num          = 0,
-       .version                = CPSW_CTRL_VERSION_2,
+       .mac_control            = 0x20,
+       .active_slave           = 0,
+       .mdio_base              = 0x4a101000,
+       .gmii_sel               = 0x44e10650,
+       .phy_sel_compat         = "ti,am3352-cpsw-phy-sel",
+       .syscon_addr            = 0x44e10630,
+       .macid_sel_compat       = "cpsw,am33xx",
 };
-#endif
-
-#if ((defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USB_ETHER)) &&\
-       defined(CONFIG_SPL_BUILD)) || \
-       ((defined(CONFIG_DRIVER_TI_CPSW) || \
-         defined(CONFIG_USB_ETHER) && defined(CONFIG_MUSB_GADGET)) && \
-        !defined(CONFIG_SPL_BUILD))
 
-/*
- * This function will:
- * Read the eFuse for MAC addresses, and set ethaddr/eth1addr/usbnet_devaddr
- * in the environment
- * Perform fixups to the PHY present on certain boards.  We only need this
- * function in:
- * - SPL with either CPSW or USB ethernet support
- * - Full U-Boot, with either CPSW or USB ethernet
- * Build in only these cases to avoid warnings about unused variables
- * when we build an SPL that has neither option but full U-Boot will.
- */
-int board_eth_init(bd_t *bis)
-{
-       int rv, n = 0;
-#if defined(CONFIG_USB_ETHER) && \
-       (!defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_USB_ETHER))
-       uint8_t mac_addr[6];
-       uint32_t mac_hi, mac_lo;
-
-       /*
-        * use efuse mac address for USB ethernet as we know that
-        * both CPSW and USB ethernet will never be active at the same time
-        */
-       mac_lo = readl(&cdev->macid0l);
-       mac_hi = readl(&cdev->macid0h);
-       mac_addr[0] = mac_hi & 0xFF;
-       mac_addr[1] = (mac_hi & 0xFF00) >> 8;
-       mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
-       mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
-       mac_addr[4] = mac_lo & 0xFF;
-       mac_addr[5] = (mac_lo & 0xFF00) >> 8;
-#endif
-
-
-#if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
-       (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
-
-#ifdef CONFIG_DRIVER_TI_CPSW
-       if (board_is_bone() || board_is_bone_lt() || board_is_bben() ||
-           board_is_idk()) {
-               writel(MII_MODE_ENABLE, &cdev->miisel);
-               cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if =
-                               PHY_INTERFACE_MODE_MII;
-       } else if (board_is_icev2()) {
-               writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
-               cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
-               cpsw_slaves[1].phy_if = PHY_INTERFACE_MODE_RMII;
-               cpsw_slaves[0].phy_addr = 1;
-               cpsw_slaves[1].phy_addr = 3;
-       } else {
-               writel((RGMII_MODE_ENABLE | RGMII_INT_DELAY), &cdev->miisel);
-               cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if =
-                               PHY_INTERFACE_MODE_RGMII;
-       }
-
-       rv = cpsw_register(&cpsw_data);
-       if (rv < 0)
-               printf("Error %d registering CPSW switch\n", rv);
-       else
-               n += rv;
-#endif
+struct eth_pdata cpsw_pdata = {
+       .iobase = 0x4a100000,
+       .phy_interface = 0,
+       .priv_pdata = &am335_eth_data,
+};
 
-       /*
-        *
-        * CPSW RGMII Internal Delay Mode is not supported in all PVT
-        * operating points.  So we must set the TX clock delay feature
-        * in the AR8051 PHY.  Since we only support a single ethernet
-        * device in U-Boot, we only do this for the first instance.
-        */
-#define AR8051_PHY_DEBUG_ADDR_REG      0x1d
-#define AR8051_PHY_DEBUG_DATA_REG      0x1e
-#define AR8051_DEBUG_RGMII_CLK_DLY_REG 0x5
-#define AR8051_RGMII_TX_CLK_DLY                0x100
-
-       if (board_is_evm_sk() || board_is_gp_evm() || board_is_bben()) {
-               const char *devname;
-               devname = miiphy_get_current_dev();
-
-               miiphy_write(devname, 0x0, AR8051_PHY_DEBUG_ADDR_REG,
-                               AR8051_DEBUG_RGMII_CLK_DLY_REG);
-               miiphy_write(devname, 0x0, AR8051_PHY_DEBUG_DATA_REG,
-                               AR8051_RGMII_TX_CLK_DLY);
-       }
-#endif
-#if defined(CONFIG_USB_ETHER) && \
-       (!defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_USB_ETHER))
-       if (is_valid_ethaddr(mac_addr))
-               eth_env_set_enetaddr("usbnet_devaddr", mac_addr);
-
-       rv = usb_eth_initialize(bis);
-       if (rv < 0)
-               printf("Error %d registering USB_ETHER\n", rv);
-       else
-               n += rv;
-#endif
-       return n;
-}
+U_BOOT_DEVICE(am335x_eth) = {
+       .name = "eth_cpsw",
+       .platdata = &cpsw_pdata,
+};
 #endif
 
-#endif /* CONFIG_DM_ETH */
-
 #ifdef CONFIG_SPL_LOAD_FIT
 int board_fit_config_name_match(const char *name)
 {
index 784b2b0191d49e3e9adae36cc04d593638f293ae..52f5d6b11e3a7a2b797afc01a50993d15a67d533 100644 (file)
@@ -10,6 +10,7 @@
 #include <common.h>
 #include <asm/io.h>
 #include <spl.h>
+#include <asm/arch/sys_proto.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -66,3 +67,16 @@ int board_fit_config_name_match(const char *name)
        return -1;
 }
 #endif
+
+#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
+int ft_board_setup(void *blob, bd_t *bd)
+{
+       int ret;
+
+       ret = fdt_fixup_msmc_ram(blob, "/interconnect@100000", "sram@70000000");
+       if (ret)
+               printf("%s: fixing up msmc ram failed %d\n", __func__, ret);
+
+       return ret;
+}
+#endif
index 060c47103261da9a209d395812d57dd27b3096cf..179adc2fff0ec97eb07abc120346a56128485600 100644 (file)
@@ -27,6 +27,7 @@
 #include <environment.h>
 #include <dwc3-uboot.h>
 #include <dwc3-omap-uboot.h>
+#include <i2c.h>
 #include <ti-usb-phy-uboot.h>
 #include <miiphy.h>
 
@@ -55,6 +56,10 @@ DECLARE_GLOBAL_DATA_PTR;
 
 #define SYSINFO_BOARD_NAME_MAX_LEN     37
 
+/* I2C I/O Expander */
+#define NAND_PCF8575_ADDR      0x21
+#define NAND_PCF8575_I2C_BUS_NUM       0
+
 const struct omap_sysinfo sysinfo = {
        "Board: UNKNOWN(DRA7 EVM) REV UNKNOWN\n"
 };
@@ -777,6 +782,44 @@ void set_muxconf_regs(void)
                     early_padconf, ARRAY_SIZE(early_padconf));
 }
 
+#if defined(CONFIG_NAND)
+static int nand_sw_detect(void)
+{
+       int rc;
+       uchar data[2];
+       struct udevice *dev;
+
+       rc = i2c_get_chip_for_busnum(NAND_PCF8575_I2C_BUS_NUM,
+                                    NAND_PCF8575_ADDR, 0, &dev);
+       if (rc)
+               return -1;
+
+       rc = dm_i2c_read(dev, 0, (uint8_t *)&data, sizeof(data));
+       if (rc)
+               return -1;
+
+       /* We are only interested in P10 and P11 on PCF8575 which is equal to
+        * bits 8 and 9.
+        */
+       data[1] = data[1] & 0x3;
+
+       /* Ensure only P11 is set and P10 is cleared. This ensures only
+        * NAND (P10) is configured and not NOR (P11) which are both low
+        * true signals. NAND and NOR settings should not be enabled at
+        * the same time.
+        */
+       if (data[1] == 0x2)
+               return 0;
+
+       return -1;
+}
+#else
+int nand_sw_detect(void)
+{
+       return -1;
+}
+#endif
+
 #ifdef CONFIG_IODELAY_RECALIBRATION
 void recalibrate_iodelay(void)
 {
@@ -796,6 +839,19 @@ void recalibrate_iodelay(void)
                        npads = ARRAY_SIZE(dra71x_core_padconf_array);
                        iodelay = dra71_iodelay_cfg_array;
                        niodelays = ARRAY_SIZE(dra71_iodelay_cfg_array);
+                       /* If SW8 on the EVM is set to enable NAND then
+                        * overwrite the pins used by VOUT3 with NAND.
+                        */
+                       if (!nand_sw_detect()) {
+                               delta_pads = dra71x_nand_padconf_array;
+                               delta_npads =
+                                       ARRAY_SIZE(dra71x_nand_padconf_array);
+                       } else {
+                               delta_pads = dra71x_vout3_padconf_array;
+                               delta_npads =
+                                       ARRAY_SIZE(dra71x_vout3_padconf_array);
+                       }
+
                } else if (board_is_dra72x_revc_or_later()) {
                        delta_pads = dra72x_rgmii_padconf_array_revc;
                        delta_npads =
index f1f6bd5316757168933844ef57a861e134ce5e96..75da5cb608f5a6aa6d7b6f29dcf6eaf2ebe3678f 100644 (file)
@@ -220,22 +220,6 @@ const struct pad_conf_entry dra72x_rgmii_padconf_array_revc[] = {
 };
 
 const struct pad_conf_entry dra71x_core_padconf_array[] = {
-       {GPMC_AD0, (M3 | PIN_INPUT)},   /* gpmc_ad0.vout3_d0 */
-       {GPMC_AD1, (M3 | PIN_INPUT)},   /* gpmc_ad1.vout3_d1 */
-       {GPMC_AD2, (M3 | PIN_INPUT)},   /* gpmc_ad2.vout3_d2 */
-       {GPMC_AD3, (M3 | PIN_INPUT)},   /* gpmc_ad3.vout3_d3 */
-       {GPMC_AD4, (M3 | PIN_INPUT)},   /* gpmc_ad4.vout3_d4 */
-       {GPMC_AD5, (M3 | PIN_INPUT)},   /* gpmc_ad5.vout3_d5 */
-       {GPMC_AD6, (M3 | PIN_INPUT)},   /* gpmc_ad6.vout3_d6 */
-       {GPMC_AD7, (M3 | PIN_INPUT)},   /* gpmc_ad7.vout3_d7 */
-       {GPMC_AD8, (M3 | PIN_INPUT)},   /* gpmc_ad8.vout3_d8 */
-       {GPMC_AD9, (M3 | PIN_INPUT)},   /* gpmc_ad9.vout3_d9 */
-       {GPMC_AD10, (M3 | PIN_INPUT)},  /* gpmc_ad10.vout3_d10 */
-       {GPMC_AD11, (M3 | PIN_INPUT)},  /* gpmc_ad11.vout3_d11 */
-       {GPMC_AD12, (M3 | PIN_INPUT)},  /* gpmc_ad12.vout3_d12 */
-       {GPMC_AD13, (M3 | PIN_INPUT)},  /* gpmc_ad13.vout3_d13 */
-       {GPMC_AD14, (M3 | PIN_INPUT)},  /* gpmc_ad14.vout3_d14 */
-       {GPMC_AD15, (M3 | PIN_INPUT)},  /* gpmc_ad15.vout3_d15 */
        {GPMC_A0, (M3 | PIN_INPUT_PULLDOWN)},   /* gpmc_a0.vout3_d16 */
        {GPMC_A1, (M3 | PIN_INPUT_PULLDOWN)},   /* gpmc_a1.vout3_d17 */
        {GPMC_A2, (M3 | PIN_INPUT_PULLDOWN)},   /* gpmc_a2.vout3_d18 */
@@ -370,6 +354,50 @@ const struct pad_conf_entry dra71x_core_padconf_array[] = {
        {WAKEUP3, (M1 | PULL_ENA | PULL_UP)},   /* Wakeup3.sys_nirq1 */
 };
 
+const struct pad_conf_entry dra71x_vout3_padconf_array[] = {
+       {GPMC_AD0, (M3 | PIN_INPUT)},   /* gpmc_ad0.vout3_d0 */
+       {GPMC_AD1, (M3 | PIN_INPUT)},   /* gpmc_ad1.vout3_d1 */
+       {GPMC_AD2, (M3 | PIN_INPUT)},   /* gpmc_ad2.vout3_d2 */
+       {GPMC_AD3, (M3 | PIN_INPUT)},   /* gpmc_ad3.vout3_d3 */
+       {GPMC_AD4, (M3 | PIN_INPUT)},   /* gpmc_ad4.vout3_d4 */
+       {GPMC_AD5, (M3 | PIN_INPUT)},   /* gpmc_ad5.vout3_d5 */
+       {GPMC_AD6, (M3 | PIN_INPUT)},   /* gpmc_ad6.vout3_d6 */
+       {GPMC_AD7, (M3 | PIN_INPUT)},   /* gpmc_ad7.vout3_d7 */
+       {GPMC_AD8, (M3 | PIN_INPUT)},   /* gpmc_ad8.vout3_d8 */
+       {GPMC_AD9, (M3 | PIN_INPUT)},   /* gpmc_ad9.vout3_d9 */
+       {GPMC_AD10, (M3 | PIN_INPUT)},  /* gpmc_ad10.vout3_d10 */
+       {GPMC_AD11, (M3 | PIN_INPUT)},  /* gpmc_ad11.vout3_d11 */
+       {GPMC_AD12, (M3 | PIN_INPUT)},  /* gpmc_ad12.vout3_d12 */
+       {GPMC_AD13, (M3 | PIN_INPUT)},  /* gpmc_ad13.vout3_d13 */
+       {GPMC_AD14, (M3 | PIN_INPUT)},  /* gpmc_ad14.vout3_d14 */
+       {GPMC_AD15, (M3 | PIN_INPUT)},  /* gpmc_ad15.vout3_d15 */
+};
+
+const struct pad_conf_entry dra71x_nand_padconf_array[] = {
+       {GPMC_AD0, (M0 | PIN_INPUT)},   /* gpmc_ad0.gpmc_ad0 */
+       {GPMC_AD1, (M0 | PIN_INPUT)},   /* gpmc_ad1.gpmc_ad1 */
+       {GPMC_AD2, (M0 | PIN_INPUT)},   /* gpmc_ad2.gpmc_ad2 */
+       {GPMC_AD3, (M0 | PIN_INPUT)},   /* gpmc_ad3.gpmc_ad3 */
+       {GPMC_AD4, (M0 | PIN_INPUT)},   /* gpmc_ad4.gpmc_ad4 */
+       {GPMC_AD5, (M0 | PIN_INPUT)},   /* gpmc_ad5.gpmc_ad5 */
+       {GPMC_AD6, (M0 | PIN_INPUT)},   /* gpmc_ad6.gpmc_ad6 */
+       {GPMC_AD7, (M0 | PIN_INPUT)},   /* gpmc_ad7.gpmc_ad7 */
+       {GPMC_AD8, (M0 | PIN_INPUT)},   /* gpmc_ad8.gpmc_ad8 */
+       {GPMC_AD9, (M0 | PIN_INPUT)},   /* gpmc_ad9.gpmc_ad9 */
+       {GPMC_AD10, (M0 | PIN_INPUT)},  /* gpmc_ad10.gpmc_ad10 */
+       {GPMC_AD11, (M0 | PIN_INPUT)},  /* gpmc_ad11.gpmc_ad11 */
+       {GPMC_AD12, (M0 | PIN_INPUT)},  /* gpmc_ad12.gpmc_ad12 */
+       {GPMC_AD13, (M0 | PIN_INPUT)},  /* gpmc_ad13.gpmc_ad13 */
+       {GPMC_AD14, (M0 | PIN_INPUT)},  /* gpmc_ad14.gpmc_ad14 */
+       {GPMC_AD15, (M0 | PIN_INPUT)},  /* gpmc_ad15.gpmc_ad15 */
+       {GPMC_CS0, (M0 | PIN_INPUT_PULLUP)},    /* gpmc_cs0.gpmc_cs0 */
+       {GPMC_ADVN_ALE, (M0 | PIN_INPUT_PULLDOWN)},     /* gpmc_advn_ale.gpmc_advn_ale */
+       {GPMC_OEN_REN, (M0 | PIN_INPUT_PULLUP)},        /* gpmc_oen_ren.gpmc_oen_ren */
+       {GPMC_WEN, (M0 | PIN_INPUT_PULLUP)},    /* gpmc_wen.gpmc_wen */
+       {GPMC_BEN0, (M0 | PIN_INPUT_PULLDOWN)}, /* gpmc_ben0.gpmc_ben0 */
+       {GPMC_WAIT0, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)},    /* gpmc_wait0.gpmc_wait0 */
+};
+
 const struct pad_conf_entry early_padconf[] = {
        {UART1_RXD, (PIN_INPUT_SLEW | M0)}, /* UART1_RXD */
        {UART1_TXD, (PIN_INPUT_SLEW | M0)}, /* UART1_TXD */
index 39a782e47960ee13412e2864cdef788c8d5b3c9c..6d0fc21c67acc29f05b411fd608633a327ed0de4 100644 (file)
@@ -315,6 +315,21 @@ int embedded_dtb_select(void)
                             BIT(9));
                setbits_le32(K2G_GPIO1_BANK2_BASE + K2G_GPIO_SETDATA_OFFSET,
                             BIT(9));
+       } else if (board_is_k2g_ice()) {
+               /* GBE Phy workaround. For Phy to latch the input
+                * configuration, a GPIO reset is asserted at the
+                * Phy reset pin to latch configuration correctly after SoC
+                * reset. GPIO0 Pin 10 (Ball AA20) is used for this on ICE
+                * board. Just do a low to high transition.
+                */
+               clrbits_le32(K2G_GPIO0_BANK0_BASE + K2G_GPIO_DIR_OFFSET,
+                            BIT(10));
+               setbits_le32(K2G_GPIO0_BANK0_BASE + K2G_GPIO_CLRDATA_OFFSET,
+                            BIT(10));
+               /* Delay just to get a transition to high */
+               udelay(100);
+               setbits_le32(K2G_GPIO0_BANK0_BASE + K2G_GPIO_SETDATA_OFFSET,
+                            BIT(10));
        }
 
        return 0;
index 706fb7e83817a126c44d8d92424e01389d05e238..89c49f9e4fcde8ee42e309fe2ba37643bc4252a7 100644 (file)
@@ -125,21 +125,23 @@ struct pin_cfg k2g_evm_pin_cfg[] = {
        { 70,   MODE(0) },      /* SOC_MMC1_SDWP */
        { 71,   MODE(0) },      /* MMC1POW TP124 */
 
-       /* RGMII */
-       { 72,   MODE(1) | PIN_IEN },    /* SOC_RGMII_RXCLK */
-       { 77,   MODE(1) | PIN_IEN },    /* SOC_RGMII_RXD3 */
-       { 78,   MODE(1) | PIN_IEN },    /* SOC_RGMII_RXD2 */
-       { 79,   MODE(1) | PIN_IEN },    /* SOC_RGMII_RXD1 */
-       { 80,   MODE(1) | PIN_IEN },    /* SOC_RGMII_RXD0 */
-       { 81,   MODE(1) | PIN_IEN },    /* SOC_RGMII_RXCTL */
-       { 85,   MODE(1) },      /* SOC_RGMII_TXCLK */
-       { 91,   MODE(1) },      /* SOC_RGMII_TXD3 */
-       { 92,   MODE(1) },      /* SOC_RGMII_TXD2 */
-       { 93,   MODE(1) },      /* SOC_RGMII_TXD1 */
-       { 94,   MODE(1) },      /* SOC_RGMII_TXD0 */
-       { 95,   MODE(1) },      /* SOC_RGMII_TXCTL */
-       { 98,   MODE(0) },      /* SOC_MDIO_DATA */
-       { 99,   MODE(0) },      /* SOC_MDIO_CLK */
+               /* EMAC */
+       { 79,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_RXD1 */
+       { 78,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_RXD2 */
+       { 77,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_RXD3 */
+       { 80,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_RXD0 */
+       { 94,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_TXD0 */
+       { 93,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_TXD1 */
+       { 92,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_TXD2 */
+       { 91,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_TXD3 */
+       { 85,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_TXC */
+       { 95,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_TXCTL */
+       { 72,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_RXC */
+       { 81,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_RXCTL */
+
+       /* MDIO */
+       { 99,   BUFFER_CLASS_B | PIN_PDIS | MODE(0) },  /* MDIO_CLK */
+       { 98,   BUFFER_CLASS_B | PIN_PDIS | MODE(0) },  /* MDIO_DATA */
 
        /* PWM */
        { 73,   MODE(4) },      /* SOC_EHRPWM3A */
@@ -346,6 +348,25 @@ struct pin_cfg k2g_ice_evm_pin_cfg[] = {
        { 133,  MODE(0) },      /* SOC_QSPI_D2 */
        { 134,  MODE(0) },      /* SOC_QSPI_D3 */
        { 135,  MODE(0) },      /* SOC_QSPI_CSN0 */
+
+       /* EMAC */
+       { 79,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_RXD1 */
+       { 78,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_RXD2 */
+       { 77,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_RXD3 */
+       { 80,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_RXD0 */
+       { 94,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_TXD0 */
+       { 93,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_TXD1 */
+       { 92,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_TXD2 */
+       { 91,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_TXD3 */
+       { 85,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_TXC */
+       { 95,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_TXCTL */
+       { 72,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_RXC */
+       { 81,   BUFFER_CLASS_D | PIN_PDIS | MODE(1) },  /* RGMII_RXCTL */
+
+       /* MDIO */
+       { 99,   BUFFER_CLASS_B | PIN_PDIS | MODE(0) },  /* MDIO_CLK */
+       { 98,   BUFFER_CLASS_B | PIN_PDIS | MODE(0) },  /* MDIO_DATA */
+
        { MAX_PIN_N, }
 };
 
diff --git a/board/toradex/apalis_imx6/1066mhz_4x128mx16.cfg b/board/toradex/apalis_imx6/1066mhz_4x128mx16.cfg
deleted file mode 100644 (file)
index 29d1c31..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright (C) 2013 Boundary Devices
- * Copyright (C) 2014-2016 Toradex AG
- */
-
-DATA 4, MX6_MMDC_P0_MDPDC, 0x00020036
-DATA 4, MX6_MMDC_P0_MDCFG0, 0x555A7954
-DATA 4, MX6_MMDC_P0_MDCFG1, 0xDB328F64
-DATA 4, MX6_MMDC_P0_MDCFG2, 0x01FF00DB
-DATA 4, MX6_MMDC_P0_MDRWD, 0x000026D2
-DATA 4, MX6_MMDC_P0_MDOR, 0x005A1023
-DATA 4, MX6_MMDC_P0_MDOTC, 0x09555050
-DATA 4, MX6_MMDC_P0_MDPDC, 0x00025576
-DATA 4, MX6_MMDC_P0_MDASP, 0x00000027
-DATA 4, MX6_MMDC_P0_MDCTL, 0x831A0000
-DATA 4, MX6_MMDC_P0_MDSCR, 0x04088032
-DATA 4, MX6_MMDC_P0_MDSCR, 0x00008033
-DATA 4, MX6_MMDC_P0_MDSCR, 0x00428031
-DATA 4, MX6_MMDC_P0_MDSCR, 0x19308030
-DATA 4, MX6_MMDC_P0_MDSCR, 0x04008040
-DATA 4, MX6_MMDC_P0_MPZQHWCTRL, 0xA1390003
-DATA 4, MX6_MMDC_P1_MPZQHWCTRL, 0xA1390003
-DATA 4, MX6_MMDC_P0_MDREF, 0x00005800
-DATA 4, MX6_MMDC_P0_MPODTCTRL, 0x00000000
-DATA 4, MX6_MMDC_P1_MPODTCTRL, 0x00000000
-
-DATA 4, MX6_MMDC_P0_MPDGCTRL0, 0x432A0338
-DATA 4, MX6_MMDC_P0_MPDGCTRL1, 0x03260324
-DATA 4, MX6_MMDC_P1_MPDGCTRL0, 0x43340344
-DATA 4, MX6_MMDC_P1_MPDGCTRL1, 0x031E027C
-
-DATA 4, MX6_MMDC_P0_MPRDDLCTL, 0x33272D2E
-DATA 4, MX6_MMDC_P1_MPRDDLCTL, 0x2F312B37
-
-DATA 4, MX6_MMDC_P0_MPWRDLCTL, 0x3A35433C
-DATA 4, MX6_MMDC_P1_MPWRDLCTL, 0x4336453F
-
-DATA 4, MX6_MMDC_P0_MPWLDECTRL0, 0x0009000E
-DATA 4, MX6_MMDC_P0_MPWLDECTRL1, 0x0018000B
-DATA 4, MX6_MMDC_P1_MPWLDECTRL0, 0x00060015
-DATA 4, MX6_MMDC_P1_MPWLDECTRL1, 0x0006000E
-
-DATA 4, MX6_MMDC_P0_MPMUR0, 0x00000800
-DATA 4, MX6_MMDC_P1_MPMUR0, 0x00000800
-DATA 4, MX6_MMDC_P0_MDSCR, 0x00000000
-DATA 4, MX6_MMDC_P0_MAPSR, 0x00011006
diff --git a/board/toradex/apalis_imx6/1066mhz_4x256mx16.cfg b/board/toradex/apalis_imx6/1066mhz_4x256mx16.cfg
deleted file mode 100644 (file)
index 02e90dd..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright (C) 2013 Boundary Devices
- * Copyright (C) 2014-2016 Toradex AG
- */
-
-DATA 4, MX6_MMDC_P0_MDPDC, 0x00020036
-DATA 4, MX6_MMDC_P0_MDCFG0, 0x898E78f5
-DATA 4, MX6_MMDC_P0_MDCFG1, 0xff328f64
-DATA 4, MX6_MMDC_P0_MDCFG2, 0x01FF00DB
-DATA 4, MX6_MMDC_P0_MDRWD, 0x000026D2
-DATA 4, MX6_MMDC_P0_MDOR, 0x008E1023
-DATA 4, MX6_MMDC_P0_MDOTC, 0x09444040
-DATA 4, MX6_MMDC_P0_MDPDC, 0x00025576
-DATA 4, MX6_MMDC_P0_MDASP, 0x00000047
-DATA 4, MX6_MMDC_P0_MDCTL, 0x841A0000
-DATA 4, MX6_MMDC_P0_MDSCR, 0x02888032
-DATA 4, MX6_MMDC_P0_MDSCR, 0x00008033
-DATA 4, MX6_MMDC_P0_MDSCR, 0x00048031
-DATA 4, MX6_MMDC_P0_MDSCR, 0x19408030
-DATA 4, MX6_MMDC_P0_MDSCR, 0x04008040
-DATA 4, MX6_MMDC_P0_MPZQHWCTRL, 0xA1390003
-DATA 4, MX6_MMDC_P1_MPZQHWCTRL, 0xA1390003
-DATA 4, MX6_MMDC_P0_MDREF, 0x00007800
-DATA 4, MX6_MMDC_P0_MPODTCTRL, 0x00022227
-DATA 4, MX6_MMDC_P1_MPODTCTRL, 0x00022227
-
-DATA 4, MX6_MMDC_P0_MPDGCTRL0, 0x03300338
-DATA 4, MX6_MMDC_P0_MPDGCTRL1, 0x03240324
-DATA 4, MX6_MMDC_P1_MPDGCTRL0, 0x03440350
-DATA 4, MX6_MMDC_P1_MPDGCTRL1, 0x032C0308
-
-DATA 4, MX6_MMDC_P0_MPRDDLCTL, 0x40363C3E
-DATA 4, MX6_MMDC_P1_MPRDDLCTL, 0x3C3E3C46
-
-DATA 4, MX6_MMDC_P0_MPWRDLCTL, 0x403E463E
-DATA 4, MX6_MMDC_P1_MPWRDLCTL, 0x4A384C46
-
-DATA 4, MX6_MMDC_P0_MPWLDECTRL0, 0x0009000E
-DATA 4, MX6_MMDC_P0_MPWLDECTRL1, 0x0018000B
-DATA 4, MX6_MMDC_P1_MPWLDECTRL0, 0x00060015
-DATA 4, MX6_MMDC_P1_MPWLDECTRL1, 0x0006000E
-
-DATA 4, MX6_MMDC_P0_MPMUR0, 0x00000800
-DATA 4, MX6_MMDC_P1_MPMUR0, 0x00000800
-DATA 4, MX6_MMDC_P0_MDSCR, 0x00000000
-DATA 4, MX6_MMDC_P0_MAPSR, 0x00011006
index 2c70ab4fbd9eabc5ee6b21b879c96c912861d526..7efe816a789ceb466b39269a35afb1969ce1f190 100644 (file)
@@ -1,9 +1,9 @@
 Apalis iMX6
 M:     Max Krummenacher <max.krummenacher@toradex.com>
 W:     http://developer.toradex.com/software/linux/linux-software
+W:      https://www.toradex.com/community
 S:     Maintained
 F:     board/toradex/apalis_imx6/
 F:     include/configs/apalis_imx6.h
 F:     configs/apalis_imx6_defconfig
-F:     configs/apalis_imx6_nospl_com_defconfig
-F:     configs/apalis_imx6_nospl_it_defconfig
+F:     arch/arm/dts/imx6-apalis.dts
index d11207c7f446c0349e40556fc693acb107e50e74..3e59185438063bb4e33a5f59e6e0a22c93c8671b 100644 (file)
@@ -2,38 +2,33 @@
 /*
  * Copyright (C) 2010-2013 Freescale Semiconductor, Inc.
  * Copyright (C) 2013, Boundary Devices <info@boundarydevices.com>
- * Copyright (C) 2014-2016, Toradex AG
+ * Copyright (C) 2014-2019, Toradex AG
  * copied from nitrogen6x
  */
 
 #include <common.h>
 #include <dm.h>
-#include <environment.h>
+
+#include <ahci.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/crm_regs.h>
-#include <asm/arch/mxc_hdmi.h>
 #include <asm/arch/imx-regs.h>
-#include <asm/arch/iomux.h>
-#include <asm/arch/sys_proto.h>
-#include <asm/arch/mx6-pins.h>
 #include <asm/arch/mx6-ddr.h>
+#include <asm/arch/mx6-pins.h>
+#include <asm/arch/mxc_hdmi.h>
+#include <asm/arch/sys_proto.h>
 #include <asm/bootm.h>
 #include <asm/gpio.h>
-#include <asm/io.h>
+#include <asm/mach-imx/boot_mode.h>
 #include <asm/mach-imx/iomux-v3.h>
-#include <asm/mach-imx/mxc_i2c.h>
 #include <asm/mach-imx/sata.h>
-#include <asm/mach-imx/boot_mode.h>
 #include <asm/mach-imx/video.h>
+#include <dm/device-internal.h>
 #include <dm/platform_data/serial_mxc.h>
-#include <dm/platdata.h>
+#include <dwc_ahsata.h>
+#include <environment.h>
 #include <fsl_esdhc.h>
-#include <i2c.h>
-#include <input.h>
 #include <imx_thermal.h>
-#include <linux/errno.h>
-#include <malloc.h>
-#include <mmc.h>
 #include <micrel.h>
 #include <miiphy.h>
 #include <netdev.h>
@@ -50,40 +45,30 @@ DECLARE_GLOBAL_DATA_PTR;
        PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
 #define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |                   \
+       PAD_CTL_SPEED_LOW | PAD_CTL_DSE_40ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+#define USDHC_EMMC_PAD_CTRL (PAD_CTL_PUS_47K_UP |              \
        PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
        PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
 #define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
 
-#define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED |                \
-       PAD_CTL_DSE_40ohm     | PAD_CTL_SRE_FAST)
-
-#define BUTTON_PAD_CTRL (PAD_CTL_PUS_100K_UP |                 \
-       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
-
-#define I2C_PAD_CTRL   (PAD_CTL_PUS_100K_UP |                  \
-       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
-       PAD_CTL_ODE | PAD_CTL_SRE_FAST)
-
 #define WEAK_PULLUP    (PAD_CTL_PUS_100K_UP |                  \
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
        PAD_CTL_SRE_SLOW)
 
-#define NO_PULLUP      (                                       \
-       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
-       PAD_CTL_SRE_SLOW)
-
 #define WEAK_PULLDOWN  (PAD_CTL_PUS_100K_DOWN |                \
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
        PAD_CTL_HYS | PAD_CTL_SRE_SLOW)
 
 #define TRISTATE       (PAD_CTL_HYS | PAD_CTL_SPEED_MED)
 
-#define OUTPUT_40OHM (PAD_CTL_SPEED_MED|PAD_CTL_DSE_40ohm)
-
 #define OUTPUT_RGB (PAD_CTL_SPEED_MED|PAD_CTL_DSE_60ohm|PAD_CTL_SRE_FAST)
 
+#define APALIS_IMX6_SATA_INIT_RETRIES  10
+
 int dram_init(void)
 {
        /* use the DDR controllers configured size */
@@ -103,63 +88,7 @@ iomux_v3_cfg_t const uart1_pads_dte[] = {
        MX6_PAD_CSI0_DAT11__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
 };
 
-#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
-/* Apalis I2C1 */
-struct i2c_pads_info i2c_pad_info1 = {
-       .scl = {
-               .i2c_mode = MX6_PAD_CSI0_DAT9__I2C1_SCL | PC,
-               .gpio_mode = MX6_PAD_CSI0_DAT9__GPIO5_IO27 | PC,
-               .gp = IMX_GPIO_NR(5, 27)
-       },
-       .sda = {
-               .i2c_mode = MX6_PAD_CSI0_DAT8__I2C1_SDA | PC,
-               .gpio_mode = MX6_PAD_CSI0_DAT8__GPIO5_IO26 | PC,
-               .gp = IMX_GPIO_NR(5, 26)
-       }
-};
-
-/* Apalis local, PMIC, SGTL5000, STMPE811 */
-struct i2c_pads_info i2c_pad_info_loc = {
-       .scl = {
-               .i2c_mode = MX6_PAD_KEY_COL3__I2C2_SCL | PC,
-               .gpio_mode = MX6_PAD_KEY_COL3__GPIO4_IO12 | PC,
-               .gp = IMX_GPIO_NR(4, 12)
-       },
-       .sda = {
-               .i2c_mode = MX6_PAD_KEY_ROW3__I2C2_SDA | PC,
-               .gpio_mode = MX6_PAD_KEY_ROW3__GPIO4_IO13 | PC,
-               .gp = IMX_GPIO_NR(4, 13)
-       }
-};
-
-/* Apalis I2C3 / CAM */
-struct i2c_pads_info i2c_pad_info3 = {
-       .scl = {
-               .i2c_mode = MX6_PAD_EIM_D17__I2C3_SCL | PC,
-               .gpio_mode = MX6_PAD_EIM_D17__GPIO3_IO17 | PC,
-               .gp = IMX_GPIO_NR(3, 17)
-       },
-       .sda = {
-               .i2c_mode = MX6_PAD_EIM_D18__I2C3_SDA | PC,
-               .gpio_mode = MX6_PAD_EIM_D18__GPIO3_IO18 | PC,
-               .gp = IMX_GPIO_NR(3, 18)
-       }
-};
-
-/* Apalis I2C2 / DDC */
-struct i2c_pads_info i2c_pad_info_ddc = {
-       .scl = {
-               .i2c_mode = MX6_PAD_EIM_EB2__HDMI_TX_DDC_SCL | PC,
-               .gpio_mode = MX6_PAD_EIM_EB2__GPIO2_IO30 | PC,
-               .gp = IMX_GPIO_NR(2, 30)
-       },
-       .sda = {
-               .i2c_mode = MX6_PAD_EIM_D16__HDMI_TX_DDC_SDA | PC,
-               .gpio_mode = MX6_PAD_EIM_D16__GPIO3_IO16 | PC,
-               .gp = IMX_GPIO_NR(3, 16)
-       }
-};
-
+#if defined(CONFIG_FSL_ESDHC) && defined(CONFIG_SPL_BUILD)
 /* Apalis MMC1 */
 iomux_v3_cfg_t const usdhc1_pads[] = {
        MX6_PAD_SD1_CLK__SD1_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
@@ -190,18 +119,19 @@ iomux_v3_cfg_t const usdhc2_pads[] = {
 
 /* eMMC */
 iomux_v3_cfg_t const usdhc3_pads[] = {
-       MX6_PAD_SD3_CLK__SD3_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_CMD__SD3_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_RST__GPIO7_IO08 | MUX_PAD_CTRL(WEAK_PULLUP),
+       MX6_PAD_SD3_CLK__SD3_CLK    | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_CMD__SD3_CMD    | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_RST__GPIO7_IO08 | MUX_PAD_CTRL(WEAK_PULLUP) | MUX_MODE_SION,
 };
+#endif /* CONFIG_FSL_ESDHC & CONFIG_SPL_BUILD */
 
 int mx6_rgmii_rework(struct phy_device *phydev)
 {
@@ -241,7 +171,8 @@ iomux_v3_cfg_t const enet_pads[] = {
        MX6_PAD_RGMII_RD3__RGMII_RD3            | MUX_PAD_CTRL(ENET_PAD_CTRL),
        MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL      | MUX_PAD_CTRL(ENET_PAD_CTRL),
        /* KSZ9031 PHY Reset */
-       MX6_PAD_ENET_CRS_DV__GPIO1_IO25         | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_ENET_CRS_DV__GPIO1_IO25         | MUX_PAD_CTRL(NO_PAD_CTRL) |
+                                                 MUX_MODE_SION,
 #      define GPIO_ENET_PHY_RESET IMX_GPIO_NR(1, 25)
 };
 
@@ -253,6 +184,7 @@ static void setup_iomux_enet(void)
 static int reset_enet_phy(struct mii_dev *bus)
 {
        /* Reset KSZ9031 PHY */
+       gpio_request(GPIO_ENET_PHY_RESET, "ETH_RESET#");
        gpio_direction_output(GPIO_ENET_PHY_RESET, 0);
        mdelay(10);
        gpio_set_value(GPIO_ENET_PHY_RESET, 1);
@@ -263,15 +195,24 @@ static int reset_enet_phy(struct mii_dev *bus)
 /* mux the Apalis GPIO pins, so they can be used from the U-Boot cmdline */
 iomux_v3_cfg_t const gpio_pads[] = {
        /* Apalis GPIO1 - GPIO8 */
-       MX6_PAD_NANDF_D4__GPIO2_IO04    | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_D5__GPIO2_IO05    | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_D6__GPIO2_IO06    | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_D7__GPIO2_IO07    | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_RB0__GPIO6_IO10   | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_WP_B__GPIO6_IO09  | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_GPIO_2__GPIO1_IO02      | MUX_PAD_CTRL(WEAK_PULLDOWN),
-       MX6_PAD_GPIO_6__GPIO1_IO06      | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_GPIO_4__GPIO1_IO04      | MUX_PAD_CTRL(WEAK_PULLUP),
+       MX6_PAD_NANDF_D4__GPIO2_IO04    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_D5__GPIO2_IO05    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_D6__GPIO2_IO06    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_D7__GPIO2_IO07    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_RB0__GPIO6_IO10   | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_WP_B__GPIO6_IO09  | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_GPIO_2__GPIO1_IO02      | MUX_PAD_CTRL(WEAK_PULLDOWN) |
+                                         MUX_MODE_SION,
+       MX6_PAD_GPIO_6__GPIO1_IO06      | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_GPIO_4__GPIO1_IO04      | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
 };
 
 static void setup_iomux_gpio(void)
@@ -281,7 +222,7 @@ static void setup_iomux_gpio(void)
 
 iomux_v3_cfg_t const usb_pads[] = {
        /* USBH_EN */
-       MX6_PAD_GPIO_0__GPIO1_IO00 | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_GPIO_0__GPIO1_IO00 | MUX_PAD_CTRL(NO_PAD_CTRL) | MUX_MODE_SION,
 #      define GPIO_USBH_EN IMX_GPIO_NR(1, 0)
        /* USB_VBUS_DET */
        MX6_PAD_EIM_D28__GPIO3_IO28 | MUX_PAD_CTRL(NO_PAD_CTRL),
@@ -289,7 +230,7 @@ iomux_v3_cfg_t const usb_pads[] = {
        /* USBO1_ID */
        MX6_PAD_ENET_RX_ER__USB_OTG_ID  | MUX_PAD_CTRL(WEAK_PULLUP),
        /* USBO1_EN */
-       MX6_PAD_EIM_D22__GPIO3_IO22 | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_EIM_D22__GPIO3_IO22 | MUX_PAD_CTRL(NO_PAD_CTRL) | MUX_MODE_SION,
 #      define GPIO_USBO_EN IMX_GPIO_NR(3, 22)
 };
 
@@ -297,8 +238,11 @@ iomux_v3_cfg_t const usb_pads[] = {
  * UARTs are used in DTE mode, switch the mode on all UARTs before
  * any pinmuxing connects a (DCE) output to a transceiver output.
  */
+#define UCR3           0x88    /* FIFO Control Register */
+#define UCR3_RI                BIT(8)  /* RIDELT DTE mode */
+#define UCR3_DCD       BIT(9)  /* DCDDELT DTE mode */
 #define UFCR           0x90    /* FIFO Control Register */
-#define UFCR_DCEDTE    (1<<6)  /* DCE=0 */
+#define UFCR_DCEDTE    BIT(6)  /* DCE=0 */
 
 static void setup_dtemode_uart(void)
 {
@@ -306,6 +250,11 @@ static void setup_dtemode_uart(void)
        setbits_le32((u32 *)(UART2_BASE + UFCR), UFCR_DCEDTE);
        setbits_le32((u32 *)(UART4_BASE + UFCR), UFCR_DCEDTE);
        setbits_le32((u32 *)(UART5_BASE + UFCR), UFCR_DCEDTE);
+
+       clrbits_le32((u32 *)(UART1_BASE + UCR3), UCR3_DCD | UCR3_RI);
+       clrbits_le32((u32 *)(UART2_BASE + UCR3), UCR3_DCD | UCR3_RI);
+       clrbits_le32((u32 *)(UART4_BASE + UCR3), UCR3_DCD | UCR3_RI);
+       clrbits_le32((u32 *)(UART5_BASE + UCR3), UCR3_DCD | UCR3_RI);
 }
 static void setup_dcemode_uart(void)
 {
@@ -321,7 +270,6 @@ static void setup_iomux_dte_uart(void)
        imx_iomux_v3_setup_multiple_pads(uart1_pads_dte,
                                         ARRAY_SIZE(uart1_pads_dte));
 }
-
 static void setup_iomux_dce_uart(void)
 {
        setup_dcemode_uart();
@@ -335,32 +283,10 @@ int board_ehci_hcd_init(int port)
        imx_iomux_v3_setup_multiple_pads(usb_pads, ARRAY_SIZE(usb_pads));
        return 0;
 }
-
-int board_ehci_power(int port, int on)
-{
-       switch (port) {
-       case 0:
-               /* control OTG power */
-               gpio_direction_output(GPIO_USBO_EN, on);
-               mdelay(100);
-               break;
-       case 1:
-               /* Control MXM USBH */
-               gpio_direction_output(GPIO_USBH_EN, on);
-               mdelay(2);
-               /* Control onboard USB Hub VBUS */
-               gpio_direction_output(GPIO_USB_VBUS_DET, on);
-               mdelay(100);
-               break;
-       default:
-               break;
-       }
-       return 0;
-}
 #endif
 
-#ifdef CONFIG_FSL_ESDHC
-/* use the following sequence: eMMC, MMC, SD */
+#if defined(CONFIG_FSL_ESDHC) && defined(CONFIG_SPL_BUILD)
+/* use the following sequence: eMMC, MMC1, SD1 */
 struct fsl_esdhc_cfg usdhc_cfg[CONFIG_SYS_FSL_USDHC_NUM] = {
        {USDHC3_BASE_ADDR},
        {USDHC1_BASE_ADDR},
@@ -374,10 +300,12 @@ int board_mmc_getcd(struct mmc *mmc)
 
        switch (cfg->esdhc_base) {
        case USDHC1_BASE_ADDR:
+               gpio_request(GPIO_MMC_CD, "MMC_CD");
                gpio_direction_input(GPIO_MMC_CD);
                ret = !gpio_get_value(GPIO_MMC_CD);
                break;
        case USDHC2_BASE_ADDR:
+               gpio_request(GPIO_MMC_CD, "SD_CD");
                gpio_direction_input(GPIO_SD_CD);
                ret = !gpio_get_value(GPIO_SD_CD);
                break;
@@ -388,43 +316,6 @@ int board_mmc_getcd(struct mmc *mmc)
 
 int board_mmc_init(bd_t *bis)
 {
-#ifndef CONFIG_SPL_BUILD
-       s32 status = 0;
-       u32 index = 0;
-
-       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
-       usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
-       usdhc_cfg[2].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
-
-       usdhc_cfg[0].max_bus_width = 8;
-       usdhc_cfg[1].max_bus_width = 8;
-       usdhc_cfg[2].max_bus_width = 4;
-
-       for (index = 0; index < CONFIG_SYS_FSL_USDHC_NUM; ++index) {
-               switch (index) {
-               case 0:
-                       imx_iomux_v3_setup_multiple_pads(
-                               usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
-                       break;
-               case 1:
-                       imx_iomux_v3_setup_multiple_pads(
-                               usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
-                       break;
-               case 2:
-                       imx_iomux_v3_setup_multiple_pads(
-                               usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
-                       break;
-               default:
-                       printf("Warning: you configured more USDHC controllers (%d) then supported by the board (%d)\n",
-                              index + 1, CONFIG_SYS_FSL_USDHC_NUM);
-                       return status;
-               }
-
-               status |= fsl_esdhc_initialize(bis, &usdhc_cfg[index]);
-       }
-
-       return status;
-#else
        struct src *psrc = (struct src *)SRC_BASE_ADDR;
        unsigned reg = readl(&psrc->sbmr1) >> 11;
        /*
@@ -463,9 +354,8 @@ int board_mmc_init(bd_t *bis)
        }
 
        return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
-#endif
 }
-#endif
+#endif /* CONFIG_FSL_ESDHC & CONFIG_SPL_BUILD */
 
 int board_phy_config(struct phy_device *phydev)
 {
@@ -489,6 +379,7 @@ int board_eth_init(bd_t *bis)
        bus = fec_get_miibus(base, -1);
        if (!bus)
                return 0;
+
        bus->reset = reset_enet_phy;
        /* scan PHY 4,5,6,7 */
        phydev = phy_find_by_mask(bus, (0xf << 4), PHY_INTERFACE_MODE_RGMII);
@@ -497,6 +388,7 @@ int board_eth_init(bd_t *bis)
                puts("no PHY found\n");
                return 0;
        }
+
        printf("using PHY at %d\n", phydev->addr);
        ret = fec_probe(bis, -1, base, bus, phydev);
        if (ret) {
@@ -504,7 +396,8 @@ int board_eth_init(bd_t *bis)
                free(phydev);
                free(bus);
        }
-#endif
+#endif /* CONFIG_FEC_MXC */
+
        return 0;
 }
 
@@ -520,18 +413,21 @@ static iomux_v3_cfg_t const pwr_intb_pads[] = {
 
 static iomux_v3_cfg_t const backlight_pads[] = {
        /* Backlight on RGB connector: J15 */
-       MX6_PAD_EIM_DA13__GPIO3_IO13 | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_EIM_DA13__GPIO3_IO13 | MUX_PAD_CTRL(NO_PAD_CTRL) |
+                                      MUX_MODE_SION,
 #define RGB_BACKLIGHT_GP IMX_GPIO_NR(3, 13)
        /* additional CPU pin on BKL_PWM, keep in tristate */
        MX6_PAD_EIM_DA14__GPIO3_IO14 | MUX_PAD_CTRL(TRISTATE),
        /* Backlight PWM, used as GPIO in U-Boot */
-       MX6_PAD_SD4_DAT2__GPIO2_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_SD4_DAT2__GPIO2_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL) |
+                                      MUX_MODE_SION,
 #define RGB_BACKLIGHTPWM_GP IMX_GPIO_NR(2, 10)
        /* buffer output enable 0: buffer enabled */
-       MX6_PAD_EIM_A25__GPIO5_IO02 | MUX_PAD_CTRL(WEAK_PULLUP),
+       MX6_PAD_EIM_A25__GPIO5_IO02 | MUX_PAD_CTRL(WEAK_PULLUP) | MUX_MODE_SION,
 #define RGB_BACKLIGHTPWM_OE IMX_GPIO_NR(5, 2)
        /* PSAVE# integrated VDAC */
-       MX6_PAD_EIM_BCLK__GPIO6_IO31 | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_EIM_BCLK__GPIO6_IO31 | MUX_PAD_CTRL(NO_PAD_CTRL) |
+                                      MUX_MODE_SION,
 #define VGA_PSAVE_NOT_GP IMX_GPIO_NR(6, 31)
 };
 
@@ -571,12 +467,6 @@ static void do_enable_hdmi(struct display_info_t const *dev)
        imx_enable_hdmi_phy();
 }
 
-static int detect_i2c(struct display_info_t const *dev)
-{
-       return (0 == i2c_set_bus_num(dev->bus)) &&
-              (0 == i2c_probe(dev->addr));
-}
-
 static void enable_lvds(struct display_info_t const *dev)
 {
        struct iomuxc *iomux = (struct iomuxc *)
@@ -670,7 +560,6 @@ struct display_info_t const displays[] = {{
        .bus    = -1,
        .addr   = 0,
        .pixfmt = IPU_PIX_FMT_LVDS666,
-       .detect = detect_i2c,
        .enable = enable_lvds,
        .mode   = {
                .name           = "wsvga-lvds",
@@ -741,6 +630,9 @@ static void setup_display(void)
        imx_iomux_v3_setup_multiple_pads(backlight_pads,
                                         ARRAY_SIZE(backlight_pads));
        /* use 0 for EDT 7", use 1 for LG fullHD panel */
+       gpio_request(RGB_BACKLIGHTPWM_GP, "BKL1_PWM");
+       gpio_request(RGB_BACKLIGHTPWM_OE, "BKL1_PWM_EN");
+       gpio_request(RGB_BACKLIGHT_GP, "BKL1_ON");
        gpio_direction_output(RGB_BACKLIGHTPWM_GP, 0);
        gpio_direction_output(RGB_BACKLIGHTPWM_OE, 0);
        gpio_direction_output(RGB_BACKLIGHT_GP, 1);
@@ -782,10 +674,6 @@ int board_init(void)
        /* address of boot parameters */
        gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
 
-       setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
-       setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info_loc);
-       setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info3);
-
 #if defined(CONFIG_VIDEO_IPUV3)
        setup_display();
 #endif
@@ -835,16 +723,17 @@ int board_late_init(void)
 #endif /* CONFIG_TDX_APALIS_IMX6_V1_0 */
 #endif /* CONFIG_REVISION_TAG */
 
-       return 0;
-}
-#endif /* CONFIG_BOARD_LATE_INIT */
+#ifdef CONFIG_CMD_USB_SDP
+       if (is_boot_from_usb()) {
+               printf("Serial Downloader recovery mode, using sdp command\n");
+               env_set("bootdelay", "0");
+               env_set("bootcmd", "sdp 0");
+       }
+#endif /* CONFIG_CMD_USB_SDP */
 
-#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_SYSTEM_SETUP)
-int ft_system_setup(void *blob, bd_t *bd)
-{
        return 0;
 }
-#endif
+#endif /* CONFIG_BOARD_LATE_INIT */
 
 int checkboard(void)
 {
@@ -1143,7 +1032,6 @@ MX6_MMDC_P0_MDSCR, 0x00000000,
 MX6_MMDC_P0_MAPSR, 0x00011006,
 };
 
-
 static void ccgr_init(void)
 {
        struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
@@ -1204,7 +1092,7 @@ void board_init_f(ulong dummy)
        ccgr_init();
        gpr_init();
 
-       /* iomux and setup of i2c */
+       /* iomux */
        board_early_init_f();
 
        /* setup GP timer */
@@ -1232,7 +1120,7 @@ void reset_cpu(ulong addr)
 {
 }
 
-#endif
+#endif /* CONFIG_SPL_BUILD */
 
 static struct mxc_serial_platdata mxc_serial_plat = {
        .reg = (struct mxc_uart *)UART1_BASE,
@@ -1243,3 +1131,52 @@ U_BOOT_DEVICE(mxc_serial) = {
        .name = "serial_mxc",
        .platdata = &mxc_serial_plat,
 };
+
+#if CONFIG_IS_ENABLED(AHCI)
+static int sata_imx_probe(struct udevice *dev)
+{
+       int i, err;
+
+       for (i = 0; i < APALIS_IMX6_SATA_INIT_RETRIES; i++) {
+               err = setup_sata();
+               if (err) {
+                       printf("SATA setup failed: %d\n", err);
+                       return err;
+               }
+
+               udelay(100);
+
+               err = dwc_ahsata_probe(dev);
+               if (!err)
+                       break;
+
+               /* There is no device on the SATA port */
+               if (sata_dm_port_status(0, 0) == 0)
+                       break;
+
+               /* There's a device, but link not established. Retry */
+               device_remove(dev, DM_REMOVE_NORMAL);
+       }
+
+       return 0;
+}
+
+struct ahci_ops sata_imx_ops = {
+       .port_status = dwc_ahsata_port_status,
+       .reset  = dwc_ahsata_bus_reset,
+       .scan   = dwc_ahsata_scan,
+};
+
+static const struct udevice_id sata_imx_ids[] = {
+       { .compatible = "fsl,imx6q-ahci" },
+       { }
+};
+
+U_BOOT_DRIVER(sata_imx) = {
+       .name           = "dwc_ahci",
+       .id             = UCLASS_AHCI,
+       .of_match       = sata_imx_ids,
+       .ops            = &sata_imx_ops,
+       .probe          = sata_imx_probe,
+};
+#endif /* AHCI */
diff --git a/board/toradex/apalis_imx6/apalis_imx6q.cfg b/board/toradex/apalis_imx6/apalis_imx6q.cfg
deleted file mode 100644 (file)
index 739b1b7..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright (C) 2013 Boundary Devices
- * Copyright (C) 2014-2016, Toradex AG
- *
- * Refer doc/README.imximage for more details about how-to configure
- * and create imximage boot image
- *
- * The syntax is taken as close as possible with the kwbimage
- */
-
-/* image version */
-IMAGE_VERSION 2
-
-/*
- * Boot Device : one of
- * spi, sd (the board has no nand neither onenand)
- */
-BOOT_FROM      sd
-
-#define __ASSEMBLY__
-#include <config.h>
-#include "asm/arch/mx6-ddr.h"
-#include "asm/arch/iomux.h"
-#include "asm/arch/crm_regs.h"
-
-#include "ddr-setup.cfg"
-#if CONFIG_DDR_MB == 2048
-#include "1066mhz_4x256mx16.cfg"
-#else
-#include "1066mhz_4x128mx16.cfg"
-#endif
-#include "clocks.cfg"
diff --git a/board/toradex/apalis_imx6/clocks.cfg b/board/toradex/apalis_imx6/clocks.cfg
deleted file mode 100644 (file)
index 1bcbc4f..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright (C) 2013 Boundary Devices
- * Copyright (C) 2014-2016, Toradex AG
- *
- * Device Configuration Data (DCD)
- *
- * Each entry must have the format:
- * Addr-type           Address        Value
- *
- * where:
- *      Addr-type register length (1,2 or 4 bytes)
- *      Address   absolute address of the register
- *      value     value to be stored in the register
- */
-
-/* set the default clock gate to save power */
-DATA 4, CCM_CCGR0, 0x00C03F3F
-DATA 4, CCM_CCGR1, 0x0030FC03
-DATA 4, CCM_CCGR2, 0x0FFFC000
-DATA 4, CCM_CCGR3, 0x3FF00000
-DATA 4, CCM_CCGR4, 0x00FFF300
-DATA 4, CCM_CCGR5, 0x0F0000C3
-DATA 4, CCM_CCGR6, 0x000003FF
-
-/* enable AXI cache for VDOA/VPU/IPU */
-DATA 4, MX6_IOMUXC_GPR4, 0xF00000CF
-/* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
-DATA 4, MX6_IOMUXC_GPR6, 0x007F007F
-DATA 4, MX6_IOMUXC_GPR7, 0x007F007F
-
-/*
- * Setup CCM_CCOSR register as follows:
- *
- * cko1_en  = 1           --> CKO1 enabled
- * cko1_div = 111  --> divide by 8
- * cko1_sel = 1011 --> ahb_clk_root
- *
- * This sets CKO1 at ahb_clk_root/8 = 132/8 = 16.5 MHz
- */
-DATA 4, CCM_CCOSR, 0x000000fb
diff --git a/board/toradex/apalis_imx6/ddr-setup.cfg b/board/toradex/apalis_imx6/ddr-setup.cfg
deleted file mode 100644 (file)
index e42e3ce..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright (C) 2013 Boundary Devices
- * Copyright (C) 2014-2016, Toradex AG
- *
- * Device Configuration Data (DCD)
- *
- * Each entry must have the format:
- * Addr-type           Address        Value
- *
- * where:
- *      Addr-type register length (1,2 or 4 bytes)
- *      Address   absolute address of the register
- *      value     value to be stored in the register
- */
-
-/*
- * DDR3 settings
- * MX6Q    ddr is limited to 1066 Mhz  currently 1056 MHz(528 MHz clock),
- *        memory bus width: 64 bits    x16/x32/x64
- * MX6DL   ddr is limited to 800 MHz(400 MHz clock)
- *        memory bus width: 64 bits    x16/x32/x64
- * MX6SOLO ddr is limited to 800 MHz(400 MHz clock)
- *        memory bus width: 32 bits    x16/x32
- */
-DATA 4, MX6_IOM_DRAM_SDQS0, 0x00000030
-DATA 4, MX6_IOM_DRAM_SDQS1, 0x00000030
-DATA 4, MX6_IOM_DRAM_SDQS2, 0x00000030
-DATA 4, MX6_IOM_DRAM_SDQS3, 0x00000030
-DATA 4, MX6_IOM_DRAM_SDQS4, 0x00000030
-DATA 4, MX6_IOM_DRAM_SDQS5, 0x00000030
-DATA 4, MX6_IOM_DRAM_SDQS6, 0x00000030
-DATA 4, MX6_IOM_DRAM_SDQS7, 0x00000030
-
-DATA 4, MX6_IOM_GRP_B0DS, 0x00000030
-DATA 4, MX6_IOM_GRP_B1DS, 0x00000030
-DATA 4, MX6_IOM_GRP_B2DS, 0x00000030
-DATA 4, MX6_IOM_GRP_B3DS, 0x00000030
-DATA 4, MX6_IOM_GRP_B4DS, 0x00000030
-DATA 4, MX6_IOM_GRP_B5DS, 0x00000030
-DATA 4, MX6_IOM_GRP_B6DS, 0x00000030
-DATA 4, MX6_IOM_GRP_B7DS, 0x00000030
-DATA 4, MX6_IOM_GRP_ADDDS, 0x00000030
-/* 40 Ohm drive strength for cs0/1,sdba2,cke0/1,sdwe */
-DATA 4, MX6_IOM_GRP_CTLDS, 0x00000030
-
-DATA 4, MX6_IOM_DRAM_DQM0, 0x00020030
-DATA 4, MX6_IOM_DRAM_DQM1, 0x00020030
-DATA 4, MX6_IOM_DRAM_DQM2, 0x00020030
-DATA 4, MX6_IOM_DRAM_DQM3, 0x00020030
-DATA 4, MX6_IOM_DRAM_DQM4, 0x00020030
-DATA 4, MX6_IOM_DRAM_DQM5, 0x00020030
-DATA 4, MX6_IOM_DRAM_DQM6, 0x00020030
-DATA 4, MX6_IOM_DRAM_DQM7, 0x00020030
-
-DATA 4, MX6_IOM_DRAM_CAS, 0x00020030
-DATA 4, MX6_IOM_DRAM_RAS, 0x00020030
-DATA 4, MX6_IOM_DRAM_SDCLK_0, 0x00020030
-DATA 4, MX6_IOM_DRAM_SDCLK_1, 0x00020030
-
-DATA 4, MX6_IOM_DRAM_RESET, 0x00020030
-DATA 4, MX6_IOM_DRAM_SDCKE0, 0x00003000
-DATA 4, MX6_IOM_DRAM_SDCKE1, 0x00003000
-
-DATA 4, MX6_IOM_DRAM_SDODT0, 0x00003030
-DATA 4, MX6_IOM_DRAM_SDODT1, 0x00003030
-
-/* (differential input) */
-DATA 4, MX6_IOM_DDRMODE_CTL, 0x00020000
-/* (differential input) */
-DATA 4, MX6_IOM_GRP_DDRMODE, 0x00020000
-/* disable ddr pullups */
-DATA 4, MX6_IOM_GRP_DDRPKE, 0x00000000
-DATA 4, MX6_IOM_DRAM_SDBA2, 0x00000000
-/* 40 Ohm drive strength for cs0/1,sdba2,cke0/1,sdwe */
-DATA 4, MX6_IOM_GRP_DDR_TYPE, 0x000C0000
-
-/* Read data DQ Byte0-3 delay */
-DATA 4, MX6_MMDC_P0_MPRDDQBY0DL, 0x33333333
-DATA 4, MX6_MMDC_P0_MPRDDQBY1DL, 0x33333333
-DATA 4, MX6_MMDC_P0_MPRDDQBY2DL, 0x33333333
-DATA 4, MX6_MMDC_P0_MPRDDQBY3DL, 0x33333333
-DATA 4, MX6_MMDC_P1_MPRDDQBY0DL, 0x33333333
-DATA 4, MX6_MMDC_P1_MPRDDQBY1DL, 0x33333333
-DATA 4, MX6_MMDC_P1_MPRDDQBY2DL, 0x33333333
-DATA 4, MX6_MMDC_P1_MPRDDQBY3DL, 0x33333333
-
-/*
- * MDMISC      mirroring       interleaved (row/bank/col)
- */
-DATA 4, MX6_MMDC_P0_MDMISC, 0x00081740
-
-/*
- * MDSCR       con_req
- */
-DATA 4, MX6_MMDC_P0_MDSCR, 0x00008000
index e6793e366a3314e3aa783cb0903c2a00b8cd8f03..22d191f52ae0db3b72995420647aec6d450405ee 100644 (file)
@@ -29,7 +29,7 @@ static int mfgr_fuse(void)
                return CMD_RET_FAILURE;
        }
        /* boot cfg */
-       fuse_prog(0, 5, 0x00005072);
+       fuse_prog(0, 5, 0x00005062);
        /* BT_FUSE_SEL */
        fuse_prog(0, 6, 0x00000010);
        return CMD_RET_SUCCESS;
index 7334e92f2ef05ad0c3bf9e5b1a7f5f782785cdd4..ebd6418fd472c2cc1ebefb2d90e0f3552225cb80 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0+
 /*
- * Copyright (C) 2014-2016, Toradex AG
+ * Copyright (C) 2014-2019, Toradex AG
  */
 
 /*
@@ -9,7 +9,6 @@
 
 #include <common.h>
 #include <i2c.h>
-#include <linux/compiler.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/iomux.h>
 #include <asm/arch/mx6-pins.h>
@@ -22,6 +21,8 @@
 /* define for PMIC register dump */
 /*#define DEBUG */
 
+#define WARNBAR "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
+
 /* use Apalis GPIO1 to switch on VPGM, ON: 1 */
 static __maybe_unused iomux_v3_cfg_t const pmic_prog_pads[] = {
        MX6_PAD_NANDF_D4__GPIO2_IO04 | MUX_PAD_CTRL(NO_PAD_CTRL),
@@ -30,99 +31,100 @@ static __maybe_unused iomux_v3_cfg_t const pmic_prog_pads[] = {
 
 unsigned pmic_init(void)
 {
+       int rc;
+       struct udevice *dev = NULL;
        unsigned programmed = 0;
        uchar bus = 1;
        uchar devid, revid, val;
 
-       puts("PMIC: ");
-       if (!((0 == i2c_set_bus_num(bus)) &&
-             (0 == i2c_probe(PFUZE100_I2C_ADDR)))) {
-               puts("i2c bus failed\n");
+       puts("PMIC:  ");
+       rc = i2c_get_chip_for_busnum(bus, PFUZE100_I2C_ADDR, 1, &dev);
+       if (rc) {
+               printf("failed to get device for PMIC at address 0x%x\n",
+                      PFUZE100_I2C_ADDR);
+               return 0;
+       }
+
+       /* check for errors in PMIC fuses */
+       if (dm_i2c_read(dev, PFUZE100_INTSTAT3, &val, 1) < 0) {
+               puts("i2c pmic INTSTAT3 register read failed\n");
+               return 0;
+       }
+       if (val & PFUZE100_BIT_OTP_ECCI) {
+               puts("\n" WARNBAR);
+               puts("WARNING: ecc errors found in pmic fuse banks\n");
+               puts(WARNBAR);
+       }
+       if (dm_i2c_read(dev, PFUZE100_OTP_ECC_SE1, &val, 1) < 0) {
+               puts("i2c pmic ECC_SE1 register read failed\n");
+               return 0;
+       }
+       if (val & PFUZE100_BITS_ECC_SE1) {
+               puts(WARNBAR);
+               puts("WARNING: ecc has made bit corrections in banks 1 to 5\n");
+               puts(WARNBAR);
+       }
+       if (dm_i2c_read(dev, PFUZE100_OTP_ECC_SE2, &val, 1) < 0) {
+               puts("i2c pmic ECC_SE2 register read failed\n");
+               return 0;
+       }
+       if (val & PFUZE100_BITS_ECC_SE2) {
+               puts(WARNBAR);
+               puts("WARNING: ecc has made bit corrections in banks 6 to 10\n"
+                   );
+               puts(WARNBAR);
+       }
+       if (dm_i2c_read(dev, PFUZE100_OTP_ECC_DE1, &val, 1) < 0) {
+               puts("i2c pmic ECC_DE register read failed\n");
                return 0;
        }
+       if (val & PFUZE100_BITS_ECC_DE1) {
+               puts(WARNBAR);
+               puts("ERROR: banks 1 to 5 have uncorrectable bits\n");
+               puts(WARNBAR);
+       }
+       if (dm_i2c_read(dev, PFUZE100_OTP_ECC_DE2, &val, 1) < 0) {
+               puts("i2c pmic ECC_DE register read failed\n");
+               return 0;
+       }
+       if (val & PFUZE100_BITS_ECC_DE2) {
+               puts(WARNBAR);
+               puts("ERROR: banks 6 to 10 have uncorrectable bits\n");
+               puts(WARNBAR);
+       }
+
        /* get device ident */
-       if (i2c_read(PFUZE100_I2C_ADDR, PFUZE100_DEVICEID, 1, &devid, 1) < 0) {
+       if (dm_i2c_read(dev, PFUZE100_DEVICEID, &devid, 1) < 0) {
                puts("i2c pmic devid read failed\n");
                return 0;
        }
-       if (i2c_read(PFUZE100_I2C_ADDR, PFUZE100_REVID, 1, &revid, 1) < 0) {
+       if (dm_i2c_read(dev, PFUZE100_REVID, &revid, 1) < 0) {
                puts("i2c pmic revid read failed\n");
                return 0;
        }
-       printf("device id: 0x%.2x, revision id: 0x%.2x\n", devid, revid);
-
-#ifdef DEBUG
-       {
-               unsigned i, j;
-
-               for (i = 0; i < 16; i++)
-                       printf("\t%x", i);
-               for (j = 0; j < 0x80; ) {
-                       printf("\n%2x", j);
-                       for (i = 0; i < 16; i++) {
-                               i2c_read(PFUZE100_I2C_ADDR, j+i, 1, &val, 1);
-                               printf("\t%2x", val);
-                       }
-                       j += 0x10;
-               }
-               printf("\nEXT Page 1");
-
-               val = PFUZE100_PAGE_REGISTER_PAGE1;
-               if (i2c_write(PFUZE100_I2C_ADDR, PFUZE100_PAGE_REGISTER, 1,
-                             &val, 1)) {
-                       puts("i2c write failed\n");
-                       return 0;
-               }
-
-               for (j = 0x80; j < 0x100; ) {
-                       printf("\n%2x", j);
-                       for (i = 0; i < 16; i++) {
-                               i2c_read(PFUZE100_I2C_ADDR, j+i, 1, &val, 1);
-                               printf("\t%2x", val);
-                       }
-                       j += 0x10;
-               }
-               printf("\nEXT Page 2");
+       printf("device id: 0x%.2x, revision id: 0x%.2x, ", devid, revid);
 
-               val = PFUZE100_PAGE_REGISTER_PAGE2;
-               if (i2c_write(PFUZE100_I2C_ADDR, PFUZE100_PAGE_REGISTER, 1,
-                             &val, 1)) {
-                       puts("i2c write failed\n");
-                       return 0;
-               }
-
-               for (j = 0x80; j < 0x100; ) {
-                       printf("\n%2x", j);
-                       for (i = 0; i < 16; i++) {
-                               i2c_read(PFUZE100_I2C_ADDR, j+i, 1, &val, 1);
-                               printf("\t%2x", val);
-                       }
-                       j += 0x10;
-               }
-               printf("\n");
-       }
-#endif
        /* get device programmed state */
        val = PFUZE100_PAGE_REGISTER_PAGE1;
-       if (i2c_write(PFUZE100_I2C_ADDR, PFUZE100_PAGE_REGISTER, 1, &val, 1)) {
+       if (dm_i2c_write(dev, PFUZE100_PAGE_REGISTER, &val, 1)) {
                puts("i2c write failed\n");
                return 0;
        }
-       if (i2c_read(PFUZE100_I2C_ADDR, PFUZE100_FUSE_POR1, 1, &val, 1) < 0) {
+       if (dm_i2c_read(dev, PFUZE100_FUSE_POR1, &val, 1) < 0) {
                puts("i2c fuse_por read failed\n");
                return 0;
        }
        if (val & PFUZE100_FUSE_POR_M)
                programmed++;
 
-       if (i2c_read(PFUZE100_I2C_ADDR, PFUZE100_FUSE_POR2, 1, &val, 1) < 0) {
+       if (dm_i2c_read(dev, PFUZE100_FUSE_POR2, &val, 1) < 0) {
                puts("i2c fuse_por read failed\n");
                return programmed;
        }
        if (val & PFUZE100_FUSE_POR_M)
                programmed++;
 
-       if (i2c_read(PFUZE100_I2C_ADDR, PFUZE100_FUSE_POR3, 1, &val, 1) < 0) {
+       if (dm_i2c_read(dev, PFUZE100_FUSE_POR3, &val, 1) < 0) {
                puts("i2c fuse_por read failed\n");
                return programmed;
        }
@@ -131,13 +133,13 @@ unsigned pmic_init(void)
 
        switch (programmed) {
        case 0:
-               printf("PMIC: not programmed\n");
+               puts("not programmed\n");
                break;
        case 3:
-               printf("PMIC: programmed\n");
+               puts("programmed\n");
                break;
        default:
-               printf("PMIC: undefined programming state\n");
+               puts("undefined programming state\n");
                break;
        }
 
@@ -145,25 +147,75 @@ unsigned pmic_init(void)
        if (programmed != 3) {
                /* set VGEN1 to 1.2V */
                val = PFUZE100_VGEN1_VAL;
-               if (i2c_write(PFUZE100_I2C_ADDR, PFUZE100_VGEN1CTL, 1,
-                             &val, 1)) {
+               if (dm_i2c_write(dev, PFUZE100_VGEN1CTL, &val, 1)) {
                        puts("i2c write failed\n");
                        return programmed;
                }
 
                /* set SWBST to 5.0V */
                val = PFUZE100_SWBST_VAL;
-               if (i2c_write(PFUZE100_I2C_ADDR, PFUZE100_SWBSTCTL, 1,
-                             &val, 1)) {
+               if (dm_i2c_write(dev, PFUZE100_SWBSTCTL, &val, 1))
                        puts("i2c write failed\n");
+       }
+
+#ifdef DEBUG
+       {
+               unsigned int i, j;
+
+               for (i = 0; i < 16; i++)
+                       printf("\t%x", i);
+               for (j = 0; j < 0x80; ) {
+                       printf("\n%2x", j);
+                       for (i = 0; i < 16; i++) {
+                               dm_i2c_read(dev, j + i, &val, 1);
+                               printf("\t%2x", val);
+                       }
+                       j += 0x10;
                }
+               printf("\nEXT Page 1");
+
+               val = PFUZE100_PAGE_REGISTER_PAGE1;
+               if (dm_i2c_write(dev, PFUZE100_PAGE_REGISTER, &val, 1)) {
+                       puts("i2c write failed\n");
+                       return 0;
+               }
+
+               for (j = 0x80; j < 0x100; ) {
+                       printf("\n%2x", j);
+                       for (i = 0; i < 16; i++) {
+                               dm_i2c_read(dev, j + i, &val, 1);
+                               printf("\t%2x", val);
+                       }
+                       j += 0x10;
+               }
+               printf("\nEXT Page 2");
+
+               val = PFUZE100_PAGE_REGISTER_PAGE2;
+               if (dm_i2c_write(dev, PFUZE100_PAGE_REGISTER, &val, 1)) {
+                       puts("i2c write failed\n");
+                       return 0;
+               }
+
+               for (j = 0x80; j < 0x100; ) {
+                       printf("\n%2x", j);
+                       for (i = 0; i < 16; i++) {
+                               dm_i2c_read(dev, j + i, &val, 1);
+                               printf("\t%2x", val);
+                       }
+                       j += 0x10;
+               }
+               printf("\n");
        }
+#endif /* DEBUG */
+
        return programmed;
 }
 
 #ifndef CONFIG_SPL_BUILD
 static int pf0100_prog(void)
 {
+       int rc;
+       struct udevice *dev = NULL;
        unsigned char bus = 1;
        unsigned char val;
        unsigned int i;
@@ -177,9 +229,10 @@ static int pf0100_prog(void)
                                         ARRAY_SIZE(pmic_prog_pads));
        gpio_direction_output(PMIC_PROG_VOLTAGE, 0);
 
-       if (!((0 == i2c_set_bus_num(bus)) &&
-             (0 == i2c_probe(PFUZE100_I2C_ADDR)))) {
-               puts("i2c bus failed\n");
+       rc = i2c_get_chip_for_busnum(bus, PFUZE100_I2C_ADDR, 1, &dev);
+       if (rc) {
+               printf("failed to get device for PMIC at address 0x%x\n",
+                      PFUZE100_I2C_ADDR);
                return CMD_RET_FAILURE;
        }
 
@@ -187,8 +240,7 @@ static int pf0100_prog(void)
                switch (pmic_otp_prog[i].cmd) {
                case pmic_i2c:
                        val = (unsigned char) (pmic_otp_prog[i].value & 0xff);
-                       if (i2c_write(PFUZE100_I2C_ADDR, pmic_otp_prog[i].reg,
-                                     1, &val, 1)) {
+                       if (dm_i2c_write(dev, pmic_otp_prog[i].reg, &val, 1)) {
                                printf("i2c write failed, reg 0x%2x, value 0x%2x\n",
                                       pmic_otp_prog[i].reg, val);
                                return CMD_RET_FAILURE;
@@ -227,4 +279,4 @@ U_BOOT_CMD(
        "Program the OTP fuses on the PMIC PF0100",
        ""
 );
-#endif
+#endif /* CONFIG_SPL_BUILD */
index c0efb79bbc987761b37dffcff84d4b6b214886e7..925762051104b828f689d477db809cc182ac8592 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0+ */
 /*
- * Copyright (C) 2014-2016, Toradex AG
+ * Copyright (C) 2014-2019, Toradex AG
  */
 
 /*
 #ifndef PF0100_H_
 #define PF0100_H_
 
+/* bit definitions */
+#define PFUZE100_BIT_0                 (0x01 << 0)
+#define PFUZE100_BIT_1                 (0x01 << 1)
+#define PFUZE100_BIT_2                 (0x01 << 2)
+#define PFUZE100_BIT_3                 (0x01 << 3)
+#define PFUZE100_BIT_4                 (0x01 << 4)
+#define PFUZE100_BIT_5                 (0x01 << 5)
+#define PFUZE100_BIT_6                 (0x01 << 6)
+#define PFUZE100_BIT_7                 (0x01 << 7)
+
 /* 7-bit I2C bus slave address */
 #define PFUZE100_I2C_ADDR              (0x08)
 /* Register Addresses */
 #define PFUZE100_DEVICEID              (0x0)
 #define PFUZE100_REVID                 (0x3)
+#define PFUZE100_INTSTAT3              (0xe)
+#define PFUZE100_BIT_OTP_ECCI          PFUZE100_BIT_7
 #define PFUZE100_SW1AMODE              (0x23)
 #define PFUZE100_SW1ACON               36
 #define PFUZE100_SW1ACON_SPEED_VAL     (0x1<<6)        /*default */
 #define PFUZE100_PAGE_REGISTER_PAGE2   (0x02 & PFUZE100_PAGE_REGISTER_PAGE_M)
 
 /* extended page 1 */
+#define PFUZE100_OTP_ECC_SE1           0x8a
+#define PFUZE100_BIT_ECC1_SE           PFUZE100_BIT_0
+#define PFUZE100_BIT_ECC2_SE           PFUZE100_BIT_1
+#define PFUZE100_BIT_ECC3_SE           PFUZE100_BIT_2
+#define PFUZE100_BIT_ECC4_SE           PFUZE100_BIT_3
+#define PFUZE100_BIT_ECC5_SE           PFUZE100_BIT_4
+#define PFUZE100_BITS_ECC_SE1          ((PFUZE100_BIT_ECC1_SE) | \
+                                       (PFUZE100_BIT_ECC2_SE) | \
+                                       (PFUZE100_BIT_ECC3_SE) | \
+                                       (PFUZE100_BIT_ECC4_SE) | \
+                                       (PFUZE100_BIT_ECC5_SE))
+#define PFUZE100_OTP_ECC_SE2           0x8b
+#define PFUZE100_BIT_ECC6_SE           PFUZE100_BIT_0
+#define PFUZE100_BIT_ECC7_SE           PFUZE100_BIT_1
+#define PFUZE100_BIT_ECC8_SE           PFUZE100_BIT_2
+#define PFUZE100_BIT_ECC9_SE           PFUZE100_BIT_3
+#define PFUZE100_BIT_ECC10_SE          PFUZE100_BIT_4
+#define PFUZE100_BITS_ECC_SE2          ((PFUZE100_BIT_ECC6_SE) | \
+                                       (PFUZE100_BIT_ECC7_SE) | \
+                                       (PFUZE100_BIT_ECC8_SE) | \
+                                       (PFUZE100_BIT_ECC9_SE) | \
+                                       (PFUZE100_BIT_ECC10_SE))
+#define PFUZE100_OTP_ECC_DE1           0x8c
+#define PFUZE100_BIT_ECC1_DE           PFUZE100_BIT_0
+#define PFUZE100_BIT_ECC2_DE           PFUZE100_BIT_1
+#define PFUZE100_BIT_ECC3_DE           PFUZE100_BIT_2
+#define PFUZE100_BIT_ECC4_DE           PFUZE100_BIT_3
+#define PFUZE100_BIT_ECC5_DE           PFUZE100_BIT_4
+#define PFUZE100_BITS_ECC_DE1          ((PFUZE100_BIT_ECC1_DE) | \
+                                       (PFUZE100_BIT_ECC2_DE) | \
+                                       (PFUZE100_BIT_ECC3_DE) | \
+                                       (PFUZE100_BIT_ECC4_DE) | \
+                                       (PFUZE100_BIT_ECC5_DE))
+#define PFUZE100_OTP_ECC_DE2           0x8d
+#define PFUZE100_BIT_ECC6_DE           PFUZE100_BIT_0
+#define PFUZE100_BIT_ECC7_DE           PFUZE100_BIT_1
+#define PFUZE100_BIT_ECC8_DE           PFUZE100_BIT_2
+#define PFUZE100_BIT_ECC9_DE           PFUZE100_BIT_3
+#define PFUZE100_BIT_ECC10_DE          PFUZE100_BIT_4
+#define PFUZE100_BITS_ECC_DE2          ((PFUZE100_BIT_ECC6_DE) | \
+                                       (PFUZE100_BIT_ECC7_DE) | \
+                                       (PFUZE100_BIT_ECC8_DE) | \
+                                       (PFUZE100_BIT_ECC9_DE) | \
+                                       (PFUZE100_BIT_ECC10_DE))
 #define PFUZE100_FUSE_POR1             0xe4
 #define PFUZE100_FUSE_POR2             0xe5
 #define PFUZE100_FUSE_POR3             0xe6
 #define PFUZE100_FUSE_POR_M            (0x1 << 1)
 
-
 /* output some informational messages, return the number FUSE_POR=1 */
 /* i.e. 0: unprogrammed, 3: programmed, other: undefined prog. state */
 unsigned pmic_init(void);
diff --git a/board/toradex/colibri_imx6/800mhz_2x64mx16.cfg b/board/toradex/colibri_imx6/800mhz_2x64mx16.cfg
deleted file mode 100644 (file)
index c940714..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright (C) 2013 Boundary Devices
- * Copyright (C) 2014-2016, Toradex AG
- */
-
-DATA 4, MX6_MMDC_P0_MDPDC, 0x0002002D
-DATA 4, MX6_MMDC_P0_MDCFG0, 0x2C305503
-DATA 4, MX6_MMDC_P0_MDCFG1, 0xB66D8D63
-DATA 4, MX6_MMDC_P0_MDCFG2, 0x01FF00DB
-DATA 4, MX6_MMDC_P0_MDRWD, 0x000026D2
-DATA 4, MX6_MMDC_P0_MDOR, 0x00301023
-DATA 4, MX6_MMDC_P0_MDOTC, 0x00333030
-DATA 4, MX6_MMDC_P0_MDPDC, 0x0002556D
-/* CS0 End: 7MSB of ((0x10000000 + 512M) -1) >> 25 */
-DATA 4, MX6_MMDC_P0_MDASP, 0x00000017
-/* DDR3 DATA BUS SIZE: 64BIT */
-/* DATA 4, MX6_MMDC_P0_MDCTL, 0x821A0000 */
-/* DDR3 DATA BUS SIZE: 32BIT */
-DATA 4, MX6_MMDC_P0_MDCTL, 0x82190000
-
-/* Write commands to DDR */
-/* Load Mode Registers */
-/* TODO Use Auto Self-Refresh mode (Extended Temperature)*/
-/* DATA 4, MX6_MMDC_P0_MDSCR, 0x04408032 */
-DATA 4, MX6_MMDC_P0_MDSCR, 0x04008032
-DATA 4, MX6_MMDC_P0_MDSCR, 0x00008033
-DATA 4, MX6_MMDC_P0_MDSCR, 0x00048031
-DATA 4, MX6_MMDC_P0_MDSCR, 0x13208030
-/* ZQ calibration */
-DATA 4, MX6_MMDC_P0_MDSCR, 0x04008040
-
-DATA 4, MX6_MMDC_P0_MPZQHWCTRL, 0xA1390003
-DATA 4, MX6_MMDC_P1_MPZQHWCTRL, 0xA1390003
-DATA 4, MX6_MMDC_P0_MDREF, 0x00005800
-
-DATA 4, MX6_MMDC_P0_MPODTCTRL, 0x00000000
-DATA 4, MX6_MMDC_P1_MPODTCTRL, 0x00000000
-
-DATA 4, MX6_MMDC_P0_MPDGCTRL0, 0x42360232
-DATA 4, MX6_MMDC_P0_MPDGCTRL1, 0x021F022A
-DATA 4, MX6_MMDC_P1_MPDGCTRL0, 0x421E0224
-DATA 4, MX6_MMDC_P1_MPDGCTRL1, 0x02110218
-
-DATA 4, MX6_MMDC_P0_MPRDDLCTL, 0x41434344
-DATA 4, MX6_MMDC_P1_MPRDDLCTL, 0x4345423E
-DATA 4, MX6_MMDC_P0_MPWRDLCTL, 0x39383339
-DATA 4, MX6_MMDC_P1_MPWRDLCTL, 0x3E363930
-
-DATA 4, MX6_MMDC_P0_MPWLDECTRL0, 0x00340039
-DATA 4, MX6_MMDC_P0_MPWLDECTRL1, 0x002C002D
-DATA 4, MX6_MMDC_P1_MPWLDECTRL0, 0x00120019
-DATA 4, MX6_MMDC_P1_MPWLDECTRL1, 0x0012002D
-
-DATA 4, MX6_MMDC_P0_MPMUR0, 0x00000800
-DATA 4, MX6_MMDC_P1_MPMUR0, 0x00000800
-DATA 4, MX6_MMDC_P0_MDSCR, 0x00000000
-DATA 4, MX6_MMDC_P0_MAPSR, 0x00011006
diff --git a/board/toradex/colibri_imx6/800mhz_4x64mx16.cfg b/board/toradex/colibri_imx6/800mhz_4x64mx16.cfg
deleted file mode 100644 (file)
index c319d2a..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright (C) 2013 Boundary Devices
- * Copyright (C) 2014-2016, Toradex AG
- */
-
-DATA 4, MX6_MMDC_P0_MDPDC, 0x0002002D
-DATA 4, MX6_MMDC_P0_MDCFG0, 0x2C305503
-DATA 4, MX6_MMDC_P0_MDCFG1, 0xB66D8D63
-DATA 4, MX6_MMDC_P0_MDCFG2, 0x01FF00DB
-DATA 4, MX6_MMDC_P0_MDRWD, 0x000026D2
-DATA 4, MX6_MMDC_P0_MDOR, 0x00301023
-DATA 4, MX6_MMDC_P0_MDOTC, 0x00333030
-DATA 4, MX6_MMDC_P0_MDPDC, 0x0002556D
-/* CS0 End: 7MSB of ((0x10000000 + 512M) -1) >> 25 */
-DATA 4, MX6_MMDC_P0_MDASP, 0x00000017
-/* DDR3 DATA BUS SIZE: 64BIT */
-DATA 4, MX6_MMDC_P0_MDCTL, 0x821A0000
-/* DDR3 DATA BUS SIZE: 32BIT */
-/* DATA 4, MX6_MMDC_P0_MDCTL, 0x82190000 */
-
-/* Write commands to DDR */
-/* Load Mode Registers */
-/* TODO Use Auto Self-Refresh mode (Extended Temperature)*/
-/* DATA 4, MX6_MMDC_P0_MDSCR, 0x04408032 */
-DATA 4, MX6_MMDC_P0_MDSCR, 0x04008032
-DATA 4, MX6_MMDC_P0_MDSCR, 0x00008033
-DATA 4, MX6_MMDC_P0_MDSCR, 0x00048031
-DATA 4, MX6_MMDC_P0_MDSCR, 0x13208030
-/* ZQ calibration */
-DATA 4, MX6_MMDC_P0_MDSCR, 0x04008040
-
-DATA 4, MX6_MMDC_P0_MPZQHWCTRL, 0xA1390003
-DATA 4, MX6_MMDC_P1_MPZQHWCTRL, 0xA1390003
-DATA 4, MX6_MMDC_P0_MDREF, 0x00005800
-
-DATA 4, MX6_MMDC_P0_MPODTCTRL, 0x00000000
-DATA 4, MX6_MMDC_P1_MPODTCTRL, 0x00000000
-
-DATA 4, MX6_MMDC_P0_MPDGCTRL0, 0x42360232
-DATA 4, MX6_MMDC_P0_MPDGCTRL1, 0x021F022A
-DATA 4, MX6_MMDC_P1_MPDGCTRL0, 0x421E0224
-DATA 4, MX6_MMDC_P1_MPDGCTRL1, 0x02110218
-
-DATA 4, MX6_MMDC_P0_MPRDDLCTL, 0x41434344
-DATA 4, MX6_MMDC_P1_MPRDDLCTL, 0x4345423E
-DATA 4, MX6_MMDC_P0_MPWRDLCTL, 0x39383339
-DATA 4, MX6_MMDC_P1_MPWRDLCTL, 0x3E363930
-
-DATA 4, MX6_MMDC_P0_MPWLDECTRL0, 0x00340039
-DATA 4, MX6_MMDC_P0_MPWLDECTRL1, 0x002C002D
-DATA 4, MX6_MMDC_P1_MPWLDECTRL0, 0x00120019
-DATA 4, MX6_MMDC_P1_MPWLDECTRL1, 0x0012002D
-
-DATA 4, MX6_MMDC_P0_MPMUR0, 0x00000800
-DATA 4, MX6_MMDC_P1_MPMUR0, 0x00000800
-DATA 4, MX6_MMDC_P0_MDSCR, 0x00000000
-DATA 4, MX6_MMDC_P0_MAPSR, 0x00011006
index 1cc7ef2e71b5b61ea10c03e6189ebd3c42bb5250..e25c07306cce9de11ac064218c456179d633877e 100644 (file)
@@ -1,8 +1,9 @@
 Colibri iMX6
 M:     Max Krummenacher <max.krummenacher@toradex.com>
 W:     http://developer.toradex.com/software/linux/linux-software
+W:      https://www.toradex.com/community
 S:     Maintained
 F:     board/toradex/colibri_imx6/
 F:     include/configs/colibri_imx6.h
 F:     configs/colibri_imx6_defconfig
-F:     configs/colibri_imx6_nospl_defconfig
+F:     arch/arm/dts/imx6-colibri.dts
diff --git a/board/toradex/colibri_imx6/clocks.cfg b/board/toradex/colibri_imx6/clocks.cfg
deleted file mode 100644 (file)
index 1bcbc4f..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright (C) 2013 Boundary Devices
- * Copyright (C) 2014-2016, Toradex AG
- *
- * Device Configuration Data (DCD)
- *
- * Each entry must have the format:
- * Addr-type           Address        Value
- *
- * where:
- *      Addr-type register length (1,2 or 4 bytes)
- *      Address   absolute address of the register
- *      value     value to be stored in the register
- */
-
-/* set the default clock gate to save power */
-DATA 4, CCM_CCGR0, 0x00C03F3F
-DATA 4, CCM_CCGR1, 0x0030FC03
-DATA 4, CCM_CCGR2, 0x0FFFC000
-DATA 4, CCM_CCGR3, 0x3FF00000
-DATA 4, CCM_CCGR4, 0x00FFF300
-DATA 4, CCM_CCGR5, 0x0F0000C3
-DATA 4, CCM_CCGR6, 0x000003FF
-
-/* enable AXI cache for VDOA/VPU/IPU */
-DATA 4, MX6_IOMUXC_GPR4, 0xF00000CF
-/* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
-DATA 4, MX6_IOMUXC_GPR6, 0x007F007F
-DATA 4, MX6_IOMUXC_GPR7, 0x007F007F
-
-/*
- * Setup CCM_CCOSR register as follows:
- *
- * cko1_en  = 1           --> CKO1 enabled
- * cko1_div = 111  --> divide by 8
- * cko1_sel = 1011 --> ahb_clk_root
- *
- * This sets CKO1 at ahb_clk_root/8 = 132/8 = 16.5 MHz
- */
-DATA 4, CCM_CCOSR, 0x000000fb
index 17876f27e96766103acaffaf792ebe58ce58ab32..c634e3243dc79597e0105897bb4e8143d7ce7b05 100644 (file)
@@ -2,40 +2,35 @@
 /*
  * Copyright (C) 2010-2013 Freescale Semiconductor, Inc.
  * Copyright (C) 2013, Boundary Devices <info@boundarydevices.com>
- * Copyright (C) 2014-2016, Toradex AG
+ * Copyright (C) 2014-2019, Toradex AG
  * copied from nitrogen6x
  */
 
 #include <common.h>
 #include <dm.h>
+
 #include <asm/arch/clock.h>
 #include <asm/arch/crm_regs.h>
 #include <asm/arch/imx-regs.h>
-#include <asm/arch/iomux.h>
-#include <asm/arch/mx6-pins.h>
 #include <asm/arch/mx6-ddr.h>
+#include <asm/arch/mx6-pins.h>
 #include <asm/arch/mxc_hdmi.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/bootm.h>
 #include <asm/gpio.h>
+#include <asm/mach-imx/boot_mode.h>
 #include <asm/mach-imx/iomux-v3.h>
-#include <asm/mach-imx/mxc_i2c.h>
 #include <asm/mach-imx/sata.h>
-#include <asm/mach-imx/boot_mode.h>
 #include <asm/mach-imx/video.h>
-#include <asm/io.h>
+#include <cpu.h>
 #include <dm/platform_data/serial_mxc.h>
-#include <dm/platdata.h>
+#include <environment.h>
 #include <fsl_esdhc.h>
-#include <i2c.h>
-#include <input.h>
 #include <imx_thermal.h>
-#include <linux/errno.h>
-#include <malloc.h>
 #include <micrel.h>
 #include <miiphy.h>
-#include <mmc.h>
 #include <netdev.h>
+#include <cpu.h>
 
 #include "../common/tdx-cfg-block.h"
 #ifdef CONFIG_TDX_CMD_IMX_MFGR
@@ -49,22 +44,16 @@ DECLARE_GLOBAL_DATA_PTR;
        PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
 #define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |                   \
+       PAD_CTL_SPEED_LOW | PAD_CTL_DSE_40ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+#define USDHC_EMMC_PAD_CTRL (PAD_CTL_PUS_47K_UP |              \
        PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
        PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
 #define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
 
-#define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED |                \
-       PAD_CTL_DSE_40ohm     | PAD_CTL_SRE_FAST)
-
-#define BUTTON_PAD_CTRL (PAD_CTL_PUS_100K_UP |                 \
-       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
-
-#define I2C_PAD_CTRL   (PAD_CTL_PUS_100K_UP |                  \
-       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
-       PAD_CTL_ODE | PAD_CTL_SRE_FAST)
-
 #define WEAK_PULLUP    (PAD_CTL_PUS_100K_UP |                  \
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
        PAD_CTL_SRE_SLOW)
@@ -77,8 +66,6 @@ DECLARE_GLOBAL_DATA_PTR;
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
        PAD_CTL_HYS | PAD_CTL_SRE_SLOW)
 
-#define OUTPUT_40OHM (PAD_CTL_SPEED_MED|PAD_CTL_DSE_40ohm)
-
 #define OUTPUT_RGB (PAD_CTL_SPEED_MED|PAD_CTL_DSE_60ohm|PAD_CTL_SRE_FAST)
 
 int dram_init(void)
@@ -96,36 +83,8 @@ iomux_v3_cfg_t const uart1_pads[] = {
        MX6_PAD_CSI0_DAT11__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
 };
 
-#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
-/* Colibri I2C */
-struct i2c_pads_info i2c_pad_info1 = {
-       .scl = {
-               .i2c_mode = MX6_PAD_GPIO_3__I2C3_SCL | PC,
-               .gpio_mode = MX6_PAD_GPIO_3__GPIO1_IO03 | PC,
-               .gp = IMX_GPIO_NR(1, 3)
-       },
-       .sda = {
-               .i2c_mode = MX6_PAD_GPIO_6__I2C3_SDA | PC,
-               .gpio_mode = MX6_PAD_GPIO_6__GPIO1_IO06 | PC,
-               .gp = IMX_GPIO_NR(1, 6)
-       }
-};
-
-/* Colibri local, PMIC, SGTL5000, STMPE811 */
-struct i2c_pads_info i2c_pad_info_loc = {
-       .scl = {
-               .i2c_mode = MX6_PAD_EIM_EB2__I2C2_SCL | PC,
-               .gpio_mode = MX6_PAD_EIM_EB2__GPIO2_IO30 | PC,
-               .gp = IMX_GPIO_NR(2, 30)
-       },
-       .sda = {
-               .i2c_mode = MX6_PAD_EIM_D16__I2C2_SDA | PC,
-               .gpio_mode = MX6_PAD_EIM_D16__GPIO3_IO16 | PC,
-               .gp = IMX_GPIO_NR(3, 16)
-       }
-};
-
-/* Apalis MMC */
+#if defined(CONFIG_FSL_ESDHC) && defined(CONFIG_SPL_BUILD)
+/* Colibri MMC */
 iomux_v3_cfg_t const usdhc1_pads[] = {
        MX6_PAD_SD1_CLK__SD1_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL),
        MX6_PAD_SD1_CMD__SD1_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL),
@@ -139,18 +98,19 @@ iomux_v3_cfg_t const usdhc1_pads[] = {
 
 /* eMMC */
 iomux_v3_cfg_t const usdhc3_pads[] = {
-       MX6_PAD_SD3_CLK__SD3_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_CMD__SD3_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
-       MX6_PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD3_CLK__SD3_CLK    | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_CMD__SD3_CMD    | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
+       MX6_PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_EMMC_PAD_CTRL),
        MX6_PAD_SD3_RST__SD3_RESET  | MUX_PAD_CTRL(USDHC_PAD_CTRL),
 };
+#endif /* CONFIG_FSL_ESDHC & CONFIG_SPL_BUILD */
 
 iomux_v3_cfg_t const enet_pads[] = {
        MX6_PAD_ENET_MDC__ENET_MDC              | MUX_PAD_CTRL(ENET_PAD_CTRL),
@@ -173,68 +133,123 @@ static void setup_iomux_enet(void)
 /* mux auxiliary pins to GPIO, so they can be used from the U-Boot cmdline */
 iomux_v3_cfg_t const gpio_pads[] = {
        /* ADDRESS[17:18] [25] used as GPIO */
-       MX6_PAD_KEY_ROW2__GPIO4_IO11    | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_KEY_COL2__GPIO4_IO10    | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_D1__GPIO2_IO01    | MUX_PAD_CTRL(WEAK_PULLUP),
+       MX6_PAD_KEY_ROW2__GPIO4_IO11    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_KEY_COL2__GPIO4_IO10    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_D1__GPIO2_IO01    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
        /* ADDRESS[19:24] used as GPIO */
-       MX6_PAD_DISP0_DAT23__GPIO5_IO17 | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_DISP0_DAT22__GPIO5_IO16 | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_DISP0_DAT21__GPIO5_IO15 | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_DISP0_DAT20__GPIO5_IO14 | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_DISP0_DAT19__GPIO5_IO13 | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_DISP0_DAT18__GPIO5_IO12 | MUX_PAD_CTRL(WEAK_PULLUP),
+       MX6_PAD_DISP0_DAT23__GPIO5_IO17 | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_DISP0_DAT22__GPIO5_IO16 | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_DISP0_DAT21__GPIO5_IO15 | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_DISP0_DAT20__GPIO5_IO14 | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_DISP0_DAT19__GPIO5_IO13 | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_DISP0_DAT18__GPIO5_IO12 | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
        /* DATA[16:29] [31]      used as GPIO */
-       MX6_PAD_EIM_LBA__GPIO2_IO27     | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_EIM_BCLK__GPIO6_IO31    | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_CS3__GPIO6_IO16   | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_CS1__GPIO6_IO14   | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_RB0__GPIO6_IO10   | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_ALE__GPIO6_IO08   | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_WP_B__GPIO6_IO09  | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_CS0__GPIO6_IO11   | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_CLE__GPIO6_IO07   | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_GPIO_19__GPIO4_IO05     | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_CSI0_MCLK__GPIO5_IO19   | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_CSI0_PIXCLK__GPIO5_IO18 | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_GPIO_4__GPIO1_IO04      | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_GPIO_5__GPIO1_IO05      | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_GPIO_2__GPIO1_IO02      | MUX_PAD_CTRL(WEAK_PULLUP),
+       MX6_PAD_EIM_LBA__GPIO2_IO27     | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_EIM_BCLK__GPIO6_IO31    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_CS3__GPIO6_IO16   | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_CS1__GPIO6_IO14   | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_RB0__GPIO6_IO10   | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_ALE__GPIO6_IO08   | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_WP_B__GPIO6_IO09  | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_CS0__GPIO6_IO11   | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_CLE__GPIO6_IO07   | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_GPIO_19__GPIO4_IO05     | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_CSI0_MCLK__GPIO5_IO19   | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_CSI0_PIXCLK__GPIO5_IO18 | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_GPIO_4__GPIO1_IO04      | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_GPIO_5__GPIO1_IO05      | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_GPIO_2__GPIO1_IO02      | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
        /* DQM[0:3]      used as GPIO */
-       MX6_PAD_EIM_EB0__GPIO2_IO28     | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_EIM_EB1__GPIO2_IO29     | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_SD2_DAT2__GPIO1_IO13    | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_D0__GPIO2_IO00    | MUX_PAD_CTRL(WEAK_PULLUP),
+       MX6_PAD_EIM_EB0__GPIO2_IO28     | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_EIM_EB1__GPIO2_IO29     | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_SD2_DAT2__GPIO1_IO13    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_D0__GPIO2_IO00    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
        /* RDY  used as GPIO */
-       MX6_PAD_EIM_WAIT__GPIO5_IO00    | MUX_PAD_CTRL(WEAK_PULLUP),
+       MX6_PAD_EIM_WAIT__GPIO5_IO00    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
        /* ADDRESS[16] DATA[30]  used as GPIO */
-       MX6_PAD_KEY_ROW4__GPIO4_IO15    | MUX_PAD_CTRL(WEAK_PULLDOWN),
-       MX6_PAD_KEY_COL4__GPIO4_IO14    | MUX_PAD_CTRL(WEAK_PULLUP),
+       MX6_PAD_KEY_ROW4__GPIO4_IO15    | MUX_PAD_CTRL(WEAK_PULLDOWN) |
+                                         MUX_MODE_SION,
+       MX6_PAD_KEY_COL4__GPIO4_IO14    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
        /* CSI pins used as GPIO */
-       MX6_PAD_EIM_A24__GPIO5_IO04     | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_SD2_CMD__GPIO1_IO11     | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_CS2__GPIO6_IO15   | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_EIM_D18__GPIO3_IO18     | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_EIM_A19__GPIO2_IO19     | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_EIM_D29__GPIO3_IO29     | MUX_PAD_CTRL(WEAK_PULLDOWN),
-       MX6_PAD_EIM_A23__GPIO6_IO06     | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_EIM_A20__GPIO2_IO18     | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_EIM_A17__GPIO2_IO21     | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_EIM_A18__GPIO2_IO20     | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_EIM_EB3__GPIO2_IO31     | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_EIM_D17__GPIO3_IO17     | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_SD2_DAT0__GPIO1_IO15    | MUX_PAD_CTRL(WEAK_PULLUP),
+       MX6_PAD_EIM_A24__GPIO5_IO04     | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_SD2_CMD__GPIO1_IO11     | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_CS2__GPIO6_IO15   | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_EIM_D18__GPIO3_IO18     | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_EIM_A19__GPIO2_IO19     | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_EIM_D29__GPIO3_IO29     | MUX_PAD_CTRL(WEAK_PULLDOWN) |
+                                         MUX_MODE_SION,
+       MX6_PAD_EIM_A23__GPIO6_IO06     | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_EIM_A20__GPIO2_IO18     | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_EIM_A17__GPIO2_IO21     | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_EIM_A18__GPIO2_IO20     | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_EIM_EB3__GPIO2_IO31     | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_EIM_D17__GPIO3_IO17     | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_SD2_DAT0__GPIO1_IO15    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
        /* GPIO */
-       MX6_PAD_EIM_D26__GPIO3_IO26     | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_EIM_D27__GPIO3_IO27     | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_D6__GPIO2_IO06    | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_D3__GPIO2_IO03    | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_ENET_REF_CLK__GPIO1_IO23 | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_DI0_PIN4__GPIO4_IO20    | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_SD4_DAT3__GPIO2_IO11    | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_NANDF_D4__GPIO2_IO04    | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_SD4_DAT0__GPIO2_IO08    | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_GPIO_7__GPIO1_IO07      | MUX_PAD_CTRL(WEAK_PULLUP),
-       MX6_PAD_GPIO_8__GPIO1_IO08      | MUX_PAD_CTRL(WEAK_PULLUP),
+       MX6_PAD_EIM_D26__GPIO3_IO26     | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_EIM_D27__GPIO3_IO27     | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_D6__GPIO2_IO06    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_D3__GPIO2_IO03    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_ENET_REF_CLK__GPIO1_IO23 | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_DI0_PIN4__GPIO4_IO20    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_SD4_DAT3__GPIO2_IO11    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_NANDF_D4__GPIO2_IO04    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_SD4_DAT0__GPIO2_IO08    | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_GPIO_7__GPIO1_IO07      | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
+       MX6_PAD_GPIO_8__GPIO1_IO08      | MUX_PAD_CTRL(WEAK_PULLUP) |
+                                         MUX_MODE_SION,
        /* USBH_OC */
        MX6_PAD_EIM_D30__GPIO3_IO30     | MUX_PAD_CTRL(WEAK_PULLUP),
        /* USBC_ID */
@@ -249,8 +264,8 @@ static void setup_iomux_gpio(void)
 }
 
 iomux_v3_cfg_t const usb_pads[] = {
-       /* USB_PE */
-       MX6_PAD_EIM_D31__GPIO3_IO31 | MUX_PAD_CTRL(NO_PAD_CTRL),
+       /* USBH_PEN */
+       MX6_PAD_EIM_D31__GPIO3_IO31 | MUX_PAD_CTRL(NO_PAD_CTRL) | MUX_MODE_SION,
 #      define GPIO_USBH_EN IMX_GPIO_NR(3, 31)
 };
 
@@ -258,14 +273,21 @@ iomux_v3_cfg_t const usb_pads[] = {
  * UARTs are used in DTE mode, switch the mode on all UARTs before
  * any pinmuxing connects a (DCE) output to a transceiver output.
  */
+#define UCR3           0x88    /* FIFO Control Register */
+#define UCR3_RI                BIT(8)  /* RIDELT DTE mode */
+#define UCR3_DCD       BIT(9)  /* DCDDELT DTE mode */
 #define UFCR           0x90    /* FIFO Control Register */
-#define UFCR_DCEDTE    (1<<6)  /* DCE=0 */
+#define UFCR_DCEDTE    BIT(6)  /* DCE=0 */
 
 static void setup_dtemode_uart(void)
 {
        setbits_le32((u32 *)(UART1_BASE + UFCR), UFCR_DCEDTE);
        setbits_le32((u32 *)(UART2_BASE + UFCR), UFCR_DCEDTE);
        setbits_le32((u32 *)(UART3_BASE + UFCR), UFCR_DCEDTE);
+
+       clrbits_le32((u32 *)(UART1_BASE + UCR3), UCR3_DCD | UCR3_RI);
+       clrbits_le32((u32 *)(UART2_BASE + UCR3), UCR3_DCD | UCR3_RI);
+       clrbits_le32((u32 *)(UART3_BASE + UCR3), UCR3_DCD | UCR3_RI);
 }
 
 static void setup_iomux_uart(void)
@@ -280,29 +302,9 @@ int board_ehci_hcd_init(int port)
        imx_iomux_v3_setup_multiple_pads(usb_pads, ARRAY_SIZE(usb_pads));
        return 0;
 }
-
-int board_ehci_power(int port, int on)
-{
-       switch (port) {
-       case 0:
-               /* control OTG power */
-               /* No special PE for USBC, always on when ID pin signals
-                  host mode */
-               break;
-       case 1:
-               /* Control MXM USBH */
-               /* Set MXM USBH power enable, '0' means on */
-               gpio_direction_output(GPIO_USBH_EN, !on);
-               mdelay(100);
-               break;
-       default:
-               break;
-       }
-       return 0;
-}
 #endif
 
-#ifdef CONFIG_FSL_ESDHC
+#if defined(CONFIG_FSL_ESDHC) && defined(CONFIG_SPL_BUILD)
 /* use the following sequence: eMMC, MMC */
 struct fsl_esdhc_cfg usdhc_cfg[CONFIG_SYS_FSL_USDHC_NUM] = {
        {USDHC3_BASE_ADDR},
@@ -316,6 +318,7 @@ int board_mmc_getcd(struct mmc *mmc)
 
        switch (cfg->esdhc_base) {
        case USDHC1_BASE_ADDR:
+               gpio_request(GPIO_MMC_CD, "MMC_CD");
                gpio_direction_input(GPIO_MMC_CD);
                ret = !gpio_get_value(GPIO_MMC_CD);
                break;
@@ -326,37 +329,6 @@ int board_mmc_getcd(struct mmc *mmc)
 
 int board_mmc_init(bd_t *bis)
 {
-#ifndef CONFIG_SPL_BUILD
-       s32 status = 0;
-       u32 index = 0;
-
-       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
-       usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
-
-       usdhc_cfg[0].max_bus_width = 8;
-       usdhc_cfg[1].max_bus_width = 4;
-
-       for (index = 0; index < CONFIG_SYS_FSL_USDHC_NUM; ++index) {
-               switch (index) {
-               case 0:
-                       imx_iomux_v3_setup_multiple_pads(
-                               usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
-                       break;
-               case 1:
-                       imx_iomux_v3_setup_multiple_pads(
-                               usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
-                       break;
-               default:
-                       printf("Warning: you configured more USDHC controllers (%d) then supported by the board (%d)\n",
-                              index + 1, CONFIG_SYS_FSL_USDHC_NUM);
-                       return status;
-               }
-
-               status |= fsl_esdhc_initialize(bis, &usdhc_cfg[index]);
-       }
-
-       return status;
-#else
        struct src *psrc = (struct src *)SRC_BASE_ADDR;
        unsigned reg = readl(&psrc->sbmr1) >> 11;
        /*
@@ -388,9 +360,8 @@ int board_mmc_init(bd_t *bis)
        }
 
        return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
-#endif
 }
-#endif
+#endif /* CONFIG_FSL_ESDHC & CONFIG_SPL_BUILD */
 
 int board_phy_config(struct phy_device *phydev)
 {
@@ -412,6 +383,7 @@ int board_eth_init(bd_t *bis)
        ret = enable_fec_anatop_clock(0, ENET_50MHZ);
        if (ret)
                return ret;
+
        /* set gpr1[ENET_CLK_SEL] */
        setbits_le32(&iomuxc_regs->gpr[1], IOMUXC_GPR1_ENET_CLK_SEL_MASK);
 
@@ -421,6 +393,7 @@ int board_eth_init(bd_t *bis)
        bus = fec_get_miibus(base, -1);
        if (!bus)
                return 0;
+
        /* scan PHY 1..7 */
        phydev = phy_find_by_mask(bus, 0xff, PHY_INTERFACE_MODE_RMII);
        if (!phydev) {
@@ -428,6 +401,7 @@ int board_eth_init(bd_t *bis)
                puts("no PHY found\n");
                return 0;
        }
+
        phy_reset(phydev);
        printf("using PHY at %d\n", phydev->addr);
        ret = fec_probe(bis, -1, base, bus, phydev);
@@ -436,7 +410,8 @@ int board_eth_init(bd_t *bis)
                free(phydev);
                free(bus);
        }
-#endif
+#endif /* CONFIG_FEC_MXC */
+
        return 0;
 }
 
@@ -452,11 +427,12 @@ static iomux_v3_cfg_t const pwr_intb_pads[] = {
 
 static iomux_v3_cfg_t const backlight_pads[] = {
        /* Backlight On */
-       MX6_PAD_EIM_D26__GPIO3_IO26 | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_EIM_D26__GPIO3_IO26 | MUX_PAD_CTRL(NO_PAD_CTRL) | MUX_MODE_SION,
 #define RGB_BACKLIGHT_GP IMX_GPIO_NR(3, 26)
        /* Backlight PWM, used as GPIO in U-Boot */
        MX6_PAD_EIM_A22__GPIO2_IO16  | MUX_PAD_CTRL(NO_PULLUP),
-       MX6_PAD_SD4_DAT1__GPIO2_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_SD4_DAT1__GPIO2_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL) |
+                                      MUX_MODE_SION,
 #define RGB_BACKLIGHTPWM_GP IMX_GPIO_NR(2, 9)
 };
 
@@ -619,6 +595,8 @@ static void setup_display(void)
        imx_iomux_v3_setup_multiple_pads(backlight_pads,
                                         ARRAY_SIZE(backlight_pads));
        /* use 0 for EDT 7", use 1 for LG fullHD panel */
+       gpio_request(RGB_BACKLIGHTPWM_GP, "PWM<A>");
+       gpio_request(RGB_BACKLIGHT_GP, "BL_ON");
        gpio_direction_output(RGB_BACKLIGHTPWM_GP, 0);
        gpio_direction_output(RGB_BACKLIGHT_GP, 1);
 }
@@ -656,9 +634,6 @@ int board_init(void)
        /* address of boot parameters */
        gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
 
-       setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
-       setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info_loc);
-
 #if defined(CONFIG_VIDEO_IPUV3)
        setup_display();
 #endif
@@ -689,16 +664,17 @@ int board_late_init(void)
        env_set("board_rev", env_str);
 #endif
 
-       return 0;
-}
-#endif /* CONFIG_BOARD_LATE_INIT */
+#ifdef CONFIG_CMD_USB_SDP
+       if (is_boot_from_usb()) {
+               printf("Serial Downloader recovery mode, using sdp command\n");
+               env_set("bootdelay", "0");
+               env_set("bootcmd", "sdp 0");
+       }
+#endif /* CONFIG_CMD_USB_SDP */
 
-#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_SYSTEM_SETUP)
-int ft_system_setup(void *blob, bd_t *bd)
-{
        return 0;
 }
-#endif
+#endif /* CONFIG_BOARD_LATE_INIT */
 
 int checkboard(void)
 {
@@ -722,7 +698,18 @@ int checkboard(void)
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
 int ft_board_setup(void *blob, bd_t *bd)
 {
-       return ft_common_board_setup(blob, bd);
+       u32 cma_size;
+
+       ft_common_board_setup(blob, bd);
+
+       cma_size = env_get_ulong("cma-size", 10, 320 * 1024 * 1024);
+       cma_size = min((u32)(gd->ram_size >> 1), cma_size);
+
+       fdt_setprop_u32(blob,
+                       fdt_path_offset(blob, "/reserved-memory/linux,cma"),
+                       "size",
+                       cma_size);
+       return 0;
 }
 #endif
 
@@ -1073,6 +1060,7 @@ static void spl_dram_init(void)
        case TEMP_AUTOMOTIVE:
        default:
                if (is_cpu_type(MXC_CPU_MX6DL)) {
+                       puts("Industrial temperature grade DDR3 timings, 64bit bus width.\n");
                        ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
                } else {
                        puts("Industrial temperature grade DDR3 timings, 32bit bus width.\n");
@@ -1083,6 +1071,26 @@ static void spl_dram_init(void)
        udelay(100);
 }
 
+static iomux_v3_cfg_t const gpio_reset_pad[] = {
+       MX6_PAD_RGMII_RD1__GPIO6_IO27 | MUX_PAD_CTRL(NO_PAD_CTRL) |
+                                       MUX_MODE_SION
+#define GPIO_NRESET IMX_GPIO_NR(6, 27)
+};
+
+#define IMX_RESET_CAUSE_POR 0x00011
+static void nreset_out(void)
+{
+       int reset_cause = get_imx_reset_cause();
+
+       if (reset_cause != IMX_RESET_CAUSE_POR) {
+               imx_iomux_v3_setup_multiple_pads(gpio_reset_pad,
+                                                ARRAY_SIZE(gpio_reset_pad));
+               gpio_direction_output(GPIO_NRESET, 1);
+               udelay(100);
+               gpio_direction_output(GPIO_NRESET, 0);
+       }
+}
+
 void board_init_f(ulong dummy)
 {
        /* setup AIPS and disable watchdog */
@@ -1091,7 +1099,7 @@ void board_init_f(ulong dummy)
        ccgr_init();
        gpr_init();
 
-       /* iomux and setup of i2c */
+       /* iomux */
        board_early_init_f();
 
        /* setup GP timer */
@@ -1109,6 +1117,9 @@ void board_init_f(ulong dummy)
        /* Clear the BSS. */
        memset(__bss_start, 0, __bss_end - __bss_start);
 
+       /* Assert nReset_Out */
+       nreset_out();
+
        /* load/boot image from boot device */
        board_init_r(NULL, 0);
 }
@@ -1117,7 +1128,7 @@ void reset_cpu(ulong addr)
 {
 }
 
-#endif
+#endif /* CONFIG_SPL_BUILD */
 
 static struct mxc_serial_platdata mxc_serial_plat = {
        .reg = (struct mxc_uart *)UART1_BASE,
diff --git a/board/toradex/colibri_imx6/colibri_imx6.cfg b/board/toradex/colibri_imx6/colibri_imx6.cfg
deleted file mode 100644 (file)
index 517c5eb..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright (C) 2013 Boundary Devices
- * Copyright (C) 2014 Toradex AG
- *
- * Refer doc/README.imximage for more details about how-to configure
- * and create imximage boot image
- *
- * The syntax is taken as close as possible with the kwbimage
- */
-
-/* image version */
-IMAGE_VERSION 2
-
-/*
- * Boot Device : one of
- * spi, sd (the board has no nand neither onenand)
- */
-BOOT_FROM      sd
-
-#define __ASSEMBLY__
-#include <config.h>
-#include "asm/arch/mx6-ddr.h"
-#include "asm/arch/iomux.h"
-#include "asm/arch/crm_regs.h"
-
-#include "ddr-setup.cfg"
-
-#if CONFIG_DDR_MB == 256
-#include "800mhz_2x64mx16.cfg"
-#elif CONFIG_DDR_MB == 512
-#include "800mhz_4x64mx16.cfg"
-#else
-#error "unknown DDR size"
-#endif
-
-#include "clocks.cfg"
diff --git a/board/toradex/colibri_imx6/ddr-setup.cfg b/board/toradex/colibri_imx6/ddr-setup.cfg
deleted file mode 100644 (file)
index a943fd2..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright (C) 2013 Boundary Devices
- * Copyright (C) 2014-2016, Toradex AG
- *
- * Device Configuration Data (DCD)
- *
- * Each entry must have the format:
- * Addr-type           Address        Value
- *
- * where:
- *      Addr-type register length (1,2 or 4 bytes)
- *      Address   absolute address of the register
- *      value     value to be stored in the register
- */
-
-/*
- * DDR3 settings
- * MX6Q    ddr is limited to 1066 Mhz  currently 1056 MHz(528 MHz clock),
- *        memory bus width: 64 bits    x16/x32/x64
- * MX6DL   ddr is limited to 800 MHz(400 MHz clock)
- *        memory bus width: 64 bits    x16/x32/x64
- * MX6SOLO ddr is limited to 800 MHz(400 MHz clock)
- *        memory bus width: 32 bits    x16/x32
- */
-DATA 4, MX6_IOM_DRAM_SDQS0, 0x00000030
-DATA 4, MX6_IOM_DRAM_SDQS1, 0x00000030
-DATA 4, MX6_IOM_DRAM_SDQS2, 0x00000030
-DATA 4, MX6_IOM_DRAM_SDQS3, 0x00000030
-DATA 4, MX6_IOM_DRAM_SDQS4, 0x00000030
-DATA 4, MX6_IOM_DRAM_SDQS5, 0x00000030
-DATA 4, MX6_IOM_DRAM_SDQS6, 0x00000030
-DATA 4, MX6_IOM_DRAM_SDQS7, 0x00000030
-
-DATA 4, MX6_IOM_GRP_B0DS, 0x00000030
-DATA 4, MX6_IOM_GRP_B1DS, 0x00000030
-DATA 4, MX6_IOM_GRP_B2DS, 0x00000030
-DATA 4, MX6_IOM_GRP_B3DS, 0x00000030
-DATA 4, MX6_IOM_GRP_B4DS, 0x00000030
-DATA 4, MX6_IOM_GRP_B5DS, 0x00000030
-DATA 4, MX6_IOM_GRP_B6DS, 0x00000030
-DATA 4, MX6_IOM_GRP_B7DS, 0x00000030
-DATA 4, MX6_IOM_GRP_ADDDS, 0x00000030
-/* 40 Ohm drive strength for cs0/1,sdba2,cke0/1,sdwe */
-DATA 4, MX6_IOM_GRP_CTLDS, 0x00000030
-
-DATA 4, MX6_IOM_DRAM_DQM0, 0x00020030
-DATA 4, MX6_IOM_DRAM_DQM1, 0x00020030
-DATA 4, MX6_IOM_DRAM_DQM2, 0x00020030
-DATA 4, MX6_IOM_DRAM_DQM3, 0x00020030
-DATA 4, MX6_IOM_DRAM_DQM4, 0x00020030
-DATA 4, MX6_IOM_DRAM_DQM5, 0x00020030
-DATA 4, MX6_IOM_DRAM_DQM6, 0x00020030
-DATA 4, MX6_IOM_DRAM_DQM7, 0x00020030
-
-DATA 4, MX6_IOM_DRAM_CAS, 0x00020030
-DATA 4, MX6_IOM_DRAM_RAS, 0x00020030
-DATA 4, MX6_IOM_DRAM_SDCLK_0, 0x00020030
-DATA 4, MX6_IOM_DRAM_SDCLK_1, 0x00020030
-
-DATA 4, MX6_IOM_DRAM_RESET, 0x00020030
-DATA 4, MX6_IOM_DRAM_SDCKE0, 0x00003000
-DATA 4, MX6_IOM_DRAM_SDCKE1, 0x00003000
-
-DATA 4, MX6_IOM_DRAM_SDODT0, 0x00003030
-DATA 4, MX6_IOM_DRAM_SDODT1, 0x00003030
-
-/* (differential input) */
-DATA 4, MX6_IOM_DDRMODE_CTL, 0x00020000
-/* (differential input) */
-DATA 4, MX6_IOM_GRP_DDRMODE, 0x00020000
-/* disable ddr pullups */
-DATA 4, MX6_IOM_GRP_DDRPKE, 0x00000000
-DATA 4, MX6_IOM_DRAM_SDBA2, 0x00000000
-/* 40 Ohm drive strength for cs0/1,sdba2,cke0/1,sdwe */
-DATA 4, MX6_IOM_GRP_DDR_TYPE, 0x000C0000
-
-/* Read data DQ Byte0-3 delay */
-DATA 4, MX6_MMDC_P0_MPRDDQBY0DL, 0x33333333
-DATA 4, MX6_MMDC_P0_MPRDDQBY1DL, 0x33333333
-DATA 4, MX6_MMDC_P0_MPRDDQBY2DL, 0x33333333
-DATA 4, MX6_MMDC_P0_MPRDDQBY3DL, 0x33333333
-DATA 4, MX6_MMDC_P1_MPRDDQBY0DL, 0x33333333
-DATA 4, MX6_MMDC_P1_MPRDDQBY1DL, 0x33333333
-DATA 4, MX6_MMDC_P1_MPRDDQBY2DL, 0x33333333
-DATA 4, MX6_MMDC_P1_MPRDDQBY3DL, 0x33333333
-
-/*
- * MDMISC      mirroring       interleaved (row/bank/col)
- */
-/* TODO: check what the RALAT field does */
-DATA 4, MX6_MMDC_P0_MDMISC, 0x00081740
-
-/*
- * MDSCR       con_req
- */
-DATA 4, MX6_MMDC_P0_MDSCR, 0x00008000
index e6793e366a3314e3aa783cb0903c2a00b8cd8f03..22d191f52ae0db3b72995420647aec6d450405ee 100644 (file)
@@ -29,7 +29,7 @@ static int mfgr_fuse(void)
                return CMD_RET_FAILURE;
        }
        /* boot cfg */
-       fuse_prog(0, 5, 0x00005072);
+       fuse_prog(0, 5, 0x00005062);
        /* BT_FUSE_SEL */
        fuse_prog(0, 6, 0x00000010);
        return CMD_RET_SUCCESS;
index fa63865670f40e84d4056c8c98fce68ca8cb68f0..e744243297b0af03f45d2233d7674ea40f2eea0d 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0+
 /*
- * Copyright (C) 2014-2016, Toradex AG
+ * Copyright (C) 2014-2019, Toradex AG
  */
 
 /*
@@ -21,6 +21,8 @@
 /* define for PMIC register dump */
 /*#define DEBUG */
 
+#define WARNBAR "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
+
 /* use GPIO: EXT_IO1 to switch on VPGM, ON: 1 */
 static __maybe_unused iomux_v3_cfg_t const pmic_prog_pads[] = {
        MX6_PAD_NANDF_D3__GPIO2_IO03 | MUX_PAD_CTRL(NO_PAD_CTRL),
@@ -29,37 +31,128 @@ static __maybe_unused iomux_v3_cfg_t const pmic_prog_pads[] = {
 
 unsigned pmic_init(void)
 {
+       int rc;
+       struct udevice *dev = NULL;
        unsigned programmed = 0;
        uchar bus = 1;
        uchar devid, revid, val;
 
-       puts("PMIC: ");
-       if (!((0 == i2c_set_bus_num(bus)) &&
-             (0 == i2c_probe(PFUZE100_I2C_ADDR)))) {
-               puts("i2c bus failed\n");
+       puts("PMIC:  ");
+       rc = i2c_get_chip_for_busnum(bus, PFUZE100_I2C_ADDR, 1, &dev);
+       if (rc) {
+               printf("failed to get device for PMIC at address 0x%x\n",
+                      PFUZE100_I2C_ADDR);
+               return 0;
+       }
+
+       /* check for errors in PMIC fuses */
+       if (dm_i2c_read(dev, PFUZE100_INTSTAT3, &val, 1) < 0) {
+               puts("i2c pmic INTSTAT3 register read failed\n");
                return 0;
        }
+       if (val & PFUZE100_BIT_OTP_ECCI) {
+               puts("\n" WARNBAR);
+               puts("WARNING: ecc errors found in pmic fuse banks\n");
+               puts(WARNBAR);
+       }
+       if (dm_i2c_read(dev, PFUZE100_OTP_ECC_SE1, &val, 1) < 0) {
+               puts("i2c pmic ECC_SE1 register read failed\n");
+               return 0;
+       }
+       if (val & PFUZE100_BITS_ECC_SE1) {
+               puts(WARNBAR);
+               puts("WARNING: ecc has made bit corrections in banks 1 to 5\n");
+               puts(WARNBAR);
+       }
+       if (dm_i2c_read(dev, PFUZE100_OTP_ECC_SE2, &val, 1) < 0) {
+               puts("i2c pmic ECC_SE2 register read failed\n");
+               return 0;
+       }
+       if (val & PFUZE100_BITS_ECC_SE2) {
+               puts(WARNBAR);
+               puts("WARNING: ecc has made bit corrections in banks 6 to 10\n"
+                   );
+               puts(WARNBAR);
+       }
+       if (dm_i2c_read(dev, PFUZE100_OTP_ECC_DE1, &val, 1) < 0) {
+               puts("i2c pmic ECC_DE register read failed\n");
+               return 0;
+       }
+       if (val & PFUZE100_BITS_ECC_DE1) {
+               puts(WARNBAR);
+               puts("ERROR: banks 1 to 5 have uncorrectable bits\n");
+               puts(WARNBAR);
+       }
+       if (dm_i2c_read(dev, PFUZE100_OTP_ECC_DE2, &val, 1) < 0) {
+               puts("i2c pmic ECC_DE register read failed\n");
+               return 0;
+       }
+       if (val & PFUZE100_BITS_ECC_DE2) {
+               puts(WARNBAR);
+               puts("ERROR: banks 6 to 10 have uncorrectable bits\n");
+               puts(WARNBAR);
+       }
+
        /* get device ident */
-       if (i2c_read(PFUZE100_I2C_ADDR, PFUZE100_DEVICEID, 1, &devid, 1) < 0) {
+       if (dm_i2c_read(dev, PFUZE100_DEVICEID, &devid, 1) < 0) {
                puts("i2c pmic devid read failed\n");
                return 0;
        }
-       if (i2c_read(PFUZE100_I2C_ADDR, PFUZE100_REVID, 1, &revid, 1) < 0) {
+       if (dm_i2c_read(dev, PFUZE100_REVID, &revid, 1) < 0) {
                puts("i2c pmic revid read failed\n");
                return 0;
        }
-       printf("device id: 0x%.2x, revision id: 0x%.2x\n", devid, revid);
+       printf("device id: 0x%.2x, revision id: 0x%.2x, ", devid, revid);
+
+       /* get device programmed state */
+       val = PFUZE100_PAGE_REGISTER_PAGE1;
+       if (dm_i2c_write(dev, PFUZE100_PAGE_REGISTER, &val, 1)) {
+               puts("i2c write failed\n");
+               return 0;
+       }
+       if (dm_i2c_read(dev, PFUZE100_FUSE_POR1, &val, 1) < 0) {
+               puts("i2c fuse_por read failed\n");
+               return 0;
+       }
+       if (val & PFUZE100_FUSE_POR_M)
+               programmed++;
+
+       if (dm_i2c_read(dev, PFUZE100_FUSE_POR2, &val, 1) < 0) {
+               puts("i2c fuse_por read failed\n");
+               return programmed;
+       }
+       if (val & PFUZE100_FUSE_POR_M)
+               programmed++;
+
+       if (dm_i2c_read(dev, PFUZE100_FUSE_POR3, &val, 1) < 0) {
+               puts("i2c fuse_por read failed\n");
+               return programmed;
+       }
+       if (val & PFUZE100_FUSE_POR_M)
+               programmed++;
+
+       switch (programmed) {
+       case 0:
+               puts("not programmed\n");
+               break;
+       case 3:
+               puts("programmed\n");
+               break;
+       default:
+               puts("undefined programming state\n");
+               break;
+       }
 
 #ifdef DEBUG
        {
-               unsigned i, j;
+               unsigned int i, j;
 
                for (i = 0; i < 16; i++)
                        printf("\t%x", i);
                for (j = 0; j < 0x80; ) {
                        printf("\n%2x", j);
                        for (i = 0; i < 16; i++) {
-                               i2c_read(PFUZE100_I2C_ADDR, j+i, 1, &val, 1);
+                               dm_i2c_read(dev, j + i, &val, 1);
                                printf("\t%2x", val);
                        }
                        j += 0x10;
@@ -67,8 +160,7 @@ unsigned pmic_init(void)
                printf("\nEXT Page 1");
 
                val = PFUZE100_PAGE_REGISTER_PAGE1;
-               if (i2c_write(PFUZE100_I2C_ADDR, PFUZE100_PAGE_REGISTER, 1,
-                             &val, 1)) {
+               if (dm_i2c_write(dev, PFUZE100_PAGE_REGISTER, &val, 1)) {
                        puts("i2c write failed\n");
                        return 0;
                }
@@ -76,7 +168,7 @@ unsigned pmic_init(void)
                for (j = 0x80; j < 0x100; ) {
                        printf("\n%2x", j);
                        for (i = 0; i < 16; i++) {
-                               i2c_read(PFUZE100_I2C_ADDR, j+i, 1, &val, 1);
+                               dm_i2c_read(dev, j + i, &val, 1);
                                printf("\t%2x", val);
                        }
                        j += 0x10;
@@ -84,8 +176,7 @@ unsigned pmic_init(void)
                printf("\nEXT Page 2");
 
                val = PFUZE100_PAGE_REGISTER_PAGE2;
-               if (i2c_write(PFUZE100_I2C_ADDR, PFUZE100_PAGE_REGISTER, 1,
-                             &val, 1)) {
+               if (dm_i2c_write(dev, PFUZE100_PAGE_REGISTER, &val, 1)) {
                        puts("i2c write failed\n");
                        return 0;
                }
@@ -93,52 +184,14 @@ unsigned pmic_init(void)
                for (j = 0x80; j < 0x100; ) {
                        printf("\n%2x", j);
                        for (i = 0; i < 16; i++) {
-                               i2c_read(PFUZE100_I2C_ADDR, j+i, 1, &val, 1);
+                               dm_i2c_read(dev, j + i, &val, 1);
                                printf("\t%2x", val);
                        }
                        j += 0x10;
                }
                printf("\n");
        }
-#endif
-       /* get device programmed state */
-       val = PFUZE100_PAGE_REGISTER_PAGE1;
-       if (i2c_write(PFUZE100_I2C_ADDR, PFUZE100_PAGE_REGISTER, 1, &val, 1)) {
-               puts("i2c write failed\n");
-               return 0;
-       }
-       if (i2c_read(PFUZE100_I2C_ADDR, PFUZE100_FUSE_POR1, 1, &val, 1) < 0) {
-               puts("i2c fuse_por read failed\n");
-               return 0;
-       }
-       if (val & PFUZE100_FUSE_POR_M)
-               programmed++;
-
-       if (i2c_read(PFUZE100_I2C_ADDR, PFUZE100_FUSE_POR2, 1, &val, 1) < 0) {
-               puts("i2c fuse_por read failed\n");
-               return programmed;
-       }
-       if (val & PFUZE100_FUSE_POR_M)
-               programmed++;
-
-       if (i2c_read(PFUZE100_I2C_ADDR, PFUZE100_FUSE_POR3, 1, &val, 1) < 0) {
-               puts("i2c fuse_por read failed\n");
-               return programmed;
-       }
-       if (val & PFUZE100_FUSE_POR_M)
-               programmed++;
-
-       switch (programmed) {
-       case 0:
-               printf("PMIC: not programmed\n");
-               break;
-       case 3:
-               printf("PMIC: programmed\n");
-               break;
-       default:
-               printf("PMIC: undefined programming state\n");
-               break;
-       }
+#endif /* DEBUG */
 
        return programmed;
 }
@@ -146,6 +199,8 @@ unsigned pmic_init(void)
 #ifndef CONFIG_SPL_BUILD
 static int pf0100_prog(void)
 {
+       int rc;
+       struct udevice *dev = NULL;
        unsigned char bus = 1;
        unsigned char val;
        unsigned int i;
@@ -159,9 +214,10 @@ static int pf0100_prog(void)
                                         ARRAY_SIZE(pmic_prog_pads));
        gpio_direction_output(PMIC_PROG_VOLTAGE, 0);
 
-       if (!((0 == i2c_set_bus_num(bus)) &&
-             (0 == i2c_probe(PFUZE100_I2C_ADDR)))) {
-               puts("i2c bus failed\n");
+       rc = i2c_get_chip_for_busnum(bus, PFUZE100_I2C_ADDR, 1, &dev);
+       if (rc) {
+               printf("failed to get device for PMIC at address 0x%x\n",
+                      PFUZE100_I2C_ADDR);
                return CMD_RET_FAILURE;
        }
 
@@ -169,8 +225,7 @@ static int pf0100_prog(void)
                switch (pmic_otp_prog[i].cmd) {
                case pmic_i2c:
                        val = (unsigned char) (pmic_otp_prog[i].value & 0xff);
-                       if (i2c_write(PFUZE100_I2C_ADDR, pmic_otp_prog[i].reg,
-                                     1, &val, 1)) {
+                       if (dm_i2c_write(dev, pmic_otp_prog[i].reg, &val, 1)) {
                                printf("i2c write failed, reg 0x%2x, value 0x%2x\n",
                                       pmic_otp_prog[i].reg, val);
                                return CMD_RET_FAILURE;
@@ -209,4 +264,4 @@ U_BOOT_CMD(
        "Program the OTP fuses on the PMIC PF0100",
        ""
 );
-#endif
+#endif /* CONFIG_SPL_BUILD */
index c0efb79bbc987761b37dffcff84d4b6b214886e7..925762051104b828f689d477db809cc182ac8592 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0+ */
 /*
- * Copyright (C) 2014-2016, Toradex AG
+ * Copyright (C) 2014-2019, Toradex AG
  */
 
 /*
 #ifndef PF0100_H_
 #define PF0100_H_
 
+/* bit definitions */
+#define PFUZE100_BIT_0                 (0x01 << 0)
+#define PFUZE100_BIT_1                 (0x01 << 1)
+#define PFUZE100_BIT_2                 (0x01 << 2)
+#define PFUZE100_BIT_3                 (0x01 << 3)
+#define PFUZE100_BIT_4                 (0x01 << 4)
+#define PFUZE100_BIT_5                 (0x01 << 5)
+#define PFUZE100_BIT_6                 (0x01 << 6)
+#define PFUZE100_BIT_7                 (0x01 << 7)
+
 /* 7-bit I2C bus slave address */
 #define PFUZE100_I2C_ADDR              (0x08)
 /* Register Addresses */
 #define PFUZE100_DEVICEID              (0x0)
 #define PFUZE100_REVID                 (0x3)
+#define PFUZE100_INTSTAT3              (0xe)
+#define PFUZE100_BIT_OTP_ECCI          PFUZE100_BIT_7
 #define PFUZE100_SW1AMODE              (0x23)
 #define PFUZE100_SW1ACON               36
 #define PFUZE100_SW1ACON_SPEED_VAL     (0x1<<6)        /*default */
 #define PFUZE100_PAGE_REGISTER_PAGE2   (0x02 & PFUZE100_PAGE_REGISTER_PAGE_M)
 
 /* extended page 1 */
+#define PFUZE100_OTP_ECC_SE1           0x8a
+#define PFUZE100_BIT_ECC1_SE           PFUZE100_BIT_0
+#define PFUZE100_BIT_ECC2_SE           PFUZE100_BIT_1
+#define PFUZE100_BIT_ECC3_SE           PFUZE100_BIT_2
+#define PFUZE100_BIT_ECC4_SE           PFUZE100_BIT_3
+#define PFUZE100_BIT_ECC5_SE           PFUZE100_BIT_4
+#define PFUZE100_BITS_ECC_SE1          ((PFUZE100_BIT_ECC1_SE) | \
+                                       (PFUZE100_BIT_ECC2_SE) | \
+                                       (PFUZE100_BIT_ECC3_SE) | \
+                                       (PFUZE100_BIT_ECC4_SE) | \
+                                       (PFUZE100_BIT_ECC5_SE))
+#define PFUZE100_OTP_ECC_SE2           0x8b
+#define PFUZE100_BIT_ECC6_SE           PFUZE100_BIT_0
+#define PFUZE100_BIT_ECC7_SE           PFUZE100_BIT_1
+#define PFUZE100_BIT_ECC8_SE           PFUZE100_BIT_2
+#define PFUZE100_BIT_ECC9_SE           PFUZE100_BIT_3
+#define PFUZE100_BIT_ECC10_SE          PFUZE100_BIT_4
+#define PFUZE100_BITS_ECC_SE2          ((PFUZE100_BIT_ECC6_SE) | \
+                                       (PFUZE100_BIT_ECC7_SE) | \
+                                       (PFUZE100_BIT_ECC8_SE) | \
+                                       (PFUZE100_BIT_ECC9_SE) | \
+                                       (PFUZE100_BIT_ECC10_SE))
+#define PFUZE100_OTP_ECC_DE1           0x8c
+#define PFUZE100_BIT_ECC1_DE           PFUZE100_BIT_0
+#define PFUZE100_BIT_ECC2_DE           PFUZE100_BIT_1
+#define PFUZE100_BIT_ECC3_DE           PFUZE100_BIT_2
+#define PFUZE100_BIT_ECC4_DE           PFUZE100_BIT_3
+#define PFUZE100_BIT_ECC5_DE           PFUZE100_BIT_4
+#define PFUZE100_BITS_ECC_DE1          ((PFUZE100_BIT_ECC1_DE) | \
+                                       (PFUZE100_BIT_ECC2_DE) | \
+                                       (PFUZE100_BIT_ECC3_DE) | \
+                                       (PFUZE100_BIT_ECC4_DE) | \
+                                       (PFUZE100_BIT_ECC5_DE))
+#define PFUZE100_OTP_ECC_DE2           0x8d
+#define PFUZE100_BIT_ECC6_DE           PFUZE100_BIT_0
+#define PFUZE100_BIT_ECC7_DE           PFUZE100_BIT_1
+#define PFUZE100_BIT_ECC8_DE           PFUZE100_BIT_2
+#define PFUZE100_BIT_ECC9_DE           PFUZE100_BIT_3
+#define PFUZE100_BIT_ECC10_DE          PFUZE100_BIT_4
+#define PFUZE100_BITS_ECC_DE2          ((PFUZE100_BIT_ECC6_DE) | \
+                                       (PFUZE100_BIT_ECC7_DE) | \
+                                       (PFUZE100_BIT_ECC8_DE) | \
+                                       (PFUZE100_BIT_ECC9_DE) | \
+                                       (PFUZE100_BIT_ECC10_DE))
 #define PFUZE100_FUSE_POR1             0xe4
 #define PFUZE100_FUSE_POR2             0xe5
 #define PFUZE100_FUSE_POR3             0xe6
 #define PFUZE100_FUSE_POR_M            (0x1 << 1)
 
-
 /* output some informational messages, return the number FUSE_POR=1 */
 /* i.e. 0: unprogrammed, 3: programmed, other: undefined prog. state */
 unsigned pmic_init(void);
index ce29b95ae2a7d48bfb9b8a98c8309fecdfa01364..c3b1f67f815a203987e8fd76a9fecb541502c2c5 100644 (file)
@@ -5,16 +5,17 @@
 
 // Register Output for PF0100 programmer
 // Customer: Toradex AG
-// Program: Colibri iMX6
+// Program: Colibri iMX6 V1.1
 // Sample marking:
-// Date: 24.07.2015
-// Time: 10:52:58
+// Date: 01.05.2017
+// Time: 16:22:32
 // Generated from Spreadsheet Revision: P1.8
 
-/* sed commands to get from programmer script to struct */
+/* sed commands to get from programmer script to struct content */
 /* sed -e 's/^WRITE_I2C:\(..\):\(..\)/\{pmic_i2c, 0x\1, 0x\2\},/g' -e 's/^DELAY:\([0-9]*\)/\{pmic_delay, 0, \1\},/g' pf0100_otp_Colibri_iMX6.txt > pf0100_otp.inc
    sed -i -e 's/^VPGM:ON/\{pmic_vpgm, 0, 1},/g' -e 's/^VPGM:OFF/\{pmic_vpgm, 0, 0},/g' pf0100_otp.inc
-   sed -i -e 's/^PWRON: HIGH/\{pmic_pwr, 0, 1},/g' -e 's/^PWRON:LOW/\{pmic_pwr, 0, 0},/g' pf0100_otp.inc */
+   sed -i -e 's/^PWRON: HIGH/\{pmic_pwr, 0, 1},/g' -e 's/^PWRON:LOW/\{pmic_pwr, 0, 0},/g' pf0100_otp.inc
+*/
 
 enum { pmic_i2c, pmic_delay, pmic_vpgm, pmic_pwr };
 struct pmic_otp_prog_t{
@@ -47,7 +48,8 @@ struct pmic_otp_prog_t pmic_otp_prog[] = {
 {pmic_i2c, 0xC8, 0x0E}, // Auto gen from Row134
 {pmic_i2c, 0xCC, 0x0E}, // Auto gen from Row138
 {pmic_i2c, 0xCD, 0x05}, // Auto gen from Row139
-{pmic_i2c, 0xD0, 0x0C}, // Auto gen from Row142
+{pmic_i2c, 0xD0, 0x0F}, // Auto gen from Row142
+{pmic_i2c, 0xD1, 0x05}, // Auto gen from Row143
 {pmic_i2c, 0xD5, 0x07}, // Auto gen from Row147
 {pmic_i2c, 0xD8, 0x07}, // Auto gen from Row150
 {pmic_i2c, 0xD9, 0x06}, // Auto gen from Row151
@@ -185,4 +187,4 @@ struct pmic_otp_prog_t pmic_otp_prog[] = {
 {pmic_delay, 0, 500},
 {pmic_pwr, 0, 1},
 #endif
-};
\ No newline at end of file
+};
index a1217a47bdca9e702f7a20fdf68f3450e9dab531..3ee2b331526dfcc77af6cb0c583fc4401d756171 100644 (file)
@@ -1,10 +1,12 @@
 Colibri VFxx
 M:     Stefan Agner <stefan.agner@toradex.com>
+W:     http://developer.toradex.com/software/linux/linux-software
+W:      https://www.toradex.com/community
 S:     Maintained
 F:     board/toradex/colibri_vf/
 F:     include/configs/colibri_vf.h
 F:     configs/colibri_vf_defconfig
-F:     configs/colibri_vf_dtb_defconfig
 F:     arch/arm/dts/vf-colibri.dtsi
+F:     arch/arm/dts/vf-colibri-u-boot.dtsi
 F:     arch/arm/dts/vf500-colibri.dts
 F:     arch/arm/dts/vf610-colibri.dts
index 79f702f2bf104cbda6da572f4815c706f5d50c71..9d63fbf3bd1120a202a40dbfb4d5c93189c818e5 100644 (file)
@@ -1,48 +1,41 @@
 // SPDX-License-Identifier: GPL-2.0+
 /*
- * Copyright 2015 Toradex, Inc.
+ * Copyright 2015-2019 Toradex, Inc.
  *
  * Based on vf610twr.c:
  * Copyright 2013 Freescale Semiconductor, Inc.
  */
 
 #include <common.h>
-#include <asm/io.h>
+
+#include <asm/arch/clock.h>
+#include <asm/arch/crm_regs.h>
+#include <asm/arch/ddrmc-vf610.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/iomux-vf610.h>
-#include <asm/arch/ddrmc-vf610.h>
-#include <asm/arch/crm_regs.h>
-#include <asm/arch/clock.h>
-#include <mmc.h>
+#include <asm/gpio.h>
+#include <asm/io.h>
 #include <fdt_support.h>
-#include <fsl_esdhc.h>
 #include <fsl_dcu_fb.h>
+#include <g_dnl.h>
 #include <jffs2/load_kernel.h>
-#include <miiphy.h>
 #include <mtd_node.h>
-#include <netdev.h>
-#include <i2c.h>
-#include <g_dnl.h>
-#include <asm/gpio.h>
 #include <usb.h>
+
 #include "../common/tdx-common.h"
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
-                       PAD_CTL_DSE_25ohm | PAD_CTL_OBE_IBE_ENABLE)
-
-#define ESDHC_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_HIGH | \
-                       PAD_CTL_DSE_20ohm | PAD_CTL_OBE_IBE_ENABLE)
-
-#define ENET_PAD_CTRL  (PAD_CTL_PUS_47K_UP | PAD_CTL_SPEED_HIGH | \
-                       PAD_CTL_DSE_50ohm | PAD_CTL_OBE_IBE_ENABLE)
-
-#define USB_PEN_GPIO           83
-#define USB_CDET_GPIO          102
 #define PTC0_GPIO_45           45
 
 static struct ddrmc_cr_setting colibri_vf_cr_settings[] = {
+       { DDRMC_CR79_CTLUPD_AREF(1), 79 },
+       /* sets manual values for read lvl. (gate) delay of data slice 0/1 */
+       { DDRMC_CR105_RDLVL_DL_0(28), 105 },
+       { DDRMC_CR106_RDLVL_GTDL_0(24), 106 },
+       { DDRMC_CR110_RDLVL_DL_1(28) | DDRMC_CR110_RDLVL_GTDL_1(24), 110 },
+       { DDRMC_CR102_RDLVL_GT_REGEN | DDRMC_CR102_RDLVL_REG_EN, 102 },
+
        /* AXI */
        { DDRMC_CR117_AXI0_W_PRI(0) | DDRMC_CR117_AXI0_R_PRI(0), 117 },
        { DDRMC_CR118_AXI1_W_PRI(1) | DDRMC_CR118_AXI1_R_PRI(1), 118 },
@@ -89,11 +82,6 @@ static struct ddrmc_cr_setting colibri_vf_cr_settings[] = {
        { 0, -1 }
 };
 
-static const iomux_v3_cfg_t usb_pads[] = {
-       VF610_PAD_PTD4__GPIO_83,
-       VF610_PAD_PTC29__GPIO_102,
-};
-
 int dram_init(void)
 {
        static const struct ddr3_jedec_timings timings = {
@@ -120,15 +108,21 @@ int dram_init(void)
                .tras_lockout      = 0,
                .tdal              = 12,
                .bstlen            = 3,
-               .tdll              = 512,
+               .tdll              = 512, /* not applicable since freq. scaling
+                                          * is not used
+                                          */
                .trp_ab            = 6,
                .tref              = 3120,
                .trfc              = 64,
                .tref_int          = 0,
                .tpdex             = 3,
                .txpdll            = 10,
-               .txsnr             = 48,
-               .txsr              = 468,
+               .txsnr             = 68,  /* changed to conform to JEDEC
+                                          * specifications
+                                          */
+               .txsr              = 506, /* changed to conform to JEDEC
+                                          * specifications
+                                          */
                .cksrx             = 5,
                .cksre             = 5,
                .freq_chg_en       = 0,
@@ -147,92 +141,12 @@ int dram_init(void)
                .wldqsen           = 25,
        };
 
-       ddrmc_setup_iomux(NULL, 0);
-
        ddrmc_ctrl_init_ddr3(&timings, colibri_vf_cr_settings, NULL, 1, 2);
        gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
 
        return 0;
 }
 
-static void setup_iomux_uart(void)
-{
-       static const iomux_v3_cfg_t uart_pads[] = {
-               NEW_PAD_CTRL(VF610_PAD_PTB4__UART1_TX, UART_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTB5__UART1_RX, UART_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTB10__UART0_TX, UART_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTB11__UART0_RX, UART_PAD_CTRL),
-       };
-
-       imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
-}
-
-static void setup_iomux_enet(void)
-{
-       static const iomux_v3_cfg_t enet0_pads[] = {
-               NEW_PAD_CTRL(VF610_PAD_PTA6__RMII0_CLKOUT, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC10__RMII1_MDIO, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC9__RMII1_MDC, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC11__RMII1_CRS_DV, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC12__RMII1_RD1, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC13__RMII1_RD0, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC14__RMII1_RXER, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC15__RMII1_TD1, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC16__RMII1_TD0, ENET_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTC17__RMII1_TXEN, ENET_PAD_CTRL),
-       };
-
-       imx_iomux_v3_setup_multiple_pads(enet0_pads, ARRAY_SIZE(enet0_pads));
-}
-
-static void setup_iomux_i2c(void)
-{
-       static const iomux_v3_cfg_t i2c0_pads[] = {
-               VF610_PAD_PTB14__I2C0_SCL,
-               VF610_PAD_PTB15__I2C0_SDA,
-       };
-
-       imx_iomux_v3_setup_multiple_pads(i2c0_pads, ARRAY_SIZE(i2c0_pads));
-}
-
-#ifdef CONFIG_NAND_VF610_NFC
-static void setup_iomux_nfc(void)
-{
-       static const iomux_v3_cfg_t nfc_pads[] = {
-               VF610_PAD_PTD23__NF_IO7,
-               VF610_PAD_PTD22__NF_IO6,
-               VF610_PAD_PTD21__NF_IO5,
-               VF610_PAD_PTD20__NF_IO4,
-               VF610_PAD_PTD19__NF_IO3,
-               VF610_PAD_PTD18__NF_IO2,
-               VF610_PAD_PTD17__NF_IO1,
-               VF610_PAD_PTD16__NF_IO0,
-               VF610_PAD_PTB24__NF_WE_B,
-               VF610_PAD_PTB25__NF_CE0_B,
-               VF610_PAD_PTB27__NF_RE_B,
-               VF610_PAD_PTC26__NF_RB_B,
-               VF610_PAD_PTC27__NF_ALE,
-               VF610_PAD_PTC28__NF_CLE
-       };
-
-       imx_iomux_v3_setup_multiple_pads(nfc_pads, ARRAY_SIZE(nfc_pads));
-}
-#endif
-
-#ifdef CONFIG_FSL_DSPI
-static void setup_iomux_dspi(void)
-{
-       static const iomux_v3_cfg_t dspi1_pads[] = {
-               VF610_PAD_PTD5__DSPI1_CS0,
-               VF610_PAD_PTD6__DSPI1_SIN,
-               VF610_PAD_PTD7__DSPI1_SOUT,
-               VF610_PAD_PTD8__DSPI1_SCK,
-       };
-
-       imx_iomux_v3_setup_multiple_pads(dspi1_pads, ARRAY_SIZE(dspi1_pads));
-}
-#endif
-
 #ifdef CONFIG_VYBRID_GPIO
 static void setup_iomux_gpio(void)
 {
@@ -331,37 +245,6 @@ static void setup_tcon(void)
 }
 #endif
 
-#ifdef CONFIG_FSL_ESDHC
-struct fsl_esdhc_cfg esdhc_cfg[1] = {
-       {ESDHC1_BASE_ADDR},
-};
-
-int board_mmc_getcd(struct mmc *mmc)
-{
-       /* eSDHC1 is always present */
-       return 1;
-}
-
-int board_mmc_init(bd_t *bis)
-{
-       static const iomux_v3_cfg_t esdhc1_pads[] = {
-               NEW_PAD_CTRL(VF610_PAD_PTA24__ESDHC1_CLK, ESDHC_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTA25__ESDHC1_CMD, ESDHC_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTA26__ESDHC1_DAT0, ESDHC_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTA27__ESDHC1_DAT1, ESDHC_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTA28__ESDHC1_DAT2, ESDHC_PAD_CTRL),
-               NEW_PAD_CTRL(VF610_PAD_PTA29__ESDHC1_DAT3, ESDHC_PAD_CTRL),
-       };
-
-       esdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
-
-       imx_iomux_v3_setup_multiple_pads(
-               esdhc1_pads, ARRAY_SIZE(esdhc1_pads));
-
-       return fsl_esdhc_initialize(bis, &esdhc_cfg[0]);
-}
-#endif
-
 static inline int is_colibri_vf61(void)
 {
        struct mscm *mscm = (struct mscm *)MSCM_BASE_ADDR;
@@ -394,7 +277,7 @@ static void clock_init(void)
                        CCM_CCGR3_ANADIG_CTRL_MASK | CCM_CCGR3_SCSC_CTRL_MASK);
        clrsetbits_le32(&ccm->ccgr4, CCM_REG_CTRL_MASK,
                        CCM_CCGR4_WKUP_CTRL_MASK | CCM_CCGR4_CCM_CTRL_MASK |
-                       CCM_CCGR4_GPC_CTRL_MASK | CCM_CCGR4_I2C0_CTRL_MASK);
+                       CCM_CCGR4_GPC_CTRL_MASK);
        clrsetbits_le32(&ccm->ccgr6, CCM_REG_CTRL_MASK,
                        CCM_CCGR6_OCOTP_CTRL_MASK | CCM_CCGR6_DDRMC_CTRL_MASK);
        clrsetbits_le32(&ccm->ccgr7, CCM_REG_CTRL_MASK,
@@ -483,34 +366,15 @@ static void mscm_init(void)
                writew(MSCM_IRSPRC_CP0_EN, &mscmir->irsprc[i]);
 }
 
-int board_phy_config(struct phy_device *phydev)
-{
-       if (phydev->drv->config)
-               phydev->drv->config(phydev);
-
-       return 0;
-}
-
 int board_early_init_f(void)
 {
        clock_init();
        mscm_init();
 
-       setup_iomux_uart();
-       setup_iomux_enet();
-       setup_iomux_i2c();
-#ifdef CONFIG_NAND_VF610_NFC
-       setup_iomux_nfc();
-#endif
-
 #ifdef CONFIG_VYBRID_GPIO
        setup_iomux_gpio();
 #endif
 
-#ifdef CONFIG_FSL_DSPI
-       setup_iomux_dspi();
-#endif
-
 #ifdef CONFIG_VIDEO_FSL_DCU_FB
        setup_tcon();
        setup_iomux_fsl_dcu();
@@ -548,22 +412,17 @@ int board_init(void)
         * so we must use the external oscillator in order
         * to maintain correct time in the hwclock
         */
-
        setbits_le32(&scsc->sosc_ctr, SCSC_SOSC_CTR_SOSC_EN);
 
-#ifdef CONFIG_USB_EHCI_VF
-       gpio_request(USB_CDET_GPIO, "usb-cdet-gpio");
-#endif
-
        return 0;
 }
 
 int checkboard(void)
 {
        if (is_colibri_vf61())
-               puts("Board: Colibri VF61\n");
+               puts("Model: Toradex Colibri VF61\n");
        else
-               puts("Board: Colibri VF50\n");
+               puts("Model: Toradex Colibri VF50\n");
 
        return 0;
 }
@@ -591,49 +450,6 @@ int ft_board_setup(void *blob, bd_t *bd)
 }
 #endif
 
-#ifdef CONFIG_USB_EHCI_VF
-int board_ehci_hcd_init(int port)
-{
-       imx_iomux_v3_setup_multiple_pads(usb_pads, ARRAY_SIZE(usb_pads));
-
-       switch (port) {
-       case 0:
-               /* USBC does not have PEN, also configured as USB client only */
-               break;
-       case 1:
-               gpio_request(USB_PEN_GPIO, "usb-pen-gpio");
-               gpio_direction_output(USB_PEN_GPIO, 0);
-               break;
-       }
-       return 0;
-}
-
-int board_usb_phy_mode(int port)
-{
-       switch (port) {
-       case 0:
-               /*
-                * Port 0 is used only in client mode on Colibri Vybrid modules
-                * Check for state of USB client gpio pin and accordingly return
-                * USB_INIT_DEVICE or USB_INIT_HOST.
-                */
-               if (gpio_get_value(USB_CDET_GPIO))
-                       return USB_INIT_DEVICE;
-               else
-                       return USB_INIT_HOST;
-       case 1:
-               /* Port 1 is used only in host mode on Colibri Vybrid modules */
-               return USB_INIT_HOST;
-       default:
-               /*
-                * There are only two USB controllers on Vybrid. Ideally we will
-                * not reach here. However return USB_INIT_HOST if we do.
-                */
-               return USB_INIT_HOST;
-       }
-}
-#endif
-
 /*
  * Backlight off before OS handover
  */
index d4f5b1803ad68fb376020a0df800f7bbc14936ea..b90077bedc00026cdb46b846e8e6d0ebf5e751c9 100644 (file)
@@ -261,7 +261,7 @@ int read_tdx_cfg_block(void)
        }
 
        /* Cap product id to avoid issues with a yet unknown one */
-       if (tdx_hw_tag.prodid > (sizeof(toradex_modules) /
+       if (tdx_hw_tag.prodid >= (sizeof(toradex_modules) /
                                  sizeof(toradex_modules[0])))
                tdx_hw_tag.prodid = 0;
 
@@ -418,6 +418,7 @@ static int do_cfgblock_create(cmd_tbl_t *cmdtp, int flag, int argc,
        int offset = 0;
        int ret = CMD_RET_SUCCESS;
        int err;
+       int force_overwrite = 0;
 
        /* Allocate RAM area for config block */
        config_block = memalign(ARCH_DMA_MINALIGN, size);
@@ -428,6 +429,11 @@ static int do_cfgblock_create(cmd_tbl_t *cmdtp, int flag, int argc,
 
        memset(config_block, 0xff, size);
 
+       if (argc >= 3) {
+               if (argv[2][0] == '-' && argv[2][1] == 'y')
+                       force_overwrite = 1;
+       }
+
        read_tdx_cfg_block();
        if (valid_cfgblock) {
 #if defined(CONFIG_TDX_CFG_BLOCK_IS_IN_NAND)
@@ -448,24 +454,31 @@ static int do_cfgblock_create(cmd_tbl_t *cmdtp, int flag, int argc,
                       CONFIG_TDX_CFG_BLOCK_OFFSET);
                goto out;
 #else
-               char message[CONFIG_SYS_CBSIZE];
-               sprintf(message,
-                       "A valid Toradex config block is present, still recreate? [y/N] ");
+               if (!force_overwrite) {
+                       char message[CONFIG_SYS_CBSIZE];
 
-               if (!cli_readline(message))
-                       goto out;
+                       sprintf(message,
+                               "A valid Toradex config block is present, still recreate? [y/N] ");
 
-               if (console_buffer[0] != 'y' && console_buffer[0] != 'Y')
-                       goto out;
+                       if (!cli_readline(message))
+                               goto out;
+
+                       if (console_buffer[0] != 'y' &&
+                           console_buffer[0] != 'Y')
+                               goto out;
+               }
 #endif
        }
 
        /* Parse new Toradex config block data... */
-       if (argc < 3)
+       if (argc < 3 || (force_overwrite && argc < 4)) {
                err = get_cfgblock_interactive();
-       else
-               err = get_cfgblock_barcode(argv[2]);
-
+       } else {
+               if (force_overwrite)
+                       err = get_cfgblock_barcode(argv[3]);
+               else
+                       err = get_cfgblock_barcode(argv[2]);
+       }
        if (err) {
                ret = CMD_RET_FAILURE;
                goto out;
@@ -549,8 +562,8 @@ static int do_cfgblock(cmd_tbl_t *cmdtp, int flag, int argc,
 }
 
 U_BOOT_CMD(
-       cfgblock, 3, 0, do_cfgblock,
+       cfgblock, 4, 0, do_cfgblock,
        "Toradex config block handling commands",
-       "create [barcode] - (Re-)create Toradex config block\n"
+       "create [-y] [barcode] - (Re-)create Toradex config block\n"
        "cfgblock reload - Reload Toradex config block from flash"
 );
index fde230c955a4cd960e2119f57d46dd11f42a0f3e..2d560cceaf53fccb6067bec719b50288853bc020 100644 (file)
@@ -12,6 +12,8 @@
 #include <asm/setup.h>
 #include "tdx-common.h"
 
+#define TORADEX_OUI 0x00142dUL
+
 #ifdef CONFIG_TDX_CFG_BLOCK
 static char tdx_serial_str[9];
 static char tdx_board_rev_str[6];
@@ -68,20 +70,25 @@ int show_board_info(void)
        unsigned char ethaddr[6];
 
        if (read_tdx_cfg_block()) {
-               printf("Missing Toradex config block\n");
+               printf("MISSING TORADEX CONFIG BLOCK\n");
+               tdx_eth_addr.oui = htonl(TORADEX_OUI << 8);
+               tdx_eth_addr.nic = htonl(tdx_serial << 8);
                checkboard();
-               return 0;
+       } else {
+               sprintf(tdx_serial_str, "%08u", tdx_serial);
+               sprintf(tdx_board_rev_str, "V%1d.%1d%c",
+                       tdx_hw_tag.ver_major,
+                       tdx_hw_tag.ver_minor,
+                       (char)tdx_hw_tag.ver_assembly + 'A');
+
+               env_set("serial#", tdx_serial_str);
+
+               printf("Model: Toradex %s %s, Serial# %s\n",
+                      toradex_modules[tdx_hw_tag.prodid],
+                      tdx_board_rev_str,
+                      tdx_serial_str);
        }
 
-       /* board serial-number */
-       sprintf(tdx_serial_str, "%08u", tdx_serial);
-       sprintf(tdx_board_rev_str, "V%1d.%1d%c",
-               tdx_hw_tag.ver_major,
-               tdx_hw_tag.ver_minor,
-               (char)tdx_hw_tag.ver_assembly + 'A');
-
-       env_set("serial#", tdx_serial_str);
-
        /*
         * Check if environment contains a valid MAC address,
         * set the one from config block if not
@@ -101,11 +108,6 @@ int show_board_info(void)
        }
 #endif
 
-       printf("Model: Toradex %s %s, Serial# %s\n",
-              toradex_modules[tdx_hw_tag.prodid],
-              tdx_board_rev_str,
-              tdx_serial_str);
-
        return 0;
 }
 
index d7cbae8f9502dd713f13b9aa8304221a0c5a0ace..00a31a934623c386bbfd4c73769698e0f4111dfc 100644 (file)
@@ -1,6 +1,9 @@
 WANDBOARD BOARD
 M:     Fabio Estevam <fabio.estevam@nxp.com>
 S:     Maintained
+F:     arch/arm/dts/imx6qdl-wandboard.dtsi
+F:     arch/arm/dts/imx6qdl-wandboard-revb1.dtsi
+F:     arch/arm/dts/imx6dl-wandboard-revb1.dts
 F:     board/wandboard/
 F:     include/configs/wandboard.h
 F:     configs/wandboard_defconfig
index 9c3350019c8bc6dc92ba1885b2d2e840546f5c77..000cb109fc15527cbc554a88d9d74181f798f871 100644 (file)
@@ -422,4 +422,96 @@ void board_init_f(ulong dummy)
        /* DDR initialization */
        spl_dram_init();
 }
+
+#define USDHC1_CD_GPIO         IMX_GPIO_NR(1, 2)
+#define USDHC3_CD_GPIO         IMX_GPIO_NR(3, 9)
+
+#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |                   \
+       PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+static struct fsl_esdhc_cfg usdhc_cfg[2] = {
+       {USDHC3_BASE_ADDR},
+       {USDHC1_BASE_ADDR},
+};
+
+static iomux_v3_cfg_t const usdhc1_pads[] = {
+       IOMUX_PADS(PAD_SD1_CLK__SD1_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD1_CMD__SD1_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD1_DAT0__SD1_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD1_DAT1__SD1_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD1_DAT2__SD1_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD1_DAT3__SD1_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       /* Carrier MicroSD Card Detect */
+       IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02  | MUX_PAD_CTRL(NO_PAD_CTRL)),
+};
+
+static iomux_v3_cfg_t const usdhc3_pads[] = {
+       IOMUX_PADS(PAD_SD3_CLK__SD3_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD3_CMD__SD3_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       /* SOM MicroSD Card Detect */
+       IOMUX_PADS(PAD_EIM_DA9__GPIO3_IO09  | MUX_PAD_CTRL(NO_PAD_CTRL)),
+};
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+       struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
+       int ret = 0;
+
+       switch (cfg->esdhc_base) {
+       case USDHC1_BASE_ADDR:
+               ret = !gpio_get_value(USDHC1_CD_GPIO);
+               break;
+       case USDHC3_BASE_ADDR:
+               ret = !gpio_get_value(USDHC3_CD_GPIO);
+               break;
+       }
+
+       return ret;
+}
+
+int board_mmc_init(bd_t *bis)
+{
+       int ret;
+       u32 index = 0;
+
+       /*
+        * Following map is done:
+        * (U-Boot device node)    (Physical Port)
+        * mmc0                    SOM MicroSD
+        * mmc1                    Carrier board MicroSD
+        */
+       for (index = 0; index < CONFIG_SYS_FSL_USDHC_NUM; ++index) {
+               switch (index) {
+               case 0:
+                       SETUP_IOMUX_PADS(usdhc3_pads);
+                       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
+                       usdhc_cfg[0].max_bus_width = 4;
+                       gpio_direction_input(USDHC3_CD_GPIO);
+                       break;
+               case 1:
+                       SETUP_IOMUX_PADS(usdhc1_pads);
+                       usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
+                       usdhc_cfg[1].max_bus_width = 4;
+                       gpio_direction_input(USDHC1_CD_GPIO);
+                       break;
+               default:
+                       printf("Warning: you configured more USDHC controllers"
+                              "(%d) then supported by the board (%d)\n",
+                              index + 1, CONFIG_SYS_FSL_USDHC_NUM);
+                       return -EINVAL;
+               }
+
+               ret = fsl_esdhc_initialize(bis, &usdhc_cfg[index]);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
 #endif
index 6af1b458829333b7720e1684f03cd03886a3a794..69fbc8b690797a658aa117d5d29040effc447428 100644 (file)
@@ -22,8 +22,6 @@
 #include <asm/io.h>
 #include <linux/sizes.h>
 #include <common.h>
-#include <fsl_esdhc.h>
-#include <mmc.h>
 #include <miiphy.h>
 #include <netdev.h>
 #include <phy.h>
@@ -37,10 +35,6 @@ DECLARE_GLOBAL_DATA_PTR;
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
        PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |                   \
-       PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
-       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
-
 #define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
 
@@ -48,8 +42,6 @@ DECLARE_GLOBAL_DATA_PTR;
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
        PAD_CTL_ODE | PAD_CTL_SRE_FAST)
 
-#define USDHC1_CD_GPIO         IMX_GPIO_NR(1, 2)
-#define USDHC3_CD_GPIO         IMX_GPIO_NR(3, 9)
 #define ETH_PHY_RESET          IMX_GPIO_NR(3, 29)
 #define ETH_PHY_AR8035_POWER   IMX_GPIO_NR(7, 13)
 #define REV_DETECTION          IMX_GPIO_NR(2, 28)
@@ -68,28 +60,6 @@ static iomux_v3_cfg_t const uart1_pads[] = {
        IOMUX_PADS(PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
 };
 
-static iomux_v3_cfg_t const usdhc1_pads[] = {
-       IOMUX_PADS(PAD_SD1_CLK__SD1_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD1_CMD__SD1_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD1_DAT0__SD1_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD1_DAT1__SD1_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD1_DAT2__SD1_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD1_DAT3__SD1_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       /* Carrier MicroSD Card Detect */
-       IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02  | MUX_PAD_CTRL(NO_PAD_CTRL)),
-};
-
-static iomux_v3_cfg_t const usdhc3_pads[] = {
-       IOMUX_PADS(PAD_SD3_CLK__SD3_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD3_CMD__SD3_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       /* SOM MicroSD Card Detect */
-       IOMUX_PADS(PAD_EIM_DA9__GPIO3_IO09  | MUX_PAD_CTRL(NO_PAD_CTRL)),
-};
-
 static iomux_v3_cfg_t const enet_pads[] = {
        IOMUX_PADS(PAD_ENET_MDIO__ENET_MDIO  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
        IOMUX_PADS(PAD_ENET_MDC__ENET_MDC    | MUX_PAD_CTRL(ENET_PAD_CTRL)),
@@ -131,80 +101,20 @@ static void setup_iomux_enet(void)
        if (with_pmic) {
                SETUP_IOMUX_PADS(enet_ar8035_power_pads);
                /* enable AR8035 POWER */
+               gpio_request(ETH_PHY_AR8035_POWER, "PHY_POWER");
                gpio_direction_output(ETH_PHY_AR8035_POWER, 0);
        }
        /* wait until 3.3V of PHY and clock become stable */
        mdelay(10);
 
        /* Reset AR8031 PHY */
+       gpio_request(ETH_PHY_RESET, "PHY_RESET");
        gpio_direction_output(ETH_PHY_RESET, 0);
        mdelay(10);
        gpio_set_value(ETH_PHY_RESET, 1);
        udelay(100);
 }
 
-static struct fsl_esdhc_cfg usdhc_cfg[2] = {
-       {USDHC3_BASE_ADDR},
-       {USDHC1_BASE_ADDR},
-};
-
-int board_mmc_getcd(struct mmc *mmc)
-{
-       struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
-       int ret = 0;
-
-       switch (cfg->esdhc_base) {
-       case USDHC1_BASE_ADDR:
-               ret = !gpio_get_value(USDHC1_CD_GPIO);
-               break;
-       case USDHC3_BASE_ADDR:
-               ret = !gpio_get_value(USDHC3_CD_GPIO);
-               break;
-       }
-
-       return ret;
-}
-
-int board_mmc_init(bd_t *bis)
-{
-       int ret;
-       u32 index = 0;
-
-       /*
-        * Following map is done:
-        * (U-Boot device node)    (Physical Port)
-        * mmc0                    SOM MicroSD
-        * mmc1                    Carrier board MicroSD
-        */
-       for (index = 0; index < CONFIG_SYS_FSL_USDHC_NUM; ++index) {
-               switch (index) {
-               case 0:
-                       SETUP_IOMUX_PADS(usdhc3_pads);
-                       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
-                       usdhc_cfg[0].max_bus_width = 4;
-                       gpio_direction_input(USDHC3_CD_GPIO);
-                       break;
-               case 1:
-                       SETUP_IOMUX_PADS(usdhc1_pads);
-                       usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
-                       usdhc_cfg[1].max_bus_width = 4;
-                       gpio_direction_input(USDHC1_CD_GPIO);
-                       break;
-               default:
-                       printf("Warning: you configured more USDHC controllers"
-                              "(%d) then supported by the board (%d)\n",
-                              index + 1, CONFIG_SYS_FSL_USDHC_NUM);
-                       return -EINVAL;
-               }
-
-               ret = fsl_esdhc_initialize(bis, &usdhc_cfg[index]);
-               if (ret)
-                       return ret;
-       }
-
-       return 0;
-}
-
 static int ar8031_phy_fixup(struct phy_device *phydev)
 {
        unsigned short val;
@@ -348,14 +258,29 @@ static void do_enable_hdmi(struct display_info_t const *dev)
 
 static int detect_i2c(struct display_info_t const *dev)
 {
+#ifdef CONFIG_DM_I2C
+       struct udevice *bus, *udev;
+       int rc;
+
+       rc = uclass_get_device_by_seq(UCLASS_I2C, dev->bus, &bus);
+       if (rc)
+               return rc;
+       rc = dm_i2c_probe(bus, dev->addr, 0, &udev);
+       if (rc)
+               return 0;
+       return 1;
+#else
        return (0 == i2c_set_bus_num(dev->bus)) &&
                        (0 == i2c_probe(dev->addr));
+#endif
 }
 
 static void enable_fwadapt_7wvga(struct display_info_t const *dev)
 {
        SETUP_IOMUX_PADS(fwadapt_7wvga_pads);
 
+       gpio_request(IMX_GPIO_NR(2, 10), "DISP0_BKLEN");
+       gpio_request(IMX_GPIO_NR(2, 11), "DISP0_VDDEN");
        gpio_direction_output(IMX_GPIO_NR(2, 10), 1);
        gpio_direction_output(IMX_GPIO_NR(2, 11), 1);
 }
@@ -418,6 +343,7 @@ static void setup_display(void)
 
        /* Disable LCD backlight */
        SETUP_IOMUX_PAD(PAD_DI0_PIN4__GPIO4_IO20);
+       gpio_request(IMX_GPIO_NR(4, 20), "LCD_BKLEN");
        gpio_direction_input(IMX_GPIO_NR(4, 20));
 }
 #endif /* CONFIG_VIDEO_IPUV3 */
@@ -443,24 +369,30 @@ int board_early_init_f(void)
 
 int power_init_board(void)
 {
-       struct pmic *p;
-       u32 reg;
-
-       /* configure PFUZE100 PMIC */
-       power_pfuze100_init(PMIC_I2C_BUS);
-       p = pmic_get("PFUZE100");
-       if (p && !pmic_probe(p)) {
-               pmic_reg_read(p, PFUZE100_DEVICEID, &reg);
-               printf("PMIC:  PFUZE100 ID=0x%02x\n", reg);
-               with_pmic = true;
-
-               /* Set VGEN2 to 1.5V and enable */
-               pmic_reg_read(p, PFUZE100_VGEN2VOL, &reg);
-               reg &= ~(LDO_VOL_MASK);
-               reg |= (LDOA_1_50V | (1 << (LDO_EN)));
-               pmic_reg_write(p, PFUZE100_VGEN2VOL, reg);
+       struct udevice *dev;
+       int reg, ret;
+
+       puts("PMIC:  ");
+
+       ret = pmic_get("pfuze100", &dev);
+       if (ret < 0) {
+               printf("pmic_get() ret %d\n", ret);
+               return 0;
        }
 
+       reg = pmic_reg_read(dev, PFUZE100_DEVICEID);
+       if (reg < 0) {
+               printf("pmic_reg_read() ret %d\n", reg);
+               return 0;
+       }
+       printf("PMIC:  PFUZE100 ID=0x%02x\n", reg);
+       with_pmic = true;
+
+       /* Set VGEN2 to 1.5V and enable */
+       reg = pmic_reg_read(dev, PFUZE100_VGEN2VOL);
+       reg &= ~(LDO_VOL_MASK);
+       reg |= (LDOA_1_50V | (1 << (LDO_EN)));
+       pmic_reg_write(dev, PFUZE100_VGEN2VOL, reg);
        return 0;
 }
 
@@ -531,13 +463,13 @@ int board_init(void)
        gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
 
 #if defined(CONFIG_VIDEO_IPUV3)
-       setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c2_pad_info);
+       setup_i2c(1, CONFIG_SYS_MXC_I2C1_SPEED, 0x7f, &mx6dl_i2c2_pad_info);
        if (is_mx6dq() || is_mx6dqp()) {
-               setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c2_pad_info);
-               setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c3_pad_info);
+               setup_i2c(1, CONFIG_SYS_MXC_I2C1_SPEED, 0x7f, &mx6q_i2c2_pad_info);
+               setup_i2c(2, CONFIG_SYS_MXC_I2C2_SPEED, 0x7f, &mx6q_i2c3_pad_info);
        } else {
-               setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c2_pad_info);
-               setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c3_pad_info);
+               setup_i2c(1, CONFIG_SYS_MXC_I2C1_SPEED, 0x7f, &mx6dl_i2c2_pad_info);
+               setup_i2c(2, CONFIG_SYS_MXC_I2C2_SPEED, 0x7f, &mx6dl_i2c3_pad_info);
        }
 
        setup_display();
@@ -548,6 +480,8 @@ int board_init(void)
 
 int checkboard(void)
 {
+       gpio_request(REV_DETECTION, "REV_DETECT");
+
        if (is_revd1())
                puts("Board: Wandboard rev D1\n");
        else if (is_revc1())
index 8b48ea3a03abffec54514d48de41c3b1d00c6470..27d44b760daf36c81fa0a96868ffbb711b24b1b0 100644 (file)
@@ -414,9 +414,13 @@ static int do_zynq_rsa(cmd_tbl_t *cmdtp, int flag, int argc,
        u32 src_ptr;
        char *endp;
 
+       if (argc != cmdtp->maxargs)
+               return CMD_RET_FAILURE;
+
        src_ptr = simple_strtoul(argv[2], &endp, 16);
        if (*argv[2] == 0 || *endp != 0)
                return CMD_RET_USAGE;
+
        if (zynq_verify_image(src_ptr))
                return CMD_RET_FAILURE;
 
@@ -432,6 +436,9 @@ static int zynq_decrypt_image(cmd_tbl_t *cmdtp, int flag, int argc,
        u32 srcaddr, srclen, dstaddr, dstlen;
        int status;
 
+       if (argc < 5 && argc > cmdtp->maxargs)
+               return CMD_RET_USAGE;
+
        srcaddr = simple_strtoul(argv[2], &endp, 16);
        if (*argv[2] == 0 || *endp != 0)
                return CMD_RET_USAGE;
@@ -485,7 +492,7 @@ static int do_zynq(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                return CMD_RET_USAGE;
        zynq_cmd = find_cmd_tbl(argv[1], zynq_commands,
                                ARRAY_SIZE(zynq_commands));
-       if (!zynq_cmd || argc != zynq_cmd->maxargs)
+       if (!zynq_cmd)
                return CMD_RET_USAGE;
 
        ret = zynq_cmd->cmd(zynq_cmd, flag, argc, argv);
index db272478506fb0a1cd2a1f956682f3a2dbcac3ea..5189925beb3aaea657635f9d12e8b466f59f4102 100644 (file)
@@ -170,6 +170,10 @@ static const struct {
                .id = 0x62,
                .name = "29dr",
        },
+       {
+               .id = 0x66,
+               .name = "39dr",
+       },
 };
 #endif
 
@@ -482,18 +486,20 @@ static const struct {
        {}
 };
 
-static u32 reset_reason(void)
+static int reset_reason(void)
 {
-       u32 ret;
-       int i;
+       u32 reg;
+       int i, ret;
        const char *reason = NULL;
 
-       ret = readl(&crlapb_base->reset_reason);
+       ret = zynqmp_mmio_read((ulong)&crlapb_base->reset_reason, &reg);
+       if (ret)
+               return -EINVAL;
 
        puts("Reset reason:\t");
 
        for (i = 0; i < ARRAY_SIZE(reset_reasons); i++) {
-               if (ret & reset_reasons[i].bit) {
+               if (reg & reset_reasons[i].bit) {
                        reason = reset_reasons[i].name;
                        printf("%s ", reset_reasons[i].name);
                        break;
@@ -504,7 +510,9 @@ static u32 reset_reason(void)
 
        env_set("reset_reason", reason);
 
-       writel(~0, &crlapb_base->reset_reason);
+       ret = zynqmp_mmio_write(~0, ~0, (ulong)&crlapb_base->reset_reason);
+       if (ret)
+               return -EINVAL;
 
        return ret;
 }
index 0b07b3b9d777c246bfcd413337396fdd5db20dca..5d1999ee0b5fd20de08170eded239f6589f879f1 100644 (file)
@@ -1101,6 +1101,12 @@ config CMD_VIRTIO
        help
          VirtIO block device support
 
+config CMD_WDT
+       bool "wdt"
+       depends on WDT
+       help
+         This provides commands to control the watchdog timer devices.
+
 config CMD_AXI
        bool "axi"
        depends on AXI
@@ -1427,6 +1433,12 @@ config CMD_EFIDEBUG
          particularly for managing boot parameters as  well as examining
          various EFI status for debugging.
 
+config CMD_EXCEPTION
+       bool "exception - raise exception"
+       depends on ARM || RISCV || X86
+       help
+         Enable the 'exception' command which allows to raise an exception.
+
 config CMD_LED
        bool "led"
        depends on LED
index acb85f49fba87cc00774e419afdb2b1ab192a9e2..7864fcf95c36cdf071e5d259f5c58227a09d3e4d 100644 (file)
@@ -142,6 +142,7 @@ obj-$(CONFIG_CMD_UBIFS) += ubifs.o
 obj-$(CONFIG_CMD_UNIVERSE) += universe.o
 obj-$(CONFIG_CMD_UNZIP) += unzip.o
 obj-$(CONFIG_CMD_VIRTIO) += virtio.o
+obj-$(CONFIG_CMD_WDT) += wdt.o
 obj-$(CONFIG_CMD_LZMADEC) += lzmadec.o
 
 obj-$(CONFIG_CMD_USB) += usb.o disk.o
@@ -172,6 +173,8 @@ obj-$(CONFIG_CMD_BLOB) += blob.o
 # Android Verified Boot 2.0
 obj-$(CONFIG_CMD_AVB) += avb.o
 
+obj-$(CONFIG_ARM) += arm/
+obj-$(CONFIG_RISCV) += riscv/
 obj-$(CONFIG_X86) += x86/
 
 obj-$(CONFIG_ARCH_MVEBU) += mvebu/
diff --git a/cmd/arm/Makefile b/cmd/arm/Makefile
new file mode 100644 (file)
index 0000000..94367dc
--- /dev/null
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: GPL-2.0+
+
+ifdef CONFIG_ARM64
+obj-$(CONFIG_CMD_EXCEPTION) += exception64.o
+else
+obj-$(CONFIG_CMD_EXCEPTION) += exception.o
+endif
diff --git a/cmd/arm/exception.c b/cmd/arm/exception.c
new file mode 100644 (file)
index 0000000..33bc759
--- /dev/null
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * The 'exception' command can be used for testing exception handling.
+ *
+ * Copyright (c) 2018, Heinrich Schuchardt <xypron.glpk@gmx.de>
+ */
+
+#include <common.h>
+#include <command.h>
+
+static int do_unaligned(cmd_tbl_t *cmdtp, int flag, int argc,
+                       char * const argv[])
+{
+       /*
+        * The LDRD instruction requires the data source to be four byte aligned
+        * even if strict alignment fault checking is disabled in the system
+        * control register.
+        */
+       asm volatile (
+               "MOV r5, sp\n"
+               "ADD r5, #1\n"
+               "LDRD r6, r7, [r5]\n");
+       return CMD_RET_FAILURE;
+}
+
+static int do_breakpoint(cmd_tbl_t *cmdtp, int flag, int argc,
+                        char * const argv[])
+{
+       asm volatile ("BKPT #123\n");
+       return CMD_RET_FAILURE;
+}
+
+static int do_undefined(cmd_tbl_t *cmdtp, int flag, int argc,
+                       char * const argv[])
+{
+       /*
+        * 0xe7f...f.   is undefined in ARM mode
+        * 0xde..       is undefined in Thumb mode
+        */
+       asm volatile (".word 0xe7f7defb\n");
+       return CMD_RET_FAILURE;
+}
+
+static cmd_tbl_t cmd_sub[] = {
+       U_BOOT_CMD_MKENT(breakpoint, CONFIG_SYS_MAXARGS, 1, do_breakpoint,
+                        "", ""),
+       U_BOOT_CMD_MKENT(unaligned, CONFIG_SYS_MAXARGS, 1, do_unaligned,
+                        "", ""),
+       U_BOOT_CMD_MKENT(undefined, CONFIG_SYS_MAXARGS, 1, do_undefined,
+                        "", ""),
+};
+
+static char exception_help_text[] =
+       "<ex>\n"
+       "  The following exceptions are available:\n"
+       "  breakpoint - prefetch abort\n"
+       "  unaligned  - data abort\n"
+       "  undefined  - undefined instruction\n"
+       ;
+
+#include <exception.h>
diff --git a/cmd/arm/exception64.c b/cmd/arm/exception64.c
new file mode 100644 (file)
index 0000000..a363818
--- /dev/null
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * The 'exception' command can be used for testing exception handling.
+ *
+ * Copyright (c) 2018, Heinrich Schuchardt <xypron.glpk@gmx.de>
+ */
+
+#include <common.h>
+#include <command.h>
+
+static int do_undefined(cmd_tbl_t *cmdtp, int flag, int argc,
+                       char * const argv[])
+{
+       /*
+        * 0xe7f...f.   is undefined in ARM mode
+        * 0xde..       is undefined in Thumb mode
+        */
+       asm volatile (".word 0xe7f7defb\n");
+       return CMD_RET_FAILURE;
+}
+
+static cmd_tbl_t cmd_sub[] = {
+       U_BOOT_CMD_MKENT(undefined, CONFIG_SYS_MAXARGS, 1, do_undefined,
+                        "", ""),
+};
+
+static char exception_help_text[] =
+       "<ex>\n"
+       "  The following exceptions are available:\n"
+       "  undefined  - undefined instruction\n"
+       ;
+
+#include <exception.h>
index 3619a20e64337838c3496086ffaeb41eb77e5d94..15ee4af45667d566c4aed23d3a56759f46571842 100644 (file)
@@ -111,13 +111,13 @@ static efi_status_t copy_fdt(void **fdtp)
        new_fdt_addr = (uintptr_t)map_sysmem(fdt_ram_start + 0x7f00000 +
                                             fdt_size, 0);
        ret = efi_allocate_pages(EFI_ALLOCATE_MAX_ADDRESS,
-                                EFI_RUNTIME_SERVICES_DATA, fdt_pages,
+                                EFI_BOOT_SERVICES_DATA, fdt_pages,
                                 &new_fdt_addr);
        if (ret != EFI_SUCCESS) {
                /* If we can't put it there, put it somewhere */
                new_fdt_addr = (ulong)memalign(EFI_PAGE_SIZE, fdt_size);
                ret = efi_allocate_pages(EFI_ALLOCATE_MAX_ADDRESS,
-                                        EFI_RUNTIME_SERVICES_DATA, fdt_pages,
+                                        EFI_BOOT_SERVICES_DATA, fdt_pages,
                                         &new_fdt_addr);
                if (ret != EFI_SUCCESS) {
                        printf("ERROR: Failed to reserve space for FDT\n");
index c9ba0621970d4386a529403084ba96e37f7d9b6f..91a750a4fcaac1a688bd950713ce2ef1fb732c8c 100644 (file)
--- a/cmd/dfu.c
+++ b/cmd/dfu.c
@@ -27,8 +27,10 @@ static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 #ifdef CONFIG_DFU_OVER_USB
        char *usb_controller = argv[1];
 #endif
+#if defined(CONFIG_DFU_OVER_USB) || defined(CONFIG_DFU_OVER_TFTP)
        char *interface = argv[2];
        char *devstring = argv[3];
+#endif
 
        int ret = 0;
 #ifdef CONFIG_DFU_OVER_TFTP
@@ -63,6 +65,7 @@ done:
 
 U_BOOT_CMD(dfu, CONFIG_SYS_MAXARGS, 1, do_dfu,
        "Device Firmware Upgrade",
+       ""
 #ifdef CONFIG_DFU_OVER_USB
        "<USB_controller> <interface> <dev> [list]\n"
        "  - device firmware upgrade via <USB_controller>\n"
index 88a8e3f3186bee795104149d3b885576c4e61f4e..b1f224bc6ad21a1b3e6ce232835e7eca1cabda92 100644 (file)
@@ -343,9 +343,9 @@ static int do_fpga_loadmk(cmd_tbl_t *cmdtp, int flag, int argc,
                        return CMD_RET_FAILURE;
                }
 
-               /* get fpga subimage data address and length */
-               if (fit_image_get_data(fit_hdr, noffset, &fit_data,
-                                      &data_size)) {
+               /* get fpga subimage/external data address and length */
+               if (fit_image_get_data_and_size(fit_hdr, noffset,
+                                              &fit_data, &data_size)) {
                        puts("Fpga subimage data not found\n");
                        return CMD_RET_FAILURE;
                }
diff --git a/cmd/riscv/Makefile b/cmd/riscv/Makefile
new file mode 100644 (file)
index 0000000..24df023
--- /dev/null
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: GPL-2.0+
+
+obj-$(CONFIG_CMD_EXCEPTION) += exception.o
diff --git a/cmd/riscv/exception.c b/cmd/riscv/exception.c
new file mode 100644 (file)
index 0000000..547fb7d
--- /dev/null
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * The 'exception' command can be used for testing exception handling.
+ *
+ * Copyright (c) 2018, Heinrich Schuchardt <xypron.glpk@gmx.de>
+ */
+
+#include <common.h>
+#include <command.h>
+
+static int do_undefined(cmd_tbl_t *cmdtp, int flag, int argc,
+                       char * const argv[])
+{
+       asm volatile (".word 0xffffffff\n");
+       return CMD_RET_FAILURE;
+}
+
+static cmd_tbl_t cmd_sub[] = {
+       U_BOOT_CMD_MKENT(undefined, CONFIG_SYS_MAXARGS, 1, do_undefined,
+                        "", ""),
+};
+
+static char exception_help_text[] =
+       "<ex>\n"
+       "  The following exceptions are available:\n"
+       "  undefined  - undefined instruction\n"
+       ;
+
+#include <exception.h>
index 738ef0e46dc14fde1ae1550b0873a2a818b7abb6..6ccf98ae512820192441c78132b6836169770137 100644 (file)
--- a/cmd/sf.c
+++ b/cmd/sf.c
@@ -81,14 +81,13 @@ static int do_spi_flash_probe(int argc, char * const argv[])
 {
        unsigned int bus = CONFIG_SF_DEFAULT_BUS;
        unsigned int cs = CONFIG_SF_DEFAULT_CS;
+       /* In DM mode, defaults speed and mode will be taken from DT */
        unsigned int speed = CONFIG_SF_DEFAULT_SPEED;
        unsigned int mode = CONFIG_SF_DEFAULT_MODE;
        char *endp;
 #ifdef CONFIG_DM_SPI_FLASH
        struct udevice *new, *bus_dev;
        int ret;
-       /* In DM mode defaults will be taken from DT */
-       speed = 0, mode = 0;
 #else
        struct spi_flash *new;
 #endif
index 0ccb1b51483cb57d5c69cf995e8e468bceaf6548..dd9ac0bc9761d1fbb593256f042b2a2d7b20ba64 100644 (file)
--- a/cmd/usb.c
+++ b/cmd/usb.c
@@ -316,26 +316,18 @@ static struct usb_device *usb_find_device(int devnum)
        return NULL;
 }
 
-static inline char *portspeed(int speed)
+static inline const char *portspeed(int speed)
 {
-       char *speed_str;
-
        switch (speed) {
        case USB_SPEED_SUPER:
-               speed_str = "5 Gb/s";
-               break;
+               return "5 Gb/s";
        case USB_SPEED_HIGH:
-               speed_str = "480 Mb/s";
-               break;
+               return "480 Mb/s";
        case USB_SPEED_LOW:
-               speed_str = "1.5 Mb/s";
-               break;
+               return "1.5 Mb/s";
        default:
-               speed_str = "12 Mb/s";
-               break;
+               return "12 Mb/s";
        }
-
-       return speed_str;
 }
 
 /* shows the device tree recursively */
index 753ae4f42a7a0bd3671032f14ddfb61a82205a71..570cf3aa508bd03828b1b654043d844feb237ab2 100644 (file)
@@ -14,6 +14,7 @@
 #include <part.h>
 #include <usb.h>
 #include <usb_mass_storage.h>
+#include <watchdog.h>
 
 static int ums_read_sector(struct ums *ums_dev,
                           ulong start, lbaint_t blkcnt, void *buf)
@@ -226,6 +227,8 @@ static int do_usb_mass_storage(cmd_tbl_t *cmdtp, int flag,
                        rc = CMD_RET_SUCCESS;
                        goto cleanup_register;
                }
+
+               WATCHDOG_RESET();
        }
 
 cleanup_register:
diff --git a/cmd/wdt.c b/cmd/wdt.c
new file mode 100644 (file)
index 0000000..647d989
--- /dev/null
+++ b/cmd/wdt.c
@@ -0,0 +1,174 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Watchdog commands
+ *
+ * Copyright (c) 2019 Michael Walle <michael@walle.cc>
+ */
+
+#include <common.h>
+#include <command.h>
+#include <dm.h>
+#include <wdt.h>
+
+static struct udevice *currdev;
+
+static int do_wdt_list(cmd_tbl_t *cmdtp, int flag, int argc,
+                      char *const argv[])
+{
+       struct udevice *dev;
+       struct uclass *uc;
+       int ret;
+
+       ret = uclass_get(UCLASS_WDT, &uc);
+       if (ret)
+               return CMD_RET_FAILURE;
+
+       uclass_foreach_dev(dev, uc)
+               printf("%s (%s)\n", dev->name, dev->driver->name);
+
+       return CMD_RET_SUCCESS;
+}
+
+static int do_wdt_dev(cmd_tbl_t *cmdtp, int flag, int argc,
+                     char *const argv[])
+{
+       int ret;
+
+       if (argc > 1) {
+               ret = uclass_get_device_by_name(UCLASS_WDT, argv[1], &currdev);
+               if (ret) {
+                       printf("Can't get the watchdog timer: %s\n", argv[1]);
+                       return CMD_RET_FAILURE;
+               }
+       } else {
+               if (!currdev) {
+                       printf("No watchdog timer device set!\n");
+                       return CMD_RET_FAILURE;
+               }
+               printf("dev: %s\n", currdev->name);
+       }
+
+       return CMD_RET_SUCCESS;
+}
+
+static int check_currdev(void)
+{
+       if (!currdev) {
+               printf("No device set, use 'wdt dev' first\n");
+               return CMD_RET_FAILURE;
+       }
+       return 0;
+}
+
+static int do_wdt_start(cmd_tbl_t *cmdtp, int flag, int argc,
+                       char *const argv[])
+{
+       int ret;
+       u64 timeout;
+       ulong flags = 0;
+
+       if (argc < 2)
+               return CMD_RET_USAGE;
+
+       ret = check_currdev();
+       if (ret)
+               return ret;
+
+       timeout = simple_strtoull(argv[1], NULL, 0);
+       if (argc > 2)
+               flags = simple_strtoul(argv[2], NULL, 0);
+
+       ret = wdt_start(currdev, timeout, flags);
+       if (ret == -ENOSYS) {
+               printf("Starting watchdog timer not supported.\n");
+               return CMD_RET_FAILURE;
+       } else if (ret) {
+               printf("Starting watchdog timer failed (%d)\n", ret);
+               return CMD_RET_FAILURE;
+       }
+
+       return CMD_RET_SUCCESS;
+}
+
+static int do_wdt_stop(cmd_tbl_t *cmdtp, int flag, int argc,
+                      char *const argv[])
+{
+       int ret;
+
+       ret = check_currdev();
+       if (ret)
+               return ret;
+
+       ret = wdt_stop(currdev);
+       if (ret == -ENOSYS) {
+               printf("Stopping watchdog timer not supported.\n");
+               return CMD_RET_FAILURE;
+       } else if (ret) {
+               printf("Stopping watchdog timer failed (%d)\n", ret);
+               return CMD_RET_FAILURE;
+       }
+
+       return CMD_RET_SUCCESS;
+}
+
+static int do_wdt_reset(cmd_tbl_t *cmdtp, int flag, int argc,
+                       char *const argv[])
+{
+       int ret;
+
+       ret = check_currdev();
+       if (ret)
+               return ret;
+
+       ret = wdt_reset(currdev);
+       if (ret == -ENOSYS) {
+               printf("Resetting watchdog timer not supported.\n");
+               return CMD_RET_FAILURE;
+       } else if (ret) {
+               printf("Resetting watchdog timer failed (%d)\n", ret);
+               return CMD_RET_FAILURE;
+       }
+
+       return CMD_RET_SUCCESS;
+}
+
+static int do_wdt_expire(cmd_tbl_t *cmdtp, int flag, int argc,
+                        char *const argv[])
+{
+       int ret;
+       ulong flags = 0;
+
+       ret = check_currdev();
+       if (ret)
+               return ret;
+
+       if (argc > 1)
+               flags = simple_strtoul(argv[1], NULL, 0);
+
+       ret = wdt_expire_now(currdev, flags);
+       if (ret == -ENOSYS) {
+               printf("Expiring watchdog timer not supported.\n");
+               return CMD_RET_FAILURE;
+       } else if (ret) {
+               printf("Expiring watchdog timer failed (%d)\n", ret);
+               return CMD_RET_FAILURE;
+       }
+
+       return CMD_RET_SUCCESS;
+}
+
+static char wdt_help_text[] =
+       "list - list watchdog devices\n"
+       "wdt dev [<name>] - get/set current watchdog device\n"
+       "wdt start <timeout ms> [flags] - start watchdog timer\n"
+       "wdt stop - stop watchdog timer\n"
+       "wdt reset - reset watchdog timer\n"
+       "wdt expire [flags] - expire watchdog timer immediately\n";
+
+U_BOOT_CMD_WITH_SUBCMDS(wdt, "Watchdog sub-system", wdt_help_text,
+       U_BOOT_SUBCMD_MKENT(list, 1, 1, do_wdt_list),
+       U_BOOT_SUBCMD_MKENT(dev, 2, 1, do_wdt_dev),
+       U_BOOT_SUBCMD_MKENT(start, 3, 1, do_wdt_start),
+       U_BOOT_SUBCMD_MKENT(stop, 1, 1, do_wdt_stop),
+       U_BOOT_SUBCMD_MKENT(reset, 1, 1, do_wdt_reset),
+       U_BOOT_SUBCMD_MKENT(expire, 2, 1, do_wdt_expire));
index bcc6d06582e789adee5bbca20cf310870accf79a..707161440d064e1f77dfa9ec833499723980abd7 100644 (file)
@@ -1,4 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0+
 
 obj-y += mtrr.o
+obj-$(CONFIG_CMD_EXCEPTION) += exception.o
 obj-$(CONFIG_HAVE_FSP) += fsp.o
diff --git a/cmd/x86/exception.c b/cmd/x86/exception.c
new file mode 100644 (file)
index 0000000..ade1e2e
--- /dev/null
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * The 'exception' command can be used for testing exception handling.
+ *
+ * Copyright (c) 2018, Heinrich Schuchardt <xypron.glpk@gmx.de>
+ */
+
+#include <common.h>
+#include <command.h>
+
+static int do_undefined(cmd_tbl_t *cmdtp, int flag, int argc,
+                       char * const argv[])
+{
+       asm volatile (".word 0xffff\n");
+       return CMD_RET_FAILURE;
+}
+
+static cmd_tbl_t cmd_sub[] = {
+       U_BOOT_CMD_MKENT(undefined, CONFIG_SYS_MAXARGS, 1, do_undefined,
+                        "", ""),
+};
+
+static char exception_help_text[] =
+       "<ex>\n"
+       "  The following exceptions are available:\n"
+       "  undefined  - undefined instruction\n"
+       ;
+
+#include <exception.h>
index 8572a67a0063e224bf5381dd66ddcc61b49836ce..32bfae8b22be6c1c5ee1c1d7d837c10c091280d8 100644 (file)
@@ -159,9 +159,9 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
                        }
                }
 
-               /* get subimage data address and length */
-               if (fit_image_get_data(fit_hdr, noffset,
-                                       &fit_data, &fit_len)) {
+               /* get subimage/external data address and length */
+               if (fit_image_get_data_and_size(fit_hdr, noffset,
+                                              &fit_data, &fit_len)) {
                        puts("Could not find script subimage data\n");
                        return 1;
                }
index 472987d5d52f83e64d62a892c4adc4ca9db3a4c2..1ad44bbe3f719e62c19690d621822a8b3c81093d 100644 (file)
@@ -154,6 +154,13 @@ static int initr_reloc_global_data(void)
        gd->fdt_blob += gd->reloc_off;
 #endif
 #ifdef CONFIG_EFI_LOADER
+       /*
+        * On the ARM architecture gd is mapped to a fixed register (r9 or x18).
+        * As this register may be overwritten by an EFI payload we save it here
+        * and restore it on every callback entered.
+        */
+       efi_save_gd();
+
        efi_runtime_relocate(gd->relocaddr, NULL);
 #endif
 
index 3adbceaa38e381c62f569fa1ecdff8852756d8b8..b5d37d38db8172663ce6a5afdc5edda8e8c6892c 100644 (file)
@@ -154,7 +154,7 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc,
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
        case IMAGE_FORMAT_ANDROID:
                images.os.type = IH_TYPE_KERNEL;
-               images.os.comp = IH_COMP_NONE;
+               images.os.comp = android_image_get_kcomp(os_hdr);
                images.os.os = IH_OS_LINUX;
 
                images.os.end = android_image_get_end(os_hdr);
@@ -450,7 +450,6 @@ static int bootm_load_os(bootm_headers_t *images, int boot_progress)
        ulong image_start = os.image_start;
        ulong image_len = os.image_len;
        ulong flush_start = ALIGN_DOWN(load, ARCH_DMA_MINALIGN);
-       ulong flush_len;
        bool no_overlap;
        void *load_buf, *image_buf;
        int err;
@@ -465,11 +464,7 @@ static int bootm_load_os(bootm_headers_t *images, int boot_progress)
                return err;
        }
 
-       flush_len = load_end - load;
-       if (flush_start < load)
-               flush_len += load - flush_start;
-
-       flush_cache(flush_start, ALIGN(flush_len, ARCH_DMA_MINALIGN));
+       flush_cache(flush_start, ALIGN(load_end, ARCH_DMA_MINALIGN) - flush_start);
 
        debug("   kernel loaded at 0x%08lx, end = 0x%08lx\n", load, load_end);
        bootstage_mark(BOOTSTAGE_ID_KERNEL_LOADED);
index edaad299bbb552ad8b8710584268e8657f8cd0e7..6f12a18d549b2372e3b33b2383bf58ac63c16b1a 100644 (file)
@@ -1893,8 +1893,7 @@ Void_t* mEMALIGn(alignment, bytes) size_t alignment; size_t bytes;
 
 #if CONFIG_VAL(SYS_MALLOC_F_LEN)
        if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT)) {
-               nb = roundup(bytes, alignment);
-               return malloc_simple(nb);
+               return memalign_simple(alignment, bytes);
        }
 #endif
 
index 42583e3ed8c895d5b2b081bccc846be48d17bde4..ab08a0114feea8f2b726fd50829fc58cf92b72dd 100644 (file)
@@ -456,12 +456,6 @@ int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks)
        if (!banks)
                return 0;
 
-       for (i = 0; i < banks; i++)
-               if (start[i] == 0 && size[i] == 0)
-                       break;
-
-       banks = i;
-
        len = fdt_pack_reg(blob, tmp, start, size, banks);
 
        err = fdt_setprop(blob, nodeoffset, "reg", tmp, len);
index 2f38c191e911c555a0fdd492fa3120d62d41dad4..8b0f6b3b8babe5b50578324e1dd023ad46a1185d 100644 (file)
@@ -8,6 +8,7 @@
 #include <android_image.h>
 #include <malloc.h>
 #include <errno.h>
+#include <asm/unaligned.h>
 
 #define ANDROID_IMAGE_DEFAULT_KERNEL_ADDR      0x10008000
 
@@ -126,6 +127,16 @@ ulong android_image_get_kload(const struct andr_img_hdr *hdr)
        return android_image_get_kernel_addr(hdr);
 }
 
+ulong android_image_get_kcomp(const struct andr_img_hdr *hdr)
+{
+       const void *p = (void *)((uintptr_t)hdr + hdr->page_size);
+
+       if (get_unaligned_le32(p) == LZ4F_MAGIC)
+               return IH_COMP_LZ4;
+       else
+               return IH_COMP_NONE;
+}
+
 int android_image_get_ramdisk(const struct andr_img_hdr *hdr,
                              ulong *rd_data, ulong *rd_len)
 {
@@ -186,7 +197,7 @@ void android_print_contents(const struct andr_img_hdr *hdr)
        printf("%skernel size:      %x\n", p, hdr->kernel_size);
        printf("%skernel address:   %x\n", p, hdr->kernel_addr);
        printf("%sramdisk size:     %x\n", p, hdr->ramdisk_size);
-       printf("%sramdisk addrress: %x\n", p, hdr->ramdisk_addr);
+       printf("%sramdisk address:  %x\n", p, hdr->ramdisk_addr);
        printf("%ssecond size:      %x\n", p, hdr->second_size);
        printf("%ssecond address:   %x\n", p, hdr->second_addr);
        printf("%stags address:     %x\n", p, hdr->tags_addr);
index 01186aeac7a433a35f888b3fa227712fb6dbab80..9ed00b7d5bfb9e47db3dbafbf5d1989b32c15bf6 100644 (file)
@@ -284,7 +284,7 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
        *of_flat_tree = NULL;
        *of_size = 0;
 
-       img_addr = simple_strtoul(argv[0], NULL, 16);
+       img_addr = (argc == 0) ? load_addr : simple_strtoul(argv[0], NULL, 16);
        buf = map_sysmem(img_addr, 0);
 
        if (argc > 2)
index ac901e131ca1edca2b9d7ebc0d18bf1c75060859..a74b44f2982cdcfb197569e5e0c9659de0dd788d 100644 (file)
@@ -2118,6 +2118,18 @@ int boot_get_fdt_fit(bootm_headers_t *images, ulong addr,
                        if (next_config)
                                *next_config++ = '\0';
                        uname = NULL;
+
+                       /*
+                        * fit_image_load() would load the first FDT from the
+                        * extra config only when uconfig is specified.
+                        * Check if the extra config contains multiple FDTs and
+                        * if so, load them.
+                        */
+                       cfg_noffset = fit_conf_get_node(fit, uconfig);
+
+                       i = 0;
+                       count = fit_conf_get_prop_node_count(fit, cfg_noffset,
+                                                            FIT_FDT_PROP);
                }
 
                debug("%d: using uname=%s uconfig=%s\n", i, uname, uconfig);
index 4d4248f234fb2ef11d4e152b1d11a0ad9a644c58..75b84d50091d1fa435c9cca1b18bce58fb620da8 100644 (file)
@@ -957,7 +957,7 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
         */
        buf = map_sysmem(images->os.start, 0);
        if (buf && genimg_get_format(buf) == IMAGE_FORMAT_ANDROID)
-               select = argv[0];
+               select = (argc == 0) ? env_get("loadaddr") : argv[0];
 #endif
 
        if (argc >= 2)
index 6eb190f1ea540da99fc2a6db9c3bedf92aadf4c8..e2bcefb111e1f94bfc78b54a86cd09c19ff546ff 100644 (file)
@@ -17,6 +17,10 @@ static int spl_nand_load_image(struct spl_image_info *spl_image,
 {
        nand_init();
 
+       printf("Loading U-Boot from 0x%08x (size 0x%08x) to 0x%08x\n",
+              CONFIG_SYS_NAND_U_BOOT_OFFS, CONFIG_SYS_NAND_U_BOOT_SIZE,
+              CONFIG_SYS_NAND_U_BOOT_DST);
+
        nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
                            CONFIG_SYS_NAND_U_BOOT_SIZE,
                            (void *)CONFIG_SYS_NAND_U_BOOT_DST);
index 8cd4830a39b89d747fb1e4cb6179cc4d2da2559f..9b74473377f36e4d88eb066d9e2b4d4a6bf6bdbf 100644 (file)
@@ -77,6 +77,8 @@ static int spl_spi_load_image(struct spl_image_info *spl_image,
 
        /*
         * Load U-Boot image from SPI flash into RAM
+        * In DM mode: defaults speed and mode will be
+        * taken from DT when available
         */
 
        flash = spi_flash_probe(CONFIG_SF_DEFAULT_BUS,
index 577fdc69afe08078cec7a0386dd06d9f53bf50c9..fa539ecd7af4f4f3989c2704084c8bfb1bcb13fc 100644 (file)
@@ -75,7 +75,7 @@ static int spl_ymodem_load_image(struct spl_image_info *spl_image,
        int ret;
        connection_info_t info;
        char buf[BUF_SIZE];
-       struct image_header *ih;
+       struct image_header *ih = NULL;
        ulong addr = 0;
 
        info.mode = xyzModem_ymodem;
@@ -89,7 +89,25 @@ static int spl_ymodem_load_image(struct spl_image_info *spl_image,
        if (res <= 0)
                goto end_stream;
 
-       if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
+       if (IS_ENABLED(CONFIG_SPL_LOAD_FIT_FULL) &&
+           image_get_magic((struct image_header *)buf) == FDT_MAGIC) {
+               addr = CONFIG_SYS_LOAD_ADDR;
+               ih = (struct image_header *)addr;
+
+               memcpy((void *)addr, buf, res);
+               size += res;
+               addr += res;
+
+               while ((res = xyzModem_stream_read(buf, BUF_SIZE, &err)) > 0) {
+                       memcpy((void *)addr, buf, res);
+                       size += res;
+                       addr += res;
+               }
+
+               ret = spl_parse_image_header(spl_image, ih);
+               if (ret)
+                       return ret;
+       } else if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
            image_get_magic((struct image_header *)buf) == FDT_MAGIC) {
                struct spl_load_info load;
                struct ymodem_fit_info info;
@@ -111,7 +129,7 @@ static int spl_ymodem_load_image(struct spl_image_info *spl_image,
                ih = (struct image_header *)buf;
                ret = spl_parse_image_header(spl_image, ih);
                if (ret)
-                       return ret;
+                       goto end_stream;
 #ifdef CONFIG_SPL_GZIP
                if (ih->ih_comp == IH_COMP_GZIP)
                        addr = CONFIG_SYS_LOAD_ADDR;
@@ -128,18 +146,6 @@ static int spl_ymodem_load_image(struct spl_image_info *spl_image,
                        size += res;
                        addr += res;
                }
-
-#ifdef CONFIG_SPL_GZIP
-               if (ih->ih_comp == IH_COMP_GZIP) {
-                       if (gunzip((void *)(spl_image->load_addr + sizeof(*ih)),
-                                  CONFIG_SYS_BOOTM_LEN,
-                                  (void *)(CONFIG_SYS_LOAD_ADDR + sizeof(*ih)),
-                                  &size)) {
-                               puts("Uncompressing error\n");
-                               return -EIO;
-                       }
-               }
-#endif
        }
 
 end_stream:
@@ -147,6 +153,21 @@ end_stream:
        xyzModem_stream_terminate(false, &getcymodem);
 
        printf("Loaded %lu bytes\n", size);
-       return 0;
+
+#ifdef CONFIG_SPL_GZIP
+       if (!(IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
+             image_get_magic((struct image_header *)buf) == FDT_MAGIC) &&
+           (ih->ih_comp == IH_COMP_GZIP)) {
+               if (gunzip((void *)(spl_image->load_addr + sizeof(*ih)),
+                          CONFIG_SYS_BOOTM_LEN,
+                          (void *)(CONFIG_SYS_LOAD_ADDR + sizeof(*ih)),
+                          &size)) {
+                       puts("Uncompressing error\n");
+                       return -EIO;
+               }
+       }
+#endif
+
+       return ret;
 }
 SPL_LOAD_IMAGE_METHOD("UART", 0, BOOT_DEVICE_UART, spl_ymodem_load_image);
index 33aaeb8e4452a030b103781af0a97dd4115c4f76..9069f4b33aa191284f023fc67baf8af020067a47 100644 (file)
@@ -233,26 +233,18 @@ static struct usb_hub_device *usb_hub_allocate(void)
 
 #define MAX_TRIES 5
 
-static inline char *portspeed(int portstatus)
+static inline const char *portspeed(int portstatus)
 {
-       char *speed_str;
-
        switch (portstatus & USB_PORT_STAT_SPEED_MASK) {
        case USB_PORT_STAT_SUPER_SPEED:
-               speed_str = "5 Gb/s";
-               break;
+               return "5 Gb/s";
        case USB_PORT_STAT_HIGH_SPEED:
-               speed_str = "480 Mb/s";
-               break;
+               return "480 Mb/s";
        case USB_PORT_STAT_LOW_SPEED:
-               speed_str = "1.5 Mb/s";
-               break;
+               return "1.5 Mb/s";
        default:
-               speed_str = "12 Mb/s";
-               break;
+               return "12 Mb/s";
        }
-
-       return speed_str;
 }
 
 /**
index 020f0d4117f7d07f1b22debe8e78b1c78f3f2f64..cc99c6be072044bde788380cfbf231d92a20a277 100644 (file)
@@ -145,6 +145,12 @@ static void usb_kbd_put_queue(struct usb_kbd_pdata *data, char c)
        data->usb_kbd_buffer[data->usb_in_pointer] = c;
 }
 
+static void usb_kbd_put_sequence(struct usb_kbd_pdata *data, char *s)
+{
+       for (; *s; s++)
+               usb_kbd_put_queue(data, *s);
+}
+
 /*
  * Set the LEDs. Since this is used in the irq routine, the control job is
  * issued with a timeout of 0. This means, that the job is queued without
@@ -235,9 +241,25 @@ static int usb_kbd_translate(struct usb_kbd_pdata *data, unsigned char scancode,
        }
 
        /* Report keycode if any */
-       if (keycode) {
+       if (keycode)
                debug("%c", keycode);
+
+       switch (keycode) {
+       case 0x0e:                                      /* Down arrow key */
+               usb_kbd_put_sequence(data, "\e[B");
+               break;
+       case 0x10:                                      /* Up arrow key */
+               usb_kbd_put_sequence(data, "\e[A");
+               break;
+       case 0x06:                                      /* Right arrow key */
+               usb_kbd_put_sequence(data, "\e[C");
+               break;
+       case 0x02:                                      /* Left arrow key */
+               usb_kbd_put_sequence(data, "\e[D");
+               break;
+       default:
                usb_kbd_put_queue(data, keycode);
+               break;
        }
 
        return 0;
index 6afda7245372f49583e0322e15b5d9a6e86370cd..ffe013fa2df7d7b136c66fb523e9e67764ac7d81 100644 (file)
@@ -56,7 +56,6 @@ CONFIG_SPL_DM_USB_GADGET=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
 CONFIG_USB_MUSB_TI=y
-CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
 CONFIG_USB_GADGET_VENDOR_NUM=0x0451
index a6a237f7839bd58b06ac4fe98b725e685d9023da..105ff01d14de3f0d6ee58becb2bb8fe47da7a8a5 100644 (file)
@@ -7,14 +7,16 @@ CONFIG_DISTRO_DEFAULTS=y
 CONFIG_SPL_LOAD_FIT=y
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_BOOTCOMMAND="if test ${boot_fit} -eq 1; then run update_to_fit; fi; run findfdt; run init_console; run envboot; run distro_bootcmd"
+CONFIG_LOGLEVEL=3
 CONFIG_SYS_CONSOLE_INFO_QUIET=y
 CONFIG_VERSION_VARIABLE=y
 CONFIG_ARCH_MISC_INIT=y
+CONFIG_SPL_ETH_SUPPORT=y
 # CONFIG_SPL_FS_EXT4 is not set
 CONFIG_SPL_MTD_SUPPORT=y
 CONFIG_SPL_MUSB_NEW_SUPPORT=y
 CONFIG_SPL_NET_SUPPORT=y
-CONFIG_SPL_NET_VCI_STRING="AM33xx U-Boot SPL"
+CONFIG_SPL_NET_VCI_STRING="AM335x U-Boot SPL"
 CONFIG_SPL_OS_BOOT=y
 CONFIG_SPL_USB_GADGET=y
 CONFIG_SPL_USB_ETHER=y
@@ -31,6 +33,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_DEFAULT_DEVICE_TREE="am335x-evm"
 CONFIG_OF_LIST="am335x-evm am335x-bone am335x-boneblack am335x-evmsk am335x-bonegreen am335x-icev2"
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
+CONFIG_SPL_ENV_IS_NOWHERE=y
 CONFIG_BOOTCOUNT_LIMIT=y
 CONFIG_DFU_MMC=y
 CONFIG_DFU_NAND=y
@@ -39,6 +42,7 @@ CONFIG_USB_FUNCTION_FASTBOOT=y
 CONFIG_DM_I2C=y
 CONFIG_MISC=y
 CONFIG_DM_MMC=y
+# CONFIG_MMC_HW_PARTITIONING is not set
 CONFIG_MMC_OMAP_HS=y
 CONFIG_NAND=y
 CONFIG_DM_SPI_FLASH=y
@@ -46,7 +50,6 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_SPEED=24000000
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_DM_ETH=y
-CONFIG_PHY_GIGE=y
 CONFIG_MII=y
 CONFIG_DRIVER_TI_CPSW=y
 CONFIG_SPI=y
@@ -61,7 +64,6 @@ CONFIG_SPL_DM_USB_GADGET=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
 CONFIG_USB_MUSB_TI=y
-CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
 CONFIG_USB_GADGET_VENDOR_NUM=0x0451
@@ -70,3 +72,4 @@ CONFIG_USB_ETHER=y
 CONFIG_DYNAMIC_CRC_TABLE=y
 CONFIG_RSA=y
 CONFIG_LZO=y
+# CONFIG_OF_LIBFDT_OVERLAY is not set
diff --git a/configs/am335x_guardian_defconfig b/configs/am335x_guardian_defconfig
new file mode 100644 (file)
index 0000000..c25a1a9
--- /dev/null
@@ -0,0 +1,90 @@
+CONFIG_ARM=y
+CONFIG_ARCH_OMAP2PLUS=y
+CONFIG_SPL_GPIO_SUPPORT=y
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_AM33XX=y
+CONFIG_TARGET_AM335X_GUARDIAN=y
+CONFIG_SPL_MMC_SUPPORT=y
+CONFIG_SPL_SERIAL_SUPPORT=y
+CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
+CONFIG_SPL=y
+CONFIG_SPL_LIBDISK_SUPPORT=y
+CONFIG_DISTRO_DEFAULTS=y
+CONFIG_BOOTSTAGE_STASH_ADDR=0x0
+CONFIG_CONSOLE_MUX=y
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+CONFIG_VERSION_VARIABLE=y
+CONFIG_ARCH_MISC_INIT=y
+# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
+CONFIG_SPL_SEPARATE_BSS=y
+CONFIG_SPL_ENV_SUPPORT=y
+CONFIG_SPL_ETH_SUPPORT=y
+CONFIG_SPL_I2C_SUPPORT=y
+CONFIG_SPL_MUSB_NEW_SUPPORT=y
+CONFIG_SPL_NET_SUPPORT=y
+CONFIG_SPL_NET_VCI_STRING="Guardian U-Boot SPL"
+CONFIG_SPL_POWER_SUPPORT=y
+CONFIG_SPL_USB_GADGET=y
+CONFIG_SPL_USB_ETHER=y
+CONFIG_SPL_WATCHDOG_SUPPORT=y
+CONFIG_SPL_YMODEM_SUPPORT=y
+CONFIG_AUTOBOOT_KEYED=y
+CONFIG_AUTOBOOT_PROMPT="Press SPACE to abort autoboot in %d seconds\n"
+CONFIG_AUTOBOOT_DELAY_STR="d"
+CONFIG_AUTOBOOT_STOP_STR=" "
+CONFIG_CMD_SPL=y
+CONFIG_CMD_SPL_NAND_OFS=0x0
+CONFIG_CMD_ASKENV=y
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_GPT=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_MTD=y
+CONFIG_CMD_NAND=y
+CONFIG_CMD_USB=y
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_EXT4_WRITE=y
+CONFIG_CMD_MTDPARTS=y
+CONFIG_MTDPARTS_DEFAULT="mtdparts=nand.0:256k(SPL),256k(SPL.backup1),256k(SPL.backup2),256k(SPL.backup3),1m(u-boot),1m(u-boot.backup1),256k(u-boot-env),256k(u-boot-env.backup1),-(UBI)"
+CONFIG_CMD_UBI=y
+# CONFIG_SPL_DOS_PARTITION is not set
+# CONFIG_ISO_PARTITION is not set
+# CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_OF_CONTROL=y
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_DEFAULT_DEVICE_TREE="am335x-guardian"
+CONFIG_ENV_IS_IN_NAND=y
+CONFIG_SPL_ENV_IS_NOWHERE=y
+CONFIG_SPL_DM=y
+CONFIG_BOOTCOUNT_LIMIT=y
+CONFIG_BOOTCOUNT_ENV=y
+CONFIG_MISC=y
+CONFIG_DM_MMC=y
+CONFIG_MMC_OMAP_HS=y
+CONFIG_MTD=y
+CONFIG_NAND=y
+CONFIG_SYS_NAND_U_BOOT_LOCATIONS=y
+CONFIG_SYS_NAND_U_BOOT_OFFS=0x100000
+CONFIG_SYS_NAND_U_BOOT_OFFS_REDUND=0x200000
+CONFIG_MTD_UBI_FASTMAP=y
+CONFIG_PHYLIB=y
+CONFIG_DM_ETH=y
+CONFIG_PHY=y
+CONFIG_NOP_PHY=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_SINGLE=y
+CONFIG_USB=y
+CONFIG_DM_USB_GADGET=y
+CONFIG_SPL_DM_USB_GADGET=y
+CONFIG_USB_MUSB_HOST=y
+CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_TI=y
+CONFIG_USB_MUSB_DSPS=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
+CONFIG_USB_GADGET_VENDOR_NUM=0x0451
+CONFIG_USB_GADGET_PRODUCT_NUM=0xd022
+CONFIG_USB_ETHER=y
+CONFIG_FAT_WRITE=y
index 1746df90f411bcb79008e63220050d83bc3b9a0e..a37966bc6dcb3038e4e5a004abed4d8f3424db29 100644 (file)
@@ -60,7 +60,6 @@ CONFIG_DM_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
 CONFIG_USB_MUSB_TI=y
-CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
 CONFIG_USB_GADGET_VENDOR_NUM=0x0451
index d2d6f2fb6e4d11595d256642c1742e08f817864b..ff131eb60178d60d04b1c7e2037b19f25823bcaa 100644 (file)
@@ -62,7 +62,6 @@ CONFIG_DM_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
 CONFIG_USB_MUSB_TI=y
-CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
 CONFIG_USB_GADGET_VENDOR_NUM=0x0451
index 3d710202251bc9599ee56e63526278ed53513f35..e5de83386f3a3d0ebfe54b73d9a04b1feb32d592 100644 (file)
@@ -40,9 +40,13 @@ CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
 CONFIG_DM=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_SPL_REGMAP=y
+CONFIG_SPL_SYSCON=y
+CONFIG_SPL_OF_TRANSLATE=y
 CONFIG_DWC_AHCI=y
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
+CONFIG_DFU_SF=y
 CONFIG_USB_FUNCTION_FASTBOOT=y
 CONFIG_FASTBOOT_BUF_ADDR=0x82000000
 CONFIG_FASTBOOT_BUF_SIZE=0x2F000000
index 8f6fd25531b425d0e32e7ca3f76c91a08c4b2785..724b4bc09ff5550b7f0725804ab7af47d5f4790b 100644 (file)
@@ -15,6 +15,7 @@ CONFIG_DISTRO_DEFAULTS=y
 CONFIG_NR_DRAM_BANKS=2
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
 CONFIG_SPL_LOAD_FIT=y
+CONFIG_OF_BOARD_SETUP=y
 CONFIG_BOOTCOMMAND="run findfdt; run envboot; run init_${boot}; run get_kern_${boot}; run get_fdt_${boot}; run run_kern"
 # CONFIG_DISPLAY_CPUINFO is not set
 CONFIG_SPL_SYS_MALLOC_SIMPLE=y
@@ -48,10 +49,11 @@ CONFIG_SPL_DM_SEQ_ALIAS=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_DM_MAILBOX=y
 CONFIG_K3_SEC_PROXY=y
-CONFIG_MISC=y
 CONFIG_DM_MMC=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_K3_ARASAN=y
@@ -67,5 +69,6 @@ CONFIG_REMOTEPROC_K3=y
 CONFIG_DM_RESET=y
 CONFIG_RESET_TI_SCI=y
 CONFIG_DM_SERIAL=y
+CONFIG_SOC_TI=y
 CONFIG_SYSRESET=y
 CONFIG_SYSRESET_TI_SCI=y
diff --git a/configs/ap152_defconfig b/configs/ap152_defconfig
new file mode 100644 (file)
index 0000000..21cb6eb
--- /dev/null
@@ -0,0 +1,49 @@
+CONFIG_MIPS=y
+CONFIG_SYS_TEXT_BASE=0x9F000000
+CONFIG_SYS_MALLOC_F_LEN=0x800
+CONFIG_SYS_CACHE_SIZE_AUTO=y
+CONFIG_DEBUG_UART_BOARD_INIT=y
+CONFIG_DEBUG_UART_BASE=0xb8020000
+CONFIG_DEBUG_UART_CLOCK=25000000
+CONFIG_ARCH_ATH79=y
+CONFIG_TARGET_AP152=y
+CONFIG_DEBUG_UART=y
+CONFIG_BOOTDELAY=3
+CONFIG_USE_BOOTARGS=y
+CONFIG_BOOTARGS="console=ttyS0,115200 root=/dev/mtdblock2 rootfstype=squashfs"
+CONFIG_DISPLAY_CPUINFO=y
+CONFIG_BOARD_EARLY_INIT_F=y
+CONFIG_SYS_PROMPT="ap152 # "
+# CONFIG_CMD_BDI is not set
+# CONFIG_CMD_CONSOLE is not set
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_XIMG is not set
+# CONFIG_CMD_EXPORTENV is not set
+# CONFIG_CMD_IMPORTENV is not set
+# CONFIG_CMD_EDITENV is not set
+# CONFIG_CMD_CRC32 is not set
+CONFIG_CMD_MEMTEST=y
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+CONFIG_CMD_MTDPARTS=y
+CONFIG_MTDIDS_DEFAULT="nor0=spi-flash.0"
+CONFIG_MTDPARTS_DEFAULT="mtdparts=spi-flash.0:256k(u-boot),64k(u-boot-env),6336k(rootfs),1472k(uImage),64k(ART)"
+# CONFIG_ISO_PARTITION is not set
+CONFIG_DEFAULT_DEVICE_TREE="ap152"
+CONFIG_ENV_IS_IN_SPI_FLASH=y
+# CONFIG_NET is not set
+CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_BAR=y
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_SPI_FLASH_DATAFLASH=y
+CONFIG_SPI_FLASH_MTD=y
+CONFIG_PINCTRL=y
+CONFIG_DM_SERIAL=y
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_SYS_NS16550=y
+CONFIG_SPI=y
+CONFIG_DM_SPI=y
+CONFIG_ATH79_SPI=y
+CONFIG_LZMA=y
index 86dabd37360e9b2fb070b8df6d4582dca36f6cb1..06695208bc891028440e2c8ae7cf52ab97acc120 100644 (file)
@@ -9,12 +9,14 @@ CONFIG_SPL_MMC_SUPPORT=y
 CONFIG_SPL_SERIAL_SUPPORT=y
 CONFIG_SPL=y
 CONFIG_CMD_HDMIDETECT=y
-CONFIG_ENV_VARS_UBOOT_CONFIG=y
+CONFIG_AHCI=y
+CONFIG_DISTRO_DEFAULTS=y
 CONFIG_NR_DRAM_BANKS=1
+CONFIG_FIT=y
 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/spl_sd.cfg,MX6Q"
 CONFIG_BOOTDELAY=1
 # CONFIG_CONSOLE_MUX is not set
-CONFIG_SUPPORT_RAW_INITRD=y
+CONFIG_SYS_CONSOLE_IS_IN_ENV=y
 CONFIG_MISC_INIT_R=y
 CONFIG_VERSION_VARIABLE=y
 # CONFIG_DISPLAY_BOARDINFO is not set
@@ -26,9 +28,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 CONFIG_SPL_USB_HOST_SUPPORT=y
 CONFIG_SPL_USB_GADGET=y
 CONFIG_SPL_USB_SDP_SUPPORT=y
-CONFIG_HUSH_PARSER=y
 CONFIG_SYS_PROMPT="Apalis iMX6 # "
-CONFIG_CMD_BOOTZ=y
 # CONFIG_CMD_ELF is not set
 # CONFIG_CMD_IMI is not set
 # CONFIG_CMD_XIMG is not set
@@ -38,30 +38,41 @@ CONFIG_CMD_MEMTEST=y
 CONFIG_SYS_ALT_MEMTEST=y
 CONFIG_CMD_DFU=y
 CONFIG_CMD_GPIO=y
+CONFIG_CMD_GPT=y
 CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
 CONFIG_CMD_USB=y
 CONFIG_CMD_USB_SDP=y
 CONFIG_CMD_USB_MASS_STORAGE=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
 CONFIG_CMD_BMP=y
 CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4=y
-CONFIG_CMD_FAT=y
-CONFIG_CMD_FS_GENERIC=y
+CONFIG_CMD_PMIC=y
+CONFIG_CMD_REGULATOR=y
+CONFIG_OF_CONTROL=y
+CONFIG_DEFAULT_DEVICE_TREE="imx6-apalis"
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
 CONFIG_DWC_AHSATA=y
 CONFIG_DFU_MMC=y
+CONFIG_DM_GPIO=y
+CONFIG_DM_I2C=y
+CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
 CONFIG_PHYLIB=y
 CONFIG_PHY_MICREL=y
 CONFIG_PHY_MICREL_KSZ90X1=y
 CONFIG_MII=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_IMX6=y
+CONFIG_DM_PMIC=y
+CONFIG_DM_PMIC_PFUZE100=y
+CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_PFUZE100=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_DM_SCSI=y
+CONFIG_IMX_THERMAL=y
 CONFIG_USB=y
-CONFIG_USB_STORAGE=y
+CONFIG_DM_USB=y
 CONFIG_USB_KEYBOARD=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Toradex"
@@ -70,8 +81,8 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0x4000
 CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
 CONFIG_USB_HOST_ETHER=y
-CONFIG_VIDEO=y
+CONFIG_DM_VIDEO=y
+CONFIG_SYS_WHITE_ON_BLACK=y
+CONFIG_VIDEO_IPUV3=y
 CONFIG_FAT_WRITE=y
-CONFIG_OF_LIBFDT=y
 CONFIG_OF_LIBFDT_OVERLAY=y
-# CONFIG_EFI_LOADER is not set
diff --git a/configs/apalis_imx6_nospl_com_defconfig b/configs/apalis_imx6_nospl_com_defconfig
deleted file mode 100644 (file)
index b6ab528..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SYS_THUMB_BUILD=y
-CONFIG_ARCH_MX6=y
-CONFIG_SYS_TEXT_BASE=0x17800000
-CONFIG_TARGET_APALIS_IMX6=y
-CONFIG_CMD_HDMIDETECT=y
-CONFIG_ENV_VARS_UBOOT_CONFIG=y
-CONFIG_NR_DRAM_BANKS=1
-CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/toradex/apalis_imx6/apalis_imx6q.cfg,MX6Q,DDR_MB=1024"
-CONFIG_BOOTDELAY=1
-# CONFIG_CONSOLE_MUX is not set
-CONFIG_SUPPORT_RAW_INITRD=y
-CONFIG_MISC_INIT_R=y
-CONFIG_VERSION_VARIABLE=y
-# CONFIG_DISPLAY_BOARDINFO is not set
-CONFIG_DISPLAY_BOARDINFO_LATE=y
-CONFIG_BOUNCE_BUFFER=y
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_HUSH_PARSER=y
-CONFIG_SYS_PROMPT="Apalis iMX6 # "
-CONFIG_CMD_BOOTZ=y
-# CONFIG_CMD_ELF is not set
-# CONFIG_CMD_IMI is not set
-# CONFIG_CMD_XIMG is not set
-CONFIG_CMD_ASKENV=y
-CONFIG_CRC32_VERIFY=y
-CONFIG_CMD_MEMTEST=y
-CONFIG_SYS_ALT_MEMTEST=y
-CONFIG_CMD_DFU=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_USB_MASS_STORAGE=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_BMP=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4=y
-CONFIG_CMD_FAT=y
-CONFIG_CMD_FS_GENERIC=y
-CONFIG_ENV_IS_IN_MMC=y
-CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
-CONFIG_DWC_AHSATA=y
-CONFIG_DFU_MMC=y
-CONFIG_FSL_ESDHC=y
-CONFIG_PHYLIB=y
-CONFIG_PHY_MICREL=y
-CONFIG_PHY_MICREL_KSZ90X1=y
-CONFIG_MII=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_USB_KEYBOARD=y
-CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="Toradex"
-CONFIG_USB_GADGET_VENDOR_NUM=0x1b67
-CONFIG_USB_GADGET_PRODUCT_NUM=0x4020
-CONFIG_CI_UDC=y
-CONFIG_USB_GADGET_DOWNLOAD=y
-CONFIG_USB_HOST_ETHER=y
-CONFIG_VIDEO=y
-CONFIG_FAT_WRITE=y
-CONFIG_OF_LIBFDT=y
-# CONFIG_EFI_LOADER is not set
diff --git a/configs/apalis_imx6_nospl_it_defconfig b/configs/apalis_imx6_nospl_it_defconfig
deleted file mode 100644 (file)
index c972b11..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SYS_THUMB_BUILD=y
-CONFIG_ARCH_MX6=y
-CONFIG_SYS_TEXT_BASE=0x17800000
-CONFIG_TARGET_APALIS_IMX6=y
-CONFIG_CMD_HDMIDETECT=y
-CONFIG_ENV_VARS_UBOOT_CONFIG=y
-CONFIG_NR_DRAM_BANKS=1
-CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/toradex/apalis_imx6/apalis_imx6q.cfg,MX6Q,DDR_MB=2048"
-CONFIG_BOOTDELAY=1
-# CONFIG_CONSOLE_MUX is not set
-CONFIG_SUPPORT_RAW_INITRD=y
-CONFIG_MISC_INIT_R=y
-CONFIG_VERSION_VARIABLE=y
-# CONFIG_DISPLAY_BOARDINFO is not set
-CONFIG_DISPLAY_BOARDINFO_LATE=y
-CONFIG_BOUNCE_BUFFER=y
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_HUSH_PARSER=y
-CONFIG_SYS_PROMPT="Apalis iMX6 # "
-CONFIG_CMD_BOOTZ=y
-# CONFIG_CMD_ELF is not set
-# CONFIG_CMD_IMI is not set
-# CONFIG_CMD_XIMG is not set
-CONFIG_CMD_ASKENV=y
-CONFIG_CRC32_VERIFY=y
-CONFIG_CMD_MEMTEST=y
-CONFIG_SYS_ALT_MEMTEST=y
-CONFIG_CMD_DFU=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_USB_MASS_STORAGE=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_BMP=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4=y
-CONFIG_CMD_FAT=y
-CONFIG_CMD_FS_GENERIC=y
-CONFIG_ENV_IS_IN_MMC=y
-CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
-CONFIG_DWC_AHSATA=y
-CONFIG_DFU_MMC=y
-CONFIG_FSL_ESDHC=y
-CONFIG_PHYLIB=y
-CONFIG_PHY_MICREL=y
-CONFIG_PHY_MICREL_KSZ90X1=y
-CONFIG_MII=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_USB_KEYBOARD=y
-CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="Toradex"
-CONFIG_USB_GADGET_VENDOR_NUM=0x1b67
-CONFIG_USB_GADGET_PRODUCT_NUM=0x4020
-CONFIG_CI_UDC=y
-CONFIG_USB_GADGET_DOWNLOAD=y
-CONFIG_USB_HOST_ETHER=y
-CONFIG_VIDEO=y
-CONFIG_FAT_WRITE=y
-CONFIG_OF_LIBFDT=y
-# CONFIG_EFI_LOADER is not set
index b852b4d630ad3f841bf303df6987241027af0323..1dd2c3b6b885b75068d2a48bcd4040c9a5e08da3 100644 (file)
@@ -55,6 +55,7 @@ CONFIG_MXC_SPI=y
 CONFIG_USB=y
 CONFIG_USB_STORAGE=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_IMX_WATCHDOG=y
 CONFIG_OF_LIBFDT=y
index 7806d0a41c08976de989d76f7a8eb311c1bfa7be..e58541f7e07013777512ad9c096cea0a30bd322d 100644 (file)
@@ -53,6 +53,7 @@ CONFIG_MXC_SPI=y
 CONFIG_USB=y
 CONFIG_USB_STORAGE=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_IMX_WATCHDOG=y
 CONFIG_OF_LIBFDT=y
index bad6aebf0061dd6d5c9b305c25aa80e9cc154780..0f2412ba8014142aa16d237455103f8afa4ccc4d 100644 (file)
@@ -53,6 +53,7 @@ CONFIG_MXC_SPI=y
 CONFIG_USB=y
 CONFIG_USB_STORAGE=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_IMX_WATCHDOG=y
 CONFIG_OF_LIBFDT=y
index 0c8af405a971909f56fd5d16379c5fe58938b283..8255d9fa068a94bae43fbf96ec0e135362d8e3f5 100644 (file)
@@ -35,7 +35,9 @@ CONFIG_DM=y
 CONFIG_DM_GPIO=y
 CONFIG_HSDK_CREG_GPIO=y
 CONFIG_MMC=y
+CONFIG_DM_MMC=y
 CONFIG_MMC_DW=y
+CONFIG_MMC_DW_SNPS=y
 CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_STMICRO=y
index 597618fb900bfd4e42039734852ba1f606289c37..4e4734655fc9d1c891a1d7c8127d236a4af1271f 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=672
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 CONFIG_MACPWR="PD6"
 CONFIG_MMC_SUNXI_SLOT_EXTRA=2
 CONFIG_NR_DRAM_BANKS=1
index e7c10dbdf2d0c94c96e9286dc41dfaf2b63df803..29dd892d7f07f333ed7c08a12739b1440457d6ea 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN50I_H5=y
 CONFIG_DRAM_CLK=672
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 CONFIG_MACPWR="PD6"
 CONFIG_MMC_SUNXI_SLOT_EXTRA=2
 CONFIG_NR_DRAM_BANKS=1
index 91302eb49cf880a1e8a42e1ca2447ac6dd5b5b6a..8546674b2395a4c9ba060ee3dd7d3869e3d722ab 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=408
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 CONFIG_MMC0_CD_PIN=""
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
 # CONFIG_CMD_FLASH is not set
index fc55e98550a2f1dc6aa199c04a07882045e5ca4e..528b7144f52fee0704b10047a443caecef0cfb57 100644 (file)
@@ -20,6 +20,9 @@ CONFIG_CMD_BOOTEFI_SELFTEST=y
 # CONFIG_CMD_LZMADEC is not set
 # CONFIG_CMD_UNZIP is not set
 # CONFIG_CMD_FLASH is not set
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_MTD=y
+CONFIG_CMD_NAND=y
 CONFIG_CMD_CACHE=y
 CONFIG_DOS_PARTITION=y
 CONFIG_ISO_PARTITION=y
@@ -28,7 +31,16 @@ CONFIG_DEFAULT_DEVICE_TREE="bcm963158"
 # CONFIG_NET is not set
 CONFIG_BLK=y
 CONFIG_CLK=y
+CONFIG_DM_GPIO=y
+CONFIG_BCM6345_GPIO=y
+CONFIG_LED=y
+CONFIG_LED_BCM6858=y
+CONFIG_LED_BLINK=y
 # CONFIG_MMC is not set
+CONFIG_MTD=y
+CONFIG_NAND=y
+CONFIG_NAND_BRCMNAND=y
+CONFIG_NAND_BRCMNAND_63158=y
 CONFIG_SPECIFY_CONSOLE_INDEX=y
 # CONFIG_SPL_SERIAL_PRESENT is not set
 CONFIG_CONS_INDEX=0
index 61661bd756c7ef8de95e2dcef83f8ff0be71d6c4..53423e56eb8c49a28ad879e0ca9b01272e497745 100644 (file)
@@ -24,16 +24,25 @@ CONFIG_CMD_LICENSE=y
 # CONFIG_CMD_CRC32 is not set
 CONFIG_CMD_MEMINFO=y
 # CONFIG_CMD_FLASH is not set
+CONFIG_CMD_GPIO=y
 # CONFIG_CMD_LOADS is not set
+CONFIG_CMD_NAND=y
 # CONFIG_CMD_MISC is not set
 CONFIG_DEFAULT_DEVICE_TREE="brcm,bcm968380gerg"
 # CONFIG_NET is not set
 # CONFIG_DM_DEVICE_REMOVE is not set
 CONFIG_HAVE_BLOCK_DEVICE=y
 CONFIG_DM_GPIO=y
+CONFIG_BCM6345_GPIO=y
 CONFIG_LED=y
 CONFIG_LED_BCM6328=y
 CONFIG_LED_BLINK=y
+CONFIG_MTD=y
+CONFIG_NAND=y
+CONFIG_NAND_BRCMNAND=y
+CONFIG_NAND_BRCMNAND_6838=y
+CONFIG_SPI_FLASH=y
+# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
 CONFIG_PHY=y
 CONFIG_BCM6368_USBH_PHY=y
 CONFIG_PINCTRL=y
index e8cb3a0d2a9bcc4d304bfbf0e58929445bc71afd..62c33d174fb8ad27cd6de8a8155ab09d0e71146a 100644 (file)
@@ -15,6 +15,10 @@ CONFIG_SUPPORT_RAW_INITRD=y
 CONFIG_DISPLAY_BOARDINFO_LATE=y
 CONFIG_HUSH_PARSER=y
 CONFIG_CMD_BOOTEFI_SELFTEST=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_MTD=y
+CONFIG_CMD_NAND=y
+CONFIG_CMD_PART=y
 CONFIG_DOS_PARTITION=y
 CONFIG_ISO_PARTITION=y
 CONFIG_EFI_PARTITION=y
@@ -22,7 +26,16 @@ CONFIG_DEFAULT_DEVICE_TREE="bcm968580xref"
 # CONFIG_NET is not set
 CONFIG_BLK=y
 CONFIG_CLK=y
+CONFIG_DM_GPIO=y
+CONFIG_BCM6345_GPIO=y
+CONFIG_LED=y
+CONFIG_LED_BCM6858=y
+CONFIG_LED_BLINK=y
 # CONFIG_MMC is not set
+CONFIG_MTD=y
+CONFIG_NAND=y
+CONFIG_NAND_BRCMNAND=y
+CONFIG_NAND_BRCMNAND_6858=y
 CONFIG_SPECIFY_CONSOLE_INDEX=y
 # CONFIG_SPL_SERIAL_PRESENT is not set
 CONFIG_CONS_INDEX=0
index 9e31b4ac979534d3841f4420fe924f47d7b7cac7..439207fd39a287d042fbcd6fe5ccf5627d853bb8 100644 (file)
@@ -2,15 +2,18 @@ CONFIG_ARM=y
 CONFIG_SYS_THUMB_BUILD=y
 CONFIG_ARCH_VF610=y
 CONFIG_SYS_TEXT_BASE=0x3f401000
+CONFIG_SYS_MALLOC_F_LEN=0x800
 CONFIG_TARGET_BK4R1=y
 CONFIG_NR_DRAM_BANKS=1
+CONFIG_FIT=y
 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/phytec/pcm052/imximage.cfg"
 CONFIG_BOOTDELAY=3
 CONFIG_BOARD_EARLY_INIT_F=y
 CONFIG_HUSH_PARSER=y
-CONFIG_CMD_BOOTZ=y
-CONFIG_CMD_EEPROM=y
+# CONFIG_CMD_ELF is not set
 CONFIG_CMD_MEMTEST=y
+CONFIG_CMD_DM=y
+CONFIG_CMD_FUSE=y
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
@@ -19,19 +22,44 @@ CONFIG_CMD_SF=y
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
+CONFIG_CMD_BOOTCOUNT=y
 CONFIG_CMD_FAT=y
-CONFIG_MTDIDS_DEFAULT="nand0=NAND,nor0=NOR"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=NAND:640k(bootloader),128k(env1),128k(env2),128k(dtb),6144k(kernel),-(root);NOR:-(nor)"
+CONFIG_MTDIDS_DEFAULT="nand0=vf610_nfc,nor0=NOR"
+CONFIG_MTDPARTS_DEFAULT="mtdparts=vf610_nfc:2048k(bootloader),128k(env1),128k(env2),10240k(initrd),40960k(dtbkernel),-(system);NOR:-(nor)"
 CONFIG_CMD_UBI=y
 CONFIG_OF_CONTROL=y
-CONFIG_DEFAULT_DEVICE_TREE="bk4r1"
+CONFIG_DEFAULT_DEVICE_TREE="vf610-bk4r1"
 CONFIG_ENV_IS_IN_NAND=y
+CONFIG_NETCONSOLE=y
 CONFIG_DM=y
+CONFIG_BOOTCOUNT_LIMIT=y
+CONFIG_BOOTCOUNT_BOOTLIMIT=3
+CONFIG_SYS_BOOTCOUNT_SINGLEWORD=y
+CONFIG_SYS_BOOTCOUNT_ADDR=0x4006e02c
 CONFIG_DM_GPIO=y
 CONFIG_VYBRID_GPIO=y
+CONFIG_DM_I2C=y
+CONFIG_I2C_SET_DEFAULT_BUS_NUM=y
+CONFIG_I2C_DEFAULT_BUS_NUMBER=0x2
+CONFIG_SYS_I2C_MXC=y
+CONFIG_SYS_I2C_MXC_I2C1=y
+CONFIG_SYS_I2C_MXC_I2C2=y
+CONFIG_SYS_I2C_MXC_I2C3=y
+CONFIG_SYS_I2C_MXC_I2C4=y
+CONFIG_LED=y
+CONFIG_LED_GPIO=y
+CONFIG_MISC=y
+CONFIG_I2C_EEPROM=y
+CONFIG_SYS_I2C_EEPROM_ADDR=0x50
+CONFIG_SYS_I2C_EEPROM_BUS=2
+CONFIG_SYS_EEPROM_SIZE=32768
+CONFIG_SYS_EEPROM_PAGE_WRITE_BITS=6
+CONFIG_SYS_I2C_EEPROM_ADDR_LEN=2
+CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
+CONFIG_MTD=y
 CONFIG_NAND_VF610_NFC=y
+CONFIG_NAND_VF610_NFC_DT=y
 CONFIG_SYS_NAND_BUSWIDTH_16BIT=y
 CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH=y
@@ -39,10 +67,18 @@ CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_SPI_FLASH_MTD=y
 CONFIG_PHYLIB=y
 CONFIG_PHY_MICREL=y
+CONFIG_DM_ETH=y
+CONFIG_FEC_MXC=y
 CONFIG_MII=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_VYBRID=y
+CONFIG_DM_RTC=y
 CONFIG_RTC_M41T62=y
+# CONFIG_SPL_SERIAL_PRESENT is not set
+# CONFIG_TPL_SERIAL_PRESENT is not set
 CONFIG_DM_SERIAL=y
 CONFIG_FSL_LPUART=y
 CONFIG_SPI=y
 CONFIG_DM_SPI=y
 CONFIG_FSL_QSPI=y
+# CONFIG_EFI_LOADER is not set
index 6b0d0242f2ebd5bb94e59543513032deb3b1ee48..63cb240ea89b1af23bd997a925f49da6ff806dba 100644 (file)
@@ -84,7 +84,6 @@ CONFIG_DM_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
 CONFIG_USB_MUSB_TI=y
-CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_FAT_WRITE=y
index 4578f74a62089265a9991d9f772097ac5e7d125b..57cd54bac26da6e16ee3d26ac551ce550999646a 100644 (file)
@@ -88,7 +88,6 @@ CONFIG_DM_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
 CONFIG_USB_MUSB_TI=y
-CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_FAT_WRITE=y
index 739b0786f34a8810dfbe3b6fd3d324e9bb14dab7..31ba5158b5865f9abd2f38b43dfb0ad8d83bc312 100644 (file)
@@ -99,7 +99,6 @@ CONFIG_DM_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
 CONFIG_USB_MUSB_TI=y
-CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_FAT_WRITE=y
index 2311c4f3aaeed4f5191d8b49f46fd0659f5fb648..d5d170f30873684fb33dc4acddb20b1dedf8198e 100644 (file)
@@ -74,5 +74,6 @@ CONFIG_CI_UDC=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
index a6c36eda503d7377e698b15b4a76449459d293fb..944dd0db3c87164461bb909f1527020ca88b3324 100644 (file)
@@ -50,6 +50,5 @@ CONFIG_USB=y
 CONFIG_DM_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_TI=y
-CONFIG_USB_MUSB_DSPS=y
 CONFIG_FAT_WRITE=y
 CONFIG_LZO=y
diff --git a/configs/cl-som-am57x_defconfig b/configs/cl-som-am57x_defconfig
deleted file mode 100644 (file)
index fd8353e..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-CONFIG_ARM=y
-CONFIG_ARCH_OMAP2PLUS=y
-CONFIG_OMAP54XX=y
-CONFIG_TARGET_CL_SOM_AM57X=y
-CONFIG_SPL=y
-CONFIG_SPL_SPI_FLASH_SUPPORT=y
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_NR_DRAM_BANKS=2
-# CONFIG_USE_BOOTCOMMAND is not set
-CONFIG_VERSION_VARIABLE=y
-# CONFIG_SPL_FS_EXT4 is not set
-# CONFIG_SPL_NAND_SUPPORT is not set
-CONFIG_SPL_SPI_LOAD=y
-CONFIG_SYS_PROMPT="U-Boot# "
-CONFIG_CMD_ASKENV=y
-CONFIG_CMD_EEPROM=y
-CONFIG_CMD_EEPROM_LAYOUT=y
-CONFIG_EEPROM_LAYOUT_HELP_STRING="v2, v3"
-# CONFIG_CMD_FLASH is not set
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_GPT=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_SPI=y
-CONFIG_CMD_USB=y
-# CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_EXT4_WRITE=y
-CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
-CONFIG_SCSI_AHCI=y
-CONFIG_CMD_PCA953X=y
-CONFIG_LED_STATUS=y
-CONFIG_LED_STATUS_GPIO=y
-CONFIG_LED_STATUS0=y
-CONFIG_LED_STATUS_BIT=37
-CONFIG_LED_STATUS_STATE=2
-CONFIG_MMC_OMAP_HS=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_SPEED=48000000
-CONFIG_SPI_FLASH_ATMEL=y
-CONFIG_SPI_FLASH_EON=y
-CONFIG_SPI_FLASH_GIGADEVICE=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_MII=y
-CONFIG_DRIVER_TI_CPSW=y
-CONFIG_CONS_INDEX=3
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_TI_QSPI=y
-CONFIG_USB=y
-CONFIG_USB_XHCI_HCD=y
-CONFIG_USB_XHCI_DWC3=y
-CONFIG_OMAP_USB_PHY=y
-CONFIG_USB_HOST_ETHER=y
-CONFIG_USB_ETHER_ASIX=y
-CONFIG_USB_ETHER_MCS7830=y
-CONFIG_USB_ETHER_SMSC95XX=y
-CONFIG_FAT_WRITE=y
-CONFIG_OF_LIBFDT=y
index 6156ac2bee4bb620b7ec61dfd17d5ef50343cba2..4a46bb58c3359f2381b292c0f7a90b3310913313 100644 (file)
@@ -51,6 +51,7 @@ CONFIG_DEFAULT_DEVICE_TREE="imx6q-cm-fx6"
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
 CONFIG_DWC_AHSATA=y
+# CONFIG_DWC_AHSATA_AHCI is not set
 CONFIG_DM_KEYBOARD=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -78,4 +79,5 @@ CONFIG_DM_USB=y
 CONFIG_USB_KEYBOARD=y
 CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 CONFIG_FDT_FIXUP_PARTITIONS=y
index 207228135458d709d0518956c7dbdfb3efd167a3..bf05c688072abb0e5ce43290b92030743a1462c4 100644 (file)
@@ -9,12 +9,13 @@ CONFIG_SPL_MMC_SUPPORT=y
 CONFIG_SPL_SERIAL_SUPPORT=y
 CONFIG_SPL=y
 CONFIG_CMD_HDMIDETECT=y
-CONFIG_ENV_VARS_UBOOT_CONFIG=y
+CONFIG_DISTRO_DEFAULTS=y
 CONFIG_NR_DRAM_BANKS=1
+CONFIG_FIT=y
 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/spl_sd.cfg,MX6DL"
 CONFIG_BOOTDELAY=1
 # CONFIG_CONSOLE_MUX is not set
-CONFIG_SUPPORT_RAW_INITRD=y
+CONFIG_SYS_CONSOLE_IS_IN_ENV=y
 CONFIG_MISC_INIT_R=y
 CONFIG_VERSION_VARIABLE=y
 # CONFIG_DISPLAY_BOARDINFO is not set
@@ -26,9 +27,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 CONFIG_SPL_USB_HOST_SUPPORT=y
 CONFIG_SPL_USB_GADGET=y
 CONFIG_SPL_USB_SDP_SUPPORT=y
-CONFIG_HUSH_PARSER=y
 CONFIG_SYS_PROMPT="Colibri iMX6 # "
-CONFIG_CMD_BOOTZ=y
 # CONFIG_CMD_ELF is not set
 # CONFIG_CMD_IMI is not set
 # CONFIG_CMD_XIMG is not set
@@ -38,28 +37,38 @@ CONFIG_CMD_MEMTEST=y
 CONFIG_SYS_ALT_MEMTEST=y
 CONFIG_CMD_DFU=y
 CONFIG_CMD_GPIO=y
+CONFIG_CMD_GPT=y
 CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
 CONFIG_CMD_USB=y
 CONFIG_CMD_USB_SDP=y
 CONFIG_CMD_USB_MASS_STORAGE=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
 CONFIG_CMD_BMP=y
 CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4=y
-CONFIG_CMD_FAT=y
-CONFIG_CMD_FS_GENERIC=y
+CONFIG_CMD_PMIC=y
+CONFIG_CMD_REGULATOR=y
+CONFIG_OF_CONTROL=y
+CONFIG_DEFAULT_DEVICE_TREE="imx6-colibri"
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
 CONFIG_DFU_MMC=y
+CONFIG_DM_GPIO=y
+CONFIG_DM_I2C=y
+CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
 CONFIG_PHYLIB=y
 CONFIG_PHY_MICREL=y
 CONFIG_MII=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_IMX6=y
+CONFIG_DM_PMIC=y
+CONFIG_DM_PMIC_PFUZE100=y
+CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_PFUZE100=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_IMX_THERMAL=y
 CONFIG_USB=y
-CONFIG_USB_STORAGE=y
+CONFIG_DM_USB=y
 CONFIG_USB_KEYBOARD=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Toradex"
@@ -68,8 +77,7 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0x4000
 CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
 CONFIG_USB_HOST_ETHER=y
-CONFIG_VIDEO=y
+CONFIG_DM_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 CONFIG_FAT_WRITE=y
-CONFIG_OF_LIBFDT=y
 CONFIG_OF_LIBFDT_OVERLAY=y
-# CONFIG_EFI_LOADER is not set
diff --git a/configs/colibri_imx6_nospl_defconfig b/configs/colibri_imx6_nospl_defconfig
deleted file mode 100644 (file)
index 5e9490b..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SYS_THUMB_BUILD=y
-CONFIG_ARCH_MX6=y
-CONFIG_SYS_TEXT_BASE=0x17800000
-CONFIG_TARGET_COLIBRI_IMX6=y
-CONFIG_CMD_HDMIDETECT=y
-CONFIG_ENV_VARS_UBOOT_CONFIG=y
-CONFIG_NR_DRAM_BANKS=1
-CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/toradex/colibri_imx6/colibri_imx6.cfg,MX6DL,DDR_MB=256"
-CONFIG_BOOTDELAY=1
-# CONFIG_CONSOLE_MUX is not set
-CONFIG_SUPPORT_RAW_INITRD=y
-CONFIG_MISC_INIT_R=y
-CONFIG_VERSION_VARIABLE=y
-# CONFIG_DISPLAY_BOARDINFO is not set
-CONFIG_DISPLAY_BOARDINFO_LATE=y
-CONFIG_BOUNCE_BUFFER=y
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_HUSH_PARSER=y
-CONFIG_SYS_PROMPT="Colibri iMX6 # "
-CONFIG_CMD_BOOTZ=y
-# CONFIG_CMD_ELF is not set
-# CONFIG_CMD_IMI is not set
-# CONFIG_CMD_XIMG is not set
-CONFIG_CMD_ASKENV=y
-CONFIG_CRC32_VERIFY=y
-CONFIG_CMD_MEMTEST=y
-CONFIG_SYS_ALT_MEMTEST=y
-CONFIG_CMD_DFU=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_USB_MASS_STORAGE=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_BMP=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4=y
-CONFIG_CMD_FAT=y
-CONFIG_CMD_FS_GENERIC=y
-CONFIG_ENV_IS_IN_MMC=y
-CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
-CONFIG_DFU_MMC=y
-CONFIG_FSL_ESDHC=y
-CONFIG_PHYLIB=y
-CONFIG_PHY_MICREL=y
-CONFIG_MII=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_USB_KEYBOARD=y
-CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="Toradex"
-CONFIG_USB_GADGET_VENDOR_NUM=0x1b67
-CONFIG_USB_GADGET_PRODUCT_NUM=0x4000
-CONFIG_CI_UDC=y
-CONFIG_USB_GADGET_DOWNLOAD=y
-CONFIG_USB_HOST_ETHER=y
-CONFIG_VIDEO=y
-CONFIG_FAT_WRITE=y
-CONFIG_OF_LIBFDT=y
-# CONFIG_EFI_LOADER is not set
index 41925012571e14ea2ee7b8d6e7f1755cd649c2a4..8f6cceca7fd66649bd25618a14765a6d86a51b91 100644 (file)
@@ -2,6 +2,7 @@ CONFIG_ARM=y
 CONFIG_SYS_THUMB_BUILD=y
 CONFIG_ARCH_VF610=y
 CONFIG_SYS_TEXT_BASE=0x3f401000
+CONFIG_SYS_MALLOC_F_LEN=0x800
 CONFIG_TARGET_COLIBRI_VF=y
 CONFIG_ENV_VARS_UBOOT_CONFIG=y
 CONFIG_NR_DRAM_BANKS=1
@@ -16,11 +17,18 @@ CONFIG_BOARD_EARLY_INIT_F=y
 CONFIG_HUSH_PARSER=y
 # CONFIG_CMDLINE_EDITING is not set
 # CONFIG_AUTO_COMPLETE is not set
+# CONFIG_SYS_LONGHELP is not set
 CONFIG_SYS_PROMPT="Colibri VFxx # "
+# CONFIG_CMD_BOOTD is not set
+# CONFIG_CMD_BOOTM is not set
 CONFIG_CMD_BOOTZ=y
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_IMI is not set
 CONFIG_CMD_ASKENV=y
 CONFIG_CMD_MEMTEST=y
 CONFIG_CMD_DFU=y
+CONFIG_CMD_DM=y
+# CONFIG_CMD_FLASH is not set
 CONFIG_CMD_FUSE=y
 CONFIG_CMD_GPIO=y
 # CONFIG_CMD_LOADB is not set
@@ -45,17 +53,28 @@ CONFIG_DEFAULT_DEVICE_TREE="vf610-colibri"
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
 CONFIG_DM=y
-CONFIG_DFU_MMC=y
 CONFIG_DFU_NAND=y
 CONFIG_DM_GPIO=y
 CONFIG_VYBRID_GPIO=y
+CONFIG_DM_MMC=y
+# CONFIG_MMC_HW_PARTITIONING is not set
 CONFIG_FSL_ESDHC=y
+CONFIG_MTD=y
 CONFIG_NAND_VF610_NFC=y
+CONFIG_NAND_VF610_NFC_DT=y
 CONFIG_SYS_NAND_VF610_NFC_60_ECC_BYTES=y
 CONFIG_MTD_UBI_FASTMAP=y
 CONFIG_PHYLIB=y
 CONFIG_PHY_MICREL=y
+CONFIG_DM_ETH=y
+CONFIG_FEC_MXC=y
 CONFIG_MII=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_VYBRID=y
+CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
+# CONFIG_SPL_SERIAL_PRESENT is not set
+# CONFIG_TPL_SERIAL_PRESENT is not set
 CONFIG_DM_SERIAL=y
 CONFIG_FSL_LPUART=y
 CONFIG_USB=y
@@ -72,4 +91,5 @@ CONFIG_VIDEO_FSL_DCU_FB=y
 CONFIG_VIDEO=y
 CONFIG_SYS_CONSOLE_FG_COL=0x00
 CONFIG_OF_LIBFDT_OVERLAY=y
+CONFIG_FDT_FIXUP_PARTITIONS=y
 # CONFIG_EFI_UNICODE_CAPITALIZATION is not set
index a1af2f1342f5b590031e016f906946236d128e81..af159ecb4722931d6317e2c19fffd28a657973b4 100644 (file)
@@ -18,6 +18,7 @@ CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256k(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) root=/dev/mtdblock7 rw rootfstype=jffs2"
 # CONFIG_DISPLAY_BOARDINFO is not set
 CONFIG_BOARD_EARLY_INIT_F=y
+CONFIG_SPL_SYS_MALLOC_SIMPLE=y
 CONFIG_SPL_NAND_SUPPORT=y
 CONFIG_HUSH_PARSER=y
 CONFIG_SYS_PROMPT="U-Boot> "
@@ -34,10 +35,11 @@ CONFIG_CMD_USB=y
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_PING=y
 CONFIG_CMD_MTDPARTS=y
+CONFIG_DOS_PARTITION=y
 CONFIG_OF_CONTROL=y
-CONFIG_OF_EMBED=y
 CONFIG_DEFAULT_DEVICE_TREE="at91sam9g45-corvus"
 CONFIG_ENV_IS_IN_NAND=y
+CONFIG_BLK=y
 CONFIG_CLK=y
 CONFIG_CLK_AT91=y
 CONFIG_DFU_NAND=y
@@ -47,8 +49,8 @@ CONFIG_NAND_ATMEL=y
 CONFIG_PHYLIB=y
 CONFIG_ATMEL_USART=y
 CONFIG_USB=y
+CONFIG_DM_USB=y
 CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Siemens AG"
 CONFIG_USB_GADGET_VENDOR_NUM=0x0908
index b8c16baf9a9fb0c476e484633f46b095323e353f..419224104af4469b6eb99f634dda425f9069ade3 100644 (file)
@@ -39,10 +39,6 @@ CONFIG_SPL_OF_CONTROL=y
 CONFIG_DEFAULT_DEVICE_TREE="da850-evm"
 CONFIG_SPL_OF_PLATDATA=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_USE_ENV_SPI_MAX_HZ=y
-CONFIG_ENV_SPI_MAX_HZ=0
-CONFIG_USE_ENV_SPI_MODE=y
-CONFIG_ENV_SPI_MODE=0
 CONFIG_DM=y
 CONFIG_SPL_DM=y
 CONFIG_DA8XX_GPIO=y
index 3ee79432ca8c6d69d337792fb8db6415fcc14916..4b09ba10a6758292ff7eaa278c8c74fbbc93cd51 100644 (file)
@@ -1,4 +1,5 @@
 CONFIG_ARM=y
+CONFIG_SYS_THUMB_BUILD=y
 CONFIG_ARCH_DAVINCI=y
 CONFIG_SYS_TEXT_BASE=0xc1080000
 CONFIG_TARGET_DA850EVM=y
@@ -13,6 +14,7 @@ CONFIG_SPL_SPI_SUPPORT=y
 CONFIG_NR_DRAM_BANKS=1
 CONFIG_SYS_EXTRA_OPTIONS="MAC_ADDR_IN_SPIFLASH"
 CONFIG_BOOTDELAY=3
+CONFIG_DEFAULT_FDT_FILE="da850-evm.dtb"
 CONFIG_MISC_INIT_R=y
 CONFIG_VERSION_VARIABLE=y
 # CONFIG_DISPLAY_CPUINFO is not set
@@ -20,6 +22,7 @@ CONFIG_VERSION_VARIABLE=y
 CONFIG_BOARD_EARLY_INIT_F=y
 CONFIG_SPL_BOARD_INIT=y
 CONFIG_SPL_SYS_MALLOC_SIMPLE=y
+CONFIG_SPL_SEPARATE_BSS=y
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_HUSH_PARSER=y
 CONFIG_SYS_PROMPT="U-Boot > "
@@ -39,14 +42,11 @@ CONFIG_CMD_DIAG=y
 CONFIG_OF_CONTROL=y
 CONFIG_SPL_OF_CONTROL=y
 CONFIG_DEFAULT_DEVICE_TREE="da850-evm"
-CONFIG_SPL_OF_PLATDATA=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_USE_ENV_SPI_MAX_HZ=y
-CONFIG_ENV_SPI_MAX_HZ=0
-CONFIG_USE_ENV_SPI_MODE=y
-CONFIG_ENV_SPI_MODE=0
 CONFIG_DM=y
 CONFIG_SPL_DM=y
+CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_SPL_OF_TRANSLATE=y
 CONFIG_DM_GPIO=y
 CONFIG_DA8XX_GPIO=y
 CONFIG_DM_I2C=y
index 48b7c2a97a115d32a6f4997757f1987710df8967..af5ba813c27936bc3dd5abef3c726a566c8e6517 100644 (file)
@@ -1,4 +1,5 @@
 CONFIG_ARM=y
+CONFIG_SYS_THUMB_BUILD=y
 CONFIG_ARCH_DAVINCI=y
 CONFIG_SYS_TEXT_BASE=0xc1080000
 CONFIG_TARGET_DA850EVM=y
@@ -12,12 +13,14 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y
 CONFIG_SPL_SPI_SUPPORT=y
 CONFIG_SYS_EXTRA_OPTIONS="MAC_ADDR_IN_SPIFLASH"
 CONFIG_BOOTDELAY=3
+CONFIG_DEFAULT_FDT_FILE="da850-evm.dtb"
 CONFIG_VERSION_VARIABLE=y
 # CONFIG_DISPLAY_CPUINFO is not set
 # CONFIG_DISPLAY_BOARDINFO is not set
 CONFIG_BOARD_EARLY_INIT_F=y
 CONFIG_SPL_BOARD_INIT=y
 CONFIG_SPL_SYS_MALLOC_SIMPLE=y
+CONFIG_SPL_SEPARATE_BSS=y
 CONFIG_SPL_NAND_SUPPORT=y
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_HUSH_PARSER=y
@@ -37,13 +40,15 @@ CONFIG_CMD_DIAG=y
 CONFIG_OF_CONTROL=y
 CONFIG_SPL_OF_CONTROL=y
 CONFIG_DEFAULT_DEVICE_TREE="da850-evm"
-CONFIG_SPL_OF_PLATDATA=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_DM=y
 CONFIG_SPL_DM=y
+CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_SPL_OF_TRANSLATE=y
 CONFIG_DM_GPIO=y
 CONFIG_DA8XX_GPIO=y
 CONFIG_DM_I2C=y
+CONFIG_DM_MMC=y
 CONFIG_NAND=y
 CONFIG_NAND_DAVINCI=y
 CONFIG_SYS_NAND_U_BOOT_LOCATIONS=y
index dcf2a25395e22714e83106beb9f3acda27aaa961..e8ba5184c4d7f86622d158b53f1d93d150eaa6ef 100644 (file)
@@ -41,7 +41,7 @@ CONFIG_CMD_FS_GENERIC=y
 CONFIG_EFI_PARTITION=y
 # CONFIG_PARTITION_UUIDS is not set
 # CONFIG_SPL_PARTITION_UUIDS is not set
-CONFIG_DEFAULT_DEVICE_TREE="armada-385-amc"
+CONFIG_DEFAULT_DEVICE_TREE="armada-385-db-88f6820-amc"
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_USE_ENV_SPI_MAX_HZ=y
 CONFIG_ENV_SPI_MAX_HZ=50000000
index 98e47ee956361c7ecd0fac20f93340efe5b94519..078bd230504eef4e4fd101bc37e51c4cd08df2b0 100644 (file)
@@ -46,6 +46,7 @@ CONFIG_USE_ENV_SPI_MAX_HZ=y
 CONFIG_ENV_SPI_MAX_HZ=50000000
 CONFIG_SPL_OF_TRANSLATE=y
 CONFIG_SATA_MV=y
+CONFIG_BLK=y
 # CONFIG_MMC is not set
 CONFIG_NAND=y
 CONFIG_NAND_PXA3XX=y
diff --git a/configs/db-xc3-24g4xg_defconfig b/configs/db-xc3-24g4xg_defconfig
new file mode 100644 (file)
index 0000000..0285cca
--- /dev/null
@@ -0,0 +1,55 @@
+CONFIG_ARM=y
+CONFIG_ARCH_MVEBU=y
+CONFIG_SYS_TEXT_BASE=0x00800000
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_TARGET_DB_XC3_24G4XG=y
+CONFIG_BUILD_TARGET="u-boot.kwb"
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+CONFIG_CMD_MEMTEST=y
+CONFIG_SYS_ALT_MEMTEST=y
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_I2C=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+CONFIG_CMD_USB=y
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_TFTPPUT=y
+CONFIG_CMD_MII=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_TIME=y
+CONFIG_CMD_EXT2=y
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_FAT=y
+CONFIG_CMD_FS_GENERIC=y
+CONFIG_CMD_UBI=y
+CONFIG_DEFAULT_DEVICE_TREE="armada-xp-db-xc3-24g4xg"
+CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_SPL_OF_TRANSLATE=y
+CONFIG_BLK=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_MVTWSI=y
+# CONFIG_MMC is not set
+CONFIG_MTD=y
+CONFIG_MTD_DEVICE=y
+CONFIG_NAND=y
+CONFIG_NAND_PXA3XX=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_SFDP_SUPPORT=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_SST=y
+# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
+CONFIG_PCI=y
+CONFIG_PCI_MVEBU=y
+CONFIG_SYS_NS16550=y
+CONFIG_KIRKWOOD_SPI=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_HOST_ETHER=y
+CONFIG_USB_ETHER_ASIX=y
+CONFIG_USB_ETHER_RTL8152=y
+CONFIG_USB_ETHER_SMSC95XX=y
index 6ca5d2bb32926cfa50bed9ccaab2ab60d616e437..c274c3af0eef18159593af56004985aa0e6c8a22 100644 (file)
@@ -53,5 +53,6 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
 CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
index 4ad3df6214a767729d1e3e079b168b39c2a0ebec..6c27c3865c8298955b68284eb099ed65df092aec 100644 (file)
@@ -52,5 +52,6 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
 CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
index 5a766981603a3e22f74c5612b1e797a5b9121155..ba8b053680b9df42ae3cfc32a6fa89aa789cd508 100644 (file)
@@ -30,6 +30,7 @@ CONFIG_DEFAULT_DEVICE_TREE="kirkwood-dns325"
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_DM=y
 CONFIG_MVSATA_IDE=y
+CONFIG_BLK=y
 # CONFIG_MMC is not set
 CONFIG_MVGBE=y
 CONFIG_MII=y
@@ -37,5 +38,6 @@ CONFIG_DM_RTC=y
 CONFIG_RTC_MV=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
+CONFIG_DM_USB=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_STORAGE=y
index 598a2a380f36816b76d859c9528c6c69fad94197..072582c865d49033c96e77b05a91cfe9327784b6 100644 (file)
@@ -23,12 +23,15 @@ CONFIG_BOARD_EARLY_INIT_F=y
 CONFIG_SPL_SYS_MALLOC_SIMPLE=y
 CONFIG_SPL_SEPARATE_BSS=y
 CONFIG_SPL_DMA_SUPPORT=y
-# CONFIG_SPL_NAND_SUPPORT is not set
 CONFIG_SPL_OS_BOOT=y
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_CMD_SPL=y
 # CONFIG_CMD_FLASH is not set
+CONFIG_CMD_NAND=y
 # CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_MTDPARTS=y
+CONFIG_MTDIDS_DEFAULT="nand0=nand.0"
+CONFIG_MTDPARTS_DEFAULT="mtdparts=nand.0:256k(NAND.SPL),256k(NAND.SPL.backup1),256k(NAND.SPL.backup2),256k(NAND.SPL.backup3),256k(NAND.u-boot-spl-os),2m(NAND.u-boot),128k(NAND.u-boot-env),128k(NAND.u-boot-env.backup1),8m(NAND.kernel),-(NAND.file-system)"
 CONFIG_OF_CONTROL=y
 CONFIG_SPL_OF_CONTROL=y
 CONFIG_DEFAULT_DEVICE_TREE="dra7-evm"
@@ -66,6 +69,8 @@ CONFIG_MMC_UHS_SUPPORT=y
 CONFIG_MMC_HS200_SUPPORT=y
 CONFIG_SPL_MMC_HS200_SUPPORT=y
 CONFIG_MMC_OMAP_HS=y
+CONFIG_NAND=y
+CONFIG_SYS_NAND_BUSWIDTH_16BIT=y
 CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
index d8541542448986c88e7a3000403e89efab3941a1..60329c71e47b223ee6336753d22b059c25aa7014 100644 (file)
@@ -32,7 +32,10 @@ CONFIG_SPL_DMA_SUPPORT=y
 # CONFIG_SPL_NAND_SUPPORT is not set
 CONFIG_SPL_SPI_LOAD=y
 # CONFIG_CMD_FLASH is not set
-# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_NAND=y
+CONFIG_CMD_MTDPARTS=y
+CONFIG_MTDIDS_DEFAULT="nand0=nand.0"
+CONFIG_MTDPARTS_DEFAULT="mtdparts=nand.0:256k(NAND.SPL),256k(NAND.SPL.backup1),256k(NAND.SPL.backup2),256k(NAND.SPL.backup3),256k(NAND.u-boot-spl-os),2m(NAND.u-boot),128k(NAND.u-boot-env),128k(NAND.u-boot-env.backup1),8m(NAND.kernel),-(NAND.file-system)"
 CONFIG_OF_CONTROL=y
 CONFIG_SPL_OF_CONTROL=y
 CONFIG_DEFAULT_DEVICE_TREE="dra7-evm"
@@ -70,6 +73,8 @@ CONFIG_MMC_UHS_SUPPORT=y
 CONFIG_MMC_HS200_SUPPORT=y
 CONFIG_SPL_MMC_HS200_SUPPORT=y
 CONFIG_MMC_OMAP_HS=y
+CONFIG_NAND=y
+CONFIG_SYS_NAND_BUSWIDTH_16BIT=y
 CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
index 8202848ebf72018dfcc7e4673f63f3a1a283a8b8..eae36f9c0eb39e9a0b92a42a2a50d79d26b9dd55 100644 (file)
@@ -27,6 +27,7 @@ CONFIG_USE_ENV_SPI_MAX_HZ=y
 CONFIG_ENV_SPI_MAX_HZ=50000000
 CONFIG_DM=y
 CONFIG_MVSATA_IDE=y
+CONFIG_BLK=y
 # CONFIG_MMC is not set
 CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH=y
@@ -40,5 +41,6 @@ CONFIG_SPI=y
 CONFIG_DM_SPI=y
 CONFIG_KIRKWOOD_SPI=y
 CONFIG_USB=y
+CONFIG_DM_USB=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_STORAGE=y
index 29d5f98d76cbf73f2e9f9cce4099b000a04701d2..22996e893d6b75cb84ed2512d0cf03037c879be5 100644 (file)
@@ -22,6 +22,7 @@ CONFIG_USE_ENV_SPI_MAX_HZ=y
 CONFIG_ENV_SPI_MAX_HZ=50000000
 CONFIG_DM=y
 CONFIG_MVSATA_IDE=y
+CONFIG_BLK=y
 CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_MVTWSI=y
 # CONFIG_MMC is not set
@@ -37,5 +38,6 @@ CONFIG_SPI=y
 CONFIG_DM_SPI=y
 CONFIG_KIRKWOOD_SPI=y
 CONFIG_USB=y
+CONFIG_DM_USB=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_FS_EXT4=y
index 62cad538883b57b8ff27a1024e65df9ffbc4dc24..9e936494b2b1c0c0096c57b87eb53e58ed7d1e1a 100644 (file)
@@ -43,6 +43,7 @@ CONFIG_USE_ENV_SPI_MAX_HZ=y
 CONFIG_ENV_SPI_MAX_HZ=50000000
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_OF_TRANSLATE=y
+CONFIG_BLK=y
 # CONFIG_MMC is not set
 CONFIG_MTD_DEVICE=y
 CONFIG_SPI_FLASH=y
index 3df0ca13f04dcfb5aa1f3c0e7dc86b5b35fb6a56..19e8d792556c471e30ebe11b2d6f0ce3bbfb938e 100644 (file)
@@ -4,6 +4,7 @@ CONFIG_SPL=y
 CONFIG_MACH_SUN50I_H5=y
 CONFIG_DRAM_CLK=408
 CONFIG_DRAM_ZQ=3881977
+# CONFIG_DRAM_ODT_EN is not set
 CONFIG_MMC_SUNXI_SLOT_EXTRA=2
 CONFIG_NR_DRAM_BANKS=1
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
index 7319919998fd18ac9f159a4ebd4828668d5dc36a..1db59c7940cedac5c1d3dcdfcc00d4d46dacf2e3 100644 (file)
@@ -50,3 +50,17 @@ CONFIG_MXC_SPI=y
 CONFIG_IMX_WATCHDOG=y
 CONFIG_OF_LIBFDT=y
 # CONFIG_EFI_LOADER is not set
+CONFIG_DM=y
+CONFIG_CMD_DM=y
+CONFIG_OF_CONTROL=y
+CONFIG_DEFAULT_DEVICE_TREE="imx6q-bx50v3"
+CONFIG_DM_MMC=y
+CONFIG_BLK=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_IMX6=y
+CONFIG_DM_GPIO=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_OF_BOARD_SETUP=y
+CONFIG_DM_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
index c04bf0ea57429a7907e704948116927f12c57690..568b74fd830601ede429e5d69fd0967c8d21be1b 100644 (file)
@@ -31,6 +31,7 @@ CONFIG_DEFAULT_DEVICE_TREE="kirkwood-goflexnet"
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_DM=y
 CONFIG_MVSATA_IDE=y
+CONFIG_BLK=y
 # CONFIG_MMC is not set
 CONFIG_MVGBE=y
 CONFIG_MII=y
@@ -38,5 +39,6 @@ CONFIG_DM_RTC=y
 CONFIG_RTC_MV=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
+CONFIG_DM_USB=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_STORAGE=y
index 9998e48ab9c26e71ffc8a9f93cd48e79133fbead..8ae7e20bafd9620199a62bf1fca92048e3e1437e 100644 (file)
@@ -31,6 +31,7 @@ CONFIG_DEFAULT_DEVICE_TREE="kirkwood-guruplug-server-plus"
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_DM=y
 CONFIG_MVSATA_IDE=y
+CONFIG_BLK=y
 # CONFIG_MMC is not set
 CONFIG_MVGBE=y
 CONFIG_MII=y
@@ -38,6 +39,7 @@ CONFIG_DM_RTC=y
 CONFIG_RTC_MV=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
+CONFIG_DM_USB=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_STORAGE=y
 CONFIG_LZMA=y
index 07171c7009976b1a7388874d9ef2195f7783b9d7..2e041270144f2ae5d096888aa57cbe4e2ae58587 100644 (file)
@@ -84,6 +84,7 @@ CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_ETHER_SMSC95XX=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_HEXDUMP=y
 CONFIG_OF_LIBFDT=y
index 0ed2209e3b79c6add500ed658a26f3c02e909360..275aa89ed6e413d18f26af63e7f6f33d1c6cdb77 100644 (file)
@@ -88,6 +88,7 @@ CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_ETHER_SMSC95XX=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_HEXDUMP=y
 CONFIG_OF_LIBFDT=y
index 57e4a999aba92d25e8bc5f579224631cec85de2a..477d205bc3f2042e1aa6c4512381057ffbd09d1e 100644 (file)
@@ -87,6 +87,7 @@ CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_ETHER_SMSC95XX=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_HEXDUMP=y
 CONFIG_OF_LIBFDT=y
index e0eb6bdb3432b96b5c7266052d75cc9dfd3ee022..e28ceae289c14a6cca8641f5cfba42a5ad0b262c 100644 (file)
@@ -38,7 +38,9 @@ CONFIG_CLK_HSDK=y
 CONFIG_DM_GPIO=y
 CONFIG_HSDK_CREG_GPIO=y
 CONFIG_MMC=y
+CONFIG_DM_MMC=y
 CONFIG_MMC_DW=y
+CONFIG_MMC_DW_SNPS=y
 CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_SST=y
index 69c45b948b3af93c61a0b70938d5baa65e449b54..7b1f7abc4eda253dbd65080eaf8ab8d159935c34 100644 (file)
@@ -50,5 +50,5 @@ CONFIG_PINCTRL=y
 CONFIG_PINCTRL_IMX6=y
 CONFIG_MXC_UART=y
 CONFIG_IMX_THERMAL=y
-CONFIG_VIDEO=y
+CONFIG_DM_VIDEO=y
 CONFIG_VIDEO_IPUV3=y
index b53a5010e5dd67943738ec9b797eace0b7dbfa03..1e26f7a8c91a39130e028aa6f3219f0a9766167d 100644 (file)
@@ -51,5 +51,5 @@ CONFIG_PINCTRL=y
 CONFIG_PINCTRL_IMX6=y
 CONFIG_MXC_UART=y
 CONFIG_IMX_THERMAL=y
-CONFIG_VIDEO=y
+CONFIG_DM_VIDEO=y
 CONFIG_VIDEO_IPUV3=y
index 24e99718e63c9f4d5629f6d6309bef1eb6577cf2..223f732207f549e2b656a3176087692a7be66483 100644 (file)
@@ -67,5 +67,5 @@ CONFIG_PINCTRL_IMX6=y
 CONFIG_DEBUG_UART_MXC=y
 CONFIG_MXC_UART=y
 CONFIG_IMX_THERMAL=y
-CONFIG_VIDEO=y
+CONFIG_DM_VIDEO=y
 CONFIG_VIDEO_IPUV3=y
index cf149d615b3227868f823094c33c6c78d7ece437..8702426561fe95018a4b3519d69741a015065eb5 100644 (file)
@@ -50,5 +50,5 @@ CONFIG_PINCTRL=y
 CONFIG_PINCTRL_IMX6=y
 CONFIG_MXC_UART=y
 CONFIG_IMX_THERMAL=y
-CONFIG_VIDEO=y
+CONFIG_DM_VIDEO=y
 CONFIG_VIDEO_IPUV3=y
index 6123daded330ed3343a5fdd6e6b319da8f3151b5..fb006dcda96c3a6fb98c63f8ba047194e137ea26 100644 (file)
@@ -1,5 +1,6 @@
 CONFIG_ARM=y
 CONFIG_ARCH_KEYSTONE=y
+CONFIG_ISW_ENTRY_ADDR=0xC100000
 CONFIG_SYS_TEXT_BASE=0xC000000
 CONFIG_TI_COMMON_CMD_OPTIONS=y
 CONFIG_SPL_LIBCOMMON_SUPPORT=y
index 11c9fda985df040705eb7f8512dbdec58b8f9c91..449e66452ea6c12e18ca7ebd4196bac2dc95ef39 100644 (file)
@@ -1,5 +1,6 @@
 CONFIG_ARM=y
 CONFIG_ARCH_KEYSTONE=y
+CONFIG_ISW_ENTRY_ADDR=0xC100000
 CONFIG_TI_SECURE_DEVICE=y
 CONFIG_SYS_TEXT_BASE=0xC000060
 CONFIG_TI_COMMON_CMD_OPTIONS=y
index 4ff9c138c0296851e5a15a42b472da026a631f93..38db43e1c03b735b4f34c1bcef1a0c47f27479d6 100644 (file)
@@ -1,5 +1,6 @@
 CONFIG_ARM=y
 CONFIG_ARCH_KEYSTONE=y
+CONFIG_ISW_ENTRY_ADDR=0xC0A0000
 CONFIG_SYS_TEXT_BASE=0xC000000
 CONFIG_TI_COMMON_CMD_OPTIONS=y
 CONFIG_SPL_LIBCOMMON_SUPPORT=y
@@ -72,3 +73,4 @@ CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_DOWNLOAD=y
 CONFIG_USB_FUNCTION_SDP=y
+CONFIG_PHY_TI=y
index 990c7f6317e1ee98b6f5bddd5ca852989d73f185..9c7e3ca3ec009d73391949535699cecf52d9b165 100644 (file)
@@ -1,6 +1,7 @@
 CONFIG_ARM=y
 CONFIG_ARCH_KEYSTONE=y
 CONFIG_TI_SECURE_DEVICE=y
+CONFIG_ISW_ENTRY_ADDR=0xC0A0000
 CONFIG_SYS_TEXT_BASE=0xC000060
 CONFIG_TI_COMMON_CMD_OPTIONS=y
 CONFIG_TARGET_K2G_EVM=y
index 6835874384215cea4c26eab3c389935293174337..39aa9336f40f1d68f201811c80735a96efab109f 100644 (file)
@@ -1,5 +1,6 @@
 CONFIG_ARM=y
 CONFIG_ARCH_KEYSTONE=y
+CONFIG_ISW_ENTRY_ADDR=0xC200000
 CONFIG_SYS_TEXT_BASE=0xC000000
 CONFIG_TI_COMMON_CMD_OPTIONS=y
 CONFIG_SPL_LIBCOMMON_SUPPORT=y
index e14f901fb77452e4d48a5a9dccf14fc57a0f4be9..94bc70a82d22960af144470b36f439d817f74e49 100644 (file)
@@ -1,5 +1,6 @@
 CONFIG_ARM=y
 CONFIG_ARCH_KEYSTONE=y
+CONFIG_ISW_ENTRY_ADDR=0xC200000
 CONFIG_TI_SECURE_DEVICE=y
 CONFIG_SYS_TEXT_BASE=0xC000060
 CONFIG_TI_COMMON_CMD_OPTIONS=y
index 0e2f73acd97a410f230cf70204e3f7457133a06a..c37a0ce5194e36d724ea4808b1f5fc13119a5b43 100644 (file)
@@ -1,5 +1,6 @@
 CONFIG_ARM=y
 CONFIG_ARCH_KEYSTONE=y
+CONFIG_ISW_ENTRY_ADDR=0xC100000
 CONFIG_SYS_TEXT_BASE=0xC000000
 CONFIG_TI_COMMON_CMD_OPTIONS=y
 CONFIG_SPL_LIBCOMMON_SUPPORT=y
index 1f7a93e5a95b718de921bf180929366738a426ea..443758cab576d598d9aa87bb6e1c3c2572b6de33 100644 (file)
@@ -1,5 +1,6 @@
 CONFIG_ARM=y
 CONFIG_ARCH_KEYSTONE=y
+CONFIG_ISW_ENTRY_ADDR=0xC100000
 CONFIG_TI_SECURE_DEVICE=y
 CONFIG_SYS_TEXT_BASE=0xC000060
 CONFIG_TI_COMMON_CMD_OPTIONS=y
index 8f3144895c6d3ee317f99fccd82958a22a67b84f..3bccd6042910153a2aa548a4a24f6e38e38a7b83 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=672
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 CONFIG_MMC_SUNXI_SLOT_EXTRA=2
 CONFIG_NR_DRAM_BANKS=1
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
index e5e0f593a7db2304184942f55932e6b403a7c2ef..c00ab01fdda47ff659d15332602649faf3daf802 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=672
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 CONFIG_MMC_SUNXI_SLOT_EXTRA=2
 CONFIG_NR_DRAM_BANKS=1
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
index e4a93bde481fda817845d7befb79a5ae57182cf6..5843f34325b50698e8d679d86fa19ecede211a90 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN50I_H5=y
 CONFIG_DRAM_CLK=672
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 CONFIG_MMC_SUNXI_SLOT_EXTRA=2
 CONFIG_NR_DRAM_BANKS=1
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
index 2d3ab7e35c3ca0cdabf821e13d141842f8034164..649db0f67d01075aac9067290a910480c6af2017 100644 (file)
@@ -20,17 +20,22 @@ CONFIG_CMD_MEMINFO=y
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_GPIO=y
 # CONFIG_CMD_LOADS is not set
+CONFIG_CMD_MTD=y
+CONFIG_CMD_PART=y
 CONFIG_CMD_SF=y
 CONFIG_CMD_SPI=y
+CONFIG_CMD_USB=y
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
 CONFIG_CMD_TIME=y
+CONFIG_CMD_FS_GENERIC=y
+# CONFIG_DOS_PARTITION is not set
 CONFIG_DEFAULT_DEVICE_TREE="linkit-smart-7688"
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_NET_RANDOM_ETHADDR=y
 # CONFIG_DM_DEVICE_REMOVE is not set
-CONFIG_HAVE_BLOCK_DEVICE=y
+CONFIG_BLK=y
 CONFIG_CLK=y
 CONFIG_LED=y
 CONFIG_LED_BLINK=y
@@ -46,6 +51,7 @@ CONFIG_PHYLIB=y
 CONFIG_PHY_FIXED=y
 CONFIG_MT7628_ETH=y
 CONFIG_PHY=y
+CONFIG_MT76X8_USB_PHY=y
 CONFIG_POWER_DOMAIN=y
 CONFIG_RAM=y
 CONFIG_DM_RESET=y
@@ -54,5 +60,12 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_MT7621_SPI=y
 CONFIG_SYSRESET_SYSCON=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_GENERIC=y
+CONFIG_USB_STORAGE=y
+CONFIG_FS_EXT4=y
+CONFIG_FS_FAT=y
 CONFIG_LZMA=y
 CONFIG_LZO=y
index ad34aaf640c41b157e684e7b1c4b5d61b6d8d80d..41aa900e562f142b50641a64d56f169fb2689a33 100644 (file)
@@ -24,17 +24,22 @@ CONFIG_CMD_MEMINFO=y
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_GPIO=y
 # CONFIG_CMD_LOADS is not set
+CONFIG_CMD_MTD=y
+CONFIG_CMD_PART=y
 CONFIG_CMD_SF=y
 CONFIG_CMD_SPI=y
+CONFIG_CMD_USB=y
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
 CONFIG_CMD_TIME=y
+CONFIG_CMD_FS_GENERIC=y
+# CONFIG_DOS_PARTITION is not set
 CONFIG_DEFAULT_DEVICE_TREE="linkit-smart-7688"
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_NET_RANDOM_ETHADDR=y
 # CONFIG_DM_DEVICE_REMOVE is not set
-CONFIG_HAVE_BLOCK_DEVICE=y
+CONFIG_BLK=y
 CONFIG_CLK=y
 CONFIG_LED=y
 CONFIG_LED_BLINK=y
@@ -50,6 +55,7 @@ CONFIG_PHYLIB=y
 CONFIG_PHY_FIXED=y
 CONFIG_MT7628_ETH=y
 CONFIG_PHY=y
+CONFIG_MT76X8_USB_PHY=y
 CONFIG_POWER_DOMAIN=y
 CONFIG_RAM=y
 CONFIG_DM_RESET=y
@@ -58,5 +64,12 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_MT7621_SPI=y
 CONFIG_SYSRESET_SYSCON=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_GENERIC=y
+CONFIG_USB_STORAGE=y
+CONFIG_FS_EXT4=y
+CONFIG_FS_FAT=y
 CONFIG_LZMA=y
 CONFIG_LZO=y
index 16d9c9226f020ed5339fb9b3f9d057c3f8d3cf73..c550798bcd4a9e609376ffdad7ca3da32024b0ee 100644 (file)
@@ -16,7 +16,7 @@ CONFIG_SYS_CONSOLE_INFO_QUIET=y
 CONFIG_MISC_INIT_R=y
 # CONFIG_DISPLAY_BOARDINFO is not set
 # CONFIG_CMD_FLASH is not set
-CONFIG_CMD_IDE=y
+CONFIG_CMD_SATA=y
 CONFIG_CMD_SF=y
 CONFIG_CMD_SPI=y
 CONFIG_CMD_USB=y
@@ -26,7 +26,8 @@ CONFIG_DEFAULT_DEVICE_TREE="kirkwood-lschlv2"
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM=y
-CONFIG_MVSATA_IDE=y
+CONFIG_SATA_MV=y
+CONFIG_BLK=y
 # CONFIG_MMC is not set
 CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH=y
@@ -39,4 +40,5 @@ CONFIG_SPI=y
 CONFIG_DM_SPI=y
 CONFIG_KIRKWOOD_SPI=y
 CONFIG_USB=y
+CONFIG_DM_USB=y
 CONFIG_USB_EHCI_HCD=y
index b6eba4a4ba12490b0c2029bc44a58717bf292b08..efcce455a4871495a5b9c3af17fb202d198ac42b 100644 (file)
@@ -16,7 +16,7 @@ CONFIG_SYS_CONSOLE_INFO_QUIET=y
 CONFIG_MISC_INIT_R=y
 # CONFIG_DISPLAY_BOARDINFO is not set
 # CONFIG_CMD_FLASH is not set
-CONFIG_CMD_IDE=y
+CONFIG_CMD_SATA=y
 CONFIG_CMD_SF=y
 CONFIG_CMD_SPI=y
 CONFIG_CMD_USB=y
@@ -26,7 +26,8 @@ CONFIG_DEFAULT_DEVICE_TREE="kirkwood-lsxhl"
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM=y
-CONFIG_MVSATA_IDE=y
+CONFIG_SATA_MV=y
+CONFIG_BLK=y
 # CONFIG_MMC is not set
 CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH=y
@@ -39,4 +40,5 @@ CONFIG_SPI=y
 CONFIG_DM_SPI=y
 CONFIG_KIRKWOOD_SPI=y
 CONFIG_USB=y
+CONFIG_DM_USB=y
 CONFIG_USB_EHCI_HCD=y
index 5555e05030b5aee3011953cb9254982acca42b15..e830b2c92e12d01aed4b313e31cf7c3adfc41f91 100644 (file)
@@ -64,6 +64,7 @@ CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_ETHER_MCS7830=y
 CONFIG_USB_ETHER_SMSC95XX=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_IMX_WATCHDOG=y
 CONFIG_FAT_WRITE=y
index 320e14e2bef88d95188c852f4ba29eb7ae71390e..a2a0390ca6e0a767352f96dcc43a47e8847cdf18 100644 (file)
@@ -35,5 +35,6 @@ CONFIG_USB=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
index 95562b7cd85f1bf46083402aa768f33a52a458c8..d6e4bd4f9ac1c5177a831f78c81c38f3571ebe3b 100644 (file)
@@ -28,7 +28,10 @@ CONFIG_CMD_MEMTEST=y
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_SF=y
 CONFIG_CMD_SPI=y
-# CONFIG_CMD_NET is not set
+CONFIG_CMD_DHCP=y
+# CONFIG_NET_TFTP_VARS is not set
+# CONFIG_CMD_NFS is not set
+CONFIG_CMD_PING=y
 CONFIG_CMD_MTDPARTS=y
 CONFIG_MTDIDS_DEFAULT="nor0=spi_flash"
 CONFIG_MTDPARTS_DEFAULT="mtdparts=spi_flash:1m(UBoot),256k(Env),256k(Env.bk)"
@@ -38,10 +41,6 @@ CONFIG_OF_LIST="jr2_pcb110 jr2_pcb111 serval2_pcb112"
 CONFIG_DTB_RESELECT=y
 CONFIG_MULTI_DTB_FIT=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_USE_ENV_SPI_MAX_HZ=y
-CONFIG_ENV_SPI_MAX_HZ=0
-CONFIG_USE_ENV_SPI_MODE=y
-CONFIG_ENV_SPI_MODE=0
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_CLK=y
 CONFIG_DM_GPIO=y
@@ -66,3 +65,4 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_DM_SPI=y
 CONFIG_LZMA=y
+CONFIG_MSCC_JR2_SWITCH=y
index 162a514248931e8b2f0d254623976bd32bc8ee42..0fdd9b8f3f7a6e59f61a7a658f3cde70157ad8c8 100644 (file)
@@ -44,10 +44,6 @@ CONFIG_OF_LIST="luton_pcb090 luton_pcb091"
 CONFIG_DTB_RESELECT=y
 CONFIG_MULTI_DTB_FIT=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_USE_ENV_SPI_MAX_HZ=y
-CONFIG_ENV_SPI_MAX_HZ=0
-CONFIG_USE_ENV_SPI_MODE=y
-CONFIG_ENV_SPI_MODE=0
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_CLK=y
 CONFIG_DM_GPIO=y
index b0dcfaf2df8e59ad32b2c003276a4174c1be8ae3..edc476d143f59b4863bd670dfd1cf24faab8e84b 100644 (file)
@@ -43,10 +43,6 @@ CONFIG_OF_LIST="ocelot_pcb120 ocelot_pcb123"
 CONFIG_DTB_RESELECT=y
 CONFIG_MULTI_DTB_FIT=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_USE_ENV_SPI_MAX_HZ=y
-CONFIG_ENV_SPI_MAX_HZ=0
-CONFIG_USE_ENV_SPI_MODE=y
-CONFIG_ENV_SPI_MODE=0
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_CLK=y
 CONFIG_DM_GPIO=y
index f2c95632bd0669c106d239498758a9e0fd94a844..146188bb0c90f73af7188e573681e3b1573165cf 100644 (file)
@@ -35,10 +35,6 @@ CONFIG_OF_LIST="serval_pcb106 serval_pcb105"
 CONFIG_DTB_RESELECT=y
 CONFIG_MULTI_DTB_FIT=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_USE_ENV_SPI_MAX_HZ=y
-CONFIG_ENV_SPI_MAX_HZ=0
-CONFIG_USE_ENV_SPI_MODE=y
-CONFIG_ENV_SPI_MODE=0
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_CLK=y
 CONFIG_DM_GPIO=y
index 027aaa44d562fbb541ee0c9e747ae77381b7516c..924cf6ad013fe6051b31e348140a329f6e7060ec 100644 (file)
@@ -24,7 +24,6 @@ CONFIG_CMD_MEMTEST=y
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_SF=y
 CONFIG_CMD_SPI=y
-# CONFIG_CMD_NET is not set
 CONFIG_CMD_MTDPARTS=y
 CONFIG_MTDIDS_DEFAULT="nor0=spi_flash"
 CONFIG_MTDPARTS_DEFAULT="mtdparts=spi_flash:1m(UBoot),256k(Env),256k(Env.bk)"
@@ -33,10 +32,6 @@ CONFIG_DEFAULT_DEVICE_TREE="servalt_pcb116"
 CONFIG_DTB_RESELECT=y
 CONFIG_MULTI_DTB_FIT=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_USE_ENV_SPI_MAX_HZ=y
-CONFIG_ENV_SPI_MAX_HZ=0
-CONFIG_USE_ENV_SPI_MODE=y
-CONFIG_ENV_SPI_MODE=0
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_CLK=y
 CONFIG_DM_GPIO=y
@@ -59,3 +54,8 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_DM_SPI=y
 CONFIG_LZMA=y
+CONFIG_CMD_DHCP=y
+# CONFIG_NET_TFTP_VARS is not set
+# CONFIG_CMD_NFS is not set
+CONFIG_CMD_PING=y
+CONFIG_MSCC_SERVALT_SWITCH=y
index e93e81f3c3ea4e4d510ba3fbcd80ee913c71c894..dc0b3b3f779fe3160774852bad9d97bded433378 100644 (file)
@@ -31,5 +31,6 @@ CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_ETHER_SMSC95XX=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
index 07f3a23028d5234f36135d40af99d3217bce081b..831d50925f312a080f0a704774fb0e35ef39aade 100644 (file)
@@ -32,4 +32,5 @@ CONFIG_PINCTRL=y
 CONFIG_PINCTRL_IMX5=y
 CONFIG_MXC_UART=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
index 4e161371e36cff74884869b75e2a593ed0dd92cc..776fc8bab441421a64d857498e9b7dbdde9dfa44 100644 (file)
@@ -32,5 +32,6 @@ CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_ETHER_MCS7830=y
 CONFIG_USB_ETHER_SMSC95XX=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
index 28540719df39a9516eeee54c6cdad231b89ad493..2a6183b77b5d07bbb3ad2b21adb80b0bc81b1cee 100644 (file)
@@ -39,6 +39,16 @@ CONFIG_RTC_S35392A=y
 CONFIG_USB=y
 CONFIG_USB_STORAGE=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_IMX_WATCHDOG=y
 CONFIG_OF_LIBFDT=y
+CONFIG_DM=y
+CONFIG_CMD_DM=y
+CONFIG_OF_CONTROL=y
+CONFIG_DEFAULT_DEVICE_TREE="imx53-ppd"
+CONFIG_DM_MMC=y
+CONFIG_BLK=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_IMX5=y
+CONFIG_OF_BOARD_SETUP=y
index 506e3a71df18f852cbeac382e1035d0e6526a1cc..f1c2fd4dba817e3c9df222b0bc25865759c13228 100644 (file)
@@ -39,5 +39,6 @@ CONFIG_DM_THERMAL=y
 CONFIG_USB=y
 CONFIG_USB_KEYBOARD=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
index 39893528b61901dbb0d508a3adfda1fbb0a1e8d6..8a5f9dbb93b60e9842656a823966161a2097e28b 100644 (file)
@@ -57,5 +57,6 @@ CONFIG_CI_UDC=y
 CONFIG_USB_ETHER=y
 CONFIG_USB_ETH_CDC=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
index d0f950bb6ec2d91c3aa2b8ed6d081249888ac792..23fd9977d0ee2496e4687b49b1771a8ed12da2e5 100644 (file)
@@ -84,5 +84,6 @@ CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
-CONFIG_VIDEO=y
+CONFIG_DM_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
index 0fd32aa1d620bef3c68e9fc5461b0dc08a62e523..eaf0f010046d6daec30b4027fd616b896f2d23dd 100644 (file)
@@ -95,5 +95,6 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
 CONFIG_CI_UDC=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
-CONFIG_VIDEO=y
+CONFIG_DM_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
index b3a7870ea9a643f88036dd54efef090657b3feb7..af7fa0b20b2cfd491424c2a4d78d55acc9238b97 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=408
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 CONFIG_NR_DRAM_BANKS=1
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
 # CONFIG_CMD_FLASH is not set
index b83cdf2e1ccdd1ba27ca00eee07fe78727c38f4f..84e152546b67b4da40f02170c3bc0045e2d6470c 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=408
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 CONFIG_MMC0_CD_PIN="PH13"
 CONFIG_MMC_SUNXI_SLOT_EXTRA=2
 CONFIG_NR_DRAM_BANKS=1
index 9de893adfaf9a84504409100d23eda163aed1d7c..2d44135bbc73bb2d11fcf2784eaeda76c2938327 100644 (file)
@@ -4,6 +4,7 @@ CONFIG_SPL=y
 CONFIG_MACH_SUN50I_H5=y
 CONFIG_DRAM_CLK=672
 CONFIG_DRAM_ZQ=3881977
+# CONFIG_DRAM_ODT_EN is not set
 CONFIG_NR_DRAM_BANKS=1
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
 # CONFIG_CMD_FLASH is not set
index 33f9c0746c16bb8a4979d78e00c7c58535b6b64a..bd099c8d671791ff5db2ef47477f833b3071ab8d 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=408
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 # CONFIG_VIDEO_DE2 is not set
 CONFIG_NR_DRAM_BANKS=1
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
index 40f5bd176e59fbe2eb38a344fc0d93eeaf0c5155..074b172061faacbd3580024fbb0485dd8d117dc2 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=408
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 # CONFIG_VIDEO_DE2 is not set
 CONFIG_NR_DRAM_BANKS=1
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
index 88c76a55e53f489731f91b8da7160a5e27f053aa..11cb8f61b03d4ef4f60d33de4fe95fb25defdd7b 100644 (file)
@@ -4,6 +4,7 @@ CONFIG_SPL=y
 CONFIG_MACH_SUN50I_H5=y
 CONFIG_DRAM_CLK=408
 CONFIG_DRAM_ZQ=3881977
+# CONFIG_DRAM_ODT_EN is not set
 CONFIG_MACPWR="PD6"
 CONFIG_MMC_SUNXI_SLOT_EXTRA=2
 CONFIG_NR_DRAM_BANKS=1
index 6bd308bb826431252b3b33aeeb650ae626ff2e9e..a244b8d69168ff76dd63ef7fdfc73451d8f43357 100644 (file)
@@ -31,6 +31,7 @@ CONFIG_DEFAULT_DEVICE_TREE="kirkwood-blackarmor-nas220"
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_DM=y
 CONFIG_MVSATA_IDE=y
+CONFIG_BLK=y
 # CONFIG_MMC is not set
 CONFIG_MVGBE=y
 CONFIG_MII=y
@@ -38,5 +39,6 @@ CONFIG_DM_RTC=y
 CONFIG_RTC_MV=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
+CONFIG_DM_USB=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_STORAGE=y
index debe60b3f0ed61ef2c6667f289efc43136ebb7ea..5b3899d590154c222b42118251a1f3b1da57f38a 100644 (file)
@@ -59,5 +59,6 @@ CONFIG_CI_UDC=y
 CONFIG_USB_ETHER=y
 CONFIG_USB_ETH_CDC=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
index 96d9c02b477c575769506049b6e96b25a61fafba..d89069a0d5dd1134fe89c9b9a9652aff48ed09c7 100644 (file)
@@ -59,5 +59,6 @@ CONFIG_CI_UDC=y
 CONFIG_USB_ETHER=y
 CONFIG_USB_ETH_CDC=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
index 5bc4219deee619652815272bae205321b73d5d4b..e9214d472b673317e3660b24ca70a93d723b2611 100644 (file)
@@ -61,5 +61,6 @@ CONFIG_CI_UDC=y
 CONFIG_USB_ETHER=y
 CONFIG_USB_ETH_CDC=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
index 37fa40593115b321e6401980fff6c5de4cb4cf41..f1480f15c7545453f77bc66d620d80e02741ad51 100644 (file)
@@ -61,5 +61,6 @@ CONFIG_CI_UDC=y
 CONFIG_USB_ETHER=y
 CONFIG_USB_ETH_CDC=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
index 1d3f0151fe3f5db95a591901b9d8cf8c674138c4..b920db0dad318c1852137f58f57f5fba745d4e19 100644 (file)
@@ -59,5 +59,6 @@ CONFIG_CI_UDC=y
 CONFIG_USB_ETHER=y
 CONFIG_USB_ETH_CDC=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
index 5bf2b3a021f6d03025924e48f5d327e08de4f194..c3b8032d471f82b17d953e44ee2687f08af2037a 100644 (file)
@@ -59,5 +59,6 @@ CONFIG_CI_UDC=y
 CONFIG_USB_ETHER=y
 CONFIG_USB_ETH_CDC=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
index 4c9c1cb9eb57d62d6035af9ef8a46f054f6a2bdf..103d9183cb17f350eebcac5036be03ad4f2e68c6 100644 (file)
@@ -58,6 +58,7 @@ CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_ETHER_SMSC95XX=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_FAT_WRITE=y
 CONFIG_OF_LIBFDT=y
diff --git a/configs/oceanic_5205_5inmfd_defconfig b/configs/oceanic_5205_5inmfd_defconfig
new file mode 100644 (file)
index 0000000..34fe6f5
--- /dev/null
@@ -0,0 +1,20 @@
+CONFIG_ARM=y
+CONFIG_ARCH_SUNXI=y
+CONFIG_SPL=y
+CONFIG_MACH_SUN50I=y
+CONFIG_RESERVE_ALLWINNER_BOOT0_HEADER=y
+CONFIG_SUNXI_DRAM_LPDDR3_STOCK=y
+CONFIG_DRAM_CLK=552
+CONFIG_DRAM_ZQ=3881949
+CONFIG_MMC0_CD_PIN=""
+CONFIG_SPL_SPI_SUNXI=y
+CONFIG_NR_DRAM_BANKS=1
+# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
+# CONFIG_CMD_FLASH is not set
+# CONFIG_SPL_DOS_PARTITION is not set
+# CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_DEFAULT_DEVICE_TREE="sun50i-a64-oceanic-5205-5inmfd"
+CONFIG_SUN8I_EMAC=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_OHCI_HCD=y
+CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE=y
index ab6566e49a8bc5afa6641e50ea6767ac2e2808fd..ce3cc8352cfc0b72fe773d8906e544c96790d2da 100644 (file)
@@ -4,8 +4,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=672
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 CONFIG_USB1_VBUS_PIN="PG13"
 CONFIG_NR_DRAM_BANKS=1
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
index 1092a852503a9cdad69ff306e7609a8ecf541ea6..490f5a3aae4d14d15c2be5ede072f2d3b5a344ea 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=672
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 CONFIG_NR_DRAM_BANKS=1
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
 # CONFIG_CMD_FLASH is not set
index 404fdd91197b4b94819478d2201eec3503a81de9..949fc5d40f7760942855477be685691bc838fc6c 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=672
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 CONFIG_NR_DRAM_BANKS=1
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
 # CONFIG_CMD_FLASH is not set
index ad837382c8e835ad0084c9fc0159bd89b78a8efe..a5bac5b2926f7bea9df225d7415ec37008a656e6 100644 (file)
@@ -4,6 +4,7 @@ CONFIG_SPL=y
 CONFIG_MACH_SUN50I_H5=y
 CONFIG_DRAM_CLK=672
 CONFIG_DRAM_ZQ=3881977
+# CONFIG_DRAM_ODT_EN is not set
 CONFIG_MACPWR="PD6"
 CONFIG_SPL_SPI_SUNXI=y
 CONFIG_NR_DRAM_BANKS=1
index de11df755e4ee6dcd5b1595f2c93a54fa8b19cea..79d623719e30d1b336d00b6a37e7b3da8969cd3a 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=624
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 CONFIG_NR_DRAM_BANKS=1
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
 CONFIG_SPL_I2C_SUPPORT=y
index ce26cfaf9b558977b4db686a1b920efe69e49869..31e9bcf0b3f1cfa4979fcc041501c229a790f131 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=624
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 CONFIG_MMC_SUNXI_SLOT_EXTRA=2
 CONFIG_NR_DRAM_BANKS=1
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
index b0813e4e10b0882cc898c4052479e6cfcbae3acb..f31fd28a4f67882913f92123a341e262d394e964 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=672
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 CONFIG_MACPWR="PD6"
 CONFIG_MMC_SUNXI_SLOT_EXTRA=2
 CONFIG_NR_DRAM_BANKS=1
index 05023737a956de392de1407c15c0e1661fea05ad..8a9ea272c3c1e3888a1358d5423a923bfb1e6833 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=672
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 CONFIG_MACPWR="PD6"
 CONFIG_MMC_SUNXI_SLOT_EXTRA=2
 CONFIG_USB1_VBUS_PIN="PG13"
index 20ae6df5a0d41e7beabde72643c3cf404726e54c..0d64eebc099d57931f267fa9e2f525294da528a1 100644 (file)
@@ -4,6 +4,7 @@ CONFIG_SPL=y
 CONFIG_MACH_SUN50I_H5=y
 CONFIG_DRAM_CLK=672
 CONFIG_DRAM_ZQ=3881977
+# CONFIG_DRAM_ODT_EN is not set
 CONFIG_NR_DRAM_BANKS=1
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
 # CONFIG_CMD_FLASH is not set
index 05c3b08b766e911f5801383813b931802c7dacc8..6492d8580c16af23db136838a08b5f4bdc9113d9 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=624
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 # CONFIG_VIDEO_DE2 is not set
 CONFIG_SPL_SPI_SUNXI=y
 CONFIG_NR_DRAM_BANKS=1
index 44fc18b7b1ed8a1bac8797975748a9e5e741f6ff..b881a84831790c740900f540628bf7e45a43acca 100644 (file)
@@ -3,8 +3,6 @@ CONFIG_ARCH_SUNXI=y
 CONFIG_SPL=y
 CONFIG_MACH_SUN8I_H3=y
 CONFIG_DRAM_CLK=624
-CONFIG_DRAM_ZQ=3881979
-CONFIG_DRAM_ODT_EN=y
 # CONFIG_VIDEO_DE2 is not set
 CONFIG_SPL_SPI_SUNXI=y
 CONFIG_NR_DRAM_BANKS=1
index e62b3cb15041cfdf0f97b10c2e1980d18f4523ee..ab0d12e750a306a621c59188e7ae3a696854ba37 100644 (file)
@@ -4,6 +4,7 @@ CONFIG_SPL=y
 CONFIG_MACH_SUN50I_H5=y
 CONFIG_DRAM_CLK=672
 CONFIG_DRAM_ZQ=3881977
+# CONFIG_DRAM_ODT_EN is not set
 CONFIG_MMC0_CD_PIN="PH13"
 CONFIG_MMC_SUNXI_SLOT_EXTRA=2
 CONFIG_NR_DRAM_BANKS=1
index cc8b8c7f9ab9d89f05438f204f004b4932aba9ed..37ca6dff374f008273c160027affe1b95e8e5d0e 100644 (file)
@@ -4,6 +4,7 @@ CONFIG_SPL=y
 CONFIG_MACH_SUN50I_H5=y
 CONFIG_DRAM_CLK=624
 CONFIG_DRAM_ZQ=3881977
+# CONFIG_DRAM_ODT_EN is not set
 CONFIG_NR_DRAM_BANKS=1
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
 # CONFIG_CMD_FLASH is not set
index e207df51a80013d87ca5d11caaf468787af1998a..fd093b35c23f74ac672f73a19566068e205bb189 100644 (file)
@@ -9,7 +9,6 @@ CONFIG_BOOTDELAY=3
 CONFIG_BOARD_EARLY_INIT_F=y
 CONFIG_HUSH_PARSER=y
 CONFIG_CMD_BOOTZ=y
-CONFIG_CMD_EEPROM=y
 CONFIG_CMD_MEMTEST=y
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_I2C=y
@@ -18,23 +17,53 @@ CONFIG_CMD_NAND_TRIMFFS=y
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
 CONFIG_CMD_FAT=y
 CONFIG_MTDIDS_DEFAULT="nand0=NAND"
 CONFIG_MTDPARTS_DEFAULT="mtdparts=NAND:640k(bootloader),128k(env1),128k(env2),128k(dtb),6144k(kernel),-(root)"
 CONFIG_CMD_UBI=y
 CONFIG_OF_CONTROL=y
-CONFIG_DEFAULT_DEVICE_TREE="pcm052"
+CONFIG_DEFAULT_DEVICE_TREE="vf610-pcm052"
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_DM=y
 CONFIG_DM_GPIO=y
 CONFIG_VYBRID_GPIO=y
+CONFIG_DM_I2C=y
+CONFIG_I2C_SET_DEFAULT_BUS_NUM=y
+CONFIG_I2C_DEFAULT_BUS_NUMBER=0x2
+CONFIG_SYS_I2C_MXC=y
+CONFIG_SYS_I2C_MXC_I2C1=y
+CONFIG_SYS_I2C_MXC_I2C2=y
+CONFIG_SYS_I2C_MXC_I2C3=y
+CONFIG_SYS_I2C_MXC_I2C4=y
+CONFIG_MISC=y
+CONFIG_I2C_EEPROM=y
+CONFIG_SYS_I2C_EEPROM_ADDR=0x50
+CONFIG_SYS_I2C_EEPROM_BUS=2
+CONFIG_SYS_EEPROM_SIZE=32768
+CONFIG_SYS_EEPROM_PAGE_WRITE_BITS=6
+CONFIG_SYS_I2C_EEPROM_ADDR_LEN=2
+CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
+CONFIG_MTD=y
 CONFIG_NAND_VF610_NFC=y
+CONFIG_NAND_VF610_NFC_DT=y
 CONFIG_SYS_NAND_BUSWIDTH_16BIT=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_MTD=y
 CONFIG_PHYLIB=y
 CONFIG_PHY_MICREL=y
+CONFIG_DM_ETH=y
+CONFIG_FEC_MXC=y
 CONFIG_MII=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_VYBRID=y
+CONFIG_DM_RTC=y
 CONFIG_RTC_M41T62=y
 CONFIG_DM_SERIAL=y
 CONFIG_FSL_LPUART=y
+CONFIG_SPI=y
+CONFIG_DM_SPI=y
+CONFIG_FSL_QSPI=y
+# CONFIG_EFI_LOADER is not set
index fd3cdeec8585b1347973d37330b187dbadfbfc51..a8331377872696174fc9207ad4da3b99a960a70a 100644 (file)
@@ -16,4 +16,5 @@ CONFIG_NR_DRAM_BANKS=1
 CONFIG_DEFAULT_DEVICE_TREE="sun50i-a64-pine64-lts"
 CONFIG_SUN8I_EMAC=y
 CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_OHCI_HCD=y
 CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE=y
index 81bd3702e42ad8bd7fd094c8e3e3a5bff6fbce63..76ab5eb70e7e23c2298ff26d9dc6085ccf6ebf3c 100644 (file)
@@ -19,6 +19,9 @@ CONFIG_FASTBOOT_FLASH_MMC_DEV=0
 CONFIG_DM_MMC=y
 CONFIG_MMC_DW=y
 CONFIG_MMC_DW_K3=y
+CONFIG_DM_ETH=y
+CONFIG_HIGMACV300_ETH=y
+CONFIG_RESET_HISILICON=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_EHCI_GENERIC=y
index 019e72eac1791c10187aa378a1de65cb7cb1c27d..8c5c9ed0c4bda2ff757bfdef3476d8ae6caa4083 100644 (file)
@@ -1,7 +1,6 @@
 CONFIG_ARM=y
 CONFIG_ARCH_RMOBILE=y
 CONFIG_SYS_TEXT_BASE=0x50000000
-CONFIG_SYS_MALLOC_F_LEN=0x2000
 CONFIG_RCAR_GEN3=y
 CONFIG_TARGET_SALVATOR_X=y
 CONFIG_SMBIOS_PRODUCT_NAME=""
@@ -29,7 +28,8 @@ CONFIG_CMD_FS_GENERIC=y
 CONFIG_OF_CONTROL=y
 CONFIG_DEFAULT_DEVICE_TREE="r8a7795-salvator-x-u-boot"
 CONFIG_OF_LIST="r8a7795-salvator-x-u-boot r8a7796-salvator-x-u-boot r8a77965-salvator-x-u-boot"
-CONFIG_MULTI_DTB_FIT=y
+CONFIG_MULTI_DTB_FIT_LZO=y
+CONFIG_MULTI_DTB_FIT_USER_DEFINED_AREA=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_REGMAP=y
 CONFIG_SYSCON=y
index b2f1dfe50b86ec108addc87a78639c76a9de7c53..8dc0c3fda910d502fd23516fed8066db7c708ffc 100644 (file)
@@ -28,8 +28,9 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_OF_CONTROL=y
 CONFIG_DEFAULT_DEVICE_TREE="r8a7795-h3ulcb-u-boot"
-CONFIG_OF_LIST="r8a7795-h3ulcb-u-boot r8a7796-m3ulcb-u-boot"
-CONFIG_MULTI_DTB_FIT=y
+CONFIG_OF_LIST="r8a7795-h3ulcb-u-boot r8a7796-m3ulcb-u-boot r8a77965-m3nulcb-u-boot"
+CONFIG_MULTI_DTB_FIT_LZO=y
+CONFIG_MULTI_DTB_FIT_USER_DEFINED_AREA=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_REGMAP=y
 CONFIG_SYSCON=y
index b34fddda1cb8a790a3d775a939b6b0bda2b0bd29..228d848c239b0b9d83ae091025e90d7ab3f5b801 100644 (file)
@@ -29,7 +29,8 @@ CONFIG_CMD_FS_GENERIC=y
 CONFIG_OF_CONTROL=y
 CONFIG_DEFAULT_DEVICE_TREE="r8a77965-salvator-x-u-boot"
 CONFIG_OF_LIST="r8a7795-salvator-x-u-boot r8a7796-salvator-x-u-boot r8a77965-salvator-x-u-boot"
-CONFIG_MULTI_DTB_FIT=y
+CONFIG_MULTI_DTB_FIT_LZO=y
+CONFIG_MULTI_DTB_FIT_USER_DEFINED_AREA=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_REGMAP=y
 CONFIG_SYSCON=y
diff --git a/configs/r8a77965_ulcb_defconfig b/configs/r8a77965_ulcb_defconfig
new file mode 100644 (file)
index 0000000..5cbc161
--- /dev/null
@@ -0,0 +1,67 @@
+CONFIG_ARM=y
+CONFIG_ARCH_RMOBILE=y
+CONFIG_SYS_TEXT_BASE=0x50000000
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_RCAR_GEN3=y
+CONFIG_TARGET_ULCB=y
+CONFIG_SMBIOS_PRODUCT_NAME=""
+CONFIG_FIT=y
+# CONFIG_ARCH_FIXUP_FDT_MEMORY is not set
+CONFIG_USE_BOOTARGS=y
+CONFIG_BOOTARGS="root=/dev/nfs rw nfsroot=192.168.0.1:/export/rfs ip=192.168.0.20"
+CONFIG_SUPPORT_RAW_INITRD=y
+CONFIG_DEFAULT_FDT_FILE="r8a77965-m3nulcb.dtb"
+CONFIG_VERSION_VARIABLE=y
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_BOOTZ=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_MII=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_EXT2=y
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_EXT4_WRITE=y
+CONFIG_CMD_FAT=y
+CONFIG_CMD_FS_GENERIC=y
+CONFIG_OF_CONTROL=y
+CONFIG_DEFAULT_DEVICE_TREE="r8a77965-m3nulcb-u-boot"
+CONFIG_OF_LIST="r8a7795-h3ulcb-u-boot r8a7796-m3ulcb-u-boot r8a77965-m3nulcb-u-boot"
+CONFIG_MULTI_DTB_FIT_LZO=y
+CONFIG_MULTI_DTB_FIT_USER_DEFINED_AREA=y
+CONFIG_ENV_IS_IN_MMC=y
+CONFIG_REGMAP=y
+CONFIG_SYSCON=y
+CONFIG_CLK=y
+CONFIG_CLK_RENESAS=y
+CONFIG_DM_GPIO=y
+CONFIG_RCAR_GPIO=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_RCAR_IIC=y
+CONFIG_DM_MMC=y
+CONFIG_MMC_IO_VOLTAGE=y
+CONFIG_MMC_UHS_SUPPORT=y
+CONFIG_MMC_HS400_SUPPORT=y
+CONFIG_RENESAS_SDHI=y
+CONFIG_PHY_MICREL=y
+CONFIG_PHY_MICREL_KSZ90X1=y
+CONFIG_DM_ETH=y
+CONFIG_RENESAS_RAVB=y
+CONFIG_PINCTRL=y
+CONFIG_PINCONF=y
+CONFIG_PINCTRL_PFC=y
+CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_DM_REGULATOR_GPIO=y
+CONFIG_SCIF_CONSOLE=y
+CONFIG_SYSRESET=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_GENERIC=y
+CONFIG_USB_STORAGE=y
+CONFIG_OF_LIBFDT_OVERLAY=y
+CONFIG_SMBIOS_MANUFACTURER=""
index 6a9c1bdc0c04112066b43e10392faa501fc82465..67d3b517f4643f9dd9642dcec7ff5ec73567a648 100644 (file)
@@ -29,7 +29,8 @@ CONFIG_CMD_FS_GENERIC=y
 CONFIG_OF_CONTROL=y
 CONFIG_DEFAULT_DEVICE_TREE="r8a7796-salvator-x-u-boot"
 CONFIG_OF_LIST="r8a7795-salvator-x-u-boot r8a7796-salvator-x-u-boot r8a77965-salvator-x-u-boot"
-CONFIG_MULTI_DTB_FIT=y
+CONFIG_MULTI_DTB_FIT_LZO=y
+CONFIG_MULTI_DTB_FIT_USER_DEFINED_AREA=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_REGMAP=y
 CONFIG_SYSCON=y
index aff4c9cb6153ca6076e555c373dd3ff8641764d4..ab395d58581d39600fe0051687e3ee5b590fc720 100644 (file)
@@ -28,8 +28,9 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_OF_CONTROL=y
 CONFIG_DEFAULT_DEVICE_TREE="r8a7796-m3ulcb-u-boot"
-CONFIG_OF_LIST="r8a7795-h3ulcb-u-boot r8a7796-m3ulcb-u-boot"
-CONFIG_MULTI_DTB_FIT=y
+CONFIG_OF_LIST="r8a7795-h3ulcb-u-boot r8a7796-m3ulcb-u-boot r8a77965-m3nulcb-u-boot"
+CONFIG_MULTI_DTB_FIT_LZO=y
+CONFIG_MULTI_DTB_FIT_USER_DEFINED_AREA=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_REGMAP=y
 CONFIG_SYSCON=y
index e3d16df6a89e8bb39e3791f9ff6575df372864e9..84561c8232241322dc7fa9fc852cf57243249bf7 100644 (file)
@@ -35,5 +35,6 @@ CONFIG_USB=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
index 51fa98d5a93b50eb3db538a45f1298af2d51abb1..db6ee8fc3fa16b68e409ad931e383403455e3542 100644 (file)
@@ -44,6 +44,7 @@ CONFIG_USB=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
 CONFIG_SPL_OF_LIBFDT=y
diff --git a/configs/sama5d2_icp_mmc_defconfig b/configs/sama5d2_icp_mmc_defconfig
new file mode 100644 (file)
index 0000000..6d4d199
--- /dev/null
@@ -0,0 +1,76 @@
+CONFIG_ARM=y
+CONFIG_ARCH_AT91=y
+CONFIG_SYS_TEXT_BASE=0x26f00000
+CONFIG_TARGET_SAMA5D2_ICP=y
+CONFIG_SPL_GPIO_SUPPORT=y
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_SPL_MMC_SUPPORT=y
+CONFIG_SPL_SERIAL_SUPPORT=y
+CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
+CONFIG_SPL=y
+CONFIG_DEBUG_UART_BOARD_INIT=y
+CONFIG_DEBUG_UART_BASE=0xf801c000
+CONFIG_DEBUG_UART_CLOCK=83000000
+CONFIG_SPL_FS_FAT=y
+CONFIG_SPL_LIBDISK_SUPPORT=y
+CONFIG_DEBUG_UART=y
+CONFIG_ENV_VARS_UBOOT_CONFIG=y
+CONFIG_FIT=y
+CONFIG_SYS_EXTRA_OPTIONS="SAMA5D2"
+CONFIG_SD_BOOT=y
+CONFIG_BOOTDELAY=3
+CONFIG_USE_BOOTARGS=y
+# CONFIG_DISPLAY_BOARDINFO is not set
+CONFIG_SPL_SEPARATE_BSS=y
+CONFIG_SPL_DISPLAY_PRINT=y
+# CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR is not set
+CONFIG_SPL_RAM_SUPPORT=y
+CONFIG_SPL_RAM_DEVICE=y
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_BOOTZ=y
+# CONFIG_CMD_IMI is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_I2C=y
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_MMC=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_FAT=y
+CONFIG_OF_CONTROL=y
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_DEFAULT_DEVICE_TREE="at91-sama5d2_icp"
+CONFIG_OF_SPL_REMOVE_PROPS="interrupts interrupt-parent dmas dma-names"
+CONFIG_ENV_IS_IN_FAT=y
+CONFIG_DM=y
+CONFIG_SPL_DM=y
+CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_CLK=y
+CONFIG_SPL_CLK=y
+CONFIG_CLK_AT91=y
+CONFIG_AT91_UTMI=y
+CONFIG_AT91_H32MX=y
+CONFIG_AT91_GENERIC_CLK=y
+CONFIG_DM_GPIO=y
+CONFIG_ATMEL_PIO4=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_AT91=y
+CONFIG_I2C_EEPROM=y
+CONFIG_DM_MMC=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_ATMEL=y
+CONFIG_DM_ETH=y
+CONFIG_MACB=y
+CONFIG_PINCTRL=y
+CONFIG_SPL_PINCTRL=y
+CONFIG_PINCTRL_AT91PIO4=y
+CONFIG_DM_SERIAL=y
+CONFIG_DEBUG_UART_ATMEL=y
+CONFIG_DEBUG_UART_ANNOUNCE=y
+CONFIG_ATMEL_USART=y
+CONFIG_TIMER=y
+CONFIG_SPL_TIMER=y
+CONFIG_ATMEL_PIT_TIMER=y
+CONFIG_OF_LIBFDT_OVERLAY=y
index da4bdced3105445f3caba065ae8e6e61a9996b93..c04ecd915ae70c57deff3fa7563f0c3f36331f48 100644 (file)
@@ -194,6 +194,7 @@ CONFIG_CMD_DHRYSTONE=y
 CONFIG_TPM=y
 CONFIG_LZ4=y
 CONFIG_ERRNO_STR=y
+CONFIG_TEST_FDTDEC=y
 CONFIG_UNIT_TEST=y
 CONFIG_UT_TIME=y
 CONFIG_UT_DM=y
index 193e41896cb7aee5b00634ba3b7dcc86025554c9..bb508a8d02e25ebc55a419ef2f6a6e705edbe4fb 100644 (file)
@@ -215,6 +215,7 @@ CONFIG_CMD_DHRYSTONE=y
 CONFIG_TPM=y
 CONFIG_LZ4=y
 CONFIG_ERRNO_STR=y
+CONFIG_TEST_FDTDEC=y
 CONFIG_UNIT_TEST=y
 CONFIG_UT_TIME=y
 CONFIG_UT_DM=y
index 04b00cdea9d4643eb5968a6b023c6c839a7b2826..ec527fceb6f579e3a30cf2e6dfc3996b38266ccf 100644 (file)
@@ -39,6 +39,7 @@ CONFIG_DM_RTC=y
 CONFIG_RTC_MV=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
+CONFIG_DM_USB=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_STORAGE=y
 CONFIG_LZMA=y
index 995290ca5f37999783494a4d65019c2df8919ee1..4848013b21be3610792f17b06fce8150689e2917 100644 (file)
@@ -6,7 +6,7 @@ CONFIG_TARGET_SOCFPGA_STRATIX10_SOCDK=y
 CONFIG_SPL=y
 CONFIG_IDENT_STRING="socfpga_stratix10"
 CONFIG_SPL_FS_FAT=y
-CONFIG_NR_DRAM_BANKS=1
+CONFIG_NR_DRAM_BANKS=2
 CONFIG_BOOTDELAY=5
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_HUSH_PARSER=y
index d20b2ab350841910ff4279e9a3f1eb13c9ee5f9e..fd164fa596ddc66f181a793f4cddb5f9e7f00317 100644 (file)
@@ -1,11 +1,12 @@
 CONFIG_ARM=y
 CONFIG_ARCH_STM32MP=y
-CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_SYS_MALLOC_F_LEN=0x3000
 CONFIG_SPL_MMC_SUPPORT=y
 CONFIG_SPL=y
 CONFIG_TARGET_STM32MP1=y
 CONFIG_DISTRO_DEFAULTS=y
-CONFIG_NR_DRAM_BANKS=1
+CONFIG_FIT=y
+CONFIG_BOOTCOMMAND="run bootcmd_stm32mp"
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION=3
 CONFIG_SPL_I2C_SUPPORT=y
@@ -18,8 +19,10 @@ CONFIG_SYS_PROMPT="STM32MP> "
 # CONFIG_CMD_EXPORTENV is not set
 # CONFIG_CMD_IMPORTENV is not set
 CONFIG_CMD_MEMINFO=y
+CONFIG_CMD_MEMTEST=y
 CONFIG_CMD_ADC=y
 CONFIG_CMD_CLK=y
+CONFIG_CMD_DFU=y
 CONFIG_CMD_FUSE=y
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_GPT=y
@@ -27,12 +30,21 @@ CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
 CONFIG_CMD_USB=y
 CONFIG_CMD_USB_MASS_STORAGE=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_TIME=y
+CONFIG_CMD_TIMER=y
 CONFIG_CMD_PMIC=y
 CONFIG_CMD_REGULATOR=y
 CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_DOS_PARTITION is not set
 CONFIG_DEFAULT_DEVICE_TREE="stm32mp157c-ev1"
 CONFIG_STM32_ADC=y
+CONFIG_USB_FUNCTION_FASTBOOT=y
+CONFIG_FASTBOOT_BUF_ADDR=0xC0000000
+CONFIG_FASTBOOT_BUF_SIZE=0x02000000
+CONFIG_FASTBOOT_USB_DEV=1
+CONFIG_FASTBOOT_FLASH=y
+CONFIG_FASTBOOT_FLASH_MMC_DEV=1
 CONFIG_DM_HWSPINLOCK=y
 CONFIG_HWSPINLOCK_STM32=y
 CONFIG_DM_I2C=y
@@ -43,25 +55,25 @@ CONFIG_DM_MMC=y
 CONFIG_STM32_SDMMC2=y
 CONFIG_PHY=y
 CONFIG_PHY_STM32_USBPHYC=y
-# CONFIG_PINCTRL_FULL is not set
+CONFIG_PINCONF=y
 # CONFIG_SPL_PINCTRL_FULL is not set
+CONFIG_PINCTRL_STMFX=y
 CONFIG_DM_PMIC=y
 # CONFIG_SPL_PMIC_CHILDREN is not set
-CONFIG_PMIC_STPMU1=y
+CONFIG_PMIC_STPMIC1=y
 CONFIG_DM_REGULATOR_FIXED=y
 CONFIG_DM_REGULATOR_GPIO=y
 CONFIG_DM_REGULATOR_STM32_VREFBUF=y
-CONFIG_DM_REGULATOR_STPMU1=y
+CONFIG_DM_REGULATOR_STPMIC1=y
 CONFIG_SERIAL_RX_BUFFER=y
 CONFIG_STM32_SERIAL=y
 CONFIG_USB=y
 CONFIG_DM_USB=y
+CONFIG_DM_USB_GADGET=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_EHCI_GENERIC=y
-CONFIG_USB_DWC2=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="STMicroelectronics"
 CONFIG_USB_GADGET_VENDOR_NUM=0x0483
 CONFIG_USB_GADGET_PRODUCT_NUM=0x5720
 CONFIG_USB_GADGET_DWC2_OTG=y
-CONFIG_USB_GADGET_DOWNLOAD=y
diff --git a/configs/stm32mp15_trusted_defconfig b/configs/stm32mp15_trusted_defconfig
new file mode 100644 (file)
index 0000000..f82b770
--- /dev/null
@@ -0,0 +1,70 @@
+CONFIG_ARM=y
+CONFIG_ARCH_STM32MP=y
+CONFIG_SYS_MALLOC_F_LEN=0x3000
+CONFIG_TARGET_STM32MP1=y
+CONFIG_DISTRO_DEFAULTS=y
+CONFIG_FIT=y
+CONFIG_BOOTCOMMAND="run bootcmd_stm32mp"
+CONFIG_SYS_PROMPT="STM32MP> "
+# CONFIG_CMD_BOOTD is not set
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_IMI is not set
+# CONFIG_CMD_XIMG is not set
+# CONFIG_CMD_EXPORTENV is not set
+# CONFIG_CMD_IMPORTENV is not set
+CONFIG_CMD_MEMINFO=y
+CONFIG_CMD_MEMTEST=y
+CONFIG_CMD_ADC=y
+CONFIG_CMD_CLK=y
+CONFIG_CMD_DFU=y
+CONFIG_CMD_FUSE=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_GPT=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_USB_MASS_STORAGE=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_TIME=y
+CONFIG_CMD_TIMER=y
+CONFIG_CMD_PMIC=y
+CONFIG_CMD_REGULATOR=y
+CONFIG_CMD_EXT4_WRITE=y
+CONFIG_DEFAULT_DEVICE_TREE="stm32mp157c-ev1"
+CONFIG_STM32_ADC=y
+CONFIG_USB_FUNCTION_FASTBOOT=y
+CONFIG_FASTBOOT_BUF_ADDR=0xC0000000
+CONFIG_FASTBOOT_BUF_SIZE=0x02000000
+CONFIG_FASTBOOT_USB_DEV=1
+CONFIG_FASTBOOT_FLASH=y
+CONFIG_FASTBOOT_FLASH_MMC_DEV=1
+CONFIG_DM_HWSPINLOCK=y
+CONFIG_HWSPINLOCK_STM32=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_STM32F7=y
+CONFIG_LED=y
+CONFIG_LED_GPIO=y
+CONFIG_DM_MMC=y
+CONFIG_STM32_SDMMC2=y
+CONFIG_PHY=y
+CONFIG_PHY_STM32_USBPHYC=y
+CONFIG_PINCONF=y
+CONFIG_PINCTRL_STMFX=y
+CONFIG_DM_PMIC=y
+CONFIG_PMIC_STPMIC1=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_DM_REGULATOR_GPIO=y
+CONFIG_DM_REGULATOR_STM32_VREFBUF=y
+CONFIG_DM_REGULATOR_STPMIC1=y
+CONFIG_SERIAL_RX_BUFFER=y
+CONFIG_STM32_SERIAL=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_DM_USB_GADGET=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_GENERIC=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_MANUFACTURER="STMicroelectronics"
+CONFIG_USB_GADGET_VENDOR_NUM=0x0483
+CONFIG_USB_GADGET_PRODUCT_NUM=0x5720
+CONFIG_USB_GADGET_DWC2_OTG=y
index 78beb9a5220555f62b4a8a6e568141117836c10b..96b813d8770e0213c9852e849f06b31374eac453 100644 (file)
@@ -4,6 +4,7 @@ CONFIG_ARCH_MX6=y
 CONFIG_SYS_TEXT_BASE=0x17800000
 CONFIG_TARGET_TBS2910=y
 CONFIG_CMD_HDMIDETECT=y
+CONFIG_AHCI=y
 CONFIG_NR_DRAM_BANKS=1
 CONFIG_BOOTDELAY=3
 CONFIG_PRE_CONSOLE_BUFFER=y
@@ -14,6 +15,7 @@ CONFIG_BOARD_EARLY_INIT_F=y
 CONFIG_HUSH_PARSER=y
 CONFIG_SYS_PROMPT="Matrix U-Boot> "
 CONFIG_CMD_BOOTZ=y
+# CONFIG_CMD_FDT is not set
 CONFIG_CMD_MEMTEST=y
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_GPIO=y
@@ -28,7 +30,6 @@ CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
 CONFIG_CMD_CACHE=y
-CONFIG_CMD_DATE=y
 CONFIG_CMD_TIME=y
 CONFIG_CMD_EXT2=y
 CONFIG_CMD_EXT4=y
@@ -36,15 +37,28 @@ CONFIG_CMD_EXT4_WRITE=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_EFI_PARTITION=y
+CONFIG_OF_CONTROL=y
+CONFIG_OF_EMBED=y
+CONFIG_DEFAULT_DEVICE_TREE="imx6q-tbs2910"
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
 CONFIG_DWC_AHSATA=y
+CONFIG_DM_GPIO=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_MXC=y
+CONFIG_DM_KEYBOARD=y
+CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
 CONFIG_PHYLIB=y
 CONFIG_MII=y
 CONFIG_PCI=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_IMX6=y
+CONFIG_DM_RTC=y
+CONFIG_RTC_DS1307=y
 CONFIG_DM_THERMAL=y
 CONFIG_USB=y
+CONFIG_DM_USB=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_KEYBOARD=y
 CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE=y
@@ -54,5 +68,7 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x0525
 CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
 CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
+CONFIG_I2C_EDID=y
 CONFIG_VIDEO=y
-CONFIG_OF_LIBFDT=y
+CONFIG_VIDEO_IPUV3=y
+# CONFIG_EFI_LOADER is not set
index fb9307aaf58014f2b7f0fd5ea34c60ecaa654132..3736aec537dbd13324b2c466b8b3c02f802659f6 100644 (file)
@@ -51,6 +51,7 @@ CONFIG_ENV_SPI_MAX_HZ=50000000
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_OF_TRANSLATE=y
 CONFIG_SATA_MV=y
+CONFIG_BLK=y
 CONFIG_BOOTCOUNT_LIMIT=y
 CONFIG_BOOTCOUNT_RAM=y
 CONFIG_FPGA_ALTERA=y
index c406b257533e4bae66497cb39b0ef53823967aa8..85f214148a8ebcd2e4214e1474964621212ecf80 100644 (file)
@@ -43,6 +43,7 @@ CONFIG_ATSHA204A=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_MV=y
 CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_SPANSION=y
 CONFIG_PHY_MARVELL=y
 CONFIG_PHY_GIGE=y
 CONFIG_MVNETA=y
index 08dfa240c1663eaa517f366a3759841ad069e3b2..e0e4dbd5078f7e58ac57145120439f03824375b9 100644 (file)
@@ -33,6 +33,7 @@ CONFIG_GPIO_UNIPHIER=y
 CONFIG_MISC=y
 CONFIG_I2C_EEPROM=y
 CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS=10
+CONFIG_SUPPORT_EMMC_RPMB=y
 CONFIG_MMC_HS200_SUPPORT=y
 CONFIG_MMC_UNIPHIER=y
 CONFIG_MMC_SDHCI=y
index 5725487446b542de8e9de9cdb4c2271319792fc9..ba0c844262082170455fe403b358b9e63070f9ce 100644 (file)
@@ -10,6 +10,7 @@ CONFIG_SPL_SERIAL_SUPPORT=y
 CONFIG_SPL=y
 CONFIG_SPL_LIBDISK_SUPPORT=y
 CONFIG_CMD_HDMIDETECT=y
+CONFIG_AHCI=y
 CONFIG_DISTRO_DEFAULTS=y
 CONFIG_NR_DRAM_BANKS=1
 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/spl_sd.cfg"
@@ -32,15 +33,29 @@ CONFIG_CMD_SATA=y
 CONFIG_CMD_USB=y
 CONFIG_CMD_CACHE=y
 CONFIG_CMD_EXT4_WRITE=y
+CONFIG_OF_CONTROL=y
+CONFIG_DEFAULT_DEVICE_TREE="imx6dl-wandboard-revb1"
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
 CONFIG_DM=y
 CONFIG_DWC_AHSATA=y
+CONFIG_DM_GPIO=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_MXC=y
+CONFIG_SYS_I2C_MXC_I2C1=y
+CONFIG_SYS_I2C_MXC_I2C2=y
+CONFIG_SYS_I2C_MXC_I2C3=y
+CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
 CONFIG_PHYLIB=y
 CONFIG_MII=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_IMX6=y
+CONFIG_DM_PMIC=y
+CONFIG_DM_PMIC_PFUZE100=y
+CONFIG_DM_SCSI=y
 CONFIG_DM_THERMAL=y
 CONFIG_USB=y
-CONFIG_VIDEO=y
-# CONFIG_VIDEO_SW_CURSOR is not set
-CONFIG_OF_LIBFDT=y
+CONFIG_DM_USB=y
+CONFIG_DM_VIDEO=y
+CONFIG_VIDEO_IPUV3=y
index cd18e9eb454b61539ad17d6f318a8484c32058ec..c893c44452b185153dc8854494c32754d780bc93 100644 (file)
@@ -19,6 +19,8 @@ CONFIG_SILENT_CONSOLE=y
 CONFIG_SILENT_U_BOOT_ONLY=y
 CONFIG_SILENT_CONSOLE_UPDATE_ON_RELOC=y
 CONFIG_MISC_INIT_R=y
+CONFIG_SPL_BOARD_INIT=y
+CONFIG_SPL_WATCHDOG_SUPPORT=y
 CONFIG_CMD_MEMINFO=y
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_GPIO=y
@@ -72,3 +74,6 @@ CONFIG_USB_STORAGE=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_ETHER_ASIX88179=y
+CONFIG_WATCHDOG=y
+CONFIG_WDT=y
+CONFIG_WDT_ORION=y
index ba521876b75f7eca076f1ddd7716ac27ca1b1d72..ec92104f0cbf73031c48d34f5619f3a0ac2f8dab 100644 (file)
@@ -6,8 +6,10 @@ CONFIG_ENV_SIZE=0x80
 CONFIG_SPL=y
 CONFIG_SYS_MEM_RSVD_FOR_MMU=y
 CONFIG_ZYNQMP_NO_DDR=y
+# CONFIG_PSCI_RESET is not set
 # CONFIG_CMD_ZYNQMP is not set
 CONFIG_NR_DRAM_BANKS=1
+# CONFIG_EXPERT is not set
 # CONFIG_IMAGE_FORMAT_LEGACY is not set
 # CONFIG_BOARD_LATE_INIT is not set
 # CONFIG_DISPLAY_CPUINFO is not set
index 6e0767164c7e48e04938ae4d3916779204eb58bc..cd7d2f5376d20c0d919c48ad1c81732ff4ac1a7d 100644 (file)
@@ -85,8 +85,6 @@ CONFIG_USB_ETHER=y
 CONFIG_USB_ETH_CDC=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
-CONFIG_WDT=y
-CONFIG_WDT_CDNS=y
 CONFIG_SPL_GZIP=y
 CONFIG_OF_LIBFDT_OVERLAY=y
 CONFIG_EFI_LOADER_BOUNCE_BUFFER=y
index 45eaeced2dac049a76dae77bced3cca5c494cd19..096bc4f1f7f0f16a9cb4bdae9bb716bfb4efb4f7 100644 (file)
-Running U-Boot from coreboot on Chromebooks
-===========================================
+Chromium OS Support in U-Boot
+=============================
 
-U-Boot can be used as a secondary boot loader in a few situations such as from
-UEFI and coreboot (see README.x86). Recent Chromebooks use coreboot even on
-ARM platforms to start up the machine.
+Introduction
+------------
 
-This document aims to provide a guide to booting U-Boot on a Chromebook. It
-is only a starting point, and there are many guides on the interwebs. But
-placing this information in the U-Boot tree should make it easier to find for
-those who use U-Boot habitually.
+This describes how to use U-Boot with Chromium OS. Several options are
+available:
 
-Most of these platforms are supported by U-Boot natively, but it is risky to
-replace the ROM unless you have a servo board and cable to restore it with.
+   - Running U-Boot from the 'altfw' feature, which is available on selected
+        Chromebooks from 2019 onwards (initially Grunt). Press '1' from the
+        developer-mode screen to get into U-Boot. See here for details:
+        https://sites.google.com/a/chromium.org/dev/chromium-os/poking-around-your-chrome-os-device?pli=1
 
+   - Running U-Boot from the disk partition. This involves signing U-Boot and
+        placing it on the disk, for booting as a 'kernel'. See
+        README.chromium-chainload for information on this. This is the only
+        option on non-U-Boot Chromebooks from 2013 to 2018 and is somewhat
+        more involved.
 
-For all of these the standard U-Boot build instructions apply. For example on
-ARM:
+   - Running U-Boot with Chromium OS verified boot. This allows U-Boot to be
+        used instead of either or both of depthcharge (a bootloader which forked
+        from U-Boot in 2013) and coreboot. See below for more information on
+        this.
 
-   sudo apt install gcc-arm-linux-gnueabi
-   mkdir b
-   make O=b/nyan_big CROSS_COMPILE=arm-linux-gnueabi- nyan-big_defconfig all
 
-You can obtain the vbutil_kernel utility here:
+U-Boot with Chromium OS verified boot
+-------------------------------------
 
-   https://drive.google.com/open?id=0B7WYZbZ9zd-3dHlVVXo4VXE2T0U
+To obtain:
 
+   git clone https://github.com/sglass68/u-boot.git
+   cd u-boot
+   git checkout cros-master
 
-Snow (Samsung ARM Chromebook)
------------------------------
+To build for sandbox:
 
-See here:
+   UB=/tmp/b/chromeos_sandbox    # U-Boot build directory
+   CROS=/home/sglass/cosarm      # Chromium OS directory
+   make O=$UB/chromeos_sandbox_defconfig
+   make O=$UB -j20 -s VBOOT_SOURCE=$CROS/src/platform/vboot_reference \
+       MAKEFLAGS_VBOOT=DEBUG=1 QUIET=1
 
-https://www.chromium.org/chromium-os/firmware-porting-guide/using-nv-u-boot-on-the-samsung-arm-chromebook
+Replace sandbox with another supported target.
 
+This produces $UB/image.bin which contains the firmware binaries in a SPI
+flash image.
 
-Nyan-big
---------
-
-Compiled based on information here:
-https://lists.denx.de/pipermail/u-boot/2015-March/209530.html
-https://git.collabora.com/cgit/user/tomeu/u-boot.git/commit/?h=nyan-big
-https://lists.denx.de/pipermail/u-boot/2017-May/289491.html
-https://github.com/chromeos-nvidia-androidtv/gnu-linux-on-acer-chromebook-13#copy-data-to-the-sd-card
-
-1. Build U-Boot
-
-   mkdir b
-   make -j8 O=b/nyan-big CROSS_COMPILE=arm-linux-gnueabi- nyan-big_defconfig all
-
-
-2. Select a .its file
-
-Select something from doc/chromium which matches your board, or create your
-own.
-
-Note that the device tree node is required, even though it is not actually
-used by U-Boot. This is because the Chromebook expects to pass it to the
-kernel, and crashes if it is not present.
-
-
-3. Build and sign an image
-
-   ./b/nyan-big/tools/mkimage -f doc/chromium/nyan-big.its u-boot-chromium.fit
-   echo test >dummy.txt
-   vbutil_kernel --arch arm --keyblock doc/chromium/devkeys/kernel.keyblock \
-       --signprivate doc/chromium/devkeys/kernel_data_key.vbprivk \
-       --version 1 --config dummy.txt --vmlinuz u-boot-chromium.fit \
-       --bootloader dummy.txt --pack u-boot.kpart
-
-
-4. Prepare an SD card
-
-   DISK=/dev/sdc   # Replace with your actual SD card device
-   sudo cgpt create $DISK
-   sudo cgpt add -b 34 -s 32768 -P 1 -S 1 -t kernel $DISK
-   sudo cgpt add -b 32802 -s 2000000 -t rootfs $DISK
-   sudo gdisk $DISK   # Enter command 'w' to write a protective MBR to the disk
-
-
-5. Write U-Boot to the SD card
+To run on sandbox:
 
-   sudo dd if=u-boot.kpart of=/dev/sdc1; sync
+   $UB/tpl/u-boot-tpl -d $UB/u-boot.dtb.out \
+       -L6 -c "host bind 0 $CROS/src/build/images/cheza/latest/chromiumos_image.bin; vboot go auto" \
+       -l -w -s state.dtb -r
 
+To run on other boards:
+   Install image.bin in the SPI flash of your device
+   Boot your system
 
-6. Start it up
 
-Reboot the device in dev mode. Make sure that you have USB booting enabled. To
-do this, login as root (via Ctrl-Alt-forward_arrow) and type
-'enable_dev_usb_boot'. You only need to do this once.
+Sandbox
+-------
 
-Reboot the device with the SD card inserted. Press Clrl-U at the developer
-mode screen. It should show something like the following on the display:
+Most Chromium OS development with U-Boot is undertaken using sandbox. There is
+a sandbox target available (chromeos_sandbox) which allows running U-Boot on
+a Linux machine completion with emulations of the display, TPM, disk, etc.
 
-   U-Boot 2017.07-00637-g242eb42-dirty (May 22 2017 - 06:14:21 -0600)
+Running sandbox starts TPL, which contains the first phase of vboot, providing
+a device tree and binding a Chromium OS disk image for use to find kernels
+(any Chromium OS image will do). It also saves driver state between U-Boot
+phases into state.dtb and will automatically ensure that memory is shared
+between all phases. TPL will jump to SPL and then on to U-Boot proper.
 
-   Model: Acer Chromebook 13 CB5-311
-   Board: Google/NVIDIA Nyan-big, ID: 1
+It is possible to run with debugging on, e.g.
 
-   Net:   No ethernet found.
-   Hit any key to stop autoboot:  0
-   Tegra124 (Nyan-big) #
+   gdb --args $UB/tpl/u-boot-tpl -d ....
 
+Breakpoints can be set in any U-Boot phase. Overall this is a good debugging
+environment for new verified-boot features.
 
-7. Known problems
 
-On the serial console the word MMC is chopped at the start of the line:
+Samus
+-----
 
-C:   sdhci@700b0000: 2, sdhci@700b0400: 1, sdhci@700b0600: 0
+Basic support is available for samus, using the chromeos_samus target. If you
+have an em100, use:
 
-This is likely due to some problem with change-over of the serial driver
-during relocation (or perhaps updating the clock setup in board_init()).
+   sudo em100 -s -c W25Q128FW -d $UB/image.bin -t -r
 
+to write the image and then boot samus (Power-Refresh).
 
-9. Notes
 
-To check that you copied the u-boot.its file correctly, use these commands.
-You should see that the data at 0x100 in u-boot-chromium.fit is the first few
-bytes of U-Boot:
+Boot flow
+---------
 
-   hd u-boot-chromium.fit |head -20
-   ...
-   00000100  b8 00 00 ea 14 f0 9f e5  14 f0 9f e5 14 f0 9f e5  |................|
+Verified boot starts in TPL, which selects the A or B SPL, which in turn selects
+the A or B U-Boot. Then this jumps to the selected kernel. If anything goes
+wrong, the device reboots and the recovery SPL and U-Boot are used instead.
 
-   hd b/nyan-big/u-boot.bin |head
-   00000000  b8 00 00 ea 14 f0 9f e5  14 f0 9f e5 14 f0 9f e5  |................|
+More details are available here:
 
+   https://www.chromium.org/chromium-os/chromiumos-design-docs/firmware-boot-and-recovery
 
-The 'data' property of the FIT is set up to start at offset 0x100 bytes into
-the file. The change to CONFIG_SYS_TEXT_BASE is also an offset of 0x100 bytes
-from the load address. If this changes, you either need to modify U-Boot to be
-fully relocatable, or expect it to hang.
 
+New uclasses
+------------
 
-chromebook_jerry
-----------------
+Several uclasses are provided in cros/:
 
-The instruction are similar to those for Nyan with changes as noted below:
+       UCLASS_CROS_AUX_FW              Chrome OS auxiliary firmware
+       UCLASS_CROS_FWSTORE             Chrome OS firmware storage
+       UCLASS_CROS_NVDATA              Chrome OS non-volatile data device
+       UCLASS_CROS_VBOOT_EC            Chrome OS vboot EC operations
+       UCLASS_CROS_VBOOT_FLAG          Chrome OS verified boot flag
 
-1. Patch U-Boot
+The existing UCLASS_CROS_EC is also used.
 
-Open include/configs/rk3288_common.h
 
-Change:
-
-#define CONFIG_SYS_TEXT_BASE           0x00100000
-
-to:
-
-#define CONFIG_SYS_TEXT_BASE           0x02000100
-
-
-
-2. Build U-Boot
-
-   mkdir b
-   make -j8 O=b/chromebook_jerry CROSS_COMPILE=arm-linux-gnueabi- \
-       chromebook_jerry_defconfig all
-
-
-3. See above
-
-4. Build and sign an image
-
-   ./b/chromebook_jerry/tools/mkimage -f doc/chromium/chromebook_jerry.its \
-       u-boot-chromium.fit
-   echo test >dummy.txt
-   vbutil_kernel --arch arm --keyblock doc/chromium/devkeys/kernel.keyblock \
-       --signprivate doc/chromium/devkeys/kernel_data_key.vbprivk \
-       --version 1 --config dummy.txt --vmlinuz u-boot-chromium.fit \
-       --bootloader dummy.txt --pack u-boot.kpart
-
-
-5. See above
+Commands
+--------
 
-6. See above
+A new 'vboot' command is provided to run particular vboot stages. The most
+useful command is 'vboot go auto', which continues where the last stage left
+off.
 
-7. Start it up
+Note that TPL and SPL do not supports commands as yet, so the vboot code is
+called directly from the SPL boot devices (BOOT_DEVICE_CROS_VBOOT). See
+cros_load_image_tpl() and cros_load_image_spl() which both call
+vboot_run_auto().
 
-Reboot the device in dev mode. Make sure that you have USB booting enabled. To
-do this, login as root (via Ctrl-Alt-forward_arrow) and type
-'enable_dev_usb_boot'. You only need to do this once.
 
-Reboot the device with the SD card inserted. Press Clrl-U at the developer
-mode screen. It should show something like the following on the display:
+Config options
+--------------
 
-   U-Boot 2017.05-00649-g72acdbf-dirty (May 29 2017 - 14:57:05 -0600)
+The main option is CONFIG_CHROMEOS, which enables a wide array of other options
+so that the required features are present.
 
-   Model: Google Jerry
-   Net:   Net Initialization Skipped
-   No ethernet found.
-   Hit any key to stop autoboot:  0
 
+Device-tree config
+------------------
 
-8. Known problems
+Various options are available which control the operation of verified boot.
+See cros/dts/bindings/config.txt for details. Most config is handled at run-
+time, although build-time config (with Kconfig) could also be added fairly
+easily.
 
-None as yet.
 
+Porting to other hardware
+-------------------------
 
-9. Notes
+A basic port to samus (Chromebook Pixel 2015) is in a basic working state,
+using the chromeos_samus target. Patches will likely be forthcoming in early
+2019. Ports to an ARM board and coreboot (for x86 Chromebooks) are in the
+dreaming state.
 
-None as yet.
 
+Tests
+-----
 
-Other notes
-===========
+Chromium OS firmware has a very limited set of tests. The tests that originally
+existed in U-Boot were not brought over to coreboot or depthcharge.
 
-flashrom
---------
+The U-Boot tests ('make check') do operate, but at present there are no
+Chromium OS tests available. These will hopefully come together over time. Of
+course the above sandbox feature provides a sort of functional test and can
+detecte problems that affect the flow or particular vboot features.
 
-   Used to make a backup of your firmware, or to replace it.
 
-   See: https://www.chromium.org/chromium-os/packages/cros-flashrom
+TO DO
+-----
 
+- Support for booting from coreboot (patches expected March 2019)
+- Support for booting from an ARM board, e.g. bob
 
-coreboot
---------
 
-Coreboot itself is not designed to actually boot an OS. Instead, a program
-called Depthcharge is used. This originally came out of U-Boot and was then
-heavily hacked and modified such that is is almost unrecognisable. It does
-include a very small part of the U-Boot command-line interface but is not
-usable as a general-purpose boot loader.
-
-In addition, it has a very unusual design in that it does not do device init
-itself, but instead relies on coreboot. This is similar to (in U-Boot) having
-a SPI driver with an empty probe() method, relying on whatever was set up
-beforehand. It can be quite hard to figure out between these two code bases
-what settings are actually used. When chain-loading into U-Boot we must be
-careful to reinit anything that U-Boot expects. If not, some peripherals (or
-the whole machine) may not work. This makes the process of chainloading more
-complicated than it could be on some platforms.
-
-Finally, it supports only a subset of the U-Boot's FIT format. In particular
-it uses a fixed address to load the FIT and does not support load/exec
-addresses. This means that U-Boot must be able to boot from whatever
-address Depthcharge happens to use (it is the CONFIG_KERNEL_START setting
-in Depthcharge). In practice this means that the data in the kernel@1 FIT node
-(see above) must start at the same address as U-Boot's CONFIG_SYS_TEXT_BASE.
+Simon Glass
+sjg@chromium.org
+7 October 2018
diff --git a/doc/README.chromium-chainload b/doc/README.chromium-chainload
new file mode 100644 (file)
index 0000000..45eaece
--- /dev/null
@@ -0,0 +1,239 @@
+Running U-Boot from coreboot on Chromebooks
+===========================================
+
+U-Boot can be used as a secondary boot loader in a few situations such as from
+UEFI and coreboot (see README.x86). Recent Chromebooks use coreboot even on
+ARM platforms to start up the machine.
+
+This document aims to provide a guide to booting U-Boot on a Chromebook. It
+is only a starting point, and there are many guides on the interwebs. But
+placing this information in the U-Boot tree should make it easier to find for
+those who use U-Boot habitually.
+
+Most of these platforms are supported by U-Boot natively, but it is risky to
+replace the ROM unless you have a servo board and cable to restore it with.
+
+
+For all of these the standard U-Boot build instructions apply. For example on
+ARM:
+
+   sudo apt install gcc-arm-linux-gnueabi
+   mkdir b
+   make O=b/nyan_big CROSS_COMPILE=arm-linux-gnueabi- nyan-big_defconfig all
+
+You can obtain the vbutil_kernel utility here:
+
+   https://drive.google.com/open?id=0B7WYZbZ9zd-3dHlVVXo4VXE2T0U
+
+
+Snow (Samsung ARM Chromebook)
+-----------------------------
+
+See here:
+
+https://www.chromium.org/chromium-os/firmware-porting-guide/using-nv-u-boot-on-the-samsung-arm-chromebook
+
+
+Nyan-big
+--------
+
+Compiled based on information here:
+https://lists.denx.de/pipermail/u-boot/2015-March/209530.html
+https://git.collabora.com/cgit/user/tomeu/u-boot.git/commit/?h=nyan-big
+https://lists.denx.de/pipermail/u-boot/2017-May/289491.html
+https://github.com/chromeos-nvidia-androidtv/gnu-linux-on-acer-chromebook-13#copy-data-to-the-sd-card
+
+1. Build U-Boot
+
+   mkdir b
+   make -j8 O=b/nyan-big CROSS_COMPILE=arm-linux-gnueabi- nyan-big_defconfig all
+
+
+2. Select a .its file
+
+Select something from doc/chromium which matches your board, or create your
+own.
+
+Note that the device tree node is required, even though it is not actually
+used by U-Boot. This is because the Chromebook expects to pass it to the
+kernel, and crashes if it is not present.
+
+
+3. Build and sign an image
+
+   ./b/nyan-big/tools/mkimage -f doc/chromium/nyan-big.its u-boot-chromium.fit
+   echo test >dummy.txt
+   vbutil_kernel --arch arm --keyblock doc/chromium/devkeys/kernel.keyblock \
+       --signprivate doc/chromium/devkeys/kernel_data_key.vbprivk \
+       --version 1 --config dummy.txt --vmlinuz u-boot-chromium.fit \
+       --bootloader dummy.txt --pack u-boot.kpart
+
+
+4. Prepare an SD card
+
+   DISK=/dev/sdc   # Replace with your actual SD card device
+   sudo cgpt create $DISK
+   sudo cgpt add -b 34 -s 32768 -P 1 -S 1 -t kernel $DISK
+   sudo cgpt add -b 32802 -s 2000000 -t rootfs $DISK
+   sudo gdisk $DISK   # Enter command 'w' to write a protective MBR to the disk
+
+
+5. Write U-Boot to the SD card
+
+   sudo dd if=u-boot.kpart of=/dev/sdc1; sync
+
+
+6. Start it up
+
+Reboot the device in dev mode. Make sure that you have USB booting enabled. To
+do this, login as root (via Ctrl-Alt-forward_arrow) and type
+'enable_dev_usb_boot'. You only need to do this once.
+
+Reboot the device with the SD card inserted. Press Clrl-U at the developer
+mode screen. It should show something like the following on the display:
+
+   U-Boot 2017.07-00637-g242eb42-dirty (May 22 2017 - 06:14:21 -0600)
+
+   Model: Acer Chromebook 13 CB5-311
+   Board: Google/NVIDIA Nyan-big, ID: 1
+
+   Net:   No ethernet found.
+   Hit any key to stop autoboot:  0
+   Tegra124 (Nyan-big) #
+
+
+7. Known problems
+
+On the serial console the word MMC is chopped at the start of the line:
+
+C:   sdhci@700b0000: 2, sdhci@700b0400: 1, sdhci@700b0600: 0
+
+This is likely due to some problem with change-over of the serial driver
+during relocation (or perhaps updating the clock setup in board_init()).
+
+
+9. Notes
+
+To check that you copied the u-boot.its file correctly, use these commands.
+You should see that the data at 0x100 in u-boot-chromium.fit is the first few
+bytes of U-Boot:
+
+   hd u-boot-chromium.fit |head -20
+   ...
+   00000100  b8 00 00 ea 14 f0 9f e5  14 f0 9f e5 14 f0 9f e5  |................|
+
+   hd b/nyan-big/u-boot.bin |head
+   00000000  b8 00 00 ea 14 f0 9f e5  14 f0 9f e5 14 f0 9f e5  |................|
+
+
+The 'data' property of the FIT is set up to start at offset 0x100 bytes into
+the file. The change to CONFIG_SYS_TEXT_BASE is also an offset of 0x100 bytes
+from the load address. If this changes, you either need to modify U-Boot to be
+fully relocatable, or expect it to hang.
+
+
+chromebook_jerry
+----------------
+
+The instruction are similar to those for Nyan with changes as noted below:
+
+1. Patch U-Boot
+
+Open include/configs/rk3288_common.h
+
+Change:
+
+#define CONFIG_SYS_TEXT_BASE           0x00100000
+
+to:
+
+#define CONFIG_SYS_TEXT_BASE           0x02000100
+
+
+
+2. Build U-Boot
+
+   mkdir b
+   make -j8 O=b/chromebook_jerry CROSS_COMPILE=arm-linux-gnueabi- \
+       chromebook_jerry_defconfig all
+
+
+3. See above
+
+4. Build and sign an image
+
+   ./b/chromebook_jerry/tools/mkimage -f doc/chromium/chromebook_jerry.its \
+       u-boot-chromium.fit
+   echo test >dummy.txt
+   vbutil_kernel --arch arm --keyblock doc/chromium/devkeys/kernel.keyblock \
+       --signprivate doc/chromium/devkeys/kernel_data_key.vbprivk \
+       --version 1 --config dummy.txt --vmlinuz u-boot-chromium.fit \
+       --bootloader dummy.txt --pack u-boot.kpart
+
+
+5. See above
+
+6. See above
+
+7. Start it up
+
+Reboot the device in dev mode. Make sure that you have USB booting enabled. To
+do this, login as root (via Ctrl-Alt-forward_arrow) and type
+'enable_dev_usb_boot'. You only need to do this once.
+
+Reboot the device with the SD card inserted. Press Clrl-U at the developer
+mode screen. It should show something like the following on the display:
+
+   U-Boot 2017.05-00649-g72acdbf-dirty (May 29 2017 - 14:57:05 -0600)
+
+   Model: Google Jerry
+   Net:   Net Initialization Skipped
+   No ethernet found.
+   Hit any key to stop autoboot:  0
+
+
+8. Known problems
+
+None as yet.
+
+
+9. Notes
+
+None as yet.
+
+
+Other notes
+===========
+
+flashrom
+--------
+
+   Used to make a backup of your firmware, or to replace it.
+
+   See: https://www.chromium.org/chromium-os/packages/cros-flashrom
+
+
+coreboot
+--------
+
+Coreboot itself is not designed to actually boot an OS. Instead, a program
+called Depthcharge is used. This originally came out of U-Boot and was then
+heavily hacked and modified such that is is almost unrecognisable. It does
+include a very small part of the U-Boot command-line interface but is not
+usable as a general-purpose boot loader.
+
+In addition, it has a very unusual design in that it does not do device init
+itself, but instead relies on coreboot. This is similar to (in U-Boot) having
+a SPI driver with an empty probe() method, relying on whatever was set up
+beforehand. It can be quite hard to figure out between these two code bases
+what settings are actually used. When chain-loading into U-Boot we must be
+careful to reinit anything that U-Boot expects. If not, some peripherals (or
+the whole machine) may not work. This makes the process of chainloading more
+complicated than it could be on some platforms.
+
+Finally, it supports only a subset of the U-Boot's FIT format. In particular
+it uses a fixed address to load the FIT and does not support load/exec
+addresses. This means that U-Boot must be able to boot from whatever
+address Depthcharge happens to use (it is the CONFIG_KERNEL_START setting
+in Depthcharge). In practice this means that the data in the kernel@1 FIT node
+(see above) must start at the same address as U-Boot's CONFIG_SYS_TEXT_BASE.
index f1bca54520a2e73d0792e30438053339c266ab28..ea170a25a6913fa1a15da4f19a326f53af404c40 100644 (file)
@@ -32,6 +32,7 @@ Currently the following boards are supported:
 | R8A7796  M3-W | Renesas Electronics ULCB               | r8a7796_ulcb
 |---------------+----------------------------------------+-------------------
 | R8A77965 M3-N | Renesas Electronics Salvator-XS        | r8a77965_salvator-x_defconfig
+| R8A77965 M3-N | Renesas Electronics ULCB               | r8a77965_ulcb
 |---------------+----------------------------------------+-------------------
 | R8A77970 V3M  | Renesas Electronics Eagle              | r8a77970_eagle_defconfig
 |---------------+----------------------------------------+-------------------
index 66b6abece5ebc5b234150fb402c5b6392e8b9cff..1d1039a6ae75bc402889ebc8f2f6f79732a020aa 100644 (file)
@@ -14,9 +14,11 @@ and boot loaders like GRUB or the FreeBSD loader can be executed.
 
 ## Development target
 
-The implementation of UEFI in U-Boot strives to reach the minimum requirements
-described in "Server Base Boot Requirements System Software on ARM Platforms -
-Version 1.1" [4].
+The implementation of UEFI in U-Boot strives to reach the requirements described
+in the "Embedded Base Boot Requirements (EBBR) Specification - Release v1.0"
+[4]. The "Server Base Boot Requirements System Software on ARM Platforms" [5]
+describes a superset of the EBBR specification and may be used as further
+reference.
 
 A full blown UEFI implementation would contradict the U-Boot design principle
 "keep it small".
@@ -344,5 +346,7 @@ This driver is only available if U-Boot is configured with
   http://uefi.org/specifications - UEFI specifications
 * [2](./driver-model/README.txt) doc/driver-model/README.txt - Driver model
 * [3](./README.iscsi) doc/README.iscsi - iSCSI booting with U-Boot and iPXE
-* [4](https://developer.arm.com/docs/den0044/latest/server-base-boot-requirements-system-software-on-arm-platforms-version-11)
+* [4](https://github.com/ARM-software/ebbr/releases/download/v1.0/ebbr-v1.0.pdf)
+  Embedded Base Boot Requirements (EBBR) Specification - Release v1.0
+* [5](https://developer.arm.com/docs/den0044/latest/server-base-boot-requirements-system-software-on-arm-platforms-version-11)
   Server Base Boot Requirements System Software on ARM Platforms - Version 1.1
index de818d4713f0c6f77f6a63ed0eb315ec5e66e746..9698e4899b54c8135a863e78ef1cdca74a2bb9b5 100644 (file)
@@ -12,6 +12,10 @@ property which allows the chip offset length to be selected.
 Optional properties:
 - u-boot,i2c-offset-len - length of chip offset in bytes. If omitted the
     default value of 1 is used.
+- u-boot,i2c-transaction-bytes - the length of single I2C transaction on
+    the bus. Some devices require more than single byte transmission
+    (e.g. mc34708 mfd). This information is necessary to correctly
+     initialize (put into idle state) I2C bus after soft reset.
 - gpios = <sda ...>, <scl ...>;
   pinctrl-names = "default", "gpio";
   pinctrl-0 = <&i2c_xfer>;
@@ -28,6 +32,7 @@ i2c4: i2c@12ca0000 {
                compatible = "google,cros-ec";
                i2c-max-frequency = <100000>;
                u-boot,i2c-offset-len = <0>;
+               u-boot,i2c-transaction-bytes = <3>;
                ec-interrupt = <&gpx1 6 GPIO_ACTIVE_LOW>;
        };
 };
diff --git a/doc/device-tree-bindings/leds/leds-bcm6858.txt b/doc/device-tree-bindings/leds/leds-bcm6858.txt
new file mode 100644 (file)
index 0000000..ea2fe23
--- /dev/null
@@ -0,0 +1,51 @@
+LEDs connected to Broadcom BCM6858 controller
+
+This controller is present on BCM6858, BCM6328, BCM6362 and BCM63268.
+In these SoCs it's possible to control LEDs both as GPIOs or by hardware.
+
+Required properties:
+  - compatible : should be "brcm,bcm6858-leds".
+  - #address-cells : must be 1.
+  - #size-cells : must be 0.
+  - reg : BCM6858 LED controller address and size.
+
+Optional properties:
+  - brcm,serial-led-msb-first : Boolean, msb data come out first on serial data pin
+    Default : false
+  - brcm,serial-led-en-pol : Boolean, serial led polarity (true => active high)
+    Default : false
+  - brcm,serial-led-clk-pol : Boolean, serial clock polarity (true => active high)
+    Default : false
+  - brcm,serial-led-data-ppol : Boolean, serial data polarity (true => active high)
+    Default : false
+  - brcm,serial-shift-inv : Boolean, led test mode
+    Default : false
+
+Each LED is represented as a sub-node of the brcm,bcm6858-leds device.
+
+LED sub-node required properties:
+  - reg : LED pin number (only LEDs 0 to 32 are valid).
+
+LED sub-node optional properties:
+  - label : see Documentation/devicetree/bindings/leds/common.txt
+  - active-low : Boolean, makes LED active low.
+    Default : false
+
+Examples:
+BCM6328 with 2 GPIO LEDs
+       leds0: led-controller@ff800800 {
+               compatible = "brcm,bcm6858-leds";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               reg = <0x0 0xff800800 0x0 0xe4>;
+
+               led@2 {
+                       reg = <2>;
+                       label = "green:inet";
+               };
+
+               led@5 {
+                       reg = <5>;
+                       label = "red:alarm";
+               };
+       };
diff --git a/doc/device-tree-bindings/mmc/snps,dw-mmc.txt b/doc/device-tree-bindings/mmc/snps,dw-mmc.txt
new file mode 100644 (file)
index 0000000..69faefa
--- /dev/null
@@ -0,0 +1,33 @@
+Synopsys Designware Mobile Storage Host Controller extensions
+used in Synopsys ARC devboards
+
+Required Properties:
+
+* compatible: should be - "snps,dw-mshc".
+* bus-width: number of data lines connected to the controller.
+* clocks: from common clock binding: handle to biu and ciu clocks for the
+  bus interface unit clock and the card interface unit clock.
+* clock-names: from common clock binding: Shall be "biu" and "ciu".
+
+Optional properties:
+
+* fifo-depth: The maximum size of the tx/rx fifo's. If this property is not
+  specified, the default value of the fifo size is determined from the
+  controller registers.
+* fifo-mode: Don't use DMA.
+* max-frequency: Maximum operating clock frequency, driver uses 'ciu' clock
+  frequency if it is not set.
+
+Example:
+
+mmc0@f000a000 {
+       compatible = "snps,dw-mshc";
+       reg = <0xf000a000 0x400>;
+
+       bus-width = <4>;
+       fifo-depth = <256>;
+       clocks = <&mmcclk_biu>, <&mmcclk_ciu>;
+       clock-names = "biu", "ciu";
+       max-frequency = <25000000>;
+};
+
diff --git a/doc/device-tree-bindings/mtd/stm32-fmc2-nand.txt b/doc/device-tree-bindings/mtd/stm32-fmc2-nand.txt
new file mode 100644 (file)
index 0000000..70e76be
--- /dev/null
@@ -0,0 +1,59 @@
+STMicroelectronics Flexible Memory Controller 2 (FMC2)
+NAND Interface
+
+Required properties:
+- compatible: Should be one of:
+              * st,stm32mp15-fmc2
+- reg: NAND flash controller memory areas.
+       First region contains the register location.
+       Regions 2 to 4 respectively contain the data, command,
+       and address space for CS0.
+       Regions 5 to 7 contain the same areas for CS1.
+- interrupts: The interrupt number
+- pinctrl-0: Standard Pinctrl phandle (see: pinctrl/pinctrl-bindings.txt)
+- clocks: The clock needed by the NAND flash controller
+
+Optional properties:
+- resets: Reference to a reset controller asserting the FMC controller
+- dmas: DMA specifiers (see: dma/stm32-mdma.txt)
+- dma-names: Must be "tx", "rx" and "ecc"
+
+Optional children nodes:
+Children nodes represent the available NAND chips.
+
+Optional properties:
+- nand-on-flash-bbt: see nand.txt
+- nand-ecc-strength: see nand.txt
+- nand-ecc-step-size: see nand.txt
+
+The following ECC strength and step size are currently supported:
+ - nand-ecc-strength = <1>, nand-ecc-step-size = <512> (Hamming)
+ - nand-ecc-strength = <4>, nand-ecc-step-size = <512> (BCH4)
+ - nand-ecc-strength = <8>, nand-ecc-step-size = <512> (BCH8) (default)
+
+Example:
+
+       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>;
+               clocks = <&rcc FMC_K>;
+               resets = <&rcc FMC_R>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&fmc_pins_a>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               nand@0 {
+                       reg = <0>;
+                       nand-on-flash-bbt;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+               };
+       };
index 725ae71ae6535a0bdb8ccbf2ed83e168d3002d56..da98407403d5509190fe95aff5a07155711f3f65 100644 (file)
@@ -23,6 +23,8 @@ Required properties:
 - compatible: must be "st,stm32mp1-usbphyc"
 - reg: address and length of the usb phy control register set
 - clocks: phandle + clock specifier for the PLL phy clock
+- vdda1v1-supply: phandle to the regulator providing 1V1 power to the PHY
+- vdda1v8-supply: phandle to the regulator providing 1V8 power to the PHY
 - #address-cells: number of address cells for phys sub-nodes, must be <1>
 - #size-cells: number of size cells for phys sub-nodes, must be <0>
 
@@ -40,8 +42,6 @@ Required properties:
 - reg: phy port index
 - phy-supply: phandle to the regulator providing 3V3 power to the PHY,
              see phy-bindings.txt in the same directory.
-- vdda1v1-supply: phandle to the regulator providing 1V1 power to the PHY
-- vdda1v8-supply: phandle to the regulator providing 1V8 power to the PHY
 - #phy-cells: see phy-bindings.txt in the same directory, must be <0> for PHY
   port#1 and must be <1> for PHY port#2, to select USB controller
 
index a1b559668ff76fdf8bce7c962b88aab2d509c792..a376c6fba5df1894470c4d4da6a2b50bc4e194d5 100644 (file)
@@ -42,7 +42,7 @@ Example:
                status = "okay";
 
                spi_flash@0 {
-                       compatible = "spi-flash";
+                       compatible = "jedec,spi-nor";
                        reg = <0>;
                        spi-max-frequency = <50000000>;
                };
index 9c0630b5003ee2a9a898c2662b102becfc74c0bf..e67b3425f0d222583e35ac896f90c909e29fe0b9 100644 (file)
@@ -28,7 +28,7 @@ Example:
                clocks = <&spiclk>;
                interrupts = <3 4>;
                flash@0 {
-                       compatible = "spi-flash";
+                       compatible = "jedec,spi-nor";
                        spi-max-frequency = <50000000>;
                        reg = <0>;
                        spi-cpol;
index 6c7da1d76c1d8144e74fcf66eb8fc03afad523c1..cec3e1250ce22bf839a0860707d3916c969d652d 100644 (file)
@@ -29,7 +29,7 @@ Example:
                qflash0: n25q128a {
                        #address-cells = <1>;
                        #size-cells = <1>;
-                       compatible = "micron,n25q128a13", "spi-flash";
+                       compatible = "micron,n25q128a13", "jedec,spi-nor";
                        spi-max-frequency = <108000000>;
                        spi-tx-bus-width = <4>;
                        spi-rx-bus-width = <4>;
diff --git a/doc/device-tree-bindings/usb/dwc2.txt b/doc/device-tree-bindings/usb/dwc2.txt
new file mode 100644 (file)
index 0000000..61493f7
--- /dev/null
@@ -0,0 +1,58 @@
+Platform DesignWare HS OTG USB 2.0 controller
+-----------------------------------------------------
+
+Required properties:
+- compatible : One of:
+  - brcm,bcm2835-usb: The DWC2 USB controller instance in the BCM2835 SoC.
+  - hisilicon,hi6220-usb: The DWC2 USB controller instance in the hi6220 SoC.
+  - rockchip,rk3066-usb: The DWC2 USB controller instance in the rk3066 Soc;
+  - "rockchip,px30-usb", "rockchip,rk3066-usb", "snps,dwc2": for px30 Soc;
+  - "rockchip,rk3188-usb", "rockchip,rk3066-usb", "snps,dwc2": for rk3188 Soc;
+  - "rockchip,rk3288-usb", "rockchip,rk3066-usb", "snps,dwc2": for rk3288 Soc;
+  - "lantiq,arx100-usb": The DWC2 USB controller instance in Lantiq ARX SoCs;
+  - "lantiq,xrx200-usb": The DWC2 USB controller instance in Lantiq XRX SoCs;
+  - "amlogic,meson8-usb": The DWC2 USB controller instance in Amlogic Meson8 SoCs;
+  - "amlogic,meson8b-usb": The DWC2 USB controller instance in Amlogic Meson8b SoCs;
+  - "amlogic,meson-gxbb-usb": The DWC2 USB controller instance in Amlogic S905 SoCs;
+  - "amcc,dwc-otg": The DWC2 USB controller instance in AMCC Canyonlands 460EX SoCs;
+  - snps,dwc2: A generic DWC2 USB controller with default parameters.
+  - "st,stm32f4x9-fsotg": The DWC2 USB FS/HS controller instance in STM32F4x9 SoCs
+  configured in FS mode;
+  - "st,stm32f4x9-hsotg": The DWC2 USB HS controller instance in STM32F4x9 SoCs
+  configured in HS mode;
+  - "st,stm32f7-hsotg": The DWC2 USB HS controller instance in STM32F7 SoCs
+    configured in HS mode;
+- reg : Should contain 1 register range (address and length)
+- interrupts : Should contain 1 interrupt
+- clocks: clock provider specifier
+- clock-names: shall be "otg"
+Refer to clk/clock-bindings.txt for generic clock consumer properties
+
+Optional properties:
+- phys: phy provider specifier
+- phy-names: shall be "usb2-phy"
+Refer to phy/phy-bindings.txt for generic phy consumer properties
+- dr_mode: shall be one of "host", "peripheral" and "otg"
+  Refer to usb/generic.txt
+- g-rx-fifo-size: size of rx fifo size in gadget mode.
+- g-np-tx-fifo-size: size of non-periodic tx fifo size in gadget mode.
+- g-tx-fifo-size: size of periodic tx fifo per endpoint (except ep0) in gadget mode.
+- usb33d-supply: external VBUS and ID sensing comparators supply, in order to
+  perform OTG operation, used on STM32MP1 SoCs.
+- u-boot,force-b-session-valid: force B-peripheral session instead of relying on
+  VBUS sensing (only valid when dr_mode = "peripheral" and for u-boot).
+
+Deprecated properties:
+- g-use-dma: gadget DMA mode is automatically detected
+
+Example:
+
+        usb@101c0000 {
+                compatible = "ralink,rt3050-usb, snps,dwc2";
+                reg = <0x101c0000 40000>;
+                interrupts = <18>;
+               clocks = <&usb_otg_ahb_clk>;
+               clock-names = "otg";
+               phys = <&usbphy>;
+               phy-names = "usb2-phy";
+        };
index 957529202b5ea63b6eb54a73a0e27944f270e553..df659f3dd921e9a6c3e7b3513e60589a2a4fb3fd 100644 (file)
@@ -77,7 +77,6 @@ Partially converted:
        drivers/spi/kirkwood_spi.c
        drivers/spi/mxc_spi.c
        drivers/spi/omap3_spi.c
-       drivers/spi/ti_qspi.c
 
        Status: In progress
        Deadline: 2019.07
index b9aee848cc5eecdcbe937a8156a9acba7669161a..8be6185371e2fb476986656430028455af8c9c6c 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2018 Intel Corporation <www.intel.com>
+# Copyright (C) 2018-2019 Intel Corporation <www.intel.com>
 #
 # SPDX-License-Identifier:    GPL-2.0
 
@@ -27,7 +27,7 @@ Firmware storage device described in device tree source
        defined in fs-loader node as shown in below:
 
        Example for block device:
-       fs_loader0: fs-loader@0 {
+       fs_loader0: fs-loader {
                u-boot,dm-pre-reloc;
                compatible = "u-boot,fs-loader";
                phandlepart = <&mmc 1>;
@@ -39,22 +39,55 @@ Firmware storage device described in device tree source
        device, it can be described in FDT as shown in below:
 
        Example for ubi:
-       fs_loader1: fs-loader@1 {
+       fs_loader1: fs-loader {
                u-boot,dm-pre-reloc;
                compatible = "u-boot,fs-loader";
                mtdpart = "UBI",
                ubivol = "ubi0";
        };
 
-       Then, firmware_loader property would be set with the path of fs_loader
-       node under /chosen node such as:
+       Then, firmware-loader property can be added with any device node, which
+       driver would use the firmware loader for loading.
+
+       The value of the firmware-loader property should be set with phandle
+       of the fs-loader node.
+       For example:
+               firmware-loader = <&fs_loader0>;
+
+       If there are majority of devices using the same fs-loader node, then
+       firmware-loader property can be added under /chosen node instead of
+       adding to each of device node.
+
+       For example:
        /{
                chosen {
-                       firmware_loader = &fs_loader0;
+                       firmware-loader = <&fs_loader0>;
                };
        };
 
-       However, this driver is also designed to support U-boot environment
+       In each respective driver of devices using firmware loader, the firmware
+       loaded instance should be created by DT phandle.
+
+       For example of getting DT phandle from /chosen and creating instance:
+       chosen_node = ofnode_path("/chosen");
+       if (!ofnode_valid(chosen_node)) {
+               debug("/chosen node was not found.\n");
+               return -ENOENT;
+       }
+
+       phandle_p = ofnode_get_property(chosen_node, "firmware-loader", &size);
+       if (!phandle_p) {
+               debug("firmware-loader property was not found.\n");
+               return -ENOENT;
+       }
+
+       phandle = fdt32_to_cpu(*phandle_p);
+       ret = uclass_get_device_by_phandle_id(UCLASS_FS_FIRMWARE_LOADER,
+                                            phandle, &dev);
+       if (ret)
+               return ret;
+
+       Firmware loader driver is also designed to support U-boot environment
        variables, so all these data from FDT can be overwritten
        through the U-boot environment variable during run time.
        For examples:
@@ -104,9 +137,12 @@ return:
 Description:
        The firmware is loaded directly into the buffer pointed to by buf
 
-Example of creating firmware loader instance and calling
-request_firmware_into_buf API:
-       if (uclass_get_device(UCLASS_FS_FIRMWARE_LOADER, 0, &dev)) {
-               request_firmware_into_buf(dev, filename, buffer_location,
-                                        buffer_size, offset_ofreading);
-       }
+Example of calling request_firmware_into_buf API after creating firmware loader
+instance:
+       ret = uclass_get_device_by_phandle_id(UCLASS_FS_FIRMWARE_LOADER,
+                                            phandle, &dev);
+       if (ret)
+               return ret;
+
+       request_firmware_into_buf(dev, filename, buffer_location, buffer_size,
+                                offset_ofreading);
index b75ebab02bab2ac934b2ace0f736631513aea623..f989792e8d3ff85cb59edd4e815f5a6925cdf373 100644 (file)
@@ -24,9 +24,8 @@ alias dinh           Dinh Nguyen <dinguyen@kernel.org>
 alias hs             Heiko Schocher <hs@denx.de>
 alias iwamatsu       Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
 alias jaehoon        Jaehoon Chung <jh80.chung@samsung.com>
-alias jagan          Jagan Teki <jagan@openedev.com>
+alias jagan          Jagan Teki <jagan@amarulasolutions.com>
 alias jhersh         Joe Hershberger <joe.hershberger@ni.com>
-alias luka           Luka Perkov <luka.perkov@sartura.hr>
 alias lukma          Lukasz Majewski <lukma@denx.de>
 alias macpaul        Macpaul Lin <macpaul@andestech.com>
 alias marex          Marek Vasut <marex@denx.de>
@@ -35,7 +34,6 @@ alias masahiro       Masahiro Yamada <yamada.masahiro@socionext.com>
 alias mateusz        Mateusz Kulikowski <mateusz.kulikowski@gmail.com>
 alias maxime         Maxime Ripard <maxime.ripard@free-electrons.com>
 alias monstr         Michal Simek <monstr@monstr.eu>
-alias prafulla       Prafulla Wadaskar <prafulla@marvell.com>
 alias prom           Minkyu Kang <mk7.kang@samsung.com>
 alias ptomsich       Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
 alias sbabic         Stefano Babic <sbabic@denx.de>
@@ -56,7 +54,7 @@ alias arm            uboot, aaribaud, trini
 alias at91           uboot, abiessmann
 alias davinci        ti
 alias imx            uboot, sbabic
-alias kirkwood       uboot, prafulla, luka, stroese
+alias kirkwood       uboot, stroese
 alias omap           ti
 alias pxa            uboot, marex
 alias rmobile        uboot, iwamatsu
index f24351ac4f1d2d5e72a9dbfad86f15aa7eb608ec..e6702eced46c26acf411dfc7ab39dee9d1bba262 100644 (file)
@@ -98,6 +98,8 @@ source "drivers/smem/Kconfig"
 
 source "drivers/sound/Kconfig"
 
+source "drivers/soc/Kconfig"
+
 source "drivers/spi/Kconfig"
 
 source "drivers/spmi/Kconfig"
index 49a056e9416a55333004d03c6e5d27ea63261267..4e95a68a2d1cf31997b80d2ac382cea6addc0b73 100644 (file)
@@ -66,6 +66,14 @@ config DWC_AHSATA
          Enable this driver to support the DWC AHSATA SATA controller found
          in i.MX5 and i.MX6 SoCs.
 
+config DWC_AHSATA_AHCI
+       bool "Enable DWC AHSATA AHCI driver support"
+       depends on DWC_AHSATA
+       depends on AHCI
+       default y
+       help
+         Enable this option unless you need your private ahci implementation
+
 config FSL_SATA
        bool "Enable Freescale SATA controller driver support"
        select LIBATA
@@ -81,7 +89,9 @@ config MVSATA_IDE
 
 config SATA_MV
        bool "Enable Marvell SATA controller driver support"
+       select AHCI
        select LIBATA
+       depends on BLK
        help
          Enable this driver to support the SATA controller found in
          some Marvell SoCs.
@@ -99,6 +109,14 @@ config SATA_SIL3114
        help
          Enable this driver to support the SIL3114 SATA controllers.
 
+config SUNXI_AHCI
+       bool "Enable Allwinner SATA driver support"
+       depends on AHCI
+       default y if ARCH_SUNXI
+       help
+         Enable this driver to support the SATA controllers found in the
+         Allwinner A10, A20 and R40 SoCs.
+
 config AHCI_MVEBU
        bool "Marvell EBU AHCI SATA support"
        depends on ARCH_MVEBU
index 10bed53bb3f297a119f4d1b0a59c96971d7b6c10..a69edb10f7a0901d3a9d3edaa47bfd5431b67d28 100644 (file)
@@ -18,3 +18,4 @@ obj-$(CONFIG_SATA_SIL3114) += sata_sil3114.o
 obj-$(CONFIG_SATA_SIL) += sata_sil.o
 obj-$(CONFIG_SANDBOX) += sata_sandbox.o
 obj-$(CONFIG_AHCI_MVEBU) += ahci_mvebu.o
+obj-$(CONFIG_SUNXI_AHCI) += ahci_sunxi.o
index 6e3f17ee276d9c19c69c3058205c2a2c20a02a4a..48a9d00d1479c174d8dd97fb42f38ade24b3a743 100644 (file)
@@ -44,6 +44,7 @@ static int mvebu_ahci_probe(struct udevice *dev)
 }
 
 static const struct udevice_id mvebu_ahci_ids[] = {
+       { .compatible = "marvell,armada-380-ahci" },
        { .compatible = "marvell,armada-3700-ahci" },
        { .compatible = "marvell,armada-8k-ahci" },
        { }
similarity index 94%
rename from board/sunxi/ahci.c
rename to drivers/ata/ahci_sunxi.c
index a79b80ca1ecdb798babdb763bf56de3637f0defd..77b932aa039243449391a00384e922ee1b2429fe 100644 (file)
@@ -70,15 +70,6 @@ static int sunxi_ahci_phy_init(u8 *reg_base)
        return 0;
 }
 
-#ifndef CONFIG_DM_SCSI
-void scsi_init(void)
-{
-       if (sunxi_ahci_phy_init((u8 *)SUNXI_SATA_BASE) < 0)
-               return;
-
-       ahci_init((void __iomem *)SUNXI_SATA_BASE);
-}
-#else
 static int sunxi_sata_probe(struct udevice *dev)
 {
        ulong base;
@@ -121,6 +112,7 @@ static int sunxi_sata_bind(struct udevice *dev)
 
 static const struct udevice_id sunxi_ahci_ids[] = {
        { .compatible = "allwinner,sun4i-a10-ahci" },
+       { .compatible = "allwinner,sun8i-r40-ahci" },
        { }
 };
 
@@ -131,4 +123,3 @@ U_BOOT_DRIVER(ahci_sunxi_drv) = {
        .bind           = sunxi_sata_bind,
        .probe          = sunxi_sata_probe,
 };
-#endif
index 4c5b98482fff72c746d8a33ea099b945e0b19008..afced8e7e3f8aa9d7fccb053335985bc9f74ae9f 100644 (file)
@@ -16,6 +16,7 @@
 #include <asm/io.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/sys_proto.h>
+#include <asm/mach-imx/sata.h>
 #include <linux/bitops.h>
 #include <linux/ctype.h>
 #include <linux/errno.h>
@@ -511,15 +512,9 @@ static int ahci_port_start(struct ahci_uc_priv *uc_priv, u8 port)
 static void dwc_ahsata_print_info(struct blk_desc *pdev)
 {
        printf("SATA Device Info:\n\r");
-#ifdef CONFIG_SYS_64BIT_LBA
        printf("S/N: %s\n\rProduct model number: %s\n\r"
-               "Firmware version: %s\n\rCapacity: %lld sectors\n\r",
+               "Firmware version: %s\n\rCapacity: " LBAFU " sectors\n\r",
                pdev->product, pdev->vendor, pdev->revision, pdev->lba);
-#else
-       printf("S/N: %s\n\rProduct model number: %s\n\r"
-               "Firmware version: %s\n\rCapacity: %ld sectors\n\r",
-               pdev->product, pdev->vendor, pdev->revision, pdev->lba);
-#endif
 }
 
 static void dwc_ahsata_identify(struct ahci_uc_priv *uc_priv, u16 *id)
@@ -754,7 +749,6 @@ static int dwc_ahsata_scan_common(struct ahci_uc_priv *uc_priv,
        u8 serial[ATA_ID_SERNO_LEN + 1] = { 0 };
        u8 firmware[ATA_ID_FW_REV_LEN + 1] = { 0 };
        u8 product[ATA_ID_PROD_LEN + 1] = { 0 };
-       u64 n_sectors;
        u8 port = uc_priv->hard_port_no;
        ALLOC_CACHE_ALIGN_BUFFER(u16, id, ATA_ID_WORDS);
 
@@ -773,9 +767,8 @@ static int dwc_ahsata_scan_common(struct ahci_uc_priv *uc_priv,
        ata_id_c_string(id, product, ATA_ID_PROD, sizeof(product));
        memcpy(pdev->vendor, product, sizeof(product));
 
-       /* Totoal sectors */
-       n_sectors = ata_id_n_sectors(id);
-       pdev->lba = (u32)n_sectors;
+       /* Total sectors */
+       pdev->lba = ata_id_n_sectors(id);
 
        pdev->type = DEV_TYPE_HARDDISK;
        pdev->blksz = ATA_SECT_SIZE;
@@ -1028,6 +1021,9 @@ int dwc_ahsata_probe(struct udevice *dev)
        struct ahci_uc_priv *uc_priv = dev_get_uclass_priv(dev);
        int ret;
 
+#if defined(CONFIG_MX6)
+       setup_sata();
+#endif
        uc_priv->host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
                        ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | ATA_FLAG_NO_ATAPI;
        uc_priv->mmio_base = (void __iomem *)dev_read_addr(dev);
@@ -1075,4 +1071,24 @@ U_BOOT_DRIVER(dwc_ahsata_blk) = {
        .ops            = &dwc_ahsata_blk_ops,
 };
 
+#if CONFIG_IS_ENABLED(DWC_AHSATA_AHCI)
+struct ahci_ops dwc_ahsata_ahci_ops = {
+       .port_status = dwc_ahsata_port_status,
+       .reset       = dwc_ahsata_bus_reset,
+       .scan        = dwc_ahsata_scan,
+};
+
+static const struct udevice_id dwc_ahsata_ahci_ids[] = {
+       { .compatible = "fsl,imx6q-ahci" },
+       { }
+};
+
+U_BOOT_DRIVER(dwc_ahsata_ahci) = {
+       .name     = "dwc_ahsata_ahci",
+       .id       = UCLASS_AHCI,
+       .of_match = dwc_ahsata_ahci_ids,
+       .ops      = &dwc_ahsata_ahci_ops,
+       .probe    = dwc_ahsata_probe,
+};
+#endif
 #endif
index a168196fd4d2868f71986472e3cfec770da3df51..2a630d46c142f97da1c3a8ff4f5c3a62512cf5ba 100644 (file)
@@ -3,7 +3,7 @@
  * Copyright (C) Excito Elektronik i SkÃ¥ne AB, 2010.
  * Author: Tor Krill <tor@excito.com>
  *
- * Copyright (C) 2015 Stefan Roese <sr@denx.de>
+ * Copyright (C) 2015, 2019 Stefan Roese <sr@denx.de>
  */
 
 /*
  */
 
 #include <common.h>
+#include <ahci.h>
+#include <dm.h>
+#include <dm/device-internal.h>
+#include <dm/lists.h>
 #include <fis.h>
 #include <libata.h>
 #include <malloc.h>
 #include <asm/io.h>
 #include <linux/mbus.h>
 
+#include <asm/arch/soc.h>
 #if defined(CONFIG_KIRKWOOD)
-#include <asm/arch/kirkwood.h>
 #define SATAHC_BASE            KW_SATA_BASE
 #else
-#include <asm/arch/soc.h>
 #define SATAHC_BASE            MVEBU_AXP_SATA_BASE
 #endif
 
@@ -214,8 +217,8 @@ struct crqb {
 #define CRQB_SECTCOUNT_COUNT_EXP_MASK  (0xff << 8)
 #define CRQB_SECTCOUNT_COUNT_EXP_SHIFT 8
 
-#define MVSATA_WIN_CONTROL(w)  (MVEBU_AXP_SATA_BASE + 0x30 + ((w) << 4))
-#define MVSATA_WIN_BASE(w)     (MVEBU_AXP_SATA_BASE + 0x34 + ((w) << 4))
+#define MVSATA_WIN_CONTROL(w)  (SATAHC_BASE + 0x30 + ((w) << 4))
+#define MVSATA_WIN_BASE(w)     (SATAHC_BASE + 0x34 + ((w) << 4))
 
 struct eprd {
        u32 phyaddr_low;
@@ -256,6 +259,7 @@ struct mv_priv {
        u16 pio;
        u16 mwdma;
        u16 udma;
+       int dev_nr;
 
        void *crqb_alloc;
        struct crqb *request;
@@ -278,9 +282,9 @@ static int ata_wait_register(u32 *addr, u32 mask, u32 val, u32 timeout_msec)
 }
 
 /* Cut from sata_mv in linux kernel */
-static int mv_stop_edma_engine(int port)
+static int mv_stop_edma_engine(struct udevice *dev, int port)
 {
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[port].priv;
+       struct mv_priv *priv = dev_get_platdata(dev);
        int i;
 
        /* Disable eDMA. The disable bit auto clears. */
@@ -299,9 +303,9 @@ static int mv_stop_edma_engine(int port)
        return -1;
 }
 
-static int mv_start_edma_engine(int port)
+static int mv_start_edma_engine(struct udevice *dev, int port)
 {
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[port].priv;
+       struct mv_priv *priv = dev_get_platdata(dev);
        u32 tmp;
 
        /* Check preconditions */
@@ -351,12 +355,12 @@ static int mv_start_edma_engine(int port)
        return 0;
 }
 
-static int mv_reset_channel(int port)
+static int mv_reset_channel(struct udevice *dev, int port)
 {
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[port].priv;
+       struct mv_priv *priv = dev_get_platdata(dev);
 
        /* Make sure edma is stopped  */
-       mv_stop_edma_engine(port);
+       mv_stop_edma_engine(dev, port);
 
        out_le32(priv->regbase + EDMA_CMD, EDMA_CMD_ATARST);
        udelay(25);             /* allow reset propagation */
@@ -366,11 +370,11 @@ static int mv_reset_channel(int port)
        return 0;
 }
 
-static void mv_reset_port(int port)
+static void mv_reset_port(struct udevice *dev, int port)
 {
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[port].priv;
+       struct mv_priv *priv = dev_get_platdata(dev);
 
-       mv_reset_channel(port);
+       mv_reset_channel(dev, port);
 
        out_le32(priv->regbase + EDMA_CMD, 0x0);
        out_le32(priv->regbase + EDMA_CFG, 0x101f);
@@ -392,9 +396,9 @@ static void mv_reset_one_hc(void)
        out_le32(SATAHC_BASE + SATAHC_ICR, 0x00);
 }
 
-static int probe_port(int port)
+static int probe_port(struct udevice *dev, int port)
 {
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[port].priv;
+       struct mv_priv *priv = dev_get_platdata(dev);
        int tries, tries2, set15 = 0;
        u32 tmp;
 
@@ -446,7 +450,7 @@ static int probe_port(int port)
                        tmp &= ~SIR_CFG_GEN2EN;
                        out_le32(priv->regbase + SIR_ICFG, tmp);
 
-                       mv_reset_channel(port);
+                       mv_reset_channel(dev, port);
                }
        }
 
@@ -455,9 +459,9 @@ static int probe_port(int port)
 }
 
 /* Get request queue in pointer */
-static int get_reqip(int port)
+static int get_reqip(struct udevice *dev, int port)
 {
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[port].priv;
+       struct mv_priv *priv = dev_get_platdata(dev);
        u32 tmp;
 
        tmp = in_le32(priv->regbase + EDMA_RQIPR) & EDMA_RQIPR_IPMASK;
@@ -466,9 +470,9 @@ static int get_reqip(int port)
        return tmp;
 }
 
-static void set_reqip(int port, int reqin)
+static void set_reqip(struct udevice *dev, int port, int reqin)
 {
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[port].priv;
+       struct mv_priv *priv = dev_get_platdata(dev);
        u32 tmp;
 
        tmp = in_le32(priv->regbase + EDMA_RQIPR) & ~EDMA_RQIPR_IPMASK;
@@ -477,17 +481,17 @@ static void set_reqip(int port, int reqin)
 }
 
 /* Get next available slot, ignoring possible overwrite */
-static int get_next_reqip(int port)
+static int get_next_reqip(struct udevice *dev, int port)
 {
-       int slot = get_reqip(port);
+       int slot = get_reqip(dev, port);
        slot = (slot + 1) % REQUEST_QUEUE_SIZE;
        return slot;
 }
 
 /* Get response queue in pointer */
-static int get_rspip(int port)
+static int get_rspip(struct udevice *dev, int port)
 {
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[port].priv;
+       struct mv_priv *priv = dev_get_platdata(dev);
        u32 tmp;
 
        tmp = in_le32(priv->regbase + EDMA_RSIPR) & EDMA_RSIPR_IPMASK;
@@ -497,9 +501,9 @@ static int get_rspip(int port)
 }
 
 /* Get response queue out pointer */
-static int get_rspop(int port)
+static int get_rspop(struct udevice *dev, int port)
 {
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[port].priv;
+       struct mv_priv *priv = dev_get_platdata(dev);
        u32 tmp;
 
        tmp = in_le32(priv->regbase + EDMA_RSOPR) & EDMA_RSOPR_OPMASK;
@@ -508,15 +512,15 @@ static int get_rspop(int port)
 }
 
 /* Get next response queue pointer  */
-static int get_next_rspop(int port)
+static int get_next_rspop(struct udevice *dev, int port)
 {
-       return (get_rspop(port) + 1) % RESPONSE_QUEUE_SIZE;
+       return (get_rspop(dev, port) + 1) % RESPONSE_QUEUE_SIZE;
 }
 
 /* Set response queue pointer */
-static void set_rspop(int port, int reqin)
+static void set_rspop(struct udevice *dev, int port, int reqin)
 {
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[port].priv;
+       struct mv_priv *priv = dev_get_platdata(dev);
        u32 tmp;
 
        tmp = in_le32(priv->regbase + EDMA_RSOPR) & ~EDMA_RSOPR_OPMASK;
@@ -525,7 +529,8 @@ static void set_rspop(int port, int reqin)
        out_le32(priv->regbase + EDMA_RSOPR, tmp);
 }
 
-static int wait_dma_completion(int port, int index, u32 timeout_msec)
+static int wait_dma_completion(struct udevice *dev, int port, int index,
+                              u32 timeout_msec)
 {
        u32 tmp, res;
 
@@ -538,13 +543,13 @@ static int wait_dma_completion(int port, int index, u32 timeout_msec)
        return res;
 }
 
-static void process_responses(int port)
+static void process_responses(struct udevice *dev, int port)
 {
 #ifdef DEBUG
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[port].priv;
+       struct mv_priv *priv = dev_get_platdata(dev);
 #endif
        u32 tmp;
-       u32 outind = get_rspop(port);
+       u32 outind = get_rspop(dev, port);
 
        /* Ack interrupts */
        tmp = in_le32(SATAHC_BASE + SATAHC_ICR);
@@ -555,20 +560,21 @@ static void process_responses(int port)
        tmp &= ~(BIT(4));
        out_le32(SATAHC_BASE + SATAHC_ICR, tmp);
 
-       while (get_rspip(port) != outind) {
+       while (get_rspip(dev, port) != outind) {
 #ifdef DEBUG
                debug("Response index %d flags %08x on port %d\n", outind,
                      priv->response[outind].flags, port);
 #endif
-               outind = get_next_rspop(port);
-               set_rspop(port, outind);
+               outind = get_next_rspop(dev, port);
+               set_rspop(dev, port, outind);
        }
 }
 
-static int mv_ata_exec_ata_cmd(int port, struct sata_fis_h2d *cfis,
+static int mv_ata_exec_ata_cmd(struct udevice *dev, int port,
+                              struct sata_fis_h2d *cfis,
                               u8 *buffer, u32 len, u32 iswrite)
 {
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[port].priv;
+       struct mv_priv *priv = dev_get_platdata(dev);
        struct crqb *req;
        int slot;
        u32 start;
@@ -579,7 +585,7 @@ static int mv_ata_exec_ata_cmd(int port, struct sata_fis_h2d *cfis,
        }
 
        /* Initialize request */
-       slot = get_reqip(port);
+       slot = get_reqip(dev, port);
        memset(&priv->request[slot], 0, sizeof(struct crqb));
        req = &priv->request[slot];
 
@@ -633,16 +639,16 @@ static int mv_ata_exec_ata_cmd(int port, struct sata_fis_h2d *cfis,
                           start + ALIGN(sizeof(*req), ARCH_DMA_MINALIGN));
 
        /* Trigger operation */
-       slot = get_next_reqip(port);
-       set_reqip(port, slot);
+       slot = get_next_reqip(dev, port);
+       set_reqip(dev, port, slot);
 
        /* Wait for completion */
-       if (wait_dma_completion(port, slot, 10000)) {
+       if (wait_dma_completion(dev, port, slot, 10000)) {
                printf("ATA operation timed out\n");
                return -1;
        }
 
-       process_responses(port);
+       process_responses(dev, port);
 
        /* Invalidate data on read */
        if (buffer && len) {
@@ -654,7 +660,8 @@ static int mv_ata_exec_ata_cmd(int port, struct sata_fis_h2d *cfis,
        return len;
 }
 
-static u32 mv_sata_rw_cmd_ext(int port, lbaint_t start, u32 blkcnt,
+static u32 mv_sata_rw_cmd_ext(struct udevice *dev, int port, lbaint_t start,
+                             u32 blkcnt,
                              u8 *buffer, int is_write)
 {
        struct sata_fis_h2d cfis;
@@ -678,14 +685,14 @@ static u32 mv_sata_rw_cmd_ext(int port, lbaint_t start, u32 blkcnt,
        cfis.sector_count_exp = (blkcnt >> 8) & 0xff;
        cfis.sector_count = blkcnt & 0xff;
 
-       res = mv_ata_exec_ata_cmd(port, &cfis, buffer, ATA_SECT_SIZE * blkcnt,
-                                 is_write);
+       res = mv_ata_exec_ata_cmd(dev, port, &cfis, buffer,
+                                 ATA_SECT_SIZE * blkcnt, is_write);
 
        return res >= 0 ? blkcnt : res;
 }
 
-static u32 mv_sata_rw_cmd(int port, lbaint_t start, u32 blkcnt, u8 *buffer,
-                         int is_write)
+static u32 mv_sata_rw_cmd(struct udevice *dev, int port, lbaint_t start,
+                         u32 blkcnt, u8 *buffer, int is_write)
 {
        struct sata_fis_h2d cfis;
        lbaint_t block;
@@ -705,20 +712,21 @@ static u32 mv_sata_rw_cmd(int port, lbaint_t start, u32 blkcnt, u8 *buffer,
        cfis.lba_low = block & 0xff;
        cfis.sector_count = (u8)(blkcnt & 0xff);
 
-       res = mv_ata_exec_ata_cmd(port, &cfis, buffer, ATA_SECT_SIZE * blkcnt,
-                                 is_write);
+       res = mv_ata_exec_ata_cmd(dev, port, &cfis, buffer,
+                                 ATA_SECT_SIZE * blkcnt, is_write);
 
        return res >= 0 ? blkcnt : res;
 }
 
-static u32 ata_low_level_rw(int dev, lbaint_t blknr, lbaint_t blkcnt,
-                           void *buffer, int is_write)
+static u32 ata_low_level_rw(struct udevice *dev, int port, lbaint_t blknr,
+                           lbaint_t blkcnt, void *buffer, int is_write)
 {
+       struct blk_desc *desc = dev_get_uclass_platdata(dev);
        lbaint_t start, blks;
        u8 *addr;
        int max_blks;
 
-       debug("%s: %ld %ld\n", __func__, blknr, blkcnt);
+       debug("%s: " LBAFU " " LBAFU "\n", __func__, blknr, blkcnt);
 
        start = blknr;
        blks = blkcnt;
@@ -727,22 +735,22 @@ static u32 ata_low_level_rw(int dev, lbaint_t blknr, lbaint_t blkcnt,
        max_blks = MV_ATA_MAX_SECTORS;
        do {
                if (blks > max_blks) {
-                       if (sata_dev_desc[dev].lba48) {
-                               mv_sata_rw_cmd_ext(dev, start, max_blks, addr,
-                                                  is_write);
+                       if (desc->lba48) {
+                               mv_sata_rw_cmd_ext(dev, port, start, max_blks,
+                                                  addr, is_write);
                        } else {
-                               mv_sata_rw_cmd(dev, start, max_blks, addr,
-                                              is_write);
+                               mv_sata_rw_cmd(dev, port, start, max_blks,
+                                              addr, is_write);
                        }
                        start += max_blks;
                        blks -= max_blks;
                        addr += ATA_SECT_SIZE * max_blks;
                } else {
-                       if (sata_dev_desc[dev].lba48) {
-                               mv_sata_rw_cmd_ext(dev, start, blks, addr,
+                       if (desc->lba48) {
+                               mv_sata_rw_cmd_ext(dev, port, start, blks, addr,
                                                   is_write);
                        } else {
-                               mv_sata_rw_cmd(dev, start, blks, addr,
+                               mv_sata_rw_cmd(dev, port, start, blks, addr,
                                               is_write);
                        }
                        start += blks;
@@ -754,11 +762,11 @@ static u32 ata_low_level_rw(int dev, lbaint_t blknr, lbaint_t blkcnt,
        return blkcnt;
 }
 
-static int mv_ata_exec_ata_cmd_nondma(int port,
+static int mv_ata_exec_ata_cmd_nondma(struct udevice *dev, int port,
                                      struct sata_fis_h2d *cfis, u8 *buffer,
                                      u32 len, u32 iswrite)
 {
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[port].priv;
+       struct mv_priv *priv = dev_get_platdata(dev);
        int i;
        u16 *tp;
 
@@ -791,7 +799,7 @@ static int mv_ata_exec_ata_cmd_nondma(int port,
        return len;
 }
 
-static int mv_sata_identify(int port, u16 *id)
+static int mv_sata_identify(struct udevice *dev, int port, u16 *id)
 {
        struct sata_fis_h2d h2d;
 
@@ -803,13 +811,13 @@ static int mv_sata_identify(int port, u16 *id)
        /* Give device time to get operational */
        mdelay(10);
 
-       return mv_ata_exec_ata_cmd_nondma(port, &h2d, (u8 *)id,
+       return mv_ata_exec_ata_cmd_nondma(dev, port, &h2d, (u8 *)id,
                                          ATA_ID_WORDS * 2, READ_CMD);
 }
 
-static void mv_sata_xfer_mode(int port, u16 *id)
+static void mv_sata_xfer_mode(struct udevice *dev, int port, u16 *id)
 {
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[port].priv;
+       struct mv_priv *priv = dev_get_platdata(dev);
 
        priv->pio = id[ATA_ID_PIO_MODES];
        priv->mwdma = id[ATA_ID_MWDMA_MODES];
@@ -818,9 +826,9 @@ static void mv_sata_xfer_mode(int port, u16 *id)
              priv->udma);
 }
 
-static void mv_sata_set_features(int port)
+static void mv_sata_set_features(struct udevice *dev, int port)
 {
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[port].priv;
+       struct mv_priv *priv = dev_get_platdata(dev);
        struct sata_fis_h2d cfis;
        u8 udma_cap;
 
@@ -842,53 +850,7 @@ static void mv_sata_set_features(int port)
        if (udma_cap == ATA_UDMA3)
                cfis.sector_count = XFER_UDMA_3;
 
-       mv_ata_exec_ata_cmd_nondma(port, &cfis, NULL, 0, READ_CMD);
-}
-
-int mv_sata_spin_down(int dev)
-{
-       struct sata_fis_h2d cfis;
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[dev].priv;
-
-       if (priv->link == 0) {
-               debug("No device on port: %d\n", dev);
-               return 1;
-       }
-
-       memset(&cfis, 0, sizeof(struct sata_fis_h2d));
-
-       cfis.fis_type = SATA_FIS_TYPE_REGISTER_H2D;
-       cfis.command = ATA_CMD_STANDBY;
-
-       return mv_ata_exec_ata_cmd_nondma(dev, &cfis, NULL, 0, READ_CMD);
-}
-
-int mv_sata_spin_up(int dev)
-{
-       struct sata_fis_h2d cfis;
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[dev].priv;
-
-       if (priv->link == 0) {
-               debug("No device on port: %d\n", dev);
-               return 1;
-       }
-
-       memset(&cfis, 0, sizeof(struct sata_fis_h2d));
-
-       cfis.fis_type = SATA_FIS_TYPE_REGISTER_H2D;
-       cfis.command = ATA_CMD_IDLE;
-
-       return mv_ata_exec_ata_cmd_nondma(dev, &cfis, NULL, 0, READ_CMD);
-}
-
-ulong sata_read(int dev, ulong blknr, lbaint_t blkcnt, void *buffer)
-{
-       return ata_low_level_rw(dev, blknr, blkcnt, buffer, READ_CMD);
-}
-
-ulong sata_write(int dev, ulong blknr, lbaint_t blkcnt, const void *buffer)
-{
-       return ata_low_level_rw(dev, blknr, blkcnt, (void *)buffer, WRITE_CMD);
+       mv_ata_exec_ata_cmd_nondma(dev, port, &cfis, NULL, 0, READ_CMD);
 }
 
 /*
@@ -916,25 +878,17 @@ static void mvsata_ide_conf_mbus_windows(void)
        }
 }
 
-int init_sata(int dev)
+static int sata_mv_init_sata(struct udevice *dev, int port)
 {
-       struct mv_priv *priv;
+       struct mv_priv *priv = dev_get_platdata(dev);
 
-       debug("Initialize sata dev: %d\n", dev);
+       debug("Initialize sata dev: %d\n", port);
 
-       if (dev < 0 || dev >= CONFIG_SYS_SATA_MAX_DEVICE) {
-               printf("Invalid sata device %d\n", dev);
+       if (port < 0 || port >= CONFIG_SYS_SATA_MAX_DEVICE) {
+               printf("Invalid sata device %d\n", port);
                return -1;
        }
 
-       priv = (struct mv_priv *)malloc(sizeof(struct mv_priv));
-       if (!priv) {
-               printf("Failed to allocate memory for private sata data\n");
-               return -ENOMEM;
-       }
-
-       memset((void *)priv, 0, sizeof(struct mv_priv));
-
        /* Allocate and align request buffer */
        priv->crqb_alloc = malloc(sizeof(struct crqb) * REQUEST_QUEUE_SIZE +
                                  CRQB_ALIGN);
@@ -959,11 +913,9 @@ int init_sata(int dev)
        priv->response = (struct crpb *)(((u32) priv->crpb_alloc + CRPB_ALIGN) &
                                         ~(CRPB_ALIGN - 1));
 
-       sata_dev_desc[dev].priv = (void *)priv;
-
-       sprintf(priv->name, "SATA%d", dev);
+       sprintf(priv->name, "SATA%d", port);
 
-       priv->regbase = dev == 0 ? SATA0_BASE : SATA1_BASE;
+       priv->regbase = port == 0 ? SATA0_BASE : SATA1_BASE;
 
        if (!hw_init) {
                debug("Initialize sata hw\n");
@@ -972,9 +924,9 @@ int init_sata(int dev)
                mvsata_ide_conf_mbus_windows();
        }
 
-       mv_reset_port(dev);
+       mv_reset_port(dev, port);
 
-       if (probe_port(dev)) {
+       if (probe_port(dev, port)) {
                priv->link = 0;
                return -ENODEV;
        }
@@ -983,19 +935,15 @@ int init_sata(int dev)
        return 0;
 }
 
-int reset_sata(int dev)
-{
-       return 0;
-}
-
-int scan_sata(int port)
+static int sata_mv_scan_sata(struct udevice *dev, int port)
 {
+       struct blk_desc *desc = dev_get_uclass_platdata(dev);
+       struct mv_priv *priv = dev_get_platdata(dev);
        unsigned char serial[ATA_ID_SERNO_LEN + 1];
        unsigned char firmware[ATA_ID_FW_REV_LEN + 1];
        unsigned char product[ATA_ID_PROD_LEN + 1];
        u64 n_sectors;
        u16 *id;
-       struct mv_priv *priv = (struct mv_priv *)sata_dev_desc[port].priv;
 
        if (!priv->link)
                return -ENODEV;
@@ -1006,7 +954,7 @@ int scan_sata(int port)
                return -ENOMEM;
        }
 
-       mv_sata_identify(port, id);
+       mv_sata_identify(dev, port, id);
        ata_swap_buf_le16(id, ATA_ID_WORDS);
 #ifdef DEBUG
        ata_dump_id(id);
@@ -1014,23 +962,23 @@ int scan_sata(int port)
 
        /* Serial number */
        ata_id_c_string(id, serial, ATA_ID_SERNO, sizeof(serial));
-       memcpy(sata_dev_desc[port].product, serial, sizeof(serial));
+       memcpy(desc->product, serial, sizeof(serial));
 
        /* Firmware version */
        ata_id_c_string(id, firmware, ATA_ID_FW_REV, sizeof(firmware));
-       memcpy(sata_dev_desc[port].revision, firmware, sizeof(firmware));
+       memcpy(desc->revision, firmware, sizeof(firmware));
 
        /* Product model */
        ata_id_c_string(id, product, ATA_ID_PROD, sizeof(product));
-       memcpy(sata_dev_desc[port].vendor, product, sizeof(product));
+       memcpy(desc->vendor, product, sizeof(product));
 
        /* Total sectors */
        n_sectors = ata_id_n_sectors(id);
-       sata_dev_desc[port].lba = n_sectors;
+       desc->lba = n_sectors;
 
        /* Check if support LBA48 */
        if (ata_id_has_lba48(id)) {
-               sata_dev_desc[port].lba48 = 1;
+               desc->lba48 = 1;
                debug("Device support LBA48\n");
        }
 
@@ -1038,13 +986,111 @@ int scan_sata(int port)
        priv->queue_depth = ata_id_queue_depth(id);
 
        /* Get the xfer mode from device */
-       mv_sata_xfer_mode(port, id);
+       mv_sata_xfer_mode(dev, port, id);
 
        /* Set the xfer mode to highest speed */
-       mv_sata_set_features(port);
+       mv_sata_set_features(dev, port);
 
        /* Start up */
-       mv_start_edma_engine(port);
+       mv_start_edma_engine(dev, port);
+
+       return 0;
+}
+
+static ulong sata_mv_read(struct udevice *blk, lbaint_t blknr,
+                         lbaint_t blkcnt, void *buffer)
+{
+       struct mv_priv *priv = dev_get_platdata(blk);
+
+       return ata_low_level_rw(blk, priv->dev_nr, blknr, blkcnt,
+                               buffer, READ_CMD);
+}
+
+static ulong sata_mv_write(struct udevice *blk, lbaint_t blknr,
+                          lbaint_t blkcnt, const void *buffer)
+{
+       struct mv_priv *priv = dev_get_platdata(blk);
+
+       return ata_low_level_rw(blk, priv->dev_nr, blknr, blkcnt,
+                               (void *)buffer, WRITE_CMD);
+}
+
+static const struct blk_ops sata_mv_blk_ops = {
+       .read   = sata_mv_read,
+       .write  = sata_mv_write,
+};
+
+U_BOOT_DRIVER(sata_mv_driver) = {
+       .name = "sata_mv_blk",
+       .id = UCLASS_BLK,
+       .ops = &sata_mv_blk_ops,
+       .platdata_auto_alloc_size = sizeof(struct mv_priv),
+};
+
+static int sata_mv_probe(struct udevice *dev)
+{
+       const void *blob = gd->fdt_blob;
+       int node = dev_of_offset(dev);
+       struct mv_priv *priv;
+       struct udevice *blk;
+       int nr_ports;
+       int ret;
+       int i;
+
+       /* Get number of ports of this SATA controller */
+       nr_ports = min(fdtdec_get_int(blob, node, "nr-ports", -1),
+                      CONFIG_SYS_SATA_MAX_DEVICE);
+
+       for (i = 0; i < nr_ports; i++) {
+               ret = blk_create_devicef(dev, "sata_mv_blk", "blk",
+                                        IF_TYPE_SATA, -1, 512, 0, &blk);
+               if (ret) {
+                       debug("Can't create device\n");
+                       return ret;
+               }
+
+               priv = dev_get_platdata(blk);
+               priv->dev_nr = i;
+
+               /* Init SATA port */
+               ret = sata_mv_init_sata(blk, i);
+               if (ret) {
+                       debug("%s: Failed to init bus\n", __func__);
+                       return ret;
+               }
+
+               /* Scan SATA port */
+               ret = sata_mv_scan_sata(blk, i);
+               if (ret) {
+                       debug("%s: Failed to scan bus\n", __func__);
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
+static int sata_mv_scan(struct udevice *dev)
+{
+       /* Nothing to do here */
 
        return 0;
 }
+
+static const struct udevice_id sata_mv_ids[] = {
+       { .compatible = "marvell,armada-370-sata" },
+       { .compatible = "marvell,orion-sata" },
+       { }
+};
+
+struct ahci_ops sata_mv_ahci_ops = {
+       .scan = sata_mv_scan,
+};
+
+U_BOOT_DRIVER(sata_mv_ahci) = {
+       .name = "sata_mv_ahci",
+       .id = UCLASS_AHCI,
+       .of_match = sata_mv_ids,
+       .ops = &sata_mv_ahci_ops,
+       .probe = sata_mv_probe,
+};
index 612a1718dcb5c9667a598ff2332b2b5f479e7585..179869df45f7b1407633361af964de8999f520ab 100644 (file)
@@ -254,7 +254,8 @@ static int socfpga_a10_clk_bind(struct udevice *dev)
                    fdt_node_check_compatible(fdt, offset, "fixed-clock"))
                        continue;
 
-               if (pre_reloc_only && !dm_fdt_pre_reloc(fdt, offset))
+               if (pre_reloc_only &&
+                   !dm_ofnode_pre_reloc(offset_to_ofnode(offset)))
                        continue;
 
                ret = device_bind_driver_to_node(dev, "clk-a10", name,
index 7cfbabc96d3482d46f1217bfda51dd601d1981f4..6b55ec59d6dfdd6456e26ddb3cd38ef8d6d8f861 100644 (file)
@@ -61,7 +61,7 @@ int at91_clk_sub_device_bind(struct udevice *dev, const char *drv_name)
             offset > 0;
             offset = fdt_next_subnode(fdt, offset)) {
                if (pre_reloc_only &&
-                   !dm_fdt_pre_reloc(fdt, offset))
+                   !dm_ofnode_pre_reloc(offset_to_ofnode(offset)))
                        continue;
                /*
                 * If this node has "compatible" property, this is not
index aebc6f0a34c400ceef4fecf8d9636e3fc18c4e63..24859fd054eec8812726eed3a98472fef97d9a1d 100644 (file)
 #include <dt-bindings/clock/stm32mp1-clks.h>
 #include <dt-bindings/clock/stm32mp1-clksrc.h>
 
+#ifndef CONFIG_STM32MP1_TRUSTED
 #if !defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD)
 /* activate clock tree initialization in the driver */
 #define STM32MP1_CLOCK_TREE_INIT
 #endif
+#endif
 
 #define MAX_HSI_HZ             64000000
 
index 482f0937cb5a94947e919dedcdca68a29638cac2..b09c37db40f1565ab95bdf3704b739ed6183180e 100644 (file)
@@ -434,6 +434,8 @@ static ulong zynq_clk_get_rate(struct clk *clk)
        case lqspi_clk ... pcap_clk:
        case sdio0_clk ... spi1_clk:
                return zynq_clk_get_peripheral_rate(priv, id, 0);
+       case i2c0_aper_clk ... i2c1_aper_clk:
+               return zynq_clk_get_cpu_rate(priv, cpu_1x_clk);
        default:
                return -ENXIO;
        }
index 0632dc87b6de04cf0ca4a7e04626aeaa917625d5..a47a5bdbc235883cd2af21d6683d5a7a478e55ec 100644 (file)
@@ -5,3 +5,4 @@ obj-$(CONFIG_ARCH_MEDIATEK) += clk-mtk.o
 # SoC Drivers
 obj-$(CONFIG_TARGET_MT7623) += clk-mt7623.o
 obj-$(CONFIG_TARGET_MT7629) += clk-mt7629.o
+obj-$(CONFIG_TARGET_MT8516) += clk-mt8516.o
diff --git a/drivers/clk/mediatek/clk-mt8516.c b/drivers/clk/mediatek/clk-mt8516.c
new file mode 100644 (file)
index 0000000..071bf69
--- /dev/null
@@ -0,0 +1,802 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * MediaTek clock driver for MT8516 SoC
+ *
+ * Copyright (C) 2018 BayLibre, SAS
+ * Author: Fabien Parent <fparent@baylibre.com>
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <asm/io.h>
+#include <dt-bindings/clock/mt8516-clk.h>
+
+#include "clk-mtk.h"
+
+#define MT8516_PLL_FMAX                (1502UL * MHZ)
+#define MT8516_CON0_RST_BAR    BIT(27)
+
+/* apmixedsys */
+#define PLL(_id, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, _pd_reg,  \
+           _pd_shift, _pcw_reg, _pcw_shift) {                          \
+               .id = _id,                                              \
+               .reg = _reg,                                            \
+               .pwr_reg = _pwr_reg,                                    \
+               .en_mask = _en_mask,                                    \
+               .rst_bar_mask = MT8516_CON0_RST_BAR,                    \
+               .fmax = MT8516_PLL_FMAX,                                \
+               .flags = _flags,                                        \
+               .pcwbits = _pcwbits,                                    \
+               .pd_reg = _pd_reg,                                      \
+               .pd_shift = _pd_shift,                                  \
+               .pcw_reg = _pcw_reg,                                    \
+               .pcw_shift = _pcw_shift,                                \
+       }
+
+static const struct mtk_pll_data apmixed_plls[] = {
+       PLL(CLK_APMIXED_ARMPLL, 0x0100, 0x0110, 0x00000001, 0,
+               21, 0x0104, 24, 0x0104, 0),
+       PLL(CLK_APMIXED_MAINPLL, 0x0120, 0x0130, 0x00000001,
+               HAVE_RST_BAR, 21, 0x0124, 24, 0x0124, 0),
+       PLL(CLK_APMIXED_UNIVPLL, 0x0140, 0x0150, 0x30000001,
+               HAVE_RST_BAR, 7, 0x0144, 24, 0x0144, 0),
+       PLL(CLK_APMIXED_MMPLL, 0x0160, 0x0170, 0x00000001, 0,
+               21, 0x0164, 24, 0x0164, 0),
+       PLL(CLK_APMIXED_APLL1, 0x0180, 0x0190, 0x00000001, 0,
+               31, 0x0180, 1, 0x0184, 0),
+       PLL(CLK_APMIXED_APLL2, 0x01A0, 0x01B0, 0x00000001, 0,
+               31, 0x01A0, 1, 0x01A4, 0),
+};
+
+/* topckgen */
+#define FACTOR0(_id, _parent, _mult, _div)     \
+       FACTOR(_id, _parent, _mult, _div, CLK_PARENT_APMIXED)
+
+#define FACTOR1(_id, _parent, _mult, _div)     \
+       FACTOR(_id, _parent, _mult, _div, CLK_PARENT_TOPCKGEN)
+
+#define FACTOR2(_id, _parent, _mult, _div)     \
+       FACTOR(_id, _parent, _mult, _div, 0)
+
+static const struct mtk_fixed_clk top_fixed_clks[] = {
+       FIXED_CLK(CLK_TOP_CLK_NULL, CLK_XTAL, 26000000),
+       FIXED_CLK(CLK_TOP_I2S_INFRA_BCK, CLK_TOP_CLK_NULL, 26000000),
+       FIXED_CLK(CLK_TOP_MEMPLL, CLK_TOP_CLK26M, 800000000),
+};
+
+static const struct mtk_fixed_factor top_fixed_divs[] = {
+       FACTOR1(CLK_TOP_DMPLL, CLK_TOP_MEMPLL, 1, 1),
+       FACTOR0(CLK_TOP_MAINPLL_D2, CLK_APMIXED_MAINPLL, 1, 2),
+       FACTOR0(CLK_TOP_MAINPLL_D4, CLK_APMIXED_MAINPLL, 1, 4),
+       FACTOR0(CLK_TOP_MAINPLL_D8, CLK_APMIXED_MAINPLL, 1, 8),
+       FACTOR0(CLK_TOP_MAINPLL_D16, CLK_APMIXED_MAINPLL, 1, 16),
+       FACTOR0(CLK_TOP_MAINPLL_D11, CLK_APMIXED_MAINPLL, 1, 11),
+       FACTOR0(CLK_TOP_MAINPLL_D22, CLK_APMIXED_MAINPLL, 1, 22),
+       FACTOR0(CLK_TOP_MAINPLL_D3, CLK_APMIXED_MAINPLL, 1, 3),
+       FACTOR0(CLK_TOP_MAINPLL_D6, CLK_APMIXED_MAINPLL, 1, 6),
+       FACTOR0(CLK_TOP_MAINPLL_D12, CLK_APMIXED_MAINPLL, 1, 12),
+       FACTOR0(CLK_TOP_MAINPLL_D5, CLK_APMIXED_MAINPLL, 1, 5),
+       FACTOR0(CLK_TOP_MAINPLL_D10, CLK_APMIXED_MAINPLL, 1, 10),
+       FACTOR0(CLK_TOP_MAINPLL_D20, CLK_APMIXED_MAINPLL, 1, 20),
+       FACTOR0(CLK_TOP_MAINPLL_D40, CLK_APMIXED_MAINPLL, 1, 40),
+       FACTOR0(CLK_TOP_MAINPLL_D7, CLK_APMIXED_MAINPLL, 1, 7),
+       FACTOR0(CLK_TOP_MAINPLL_D14, CLK_APMIXED_MAINPLL, 1, 14),
+       FACTOR0(CLK_TOP_UNIVPLL_D2, CLK_APMIXED_UNIVPLL, 1, 2),
+       FACTOR0(CLK_TOP_UNIVPLL_D4, CLK_APMIXED_UNIVPLL, 1, 4),
+       FACTOR0(CLK_TOP_UNIVPLL_D8, CLK_APMIXED_UNIVPLL, 1, 8),
+       FACTOR0(CLK_TOP_UNIVPLL_D16, CLK_APMIXED_UNIVPLL, 1, 16),
+       FACTOR0(CLK_TOP_UNIVPLL_D3, CLK_APMIXED_UNIVPLL, 1, 3),
+       FACTOR0(CLK_TOP_UNIVPLL_D6, CLK_APMIXED_UNIVPLL, 1, 6),
+       FACTOR0(CLK_TOP_UNIVPLL_D12, CLK_APMIXED_UNIVPLL, 1, 12),
+       FACTOR0(CLK_TOP_UNIVPLL_D24, CLK_APMIXED_UNIVPLL, 1, 24),
+       FACTOR0(CLK_TOP_UNIVPLL_D5, CLK_APMIXED_UNIVPLL, 1, 5),
+       FACTOR0(CLK_TOP_UNIVPLL_D20, CLK_APMIXED_UNIVPLL, 1, 20),
+       FACTOR0(CLK_TOP_MMPLL380M, CLK_APMIXED_MMPLL, 1, 1),
+       FACTOR0(CLK_TOP_MMPLL_D2, CLK_APMIXED_MMPLL, 1, 2),
+       FACTOR0(CLK_TOP_MMPLL_200M, CLK_APMIXED_MMPLL, 1, 3),
+       FACTOR0(CLK_TOP_USB_PHY48M, CLK_APMIXED_UNIVPLL, 1, 26),
+       FACTOR0(CLK_TOP_APLL1, CLK_APMIXED_APLL1, 1, 1),
+       FACTOR1(CLK_TOP_APLL1_D2, CLK_TOP_APLL1, 1, 2),
+       FACTOR1(CLK_TOP_APLL1_D4, CLK_TOP_RG_APLL1_D2_EN, 1, 2),
+       FACTOR1(CLK_TOP_APLL1_D8, CLK_TOP_RG_APLL1_D4_EN, 1, 2),
+       FACTOR0(CLK_TOP_APLL2, CLK_APMIXED_APLL2, 1, 1),
+       FACTOR1(CLK_TOP_APLL2_D2, CLK_TOP_APLL2, 1, 2),
+       FACTOR1(CLK_TOP_APLL2_D4, CLK_TOP_RG_APLL2_D2_EN, 1, 2),
+       FACTOR1(CLK_TOP_APLL2_D8, CLK_TOP_RG_APLL2_D4_EN, 1, 2),
+       FACTOR2(CLK_TOP_CLK26M, CLK_XTAL, 1, 1),
+       FACTOR2(CLK_TOP_CLK26M_D2, CLK_XTAL, 1, 2),
+       FACTOR1(CLK_TOP_AHB_INFRA_D2, CLK_TOP_AHB_INFRA_SEL, 1, 2),
+       FACTOR1(CLK_TOP_NFI1X, CLK_TOP_NFI2X_PAD_SEL, 1, 2),
+       FACTOR1(CLK_TOP_ETH_D2, CLK_TOP_ETH_SEL, 1, 2),
+};
+
+static const int uart0_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_UNIVPLL_D24,
+};
+
+static const int gfmux_emi1x_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_DMPLL,
+};
+
+static const int emi_ddrphy_parents[] = {
+       CLK_TOP_GFMUX_EMI1X_SEL,
+       CLK_TOP_GFMUX_EMI1X_SEL,
+};
+
+static const int ahb_infra_parents[] = {
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK26M,
+       CLK_TOP_MAINPLL_D11,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_MAINPLL_D12,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_MAINPLL_D10,
+};
+
+static const int csw_mux_mfg_parents[] = {
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_UNIVPLL_D3,
+       CLK_TOP_UNIVPLL_D2,
+       CLK_TOP_CLK26M,
+       CLK_TOP_MAINPLL_D4,
+       CLK_TOP_UNIVPLL_D24,
+       CLK_TOP_MMPLL380M,
+};
+
+static const int msdc0_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_UNIVPLL_D6,
+       CLK_TOP_MAINPLL_D8,
+       CLK_TOP_UNIVPLL_D8,
+       CLK_TOP_MAINPLL_D16,
+       CLK_TOP_MMPLL_200M,
+       CLK_TOP_MAINPLL_D12,
+       CLK_TOP_MMPLL_D2,
+};
+
+static const int pwm_mm_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_UNIVPLL_D12,
+};
+
+static const int uart1_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_UNIVPLL_D24,
+};
+
+static const int msdc1_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_UNIVPLL_D6,
+       CLK_TOP_MAINPLL_D8,
+       CLK_TOP_UNIVPLL_D8,
+       CLK_TOP_MAINPLL_D16,
+       CLK_TOP_MMPLL_200M,
+       CLK_TOP_MAINPLL_D12,
+       CLK_TOP_MMPLL_D2,
+};
+
+static const int spm_52m_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_UNIVPLL_D24,
+};
+
+static const int pmicspi_parents[] = {
+       CLK_TOP_UNIVPLL_D20,
+       CLK_TOP_USB_PHY48M,
+       CLK_TOP_UNIVPLL_D16,
+       CLK_TOP_CLK26M,
+};
+
+static const int qaxi_aud26m_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_AHB_INFRA_SEL,
+};
+
+static const int aud_intbus_parents[] = {
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK26M,
+       CLK_TOP_MAINPLL_D22,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_MAINPLL_D11,
+};
+
+static const int nfi2x_pad_parents[] = {
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK26M,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_MAINPLL_D12,
+       CLK_TOP_MAINPLL_D8,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_MAINPLL_D6,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_MAINPLL_D4,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_MAINPLL_D10,
+       CLK_TOP_MAINPLL_D7,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_MAINPLL_D5
+};
+
+static const int nfi1x_pad_parents[] = {
+       CLK_TOP_AHB_INFRA_SEL,
+       CLK_TOP_NFI1X,
+};
+
+static const int mfg_mm_parents[] = {
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CSW_MUX_MFG_SEL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_MAINPLL_D3,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_MAINPLL_D5,
+       CLK_TOP_MAINPLL_D7,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_MAINPLL_D14
+};
+
+static const int ddrphycfg_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_MAINPLL_D16
+};
+
+static const int usb_78m_parents[] = {
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK26M,
+       CLK_TOP_UNIVPLL_D16,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_MAINPLL_D20,
+};
+
+static const int spinor_parents[] = {
+       CLK_TOP_CLK26M_D2,
+       CLK_TOP_CLK26M,
+       CLK_TOP_MAINPLL_D40,
+       CLK_TOP_UNIVPLL_D24,
+       CLK_TOP_UNIVPLL_D20,
+       CLK_TOP_MAINPLL_D20,
+       CLK_TOP_MAINPLL_D16,
+       CLK_TOP_UNIVPLL_D12
+};
+
+static const int msdc2_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_UNIVPLL_D6,
+       CLK_TOP_MAINPLL_D8,
+       CLK_TOP_UNIVPLL_D8,
+       CLK_TOP_MAINPLL_D16,
+       CLK_TOP_MMPLL_200M,
+       CLK_TOP_MAINPLL_D12,
+       CLK_TOP_MMPLL_D2
+};
+
+static const int eth_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_MAINPLL_D40,
+       CLK_TOP_UNIVPLL_D24,
+       CLK_TOP_UNIVPLL_D20,
+       CLK_TOP_MAINPLL_D20
+};
+
+static const int axi_mfg_in_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_MAINPLL_D11,
+       CLK_TOP_UNIVPLL_D24,
+       CLK_TOP_MMPLL380M,
+};
+
+static const int slow_mfg_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_UNIVPLL_D12,
+       CLK_TOP_UNIVPLL_D24
+};
+
+static const int aud1_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_APLL1
+};
+
+static const int aud2_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_APLL2
+};
+
+static const int aud_engen1_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_RG_APLL1_D2_EN,
+       CLK_TOP_RG_APLL1_D4_EN,
+       CLK_TOP_RG_APLL1_D8_EN
+};
+
+static const int aud_engen2_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_RG_APLL2_D2_EN,
+       CLK_TOP_RG_APLL2_D4_EN,
+       CLK_TOP_RG_APLL2_D8_EN
+};
+
+static const int i2c_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_UNIVPLL_D20,
+       CLK_TOP_UNIVPLL_D16,
+       CLK_TOP_UNIVPLL_D12
+};
+
+static const int aud_i2s0_m_parents[] = {
+       CLK_TOP_RG_AUD1,
+       CLK_TOP_RG_AUD2
+};
+
+static const int pwm_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_UNIVPLL_D12
+};
+
+static const int spi_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_UNIVPLL_D12,
+       CLK_TOP_UNIVPLL_D8,
+       CLK_TOP_UNIVPLL_D6
+};
+
+static const int aud_spdifin_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_UNIVPLL_D2
+};
+
+static const int uart2_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_UNIVPLL_D24
+};
+
+static const int bsi_parents[] = {
+       CLK_TOP_CLK26M,
+       CLK_TOP_MAINPLL_D10,
+       CLK_TOP_MAINPLL_D12,
+       CLK_TOP_MAINPLL_D20
+};
+
+static const int dbg_atclk_parents[] = {
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CLK26M,
+       CLK_TOP_MAINPLL_D5,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_UNIVPLL_D5
+};
+
+static const int csw_nfiecc_parents[] = {
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_MAINPLL_D7,
+       CLK_TOP_MAINPLL_D6,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_MAINPLL_D5
+};
+
+static const int nfiecc_parents[] = {
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_NFI2X_PAD_SEL,
+       CLK_TOP_MAINPLL_D4,
+       CLK_TOP_CLK_NULL,
+       CLK_TOP_CSW_NFIECC_SEL,
+};
+
+static const struct mtk_composite top_muxes[] = {
+       /* CLK_MUX_SEL0 */
+       MUX(CLK_TOP_UART0_SEL, uart0_parents, 0x000, 0, 1),
+       MUX(CLK_TOP_GFMUX_EMI1X_SEL, gfmux_emi1x_parents, 0x000, 1, 1),
+       MUX(CLK_TOP_EMI_DDRPHY_SEL, emi_ddrphy_parents, 0x000, 2, 1),
+       MUX(CLK_TOP_AHB_INFRA_SEL, ahb_infra_parents, 0x000, 4, 4),
+       MUX(CLK_TOP_CSW_MUX_MFG_SEL, csw_mux_mfg_parents, 0x000, 8, 3),
+       MUX(CLK_TOP_MSDC0_SEL, msdc0_parents, 0x000, 11, 3),
+       MUX(CLK_TOP_PWM_MM_SEL, pwm_mm_parents, 0x000, 18, 1),
+       MUX(CLK_TOP_UART1_SEL, uart1_parents, 0x000, 19, 1),
+       MUX(CLK_TOP_MSDC1_SEL, msdc1_parents, 0x000, 20, 3),
+       MUX(CLK_TOP_SPM_52M_SEL, spm_52m_parents, 0x000, 23, 1),
+       MUX(CLK_TOP_PMICSPI_SEL, pmicspi_parents, 0x000, 24, 2),
+       MUX(CLK_TOP_QAXI_AUD26M_SEL, qaxi_aud26m_parents, 0x000, 26, 1),
+       MUX(CLK_TOP_AUD_INTBUS_SEL, aud_intbus_parents, 0x000, 27, 3),
+       /* CLK_MUX_SEL1 */
+       MUX(CLK_TOP_NFI2X_PAD_SEL, nfi2x_pad_parents, 0x004, 0, 7),
+       MUX(CLK_TOP_NFI1X_PAD_SEL, nfi1x_pad_parents, 0x004, 7, 1),
+       MUX(CLK_TOP_MFG_MM_SEL, mfg_mm_parents, 0x004, 8, 6),
+       MUX(CLK_TOP_DDRPHYCFG_SEL, ddrphycfg_parents, 0x004, 15, 1),
+       MUX(CLK_TOP_USB_78M_SEL, usb_78m_parents, 0x004, 20, 3),
+       /* CLK_MUX_SEL8 */
+       MUX(CLK_TOP_SPINOR_SEL, spinor_parents, 0x040, 0, 3),
+       MUX(CLK_TOP_MSDC2_SEL, msdc2_parents, 0x040, 3, 3),
+       MUX(CLK_TOP_ETH_SEL, eth_parents, 0x040, 6, 3),
+       MUX(CLK_TOP_AXI_MFG_IN_SEL, axi_mfg_in_parents, 0x040, 18, 2),
+       MUX(CLK_TOP_SLOW_MFG_SEL, slow_mfg_parents, 0x040, 20, 2),
+       MUX(CLK_TOP_AUD1_SEL, aud1_parents, 0x040, 22, 1),
+       MUX(CLK_TOP_AUD2_SEL, aud2_parents, 0x040, 23, 1),
+       MUX(CLK_TOP_AUD_ENGEN1_SEL, aud_engen1_parents, 0x040, 24, 2),
+       MUX(CLK_TOP_AUD_ENGEN2_SEL, aud_engen2_parents, 0x040, 26, 2),
+       MUX(CLK_TOP_I2C_SEL, i2c_parents, 0x040, 28, 2),
+       /* CLK_MUX_SEL9 */
+       MUX(CLK_TOP_AUD_I2S0_M_SEL, aud_i2s0_m_parents, 0x044, 12, 1),
+       MUX(CLK_TOP_AUD_I2S1_M_SEL, aud_i2s0_m_parents, 0x044, 13, 1),
+       MUX(CLK_TOP_AUD_I2S2_M_SEL, aud_i2s0_m_parents, 0x044, 14, 1),
+       MUX(CLK_TOP_AUD_I2S3_M_SEL, aud_i2s0_m_parents, 0x044, 15, 1),
+       MUX(CLK_TOP_AUD_I2S4_M_SEL, aud_i2s0_m_parents, 0x044, 16, 1),
+       MUX(CLK_TOP_AUD_I2S5_M_SEL, aud_i2s0_m_parents, 0x044, 17, 1),
+       MUX(CLK_TOP_AUD_SPDIF_B_SEL, aud_i2s0_m_parents, 0x044, 18, 1),
+       /* CLK_MUX_SEL13 */
+       MUX(CLK_TOP_PWM_SEL, pwm_parents, 0x07c, 0, 1),
+       MUX(CLK_TOP_SPI_SEL, spi_parents, 0x07c, 1, 2),
+       MUX(CLK_TOP_AUD_SPDIFIN_SEL, aud_spdifin_parents, 0x07c, 3, 1),
+       MUX(CLK_TOP_UART2_SEL, uart2_parents, 0x07c, 4, 1),
+       MUX(CLK_TOP_BSI_SEL, bsi_parents, 0x07c, 5, 2),
+       MUX(CLK_TOP_DBG_ATCLK_SEL, dbg_atclk_parents, 0x07c, 7, 3),
+       MUX(CLK_TOP_CSW_NFIECC_SEL, csw_nfiecc_parents, 0x07c, 10, 3),
+       MUX(CLK_TOP_NFIECC_SEL, nfiecc_parents, 0x07c, 13, 3),
+};
+
+static const struct mtk_gate_regs top0_cg_regs = {
+       .set_ofs = 0x50,
+       .clr_ofs = 0x80,
+       .sta_ofs = 0x20,
+};
+
+static const struct mtk_gate_regs top1_cg_regs = {
+       .set_ofs = 0x54,
+       .clr_ofs = 0x84,
+       .sta_ofs = 0x24,
+};
+
+static const struct mtk_gate_regs top2_cg_regs = {
+       .set_ofs = 0x6c,
+       .clr_ofs = 0x9c,
+       .sta_ofs = 0x3c,
+};
+
+static const struct mtk_gate_regs top3_cg_regs = {
+       .set_ofs = 0xa0,
+       .clr_ofs = 0xb0,
+       .sta_ofs = 0x70,
+};
+
+static const struct mtk_gate_regs top4_cg_regs = {
+       .set_ofs = 0xa4,
+       .clr_ofs = 0xb4,
+       .sta_ofs = 0x74,
+};
+
+static const struct mtk_gate_regs top5_cg_regs = {
+       .set_ofs = 0x44,
+       .clr_ofs = 0x44,
+       .sta_ofs = 0x44,
+};
+
+#define GATE_TOP0(_id, _parent, _shift) {                      \
+               .id = _id,                                      \
+               .parent = _parent,                              \
+               .regs = &top0_cg_regs,                          \
+               .shift = _shift,                                \
+               .flags = CLK_GATE_SETCLR | CLK_PARENT_TOPCKGEN, \
+       }
+
+#define GATE_TOP1(_id, _parent, _shift) {                      \
+               .id = _id,                                      \
+               .parent = _parent,                              \
+               .regs = &top1_cg_regs,                          \
+               .shift = _shift,                                \
+               .flags = CLK_GATE_SETCLR | CLK_PARENT_TOPCKGEN, \
+       }
+
+#define GATE_TOP2(_id, _parent, _shift) {                      \
+               .id = _id,                                      \
+               .parent = _parent,                              \
+               .regs = &top2_cg_regs,                          \
+               .shift = _shift,                                \
+               .flags = CLK_GATE_SETCLR | CLK_PARENT_TOPCKGEN, \
+       }
+
+#define GATE_TOP2_I(_id, _parent, _shift) {                            \
+               .id = _id,                                              \
+               .parent = _parent,                                      \
+               .regs = &top2_cg_regs,                                  \
+               .shift = _shift,                                        \
+               .flags = CLK_GATE_SETCLR_INV | CLK_PARENT_TOPCKGEN,     \
+       }
+
+#define GATE_TOP3(_id, _parent, _shift) {                      \
+               .id = _id,                                      \
+               .parent = _parent,                              \
+               .regs = &top3_cg_regs,                          \
+               .shift = _shift,                                \
+               .flags = CLK_GATE_SETCLR | CLK_PARENT_TOPCKGEN, \
+       }
+
+#define GATE_TOP4_I(_id, _parent, _shift) {                            \
+               .id = _id,                                              \
+               .parent = _parent,                                      \
+               .regs = &top4_cg_regs,                                  \
+               .shift = _shift,                                        \
+               .flags = CLK_GATE_SETCLR_INV | CLK_PARENT_TOPCKGEN,     \
+       }
+
+#define GATE_TOP5(_id, _parent, _shift) {                              \
+               .id = _id,                                              \
+               .parent = _parent,                                      \
+               .regs = &top5_cg_regs,                                  \
+               .shift = _shift,                                        \
+               .flags = CLK_GATE_NO_SETCLR | CLK_PARENT_TOPCKGEN,      \
+       }
+
+static const struct mtk_gate top_clks[] = {
+       /* TOP0 */
+       GATE_TOP0(CLK_TOP_PWM_MM, CLK_TOP_PWM_MM_SEL, 0),
+       GATE_TOP0(CLK_TOP_MFG_MM, CLK_TOP_MFG_MM_SEL, 2),
+       GATE_TOP0(CLK_TOP_SPM_52M, CLK_TOP_SPM_52M_SEL, 3),
+       /* TOP1 */
+       GATE_TOP1(CLK_TOP_THEM, CLK_TOP_AHB_INFRA_SEL, 1),
+       GATE_TOP1(CLK_TOP_APDMA, CLK_TOP_AHB_INFRA_SEL, 2),
+       GATE_TOP1(CLK_TOP_I2C0, CLK_IFR_I2C0_SEL, 3),
+       GATE_TOP1(CLK_TOP_I2C1, CLK_IFR_I2C1_SEL, 4),
+       GATE_TOP1(CLK_TOP_AUXADC1, CLK_TOP_AHB_INFRA_SEL, 5),
+       GATE_TOP1(CLK_TOP_NFI, CLK_TOP_NFI1X_PAD_SEL, 6),
+       GATE_TOP1(CLK_TOP_NFIECC, CLK_TOP_RG_NFIECC, 7),
+       GATE_TOP1(CLK_TOP_DEBUGSYS, CLK_TOP_RG_DBG_ATCLK, 8),
+       GATE_TOP1(CLK_TOP_PWM, CLK_TOP_AHB_INFRA_SEL, 9),
+       GATE_TOP1(CLK_TOP_UART0, CLK_TOP_UART0_SEL, 10),
+       GATE_TOP1(CLK_TOP_UART1, CLK_TOP_UART1_SEL, 11),
+       GATE_TOP1(CLK_TOP_BTIF, CLK_TOP_AHB_INFRA_SEL, 12),
+       GATE_TOP1(CLK_TOP_USB, CLK_TOP_USB_78M, 13),
+       GATE_TOP1(CLK_TOP_FLASHIF_26M, CLK_TOP_CLK26M, 14),
+       GATE_TOP1(CLK_TOP_AUXADC2, CLK_TOP_AHB_INFRA_SEL, 15),
+       GATE_TOP1(CLK_TOP_I2C2, CLK_IFR_I2C2_SEL, 16),
+       GATE_TOP1(CLK_TOP_MSDC0, CLK_TOP_MSDC0_SEL, 17),
+       GATE_TOP1(CLK_TOP_MSDC1, CLK_TOP_MSDC1_SEL, 18),
+       GATE_TOP1(CLK_TOP_NFI2X, CLK_TOP_NFI2X_PAD_SEL, 19),
+       GATE_TOP1(CLK_TOP_PMICWRAP_AP, CLK_TOP_CLK26M, 20),
+       GATE_TOP1(CLK_TOP_SEJ, CLK_TOP_AHB_INFRA_SEL, 21),
+       GATE_TOP1(CLK_TOP_MEMSLP_DLYER, CLK_TOP_CLK26M, 22),
+       GATE_TOP1(CLK_TOP_SPI, CLK_TOP_SPI_SEL, 23),
+       GATE_TOP1(CLK_TOP_APXGPT, CLK_TOP_CLK26M, 24),
+       GATE_TOP1(CLK_TOP_AUDIO, CLK_TOP_CLK26M, 25),
+       GATE_TOP1(CLK_TOP_PMICWRAP_MD, CLK_TOP_CLK26M, 27),
+       GATE_TOP1(CLK_TOP_PMICWRAP_CONN, CLK_TOP_CLK26M, 28),
+       GATE_TOP1(CLK_TOP_PMICWRAP_26M, CLK_TOP_CLK26M, 29),
+       GATE_TOP1(CLK_TOP_AUX_ADC, CLK_TOP_CLK26M, 30),
+       GATE_TOP1(CLK_TOP_AUX_TP, CLK_TOP_CLK26M, 31),
+       /* TOP2 */
+       GATE_TOP2(CLK_TOP_MSDC2, CLK_TOP_AHB_INFRA_SEL, 0),
+       GATE_TOP2(CLK_TOP_RBIST, CLK_TOP_UNIVPLL_D12, 1),
+       GATE_TOP2(CLK_TOP_NFI_BUS, CLK_TOP_AHB_INFRA_SEL, 2),
+       GATE_TOP2(CLK_TOP_GCE, CLK_TOP_AHB_INFRA_SEL, 4),
+       GATE_TOP2(CLK_TOP_TRNG, CLK_TOP_AHB_INFRA_SEL, 5),
+       GATE_TOP2(CLK_TOP_SEJ_13M, CLK_TOP_CLK26M, 6),
+       GATE_TOP2(CLK_TOP_AES, CLK_TOP_AHB_INFRA_SEL, 7),
+       GATE_TOP2(CLK_TOP_PWM_B, CLK_TOP_RG_PWM_INFRA, 8),
+       GATE_TOP2(CLK_TOP_PWM1_FB, CLK_TOP_RG_PWM_INFRA, 9),
+       GATE_TOP2(CLK_TOP_PWM2_FB, CLK_TOP_RG_PWM_INFRA, 10),
+       GATE_TOP2(CLK_TOP_PWM3_FB, CLK_TOP_RG_PWM_INFRA, 11),
+       GATE_TOP2(CLK_TOP_PWM4_FB, CLK_TOP_RG_PWM_INFRA, 12),
+       GATE_TOP2(CLK_TOP_PWM5_FB, CLK_TOP_RG_PWM_INFRA, 13),
+       GATE_TOP2(CLK_TOP_USB_1P, CLK_TOP_USB_78M, 14),
+       GATE_TOP2(CLK_TOP_FLASHIF_FREERUN, CLK_TOP_AHB_INFRA_SEL, 15),
+       GATE_TOP2(CLK_TOP_66M_ETH, CLK_TOP_AHB_INFRA_D2, 19),
+       GATE_TOP2(CLK_TOP_133M_ETH, CLK_TOP_AHB_INFRA_SEL, 20),
+       GATE_TOP2(CLK_TOP_FETH_25M, CLK_IFR_ETH_25M_SEL, 21),
+       GATE_TOP2(CLK_TOP_FETH_50M, CLK_TOP_RG_ETH, 22),
+       GATE_TOP2(CLK_TOP_FLASHIF_AXI, CLK_TOP_AHB_INFRA_SEL, 23),
+       GATE_TOP2(CLK_TOP_USBIF, CLK_TOP_AHB_INFRA_SEL, 24),
+       GATE_TOP2(CLK_TOP_UART2, CLK_TOP_RG_UART2, 25),
+       GATE_TOP2(CLK_TOP_BSI, CLK_TOP_AHB_INFRA_SEL, 26),
+       GATE_TOP2_I(CLK_TOP_MSDC0_INFRA, CLK_TOP_MSDC0, 28),
+       GATE_TOP2_I(CLK_TOP_MSDC1_INFRA, CLK_TOP_MSDC1, 29),
+       GATE_TOP2_I(CLK_TOP_MSDC2_INFRA, CLK_TOP_RG_MSDC2, 30),
+       GATE_TOP2(CLK_TOP_USB_78M, CLK_TOP_USB_78M_SEL, 31),
+       /* TOP3 */
+       GATE_TOP3(CLK_TOP_RG_SPINOR, CLK_TOP_SPINOR_SEL, 0),
+       GATE_TOP3(CLK_TOP_RG_MSDC2, CLK_TOP_MSDC2_SEL, 1),
+       GATE_TOP3(CLK_TOP_RG_ETH, CLK_TOP_ETH_SEL, 2),
+       GATE_TOP3(CLK_TOP_RG_AXI_MFG, CLK_TOP_AXI_MFG_IN_SEL, 6),
+       GATE_TOP3(CLK_TOP_RG_SLOW_MFG, CLK_TOP_SLOW_MFG_SEL, 7),
+       GATE_TOP3(CLK_TOP_RG_AUD1, CLK_TOP_AUD1_SEL, 8),
+       GATE_TOP3(CLK_TOP_RG_AUD2, CLK_TOP_AUD2_SEL, 9),
+       GATE_TOP3(CLK_TOP_RG_AUD_ENGEN1, CLK_TOP_AUD_ENGEN1_SEL, 10),
+       GATE_TOP3(CLK_TOP_RG_AUD_ENGEN2, CLK_TOP_AUD_ENGEN2_SEL, 11),
+       GATE_TOP3(CLK_TOP_RG_I2C, CLK_TOP_I2C_SEL, 12),
+       GATE_TOP3(CLK_TOP_RG_PWM_INFRA, CLK_TOP_PWM_SEL, 13),
+       GATE_TOP3(CLK_TOP_RG_AUD_SPDIF_IN, CLK_TOP_AUD_SPDIFIN_SEL, 14),
+       GATE_TOP3(CLK_TOP_RG_UART2, CLK_TOP_UART2_SEL, 15),
+       GATE_TOP3(CLK_TOP_RG_BSI, CLK_TOP_BSI_SEL, 16),
+       GATE_TOP3(CLK_TOP_RG_DBG_ATCLK, CLK_TOP_DBG_ATCLK_SEL, 17),
+       GATE_TOP3(CLK_TOP_RG_NFIECC, CLK_TOP_NFIECC_SEL, 18),
+       /* TOP4 */
+       GATE_TOP4_I(CLK_TOP_RG_APLL1_D2_EN, CLK_TOP_APLL1_D2, 8),
+       GATE_TOP4_I(CLK_TOP_RG_APLL1_D4_EN, CLK_TOP_APLL1_D4, 9),
+       GATE_TOP4_I(CLK_TOP_RG_APLL1_D8_EN, CLK_TOP_APLL1_D8, 10),
+       GATE_TOP4_I(CLK_TOP_RG_APLL2_D2_EN, CLK_TOP_APLL2_D2, 11),
+       GATE_TOP4_I(CLK_TOP_RG_APLL2_D4_EN, CLK_TOP_APLL2_D4, 12),
+       GATE_TOP4_I(CLK_TOP_RG_APLL2_D8_EN, CLK_TOP_APLL2_D8, 13),
+       /* TOP5 */
+       GATE_TOP5(CLK_TOP_APLL12_DIV0, CLK_TOP_APLL12_CK_DIV0, 0),
+       GATE_TOP5(CLK_TOP_APLL12_DIV1, CLK_TOP_APLL12_CK_DIV1, 1),
+       GATE_TOP5(CLK_TOP_APLL12_DIV2, CLK_TOP_APLL12_CK_DIV2, 2),
+       GATE_TOP5(CLK_TOP_APLL12_DIV3, CLK_TOP_APLL12_CK_DIV3, 3),
+       GATE_TOP5(CLK_TOP_APLL12_DIV4, CLK_TOP_APLL12_CK_DIV4, 4),
+       GATE_TOP5(CLK_TOP_APLL12_DIV4B, CLK_TOP_APLL12_CK_DIV4B, 5),
+       GATE_TOP5(CLK_TOP_APLL12_DIV5, CLK_TOP_APLL12_CK_DIV5, 6),
+       GATE_TOP5(CLK_TOP_APLL12_DIV5B, CLK_TOP_APLL12_CK_DIV5B, 7),
+       GATE_TOP5(CLK_TOP_APLL12_DIV6, CLK_TOP_APLL12_CK_DIV6, 8),
+};
+
+static const struct mtk_clk_tree mt8516_clk_tree = {
+       .xtal_rate = 26 * MHZ,
+       .xtal2_rate = 26 * MHZ,
+       .fdivs_offs = CLK_TOP_DMPLL,
+       .muxes_offs = CLK_TOP_UART0_SEL,
+       .plls = apmixed_plls,
+       .fclks = top_fixed_clks,
+       .fdivs = top_fixed_divs,
+       .muxes = top_muxes,
+};
+
+static int mt8516_apmixedsys_probe(struct udevice *dev)
+{
+       return mtk_common_clk_init(dev, &mt8516_clk_tree);
+}
+
+static int mt8516_topckgen_probe(struct udevice *dev)
+{
+       return mtk_common_clk_init(dev, &mt8516_clk_tree);
+}
+
+static int mt8516_topckgen_cg_probe(struct udevice *dev)
+{
+       return mtk_common_clk_gate_init(dev, &mt8516_clk_tree, top_clks);
+}
+
+static const struct udevice_id mt8516_apmixed_compat[] = {
+       { .compatible = "mediatek,mt8516-apmixedsys", },
+       { }
+};
+
+static const struct udevice_id mt8516_topckgen_compat[] = {
+       { .compatible = "mediatek,mt8516-topckgen", },
+       { }
+};
+
+static const struct udevice_id mt8516_topckgen_cg_compat[] = {
+       { .compatible = "mediatek,mt8516-topckgen-cg", },
+       { }
+};
+
+U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
+       .name = "mt8516-apmixedsys",
+       .id = UCLASS_CLK,
+       .of_match = mt8516_apmixed_compat,
+       .probe = mt8516_apmixedsys_probe,
+       .priv_auto_alloc_size = sizeof(struct mtk_clk_priv),
+       .ops = &mtk_clk_apmixedsys_ops,
+       .flags = DM_FLAG_PRE_RELOC,
+};
+
+U_BOOT_DRIVER(mtk_clk_topckgen) = {
+       .name = "mt8516-topckgen",
+       .id = UCLASS_CLK,
+       .of_match = mt8516_topckgen_compat,
+       .probe = mt8516_topckgen_probe,
+       .priv_auto_alloc_size = sizeof(struct mtk_clk_priv),
+       .ops = &mtk_clk_topckgen_ops,
+       .flags = DM_FLAG_PRE_RELOC,
+};
+
+U_BOOT_DRIVER(mtk_clk_topckgen_cg) = {
+       .name = "mt8516-topckgen-cg",
+       .id = UCLASS_CLK,
+       .of_match = mt8516_topckgen_cg_compat,
+       .probe = mt8516_topckgen_cg_probe,
+       .priv_auto_alloc_size = sizeof(struct mtk_cg_priv),
+       .ops = &mtk_clk_gate_ops,
+       .flags = DM_FLAG_PRE_RELOC,
+};
index 870b14ed8b260cfd59f3edf53b507437ccc35784..6c6b500d9b71156e977acc37413f7c22413764b4 100644 (file)
@@ -390,6 +390,12 @@ static int mtk_clk_gate_enable(struct clk *clk)
        case CLK_GATE_SETCLR:
                writel(bit, priv->base + gate->regs->clr_ofs);
                break;
+       case CLK_GATE_SETCLR_INV:
+               writel(bit, priv->base + gate->regs->set_ofs);
+               break;
+       case CLK_GATE_NO_SETCLR:
+               clrsetbits_le32(priv->base + gate->regs->sta_ofs, bit, 0);
+               break;
        case CLK_GATE_NO_SETCLR_INV:
                clrsetbits_le32(priv->base + gate->regs->sta_ofs, bit, bit);
                break;
@@ -411,6 +417,12 @@ static int mtk_clk_gate_disable(struct clk *clk)
        case CLK_GATE_SETCLR:
                writel(bit, priv->base + gate->regs->set_ofs);
                break;
+       case CLK_GATE_SETCLR_INV:
+               writel(bit, priv->base + gate->regs->clr_ofs);
+               break;
+       case CLK_GATE_NO_SETCLR:
+               clrsetbits_le32(priv->base + gate->regs->sta_ofs, bit, bit);
+               break;
        case CLK_GATE_NO_SETCLR_INV:
                clrsetbits_le32(priv->base + gate->regs->sta_ofs, bit, 0);
                break;
index e062eccdae1e8a1ac3e1cc7e0e6742e8d702e295..3862c1b8482707def8a0a9cf268e5f5880d97d50 100644 (file)
@@ -60,6 +60,12 @@ config CLK_R8A7796
        help
          Enable this to support the clocks on Renesas R8A7796 SoC.
 
+config CLK_R8A77965
+       bool "Renesas R8A77965 clock driver"
+       depends on CLK_RCAR_GEN3
+       help
+         Enable this to support the clocks on Renesas R8A77965 SoC.
+
 config CLK_R8A77970
        bool "Renesas R8A77970 clock driver"
        depends on CLK_RCAR_GEN3
index 22a817a91910844306f9d3c02910e19af879d846..26b343994cdbf29b78489b929ee873e8ea7065d3 100644 (file)
@@ -8,6 +8,7 @@ obj-$(CONFIG_CLK_R8A7794) += r8a7794-cpg-mssr.o
 obj-$(CONFIG_CLK_RCAR_GEN3) += clk-rcar-gen3.o
 obj-$(CONFIG_CLK_R8A7795) += r8a7795-cpg-mssr.o
 obj-$(CONFIG_CLK_R8A7796) += r8a7796-cpg-mssr.o
+obj-$(CONFIG_CLK_R8A77965) += r8a77965-cpg-mssr.o
 obj-$(CONFIG_CLK_R8A77970) += r8a77970-cpg-mssr.o
 obj-$(CONFIG_CLK_R8A77990) += r8a77990-cpg-mssr.o
 obj-$(CONFIG_CLK_R8A77995) += r8a77995-cpg-mssr.o
index 0529fc8763c622a7c88b10014d3369a3c14f2f0c..a2011dd37c5f50a7e4d898c791715a822644b1f2 100644 (file)
@@ -96,7 +96,7 @@ static int gen3_clk_get_parent(struct gen3_clk_priv *priv, struct clk *clk,
                if (ret)
                        return ret;
 
-               if (core->type == CLK_TYPE_GEN3_PE) {
+               if (core->type == CLK_TYPE_GEN3_MDSEL) {
                        parent->dev = clk->dev;
                        parent->id = core->parent >> (priv->sscg ? 16 : 0);
                        parent->id &= 0xffff;
@@ -257,7 +257,7 @@ static u64 gen3_clk_get_rate64(struct clk *clk)
                      core->parent, core->mult, core->div, rate);
                return rate;
 
-       case CLK_TYPE_GEN3_PE:
+       case CLK_TYPE_GEN3_MDSEL:
                div = (core->div >> (priv->sscg ? 16 : 0)) & 0xffff;
                rate = gen3_clk_get_rate64(&parent) / div;
                debug("%s[%i] PE clk: parent=%i div=%u => rate=%llu\n",
index 360c02c5fda51213e570175d5af9a9b796b1a517..b62b8753cd4e64e6f9bc0c1de19ad79e14ae3792 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a7790 Clock Pulse Generator / Module Standby and Software Reset
  *
@@ -6,10 +7,6 @@
  * Based on clk-rcar-gen2.c
  *
  * Copyright (C) 2013 Ideas On Board SPRL
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <common.h>
@@ -139,6 +136,7 @@ static const struct mssr_mod_clk r8a7790_mod_clks[] = {
        DEF_MOD("cmt1",                  329,   R8A7790_CLK_R),
        DEF_MOD("usbhs-dmac0",           330,   R8A7790_CLK_HP),
        DEF_MOD("usbhs-dmac1",           331,   R8A7790_CLK_HP),
+       DEF_MOD("rwdt",                  402,   R8A7790_CLK_R),
        DEF_MOD("irqc",                  407,   R8A7790_CLK_CP),
        DEF_MOD("intc-sys",              408,   R8A7790_CLK_ZS),
        DEF_MOD("audio-dmac1",           501,   R8A7790_CLK_HP),
index 160877a27fa3a318001baeefc838201babcf0e00..e11c02e6e8272bb0bf48dc9a4093b4d81cb017cd 100644 (file)
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0+
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Renesas R8A7791 CPG MSSR driver
  *
@@ -6,8 +6,11 @@
  *
  * Based on the following driver from Linux kernel:
  * r8a7791 Clock Pulse Generator / Module Standby and Software Reset
+ *
  * Copyright (C) 2015-2017 Glider bvba
+ *
  * Based on clk-rcar-gen2.c
+ *
  * Copyright (C) 2013 Ideas On Board SPRL
  */
 
@@ -54,7 +57,6 @@ static const struct cpg_core_clk r8a7791_core_clks[] = {
 
        /* Core Clock Outputs */
        DEF_BASE("z",    R8A7791_CLK_Z,    CLK_TYPE_GEN2_Z,    CLK_PLL0),
-       DEF_BASE("lb",   R8A7791_CLK_LB,   CLK_TYPE_GEN2_LB,   CLK_PLL1),
        DEF_BASE("adsp", R8A7791_CLK_ADSP, CLK_TYPE_GEN2_ADSP, CLK_PLL1),
        DEF_BASE("sdh",  R8A7791_CLK_SDH,  CLK_TYPE_GEN2_SDH,  CLK_PLL1),
        DEF_BASE("sd0",  R8A7791_CLK_SD0,  CLK_TYPE_GEN2_SD0,  CLK_PLL1),
@@ -67,6 +69,7 @@ static const struct cpg_core_clk r8a7791_core_clks[] = {
        DEF_FIXED("hp",     R8A7791_CLK_HP,    CLK_PLL1,         12, 1),
        DEF_FIXED("i",      R8A7791_CLK_I,     CLK_PLL1,          2, 1),
        DEF_FIXED("b",      R8A7791_CLK_B,     CLK_PLL1,         12, 1),
+       DEF_FIXED("lb",     R8A7791_CLK_LB,    CLK_PLL1,         24, 1),
        DEF_FIXED("p",      R8A7791_CLK_P,     CLK_PLL1,         24, 1),
        DEF_FIXED("cl",     R8A7791_CLK_CL,    CLK_PLL1,         48, 1),
        DEF_FIXED("m2",     R8A7791_CLK_M2,    CLK_PLL1,          8, 1),
@@ -125,6 +128,7 @@ static const struct mssr_mod_clk r8a7791_mod_clks[] = {
        DEF_MOD("cmt1",                  329,   R8A7791_CLK_R),
        DEF_MOD("usbhs-dmac0",           330,   R8A7791_CLK_HP),
        DEF_MOD("usbhs-dmac1",           331,   R8A7791_CLK_HP),
+       DEF_MOD("rwdt",                  402,   R8A7791_CLK_R),
        DEF_MOD("irqc",                  407,   R8A7791_CLK_CP),
        DEF_MOD("intc-sys",              408,   R8A7791_CLK_ZS),
        DEF_MOD("audio-dmac1",           501,   R8A7791_CLK_HP),
index 46dd3c9c9161eedbb0691172d067d2bd836b0f1c..fb18ee7aedf06625d2f430c954b8821736a49c00 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a7792 Clock Pulse Generator / Module Standby and Software Reset
  *
@@ -6,10 +7,6 @@
  * Based on clk-rcar-gen2.c
  *
  * Copyright (C) 2013 Ideas On Board SPRL
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <common.h>
@@ -52,7 +49,6 @@ static const struct cpg_core_clk r8a7792_core_clks[] = {
        DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2, CLK_PLL1, 2, 1),
 
        /* Core Clock Outputs */
-       DEF_BASE("lb",   R8A7792_CLK_LB,   CLK_TYPE_GEN2_LB,   CLK_PLL1),
        DEF_BASE("qspi", R8A7792_CLK_QSPI, CLK_TYPE_GEN2_QSPI, CLK_PLL1_DIV2),
 
        DEF_FIXED("z",      R8A7792_CLK_Z,     CLK_PLL0,          1, 1),
@@ -62,6 +58,7 @@ static const struct cpg_core_clk r8a7792_core_clks[] = {
        DEF_FIXED("hp",     R8A7792_CLK_HP,    CLK_PLL1,         12, 1),
        DEF_FIXED("i",      R8A7792_CLK_I,     CLK_PLL1,          3, 1),
        DEF_FIXED("b",      R8A7792_CLK_B,     CLK_PLL1,         12, 1),
+       DEF_FIXED("lb",     R8A7792_CLK_LB,    CLK_PLL1,         24, 1),
        DEF_FIXED("p",      R8A7792_CLK_P,     CLK_PLL1,         24, 1),
        DEF_FIXED("cl",     R8A7792_CLK_CL,    CLK_PLL1,         48, 1),
        DEF_FIXED("m2",     R8A7792_CLK_M2,    CLK_PLL1,          8, 1),
@@ -97,6 +94,7 @@ static const struct mssr_mod_clk r8a7792_mod_clks[] = {
        DEF_MOD("tpu0",                  304,   R8A7792_CLK_CP),
        DEF_MOD("sdhi0",                 314,   R8A7792_CLK_SD),
        DEF_MOD("cmt1",                  329,   R8A7792_CLK_R),
+       DEF_MOD("rwdt",                  402,   R8A7792_CLK_R),
        DEF_MOD("irqc",                  407,   R8A7792_CLK_CP),
        DEF_MOD("intc-sys",              408,   R8A7792_CLK_ZS),
        DEF_MOD("audio-dmac0",           502,   R8A7792_CLK_HP),
index e8f57c3d015041438709e998d0587fbb16eef6b0..b6be1bc0323d41a04617905bf9d14305710cef1f 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a7794 Clock Pulse Generator / Module Standby and Software Reset
  *
@@ -6,10 +7,6 @@
  * Based on clk-rcar-gen2.c
  *
  * Copyright (C) 2013 Ideas On Board SPRL
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <common.h>
@@ -54,7 +51,6 @@ static const struct cpg_core_clk r8a7794_core_clks[] = {
        DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2, CLK_PLL1, 2, 1),
 
        /* Core Clock Outputs */
-       DEF_BASE("lb",   R8A7794_CLK_LB,   CLK_TYPE_GEN2_LB,   CLK_PLL1),
        DEF_BASE("adsp", R8A7794_CLK_ADSP, CLK_TYPE_GEN2_ADSP, CLK_PLL1),
        DEF_BASE("sdh",  R8A7794_CLK_SDH,  CLK_TYPE_GEN2_SDH,  CLK_PLL1),
        DEF_BASE("sd0",  R8A7794_CLK_SD0,  CLK_TYPE_GEN2_SD0,  CLK_PLL1),
@@ -68,6 +64,7 @@ static const struct cpg_core_clk r8a7794_core_clks[] = {
        DEF_FIXED("hp",     R8A7794_CLK_HP,    CLK_PLL1,         12, 1),
        DEF_FIXED("i",      R8A7794_CLK_I,     CLK_PLL1,          2, 1),
        DEF_FIXED("b",      R8A7794_CLK_B,     CLK_PLL1,         12, 1),
+       DEF_FIXED("lb",     R8A7794_CLK_LB,    CLK_PLL1,         24, 1),
        DEF_FIXED("p",      R8A7794_CLK_P,     CLK_PLL1,         24, 1),
        DEF_FIXED("cl",     R8A7794_CLK_CL,    CLK_PLL1,         48, 1),
        DEF_FIXED("cp",     R8A7794_CLK_CP,    CLK_PLL1,         48, 1),
@@ -120,6 +117,7 @@ static const struct mssr_mod_clk r8a7794_mod_clks[] = {
        DEF_MOD("cmt1",                  329,   R8A7794_CLK_R),
        DEF_MOD("usbhs-dmac0",           330,   R8A7794_CLK_HP),
        DEF_MOD("usbhs-dmac1",           331,   R8A7794_CLK_HP),
+       DEF_MOD("rwdt",                  402,   R8A7794_CLK_R),
        DEF_MOD("irqc",                  407,   R8A7794_CLK_CP),
        DEF_MOD("intc-sys",              408,   R8A7794_CLK_ZS),
        DEF_MOD("audio-dmac0",           502,   R8A7794_CLK_HP),
index 16a10243a64cc2625f4e2e95e14e8d297deb60b4..ab4747ee14be7b73fe615a05fb5e5b46a1d12c3f 100644 (file)
@@ -1,13 +1,12 @@
-// SPDX-License-Identifier: GPL-2.0+
+// SPDX-License-Identifier: GPL-2.0
 /*
- * Renesas R8A7795 CPG MSSR driver
+ * r8a7795 Clock Pulse Generator / Module Standby and Software Reset
  *
- * Copyright (C) 2017-2018 Marek Vasut <marek.vasut@gmail.com>
+ * Copyright (C) 2015 Glider bvba
  *
- * Based on the following driver from Linux kernel:
- * r8a7796 Clock Pulse Generator / Module Standby and Software Reset
+ * Based on clk-rcar-gen3.c
  *
- * Copyright (C) 2016 Glider bvba
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 
 #include <common.h>
@@ -71,7 +70,11 @@ static const struct cpg_core_clk r8a7795_core_clks[] = {
        DEF_FIXED(".sdsrc",     CLK_SDSRC,         CLK_PLL1_DIV2,  2, 1),
        DEF_FIXED(".rpcsrc",    CLK_RPCSRC,        CLK_PLL1,       2, 1),
 
+       DEF_GEN3_OSC(".r",      CLK_RINT,          CLK_EXTAL,      32),
+
        /* Core Clock Outputs */
+       DEF_BASE("z",           R8A7795_CLK_Z,     CLK_TYPE_GEN3_Z, CLK_PLL0),
+       DEF_BASE("z2",          R8A7795_CLK_Z2,    CLK_TYPE_GEN3_Z2, CLK_PLL2),
        DEF_FIXED("ztr",        R8A7795_CLK_ZTR,   CLK_PLL1_DIV2,  6, 1),
        DEF_FIXED("ztrd2",      R8A7795_CLK_ZTRD2, CLK_PLL1_DIV2, 12, 1),
        DEF_FIXED("zt",         R8A7795_CLK_ZT,    CLK_PLL1_DIV2,  4, 1),
@@ -101,9 +104,16 @@ static const struct cpg_core_clk r8a7795_core_clks[] = {
        DEF_GEN3_RPC("rpc",     R8A7795_CLK_RPC,   CLK_RPCSRC,    0x238),
 
        DEF_FIXED("cl",         R8A7795_CLK_CL,    CLK_PLL1_DIV2, 48, 1),
+       DEF_FIXED("cr",         R8A7795_CLK_CR,    CLK_PLL1_DIV4,  2, 1),
        DEF_FIXED("cp",         R8A7795_CLK_CP,    CLK_EXTAL,      2, 1),
+       DEF_FIXED("cpex",       R8A7795_CLK_CPEX,  CLK_EXTAL,      2, 1),
+
+       DEF_DIV6P1("canfd",     R8A7795_CLK_CANFD, CLK_PLL1_DIV4, 0x244),
+       DEF_DIV6P1("csi0",      R8A7795_CLK_CSI0,  CLK_PLL1_DIV4, 0x00c),
+       DEF_DIV6P1("mso",       R8A7795_CLK_MSO,   CLK_PLL1_DIV4, 0x014),
+       DEF_DIV6P1("hdmi",      R8A7795_CLK_HDMI,  CLK_PLL1_DIV4, 0x250),
 
-       /* NOTE: HDMI, CSI, CAN etc. clock are missing */
+       DEF_GEN3_OSC("osc",     R8A7795_CLK_OSC,   CLK_EXTAL,     8),
 
        DEF_BASE("r",           R8A7795_CLK_R,     CLK_TYPE_GEN3_R, CLK_RINT),
 };
@@ -124,6 +134,7 @@ static const struct mssr_mod_clk r8a7795_mod_clks[] = {
        DEF_MOD("sys-dmac2",             217,   R8A7795_CLK_S0D3),
        DEF_MOD("sys-dmac1",             218,   R8A7795_CLK_S0D3),
        DEF_MOD("sys-dmac0",             219,   R8A7795_CLK_S0D3),
+       DEF_MOD("sceg-pub",              229,   R8A7795_CLK_CR),
        DEF_MOD("cmt3",                  300,   R8A7795_CLK_R),
        DEF_MOD("cmt2",                  301,   R8A7795_CLK_R),
        DEF_MOD("cmt1",                  302,   R8A7795_CLK_R),
@@ -143,7 +154,7 @@ static const struct mssr_mod_clk r8a7795_mod_clks[] = {
        DEF_MOD("usb-dmac1",             331,   R8A7795_CLK_S3D1),
        DEF_MOD("rwdt",                  402,   R8A7795_CLK_R),
        DEF_MOD("intc-ex",               407,   R8A7795_CLK_CP),
-       DEF_MOD("intc-ap",               408,   R8A7795_CLK_S3D1),
+       DEF_MOD("intc-ap",               408,   R8A7795_CLK_S0D3),
        DEF_MOD("audmac1",               501,   R8A7795_CLK_S0D3),
        DEF_MOD("audmac0",               502,   R8A7795_CLK_S0D3),
        DEF_MOD("drif7",                 508,   R8A7795_CLK_S3D2),
@@ -269,25 +280,25 @@ static const struct mssr_mod_clk r8a7795_mod_clks[] = {
  */
 
 /*
- *   MD                EXTAL           PLL0    PLL1    PLL2    PLL3    PLL4
+ *   MD                EXTAL           PLL0    PLL1    PLL2    PLL3    PLL4    OSC
  * 14 13 19 17 (MHz)
- *-------------------------------------------------------------------
- * 0  0  0  0  16.66 x 1       x180    x192    x144    x192    x144
- * 0  0  0  1  16.66 x 1       x180    x192    x144    x128    x144
+ *-------------------------------------------------------------------------
+ * 0  0  0  0  16.66 x 1       x180    x192    x144    x192    x144    /16
+ * 0  0  0  1  16.66 x 1       x180    x192    x144    x128    x144    /16
  * 0  0  1  0  Prohibited setting
- * 0  0  1  1  16.66 x 1       x180    x192    x144    x192    x144
- * 0  1  0  0  20    x 1       x150    x160    x120    x160    x120
- * 0  1  0  1  20    x 1       x150    x160    x120    x106    x120
+ * 0  0  1  1  16.66 x 1       x180    x192    x144    x192    x144    /16
+ * 0  1  0  0  20    x 1       x150    x160    x120    x160    x120    /19
+ * 0  1  0  1  20    x 1       x150    x160    x120    x106    x120    /19
  * 0  1  1  0  Prohibited setting
- * 0  1  1  1  20    x 1       x150    x160    x120    x160    x120
- * 1  0  0  0  25    x 1       x120    x128    x96     x128    x96
- * 1  0  0  1  25    x 1       x120    x128    x96     x84     x96
+ * 0  1  1  1  20    x 1       x150    x160    x120    x160    x120    /19
+ * 1  0  0  0  25    x 1       x120    x128    x96     x128    x96     /24
+ * 1  0  0  1  25    x 1       x120    x128    x96     x84     x96     /24
  * 1  0  1  0  Prohibited setting
- * 1  0  1  1  25    x 1       x120    x128    x96     x128    x96
- * 1  1  0  0  33.33 / 2       x180    x192    x144    x192    x144
- * 1  1  0  1  33.33 / 2       x180    x192    x144    x128    x144
+ * 1  0  1  1  25    x 1       x120    x128    x96     x128    x96     /24
+ * 1  1  0  0  33.33 / 2       x180    x192    x144    x192    x144    /32
+ * 1  1  0  1  33.33 / 2       x180    x192    x144    x128    x144    /32
  * 1  1  1  0  Prohibited setting
- * 1  1  1  1  33.33 / 2       x180    x192    x144    x192    x144
+ * 1  1  1  1  33.33 / 2       x180    x192    x144    x192    x144    /32
  */
 #define CPG_PLL_CONFIG_INDEX(md)       ((((md) & BIT(14)) >> 11) | \
                                         (((md) & BIT(13)) >> 11) | \
@@ -295,23 +306,23 @@ static const struct mssr_mod_clk r8a7795_mod_clks[] = {
                                         (((md) & BIT(17)) >> 17))
 
 static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[16] = {
-       /* EXTAL div    PLL1 mult/div   PLL3 mult/div */
-       { 1,            192,    1,      192,    1,      },
-       { 1,            192,    1,      128,    1,      },
-       { 0, /* Prohibited setting */                   },
-       { 1,            192,    1,      192,    1,      },
-       { 1,            160,    1,      160,    1,      },
-       { 1,            160,    1,      106,    1,      },
-       { 0, /* Prohibited setting */                   },
-       { 1,            160,    1,      160,    1,      },
-       { 1,            128,    1,      128,    1,      },
-       { 1,            128,    1,      84,     1,      },
-       { 0, /* Prohibited setting */                   },
-       { 1,            128,    1,      128,    1,      },
-       { 2,            192,    1,      192,    1,      },
-       { 2,            192,    1,      128,    1,      },
-       { 0, /* Prohibited setting */                   },
-       { 2,            192,    1,      192,    1,      },
+       /* EXTAL div    PLL1 mult/div   PLL3 mult/div   OSC prediv */
+       { 1,            192,    1,      192,    1,      16,     },
+       { 1,            192,    1,      128,    1,      16,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            192,    1,      192,    1,      16,     },
+       { 1,            160,    1,      160,    1,      19,     },
+       { 1,            160,    1,      106,    1,      19,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            160,    1,      160,    1,      19,     },
+       { 1,            128,    1,      128,    1,      24,     },
+       { 1,            128,    1,      84,     1,      24,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            128,    1,      128,    1,      24,     },
+       { 2,            192,    1,      192,    1,      32,     },
+       { 2,            192,    1,      128,    1,      32,     },
+       { 0, /* Prohibited setting */                           },
+       { 2,            192,    1,      192,    1,      32,     },
 };
 
 static const struct mstp_stop_table r8a7795_mstp_table[] = {
index 8115c65eb9f341757b13d4e10bee4933ba9209e3..253a9143b7a49d29637620e3f11ce5ff0562acad 100644 (file)
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0+
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Renesas R8A7796 CPG MSSR driver
  *
@@ -8,6 +8,11 @@
  * r8a7796 Clock Pulse Generator / Module Standby and Software Reset
  *
  * Copyright (C) 2016 Glider bvba
+ *
+ * Based on r8a7795-cpg-mssr.c
+ *
+ * Copyright (C) 2015 Glider bvba
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 
 #include <common.h>
@@ -71,7 +76,11 @@ static const struct cpg_core_clk r8a7796_core_clks[] = {
        DEF_FIXED(".sdsrc",     CLK_SDSRC,         CLK_PLL1_DIV2,  2, 1),
        DEF_FIXED(".rpcsrc",    CLK_RPCSRC,        CLK_PLL1,       2, 1),
 
+       DEF_GEN3_OSC(".r",      CLK_RINT,          CLK_EXTAL,      32),
+
        /* Core Clock Outputs */
+       DEF_BASE("z",           R8A7796_CLK_Z,     CLK_TYPE_GEN3_Z, CLK_PLL0),
+       DEF_BASE("z2",          R8A7796_CLK_Z2,    CLK_TYPE_GEN3_Z2, CLK_PLL2),
        DEF_FIXED("ztr",        R8A7796_CLK_ZTR,   CLK_PLL1_DIV2,  6, 1),
        DEF_FIXED("ztrd2",      R8A7796_CLK_ZTRD2, CLK_PLL1_DIV2, 12, 1),
        DEF_FIXED("zt",         R8A7796_CLK_ZT,    CLK_PLL1_DIV2,  4, 1),
@@ -102,13 +111,20 @@ static const struct cpg_core_clk r8a7796_core_clks[] = {
 
        DEF_FIXED("cl",         R8A7796_CLK_CL,    CLK_PLL1_DIV2, 48, 1),
        DEF_FIXED("cp",         R8A7796_CLK_CP,    CLK_EXTAL,      2, 1),
+       DEF_FIXED("cpex",       R8A7796_CLK_CPEX,  CLK_EXTAL,      2, 1),
 
-       /* NOTE: HDMI, CSI, CAN etc. clock are missing */
+       DEF_DIV6P1("canfd",     R8A7796_CLK_CANFD, CLK_PLL1_DIV4, 0x244),
+       DEF_DIV6P1("csi0",      R8A7796_CLK_CSI0,  CLK_PLL1_DIV4, 0x00c),
+       DEF_DIV6P1("mso",       R8A7796_CLK_MSO,   CLK_PLL1_DIV4, 0x014),
+       DEF_DIV6P1("hdmi",      R8A7796_CLK_HDMI,  CLK_PLL1_DIV4, 0x250),
+
+       DEF_GEN3_OSC("osc",     R8A7796_CLK_OSC,   CLK_EXTAL,     8),
 
        DEF_BASE("r",           R8A7796_CLK_R,     CLK_TYPE_GEN3_R, CLK_RINT),
 };
 
 static const struct mssr_mod_clk r8a7796_mod_clks[] = {
+       DEF_MOD("fdp1-0",                119,   R8A7796_CLK_S0D1),
        DEF_MOD("scif5",                 202,   R8A7796_CLK_S3D4),
        DEF_MOD("scif4",                 203,   R8A7796_CLK_S3D4),
        DEF_MOD("scif3",                 204,   R8A7796_CLK_S3D4),
@@ -137,7 +153,7 @@ static const struct mssr_mod_clk r8a7796_mod_clks[] = {
        DEF_MOD("usb-dmac1",             331,   R8A7796_CLK_S3D1),
        DEF_MOD("rwdt",                  402,   R8A7796_CLK_R),
        DEF_MOD("intc-ex",               407,   R8A7796_CLK_CP),
-       DEF_MOD("intc-ap",               408,   R8A7796_CLK_S3D1),
+       DEF_MOD("intc-ap",               408,   R8A7796_CLK_S0D3),
        DEF_MOD("audmac1",               501,   R8A7796_CLK_S0D3),
        DEF_MOD("audmac0",               502,   R8A7796_CLK_S0D3),
        DEF_MOD("drif7",                 508,   R8A7796_CLK_S3D2),
@@ -242,25 +258,25 @@ static const struct mssr_mod_clk r8a7796_mod_clks[] = {
  */
 
 /*
- *   MD                EXTAL           PLL0    PLL1    PLL2    PLL3    PLL4
+ *   MD                EXTAL           PLL0    PLL1    PLL2    PLL3    PLL4    OSC
  * 14 13 19 17 (MHz)
- *-------------------------------------------------------------------
- * 0  0  0  0  16.66 x 1       x180    x192    x144    x192    x144
- * 0  0  0  1  16.66 x 1       x180    x192    x144    x128    x144
+ *-------------------------------------------------------------------------
+ * 0  0  0  0  16.66 x 1       x180    x192    x144    x192    x144    /16
+ * 0  0  0  1  16.66 x 1       x180    x192    x144    x128    x144    /16
  * 0  0  1  0  Prohibited setting
- * 0  0  1  1  16.66 x 1       x180    x192    x144    x192    x144
- * 0  1  0  0  20    x 1       x150    x160    x120    x160    x120
- * 0  1  0  1  20    x 1       x150    x160    x120    x106    x120
+ * 0  0  1  1  16.66 x 1       x180    x192    x144    x192    x144    /16
+ * 0  1  0  0  20    x 1       x150    x160    x120    x160    x120    /19
+ * 0  1  0  1  20    x 1       x150    x160    x120    x106    x120    /19
  * 0  1  1  0  Prohibited setting
- * 0  1  1  1  20    x 1       x150    x160    x120    x160    x120
- * 1  0  0  0  25    x 1       x120    x128    x96     x128    x96
- * 1  0  0  1  25    x 1       x120    x128    x96     x84     x96
+ * 0  1  1  1  20    x 1       x150    x160    x120    x160    x120    /19
+ * 1  0  0  0  25    x 1       x120    x128    x96     x128    x96     /24
+ * 1  0  0  1  25    x 1       x120    x128    x96     x84     x96     /24
  * 1  0  1  0  Prohibited setting
- * 1  0  1  1  25    x 1       x120    x128    x96     x128    x96
- * 1  1  0  0  33.33 / 2       x180    x192    x144    x192    x144
- * 1  1  0  1  33.33 / 2       x180    x192    x144    x128    x144
+ * 1  0  1  1  25    x 1       x120    x128    x96     x128    x96     /24
+ * 1  1  0  0  33.33 / 2       x180    x192    x144    x192    x144    /32
+ * 1  1  0  1  33.33 / 2       x180    x192    x144    x128    x144    /32
  * 1  1  1  0  Prohibited setting
- * 1  1  1  1  33.33 / 2       x180    x192    x144    x192    x144
+ * 1  1  1  1  33.33 / 2       x180    x192    x144    x192    x144    /32
  */
 #define CPG_PLL_CONFIG_INDEX(md)       ((((md) & BIT(14)) >> 11) | \
                                         (((md) & BIT(13)) >> 11) | \
@@ -268,23 +284,23 @@ static const struct mssr_mod_clk r8a7796_mod_clks[] = {
                                         (((md) & BIT(17)) >> 17))
 
 static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[16] = {
-       /* EXTAL div    PLL1 mult/div   PLL3 mult/div */
-       { 1,            192,    1,      192,    1,      },
-       { 1,            192,    1,      128,    1,      },
-       { 0, /* Prohibited setting */                   },
-       { 1,            192,    1,      192,    1,      },
-       { 1,            160,    1,      160,    1,      },
-       { 1,            160,    1,      106,    1,      },
-       { 0, /* Prohibited setting */                   },
-       { 1,            160,    1,      160,    1,      },
-       { 1,            128,    1,      128,    1,      },
-       { 1,            128,    1,      84,     1,      },
-       { 0, /* Prohibited setting */                   },
-       { 1,            128,    1,      128,    1,      },
-       { 2,            192,    1,      192,    1,      },
-       { 2,            192,    1,      128,    1,      },
-       { 0, /* Prohibited setting */                   },
-       { 2,            192,    1,      192,    1,      },
+       /* EXTAL div    PLL1 mult/div   PLL3 mult/div   OSC prediv */
+       { 1,            192,    1,      192,    1,      16,     },
+       { 1,            192,    1,      128,    1,      16,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            192,    1,      192,    1,      16,     },
+       { 1,            160,    1,      160,    1,      19,     },
+       { 1,            160,    1,      106,    1,      19,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            160,    1,      160,    1,      19,     },
+       { 1,            128,    1,      128,    1,      24,     },
+       { 1,            128,    1,      84,     1,      24,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            128,    1,      128,    1,      24,     },
+       { 2,            192,    1,      192,    1,      32,     },
+       { 2,            192,    1,      128,    1,      32,     },
+       { 0, /* Prohibited setting */                           },
+       { 2,            192,    1,      192,    1,      32,     },
 };
 
 static const struct mstp_stop_table r8a7796_mstp_table[] = {
@@ -322,30 +338,11 @@ static const struct cpg_mssr_info r8a7796_cpg_mssr_info = {
        .get_pll_config         = r8a7796_get_pll_config,
 };
 
-static const struct cpg_mssr_info r8a77965_cpg_mssr_info = {
-       .core_clk               = r8a7796_core_clks,
-       .core_clk_size          = ARRAY_SIZE(r8a7796_core_clks),
-       .mod_clk                = r8a7796_mod_clks,
-       .mod_clk_size           = ARRAY_SIZE(r8a7796_mod_clks),
-       .mstp_table             = r8a7796_mstp_table,
-       .mstp_table_size        = ARRAY_SIZE(r8a7796_mstp_table),
-       .reset_node             = "renesas,r8a77965-rst",
-       .extalr_node            = "extalr",
-       .mod_clk_base           = MOD_CLK_BASE,
-       .clk_extal_id           = CLK_EXTAL,
-       .clk_extalr_id          = CLK_EXTALR,
-       .get_pll_config         = r8a7796_get_pll_config,
-};
-
 static const struct udevice_id r8a7796_clk_ids[] = {
        {
                .compatible     = "renesas,r8a7796-cpg-mssr",
                .data           = (ulong)&r8a7796_cpg_mssr_info,
        },
-       {
-               .compatible     = "renesas,r8a77965-cpg-mssr",
-               .data           = (ulong)&r8a77965_cpg_mssr_info,
-       },
        { }
 };
 
diff --git a/drivers/clk/renesas/r8a77965-cpg-mssr.c b/drivers/clk/renesas/r8a77965-cpg-mssr.c
new file mode 100644 (file)
index 0000000..bd36ea3
--- /dev/null
@@ -0,0 +1,355 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * r8a77965 Clock Pulse Generator / Module Standby and Software Reset
+ *
+ * Copyright (C) 2018 Jacopo Mondi <jacopo+renesas@jmondi.org>
+ *
+ * Based on r8a7795-cpg-mssr.c
+ *
+ * Copyright (C) 2015 Glider bvba
+ * Copyright (C) 2015 Renesas Electronics Corp.
+ */
+
+#include <common.h>
+#include <clk-uclass.h>
+#include <dm.h>
+
+#include <dt-bindings/clock/r8a77965-cpg-mssr.h>
+
+#include "renesas-cpg-mssr.h"
+#include "rcar-gen3-cpg.h"
+
+enum clk_ids {
+       /* Core Clock Outputs exported to DT */
+       LAST_DT_CORE_CLK = R8A77965_CLK_OSC,
+
+       /* External Input Clocks */
+       CLK_EXTAL,
+       CLK_EXTALR,
+
+       /* Internal Core Clocks */
+       CLK_MAIN,
+       CLK_PLL0,
+       CLK_PLL1,
+       CLK_PLL3,
+       CLK_PLL4,
+       CLK_PLL1_DIV2,
+       CLK_PLL1_DIV4,
+       CLK_S0,
+       CLK_S1,
+       CLK_S2,
+       CLK_S3,
+       CLK_SDSRC,
+       CLK_RPCSRC,
+       CLK_SSPSRC,
+       CLK_RINT,
+
+       /* Module Clocks */
+       MOD_CLK_BASE
+};
+
+static const struct cpg_core_clk r8a77965_core_clks[] = {
+       /* External Clock Inputs */
+       DEF_INPUT("extal",      CLK_EXTAL),
+       DEF_INPUT("extalr",     CLK_EXTALR),
+
+       /* Internal Core Clocks */
+       DEF_BASE(".main",       CLK_MAIN, CLK_TYPE_GEN3_MAIN, CLK_EXTAL),
+       DEF_BASE(".pll0",       CLK_PLL0, CLK_TYPE_GEN3_PLL0, CLK_MAIN),
+       DEF_BASE(".pll1",       CLK_PLL1, CLK_TYPE_GEN3_PLL1, CLK_MAIN),
+       DEF_BASE(".pll3",       CLK_PLL3, CLK_TYPE_GEN3_PLL3, CLK_MAIN),
+       DEF_BASE(".pll4",       CLK_PLL4, CLK_TYPE_GEN3_PLL4, CLK_MAIN),
+
+       DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2,          CLK_PLL1,       2, 1),
+       DEF_FIXED(".pll1_div4", CLK_PLL1_DIV4,          CLK_PLL1_DIV2,  2, 1),
+       DEF_FIXED(".s0",        CLK_S0,                 CLK_PLL1_DIV2,  2, 1),
+       DEF_FIXED(".s1",        CLK_S1,                 CLK_PLL1_DIV2,  3, 1),
+       DEF_FIXED(".s2",        CLK_S2,                 CLK_PLL1_DIV2,  4, 1),
+       DEF_FIXED(".s3",        CLK_S3,                 CLK_PLL1_DIV2,  6, 1),
+       DEF_FIXED(".sdsrc",     CLK_SDSRC,              CLK_PLL1_DIV2,  2, 1),
+       DEF_FIXED(".rpcsrc",    CLK_RPCSRC,             CLK_PLL1,       2, 1),
+
+       DEF_GEN3_OSC(".r",      CLK_RINT,               CLK_EXTAL,      32),
+
+       /* Core Clock Outputs */
+       DEF_BASE("z",           R8A77965_CLK_Z,         CLK_TYPE_GEN3_Z, CLK_PLL0),
+       DEF_FIXED("ztr",        R8A77965_CLK_ZTR,       CLK_PLL1_DIV2,  6, 1),
+       DEF_FIXED("ztrd2",      R8A77965_CLK_ZTRD2,     CLK_PLL1_DIV2,  12, 1),
+       DEF_FIXED("zt",         R8A77965_CLK_ZT,        CLK_PLL1_DIV2,  4, 1),
+       DEF_FIXED("zx",         R8A77965_CLK_ZX,        CLK_PLL1_DIV2,  2, 1),
+       DEF_FIXED("s0d1",       R8A77965_CLK_S0D1,      CLK_S0,         1, 1),
+       DEF_FIXED("s0d2",       R8A77965_CLK_S0D2,      CLK_S0,         2, 1),
+       DEF_FIXED("s0d3",       R8A77965_CLK_S0D3,      CLK_S0,         3, 1),
+       DEF_FIXED("s0d4",       R8A77965_CLK_S0D4,      CLK_S0,         4, 1),
+       DEF_FIXED("s0d6",       R8A77965_CLK_S0D6,      CLK_S0,         6, 1),
+       DEF_FIXED("s0d8",       R8A77965_CLK_S0D8,      CLK_S0,         8, 1),
+       DEF_FIXED("s0d12",      R8A77965_CLK_S0D12,     CLK_S0,         12, 1),
+       DEF_FIXED("s1d1",       R8A77965_CLK_S1D1,      CLK_S1,         1, 1),
+       DEF_FIXED("s1d2",       R8A77965_CLK_S1D2,      CLK_S1,         2, 1),
+       DEF_FIXED("s1d4",       R8A77965_CLK_S1D4,      CLK_S1,         4, 1),
+       DEF_FIXED("s2d1",       R8A77965_CLK_S2D1,      CLK_S2,         1, 1),
+       DEF_FIXED("s2d2",       R8A77965_CLK_S2D2,      CLK_S2,         2, 1),
+       DEF_FIXED("s2d4",       R8A77965_CLK_S2D4,      CLK_S2,         4, 1),
+       DEF_FIXED("s3d1",       R8A77965_CLK_S3D1,      CLK_S3,         1, 1),
+       DEF_FIXED("s3d2",       R8A77965_CLK_S3D2,      CLK_S3,         2, 1),
+       DEF_FIXED("s3d4",       R8A77965_CLK_S3D4,      CLK_S3,         4, 1),
+
+       DEF_GEN3_SD("sd0",      R8A77965_CLK_SD0,       CLK_SDSRC,      0x074),
+       DEF_GEN3_SD("sd1",      R8A77965_CLK_SD1,       CLK_SDSRC,      0x078),
+       DEF_GEN3_SD("sd2",      R8A77965_CLK_SD2,       CLK_SDSRC,      0x268),
+       DEF_GEN3_SD("sd3",      R8A77965_CLK_SD3,       CLK_SDSRC,      0x26c),
+
+       DEF_GEN3_RPC("rpc",     R8A77965_CLK_RPC,       CLK_RPCSRC,     0x238),
+
+       DEF_FIXED("cl",         R8A77965_CLK_CL,        CLK_PLL1_DIV2,  48, 1),
+       DEF_FIXED("cp",         R8A77965_CLK_CP,        CLK_EXTAL,      2, 1),
+       DEF_FIXED("cpex",       R8A77965_CLK_CPEX,      CLK_EXTAL,      2, 1),
+
+       DEF_DIV6P1("canfd",     R8A77965_CLK_CANFD,     CLK_PLL1_DIV4,  0x244),
+       DEF_DIV6P1("csi0",      R8A77965_CLK_CSI0,      CLK_PLL1_DIV4,  0x00c),
+       DEF_DIV6P1("mso",       R8A77965_CLK_MSO,       CLK_PLL1_DIV4,  0x014),
+       DEF_DIV6P1("hdmi",      R8A77965_CLK_HDMI,      CLK_PLL1_DIV4,  0x250),
+
+       DEF_GEN3_OSC("osc",     R8A77965_CLK_OSC,       CLK_EXTAL,      8),
+
+       DEF_BASE("r",           R8A77965_CLK_R, CLK_TYPE_GEN3_R, CLK_RINT),
+};
+
+static const struct mssr_mod_clk r8a77965_mod_clks[] = {
+       DEF_MOD("fdp1-0",               119,    R8A77965_CLK_S0D1),
+       DEF_MOD("scif5",                202,    R8A77965_CLK_S3D4),
+       DEF_MOD("scif4",                203,    R8A77965_CLK_S3D4),
+       DEF_MOD("scif3",                204,    R8A77965_CLK_S3D4),
+       DEF_MOD("scif1",                206,    R8A77965_CLK_S3D4),
+       DEF_MOD("scif0",                207,    R8A77965_CLK_S3D4),
+       DEF_MOD("msiof3",               208,    R8A77965_CLK_MSO),
+       DEF_MOD("msiof2",               209,    R8A77965_CLK_MSO),
+       DEF_MOD("msiof1",               210,    R8A77965_CLK_MSO),
+       DEF_MOD("msiof0",               211,    R8A77965_CLK_MSO),
+       DEF_MOD("sys-dmac2",            217,    R8A77965_CLK_S0D3),
+       DEF_MOD("sys-dmac1",            218,    R8A77965_CLK_S0D3),
+       DEF_MOD("sys-dmac0",            219,    R8A77965_CLK_S0D3),
+
+       DEF_MOD("cmt3",                 300,    R8A77965_CLK_R),
+       DEF_MOD("cmt2",                 301,    R8A77965_CLK_R),
+       DEF_MOD("cmt1",                 302,    R8A77965_CLK_R),
+       DEF_MOD("cmt0",                 303,    R8A77965_CLK_R),
+       DEF_MOD("scif2",                310,    R8A77965_CLK_S3D4),
+       DEF_MOD("sdif3",                311,    R8A77965_CLK_SD3),
+       DEF_MOD("sdif2",                312,    R8A77965_CLK_SD2),
+       DEF_MOD("sdif1",                313,    R8A77965_CLK_SD1),
+       DEF_MOD("sdif0",                314,    R8A77965_CLK_SD0),
+       DEF_MOD("pcie1",                318,    R8A77965_CLK_S3D1),
+       DEF_MOD("pcie0",                319,    R8A77965_CLK_S3D1),
+       DEF_MOD("usb3-if0",             328,    R8A77965_CLK_S3D1),
+       DEF_MOD("usb-dmac0",            330,    R8A77965_CLK_S3D1),
+       DEF_MOD("usb-dmac1",            331,    R8A77965_CLK_S3D1),
+
+       DEF_MOD("rwdt",                 402,    R8A77965_CLK_R),
+       DEF_MOD("intc-ex",              407,    R8A77965_CLK_CP),
+       DEF_MOD("intc-ap",              408,    R8A77965_CLK_S0D3),
+
+       DEF_MOD("audmac1",              501,    R8A77965_CLK_S0D3),
+       DEF_MOD("audmac0",              502,    R8A77965_CLK_S0D3),
+       DEF_MOD("drif7",                508,    R8A77965_CLK_S3D2),
+       DEF_MOD("drif6",                509,    R8A77965_CLK_S3D2),
+       DEF_MOD("drif5",                510,    R8A77965_CLK_S3D2),
+       DEF_MOD("drif4",                511,    R8A77965_CLK_S3D2),
+       DEF_MOD("drif3",                512,    R8A77965_CLK_S3D2),
+       DEF_MOD("drif2",                513,    R8A77965_CLK_S3D2),
+       DEF_MOD("drif1",                514,    R8A77965_CLK_S3D2),
+       DEF_MOD("drif0",                515,    R8A77965_CLK_S3D2),
+       DEF_MOD("hscif4",               516,    R8A77965_CLK_S3D1),
+       DEF_MOD("hscif3",               517,    R8A77965_CLK_S3D1),
+       DEF_MOD("hscif2",               518,    R8A77965_CLK_S3D1),
+       DEF_MOD("hscif1",               519,    R8A77965_CLK_S3D1),
+       DEF_MOD("hscif0",               520,    R8A77965_CLK_S3D1),
+       DEF_MOD("thermal",              522,    R8A77965_CLK_CP),
+       DEF_MOD("pwm",                  523,    R8A77965_CLK_S0D12),
+
+       DEF_MOD("fcpvd1",               602,    R8A77965_CLK_S0D2),
+       DEF_MOD("fcpvd0",               603,    R8A77965_CLK_S0D2),
+       DEF_MOD("fcpvb0",               607,    R8A77965_CLK_S0D1),
+       DEF_MOD("fcpvi0",               611,    R8A77965_CLK_S0D1),
+       DEF_MOD("fcpf0",                615,    R8A77965_CLK_S0D1),
+       DEF_MOD("fcpcs",                619,    R8A77965_CLK_S0D2),
+       DEF_MOD("vspd1",                622,    R8A77965_CLK_S0D2),
+       DEF_MOD("vspd0",                623,    R8A77965_CLK_S0D2),
+       DEF_MOD("vspb",                 626,    R8A77965_CLK_S0D1),
+       DEF_MOD("vspi0",                631,    R8A77965_CLK_S0D1),
+
+       DEF_MOD("ehci1",                702,    R8A77965_CLK_S3D4),
+       DEF_MOD("ehci0",                703,    R8A77965_CLK_S3D4),
+       DEF_MOD("hsusb",                704,    R8A77965_CLK_S3D4),
+       DEF_MOD("csi20",                714,    R8A77965_CLK_CSI0),
+       DEF_MOD("csi40",                716,    R8A77965_CLK_CSI0),
+       DEF_MOD("du3",                  721,    R8A77965_CLK_S2D1),
+       DEF_MOD("du1",                  723,    R8A77965_CLK_S2D1),
+       DEF_MOD("du0",                  724,    R8A77965_CLK_S2D1),
+       DEF_MOD("lvds",                 727,    R8A77965_CLK_S2D1),
+       DEF_MOD("hdmi0",                729,    R8A77965_CLK_HDMI),
+
+       DEF_MOD("vin7",                 804,    R8A77965_CLK_S0D2),
+       DEF_MOD("vin6",                 805,    R8A77965_CLK_S0D2),
+       DEF_MOD("vin5",                 806,    R8A77965_CLK_S0D2),
+       DEF_MOD("vin4",                 807,    R8A77965_CLK_S0D2),
+       DEF_MOD("vin3",                 808,    R8A77965_CLK_S0D2),
+       DEF_MOD("vin2",                 809,    R8A77965_CLK_S0D2),
+       DEF_MOD("vin1",                 810,    R8A77965_CLK_S0D2),
+       DEF_MOD("vin0",                 811,    R8A77965_CLK_S0D2),
+       DEF_MOD("etheravb",             812,    R8A77965_CLK_S0D6),
+       DEF_MOD("sata0",                815,    R8A77965_CLK_S3D2),
+       DEF_MOD("imr1",                 822,    R8A77965_CLK_S0D2),
+       DEF_MOD("imr0",                 823,    R8A77965_CLK_S0D2),
+
+       DEF_MOD("gpio7",                905,    R8A77965_CLK_S3D4),
+       DEF_MOD("gpio6",                906,    R8A77965_CLK_S3D4),
+       DEF_MOD("gpio5",                907,    R8A77965_CLK_S3D4),
+       DEF_MOD("gpio4",                908,    R8A77965_CLK_S3D4),
+       DEF_MOD("gpio3",                909,    R8A77965_CLK_S3D4),
+       DEF_MOD("gpio2",                910,    R8A77965_CLK_S3D4),
+       DEF_MOD("gpio1",                911,    R8A77965_CLK_S3D4),
+       DEF_MOD("gpio0",                912,    R8A77965_CLK_S3D4),
+       DEF_MOD("can-fd",               914,    R8A77965_CLK_S3D2),
+       DEF_MOD("can-if1",              915,    R8A77965_CLK_S3D4),
+       DEF_MOD("can-if0",              916,    R8A77965_CLK_S3D4),
+       DEF_MOD("rpc",                  917,    R8A77965_CLK_RPC),
+       DEF_MOD("i2c6",                 918,    R8A77965_CLK_S0D6),
+       DEF_MOD("i2c5",                 919,    R8A77965_CLK_S0D6),
+       DEF_MOD("i2c-dvfs",             926,    R8A77965_CLK_CP),
+       DEF_MOD("i2c4",                 927,    R8A77965_CLK_S0D6),
+       DEF_MOD("i2c3",                 928,    R8A77965_CLK_S0D6),
+       DEF_MOD("i2c2",                 929,    R8A77965_CLK_S3D2),
+       DEF_MOD("i2c1",                 930,    R8A77965_CLK_S3D2),
+       DEF_MOD("i2c0",                 931,    R8A77965_CLK_S3D2),
+
+       DEF_MOD("ssi-all",              1005,   R8A77965_CLK_S3D4),
+       DEF_MOD("ssi9",                 1006,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi8",                 1007,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi7",                 1008,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi6",                 1009,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi5",                 1010,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi4",                 1011,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi3",                 1012,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi2",                 1013,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi1",                 1014,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi0",                 1015,   MOD_CLK_ID(1005)),
+       DEF_MOD("scu-all",              1017,   R8A77965_CLK_S3D4),
+       DEF_MOD("scu-dvc1",             1018,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-dvc0",             1019,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-ctu1-mix1",        1020,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-ctu0-mix0",        1021,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src9",             1022,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src8",             1023,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src7",             1024,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src6",             1025,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src5",             1026,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src4",             1027,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src3",             1028,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src2",             1029,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src1",             1030,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src0",             1031,   MOD_CLK_ID(1017)),
+};
+
+/*
+ * CPG Clock Data
+ */
+
+/*
+ *   MD                EXTAL           PLL0    PLL1    PLL3    PLL4    OSC
+ * 14 13 19 17 (MHz)
+ *-----------------------------------------------------------------
+ * 0  0  0  0  16.66 x 1       x180    x192    x192    x144    /16
+ * 0  0  0  1  16.66 x 1       x180    x192    x128    x144    /16
+ * 0  0  1  0  Prohibited setting
+ * 0  0  1  1  16.66 x 1       x180    x192    x192    x144    /16
+ * 0  1  0  0  20    x 1       x150    x160    x160    x120    /19
+ * 0  1  0  1  20    x 1       x150    x160    x106    x120    /19
+ * 0  1  1  0  Prohibited setting
+ * 0  1  1  1  20    x 1       x150    x160    x160    x120    /19
+ * 1  0  0  0  25    x 1       x120    x128    x128    x96     /24
+ * 1  0  0  1  25    x 1       x120    x128    x84     x96     /24
+ * 1  0  1  0  Prohibited setting
+ * 1  0  1  1  25    x 1       x120    x128    x128    x96     /24
+ * 1  1  0  0  33.33 / 2       x180    x192    x192    x144    /32
+ * 1  1  0  1  33.33 / 2       x180    x192    x128    x144    /32
+ * 1  1  1  0  Prohibited setting
+ * 1  1  1  1  33.33 / 2       x180    x192    x192    x144    /32
+ */
+#define CPG_PLL_CONFIG_INDEX(md)       ((((md) & BIT(14)) >> 11) | \
+                                        (((md) & BIT(13)) >> 11) | \
+                                        (((md) & BIT(19)) >> 18) | \
+                                        (((md) & BIT(17)) >> 17))
+
+static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[16] = {
+       /* EXTAL div    PLL1 mult/div   PLL3 mult/div   OSC prediv */
+       { 1,            192,    1,      192,    1,      16,     },
+       { 1,            192,    1,      128,    1,      16,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            192,    1,      192,    1,      16,     },
+       { 1,            160,    1,      160,    1,      19,     },
+       { 1,            160,    1,      106,    1,      19,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            160,    1,      160,    1,      19,     },
+       { 1,            128,    1,      128,    1,      24,     },
+       { 1,            128,    1,      84,     1,      24,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            128,    1,      128,    1,      24,     },
+       { 2,            192,    1,      192,    1,      32,     },
+       { 2,            192,    1,      128,    1,      32,     },
+       { 0, /* Prohibited setting */                           },
+       { 2,            192,    1,      192,    1,      32,     },
+};
+
+static const struct mstp_stop_table r8a77965_mstp_table[] = {
+       { 0x00200000, 0x0, 0x00200000, 0 },
+       { 0xFFFFFFFF, 0x0, 0xFFFFFFFF, 0 },
+       { 0x340E2FDC, 0x2040, 0x340E2FDC, 0 },
+       { 0xFFFFFFDF, 0x400, 0xFFFFFFDF, 0 },
+       { 0x80000184, 0x180, 0x80000184, 0 },
+       { 0xC3FFFFFF, 0x0, 0xC3FFFFFF, 0 },
+       { 0xFFFFFFFF, 0x0, 0xFFFFFFFF, 0 },
+       { 0xFFFFFFFF, 0x0, 0xFFFFFFFF, 0 },
+       { 0x01F1FFF7, 0x0, 0x01F1FFF7, 0 },
+       { 0xFFFFFFFE, 0x0, 0xFFFFFFFE, 0 },
+       { 0xFFFEFFE0, 0x0, 0xFFFEFFE0, 0 },
+       { 0x000000B7, 0x0, 0x000000B7, 0 },
+};
+
+static const void *r8a77965_get_pll_config(const u32 cpg_mode)
+{
+       return &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)];
+}
+
+static const struct cpg_mssr_info r8a77965_cpg_mssr_info = {
+       .core_clk               = r8a77965_core_clks,
+       .core_clk_size          = ARRAY_SIZE(r8a77965_core_clks),
+       .mod_clk                = r8a77965_mod_clks,
+       .mod_clk_size           = ARRAY_SIZE(r8a77965_mod_clks),
+       .mstp_table             = r8a77965_mstp_table,
+       .mstp_table_size        = ARRAY_SIZE(r8a77965_mstp_table),
+       .reset_node             = "renesas,r8a77965-rst",
+       .extalr_node            = "extalr",
+       .mod_clk_base           = MOD_CLK_BASE,
+       .clk_extal_id           = CLK_EXTAL,
+       .clk_extalr_id          = CLK_EXTALR,
+       .get_pll_config         = r8a77965_get_pll_config,
+};
+
+static const struct udevice_id r8a77965_clk_ids[] = {
+       {
+               .compatible     = "renesas,r8a77965-cpg-mssr",
+               .data           = (ulong)&r8a77965_cpg_mssr_info,
+       },
+       { }
+};
+
+U_BOOT_DRIVER(clk_r8a77965) = {
+       .name           = "clk_r8a77965",
+       .id             = UCLASS_CLK,
+       .of_match       = r8a77965_clk_ids,
+       .priv_auto_alloc_size = sizeof(struct gen3_clk_priv),
+       .ops            = &gen3_clk_ops,
+       .probe          = gen3_clk_probe,
+       .remove         = gen3_clk_remove,
+};
index 1198ec5cbfcd892ae8145a2db0c0a5216bf0665f..3168de20f91d61b3adc351e8396e75e3b519975c 100644 (file)
@@ -1,13 +1,13 @@
-// SPDX-License-Identifier: GPL-2.0+
+// SPDX-License-Identifier: GPL-2.0
 /*
- * Renesas R8A77990 CPG MSSR driver
+ * r8a77990 Clock Pulse Generator / Module Standby and Software Reset
  *
- * Copyright (C) 2017-2018 Marek Vasut <marek.vasut@gmail.com>
+ * Copyright (C) 2018 Renesas Electronics Corp.
  *
- * Based on the following driver from Linux kernel:
- * r8a7796 Clock Pulse Generator / Module Standby and Software Reset
+ * Based on r8a7795-cpg-mssr.c
  *
- * Copyright (C) 2016 Glider bvba
+ * Copyright (C) 2015 Glider bvba
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 
 #include <common.h>
@@ -44,6 +44,8 @@ enum clk_ids {
        CLK_S3,
        CLK_SDSRC,
        CLK_RPCSRC,
+       CLK_RINT,
+       CLK_OCO,
 
        /* Module Clocks */
        MOD_CLK_BASE
@@ -73,6 +75,10 @@ static const struct cpg_core_clk r8a77990_core_clks[] = {
        DEF_FIXED(".sdsrc",    CLK_SDSRC,          CLK_PLL1,       2, 1),
        DEF_FIXED(".rpcsrc",   CLK_RPCSRC,         CLK_PLL1,       2, 1),
 
+       DEF_DIV6_RO(".r",      CLK_RINT,           CLK_EXTAL, CPG_RCKCR, 32),
+
+       DEF_RATE(".oco",       CLK_OCO,            8 * 1000 * 1000),
+
        /* Core Clock Outputs */
        DEF_FIXED("za2",       R8A77990_CLK_ZA2,   CLK_PLL0D24,    1, 1),
        DEF_FIXED("za8",       R8A77990_CLK_ZA8,   CLK_PLL0D8,     1, 1),
@@ -103,10 +109,10 @@ static const struct cpg_core_clk r8a77990_core_clks[] = {
        DEF_FIXED("cl",        R8A77990_CLK_CL,    CLK_PLL1,      48, 1),
        DEF_FIXED("cp",        R8A77990_CLK_CP,    CLK_EXTAL,      2, 1),
        DEF_FIXED("cpex",      R8A77990_CLK_CPEX,  CLK_EXTAL,      4, 1),
-       DEF_FIXED("osc",       R8A77990_CLK_OSC,   CLK_EXTAL,    384, 1),
-       DEF_FIXED("r",         R8A77990_CLK_R,     CLK_EXTAL,   1536, 1),
 
-       DEF_GEN3_PE("s0d6c",   R8A77990_CLK_S0D6C, CLK_S0, 6, CLK_PE, 6),
+       DEF_DIV6_RO("osc",     R8A77990_CLK_OSC,   CLK_EXTAL, CPG_RCKCR,  8),
+
+       DEF_GEN3_PE("s0d6c",   R8A77990_CLK_S0D6C, CLK_S0, 6, CLK_PE, 2),
        DEF_GEN3_PE("s3d1c",   R8A77990_CLK_S3D1C, CLK_S3, 1, CLK_PE, 1),
        DEF_GEN3_PE("s3d2c",   R8A77990_CLK_S3D2C, CLK_S3, 2, CLK_PE, 2),
        DEF_GEN3_PE("s3d4c",   R8A77990_CLK_S3D4C, CLK_S3, 4, CLK_PE, 4),
@@ -114,6 +120,8 @@ static const struct cpg_core_clk r8a77990_core_clks[] = {
        DEF_DIV6P1("canfd",    R8A77990_CLK_CANFD, CLK_PLL0D6, 0x244),
        DEF_DIV6P1("csi0",     R8A77990_CLK_CSI0,  CLK_PLL1D2, 0x00c),
        DEF_DIV6P1("mso",      R8A77990_CLK_MSO,   CLK_PLL1D2, 0x014),
+
+       DEF_GEN3_RCKSEL("r",   R8A77990_CLK_R, CLK_RINT, 1, CLK_OCO, 61 * 4),
 };
 
 static const struct mssr_mod_clk r8a77990_mod_clks[] = {
@@ -178,12 +186,10 @@ static const struct mssr_mod_clk r8a77990_mod_clks[] = {
        DEF_MOD("ehci0",                 703,   R8A77990_CLK_S3D4),
        DEF_MOD("hsusb",                 704,   R8A77990_CLK_S3D4),
        DEF_MOD("csi40",                 716,   R8A77990_CLK_CSI0),
-       DEF_MOD("du1",                   723,   R8A77990_CLK_S2D1),
-       DEF_MOD("du0",                   724,   R8A77990_CLK_S2D1),
+       DEF_MOD("du1",                   723,   R8A77990_CLK_S1D1),
+       DEF_MOD("du0",                   724,   R8A77990_CLK_S1D1),
        DEF_MOD("lvds",                  727,   R8A77990_CLK_S2D1),
 
-       DEF_MOD("vin7",                  804,   R8A77990_CLK_S1D2),
-       DEF_MOD("vin6",                  805,   R8A77990_CLK_S1D2),
        DEF_MOD("vin5",                  806,   R8A77990_CLK_S1D2),
        DEF_MOD("vin4",                  807,   R8A77990_CLK_S1D2),
        DEF_MOD("etheravb",              812,   R8A77990_CLK_S3D2),
@@ -208,6 +214,7 @@ static const struct mssr_mod_clk r8a77990_mod_clks[] = {
        DEF_MOD("i2c1",                  930,   R8A77990_CLK_S3D2),
        DEF_MOD("i2c0",                  931,   R8A77990_CLK_S3D2),
 
+       DEF_MOD("i2c7",                 1003,   R8A77990_CLK_S3D2),
        DEF_MOD("ssi-all",              1005,   R8A77990_CLK_S3D4),
        DEF_MOD("ssi9",                 1006,   MOD_CLK_ID(1005)),
        DEF_MOD("ssi8",                 1007,   MOD_CLK_ID(1005)),
@@ -243,8 +250,8 @@ static const struct mssr_mod_clk r8a77990_mod_clks[] = {
 /*
  * MD19                EXTAL (MHz)     PLL0            PLL1            PLL3
  *--------------------------------------------------------------------
- * 0           48 x 1          x100/4          x100/3          x100/3
- * 1           48 x 1          x100/4          x100/3           x58/3
+ * 0           48 x 1          x100/1          x100/3          x100/3
+ * 1           48 x 1          x100/1          x100/3           x58/3
  */
 #define CPG_PLL_CONFIG_INDEX(md)       (((md) & BIT(19)) >> 19)
 
index e9c3aec96074a3bc0e8c943b9178a0692a6a4e63..1c793709822777ba5db3939cf186c0d585c7d978 100644 (file)
@@ -1,13 +1,13 @@
-// SPDX-License-Identifier: GPL-2.0+
+// SPDX-License-Identifier: GPL-2.0
 /*
- * Renesas R8A77995 CPG MSSR driver
+ * r8a77995 Clock Pulse Generator / Module Standby and Software Reset
  *
- * Copyright (C) 2017-2018 Marek Vasut <marek.vasut@gmail.com>
+ * Copyright (C) 2017 Glider bvba
  *
- * Based on the following driver from Linux kernel:
- * r8a7796 Clock Pulse Generator / Module Standby and Software Reset
+ * Based on r8a7795-cpg-mssr.c
  *
- * Copyright (C) 2016 Glider bvba
+ * Copyright (C) 2015 Glider bvba
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 
 #include <common.h>
@@ -21,7 +21,7 @@
 
 enum clk_ids {
        /* Core Clock Outputs exported to DT */
-       LAST_DT_CORE_CLK = R8A77995_CLK_CP,
+       LAST_DT_CORE_CLK = R8A77995_CLK_CPEX,
 
        /* External Input Clocks */
        CLK_EXTAL,
@@ -42,7 +42,8 @@ enum clk_ids {
        CLK_S3,
        CLK_SDSRC,
        CLK_RPCSRC,
-       CLK_SSPSRC,
+       CLK_RINT,
+       CLK_OCO,
 
        /* Module Clocks */
        MOD_CLK_BASE
@@ -70,6 +71,10 @@ static const struct cpg_core_clk r8a77995_core_clks[] = {
        DEF_FIXED(".sdsrc",    CLK_SDSRC,          CLK_PLL1,       2, 1),
        DEF_FIXED(".rpcsrc",   CLK_RPCSRC,         CLK_PLL1,       2, 1),
 
+       DEF_DIV6_RO(".r",      CLK_RINT,           CLK_EXTAL, CPG_RCKCR, 32),
+
+       DEF_RATE(".oco",       CLK_OCO,            8 * 1000 * 1000),
+
        /* Core Clock Outputs */
        DEF_FIXED("z2",        R8A77995_CLK_Z2,    CLK_PLL0D3,     1, 1),
        DEF_FIXED("ztr",       R8A77995_CLK_ZTR,   CLK_PLL1,       6, 1),
@@ -88,8 +93,9 @@ static const struct cpg_core_clk r8a77995_core_clks[] = {
 
        DEF_FIXED("cl",        R8A77995_CLK_CL,    CLK_PLL1,      48, 1),
        DEF_FIXED("cp",        R8A77995_CLK_CP,    CLK_EXTAL,      2, 1),
-       DEF_FIXED("osc",       R8A77995_CLK_OSC,   CLK_EXTAL,    384, 1),
-       DEF_FIXED("r",         R8A77995_CLK_R,     CLK_EXTAL,   1536, 1),
+       DEF_FIXED("cpex",      R8A77995_CLK_CPEX,  CLK_EXTAL,      4, 1),
+
+       DEF_DIV6_RO("osc",     R8A77995_CLK_OSC,   CLK_EXTAL, CPG_RCKCR,  8),
 
        DEF_GEN3_RPC("rpc",    R8A77995_CLK_RPC,   CLK_RPCSRC,    0x238),
 
@@ -99,6 +105,11 @@ static const struct cpg_core_clk r8a77995_core_clks[] = {
        DEF_GEN3_PE("s3d4c",   R8A77995_CLK_S3D4C, CLK_S3, 4, CLK_PE, 4),
 
        DEF_GEN3_SD("sd0",     R8A77995_CLK_SD0,   CLK_SDSRC,     0x268),
+
+       DEF_DIV6P1("canfd",    R8A77995_CLK_CANFD, CLK_PLL0D3,    0x244),
+       DEF_DIV6P1("mso",      R8A77995_CLK_MSO,   CLK_PLL1D2,    0x014),
+
+       DEF_GEN3_RCKSEL("r",   R8A77995_CLK_R, CLK_RINT, 1, CLK_OCO, 61 * 4),
 };
 
 static const struct mssr_mod_clk r8a77995_mod_clks[] = {
@@ -124,7 +135,7 @@ static const struct mssr_mod_clk r8a77995_mod_clks[] = {
        DEF_MOD("usb-dmac1",             331,   R8A77995_CLK_S3D1),
        DEF_MOD("rwdt",                  402,   R8A77995_CLK_R),
        DEF_MOD("intc-ex",               407,   R8A77995_CLK_CP),
-       DEF_MOD("intc-ap",               408,   R8A77995_CLK_S3D1),
+       DEF_MOD("intc-ap",               408,   R8A77995_CLK_S1D2),
        DEF_MOD("audmac0",               502,   R8A77995_CLK_S3D1),
        DEF_MOD("hscif3",                517,   R8A77995_CLK_S3D1C),
        DEF_MOD("hscif0",                520,   R8A77995_CLK_S3D1C),
@@ -138,12 +149,9 @@ static const struct mssr_mod_clk r8a77995_mod_clks[] = {
        DEF_MOD("vspbs",                 627,   R8A77995_CLK_S0D1),
        DEF_MOD("ehci0",                 703,   R8A77995_CLK_S3D2),
        DEF_MOD("hsusb",                 704,   R8A77995_CLK_S3D2),
-       DEF_MOD("du1",                   723,   R8A77995_CLK_S2D1),
-       DEF_MOD("du0",                   724,   R8A77995_CLK_S2D1),
+       DEF_MOD("du1",                   723,   R8A77995_CLK_S1D1),
+       DEF_MOD("du0",                   724,   R8A77995_CLK_S1D1),
        DEF_MOD("lvds",                  727,   R8A77995_CLK_S2D1),
-       DEF_MOD("vin7",                  804,   R8A77995_CLK_S1D2),
-       DEF_MOD("vin6",                  805,   R8A77995_CLK_S1D2),
-       DEF_MOD("vin5",                  806,   R8A77995_CLK_S1D2),
        DEF_MOD("vin4",                  807,   R8A77995_CLK_S1D2),
        DEF_MOD("etheravb",              812,   R8A77995_CLK_S3D2),
        DEF_MOD("imr0",                  823,   R8A77995_CLK_S1D2),
@@ -182,14 +190,14 @@ static const struct mssr_mod_clk r8a77995_mod_clks[] = {
  * MD19                EXTAL (MHz)     PLL0            PLL1            PLL3
  *--------------------------------------------------------------------
  * 0           48 x 1          x250/4          x100/3          x100/3
- * 1           48 x 1          x250/4          x100/3          x116/6
+ * 1           48 x 1          x250/4          x100/3          x58/3
  */
 #define CPG_PLL_CONFIG_INDEX(md)       (((md) & BIT(19)) >> 19)
 
 static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[2] = {
        /* EXTAL div    PLL1 mult/div   PLL3 mult/div */
        { 1,            100,    3,      100,    3,      },
-       { 1,            100,    3,      116,    6,      },
+       { 1,            100,    3,      58,     3,      },
 };
 
 static const struct mstp_stop_table r8a77995_mstp_table[] = {
index 58e71f363c895e957c387f30f0a85ae6e7f2527f..7b1b2422155917e96467b3debe48dadd1aa994c3 100644 (file)
@@ -19,21 +19,43 @@ enum rcar_gen3_clk_types {
        CLK_TYPE_GEN3_PLL3,
        CLK_TYPE_GEN3_PLL4,
        CLK_TYPE_GEN3_SD,
-       CLK_TYPE_GEN3_RPC,
        CLK_TYPE_GEN3_R,
-       CLK_TYPE_GEN3_PE,
+       CLK_TYPE_GEN3_MDSEL,    /* Select parent/divider using mode pin */
+       CLK_TYPE_GEN3_Z,
        CLK_TYPE_GEN3_Z2,
+       CLK_TYPE_GEN3_OSC,      /* OSC EXTAL predivider and fixed divider */
+       CLK_TYPE_GEN3_RCKSEL,   /* Select parent/divider using RCKCR.CKSEL */
+       CLK_TYPE_GEN3_RPCSRC,
+       CLK_TYPE_GEN3_RPC,
+       CLK_TYPE_GEN3_RPCD2,
+
+       /* SoC specific definitions start here */
+       CLK_TYPE_GEN3_SOC_BASE,
 };
 
 #define DEF_GEN3_SD(_name, _id, _parent, _offset)      \
        DEF_BASE(_name, _id, CLK_TYPE_GEN3_SD, _parent, .offset = _offset)
+
 #define DEF_GEN3_RPC(_name, _id, _parent, _offset)     \
        DEF_BASE(_name, _id, CLK_TYPE_GEN3_RPC, _parent, .offset = _offset)
+
+#define DEF_GEN3_MDSEL(_name, _id, _md, _parent0, _div0, _parent1, _div1) \
+       DEF_BASE(_name, _id, CLK_TYPE_GEN3_MDSEL,       \
+                (_parent0) << 16 | (_parent1),         \
+                .div = (_div0) << 16 | (_div1), .offset = _md)
+
 #define DEF_GEN3_PE(_name, _id, _parent_sscg, _div_sscg, _parent_clean, \
                    _div_clean) \
-       DEF_BASE(_name, _id, CLK_TYPE_GEN3_PE,                  \
-                (_parent_sscg) << 16 | (_parent_clean),        \
-                .div = (_div_sscg) << 16 | (_div_clean))
+       DEF_GEN3_MDSEL(_name, _id, 12, _parent_sscg, _div_sscg, \
+                      _parent_clean, _div_clean)
+
+#define DEF_GEN3_OSC(_name, _id, _parent, _div)                \
+       DEF_BASE(_name, _id, CLK_TYPE_GEN3_OSC, _parent, .div = _div)
+
+#define DEF_GEN3_RCKSEL(_name, _id, _parent0, _div0, _parent1, _div1) \
+       DEF_BASE(_name, _id, CLK_TYPE_GEN3_RCKSEL,      \
+                (_parent0) << 16 | (_parent1), .div = (_div0) << 16 | (_div1))
+
 
 struct rcar_gen3_cpg_pll_config {
        u8 extal_div;
@@ -41,8 +63,10 @@ struct rcar_gen3_cpg_pll_config {
        u8 pll1_div;
        u8 pll3_mult;
        u8 pll3_div;
+       u8 osc_prediv;
 };
 
+#define CPG_RPCCKCR    0x238
 #define CPG_RCKCR      0x240
 
 struct gen3_clk_priv {
index bad393878511c88d6343d28f8a96d9dee61e1e77..5b7012d37c633b52f3a83ad70b0cc46c7d6bf19d 100644 (file)
@@ -57,6 +57,7 @@ enum clk_types {
        CLK_TYPE_FF,            /* Fixed Factor Clock */
        CLK_TYPE_DIV6P1,        /* DIV6 Clock with 1 parent clock */
        CLK_TYPE_DIV6_RO,       /* DIV6 Clock read only with extra divisor */
+       CLK_TYPE_FR,            /* Fixed Rate Clock */
 
        /* Custom definitions start here */
        CLK_TYPE_CUSTOM,
@@ -75,6 +76,8 @@ enum clk_types {
        DEF_BASE(_name, _id, CLK_TYPE_DIV6P1, _parent, .offset = _offset)
 #define DEF_DIV6_RO(_name, _id, _parent, _offset, _div)        \
        DEF_BASE(_name, _id, CLK_TYPE_DIV6_RO, _parent, .offset = _offset, .div = _div, .mult = 1)
+#define DEF_RATE(_name, _id, _rate)    \
+       DEF_TYPE(_name, _id, CLK_TYPE_FR, .mult = _rate)
 
 /*
  * Definitions of Module Clocks
index 30beac98bb88eb998ed03e65b61027c6fbfea786..44abc4f536d2c651fa3c34de20eb95cbff0a5ad0 100644 (file)
@@ -62,7 +62,6 @@ static struct ccu_reset r40_resets[] = {
        [RST_BUS_MMC1]          = RESET(0x2c0, BIT(9)),
        [RST_BUS_MMC2]          = RESET(0x2c0, BIT(10)),
        [RST_BUS_MMC3]          = RESET(0x2c0, BIT(11)),
-       [RST_BUS_GMAC]          = RESET(0x2c0, BIT(17)),
        [RST_BUS_SPI0]          = RESET(0x2c0, BIT(20)),
        [RST_BUS_SPI1]          = RESET(0x2c0, BIT(21)),
        [RST_BUS_SPI2]          = RESET(0x2c0, BIT(22)),
@@ -75,6 +74,8 @@ static struct ccu_reset r40_resets[] = {
        [RST_BUS_OHCI1]         = RESET(0x2c0, BIT(30)),
        [RST_BUS_OHCI2]         = RESET(0x2c0, BIT(31)),
 
+       [RST_BUS_GMAC]          = RESET(0x2c4, BIT(17)),
+
        [RST_BUS_UART0]         = RESET(0x2d8, BIT(16)),
        [RST_BUS_UART1]         = RESET(0x2d8, BIT(17)),
        [RST_BUS_UART2]         = RESET(0x2d8, BIT(18)),
index 0e584c12dc88323d60273780f48b7fc83521d1d1..785f5c3acf7a7bb06a7986fdcdac699c71eca33f 100644 (file)
@@ -254,14 +254,13 @@ int ofnode_read_size(ofnode node, const char *propname)
 fdt_addr_t ofnode_get_addr_index(ofnode node, int index)
 {
        int na, ns;
-       fdt_size_t size;
 
        if (ofnode_is_np(node)) {
                const __be32 *prop_val;
                uint flags;
 
                prop_val = of_get_address(ofnode_to_np(node), index,
-                                         (u64 *)&size, &flags);
+                                         NULL, &flags);
                if (!prop_val)
                        return FDT_ADDR_T_NONE;
 
@@ -278,7 +277,7 @@ fdt_addr_t ofnode_get_addr_index(ofnode node, int index)
                ns = ofnode_read_simple_size_cells(ofnode_get_parent(node));
                return fdtdec_get_addr_size_fixed(gd->fdt_blob,
                                                  ofnode_to_offset(node), "reg",
-                                                 index, na, ns, &size, true);
+                                                 index, na, ns, NULL, true);
        }
 
        return FDT_ADDR_T_NONE;
@@ -700,18 +699,18 @@ int ofnode_read_simple_size_cells(ofnode node)
 
 bool ofnode_pre_reloc(ofnode node)
 {
+#if defined(CONFIG_SPL_BUILD) || defined(CONFIG_TPL_BUILD)
+       /* for SPL and TPL the remaining nodes after the fdtgrep 1st pass
+        * had property dm-pre-reloc or u-boot,dm-spl/tpl.
+        * They are removed in final dtb (fdtgrep 2nd pass)
+        */
+       return true;
+#else
        if (ofnode_read_bool(node, "u-boot,dm-pre-reloc"))
                return true;
        if (ofnode_read_bool(node, "u-boot,dm-pre-proper"))
                return true;
 
-#ifdef CONFIG_TPL_BUILD
-       if (ofnode_read_bool(node, "u-boot,dm-tpl"))
-               return true;
-#elif defined(CONFIG_SPL_BUILD)
-       if (ofnode_read_bool(node, "u-boot,dm-spl"))
-               return true;
-#else
        /*
         * In regular builds individual spl and tpl handling both
         * count as handled pre-relocation for later second init.
@@ -719,9 +718,9 @@ bool ofnode_pre_reloc(ofnode node)
        if (ofnode_read_bool(node, "u-boot,dm-spl") ||
            ofnode_read_bool(node, "u-boot,dm-tpl"))
                return true;
-#endif
 
        return false;
+#endif
 }
 
 int ofnode_read_resource(ofnode node, uint index, struct resource *res)
index afac6d6e37ee3247ca59f7e23edf6e85673b9276..5bb38e329cb847c3201e5a5c0f925f3a99856364 100644 (file)
@@ -57,18 +57,64 @@ static int syscon_pre_probe(struct udevice *dev)
 #endif
 }
 
+static int syscon_probe_by_ofnode(ofnode node, struct udevice **devp)
+{
+       struct udevice *dev, *parent;
+       int ret;
+
+       /* found node with "syscon" compatible, not bounded to SYSCON UCLASS */
+       if (!ofnode_device_is_compatible(node, "syscon")) {
+               dev_dbg(dev, "invalid compatible for syscon device\n");
+               return -EINVAL;
+       }
+
+       /* bound to driver with same ofnode or to root if not found */
+       if (device_find_global_by_ofnode(node, &parent))
+               parent = dm_root();
+
+       /* force bound to syscon class */
+       ret = device_bind_driver_to_node(parent, "syscon",
+                                        ofnode_get_name(node),
+                                        node, &dev);
+       if (ret) {
+               dev_dbg(dev, "unable to bound syscon device\n");
+               return ret;
+       }
+       ret = device_probe(dev);
+       if (ret) {
+               dev_dbg(dev, "unable to probe syscon device\n");
+               return ret;
+       }
+
+       *devp = dev;
+       return 0;
+}
+
 struct regmap *syscon_regmap_lookup_by_phandle(struct udevice *dev,
                                               const char *name)
 {
        struct udevice *syscon;
        struct regmap *r;
+       u32 phandle;
+       ofnode node;
        int err;
 
        err = uclass_get_device_by_phandle(UCLASS_SYSCON, dev,
                                           name, &syscon);
        if (err) {
-               dev_dbg(dev, "unable to find syscon device\n");
-               return ERR_PTR(err);
+               /* found node with "syscon" compatible, not bounded to SYSCON */
+               err = ofnode_read_u32(dev_ofnode(dev), name, &phandle);
+               if (err)
+                       return ERR_PTR(err);
+
+               node = ofnode_get_by_phandle(phandle);
+               if (!ofnode_valid(node)) {
+                       dev_dbg(dev, "unable to find syscon device\n");
+                       return ERR_PTR(-EINVAL);
+               }
+               err = syscon_probe_by_ofnode(node, &syscon);
+               if (err)
+                       return ERR_PTR(-ENODEV);
        }
 
        r = syscon_get_regmap(syscon);
@@ -152,29 +198,18 @@ U_BOOT_DRIVER(generic_syscon) = {
  */
 struct regmap *syscon_node_to_regmap(ofnode node)
 {
-       struct udevice *dev, *parent;
-       int ret;
-
-       if (!uclass_get_device_by_ofnode(UCLASS_SYSCON, node, &dev))
-               return syscon_get_regmap(dev);
-
-       if (!ofnode_device_is_compatible(node, "syscon"))
-               return ERR_PTR(-EINVAL);
+       struct udevice *dev;
+       struct regmap *r;
 
-       /* bound to driver with same ofnode or to root if not found */
-       if (device_find_global_by_ofnode(node, &parent))
-               parent = dm_root();
+       if (uclass_get_device_by_ofnode(UCLASS_SYSCON, node, &dev))
+               if (syscon_probe_by_ofnode(node, &dev))
+                       return ERR_PTR(-ENODEV);
 
-       /* force bound to syscon class */
-       ret = device_bind_driver_to_node(parent, "syscon",
-                                        ofnode_get_name(node),
-                                        node, &dev);
-       if (ret)
-               return ERR_PTR(ret);
-
-       ret = device_probe(dev);
-       if (ret)
-               return ERR_PTR(ret);
+       r = syscon_get_regmap(dev);
+       if (!r) {
+               dev_dbg(dev, "unable to find regmap\n");
+               return ERR_PTR(-ENODEV);
+       }
 
-       return syscon_get_regmap(dev);
+       return r;
 }
index 27a68487034e182331ece2ed2244ebf685bd5a79..96e47dc70709d473c134b4dc6427bc98035ff427 100644 (file)
@@ -31,42 +31,18 @@ int list_count_items(struct list_head *head)
        return count;
 }
 
-bool dm_fdt_pre_reloc(const void *blob, int offset)
-{
-       if (fdt_getprop(blob, offset, "u-boot,dm-pre-reloc", NULL))
-               return true;
-
-#ifdef CONFIG_TPL_BUILD
-       if (fdt_getprop(blob, offset, "u-boot,dm-tpl", NULL))
-               return true;
-#elif defined(CONFIG_SPL_BUILD)
-       if (fdt_getprop(blob, offset, "u-boot,dm-spl", NULL))
-               return true;
-#else
-       /*
-        * In regular builds individual spl and tpl handling both
-        * count as handled pre-relocation for later second init.
-        */
-       if (fdt_getprop(blob, offset, "u-boot,dm-spl", NULL) ||
-           fdt_getprop(blob, offset, "u-boot,dm-tpl", NULL))
-               return true;
-#endif
-
-       return false;
-}
-
 bool dm_ofnode_pre_reloc(ofnode node)
 {
+#if defined(CONFIG_SPL_BUILD) || defined(CONFIG_TPL_BUILD)
+       /* for SPL and TPL the remaining nodes after the fdtgrep 1st pass
+        * had property dm-pre-reloc or u-boot,dm-spl/tpl.
+        * They are removed in final dtb (fdtgrep 2nd pass)
+        */
+       return true;
+#else
        if (ofnode_read_bool(node, "u-boot,dm-pre-reloc"))
                return true;
 
-#ifdef CONFIG_TPL_BUILD
-       if (ofnode_read_bool(node, "u-boot,dm-tpl"))
-               return true;
-#elif defined(CONFIG_SPL_BUILD)
-       if (ofnode_read_bool(node, "u-boot,dm-spl"))
-               return true;
-#else
        /*
         * In regular builds individual spl and tpl handling both
         * count as handled pre-relocation for later second init.
@@ -74,7 +50,7 @@ bool dm_ofnode_pre_reloc(ofnode node)
        if (ofnode_read_bool(node, "u-boot,dm-spl") ||
            ofnode_read_bool(node, "u-boot,dm-tpl"))
                return true;
-#endif
 
        return false;
+#endif
 }
index 2b28a97f6e7fb866fcfeea65e97eeef4065882ef..8f60b56eb84886f534e663373ffff2e392612e1d 100644 (file)
@@ -1,5 +1,7 @@
 config ALTERA_SDRAM
        bool "SoCFPGA DDR SDRAM driver"
        depends on TARGET_SOCFPGA_GEN5 || TARGET_SOCFPGA_ARRIA10
+       select RAM if TARGET_SOCFPGA_GEN5
+       select SPL_RAM if TARGET_SOCFPGA_GEN5
        help
          Enable DDR SDRAM controller for the SoCFPGA devices.
index 821060459cf143af860ef749666f71af9f90772c..fcd89b619dbe2bf5e7ab379170891c3bb52e21c3 100644 (file)
@@ -3,14 +3,30 @@
  * Copyright Altera Corporation (C) 2014-2015
  */
 #include <common.h>
+#include <dm.h>
 #include <errno.h>
 #include <div64.h>
+#include <ram.h>
+#include <reset.h>
 #include <watchdog.h>
 #include <asm/arch/fpga_manager.h>
+#include <asm/arch/reset_manager.h>
 #include <asm/arch/sdram.h>
 #include <asm/arch/system_manager.h>
 #include <asm/io.h>
 
+#include "sequencer.h"
+
+#ifdef CONFIG_SPL_BUILD
+
+struct altera_gen5_sdram_priv {
+       struct ram_info info;
+};
+
+struct altera_gen5_sdram_platdata {
+       struct socfpga_sdr *sdr;
+};
+
 struct sdram_prot_rule {
        u32     sdram_start;    /* SDRAM start address */
        u32     sdram_end;      /* SDRAM end address */
@@ -26,8 +42,8 @@ struct sdram_prot_rule {
 
 static struct socfpga_system_manager *sysmgr_regs =
        (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-static struct socfpga_sdr_ctrl *sdr_ctrl =
-       (struct socfpga_sdr_ctrl *)SDR_CTRLGRP_ADDRESS;
+
+static unsigned long sdram_calculate_size(struct socfpga_sdr_ctrl *sdr_ctrl);
 
 /**
  * get_errata_rows() - Up the number of DRAM rows to cover entire address space
@@ -104,7 +120,8 @@ static int get_errata_rows(const struct socfpga_sdram_config *cfg)
 }
 
 /* SDRAM protection rules vary from 0-19, a total of 20 rules. */
-static void sdram_set_rule(struct sdram_prot_rule *prule)
+static void sdram_set_rule(struct socfpga_sdr_ctrl *sdr_ctrl,
+                          struct sdram_prot_rule *prule)
 {
        u32 lo_addr_bits;
        u32 hi_addr_bits;
@@ -141,7 +158,8 @@ static void sdram_set_rule(struct sdram_prot_rule *prule)
        writel(0, &sdr_ctrl->prot_rule_rdwr);
 }
 
-static void sdram_get_rule(struct sdram_prot_rule *prule)
+static void sdram_get_rule(struct socfpga_sdr_ctrl *sdr_ctrl,
+                          struct sdram_prot_rule *prule)
 {
        u32 addr;
        u32 id;
@@ -172,7 +190,8 @@ static void sdram_get_rule(struct sdram_prot_rule *prule)
 }
 
 static void
-sdram_set_protection_config(const u32 sdram_start, const u32 sdram_end)
+sdram_set_protection_config(struct socfpga_sdr_ctrl *sdr_ctrl,
+                           const u32 sdram_start, const u32 sdram_end)
 {
        struct sdram_prot_rule rule;
        int rules;
@@ -185,7 +204,7 @@ sdram_set_protection_config(const u32 sdram_start, const u32 sdram_end)
 
        for (rules = 0; rules < 20; rules++) {
                rule.rule = rules;
-               sdram_set_rule(&rule);
+               sdram_set_rule(sdr_ctrl, &rule);
        }
 
        /* new rule: accept SDRAM */
@@ -200,13 +219,13 @@ sdram_set_protection_config(const u32 sdram_start, const u32 sdram_end)
        rule.rule = 0;
 
        /* set new rule */
-       sdram_set_rule(&rule);
+       sdram_set_rule(sdr_ctrl, &rule);
 
        /* default rule: reject everything */
        writel(0x3ff, &sdr_ctrl->protport_default);
 }
 
-static void sdram_dump_protection_config(void)
+static void sdram_dump_protection_config(struct socfpga_sdr_ctrl *sdr_ctrl)
 {
        struct sdram_prot_rule rule;
        int rules;
@@ -216,7 +235,7 @@ static void sdram_dump_protection_config(void)
 
        for (rules = 0; rules < 20; rules++) {
                rule.rule = rules;
-               sdram_get_rule(&rule);
+               sdram_get_rule(sdr_ctrl, &rule);
                debug("Rule %d, rules ...\n", rules);
                debug("    sdram start %x\n", rule.sdram_start);
                debug("    sdram end   %x\n", rule.sdram_end);
@@ -322,7 +341,8 @@ static u32 sdr_get_addr_rw(const struct socfpga_sdram_config *cfg)
  *
  * This function loads the register values into the SDRAM controller block.
  */
-static void sdr_load_regs(const struct socfpga_sdram_config *cfg)
+static void sdr_load_regs(struct socfpga_sdr_ctrl *sdr_ctrl,
+                         const struct socfpga_sdram_config *cfg)
 {
        const u32 ctrl_cfg = sdr_get_ctrlcfg(cfg);
        const u32 dram_addrw = sdr_get_addr_rw(cfg);
@@ -426,7 +446,8 @@ static void sdr_load_regs(const struct socfpga_sdram_config *cfg)
  *
  * Initialize the SDRAM MMR.
  */
-int sdram_mmr_init_full(unsigned int sdr_phy_reg)
+int sdram_mmr_init_full(struct socfpga_sdr_ctrl *sdr_ctrl,
+                       unsigned int sdr_phy_reg)
 {
        const struct socfpga_sdram_config *cfg = socfpga_get_sdram_config();
        const unsigned int rows =
@@ -436,7 +457,7 @@ int sdram_mmr_init_full(unsigned int sdr_phy_reg)
 
        writel(rows, &sysmgr_regs->iswgrp_handoff[4]);
 
-       sdr_load_regs(cfg);
+       sdr_load_regs(sdr_ctrl, cfg);
 
        /* saving this value to SYSMGR.ISWGRP.HANDOFF.FPGA2SDR */
        writel(cfg->fpgaport_rst, &sysmgr_regs->iswgrp_handoff[3]);
@@ -459,9 +480,10 @@ int sdram_mmr_init_full(unsigned int sdr_phy_reg)
                        SDR_CTRLGRP_STATICCFG_APPLYCFG_MASK,
                        1 << SDR_CTRLGRP_STATICCFG_APPLYCFG_LSB);
 
-       sdram_set_protection_config(0, sdram_calculate_size() - 1);
+       sdram_set_protection_config(sdr_ctrl, 0,
+                                   sdram_calculate_size(sdr_ctrl) - 1);
 
-       sdram_dump_protection_config();
+       sdram_dump_protection_config(sdr_ctrl);
 
        return 0;
 }
@@ -472,7 +494,7 @@ int sdram_mmr_init_full(unsigned int sdr_phy_reg)
  * Calculate SDRAM device size based on SDRAM controller parameters.
  * Size is specified in bytes.
  */
-unsigned long sdram_calculate_size(void)
+static unsigned long sdram_calculate_size(struct socfpga_sdr_ctrl *sdr_ctrl)
 {
        unsigned long temp;
        unsigned long row, bank, col, cs, width;
@@ -534,3 +556,94 @@ unsigned long sdram_calculate_size(void)
 
        return temp;
 }
+
+static int altera_gen5_sdram_ofdata_to_platdata(struct udevice *dev)
+{
+       struct altera_gen5_sdram_platdata *plat = dev->platdata;
+
+       plat->sdr = (struct socfpga_sdr *)devfdt_get_addr_index(dev, 0);
+       if (!plat->sdr)
+               return -ENODEV;
+
+       return 0;
+}
+
+static int altera_gen5_sdram_probe(struct udevice *dev)
+{
+       int ret;
+       unsigned long sdram_size;
+       struct altera_gen5_sdram_platdata *plat = dev->platdata;
+       struct altera_gen5_sdram_priv *priv = dev_get_priv(dev);
+       struct socfpga_sdr_ctrl *sdr_ctrl = &plat->sdr->sdr_ctrl;
+       struct reset_ctl_bulk resets;
+
+       ret = reset_get_bulk(dev, &resets);
+       if (ret) {
+               dev_err(dev, "Can't get reset: %d\n", ret);
+               return -ENODEV;
+       }
+       reset_deassert_bulk(&resets);
+
+       if (sdram_mmr_init_full(sdr_ctrl, 0xffffffff) != 0) {
+               puts("SDRAM init failed.\n");
+               goto failed;
+       }
+
+       debug("SDRAM: Calibrating PHY\n");
+       /* SDRAM calibration */
+       if (sdram_calibration_full(plat->sdr) == 0) {
+               puts("SDRAM calibration failed.\n");
+               goto failed;
+       }
+
+       sdram_size = sdram_calculate_size(sdr_ctrl);
+       debug("SDRAM: %ld MiB\n", sdram_size >> 20);
+
+       /* Sanity check ensure correct SDRAM size specified */
+       if (get_ram_size(0, sdram_size) != sdram_size) {
+               puts("SDRAM size check failed!\n");
+               goto failed;
+       }
+
+       priv->info.base = 0;
+       priv->info.size = sdram_size;
+
+       return 0;
+
+failed:
+       reset_release_bulk(&resets);
+       return -ENODEV;
+}
+
+static int altera_gen5_sdram_get_info(struct udevice *dev,
+                                     struct ram_info *info)
+{
+       struct altera_gen5_sdram_priv *priv = dev_get_priv(dev);
+
+       info->base = priv->info.base;
+       info->size = priv->info.size;
+
+       return 0;
+}
+
+static struct ram_ops altera_gen5_sdram_ops = {
+       .get_info = altera_gen5_sdram_get_info,
+};
+
+static const struct udevice_id altera_gen5_sdram_ids[] = {
+       { .compatible = "altr,sdr-ctl" },
+       { /* sentinel */ }
+};
+
+U_BOOT_DRIVER(altera_gen5_sdram) = {
+       .name = "altr_sdr_ctl",
+       .id = UCLASS_RAM,
+       .of_match = altera_gen5_sdram_ids,
+       .ops = &altera_gen5_sdram_ops,
+       .ofdata_to_platdata = altera_gen5_sdram_ofdata_to_platdata,
+       .platdata_auto_alloc_size = sizeof(struct altera_gen5_sdram_platdata),
+       .probe = altera_gen5_sdram_probe,
+       .priv_auto_alloc_size = sizeof(struct altera_gen5_sdram_priv),
+};
+
+#endif /* CONFIG_SPL_BUILD */
index a48567c109375d34e034d19ec833d9a0343e0670..e4d4a02ca2c3da8dccfdd3f0347c2149991aca47 100644 (file)
@@ -7,12 +7,14 @@
 #include <common.h>
 #include <errno.h>
 #include <div64.h>
+#include <fdtdec.h>
 #include <asm/io.h>
 #include <wait_bit.h>
 #include <asm/arch/firewall_s10.h>
 #include <asm/arch/sdram_s10.h>
 #include <asm/arch/system_manager.h>
 #include <asm/arch/reset_manager.h>
+#include <linux/sizes.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -21,6 +23,8 @@ static const struct socfpga_system_manager *sysmgr_regs =
 
 #define DDR_CONFIG(A, B, C, R) (((A) << 24) | ((B) << 16) | ((C) << 8) | (R))
 
+#define PGTABLE_OFF    0x4000
+
 /* The followring are the supported configurations */
 u32 ddr_config[] = {
        /* DDR_CONFIG(Address order,Bank,Column,Row) */
@@ -134,6 +138,108 @@ static int poll_hmc_clock_status(void)
                                 SYSMGR_HMC_CLK_STATUS_MSK, true, 1000, false);
 }
 
+static void sdram_clear_mem(phys_addr_t addr, phys_size_t size)
+{
+       phys_size_t i;
+
+       if (addr % CONFIG_SYS_CACHELINE_SIZE) {
+               printf("DDR: address 0x%llx is not cacheline size aligned.\n",
+                      addr);
+               hang();
+       }
+
+       if (size % CONFIG_SYS_CACHELINE_SIZE) {
+               printf("DDR: size 0x%llx is not multiple of cacheline size\n",
+                      size);
+               hang();
+       }
+
+       /* Use DC ZVA instruction to clear memory to zeros by a cache line */
+       for (i = 0; i < size; i = i + CONFIG_SYS_CACHELINE_SIZE) {
+               asm volatile("dc zva, %0"
+                    :
+                    : "r"(addr)
+                    : "memory");
+               addr += CONFIG_SYS_CACHELINE_SIZE;
+       }
+}
+
+static void sdram_init_ecc_bits(bd_t *bd)
+{
+       phys_size_t size, size_init;
+       phys_addr_t start_addr;
+       int bank = 0;
+       unsigned int start = get_timer(0);
+
+       icache_enable();
+
+       start_addr = bd->bi_dram[0].start;
+       size = bd->bi_dram[0].size;
+
+       /* Initialize small block for page table */
+       memset((void *)start_addr, 0, PGTABLE_SIZE + PGTABLE_OFF);
+       gd->arch.tlb_addr = start_addr + PGTABLE_OFF;
+       gd->arch.tlb_size = PGTABLE_SIZE;
+       start_addr += PGTABLE_SIZE + PGTABLE_OFF;
+       size -= (PGTABLE_OFF + PGTABLE_SIZE);
+       dcache_enable();
+
+       while (1) {
+               while (size) {
+                       size_init = min((phys_addr_t)SZ_1G, (phys_addr_t)size);
+                       sdram_clear_mem(start_addr, size_init);
+                       size -= size_init;
+                       start_addr += size_init;
+                       WATCHDOG_RESET();
+               }
+
+               bank++;
+               if (bank >= CONFIG_NR_DRAM_BANKS)
+                       break;
+
+               start_addr = bd->bi_dram[bank].start;
+               size = bd->bi_dram[bank].size;
+       }
+
+       dcache_disable();
+       icache_disable();
+
+       printf("SDRAM-ECC: Initialized success with %d ms\n",
+              (unsigned int)get_timer(start));
+}
+
+static void sdram_size_check(bd_t *bd)
+{
+       phys_size_t total_ram_check = 0;
+       phys_size_t ram_check = 0;
+       phys_addr_t start = 0;
+       int bank;
+
+       /* Sanity check ensure correct SDRAM size specified */
+       debug("DDR: Running SDRAM size sanity check\n");
+
+       for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
+               start = bd->bi_dram[bank].start;
+               while (ram_check < bd->bi_dram[bank].size) {
+                       ram_check += get_ram_size((void *)(start + ram_check),
+                                                (phys_size_t)SZ_1G);
+               }
+               total_ram_check += ram_check;
+               ram_check = 0;
+       }
+
+       /* If the ram_size is 2GB smaller, we can assume the IO space is
+        * not mapped in.  gd->ram_size is the actual size of the dram
+        * not the accessible size.
+        */
+       if (total_ram_check != gd->ram_size) {
+               puts("DDR: SDRAM size check failed!\n");
+               hang();
+       }
+
+       debug("DDR: SDRAM size check passed!\n");
+}
+
 /**
  * sdram_mmr_init_full() - Function to initialize SDRAM MMR
  *
@@ -144,6 +250,8 @@ int sdram_mmr_init_full(unsigned int unused)
        u32 update_value, io48_value, ddrioctl;
        u32 i;
        int ret;
+       phys_size_t hw_size;
+       bd_t bd = {0};
 
        /* Enable access to DDR from CPU master */
        clrbits_le32(CCU_REG_ADDR(CCU_CPU0_MPRT_ADBASE_DDRREG),
@@ -335,9 +443,22 @@ int sdram_mmr_init_full(unsigned int unused)
        unsigned long long size = sdram_calculate_size();
        /* If the size is invalid, use default Config size */
        if (size <= 0)
-               gd->ram_size = PHYS_SDRAM_1_SIZE;
+               hw_size = PHYS_SDRAM_1_SIZE;
        else
-               gd->ram_size = size;
+               hw_size = size;
+
+       /* Get bank configuration from devicetree */
+       ret = fdtdec_decode_ram_size(gd->fdt_blob, NULL, 0, NULL,
+                                    (phys_size_t *)&gd->ram_size, &bd);
+       if (ret) {
+               puts("DDR: Failed to decode memory node\n");
+               return -1;
+       }
+
+       if (gd->ram_size != hw_size)
+               printf("DDR: Warning: DRAM size from device tree mismatch with hardware.\n");
+
+       printf("DDR: %lld MiB\n", gd->ram_size >> 20);
 
        /* Enable or disable the SDRAM ECC */
        if (CTRLCFG1_CFG_CTRL_EN_ECC(ctrlcfg1)) {
@@ -351,6 +472,15 @@ int sdram_mmr_init_full(unsigned int unused)
                setbits_le32(SOCFPGA_SDR_ADDRESS + ECCCTRL2,
                             (DDR_HMC_ECCCTL2_RMW_EN_SET_MSK |
                              DDR_HMC_ECCCTL2_AWB_EN_SET_MSK));
+               writel(DDR_HMC_ERRINTEN_INTMASK,
+                      SOCFPGA_SDR_ADDRESS + ERRINTENS);
+
+               /* Enable non-secure writes to HMC Adapter for SDRAM ECC */
+               writel(FW_HMC_ADAPTOR_MPU_MASK, FW_HMC_ADAPTOR_REG_ADDR);
+
+               /* Initialize memory content if not from warm reset */
+               if (!cpu_has_been_warmreset())
+                       sdram_init_ecc_bits(&bd);
        } else {
                clrbits_le32(SOCFPGA_SDR_ADDRESS + ECCCTRL1,
                             (DDR_HMC_ECCCTL_AWB_CNT_RST_SET_MSK |
@@ -361,6 +491,8 @@ int sdram_mmr_init_full(unsigned int unused)
                              DDR_HMC_ECCCTL2_AWB_EN_SET_MSK));
        }
 
+       sdram_size_check(&bd);
+
        debug("DDR: HMC init success\n");
        return 0;
 }
index 5e7a943b680c9b0a8776e064655c98c61d862768..0e4526288e2aaec22c56b09121381e78c3b4af03 100644 (file)
@@ -3705,12 +3705,19 @@ static void initialize_tracking(void)
               &sdr_reg_file->trk_rfsh);
 }
 
-int sdram_calibration_full(void)
+int sdram_calibration_full(struct socfpga_sdr *sdr)
 {
        struct param_type my_param;
        struct gbl_type my_gbl;
        u32 pass;
 
+       /*
+        * For size reasons, this file uses hard coded addresses.
+        * Check if we are called with the correct address.
+        */
+       if (sdr != (struct socfpga_sdr *)SOCFPGA_SDR_ADDRESS)
+               return -ENODEV;
+
        memset(&my_param, 0, sizeof(my_param));
        memset(&my_gbl, 0, sizeof(my_gbl));
 
index a5760b03a55bb0113cc8bfc89d2368088868b12d..d7f6935201fdad5210b9e0e4ee8528255eaa3bde 100644 (file)
@@ -223,4 +223,39 @@ struct socfpga_data_mgr {
        u32     mem_t_add;
        u32     t_rl_add;
 };
+
+/* This struct describes the controller @ SOCFPGA_SDR_ADDRESS */
+struct socfpga_sdr {
+       /* SDR_PHYGRP_SCCGRP_ADDRESS */
+       u8 _align1[0xe00];
+       /* SDR_PHYGRP_SCCGRP_ADDRESS | 0xe00 */
+       struct socfpga_sdr_scc_mgr sdr_scc_mgr;
+       u8 _align2[0x1bc];
+       /* SDR_PHYGRP_PHYMGRGRP_ADDRESS */
+       struct socfpga_phy_mgr_cmd phy_mgr_cmd;
+       u8 _align3[0x2c];
+       /* SDR_PHYGRP_PHYMGRGRP_ADDRESS | 0x40 */
+       struct socfpga_phy_mgr_cfg phy_mgr_cfg;
+       u8 _align4[0xfa0];
+       /* SDR_PHYGRP_RWMGRGRP_ADDRESS */
+       u8 rwmgr_grp[0x800];
+       /* SDR_PHYGRP_RWMGRGRP_ADDRESS | 0x800 */
+       struct socfpga_sdr_rw_load_manager sdr_rw_load_mgr_regs;
+       u8 _align5[0x3f0];
+       /* SDR_PHYGRP_RWMGRGRP_ADDRESS | 0xC00 */
+       struct socfpga_sdr_rw_load_jump_manager sdr_rw_load_jump_mgr_regs;
+       u8 _align6[0x13f0];
+       /* SDR_PHYGRP_DATAMGRGRP_ADDRESS */
+       struct socfpga_data_mgr data_mgr;
+       u8 _align7[0x7f0];
+       /* SDR_PHYGRP_REGFILEGRP_ADDRESS */
+       struct socfpga_sdr_reg_file sdr_reg_file;
+       u8 _align8[0x7c8];
+       /* SDR_CTRLGRP_ADDRESS */
+       struct socfpga_sdr_ctrl sdr_ctrl;
+       u8 _align9[0xea4];
+};
+
+int sdram_calibration_full(struct socfpga_sdr *sdr);
+
 #endif /* _SEQUENCER_H_ */
index db5c41967393a261ce2d02455e1fd127a8f82269..d779e564189a68a5ef49ec4cf005aa690843b6d8 100644 (file)
 #define XOR_UNIT(chan)                 ((chan) >> 1)
 #define XOR_CHAN(chan)                 ((chan) & 1)
 
+#ifdef CONFIG_ARMADA_MSYS
+#define MV_XOR_REGS_OFFSET(unit)       (0xF0800)
+#else
 #define MV_XOR_REGS_OFFSET(unit)       (0x60900)
+#endif
 #define MV_XOR_REGS_BASE(unit)         (MV_XOR_REGS_OFFSET(unit))
 
 /* XOR Engine Control Register Map */
index 1820676d7a18d089571c7c4f38fc1b996604e82c..4f37ba7d35eb9776f7a8aff341693e40eff432bd 100644 (file)
@@ -57,4 +57,6 @@ config APBH_DMA_BURST8
 
 endif
 
+source "drivers/dma/ti/Kconfig"
+
 endmenu # menu "DMA Support"
index b5f9147e0a54a0868f4ab639c4495a5c02885ff1..afab324461b906c560e139b8e811bacc8ca70cd3 100644 (file)
@@ -13,3 +13,5 @@ obj-$(CONFIG_SANDBOX_DMA) += sandbox-dma-test.o
 obj-$(CONFIG_TI_KSNAV) += keystone_nav.o keystone_nav_cfg.o
 obj-$(CONFIG_TI_EDMA3) += ti-edma3.o
 obj-$(CONFIG_DMA_LPC32XX) += lpc32xx_dma.o
+
+obj-y += ti/
index 1d3c192cfe5bb983bcd49168d3f1b558c20bac5f..e7bd1b2350f48f4bb83581edb768c5a75d6b2d81 100644 (file)
@@ -324,6 +324,9 @@ static int bcm6348_iudma_receive(struct dma *dma, void **dst, void *metadata)
        struct bcm6348_dma_desc *dma_desc = dma_desc = ch_priv->dma_ring;
        int ret;
 
+       if (!ch_priv->running)
+               return -EINVAL;
+
        /* get dma ring descriptor address */
        dma_desc += ch_priv->desc_id;
 
@@ -369,6 +372,9 @@ static int bcm6348_iudma_send(struct dma *dma, void *src, size_t len,
        struct bcm6348_dma_desc *dma_desc;
        uint16_t status;
 
+       if (!ch_priv->running)
+                return -EINVAL;
+
        /* flush cache */
        bcm6348_iudma_fdc(src, len);
 
diff --git a/drivers/dma/ti/Kconfig b/drivers/dma/ti/Kconfig
new file mode 100644 (file)
index 0000000..3d54983
--- /dev/null
@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: GPL-2.0+
+
+if ARCH_K3
+
+config TI_K3_NAVSS_UDMA
+        bool "Texas Instruments UDMA"
+        depends on ARCH_K3
+        select DMA
+        select TI_K3_NAVSS_RINGACC
+        select TI_K3_NAVSS_PSILCFG
+        default n
+        help
+          Support for UDMA used in K3 devices.
+endif
diff --git a/drivers/dma/ti/Makefile b/drivers/dma/ti/Makefile
new file mode 100644 (file)
index 0000000..de2f9ac
--- /dev/null
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: GPL-2.0+
+
+obj-$(CONFIG_TI_K3_NAVSS_UDMA) += k3-udma.o
diff --git a/drivers/dma/ti/k3-udma-hwdef.h b/drivers/dma/ti/k3-udma-hwdef.h
new file mode 100644 (file)
index 0000000..c88399a
--- /dev/null
@@ -0,0 +1,184 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ *  Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.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.
+ *
+ */
+
+#ifndef K3_NAVSS_UDMA_HWDEF_H_
+#define K3_NAVSS_UDMA_HWDEF_H_
+
+#define UDMA_PSIL_DST_THREAD_ID_OFFSET 0x8000
+
+/* Global registers */
+#define UDMA_REV_REG                   0x0
+#define UDMA_PERF_CTL_REG              0x4
+#define UDMA_EMU_CTL_REG               0x8
+#define UDMA_PSIL_TO_REG               0x10
+#define UDMA_UTC_CTL_REG               0x1c
+#define UDMA_CAP_REG(i)                        (0x20 + (i * 4))
+#define UDMA_RX_FLOW_ID_FW_OES_REG     0x80
+#define UDMA_RX_FLOW_ID_FW_STATUS_REG  0x88
+
+/* RX Flow regs */
+#define UDMA_RFLOW_RFA_REG             0x0
+#define UDMA_RFLOW_RFB_REG             0x4
+#define UDMA_RFLOW_RFC_REG             0x8
+#define UDMA_RFLOW_RFD_REG             0xc
+#define UDMA_RFLOW_RFE_REG             0x10
+#define UDMA_RFLOW_RFF_REG             0x14
+#define UDMA_RFLOW_RFG_REG             0x18
+#define UDMA_RFLOW_RFH_REG             0x1c
+
+#define UDMA_RFLOW_REG(x) (UDMA_RFLOW_RF##x##_REG)
+
+/* TX chan regs */
+#define UDMA_TCHAN_TCFG_REG            0x0
+#define UDMA_TCHAN_TCREDIT_REG         0x4
+#define UDMA_TCHAN_TCQ_REG             0x14
+#define UDMA_TCHAN_TOES_REG(i)         (0x20 + (i) * 4)
+#define UDMA_TCHAN_TEOES_REG           0x60
+#define UDMA_TCHAN_TPRI_CTRL_REG       0x64
+#define UDMA_TCHAN_THREAD_ID_REG       0x68
+#define UDMA_TCHAN_TFIFO_DEPTH_REG     0x70
+#define UDMA_TCHAN_TST_SCHED_REG       0x80
+
+/* RX chan regs */
+#define UDMA_RCHAN_RCFG_REG            0x0
+#define UDMA_RCHAN_RCQ_REG             0x14
+#define UDMA_RCHAN_ROES_REG(i)         (0x20 + (i) * 4)
+#define UDMA_RCHAN_REOES_REG           0x60
+#define UDMA_RCHAN_RPRI_CTRL_REG       0x64
+#define UDMA_RCHAN_THREAD_ID_REG       0x68
+#define UDMA_RCHAN_RST_SCHED_REG       0x80
+#define UDMA_RCHAN_RFLOW_RNG_REG       0xf0
+
+/* TX chan RT regs */
+#define UDMA_TCHAN_RT_CTL_REG          0x0
+#define UDMA_TCHAN_RT_SWTRIG_REG       0x8
+#define UDMA_TCHAN_RT_STDATA_REG       0x80
+
+#define UDMA_TCHAN_RT_PEERn_REG(i)     (0x200 + (i * 0x4))
+#define UDMA_TCHAN_RT_PEER_STATIC_TR_XY_REG    \
+       UDMA_TCHAN_RT_PEERn_REG(0)      /* PSI-L: 0x400 */
+#define UDMA_TCHAN_RT_PEER_STATIC_TR_Z_REG     \
+       UDMA_TCHAN_RT_PEERn_REG(1)      /* PSI-L: 0x401 */
+#define UDMA_TCHAN_RT_PEER_BCNT_REG            \
+       UDMA_TCHAN_RT_PEERn_REG(4)      /* PSI-L: 0x404 */
+#define UDMA_TCHAN_RT_PEER_RT_EN_REG           \
+       UDMA_TCHAN_RT_PEERn_REG(8)      /* PSI-L: 0x408 */
+
+#define UDMA_TCHAN_RT_PCNT_REG         0x400
+#define UDMA_TCHAN_RT_BCNT_REG         0x408
+#define UDMA_TCHAN_RT_SBCNT_REG                0x410
+
+/* RX chan RT regs */
+#define UDMA_RCHAN_RT_CTL_REG          0x0
+#define UDMA_RCHAN_RT_SWTRIG_REG       0x8
+#define UDMA_RCHAN_RT_STDATA_REG       0x80
+
+#define UDMA_RCHAN_RT_PEERn_REG(i)     (0x200 + (i * 0x4))
+#define UDMA_RCHAN_RT_PEER_STATIC_TR_XY_REG    \
+       UDMA_RCHAN_RT_PEERn_REG(0)      /* PSI-L: 0x400 */
+#define UDMA_RCHAN_RT_PEER_STATIC_TR_Z_REG     \
+       UDMA_RCHAN_RT_PEERn_REG(1)      /* PSI-L: 0x401 */
+#define UDMA_RCHAN_RT_PEER_BCNT_REG            \
+       UDMA_RCHAN_RT_PEERn_REG(4)      /* PSI-L: 0x404 */
+#define UDMA_RCHAN_RT_PEER_RT_EN_REG           \
+       UDMA_RCHAN_RT_PEERn_REG(8)      /* PSI-L: 0x408 */
+
+#define UDMA_RCHAN_RT_PCNT_REG         0x400
+#define UDMA_RCHAN_RT_BCNT_REG         0x408
+#define UDMA_RCHAN_RT_SBCNT_REG                0x410
+
+/* UDMA_TCHAN_TCFG_REG/UDMA_RCHAN_RCFG_REG */
+#define UDMA_CHAN_CFG_PAUSE_ON_ERR             BIT(31)
+#define UDMA_TCHAN_CFG_FILT_EINFO              BIT(30)
+#define UDMA_TCHAN_CFG_FILT_PSWORDS            BIT(29)
+#define UDMA_CHAN_CFG_ATYPE_MASK               GENMASK(25, 24)
+#define UDMA_CHAN_CFG_ATYPE_SHIFT              24
+#define UDMA_CHAN_CFG_CHAN_TYPE_MASK           GENMASK(19, 16)
+#define UDMA_CHAN_CFG_CHAN_TYPE_SHIFT          16
+/*
+ * PBVR - using pass by value rings
+ * PBRR - using pass by reference rings
+ * 3RDP - Third Party DMA
+ * BC - Block Copy
+ * SB - single buffer packet mode enabled
+ */
+#define UDMA_CHAN_CFG_CHAN_TYPE_PACKET_PBRR \
+       (2 << UDMA_CHAN_CFG_CHAN_TYPE_SHIFT)
+#define UDMA_CHAN_CFG_CHAN_TYPE_PACKET_SB_PBRR \
+       (3 << UDMA_CHAN_CFG_CHAN_TYPE_SHIFT)
+#define UDMA_CHAN_CFG_CHAN_TYPE_3RDP_PBRR \
+       (10 << UDMA_CHAN_CFG_CHAN_TYPE_SHIFT)
+#define UDMA_CHAN_CFG_CHAN_TYPE_3RDP_PBVR \
+       (11 << UDMA_CHAN_CFG_CHAN_TYPE_SHIFT)
+#define UDMA_CHAN_CFG_CHAN_TYPE_3RDP_BC_PBRR \
+       (12 << UDMA_CHAN_CFG_CHAN_TYPE_SHIFT)
+#define UDMA_RCHAN_CFG_IGNORE_SHORT            BIT(15)
+#define UDMA_RCHAN_CFG_IGNORE_LONG             BIT(14)
+#define UDMA_TCHAN_CFG_SUPR_TDPKT              BIT(8)
+#define UDMA_CHAN_CFG_FETCH_SIZE_MASK          GENMASK(6, 0)
+#define UDMA_CHAN_CFG_FETCH_SIZE_SHIFT         0
+
+/* UDMA_TCHAN_RT_CTL_REG/UDMA_RCHAN_RT_CTL_REG */
+#define UDMA_CHAN_RT_CTL_EN    BIT(31)
+#define UDMA_CHAN_RT_CTL_TDOWN BIT(30)
+#define UDMA_CHAN_RT_CTL_PAUSE BIT(29)
+#define UDMA_CHAN_RT_CTL_FTDOWN        BIT(28)
+#define UDMA_CHAN_RT_CTL_ERROR BIT(0)
+
+/* UDMA_TCHAN_RT_PEER_RT_EN_REG/UDMA_RCHAN_RT_PEER_RT_EN_REG (PSI-L: 0x408) */
+#define UDMA_PEER_RT_EN_ENABLE         BIT(31)
+#define UDMA_PEER_RT_EN_TEARDOWN       BIT(30)
+#define UDMA_PEER_RT_EN_PAUSE          BIT(29)
+#define UDMA_PEER_RT_EN_FLUSH          BIT(28)
+#define UDMA_PEER_RT_EN_IDLE           BIT(1)
+
+/* RX Flow reg RFA */
+#define UDMA_RFLOW_RFA_EINFO                   BIT(30)
+#define UDMA_RFLOW_RFA_PSINFO                  BIT(29)
+#define UDMA_RFLOW_RFA_ERR_HANDLING            BIT(28)
+#define UDMA_RFLOW_RFA_DESC_TYPE_MASK          GENMASK(27, 26)
+#define UDMA_RFLOW_RFA_DESC_TYPE_SHIFT         26
+#define UDMA_RFLOW_RFA_PS_LOC                  BIT(25)
+#define UDMA_RFLOW_RFA_SOP_OFF_MASK            GENMASK(24, 16)
+#define UDMA_RFLOW_RFA_SOP_OFF_SHIFT           16
+#define UDMA_RFLOW_RFA_DEST_QNUM_MASK          GENMASK(15, 0)
+#define UDMA_RFLOW_RFA_DEST_QNUM_SHIFT         0
+
+/* RX Flow reg RFC */
+#define UDMA_RFLOW_RFC_SRC_TAG_HI_SEL_SHIFT    28
+#define UDMA_RFLOW_RFC_SRC_TAG_LO_SEL_SHIFT    24
+#define UDMA_RFLOW_RFC_DST_TAG_HI_SEL_SHIFT    20
+#define UDMA_RFLOW_RFC_DST_TAG_LO_SE_SHIFT     16
+
+/*
+ * UDMA_TCHAN_RT_PEER_STATIC_TR_XY_REG /
+ * UDMA_RCHAN_RT_PEER_STATIC_TR_XY_REG
+ */
+#define PDMA_STATIC_TR_X_MASK          GENMASK(26, 24)
+#define PDMA_STATIC_TR_X_SHIFT         (24)
+#define PDMA_STATIC_TR_Y_MASK          GENMASK(11, 0)
+#define PDMA_STATIC_TR_Y_SHIFT         (0)
+
+#define PDMA_STATIC_TR_Y(x)    \
+       (((x) << PDMA_STATIC_TR_Y_SHIFT) & PDMA_STATIC_TR_Y_MASK)
+#define PDMA_STATIC_TR_X(x)    \
+       (((x) << PDMA_STATIC_TR_X_SHIFT) & PDMA_STATIC_TR_X_MASK)
+
+/*
+ * UDMA_TCHAN_RT_PEER_STATIC_TR_Z_REG /
+ * UDMA_RCHAN_RT_PEER_STATIC_TR_Z_REG
+ */
+#define PDMA_STATIC_TR_Z_MASK          GENMASK(11, 0)
+#define PDMA_STATIC_TR_Z_SHIFT         (0)
+#define PDMA_STATIC_TR_Z(x)    \
+       (((x) << PDMA_STATIC_TR_Z_SHIFT) & PDMA_STATIC_TR_Z_MASK)
+
+#endif /* K3_NAVSS_UDMA_HWDEF_H_ */
diff --git a/drivers/dma/ti/k3-udma.c b/drivers/dma/ti/k3-udma.c
new file mode 100644 (file)
index 0000000..f78a01a
--- /dev/null
@@ -0,0 +1,1730 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *  Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com
+ *  Author: Peter Ujfalusi <peter.ujfalusi@ti.com>
+ */
+#define pr_fmt(fmt) "udma: " fmt
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/bitops.h>
+#include <malloc.h>
+#include <asm/dma-mapping.h>
+#include <dm.h>
+#include <dm/read.h>
+#include <dm/of_access.h>
+#include <dma.h>
+#include <dma-uclass.h>
+#include <linux/delay.h>
+#include <dt-bindings/dma/k3-udma.h>
+#include <linux/soc/ti/k3-navss-ringacc.h>
+#include <linux/soc/ti/cppi5.h>
+#include <linux/soc/ti/ti-udma.h>
+#include <linux/soc/ti/ti_sci_protocol.h>
+
+#include "k3-udma-hwdef.h"
+
+#if BITS_PER_LONG == 64
+#define RINGACC_RING_USE_PROXY (0)
+#else
+#define RINGACC_RING_USE_PROXY (1)
+#endif
+
+struct udma_chan;
+
+enum udma_mmr {
+       MMR_GCFG = 0,
+       MMR_RCHANRT,
+       MMR_TCHANRT,
+       MMR_LAST,
+};
+
+static const char * const mmr_names[] = {
+       "gcfg", "rchanrt", "tchanrt"
+};
+
+struct udma_tchan {
+       void __iomem *reg_rt;
+
+       int id;
+       struct k3_nav_ring *t_ring; /* Transmit ring */
+       struct k3_nav_ring *tc_ring; /* Transmit Completion ring */
+};
+
+struct udma_rchan {
+       void __iomem *reg_rt;
+
+       int id;
+       struct k3_nav_ring *fd_ring; /* Free Descriptor ring */
+       struct k3_nav_ring *r_ring; /* Receive ring*/
+};
+
+struct udma_rflow {
+       int id;
+};
+
+struct udma_dev {
+       struct device *dev;
+       void __iomem *mmrs[MMR_LAST];
+
+       struct k3_nav_ringacc *ringacc;
+
+       u32 features;
+
+       int tchan_cnt;
+       int echan_cnt;
+       int rchan_cnt;
+       int rflow_cnt;
+       unsigned long *tchan_map;
+       unsigned long *rchan_map;
+       unsigned long *rflow_map;
+
+       struct udma_tchan *tchans;
+       struct udma_rchan *rchans;
+       struct udma_rflow *rflows;
+
+       struct udma_chan *channels;
+       u32 psil_base;
+
+       u32 ch_count;
+       const struct ti_sci_handle *tisci;
+       const struct ti_sci_rm_udmap_ops *tisci_udmap_ops;
+       const struct ti_sci_rm_psil_ops *tisci_psil_ops;
+       u32  tisci_dev_id;
+       u32  tisci_navss_dev_id;
+       bool is_coherent;
+};
+
+struct udma_chan {
+       struct udma_dev *ud;
+       char name[20];
+
+       struct udma_tchan *tchan;
+       struct udma_rchan *rchan;
+       struct udma_rflow *rflow;
+
+       u32 bcnt; /* number of bytes completed since the start of the channel */
+
+       bool pkt_mode; /* TR or packet */
+       bool needs_epib; /* EPIB is needed for the communication or not */
+       u32 psd_size; /* size of Protocol Specific Data */
+       u32 metadata_size; /* (needs_epib ? 16:0) + psd_size */
+       int slave_thread_id;
+       u32 src_thread;
+       u32 dst_thread;
+       u32 static_tr_type;
+
+       u32 id;
+       enum dma_direction dir;
+
+       struct cppi5_host_desc_t *desc_tx;
+       u32 hdesc_size;
+       bool in_use;
+       void    *desc_rx;
+       u32     num_rx_bufs;
+       u32     desc_rx_cur;
+
+};
+
+#define UDMA_CH_1000(ch)               (ch * 0x1000)
+#define UDMA_CH_100(ch)                        (ch * 0x100)
+#define UDMA_CH_40(ch)                 (ch * 0x40)
+
+#ifdef PKTBUFSRX
+#define UDMA_RX_DESC_NUM PKTBUFSRX
+#else
+#define UDMA_RX_DESC_NUM 4
+#endif
+
+/* Generic register access functions */
+static inline u32 udma_read(void __iomem *base, int reg)
+{
+       u32 v;
+
+       v = __raw_readl(base + reg);
+       pr_debug("READL(32): v(%08X)<--reg(%p)\n", v, base + reg);
+       return v;
+}
+
+static inline void udma_write(void __iomem *base, int reg, u32 val)
+{
+       pr_debug("WRITEL(32): v(%08X)-->reg(%p)\n", val, base + reg);
+       __raw_writel(val, base + reg);
+}
+
+static inline void udma_update_bits(void __iomem *base, int reg,
+                                   u32 mask, u32 val)
+{
+       u32 tmp, orig;
+
+       orig = udma_read(base, reg);
+       tmp = orig & ~mask;
+       tmp |= (val & mask);
+
+       if (tmp != orig)
+               udma_write(base, reg, tmp);
+}
+
+/* TCHANRT */
+static inline u32 udma_tchanrt_read(struct udma_tchan *tchan, int reg)
+{
+       if (!tchan)
+               return 0;
+       return udma_read(tchan->reg_rt, reg);
+}
+
+static inline void udma_tchanrt_write(struct udma_tchan *tchan,
+                                     int reg, u32 val)
+{
+       if (!tchan)
+               return;
+       udma_write(tchan->reg_rt, reg, val);
+}
+
+/* RCHANRT */
+static inline u32 udma_rchanrt_read(struct udma_rchan *rchan, int reg)
+{
+       if (!rchan)
+               return 0;
+       return udma_read(rchan->reg_rt, reg);
+}
+
+static inline void udma_rchanrt_write(struct udma_rchan *rchan,
+                                     int reg, u32 val)
+{
+       if (!rchan)
+               return;
+       udma_write(rchan->reg_rt, reg, val);
+}
+
+static inline int udma_navss_psil_pair(struct udma_dev *ud, u32 src_thread,
+                                      u32 dst_thread)
+{
+       dst_thread |= UDMA_PSIL_DST_THREAD_ID_OFFSET;
+       return ud->tisci_psil_ops->pair(ud->tisci,
+                                       ud->tisci_navss_dev_id,
+                                       src_thread, dst_thread);
+}
+
+static inline int udma_navss_psil_unpair(struct udma_dev *ud, u32 src_thread,
+                                        u32 dst_thread)
+{
+       dst_thread |= UDMA_PSIL_DST_THREAD_ID_OFFSET;
+       return ud->tisci_psil_ops->unpair(ud->tisci,
+                                         ud->tisci_navss_dev_id,
+                                         src_thread, dst_thread);
+}
+
+static inline char *udma_get_dir_text(enum dma_direction dir)
+{
+       switch (dir) {
+       case DMA_DEV_TO_MEM:
+               return "DEV_TO_MEM";
+       case DMA_MEM_TO_DEV:
+               return "MEM_TO_DEV";
+       case DMA_MEM_TO_MEM:
+               return "MEM_TO_MEM";
+       case DMA_DEV_TO_DEV:
+               return "DEV_TO_DEV";
+       default:
+               break;
+       }
+
+       return "invalid";
+}
+
+static inline bool udma_is_chan_running(struct udma_chan *uc)
+{
+       u32 trt_ctl = 0;
+       u32 rrt_ctl = 0;
+
+       switch (uc->dir) {
+       case DMA_DEV_TO_MEM:
+               rrt_ctl = udma_rchanrt_read(uc->rchan, UDMA_RCHAN_RT_CTL_REG);
+               pr_debug("%s: rrt_ctl: 0x%08x (peer: 0x%08x)\n",
+                        __func__, rrt_ctl,
+                        udma_rchanrt_read(uc->rchan,
+                                          UDMA_RCHAN_RT_PEER_RT_EN_REG));
+               break;
+       case DMA_MEM_TO_DEV:
+               trt_ctl = udma_tchanrt_read(uc->tchan, UDMA_TCHAN_RT_CTL_REG);
+               pr_debug("%s: trt_ctl: 0x%08x (peer: 0x%08x)\n",
+                        __func__, trt_ctl,
+                        udma_tchanrt_read(uc->tchan,
+                                          UDMA_TCHAN_RT_PEER_RT_EN_REG));
+               break;
+       case DMA_MEM_TO_MEM:
+               trt_ctl = udma_tchanrt_read(uc->tchan, UDMA_TCHAN_RT_CTL_REG);
+               rrt_ctl = udma_rchanrt_read(uc->rchan, UDMA_RCHAN_RT_CTL_REG);
+               break;
+       default:
+               break;
+       }
+
+       if (trt_ctl & UDMA_CHAN_RT_CTL_EN || rrt_ctl & UDMA_CHAN_RT_CTL_EN)
+               return true;
+
+       return false;
+}
+
+static int udma_is_coherent(struct udma_chan *uc)
+{
+       return uc->ud->is_coherent;
+}
+
+static int udma_pop_from_ring(struct udma_chan *uc, dma_addr_t *addr)
+{
+       struct k3_nav_ring *ring = NULL;
+       int ret = -ENOENT;
+
+       switch (uc->dir) {
+       case DMA_DEV_TO_MEM:
+               ring = uc->rchan->r_ring;
+               break;
+       case DMA_MEM_TO_DEV:
+               ring = uc->tchan->tc_ring;
+               break;
+       case DMA_MEM_TO_MEM:
+               ring = uc->tchan->tc_ring;
+               break;
+       default:
+               break;
+       }
+
+       if (ring && k3_nav_ringacc_ring_get_occ(ring))
+               ret = k3_nav_ringacc_ring_pop(ring, addr);
+
+       return ret;
+}
+
+static void udma_reset_rings(struct udma_chan *uc)
+{
+       struct k3_nav_ring *ring1 = NULL;
+       struct k3_nav_ring *ring2 = NULL;
+
+       switch (uc->dir) {
+       case DMA_DEV_TO_MEM:
+               ring1 = uc->rchan->fd_ring;
+               ring2 = uc->rchan->r_ring;
+               break;
+       case DMA_MEM_TO_DEV:
+               ring1 = uc->tchan->t_ring;
+               ring2 = uc->tchan->tc_ring;
+               break;
+       case DMA_MEM_TO_MEM:
+               ring1 = uc->tchan->t_ring;
+               ring2 = uc->tchan->tc_ring;
+               break;
+       default:
+               break;
+       }
+
+       if (ring1)
+               k3_nav_ringacc_ring_reset_dma(ring1, 0);
+       if (ring2)
+               k3_nav_ringacc_ring_reset(ring2);
+}
+
+static void udma_reset_counters(struct udma_chan *uc)
+{
+       u32 val;
+
+       if (uc->tchan) {
+               val = udma_tchanrt_read(uc->tchan, UDMA_TCHAN_RT_BCNT_REG);
+               udma_tchanrt_write(uc->tchan, UDMA_TCHAN_RT_BCNT_REG, val);
+
+               val = udma_tchanrt_read(uc->tchan, UDMA_TCHAN_RT_SBCNT_REG);
+               udma_tchanrt_write(uc->tchan, UDMA_TCHAN_RT_SBCNT_REG, val);
+
+               val = udma_tchanrt_read(uc->tchan, UDMA_TCHAN_RT_PCNT_REG);
+               udma_tchanrt_write(uc->tchan, UDMA_TCHAN_RT_PCNT_REG, val);
+
+               val = udma_tchanrt_read(uc->tchan, UDMA_TCHAN_RT_PEER_BCNT_REG);
+               udma_tchanrt_write(uc->tchan, UDMA_TCHAN_RT_PEER_BCNT_REG, val);
+       }
+
+       if (uc->rchan) {
+               val = udma_rchanrt_read(uc->rchan, UDMA_RCHAN_RT_BCNT_REG);
+               udma_rchanrt_write(uc->rchan, UDMA_RCHAN_RT_BCNT_REG, val);
+
+               val = udma_rchanrt_read(uc->rchan, UDMA_RCHAN_RT_SBCNT_REG);
+               udma_rchanrt_write(uc->rchan, UDMA_RCHAN_RT_SBCNT_REG, val);
+
+               val = udma_rchanrt_read(uc->rchan, UDMA_RCHAN_RT_PCNT_REG);
+               udma_rchanrt_write(uc->rchan, UDMA_RCHAN_RT_PCNT_REG, val);
+
+               val = udma_rchanrt_read(uc->rchan, UDMA_RCHAN_RT_PEER_BCNT_REG);
+               udma_rchanrt_write(uc->rchan, UDMA_RCHAN_RT_PEER_BCNT_REG, val);
+       }
+
+       uc->bcnt = 0;
+}
+
+static inline int udma_stop_hard(struct udma_chan *uc)
+{
+       pr_debug("%s: ENTER (chan%d)\n", __func__, uc->id);
+
+       switch (uc->dir) {
+       case DMA_DEV_TO_MEM:
+               udma_rchanrt_write(uc->rchan, UDMA_RCHAN_RT_PEER_RT_EN_REG, 0);
+               udma_rchanrt_write(uc->rchan, UDMA_RCHAN_RT_CTL_REG, 0);
+               break;
+       case DMA_MEM_TO_DEV:
+               udma_tchanrt_write(uc->tchan, UDMA_TCHAN_RT_CTL_REG, 0);
+               udma_tchanrt_write(uc->tchan, UDMA_TCHAN_RT_PEER_RT_EN_REG, 0);
+               break;
+       case DMA_MEM_TO_MEM:
+               udma_rchanrt_write(uc->rchan, UDMA_RCHAN_RT_CTL_REG, 0);
+               udma_tchanrt_write(uc->tchan, UDMA_TCHAN_RT_CTL_REG, 0);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int udma_start(struct udma_chan *uc)
+{
+       /* Channel is already running, no need to proceed further */
+       if (udma_is_chan_running(uc))
+               goto out;
+
+       pr_debug("%s: chan:%d dir:%s (static_tr_type: %d)\n",
+                __func__, uc->id, udma_get_dir_text(uc->dir),
+                uc->static_tr_type);
+
+       /* Make sure that we clear the teardown bit, if it is set */
+       udma_stop_hard(uc);
+
+       /* Reset all counters */
+       udma_reset_counters(uc);
+
+       switch (uc->dir) {
+       case DMA_DEV_TO_MEM:
+               udma_rchanrt_write(uc->rchan, UDMA_RCHAN_RT_CTL_REG,
+                                  UDMA_CHAN_RT_CTL_EN);
+
+               /* Enable remote */
+               udma_rchanrt_write(uc->rchan, UDMA_RCHAN_RT_PEER_RT_EN_REG,
+                                  UDMA_PEER_RT_EN_ENABLE);
+
+               pr_debug("%s(rx): RT_CTL:0x%08x PEER RT_ENABLE:0x%08x\n",
+                        __func__,
+                        udma_rchanrt_read(uc->rchan,
+                                          UDMA_RCHAN_RT_CTL_REG),
+                        udma_rchanrt_read(uc->rchan,
+                                          UDMA_RCHAN_RT_PEER_RT_EN_REG));
+               break;
+       case DMA_MEM_TO_DEV:
+               /* Enable remote */
+               udma_tchanrt_write(uc->tchan, UDMA_TCHAN_RT_PEER_RT_EN_REG,
+                                  UDMA_PEER_RT_EN_ENABLE);
+
+               udma_tchanrt_write(uc->tchan, UDMA_TCHAN_RT_CTL_REG,
+                                  UDMA_CHAN_RT_CTL_EN);
+
+               pr_debug("%s(tx): RT_CTL:0x%08x PEER RT_ENABLE:0x%08x\n",
+                        __func__,
+                        udma_rchanrt_read(uc->rchan,
+                                          UDMA_TCHAN_RT_CTL_REG),
+                        udma_rchanrt_read(uc->rchan,
+                                          UDMA_TCHAN_RT_PEER_RT_EN_REG));
+               break;
+       case DMA_MEM_TO_MEM:
+               udma_rchanrt_write(uc->rchan, UDMA_RCHAN_RT_CTL_REG,
+                                  UDMA_CHAN_RT_CTL_EN);
+               udma_tchanrt_write(uc->tchan, UDMA_TCHAN_RT_CTL_REG,
+                                  UDMA_CHAN_RT_CTL_EN);
+
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       pr_debug("%s: DONE chan:%d\n", __func__, uc->id);
+out:
+       return 0;
+}
+
+static inline void udma_stop_mem2dev(struct udma_chan *uc, bool sync)
+{
+       int i = 0;
+       u32 val;
+
+       udma_tchanrt_write(uc->tchan, UDMA_TCHAN_RT_CTL_REG,
+                          UDMA_CHAN_RT_CTL_EN |
+                          UDMA_CHAN_RT_CTL_TDOWN);
+
+       val = udma_tchanrt_read(uc->tchan, UDMA_TCHAN_RT_CTL_REG);
+
+       while (sync && (val & UDMA_CHAN_RT_CTL_EN)) {
+               val = udma_tchanrt_read(uc->tchan, UDMA_TCHAN_RT_CTL_REG);
+               udelay(1);
+               if (i > 1000) {
+                       printf(" %s TIMEOUT !\n", __func__);
+                       break;
+               }
+               i++;
+       }
+
+       val = udma_tchanrt_read(uc->tchan, UDMA_TCHAN_RT_PEER_RT_EN_REG);
+       if (val & UDMA_PEER_RT_EN_ENABLE)
+               printf("%s: peer not stopped TIMEOUT !\n", __func__);
+}
+
+static inline void udma_stop_dev2mem(struct udma_chan *uc, bool sync)
+{
+       int i = 0;
+       u32 val;
+
+       udma_rchanrt_write(uc->rchan, UDMA_RCHAN_RT_PEER_RT_EN_REG,
+                          UDMA_PEER_RT_EN_ENABLE |
+                          UDMA_PEER_RT_EN_TEARDOWN);
+
+       val = udma_rchanrt_read(uc->rchan, UDMA_RCHAN_RT_CTL_REG);
+
+       while (sync && (val & UDMA_CHAN_RT_CTL_EN)) {
+               val = udma_rchanrt_read(uc->rchan, UDMA_RCHAN_RT_CTL_REG);
+               udelay(1);
+               if (i > 1000) {
+                       printf("%s TIMEOUT !\n", __func__);
+                       break;
+               }
+               i++;
+       }
+
+       val = udma_rchanrt_read(uc->rchan, UDMA_RCHAN_RT_PEER_RT_EN_REG);
+       if (val & UDMA_PEER_RT_EN_ENABLE)
+               printf("%s: peer not stopped TIMEOUT !\n", __func__);
+}
+
+static inline int udma_stop(struct udma_chan *uc)
+{
+       pr_debug("%s: chan:%d dir:%s\n",
+                __func__, uc->id, udma_get_dir_text(uc->dir));
+
+       udma_reset_counters(uc);
+       switch (uc->dir) {
+       case DMA_DEV_TO_MEM:
+               udma_stop_dev2mem(uc, true);
+               break;
+       case DMA_MEM_TO_DEV:
+               udma_stop_mem2dev(uc, true);
+               break;
+       case DMA_MEM_TO_MEM:
+               udma_rchanrt_write(uc->rchan, UDMA_RCHAN_RT_CTL_REG, 0);
+               udma_tchanrt_write(uc->tchan, UDMA_TCHAN_RT_CTL_REG, 0);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static void udma_poll_completion(struct udma_chan *uc, dma_addr_t *paddr)
+{
+       int i = 1;
+
+       while (udma_pop_from_ring(uc, paddr)) {
+               udelay(1);
+               if (!(i % 1000000))
+                       printf(".");
+               i++;
+       }
+}
+
+#define UDMA_RESERVE_RESOURCE(res)                                     \
+static struct udma_##res *__udma_reserve_##res(struct udma_dev *ud,    \
+                                              int id)                  \
+{                                                                      \
+       if (id >= 0) {                                                  \
+               if (test_bit(id, ud->res##_map)) {                      \
+                       dev_err(ud->dev, "res##%d is in use\n", id);    \
+                       return ERR_PTR(-ENOENT);                        \
+               }                                                       \
+       } else {                                                        \
+               id = find_first_zero_bit(ud->res##_map, ud->res##_cnt); \
+               if (id == ud->res##_cnt) {                              \
+                       return ERR_PTR(-ENOENT);                        \
+               }                                                       \
+       }                                                               \
+                                                                       \
+       __set_bit(id, ud->res##_map);                                   \
+       return &ud->res##s[id];                                         \
+}
+
+UDMA_RESERVE_RESOURCE(tchan);
+UDMA_RESERVE_RESOURCE(rchan);
+UDMA_RESERVE_RESOURCE(rflow);
+
+static int udma_get_tchan(struct udma_chan *uc)
+{
+       struct udma_dev *ud = uc->ud;
+
+       if (uc->tchan) {
+               dev_dbg(ud->dev, "chan%d: already have tchan%d allocated\n",
+                       uc->id, uc->tchan->id);
+               return 0;
+       }
+
+       uc->tchan = __udma_reserve_tchan(ud, -1);
+       if (IS_ERR(uc->tchan))
+               return PTR_ERR(uc->tchan);
+
+       pr_debug("chan%d: got tchan%d\n", uc->id, uc->tchan->id);
+
+       if (udma_is_chan_running(uc)) {
+               dev_warn(ud->dev, "chan%d: tchan%d is running!\n", uc->id,
+                        uc->tchan->id);
+               udma_stop(uc);
+               if (udma_is_chan_running(uc))
+                       dev_err(ud->dev, "chan%d: won't stop!\n", uc->id);
+       }
+
+       return 0;
+}
+
+static int udma_get_rchan(struct udma_chan *uc)
+{
+       struct udma_dev *ud = uc->ud;
+
+       if (uc->rchan) {
+               dev_dbg(ud->dev, "chan%d: already have rchan%d allocated\n",
+                       uc->id, uc->rchan->id);
+               return 0;
+       }
+
+       uc->rchan = __udma_reserve_rchan(ud, -1);
+       if (IS_ERR(uc->rchan))
+               return PTR_ERR(uc->rchan);
+
+       pr_debug("chan%d: got rchan%d\n", uc->id, uc->rchan->id);
+
+       if (udma_is_chan_running(uc)) {
+               dev_warn(ud->dev, "chan%d: rchan%d is running!\n", uc->id,
+                        uc->rchan->id);
+               udma_stop(uc);
+               if (udma_is_chan_running(uc))
+                       dev_err(ud->dev, "chan%d: won't stop!\n", uc->id);
+       }
+
+       return 0;
+}
+
+static int udma_get_chan_pair(struct udma_chan *uc)
+{
+       struct udma_dev *ud = uc->ud;
+       int chan_id, end;
+
+       if ((uc->tchan && uc->rchan) && uc->tchan->id == uc->rchan->id) {
+               dev_info(ud->dev, "chan%d: already have %d pair allocated\n",
+                        uc->id, uc->tchan->id);
+               return 0;
+       }
+
+       if (uc->tchan) {
+               dev_err(ud->dev, "chan%d: already have tchan%d allocated\n",
+                       uc->id, uc->tchan->id);
+               return -EBUSY;
+       } else if (uc->rchan) {
+               dev_err(ud->dev, "chan%d: already have rchan%d allocated\n",
+                       uc->id, uc->rchan->id);
+               return -EBUSY;
+       }
+
+       /* Can be optimized, but let's have it like this for now */
+       end = min(ud->tchan_cnt, ud->rchan_cnt);
+       for (chan_id = 0; chan_id < end; chan_id++) {
+               if (!test_bit(chan_id, ud->tchan_map) &&
+                   !test_bit(chan_id, ud->rchan_map))
+                       break;
+       }
+
+       if (chan_id == end)
+               return -ENOENT;
+
+       __set_bit(chan_id, ud->tchan_map);
+       __set_bit(chan_id, ud->rchan_map);
+       uc->tchan = &ud->tchans[chan_id];
+       uc->rchan = &ud->rchans[chan_id];
+
+       pr_debug("chan%d: got t/rchan%d pair\n", uc->id, chan_id);
+
+       if (udma_is_chan_running(uc)) {
+               dev_warn(ud->dev, "chan%d: t/rchan%d pair is running!\n",
+                        uc->id, chan_id);
+               udma_stop(uc);
+               if (udma_is_chan_running(uc))
+                       dev_err(ud->dev, "chan%d: won't stop!\n", uc->id);
+       }
+
+       return 0;
+}
+
+static int udma_get_rflow(struct udma_chan *uc, int flow_id)
+{
+       struct udma_dev *ud = uc->ud;
+
+       if (uc->rflow) {
+               dev_dbg(ud->dev, "chan%d: already have rflow%d allocated\n",
+                       uc->id, uc->rflow->id);
+               return 0;
+       }
+
+       if (!uc->rchan)
+               dev_warn(ud->dev, "chan%d: does not have rchan??\n", uc->id);
+
+       uc->rflow = __udma_reserve_rflow(ud, flow_id);
+       if (IS_ERR(uc->rflow))
+               return PTR_ERR(uc->rflow);
+
+       pr_debug("chan%d: got rflow%d\n", uc->id, uc->rflow->id);
+       return 0;
+}
+
+static void udma_put_rchan(struct udma_chan *uc)
+{
+       struct udma_dev *ud = uc->ud;
+
+       if (uc->rchan) {
+               dev_dbg(ud->dev, "chan%d: put rchan%d\n", uc->id,
+                       uc->rchan->id);
+               __clear_bit(uc->rchan->id, ud->rchan_map);
+               uc->rchan = NULL;
+       }
+}
+
+static void udma_put_tchan(struct udma_chan *uc)
+{
+       struct udma_dev *ud = uc->ud;
+
+       if (uc->tchan) {
+               dev_dbg(ud->dev, "chan%d: put tchan%d\n", uc->id,
+                       uc->tchan->id);
+               __clear_bit(uc->tchan->id, ud->tchan_map);
+               uc->tchan = NULL;
+       }
+}
+
+static void udma_put_rflow(struct udma_chan *uc)
+{
+       struct udma_dev *ud = uc->ud;
+
+       if (uc->rflow) {
+               dev_dbg(ud->dev, "chan%d: put rflow%d\n", uc->id,
+                       uc->rflow->id);
+               __clear_bit(uc->rflow->id, ud->rflow_map);
+               uc->rflow = NULL;
+       }
+}
+
+static void udma_free_tx_resources(struct udma_chan *uc)
+{
+       if (!uc->tchan)
+               return;
+
+       k3_nav_ringacc_ring_free(uc->tchan->t_ring);
+       k3_nav_ringacc_ring_free(uc->tchan->tc_ring);
+       uc->tchan->t_ring = NULL;
+       uc->tchan->tc_ring = NULL;
+
+       udma_put_tchan(uc);
+}
+
+static int udma_alloc_tx_resources(struct udma_chan *uc)
+{
+       struct k3_nav_ring_cfg ring_cfg;
+       struct udma_dev *ud = uc->ud;
+       int ret;
+
+       ret = udma_get_tchan(uc);
+       if (ret)
+               return ret;
+
+       uc->tchan->t_ring = k3_nav_ringacc_request_ring(
+                               ud->ringacc, uc->tchan->id,
+                               RINGACC_RING_USE_PROXY);
+       if (!uc->tchan->t_ring) {
+               ret = -EBUSY;
+               goto err_tx_ring;
+       }
+
+       uc->tchan->tc_ring = k3_nav_ringacc_request_ring(
+                               ud->ringacc, -1, RINGACC_RING_USE_PROXY);
+       if (!uc->tchan->tc_ring) {
+               ret = -EBUSY;
+               goto err_txc_ring;
+       }
+
+       memset(&ring_cfg, 0, sizeof(ring_cfg));
+       ring_cfg.size = 16;
+       ring_cfg.elm_size = K3_NAV_RINGACC_RING_ELSIZE_8;
+       ring_cfg.mode = K3_NAV_RINGACC_RING_MODE_MESSAGE;
+
+       ret = k3_nav_ringacc_ring_cfg(uc->tchan->t_ring, &ring_cfg);
+       ret |= k3_nav_ringacc_ring_cfg(uc->tchan->tc_ring, &ring_cfg);
+
+       if (ret)
+               goto err_ringcfg;
+
+       return 0;
+
+err_ringcfg:
+       k3_nav_ringacc_ring_free(uc->tchan->tc_ring);
+       uc->tchan->tc_ring = NULL;
+err_txc_ring:
+       k3_nav_ringacc_ring_free(uc->tchan->t_ring);
+       uc->tchan->t_ring = NULL;
+err_tx_ring:
+       udma_put_tchan(uc);
+
+       return ret;
+}
+
+static void udma_free_rx_resources(struct udma_chan *uc)
+{
+       if (!uc->rchan)
+               return;
+
+       k3_nav_ringacc_ring_free(uc->rchan->fd_ring);
+       k3_nav_ringacc_ring_free(uc->rchan->r_ring);
+       uc->rchan->fd_ring = NULL;
+       uc->rchan->r_ring = NULL;
+
+       udma_put_rflow(uc);
+       udma_put_rchan(uc);
+}
+
+static int udma_alloc_rx_resources(struct udma_chan *uc)
+{
+       struct k3_nav_ring_cfg ring_cfg;
+       struct udma_dev *ud = uc->ud;
+       int fd_ring_id;
+       int ret;
+
+       ret = udma_get_rchan(uc);
+       if (ret)
+               return ret;
+
+       /* For MEM_TO_MEM we don't need rflow or rings */
+       if (uc->dir == DMA_MEM_TO_MEM)
+               return 0;
+
+       ret = udma_get_rflow(uc, uc->rchan->id);
+       if (ret) {
+               ret = -EBUSY;
+               goto err_rflow;
+       }
+
+       fd_ring_id = ud->tchan_cnt + ud->echan_cnt + uc->rchan->id;
+
+       uc->rchan->fd_ring = k3_nav_ringacc_request_ring(
+                               ud->ringacc, fd_ring_id,
+                               RINGACC_RING_USE_PROXY);
+       if (!uc->rchan->fd_ring) {
+               ret = -EBUSY;
+               goto err_rx_ring;
+       }
+
+       uc->rchan->r_ring = k3_nav_ringacc_request_ring(
+                               ud->ringacc, -1, RINGACC_RING_USE_PROXY);
+       if (!uc->rchan->r_ring) {
+               ret = -EBUSY;
+               goto err_rxc_ring;
+       }
+
+       memset(&ring_cfg, 0, sizeof(ring_cfg));
+       ring_cfg.size = 16;
+       ring_cfg.elm_size = K3_NAV_RINGACC_RING_ELSIZE_8;
+       ring_cfg.mode = K3_NAV_RINGACC_RING_MODE_MESSAGE;
+
+       ret = k3_nav_ringacc_ring_cfg(uc->rchan->fd_ring, &ring_cfg);
+       ret |= k3_nav_ringacc_ring_cfg(uc->rchan->r_ring, &ring_cfg);
+
+       if (ret)
+               goto err_ringcfg;
+
+       return 0;
+
+err_ringcfg:
+       k3_nav_ringacc_ring_free(uc->rchan->r_ring);
+       uc->rchan->r_ring = NULL;
+err_rxc_ring:
+       k3_nav_ringacc_ring_free(uc->rchan->fd_ring);
+       uc->rchan->fd_ring = NULL;
+err_rx_ring:
+       udma_put_rflow(uc);
+err_rflow:
+       udma_put_rchan(uc);
+
+       return ret;
+}
+
+static int udma_alloc_tchan_sci_req(struct udma_chan *uc)
+{
+       struct udma_dev *ud = uc->ud;
+       int tc_ring = k3_nav_ringacc_get_ring_id(uc->tchan->tc_ring);
+       struct ti_sci_msg_rm_udmap_tx_ch_cfg req;
+       u32 mode;
+       int ret;
+
+       if (uc->pkt_mode)
+               mode = TI_SCI_RM_UDMAP_CHAN_TYPE_PKT_PBRR;
+       else
+               mode = TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_BCOPY_PBRR;
+
+       req.valid_params = TI_SCI_MSG_VALUE_RM_UDMAP_CH_CHAN_TYPE_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_CH_FETCH_SIZE_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_CH_CQ_QNUM_VALID;
+       req.nav_id = ud->tisci_dev_id;
+       req.index = uc->tchan->id;
+       req.tx_chan_type = mode;
+       if (uc->dir == DMA_MEM_TO_MEM)
+               req.tx_fetch_size = sizeof(struct cppi5_desc_hdr_t) >> 2;
+       else
+               req.tx_fetch_size = cppi5_hdesc_calc_size(uc->needs_epib,
+                                                         uc->psd_size,
+                                                         0) >> 2;
+       req.txcq_qnum = tc_ring;
+
+       ret = ud->tisci_udmap_ops->tx_ch_cfg(ud->tisci, &req);
+       if (ret)
+               dev_err(ud->dev, "tisci tx alloc failed %d\n", ret);
+
+       return ret;
+}
+
+static int udma_alloc_rchan_sci_req(struct udma_chan *uc)
+{
+       struct udma_dev *ud = uc->ud;
+       int fd_ring = k3_nav_ringacc_get_ring_id(uc->rchan->fd_ring);
+       int rx_ring = k3_nav_ringacc_get_ring_id(uc->rchan->r_ring);
+       int tc_ring = k3_nav_ringacc_get_ring_id(uc->tchan->tc_ring);
+       struct ti_sci_msg_rm_udmap_rx_ch_cfg req = { 0 };
+       struct ti_sci_msg_rm_udmap_flow_cfg flow_req = { 0 };
+       u32 mode;
+       int ret;
+
+       if (uc->pkt_mode)
+               mode = TI_SCI_RM_UDMAP_CHAN_TYPE_PKT_PBRR;
+       else
+               mode = TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_BCOPY_PBRR;
+
+       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;
+       req.nav_id = ud->tisci_dev_id;
+       req.index = uc->rchan->id;
+       req.rx_chan_type = mode;
+       if (uc->dir == DMA_MEM_TO_MEM) {
+               req.rx_fetch_size = sizeof(struct cppi5_desc_hdr_t) >> 2;
+               req.rxcq_qnum = tc_ring;
+       } else {
+               req.rx_fetch_size = cppi5_hdesc_calc_size(uc->needs_epib,
+                                                         uc->psd_size,
+                                                         0) >> 2;
+               req.rxcq_qnum = rx_ring;
+       }
+       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 = ud->tisci_udmap_ops->rx_ch_cfg(ud->tisci, &req);
+       if (ret) {
+               dev_err(ud->dev, "tisci rx %u cfg failed %d\n",
+                       uc->rchan->id, ret);
+               return ret;
+       }
+       if (uc->dir == DMA_MEM_TO_MEM)
+               return ret;
+
+       flow_req.valid_params =
+                       TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_EINFO_PRESENT_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_PSINFO_PRESENT_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_ERROR_HANDLING_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DESC_TYPE_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_QNUM_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_HI_SEL_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_LO_SEL_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_HI_SEL_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_LO_SEL_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ0_SZ0_QNUM_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ1_QNUM_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ2_QNUM_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ3_QNUM_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_PS_LOCATION_VALID;
+
+       flow_req.nav_id = ud->tisci_dev_id;
+       flow_req.flow_index = uc->rflow->id;
+
+       if (uc->needs_epib)
+               flow_req.rx_einfo_present = 1;
+       else
+               flow_req.rx_einfo_present = 0;
+
+       if (uc->psd_size)
+               flow_req.rx_psinfo_present = 1;
+       else
+               flow_req.rx_psinfo_present = 0;
+
+       flow_req.rx_error_handling = 0;
+       flow_req.rx_desc_type = 0;
+       flow_req.rx_dest_qnum = rx_ring;
+       flow_req.rx_src_tag_hi_sel = 2;
+       flow_req.rx_src_tag_lo_sel = 4;
+       flow_req.rx_dest_tag_hi_sel = 5;
+       flow_req.rx_dest_tag_lo_sel = 4;
+       flow_req.rx_fdq0_sz0_qnum = fd_ring;
+       flow_req.rx_fdq1_qnum = fd_ring;
+       flow_req.rx_fdq2_qnum = fd_ring;
+       flow_req.rx_fdq3_qnum = fd_ring;
+       flow_req.rx_ps_location = 0;
+
+       ret = ud->tisci_udmap_ops->rx_flow_cfg(ud->tisci, &flow_req);
+       if (ret)
+               dev_err(ud->dev, "tisci rx %u flow %u cfg failed %d\n",
+                       uc->rchan->id, uc->rflow->id, ret);
+
+       return ret;
+}
+
+static int udma_alloc_chan_resources(struct udma_chan *uc)
+{
+       struct udma_dev *ud = uc->ud;
+       int ret;
+
+       pr_debug("%s: chan:%d as %s\n",
+                __func__, uc->id, udma_get_dir_text(uc->dir));
+
+       switch (uc->dir) {
+       case DMA_MEM_TO_MEM:
+               /* Non synchronized - mem to mem type of transfer */
+               ret = udma_get_chan_pair(uc);
+               if (ret)
+                       return ret;
+
+               ret = udma_alloc_tx_resources(uc);
+               if (ret)
+                       goto err_free_res;
+
+               ret = udma_alloc_rx_resources(uc);
+               if (ret)
+                       goto err_free_res;
+
+               uc->src_thread = ud->psil_base + uc->tchan->id;
+               uc->dst_thread = (ud->psil_base + uc->rchan->id) | 0x8000;
+               break;
+       case DMA_MEM_TO_DEV:
+               /* Slave transfer synchronized - mem to dev (TX) trasnfer */
+               ret = udma_alloc_tx_resources(uc);
+               if (ret)
+                       goto err_free_res;
+
+               uc->src_thread = ud->psil_base + uc->tchan->id;
+               uc->dst_thread = uc->slave_thread_id;
+               if (!(uc->dst_thread & 0x8000))
+                       uc->dst_thread |= 0x8000;
+
+               break;
+       case DMA_DEV_TO_MEM:
+               /* Slave transfer synchronized - dev to mem (RX) trasnfer */
+               ret = udma_alloc_rx_resources(uc);
+               if (ret)
+                       goto err_free_res;
+
+               uc->src_thread = uc->slave_thread_id;
+               uc->dst_thread = (ud->psil_base + uc->rchan->id) | 0x8000;
+
+               break;
+       default:
+               /* Can not happen */
+               pr_debug("%s: chan:%d invalid direction (%u)\n",
+                        __func__, uc->id, uc->dir);
+               return -EINVAL;
+       }
+
+       /* We have channel indexes and rings */
+       if (uc->dir == DMA_MEM_TO_MEM) {
+               ret = udma_alloc_tchan_sci_req(uc);
+               if (ret)
+                       goto err_free_res;
+
+               ret = udma_alloc_rchan_sci_req(uc);
+               if (ret)
+                       goto err_free_res;
+       } else {
+               /* Slave transfer */
+               if (uc->dir == DMA_MEM_TO_DEV) {
+                       ret = udma_alloc_tchan_sci_req(uc);
+                       if (ret)
+                               goto err_free_res;
+               } else {
+                       ret = udma_alloc_rchan_sci_req(uc);
+                       if (ret)
+                               goto err_free_res;
+               }
+       }
+
+       /* PSI-L pairing */
+       ret = udma_navss_psil_pair(ud, uc->src_thread, uc->dst_thread);
+       if (ret) {
+               dev_err(ud->dev, "k3_nav_psil_request_link fail\n");
+               goto err_free_res;
+       }
+
+       return 0;
+
+err_free_res:
+       udma_free_tx_resources(uc);
+       udma_free_rx_resources(uc);
+       uc->slave_thread_id = -1;
+       return ret;
+}
+
+static void udma_free_chan_resources(struct udma_chan *uc)
+{
+       /* Some configuration to UDMA-P channel: disable, reset, whatever */
+
+       /* Release PSI-L pairing */
+       udma_navss_psil_unpair(uc->ud, uc->src_thread, uc->dst_thread);
+
+       /* Reset the rings for a new start */
+       udma_reset_rings(uc);
+       udma_free_tx_resources(uc);
+       udma_free_rx_resources(uc);
+
+       uc->slave_thread_id = -1;
+       uc->dir = DMA_MEM_TO_MEM;
+}
+
+static int udma_get_mmrs(struct udevice *dev)
+{
+       struct udma_dev *ud = dev_get_priv(dev);
+       int i;
+
+       for (i = 0; i < MMR_LAST; i++) {
+               ud->mmrs[i] = (uint32_t *)devfdt_get_addr_name(dev,
+                               mmr_names[i]);
+               if (!ud->mmrs[i])
+                       return -EINVAL;
+       }
+
+       return 0;
+}
+
+#define UDMA_MAX_CHANNELS      192
+
+static int udma_probe(struct udevice *dev)
+{
+       struct dma_dev_priv *uc_priv = dev_get_uclass_priv(dev);
+       struct udma_dev *ud = dev_get_priv(dev);
+       int i, ret;
+       u32 cap2, cap3;
+       struct udevice *tmp;
+       struct udevice *tisci_dev = NULL;
+
+       ret = udma_get_mmrs(dev);
+       if (ret)
+               return ret;
+
+       ret = uclass_get_device_by_phandle(UCLASS_MISC, dev,
+                                          "ti,ringacc", &tmp);
+       ud->ringacc = dev_get_priv(tmp);
+       if (IS_ERR(ud->ringacc))
+               return PTR_ERR(ud->ringacc);
+
+       ud->psil_base = dev_read_u32_default(dev, "ti,psil-base", 0);
+       if (!ud->psil_base) {
+               dev_info(dev,
+                        "Missing ti,psil-base property, using %d.\n", ret);
+               return -EINVAL;
+       }
+
+       ret = uclass_get_device_by_name(UCLASS_FIRMWARE, "dmsc", &tisci_dev);
+       if (ret) {
+               debug("TISCI RA RM get failed (%d)\n", ret);
+               ud->tisci = NULL;
+               return 0;
+       }
+       ud->tisci = (struct ti_sci_handle *)
+                        (ti_sci_get_handle_from_sysfw(tisci_dev));
+
+       ret = dev_read_u32_default(dev, "ti,sci", 0);
+       if (!ret) {
+               dev_err(dev, "TISCI RA RM disabled\n");
+               ud->tisci = NULL;
+       }
+
+       if (ud->tisci) {
+               ofnode navss_ofnode = ofnode_get_parent(dev_ofnode(dev));
+
+               ud->tisci_dev_id = -1;
+               ret = dev_read_u32(dev, "ti,sci-dev-id", &ud->tisci_dev_id);
+               if (ret) {
+                       dev_err(dev, "ti,sci-dev-id read failure %d\n", ret);
+                       return ret;
+               }
+
+               ud->tisci_navss_dev_id = -1;
+               ret = ofnode_read_u32(navss_ofnode, "ti,sci-dev-id",
+                                     &ud->tisci_navss_dev_id);
+               if (ret) {
+                       dev_err(dev, "navss sci-dev-id read failure %d\n", ret);
+                       return ret;
+               }
+
+               ud->tisci_udmap_ops = &ud->tisci->ops.rm_udmap_ops;
+               ud->tisci_psil_ops = &ud->tisci->ops.rm_psil_ops;
+       }
+
+       ud->is_coherent = dev_read_bool(dev, "dma-coherent");
+
+       cap2 = udma_read(ud->mmrs[MMR_GCFG], 0x28);
+       cap3 = udma_read(ud->mmrs[MMR_GCFG], 0x2c);
+
+       ud->rflow_cnt = cap3 & 0x3fff;
+       ud->tchan_cnt = cap2 & 0x1ff;
+       ud->echan_cnt = (cap2 >> 9) & 0x1ff;
+       ud->rchan_cnt = (cap2 >> 18) & 0x1ff;
+       ud->ch_count  = ud->tchan_cnt + ud->rchan_cnt;
+
+       dev_info(dev,
+                "Number of channels: %u (tchan: %u, echan: %u, rchan: %u dev-id %u)\n",
+                ud->ch_count, ud->tchan_cnt, ud->echan_cnt, ud->rchan_cnt,
+                ud->tisci_dev_id);
+       dev_info(dev, "Number of rflows: %u\n", ud->rflow_cnt);
+
+       ud->channels = devm_kcalloc(dev, ud->ch_count, sizeof(*ud->channels),
+                                   GFP_KERNEL);
+       ud->tchan_map = devm_kcalloc(dev, BITS_TO_LONGS(ud->tchan_cnt),
+                                    sizeof(unsigned long), GFP_KERNEL);
+       ud->tchans = devm_kcalloc(dev, ud->tchan_cnt,
+                                 sizeof(*ud->tchans), GFP_KERNEL);
+       ud->rchan_map = devm_kcalloc(dev, BITS_TO_LONGS(ud->rchan_cnt),
+                                    sizeof(unsigned long), GFP_KERNEL);
+       ud->rchans = devm_kcalloc(dev, ud->rchan_cnt,
+                                 sizeof(*ud->rchans), GFP_KERNEL);
+       ud->rflow_map = devm_kcalloc(dev, BITS_TO_LONGS(ud->rflow_cnt),
+                                    sizeof(unsigned long), GFP_KERNEL);
+       ud->rflows = devm_kcalloc(dev, ud->rflow_cnt,
+                                 sizeof(*ud->rflows), GFP_KERNEL);
+
+       if (!ud->channels || !ud->tchan_map || !ud->rchan_map ||
+           !ud->rflow_map || !ud->tchans || !ud->rchans || !ud->rflows)
+               return -ENOMEM;
+
+       for (i = 0; i < ud->tchan_cnt; i++) {
+               struct udma_tchan *tchan = &ud->tchans[i];
+
+               tchan->id = i;
+               tchan->reg_rt = ud->mmrs[MMR_TCHANRT] + UDMA_CH_1000(i);
+       }
+
+       for (i = 0; i < ud->rchan_cnt; i++) {
+               struct udma_rchan *rchan = &ud->rchans[i];
+
+               rchan->id = i;
+               rchan->reg_rt = ud->mmrs[MMR_RCHANRT] + UDMA_CH_1000(i);
+       }
+
+       for (i = 0; i < ud->rflow_cnt; i++) {
+               struct udma_rflow *rflow = &ud->rflows[i];
+
+               rflow->id = i;
+       }
+
+       for (i = 0; i < ud->ch_count; i++) {
+               struct udma_chan *uc = &ud->channels[i];
+
+               uc->ud = ud;
+               uc->id = i;
+               uc->slave_thread_id = -1;
+               uc->tchan = NULL;
+               uc->rchan = NULL;
+               uc->dir = DMA_MEM_TO_MEM;
+               sprintf(uc->name, "UDMA chan%d\n", i);
+               if (!i)
+                       uc->in_use = true;
+       }
+
+       pr_debug("UDMA(rev: 0x%08x) CAP0-3: 0x%08x, 0x%08x, 0x%08x, 0x%08x\n",
+                udma_read(ud->mmrs[MMR_GCFG], 0),
+                udma_read(ud->mmrs[MMR_GCFG], 0x20),
+                udma_read(ud->mmrs[MMR_GCFG], 0x24),
+                udma_read(ud->mmrs[MMR_GCFG], 0x28),
+                udma_read(ud->mmrs[MMR_GCFG], 0x2c));
+
+       uc_priv->supported = DMA_SUPPORTS_MEM_TO_MEM | DMA_SUPPORTS_MEM_TO_DEV;
+
+       return ret;
+}
+
+static int *udma_prep_dma_memcpy(struct udma_chan *uc, dma_addr_t dest,
+                                dma_addr_t src, size_t len)
+{
+       u32 tc_ring_id = k3_nav_ringacc_get_ring_id(uc->tchan->tc_ring);
+       struct cppi5_tr_type15_t *tr_req;
+       int num_tr;
+       size_t tr_size = sizeof(struct cppi5_tr_type15_t);
+       u16 tr0_cnt0, tr0_cnt1, tr1_cnt0;
+       unsigned long dummy;
+       void *tr_desc;
+       size_t desc_size;
+
+       if (len < SZ_64K) {
+               num_tr = 1;
+               tr0_cnt0 = len;
+               tr0_cnt1 = 1;
+       } else {
+               unsigned long align_to = __ffs(src | dest);
+
+               if (align_to > 3)
+                       align_to = 3;
+               /*
+                * Keep simple: tr0: SZ_64K-alignment blocks,
+                *              tr1: the remaining
+                */
+               num_tr = 2;
+               tr0_cnt0 = (SZ_64K - BIT(align_to));
+               if (len / tr0_cnt0 >= SZ_64K) {
+                       dev_err(uc->ud->dev, "size %zu is not supported\n",
+                               len);
+                       return NULL;
+               }
+
+               tr0_cnt1 = len / tr0_cnt0;
+               tr1_cnt0 = len % tr0_cnt0;
+       }
+
+       desc_size = cppi5_trdesc_calc_size(num_tr, tr_size);
+       tr_desc = dma_alloc_coherent(desc_size, &dummy);
+       if (!tr_desc)
+               return NULL;
+       memset(tr_desc, 0, desc_size);
+
+       cppi5_trdesc_init(tr_desc, num_tr, tr_size, 0, 0);
+       cppi5_desc_set_pktids(tr_desc, uc->id, 0x3fff);
+       cppi5_desc_set_retpolicy(tr_desc, 0, tc_ring_id);
+
+       tr_req = tr_desc + tr_size;
+
+       cppi5_tr_init(&tr_req[0].flags, CPPI5_TR_TYPE15, false, true,
+                     CPPI5_TR_EVENT_SIZE_COMPLETION, 1);
+       cppi5_tr_csf_set(&tr_req[0].flags, CPPI5_TR_CSF_SUPR_EVT);
+
+       tr_req[0].addr = src;
+       tr_req[0].icnt0 = tr0_cnt0;
+       tr_req[0].icnt1 = tr0_cnt1;
+       tr_req[0].icnt2 = 1;
+       tr_req[0].icnt3 = 1;
+       tr_req[0].dim1 = tr0_cnt0;
+
+       tr_req[0].daddr = dest;
+       tr_req[0].dicnt0 = tr0_cnt0;
+       tr_req[0].dicnt1 = tr0_cnt1;
+       tr_req[0].dicnt2 = 1;
+       tr_req[0].dicnt3 = 1;
+       tr_req[0].ddim1 = tr0_cnt0;
+
+       if (num_tr == 2) {
+               cppi5_tr_init(&tr_req[1].flags, CPPI5_TR_TYPE15, false, true,
+                             CPPI5_TR_EVENT_SIZE_COMPLETION, 0);
+               cppi5_tr_csf_set(&tr_req[1].flags, CPPI5_TR_CSF_SUPR_EVT);
+
+               tr_req[1].addr = src + tr0_cnt1 * tr0_cnt0;
+               tr_req[1].icnt0 = tr1_cnt0;
+               tr_req[1].icnt1 = 1;
+               tr_req[1].icnt2 = 1;
+               tr_req[1].icnt3 = 1;
+
+               tr_req[1].daddr = dest + tr0_cnt1 * tr0_cnt0;
+               tr_req[1].dicnt0 = tr1_cnt0;
+               tr_req[1].dicnt1 = 1;
+               tr_req[1].dicnt2 = 1;
+               tr_req[1].dicnt3 = 1;
+       }
+
+       cppi5_tr_csf_set(&tr_req[num_tr - 1].flags, CPPI5_TR_CSF_EOP);
+
+       if (!udma_is_coherent(uc)) {
+               flush_dcache_range((u64)tr_desc,
+                                  ALIGN((u64)tr_desc + desc_size,
+                                        ARCH_DMA_MINALIGN));
+       }
+
+       k3_nav_ringacc_ring_push(uc->tchan->t_ring, &tr_desc);
+
+       return 0;
+}
+
+static int udma_transfer(struct udevice *dev, int direction,
+                        void *dst, void *src, size_t len)
+{
+       struct udma_dev *ud = dev_get_priv(dev);
+       /* Channel0 is reserved for memcpy */
+       struct udma_chan *uc = &ud->channels[0];
+       dma_addr_t paddr = 0;
+       int ret;
+
+       ret = udma_alloc_chan_resources(uc);
+       if (ret)
+               return ret;
+
+       udma_prep_dma_memcpy(uc, (dma_addr_t)dst, (dma_addr_t)src, len);
+       udma_start(uc);
+       udma_poll_completion(uc, &paddr);
+       udma_stop(uc);
+
+       udma_free_chan_resources(uc);
+       return 0;
+}
+
+static int udma_request(struct dma *dma)
+{
+       struct udma_dev *ud = dev_get_priv(dma->dev);
+       struct udma_chan *uc;
+       unsigned long dummy;
+       int ret;
+
+       if (dma->id >= (ud->rchan_cnt + ud->tchan_cnt)) {
+               dev_err(dma->dev, "invalid dma ch_id %lu\n", dma->id);
+               return -EINVAL;
+       }
+
+       uc = &ud->channels[dma->id];
+       ret = udma_alloc_chan_resources(uc);
+       if (ret) {
+               dev_err(dma->dev, "alloc dma res failed %d\n", ret);
+               return -EINVAL;
+       }
+
+       uc->hdesc_size = cppi5_hdesc_calc_size(uc->needs_epib,
+                                              uc->psd_size, 0);
+       uc->hdesc_size = ALIGN(uc->hdesc_size, ARCH_DMA_MINALIGN);
+
+       if (uc->dir == DMA_MEM_TO_DEV) {
+               uc->desc_tx = dma_alloc_coherent(uc->hdesc_size, &dummy);
+               memset(uc->desc_tx, 0, uc->hdesc_size);
+       } else {
+               uc->desc_rx = dma_alloc_coherent(
+                               uc->hdesc_size * UDMA_RX_DESC_NUM, &dummy);
+               memset(uc->desc_rx, 0, uc->hdesc_size * UDMA_RX_DESC_NUM);
+       }
+
+       uc->in_use = true;
+       uc->desc_rx_cur = 0;
+       uc->num_rx_bufs = 0;
+
+       return 0;
+}
+
+static int udma_free(struct dma *dma)
+{
+       struct udma_dev *ud = dev_get_priv(dma->dev);
+       struct udma_chan *uc;
+
+       if (dma->id >= (ud->rchan_cnt + ud->tchan_cnt)) {
+               dev_err(dma->dev, "invalid dma ch_id %lu\n", dma->id);
+               return -EINVAL;
+       }
+       uc = &ud->channels[dma->id];
+
+       if (udma_is_chan_running(uc))
+               udma_stop(uc);
+       udma_free_chan_resources(uc);
+
+       uc->in_use = false;
+
+       return 0;
+}
+
+static int udma_enable(struct dma *dma)
+{
+       struct udma_dev *ud = dev_get_priv(dma->dev);
+       struct udma_chan *uc;
+       int ret;
+
+       if (dma->id >= (ud->rchan_cnt + ud->tchan_cnt)) {
+               dev_err(dma->dev, "invalid dma ch_id %lu\n", dma->id);
+               return -EINVAL;
+       }
+       uc = &ud->channels[dma->id];
+
+       ret = udma_start(uc);
+
+       return ret;
+}
+
+static int udma_disable(struct dma *dma)
+{
+       struct udma_dev *ud = dev_get_priv(dma->dev);
+       struct udma_chan *uc;
+       int ret = 0;
+
+       if (dma->id >= (ud->rchan_cnt + ud->tchan_cnt)) {
+               dev_err(dma->dev, "invalid dma ch_id %lu\n", dma->id);
+               return -EINVAL;
+       }
+       uc = &ud->channels[dma->id];
+
+       if (udma_is_chan_running(uc))
+               ret = udma_stop(uc);
+       else
+               dev_err(dma->dev, "%s not running\n", __func__);
+
+       return ret;
+}
+
+static int udma_send(struct dma *dma, void *src, size_t len, void *metadata)
+{
+       struct udma_dev *ud = dev_get_priv(dma->dev);
+       struct cppi5_host_desc_t *desc_tx;
+       dma_addr_t dma_src = (dma_addr_t)src;
+       struct ti_udma_drv_packet_data packet_data = { 0 };
+       dma_addr_t paddr;
+       struct udma_chan *uc;
+       u32 tc_ring_id;
+       int ret;
+
+       if (!metadata)
+               packet_data = *((struct ti_udma_drv_packet_data *)metadata);
+
+       if (dma->id >= (ud->rchan_cnt + ud->tchan_cnt)) {
+               dev_err(dma->dev, "invalid dma ch_id %lu\n", dma->id);
+               return -EINVAL;
+       }
+       uc = &ud->channels[dma->id];
+
+       if (uc->dir != DMA_MEM_TO_DEV)
+               return -EINVAL;
+
+       tc_ring_id = k3_nav_ringacc_get_ring_id(uc->tchan->tc_ring);
+
+       desc_tx = uc->desc_tx;
+
+       cppi5_hdesc_reset_hbdesc(desc_tx);
+
+       cppi5_hdesc_init(desc_tx,
+                        uc->needs_epib ? CPPI5_INFO0_HDESC_EPIB_PRESENT : 0,
+                        uc->psd_size);
+       cppi5_hdesc_set_pktlen(desc_tx, len);
+       cppi5_hdesc_attach_buf(desc_tx, dma_src, len, dma_src, len);
+       cppi5_desc_set_pktids(&desc_tx->hdr, uc->id, 0x3fff);
+       cppi5_desc_set_retpolicy(&desc_tx->hdr, 0, tc_ring_id);
+       /* pass below information from caller */
+       cppi5_hdesc_set_pkttype(desc_tx, packet_data.pkt_type);
+       cppi5_desc_set_tags_ids(&desc_tx->hdr, 0, packet_data.dest_tag);
+
+       if (!udma_is_coherent(uc)) {
+               flush_dcache_range((u64)dma_src,
+                                  ALIGN((u64)dma_src + len,
+                                        ARCH_DMA_MINALIGN));
+               flush_dcache_range((u64)desc_tx,
+                                  ALIGN((u64)desc_tx + uc->hdesc_size,
+                                        ARCH_DMA_MINALIGN));
+       }
+
+       ret = k3_nav_ringacc_ring_push(uc->tchan->t_ring, &uc->desc_tx);
+       if (ret) {
+               dev_err(dma->dev, "TX dma push fail ch_id %lu %d\n",
+                       dma->id, ret);
+               return ret;
+       }
+
+       udma_poll_completion(uc, &paddr);
+
+       return 0;
+}
+
+static int udma_receive(struct dma *dma, void **dst, void *metadata)
+{
+       struct udma_dev *ud = dev_get_priv(dma->dev);
+       struct cppi5_host_desc_t *desc_rx;
+       dma_addr_t buf_dma;
+       struct udma_chan *uc;
+       u32 buf_dma_len, pkt_len;
+       u32 port_id = 0;
+       int ret;
+
+       if (dma->id >= (ud->rchan_cnt + ud->tchan_cnt)) {
+               dev_err(dma->dev, "invalid dma ch_id %lu\n", dma->id);
+               return -EINVAL;
+       }
+       uc = &ud->channels[dma->id];
+
+       if (uc->dir != DMA_DEV_TO_MEM)
+               return -EINVAL;
+       if (!uc->num_rx_bufs)
+               return -EINVAL;
+
+       ret = k3_nav_ringacc_ring_pop(uc->rchan->r_ring, &desc_rx);
+       if (ret && ret != -ENODATA) {
+               dev_err(dma->dev, "rx dma fail ch_id:%lu %d\n", dma->id, ret);
+               return ret;
+       } else if (ret == -ENODATA) {
+               return 0;
+       }
+
+       /* invalidate cache data */
+       if (!udma_is_coherent(uc)) {
+               invalidate_dcache_range((ulong)desc_rx,
+                                       (ulong)(desc_rx + uc->hdesc_size));
+       }
+
+       cppi5_hdesc_get_obuf(desc_rx, &buf_dma, &buf_dma_len);
+       pkt_len = cppi5_hdesc_get_pktlen(desc_rx);
+
+       /* invalidate cache data */
+       if (!udma_is_coherent(uc)) {
+               invalidate_dcache_range((ulong)buf_dma,
+                                       (ulong)(buf_dma + buf_dma_len));
+       }
+
+       cppi5_desc_get_tags_ids(&desc_rx->hdr, &port_id, NULL);
+
+       *dst = (void *)buf_dma;
+       uc->num_rx_bufs--;
+
+       return pkt_len;
+}
+
+static int udma_of_xlate(struct dma *dma, struct ofnode_phandle_args *args)
+{
+       struct udma_dev *ud = dev_get_priv(dma->dev);
+       struct udma_chan *uc = &ud->channels[0];
+       ofnode chconf_node, slave_node;
+       char prop[50];
+       u32 val;
+
+       for (val = 0; val < ud->ch_count; val++) {
+               uc = &ud->channels[val];
+               if (!uc->in_use)
+                       break;
+       }
+
+       if (val == ud->ch_count)
+               return -EBUSY;
+
+       uc->dir = DMA_DEV_TO_MEM;
+       if (args->args[2] == UDMA_DIR_TX)
+               uc->dir = DMA_MEM_TO_DEV;
+
+       slave_node = ofnode_get_by_phandle(args->args[0]);
+       if (!ofnode_valid(slave_node)) {
+               dev_err(ud->dev, "slave node is missing\n");
+               return -EINVAL;
+       }
+
+       snprintf(prop, sizeof(prop), "ti,psil-config%u", args->args[1]);
+       chconf_node = ofnode_find_subnode(slave_node, prop);
+       if (!ofnode_valid(chconf_node)) {
+               dev_err(ud->dev, "Channel configuration node is missing\n");
+               return -EINVAL;
+       }
+
+       if (!ofnode_read_u32(chconf_node, "linux,udma-mode", &val)) {
+               if (val == UDMA_PKT_MODE)
+                       uc->pkt_mode = true;
+       }
+
+       if (!ofnode_read_u32(chconf_node, "statictr-type", &val))
+               uc->static_tr_type = val;
+
+       uc->needs_epib = ofnode_read_bool(chconf_node, "ti,needs-epib");
+       if (!ofnode_read_u32(chconf_node, "ti,psd-size", &val))
+               uc->psd_size = val;
+       uc->metadata_size = (uc->needs_epib ? 16 : 0) + uc->psd_size;
+
+       if (ofnode_read_u32(slave_node, "ti,psil-base", &val)) {
+               dev_err(ud->dev, "ti,psil-base is missing\n");
+               return -EINVAL;
+       }
+
+       uc->slave_thread_id = val + args->args[1];
+
+       dma->id = uc->id;
+       pr_debug("Allocated dma chn:%lu epib:%d psdata:%u meta:%u thread_id:%x\n",
+                dma->id, uc->needs_epib,
+                uc->psd_size, uc->metadata_size,
+                uc->slave_thread_id);
+
+       return 0;
+}
+
+int udma_prepare_rcv_buf(struct dma *dma, void *dst, size_t size)
+{
+       struct udma_dev *ud = dev_get_priv(dma->dev);
+       struct cppi5_host_desc_t *desc_rx;
+       dma_addr_t dma_dst;
+       struct udma_chan *uc;
+       u32 desc_num;
+
+       if (dma->id >= (ud->rchan_cnt + ud->tchan_cnt)) {
+               dev_err(dma->dev, "invalid dma ch_id %lu\n", dma->id);
+               return -EINVAL;
+       }
+       uc = &ud->channels[dma->id];
+
+       if (uc->dir != DMA_DEV_TO_MEM)
+               return -EINVAL;
+
+       if (uc->num_rx_bufs >= UDMA_RX_DESC_NUM)
+               return -EINVAL;
+
+       desc_num = uc->desc_rx_cur % UDMA_RX_DESC_NUM;
+       desc_rx = uc->desc_rx + (desc_num * uc->hdesc_size);
+       dma_dst = (dma_addr_t)dst;
+
+       cppi5_hdesc_reset_hbdesc(desc_rx);
+
+       cppi5_hdesc_init(desc_rx,
+                        uc->needs_epib ? CPPI5_INFO0_HDESC_EPIB_PRESENT : 0,
+                        uc->psd_size);
+       cppi5_hdesc_set_pktlen(desc_rx, size);
+       cppi5_hdesc_attach_buf(desc_rx, dma_dst, size, dma_dst, size);
+
+       if (!udma_is_coherent(uc)) {
+               flush_dcache_range((u64)desc_rx,
+                                  ALIGN((u64)desc_rx + uc->hdesc_size,
+                                        ARCH_DMA_MINALIGN));
+       }
+
+       k3_nav_ringacc_ring_push(uc->rchan->fd_ring, &desc_rx);
+
+       uc->num_rx_bufs++;
+       uc->desc_rx_cur++;
+
+       return 0;
+}
+
+static const struct dma_ops udma_ops = {
+       .transfer       = udma_transfer,
+       .of_xlate       = udma_of_xlate,
+       .request        = udma_request,
+       .free           = udma_free,
+       .enable         = udma_enable,
+       .disable        = udma_disable,
+       .send           = udma_send,
+       .receive        = udma_receive,
+       .prepare_rcv_buf = udma_prepare_rcv_buf,
+};
+
+static const struct udevice_id udma_ids[] = {
+       { .compatible = "ti,k3-navss-udmap" },
+       { }
+};
+
+U_BOOT_DRIVER(ti_edma3) = {
+       .name   = "ti-udma",
+       .id     = UCLASS_DMA,
+       .of_match = udma_ids,
+       .ops    = &udma_ops,
+       .probe  = udma_probe,
+       .priv_auto_alloc_size = sizeof(struct udma_dev),
+};
index 4d264c985d7e9593932b270c98a0477f126cc52e..4268628f5ef0210507c5d23f2e4209b2afc07029 100644 (file)
@@ -17,6 +17,7 @@ static void getvar_downloadsize(char *var_parameter, char *response);
 static void getvar_serialno(char *var_parameter, char *response);
 static void getvar_version_baseband(char *var_parameter, char *response);
 static void getvar_product(char *var_parameter, char *response);
+static void getvar_platform(char *var_parameter, char *response);
 static void getvar_current_slot(char *var_parameter, char *response);
 static void getvar_slot_suffixes(char *var_parameter, char *response);
 static void getvar_has_slot(char *var_parameter, char *response);
@@ -55,6 +56,9 @@ static const struct {
        }, {
                .variable = "product",
                .dispatch = getvar_product
+       }, {
+               .variable = "platform",
+               .dispatch = getvar_platform
        }, {
                .variable = "current-slot",
                .dispatch = getvar_current_slot
@@ -62,7 +66,7 @@ static const struct {
                .variable = "slot-suffixes",
                .dispatch = getvar_slot_suffixes
        }, {
-               .variable = "has_slot",
+               .variable = "has-slot",
                .dispatch = getvar_has_slot
 #if CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC)
        }, {
@@ -117,6 +121,16 @@ static void getvar_product(char *var_parameter, char *response)
                fastboot_fail("Board not set", response);
 }
 
+static void getvar_platform(char *var_parameter, char *response)
+{
+       const char *p = env_get("platform");
+
+       if (p)
+               fastboot_okay(p, response);
+       else
+               fastboot_fail("platform not set", response);
+}
+
 static void getvar_current_slot(char *var_parameter, char *response)
 {
        /* A/B not implemented, for now always return _a */
index 4c1c7fd2cd8d08d1c90817beadb2341827d4cb24..90ca81da9b5f338f09a27873fb142d142a07933e 100644 (file)
@@ -31,13 +31,13 @@ static int part_get_info_by_name_or_alias(struct blk_desc *dev_desc,
 
        ret = part_get_info_by_name(dev_desc, name, info);
        if (ret < 0) {
-               /* strlen("fastboot_partition_alias_") + 32(part_name) + 1 */
-               char env_alias_name[25 + 32 + 1];
+               /* strlen("fastboot_partition_alias_") + PART_NAME_LEN + 1 */
+               char env_alias_name[25 + PART_NAME_LEN + 1];
                char *aliased_part_name;
 
                /* check for alias */
                strcpy(env_alias_name, "fastboot_partition_alias_");
-               strncat(env_alias_name, name, 32);
+               strncat(env_alias_name, name, PART_NAME_LEN);
                aliased_part_name = env_get(env_alias_name);
                if (aliased_part_name != NULL)
                        ret = part_get_info_by_name(dev_desc,
@@ -308,8 +308,8 @@ int fastboot_mmc_get_part_info(char *part_name, struct blk_desc **dev_desc,
                fastboot_fail("block device not found", response);
                return -ENOENT;
        }
-       if (!part_name) {
-               fastboot_fail("partition not found", response);
+       if (!part_name || !strcmp(part_name, "")) {
+               fastboot_fail("partition not given", response);
                return -ENOENT;
        }
 
index 91481260411aa5a0b7f13ad823089f98a1da2236..d47d22fff3e4661e36bbbd876f1cd10815257411 100644 (file)
@@ -12,6 +12,7 @@
 #include <errno.h>
 #include <mailbox.h>
 #include <dm/device.h>
+#include <linux/compat.h>
 #include <linux/err.h>
 #include <linux/soc/ti/k3-sec-proxy.h>
 #include <linux/soc/ti/ti_sci_protocol.h>
@@ -31,16 +32,37 @@ struct ti_sci_xfer {
        u8 rx_len;
 };
 
+/**
+ * struct ti_sci_rm_type_map - Structure representing TISCI Resource
+ *                             management representation of dev_ids.
+ * @dev_id:    TISCI device ID
+ * @type:      Corresponding id as identified by TISCI RM.
+ *
+ * Note: This is used only as a work around for using RM range apis
+ *     for AM654 SoC. For future SoCs dev_id will be used as type
+ *     for RM range APIs. In order to maintain ABI backward compatibility
+ *     type is not being changed for AM654 SoC.
+ */
+struct ti_sci_rm_type_map {
+       u32 dev_id;
+       u16 type;
+};
+
 /**
  * struct ti_sci_desc - Description of SoC integration
- * @host_id:           Host identifier representing the compute entity
- * @max_rx_timeout_us: Timeout for communication with SoC (in Microseconds)
- * @max_msg_size:      Maximum size of data per message that can be handled.
+ * @default_host_id:   Host identifier representing the compute entity
+ * @max_rx_timeout_ms: Timeout for communication with SoC (in Milliseconds)
+ * @max_msgs: Maximum number of messages that can be pending
+ *               simultaneously in the system
+ * @max_msg_size: Maximum size of data per message that can be handled.
+ * @rm_type_map: RM resource type mapping structure.
  */
 struct ti_sci_desc {
-       u8 host_id;
-       int max_rx_timeout_us;
+       u8 default_host_id;
+       int max_rx_timeout_ms;
+       int max_msgs;
        int max_msg_size;
+       struct ti_sci_rm_type_map *rm_type_map;
 };
 
 /**
@@ -136,7 +158,7 @@ static inline int ti_sci_get_response(struct ti_sci_info *info,
        int ret;
 
        /* Receive the response */
-       ret = mbox_recv(chan, msg, info->desc->max_rx_timeout_us);
+       ret = mbox_recv(chan, msg, info->desc->max_rx_timeout_ms);
        if (ret) {
                dev_err(info->dev, "%s: Message receive failed. ret = %d\n",
                        __func__, ret);
@@ -1441,6 +1463,199 @@ static int ti_sci_cmd_core_reboot(const struct ti_sci_handle *handle)
        return ret;
 }
 
+static int ti_sci_get_resource_type(struct ti_sci_info *info, u16 dev_id,
+                                   u16 *type)
+{
+       struct ti_sci_rm_type_map *rm_type_map = info->desc->rm_type_map;
+       bool found = false;
+       int i;
+
+       /* If map is not provided then assume dev_id is used as type */
+       if (!rm_type_map) {
+               *type = dev_id;
+               return 0;
+       }
+
+       for (i = 0; rm_type_map[i].dev_id; i++) {
+               if (rm_type_map[i].dev_id == dev_id) {
+                       *type = rm_type_map[i].type;
+                       found = true;
+                       break;
+               }
+       }
+
+       if (!found)
+               return -EINVAL;
+
+       return 0;
+}
+
+/**
+ * ti_sci_get_resource_range - Helper to get a range of resources assigned
+ *                            to a host. Resource is uniquely identified by
+ *                            type and subtype.
+ * @handle:            Pointer to TISCI handle.
+ * @dev_id:            TISCI device ID.
+ * @subtype:           Resource assignment subtype that is being requested
+ *                     from the given device.
+ * @s_host:            Host processor ID to which the resources are allocated
+ * @range_start:       Start index of the resource range
+ * @range_num:         Number of resources in the range
+ *
+ * Return: 0 if all went fine, else return appropriate error.
+ */
+static int ti_sci_get_resource_range(const struct ti_sci_handle *handle,
+                                    u32 dev_id, u8 subtype, u8 s_host,
+                                    u16 *range_start, u16 *range_num)
+{
+       struct ti_sci_msg_resp_get_resource_range *resp;
+       struct ti_sci_msg_req_get_resource_range req;
+       struct ti_sci_xfer *xfer;
+       struct ti_sci_info *info;
+       u16 type;
+       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_GET_RESOURCE_RANGE,
+                                    TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                    (u32 *)&req, sizeof(req), sizeof(*resp));
+       if (IS_ERR(xfer)) {
+               ret = PTR_ERR(xfer);
+               dev_err(dev, "Message alloc failed(%d)\n", ret);
+               return ret;
+       }
+
+       ret = ti_sci_get_resource_type(info, dev_id, &type);
+       if (ret) {
+               dev_err(dev, "rm type lookup failed for %u\n", dev_id);
+               goto fail;
+       }
+
+       req.secondary_host = s_host;
+       req.type = type & MSG_RM_RESOURCE_TYPE_MASK;
+       req.subtype = subtype & MSG_RM_RESOURCE_SUBTYPE_MASK;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(dev, "Mbox send fail %d\n", ret);
+               goto fail;
+       }
+
+       resp = (struct ti_sci_msg_resp_get_resource_range *)xfer->tx_message.buf;
+       if (!ti_sci_is_response_ack(resp)) {
+               ret = -ENODEV;
+       } else if (!resp->range_start && !resp->range_num) {
+               ret = -ENODEV;
+       } else {
+               *range_start = resp->range_start;
+               *range_num = resp->range_num;
+       };
+
+fail:
+       return ret;
+}
+
+/**
+ * ti_sci_cmd_get_resource_range - Get a range of resources assigned to host
+ *                                that is same as ti sci interface host.
+ * @handle:            Pointer to TISCI handle.
+ * @dev_id:            TISCI device ID.
+ * @subtype:           Resource assignment subtype that is being requested
+ *                     from the given device.
+ * @range_start:       Start index of the resource range
+ * @range_num:         Number of resources in the range
+ *
+ * Return: 0 if all went fine, else return appropriate error.
+ */
+static int ti_sci_cmd_get_resource_range(const struct ti_sci_handle *handle,
+                                        u32 dev_id, u8 subtype,
+                                        u16 *range_start, u16 *range_num)
+{
+       return ti_sci_get_resource_range(handle, dev_id, subtype,
+                                        TI_SCI_IRQ_SECONDARY_HOST_INVALID,
+                                        range_start, range_num);
+}
+
+/**
+ * ti_sci_cmd_get_resource_range_from_shost - Get a range of resources
+ *                                           assigned to a specified host.
+ * @handle:            Pointer to TISCI handle.
+ * @dev_id:            TISCI device ID.
+ * @subtype:           Resource assignment subtype that is being requested
+ *                     from the given device.
+ * @s_host:            Host processor ID to which the resources are allocated
+ * @range_start:       Start index of the resource range
+ * @range_num:         Number of resources in the range
+ *
+ * Return: 0 if all went fine, else return appropriate error.
+ */
+static
+int ti_sci_cmd_get_resource_range_from_shost(const struct ti_sci_handle *handle,
+                                            u32 dev_id, u8 subtype, u8 s_host,
+                                            u16 *range_start, u16 *range_num)
+{
+       return ti_sci_get_resource_range(handle, dev_id, subtype, s_host,
+                                        range_start, range_num);
+}
+
+/**
+ * ti_sci_cmd_query_msmc() - Command to query currently available msmc memory
+ * @handle:            pointer to TI SCI handle
+ * @msms_start:                MSMC start as returned by tisci
+ * @msmc_end:          MSMC end as returned by tisci
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ */
+static int ti_sci_cmd_query_msmc(const struct ti_sci_handle *handle,
+                                u64 *msmc_start, u64 *msmc_end)
+{
+       struct ti_sci_msg_resp_query_msmc *resp;
+       struct ti_sci_msg_hdr req;
+       struct ti_sci_info *info;
+       struct ti_sci_xfer *xfer;
+       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, TISCI_MSG_QUERY_MSMC,
+                                    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, "Message alloc failed(%d)\n", ret);
+               return ret;
+       }
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(dev, "Mbox send fail %d\n", ret);
+               return ret;
+       }
+
+       resp = (struct ti_sci_msg_resp_query_msmc *)xfer->tx_message.buf;
+
+       if (!ti_sci_is_response_ack(resp))
+               return -ENODEV;
+
+       *msmc_start = ((u64)resp->msmc_start_high << TISCI_ADDR_HIGH_SHIFT) |
+                       resp->msmc_start_low;
+       *msmc_end = ((u64)resp->msmc_end_high << TISCI_ADDR_HIGH_SHIFT) |
+                       resp->msmc_end_low;
+
+       return ret;
+}
+
 /**
  * ti_sci_cmd_proc_request() - Command to request a physical processor control
  * @handle:    Pointer to TI SCI handle
@@ -1803,6 +2018,416 @@ static int ti_sci_cmd_get_proc_boot_status(const struct ti_sci_handle *handle,
        return ret;
 }
 
+/**
+ * ti_sci_cmd_ring_config() - configure RA ring
+ * @handle:    pointer to TI SCI handle
+ * @valid_params: Bitfield defining validity of ring configuration parameters.
+ * @nav_id: Device ID of Navigator Subsystem from which the ring is allocated
+ * @index: Ring index.
+ * @addr_lo: The ring base address lo 32 bits
+ * @addr_hi: The ring base address hi 32 bits
+ * @count: Number of ring elements.
+ * @mode: The mode of the ring
+ * @size: The ring element size.
+ * @order_id: Specifies the ring's bus order ID.
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ *
+ * See @ti_sci_msg_rm_ring_cfg_req for more info.
+ */
+static int ti_sci_cmd_ring_config(const struct ti_sci_handle *handle,
+                                 u32 valid_params, u16 nav_id, u16 index,
+                                 u32 addr_lo, u32 addr_hi, u32 count,
+                                 u8 mode, u8 size, u8 order_id)
+{
+       struct ti_sci_msg_rm_ring_cfg_resp *resp;
+       struct ti_sci_msg_rm_ring_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_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 config failed(%d)\n", ret);
+               return ret;
+       }
+       req.valid_params = valid_params;
+       req.nav_id = nav_id;
+       req.index = index;
+       req.addr_lo = addr_lo;
+       req.addr_hi = addr_hi;
+       req.count = count;
+       req.mode = mode;
+       req.size = size;
+       req.order_id = order_id;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(info->dev, "RM_RA:Mbox config send fail %d\n", ret);
+               goto fail;
+       }
+
+       resp = (struct ti_sci_msg_rm_ring_cfg_resp *)xfer->tx_message.buf;
+
+       ret = ti_sci_is_response_ack(resp) ? 0 : -ENODEV;
+
+fail:
+       dev_dbg(info->dev, "RM_RA:config ring %u ret:%d\n", index, ret);
+       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)
+{
+       struct ti_sci_msg_hdr *resp;
+       struct ti_sci_msg_psil_pair 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_PSIL_PAIR,
+                                    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_PSIL:Message alloc failed(%d)\n", ret);
+               return ret;
+       }
+       req.nav_id = nav_id;
+       req.src_thread = src_thread;
+       req.dst_thread = dst_thread;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(info->dev, "RM_PSIL:Mbox send fail %d\n", ret);
+               goto fail;
+       }
+
+       resp = (struct ti_sci_msg_hdr *)xfer->tx_message.buf;
+       ret = ti_sci_is_response_ack(resp) ? 0 : -ENODEV;
+
+fail:
+       dev_dbg(info->dev, "RM_PSIL: nav: %u link pair %u->%u ret:%u\n",
+               nav_id, src_thread, dst_thread, ret);
+       return ret;
+}
+
+static int ti_sci_cmd_rm_psil_unpair(const struct ti_sci_handle *handle,
+                                    u32 nav_id, u32 src_thread, u32 dst_thread)
+{
+       struct ti_sci_msg_hdr *resp;
+       struct ti_sci_msg_psil_unpair 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_PSIL_UNPAIR,
+                                    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_PSIL:Message alloc failed(%d)\n", ret);
+               return ret;
+       }
+       req.nav_id = nav_id;
+       req.src_thread = src_thread;
+       req.dst_thread = dst_thread;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(info->dev, "RM_PSIL:Mbox send fail %d\n", ret);
+               goto fail;
+       }
+
+       resp = (struct ti_sci_msg_hdr *)xfer->tx_message.buf;
+       ret = ti_sci_is_response_ack(resp) ? 0 : -ENODEV;
+
+fail:
+       dev_dbg(info->dev, "RM_PSIL: link unpair %u->%u ret:%u\n",
+               src_thread, dst_thread, ret);
+       return ret;
+}
+
+static int ti_sci_cmd_rm_udmap_tx_ch_cfg(
+                       const struct ti_sci_handle *handle,
+                       const struct ti_sci_msg_rm_udmap_tx_ch_cfg *params)
+{
+       struct ti_sci_msg_rm_udmap_tx_ch_cfg_resp *resp;
+       struct ti_sci_msg_rm_udmap_tx_ch_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, TISCI_MSG_RM_UDMAP_TX_CH_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, "Message TX_CH_CFG alloc failed(%d)\n", ret);
+               return ret;
+       }
+       req.valid_params = params->valid_params;
+       req.nav_id = params->nav_id;
+       req.index = params->index;
+       req.tx_pause_on_err = params->tx_pause_on_err;
+       req.tx_filt_einfo = params->tx_filt_einfo;
+       req.tx_filt_pswords = params->tx_filt_pswords;
+       req.tx_atype = params->tx_atype;
+       req.tx_chan_type = params->tx_chan_type;
+       req.tx_supr_tdpkt = params->tx_supr_tdpkt;
+       req.tx_fetch_size = params->tx_fetch_size;
+       req.tx_credit_count = params->tx_credit_count;
+       req.txcq_qnum = params->txcq_qnum;
+       req.tx_priority = params->tx_priority;
+       req.tx_qos = params->tx_qos;
+       req.tx_orderid = params->tx_orderid;
+       req.fdepth = params->fdepth;
+       req.tx_sched_priority = params->tx_sched_priority;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(info->dev, "Mbox send TX_CH_CFG fail %d\n", ret);
+               goto fail;
+       }
+
+       resp =
+             (struct ti_sci_msg_rm_udmap_tx_ch_cfg_resp *)xfer->tx_message.buf;
+       ret = ti_sci_is_response_ack(resp) ? 0 : -EINVAL;
+
+fail:
+       dev_dbg(info->dev, "TX_CH_CFG: chn %u ret:%u\n", params->index, ret);
+       return ret;
+}
+
+static int ti_sci_cmd_rm_udmap_rx_ch_cfg(
+                       const struct ti_sci_handle *handle,
+                       const struct ti_sci_msg_rm_udmap_rx_ch_cfg *params)
+{
+       struct ti_sci_msg_rm_udmap_rx_ch_cfg_resp *resp;
+       struct ti_sci_msg_rm_udmap_rx_ch_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, TISCI_MSG_RM_UDMAP_RX_CH_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, "Message RX_CH_CFG alloc failed(%d)\n", ret);
+               return ret;
+       }
+
+       req.valid_params = params->valid_params;
+       req.nav_id = params->nav_id;
+       req.index = params->index;
+       req.rx_fetch_size = params->rx_fetch_size;
+       req.rxcq_qnum = params->rxcq_qnum;
+       req.rx_priority = params->rx_priority;
+       req.rx_qos = params->rx_qos;
+       req.rx_orderid = params->rx_orderid;
+       req.rx_sched_priority = params->rx_sched_priority;
+       req.flowid_start = params->flowid_start;
+       req.flowid_cnt = params->flowid_cnt;
+       req.rx_pause_on_err = params->rx_pause_on_err;
+       req.rx_atype = params->rx_atype;
+       req.rx_chan_type = params->rx_chan_type;
+       req.rx_ignore_short = params->rx_ignore_short;
+       req.rx_ignore_long = params->rx_ignore_long;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(info->dev, "Mbox send RX_CH_CFG fail %d\n", ret);
+               goto fail;
+       }
+
+       resp =
+             (struct ti_sci_msg_rm_udmap_rx_ch_cfg_resp *)xfer->tx_message.buf;
+       ret = ti_sci_is_response_ack(resp) ? 0 : -EINVAL;
+
+fail:
+       dev_dbg(info->dev, "RX_CH_CFG: chn %u ret:%d\n", params->index, ret);
+       return ret;
+}
+
+static int ti_sci_cmd_rm_udmap_rx_flow_cfg(
+                       const struct ti_sci_handle *handle,
+                       const struct ti_sci_msg_rm_udmap_flow_cfg *params)
+{
+       struct ti_sci_msg_rm_udmap_flow_cfg_resp *resp;
+       struct ti_sci_msg_rm_udmap_flow_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, TISCI_MSG_RM_UDMAP_FLOW_CFG,
+                                    TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                    (u32 *)&req, sizeof(req), sizeof(*resp));
+       if (IS_ERR(xfer)) {
+               ret = PTR_ERR(xfer);
+               dev_err(dev, "RX_FL_CFG: Message alloc failed(%d)\n", ret);
+               return ret;
+       }
+
+       req.valid_params = params->valid_params;
+       req.nav_id = params->nav_id;
+       req.flow_index = params->flow_index;
+       req.rx_einfo_present = params->rx_einfo_present;
+       req.rx_psinfo_present = params->rx_psinfo_present;
+       req.rx_error_handling = params->rx_error_handling;
+       req.rx_desc_type = params->rx_desc_type;
+       req.rx_sop_offset = params->rx_sop_offset;
+       req.rx_dest_qnum = params->rx_dest_qnum;
+       req.rx_src_tag_hi = params->rx_src_tag_hi;
+       req.rx_src_tag_lo = params->rx_src_tag_lo;
+       req.rx_dest_tag_hi = params->rx_dest_tag_hi;
+       req.rx_dest_tag_lo = params->rx_dest_tag_lo;
+       req.rx_src_tag_hi_sel = params->rx_src_tag_hi_sel;
+       req.rx_src_tag_lo_sel = params->rx_src_tag_lo_sel;
+       req.rx_dest_tag_hi_sel = params->rx_dest_tag_hi_sel;
+       req.rx_dest_tag_lo_sel = params->rx_dest_tag_lo_sel;
+       req.rx_fdq0_sz0_qnum = params->rx_fdq0_sz0_qnum;
+       req.rx_fdq1_qnum = params->rx_fdq1_qnum;
+       req.rx_fdq2_qnum = params->rx_fdq2_qnum;
+       req.rx_fdq3_qnum = params->rx_fdq3_qnum;
+       req.rx_ps_location = params->rx_ps_location;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(dev, "RX_FL_CFG: Mbox send fail %d\n", ret);
+               goto fail;
+       }
+
+       resp =
+              (struct ti_sci_msg_rm_udmap_flow_cfg_resp *)xfer->tx_message.buf;
+       ret = ti_sci_is_response_ack(resp) ? 0 : -EINVAL;
+
+fail:
+       dev_dbg(info->dev, "RX_FL_CFG: %u ret:%d\n", params->flow_index, ret);
+       return ret;
+}
+
 /*
  * ti_sci_setup_ops() - Setup the operations structures
  * @info:      pointer to TISCI pointer
@@ -1814,7 +2439,11 @@ static void ti_sci_setup_ops(struct ti_sci_info *info)
        struct ti_sci_dev_ops *dops = &ops->dev_ops;
        struct ti_sci_clk_ops *cops = &ops->clk_ops;
        struct ti_sci_core_ops *core_ops = &ops->core_ops;
+       struct ti_sci_rm_core_ops *rm_core_ops = &ops->rm_core_ops;
        struct ti_sci_proc_ops *pops = &ops->proc_ops;
+       struct ti_sci_rm_ringacc_ops *rops = &ops->rm_ring_ops;
+       struct ti_sci_rm_psil_ops *psilops = &ops->rm_psil_ops;
+       struct ti_sci_rm_udmap_ops *udmap_ops = &ops->rm_udmap_ops;
 
        bops->board_config = ti_sci_cmd_set_board_config;
        bops->board_config_rm = ti_sci_cmd_set_board_config_rm;
@@ -1849,6 +2478,11 @@ static void ti_sci_setup_ops(struct ti_sci_info *info)
        cops->get_freq = ti_sci_cmd_clk_get_freq;
 
        core_ops->reboot_device = ti_sci_cmd_core_reboot;
+       core_ops->query_msmc = ti_sci_cmd_query_msmc;
+
+       rm_core_ops->get_range = ti_sci_cmd_get_resource_range;
+       rm_core_ops->get_range_from_shost =
+               ti_sci_cmd_get_resource_range_from_shost;
 
        pops->proc_request = ti_sci_cmd_proc_request;
        pops->proc_release = ti_sci_cmd_proc_release;
@@ -1857,6 +2491,16 @@ static void ti_sci_setup_ops(struct ti_sci_info *info)
        pops->set_proc_boot_ctrl = ti_sci_cmd_set_proc_boot_ctrl;
        pops->proc_auth_boot_image = ti_sci_cmd_proc_auth_boot_image;
        pops->get_proc_boot_status = ti_sci_cmd_get_proc_boot_status;
+
+       rops->config = ti_sci_cmd_ring_config;
+       rops->get_config = ti_sci_cmd_ring_get_config;
+
+       psilops->pair = ti_sci_cmd_rm_psil_pair;
+       psilops->unpair = ti_sci_cmd_rm_psil_unpair;
+
+       udmap_ops->tx_ch_cfg = ti_sci_cmd_rm_udmap_tx_ch_cfg;
+       udmap_ops->rx_ch_cfg = ti_sci_cmd_rm_udmap_rx_ch_cfg;
+       udmap_ops->rx_flow_cfg = ti_sci_cmd_rm_udmap_rx_flow_cfg;
 }
 
 /**
@@ -1969,7 +2613,7 @@ static int ti_sci_of_to_info(struct udevice *dev, struct ti_sci_info *info)
        }
 
        info->host_id = dev_read_u32_default(dev, "ti,host-id",
-                                            info->desc->host_id);
+                                            info->desc->default_host_id);
 
        info->is_secure = dev_read_bool(dev, "ti,secure-host");
 
@@ -2009,17 +2653,164 @@ static int ti_sci_probe(struct udevice *dev)
        return ret;
 }
 
+/*
+ * ti_sci_get_free_resource() - Get a free resource from TISCI resource.
+ * @res:       Pointer to the TISCI resource
+ *
+ * Return: resource num if all went ok else TI_SCI_RESOURCE_NULL.
+ */
+u16 ti_sci_get_free_resource(struct ti_sci_resource *res)
+{
+       u16 set, free_bit;
+
+       for (set = 0; set < res->sets; set++) {
+               free_bit = find_first_zero_bit(res->desc[set].res_map,
+                                              res->desc[set].num);
+               if (free_bit != res->desc[set].num) {
+                       set_bit(free_bit, res->desc[set].res_map);
+                       return res->desc[set].start + free_bit;
+               }
+       }
+
+       return TI_SCI_RESOURCE_NULL;
+}
+
+/**
+ * ti_sci_release_resource() - Release a resource from TISCI resource.
+ * @res:       Pointer to the TISCI resource
+ */
+void ti_sci_release_resource(struct ti_sci_resource *res, u16 id)
+{
+       u16 set;
+
+       for (set = 0; set < res->sets; set++) {
+               if (res->desc[set].start <= id &&
+                   (res->desc[set].num + res->desc[set].start) > id)
+                       clear_bit(id - res->desc[set].start,
+                                 res->desc[set].res_map);
+       }
+}
+
+/**
+ * devm_ti_sci_get_of_resource() - Get a TISCI resource assigned to a device
+ * @handle:    TISCI handle
+ * @dev:       Device pointer to which the resource is assigned
+ * @of_prop:   property name by which the resource are represented
+ *
+ * Note: This function expects of_prop to be in the form of tuples
+ *     <type, subtype>. Allocates and initializes ti_sci_resource structure
+ *     for each of_prop. Client driver can directly call
+ *     ti_sci_(get_free, release)_resource apis for handling the resource.
+ *
+ * Return: Pointer to ti_sci_resource if all went well else appropriate
+ *        error pointer.
+ */
+struct ti_sci_resource *
+devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
+                           struct udevice *dev, u32 dev_id, char *of_prop)
+{
+       u32 resource_subtype;
+       u16 resource_type;
+       struct ti_sci_resource *res;
+       int sets, i, ret;
+       u32 *temp;
+
+       res = devm_kzalloc(dev, sizeof(*res), GFP_KERNEL);
+       if (!res)
+               return ERR_PTR(-ENOMEM);
+
+       sets = dev_read_size(dev, of_prop);
+       if (sets < 0) {
+               dev_err(dev, "%s resource type ids not available\n", of_prop);
+               return ERR_PTR(sets);
+       }
+       temp = malloc(sets);
+       sets /= sizeof(u32);
+       res->sets = sets;
+
+       res->desc = devm_kcalloc(dev, res->sets, sizeof(*res->desc),
+                                GFP_KERNEL);
+       if (!res->desc)
+               return ERR_PTR(-ENOMEM);
+
+       ret = ti_sci_get_resource_type(handle_to_ti_sci_info(handle), dev_id,
+                                      &resource_type);
+       if (ret) {
+               dev_err(dev, "No valid resource type for %u\n", dev_id);
+               return ERR_PTR(-EINVAL);
+       }
+
+       ret = dev_read_u32_array(dev, of_prop, temp, res->sets);
+       if (ret)
+               return ERR_PTR(-EINVAL);
+
+       for (i = 0; i < res->sets; i++) {
+               resource_subtype = temp[i];
+               ret = handle->ops.rm_core_ops.get_range(handle, dev_id,
+                                                       resource_subtype,
+                                                       &res->desc[i].start,
+                                                       &res->desc[i].num);
+               if (ret) {
+                       dev_err(dev, "type %d subtype %d not allocated for host %d\n",
+                               resource_type, resource_subtype,
+                               handle_to_ti_sci_info(handle)->host_id);
+                       return ERR_PTR(ret);
+               }
+
+               dev_dbg(dev, "res type = %d, subtype = %d, start = %d, num = %d\n",
+                       resource_type, resource_subtype, res->desc[i].start,
+                       res->desc[i].num);
+
+               res->desc[i].res_map =
+                       devm_kzalloc(dev, BITS_TO_LONGS(res->desc[i].num) *
+                                    sizeof(*res->desc[i].res_map), GFP_KERNEL);
+               if (!res->desc[i].res_map)
+                       return ERR_PTR(-ENOMEM);
+       }
+
+       return res;
+}
+
+/* Description for K2G */
+static const struct ti_sci_desc ti_sci_pmmc_k2g_desc = {
+       .default_host_id = 2,
+       /* Conservative duration */
+       .max_rx_timeout_ms = 10000,
+       /* Limited by MBOX_TX_QUEUE_LEN. K2G can handle upto 128 messages! */
+       .max_msgs = 20,
+       .max_msg_size = 64,
+       .rm_type_map = NULL,
+};
+
+static struct ti_sci_rm_type_map ti_sci_am654_rm_type_map[] = {
+       {.dev_id = 56, .type = 0x00b}, /* GIC_IRQ */
+       {.dev_id = 179, .type = 0x000}, /* MAIN_NAV_UDMASS_IA0 */
+       {.dev_id = 187, .type = 0x009}, /* MAIN_NAV_RA */
+       {.dev_id = 188, .type = 0x006}, /* MAIN_NAV_UDMAP */
+       {.dev_id = 194, .type = 0x007}, /* MCU_NAV_UDMAP */
+       {.dev_id = 195, .type = 0x00a}, /* MCU_NAV_RA */
+       {.dev_id = 0, .type = 0x000}, /* end of table */
+};
+
 /* Description for AM654 */
-static const struct ti_sci_desc ti_sci_sysfw_am654_desc = {
-       .host_id = 4,
-       .max_rx_timeout_us = 1000000,
+static const struct ti_sci_desc ti_sci_pmmc_am654_desc = {
+       .default_host_id = 12,
+       /* Conservative duration */
+       .max_rx_timeout_ms = 10000,
+       /* Limited by MBOX_TX_QUEUE_LEN. K2G can handle upto 128 messages! */
+       .max_msgs = 20,
        .max_msg_size = 60,
+       .rm_type_map = ti_sci_am654_rm_type_map,
 };
 
 static const struct udevice_id ti_sci_ids[] = {
        {
                .compatible = "ti,k2g-sci",
-               .data = (ulong)&ti_sci_sysfw_am654_desc
+               .data = (ulong)&ti_sci_pmmc_k2g_desc
+       },
+       {
+               .compatible = "ti,am654-sci",
+               .data = (ulong)&ti_sci_pmmc_am654_desc
        },
        { /* Sentinel */ },
 };
index 81591fb0c71f784094ce6e31d694e2ba1eeffce9..2d87cdd2cf96a0d66c31bdb6cee9f9acf97c5cb2 100644 (file)
@@ -25,6 +25,7 @@
 #define TI_SCI_MSG_BOARD_CONFIG_RM     0x000c
 #define TI_SCI_MSG_BOARD_CONFIG_SECURITY  0x000d
 #define TI_SCI_MSG_BOARD_CONFIG_PM     0x000e
+#define TISCI_MSG_QUERY_MSMC           0x0020
 
 /* Device requests */
 #define TI_SCI_MSG_SET_DEVICE_STATE    0x0200
 #define TISCI_MSG_PROC_AUTH_BOOT_IMIAGE        0xc120
 #define TISCI_MSG_GET_PROC_BOOT_STATUS 0xc400
 
+/* Resource Management Requests */
+#define TI_SCI_MSG_GET_RESOURCE_RANGE  0x1500
+
+/* 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_PSIL_UNPAIR              0x1281
+
+#define TI_SCI_MSG_RM_UDMAP_TX_ALLOC           0x1200
+#define TI_SCI_MSG_RM_UDMAP_TX_FREE            0x1201
+#define TI_SCI_MSG_RM_UDMAP_RX_ALLOC           0x1210
+#define TI_SCI_MSG_RM_UDMAP_RX_FREE            0x1211
+#define TI_SCI_MSG_RM_UDMAP_FLOW_CFG           0x1220
+#define TI_SCI_MSG_RM_UDMAP_OPT_FLOW_CFG       0x1221
+
+#define TISCI_MSG_RM_UDMAP_TX_CH_CFG           0x1205
+#define TISCI_MSG_RM_UDMAP_TX_CH_GET_CFG       0x1206
+#define TISCI_MSG_RM_UDMAP_RX_CH_CFG           0x1215
+#define TISCI_MSG_RM_UDMAP_RX_CH_GET_CFG       0x1216
+#define TISCI_MSG_RM_UDMAP_FLOW_CFG            0x1230
+#define TISCI_MSG_RM_UDMAP_FLOW_SIZE_THRESH_CFG        0x1231
+#define TISCI_MSG_RM_UDMAP_FLOW_GET_CFG                0x1232
+#define TISCI_MSG_RM_UDMAP_FLOW_SIZE_THRESH_GET_CFG    0x1233
+
 /**
  * struct ti_sci_msg_hdr - Generic Message Header for All messages and responses
  * @type:      Type of messages: One of TI_SCI_MSG* values
@@ -133,6 +162,24 @@ struct ti_sci_msg_board_config {
        u16 boardcfg_size;
 } __packed;
 
+/**
+ * struct ti_sci_msg_resp_query_msmc - Query msmc message response structure
+ * @hdr:               Generic Header
+ * @msmc_start_low:    Lower 32 bit of msmc start
+ * @msmc_start_high:   Upper 32 bit of msmc start
+ * @msmc_end_low:      Lower 32 bit of msmc end
+ * @msmc_end_high:     Upper 32 bit of msmc end
+ *
+ * Response to a generic message with message type TISCI_MSG_QUERY_MSMC
+ */
+struct ti_sci_msg_resp_query_msmc {
+       struct ti_sci_msg_hdr hdr;
+       u32 msmc_start_low;
+       u32 msmc_start_high;
+       u32 msmc_end_low;
+       u32 msmc_end_high;
+} __packed;
+
 /**
  * struct ti_sci_msg_req_set_device_state - Set the desired state of the device
  * @hdr:               Generic header
@@ -505,6 +552,45 @@ struct ti_sci_msg_resp_get_clock_freq {
        u64 freq_hz;
 } __packed;
 
+#define TI_SCI_IRQ_SECONDARY_HOST_INVALID      0xff
+
+/**
+ * struct ti_sci_msg_req_get_resource_range - Request to get a host's assigned
+ *                                           range of resources.
+ * @hdr:               Generic Header
+ * @type:              Unique resource assignment type
+ * @subtype:           Resource assignment subtype within the resource type.
+ * @secondary_host:    Host processing entity to which the resources are
+ *                     allocated. This is required only when the destination
+ *                     host id id different from ti sci interface host id,
+ *                     else TI_SCI_IRQ_SECONDARY_HOST_INVALID can be passed.
+ *
+ * Request type is TI_SCI_MSG_GET_RESOURCE_RANGE. Responded with requested
+ * resource range which is of type TI_SCI_MSG_GET_RESOURCE_RANGE.
+ */
+struct ti_sci_msg_req_get_resource_range {
+       struct ti_sci_msg_hdr hdr;
+#define MSG_RM_RESOURCE_TYPE_MASK      GENMASK(9, 0)
+#define MSG_RM_RESOURCE_SUBTYPE_MASK   GENMASK(5, 0)
+       u16 type;
+       u8 subtype;
+       u8 secondary_host;
+} __packed;
+
+/**
+ * struct ti_sci_msg_resp_get_resource_range - Response to resource get range.
+ * @hdr:               Generic Header
+ * @range_start:       Start index of the resource range.
+ * @range_num:         Number of resources in the range.
+ *
+ * Response to request TI_SCI_MSG_GET_RESOURCE_RANGE.
+ */
+struct ti_sci_msg_resp_get_resource_range {
+       struct ti_sci_msg_hdr hdr;
+       u16 range_start;
+       u16 range_num;
+} __packed;
+
 #define TISCI_ADDR_LOW_MASK            GENMASK_ULL(31, 0)
 #define TISCI_ADDR_HIGH_MASK           GENMASK_ULL(63, 32)
 #define TISCI_ADDR_HIGH_SHIFT          32
@@ -677,4 +763,579 @@ struct ti_sci_msg_resp_get_proc_boot_status {
        u32 status_flags;
 } __packed;
 
+/**
+ * struct ti_sci_msg_rm_ring_cfg_req - Configure a Navigator Subsystem ring
+ *
+ * Configures the non-real-time registers of a Navigator Subsystem ring.
+ * @hdr:       Generic Header
+ * @valid_params: Bitfield defining validity of ring configuration parameters.
+ *     The ring configuration fields are not valid, and will not be used for
+ *     ring configuration, if their corresponding valid bit is zero.
+ *     Valid bit usage:
+ *     0 - Valid bit for @tisci_msg_rm_ring_cfg_req addr_lo
+ *     1 - Valid bit for @tisci_msg_rm_ring_cfg_req addr_hi
+ *     2 - Valid bit for @tisci_msg_rm_ring_cfg_req count
+ *     3 - Valid bit for @tisci_msg_rm_ring_cfg_req mode
+ *     4 - Valid bit for @tisci_msg_rm_ring_cfg_req size
+ *     5 - Valid bit for @tisci_msg_rm_ring_cfg_req order_id
+ * @nav_id: Device ID of Navigator Subsystem from which the ring is allocated
+ * @index: ring index to be configured.
+ * @addr_lo: 32 LSBs of ring base address to be programmed into the ring's
+ *     RING_BA_LO register
+ * @addr_hi: 16 MSBs of ring base address to be programmed into the ring's
+ *     RING_BA_HI register.
+ * @count: Number of ring elements. Must be even if mode is CREDENTIALS or QM
+ *     modes.
+ * @mode: Specifies the mode the ring is to be configured.
+ * @size: Specifies encoded ring element size. To calculate the encoded size use
+ *     the formula (log2(size_bytes) - 2), where size_bytes cannot be
+ *     greater than 256.
+ * @order_id: Specifies the ring's bus order ID.
+ */
+struct ti_sci_msg_rm_ring_cfg_req {
+       struct ti_sci_msg_hdr hdr;
+       u32 valid_params;
+       u16 nav_id;
+       u16 index;
+       u32 addr_lo;
+       u32 addr_hi;
+       u32 count;
+       u8 mode;
+       u8 size;
+       u8 order_id;
+} __packed;
+
+/**
+ * struct ti_sci_msg_rm_ring_cfg_resp - Response to configuring a ring.
+ *
+ * @hdr:       Generic Header
+ */
+struct ti_sci_msg_rm_ring_cfg_resp {
+       struct ti_sci_msg_hdr hdr;
+} __packed;
+
+/**
+ * struct ti_sci_msg_rm_ring_get_cfg_req - Get RA ring's configuration
+ *
+ * Gets the configuration of the non-real-time register fields of a ring.  The
+ * host, or a supervisor of the host, who owns the ring must be the requesting
+ * host.  The values of the non-real-time registers are returned in
+ * @ti_sci_msg_rm_ring_get_cfg_resp.
+ *
+ * @hdr: Generic Header
+ * @nav_id: Device ID of Navigator Subsystem from which the ring is allocated
+ * @index: ring index.
+ */
+struct ti_sci_msg_rm_ring_get_cfg_req {
+       struct ti_sci_msg_hdr hdr;
+       u16 nav_id;
+       u16 index;
+} __packed;
+
+/**
+ * struct ti_sci_msg_rm_ring_get_cfg_resp -  Ring get configuration response
+ *
+ * Response received by host processor after RM has handled
+ * @ti_sci_msg_rm_ring_get_cfg_req. The response contains the ring's
+ * non-real-time register values.
+ *
+ * @hdr: Generic Header
+ * @addr_lo: Ring 32 LSBs of base address
+ * @addr_hi: Ring 16 MSBs of base address.
+ * @count: Ring number of elements.
+ * @mode: Ring mode.
+ * @size: encoded Ring element size
+ * @order_id: ing order ID.
+ */
+struct ti_sci_msg_rm_ring_get_cfg_resp {
+       struct ti_sci_msg_hdr hdr;
+       u32 addr_lo;
+       u32 addr_hi;
+       u32 count;
+       u8 mode;
+       u8 size;
+       u8 order_id;
+} __packed;
+
+/**
+ * struct ti_sci_msg_psil_pair - Pairs a PSI-L source thread to a destination
+ *                              thread
+ * @hdr:       Generic Header
+ * @nav_id:    SoC Navigator Subsystem device ID whose PSI-L config proxy is
+ *             used to pair the source and destination threads.
+ * @src_thread:        PSI-L source thread ID within the PSI-L System thread map.
+ *
+ * UDMAP transmit channels mapped to source threads will have their
+ * TCHAN_THRD_ID register programmed with the destination thread if the pairing
+ * is successful.
+
+ * @dst_thread: PSI-L destination thread ID within the PSI-L System thread map.
+ * PSI-L destination threads start at index 0x8000.  The request is NACK'd if
+ * the destination thread is not greater than or equal to 0x8000.
+ *
+ * UDMAP receive channels mapped to destination threads will have their
+ * RCHAN_THRD_ID register programmed with the source thread if the pairing
+ * is successful.
+ *
+ * Request type is TI_SCI_MSG_RM_PSIL_PAIR, response is a generic ACK or NACK
+ * message.
+ */
+struct ti_sci_msg_psil_pair {
+       struct ti_sci_msg_hdr hdr;
+       u32 nav_id;
+       u32 src_thread;
+       u32 dst_thread;
+} __packed;
+
+/**
+ * struct ti_sci_msg_psil_unpair - Unpairs a PSI-L source thread from a
+ *                                destination thread
+ * @hdr:       Generic Header
+ * @nav_id:    SoC Navigator Subsystem device ID whose PSI-L config proxy is
+ *             used to unpair the source and destination threads.
+ * @src_thread:        PSI-L source thread ID within the PSI-L System thread map.
+ *
+ * UDMAP transmit channels mapped to source threads will have their
+ * TCHAN_THRD_ID register cleared if the unpairing is successful.
+ *
+ * @dst_thread: PSI-L destination thread ID within the PSI-L System thread map.
+ * PSI-L destination threads start at index 0x8000.  The request is NACK'd if
+ * the destination thread is not greater than or equal to 0x8000.
+ *
+ * UDMAP receive channels mapped to destination threads will have their
+ * RCHAN_THRD_ID register cleared if the unpairing is successful.
+ *
+ * Request type is TI_SCI_MSG_RM_PSIL_UNPAIR, response is a generic ACK or NACK
+ * message.
+ */
+struct ti_sci_msg_psil_unpair {
+       struct ti_sci_msg_hdr hdr;
+       u32 nav_id;
+       u32 src_thread;
+       u32 dst_thread;
+} __packed;
+
+/**
+ * Configures a Navigator Subsystem UDMAP transmit channel
+ *
+ * Configures the non-real-time registers of a Navigator Subsystem UDMAP
+ * transmit channel.  The channel index must be assigned to the host defined
+ * in the TISCI header via the RM board configuration resource assignment
+ * range list.
+ *
+ * @hdr: Generic Header
+ *
+ * @valid_params: Bitfield defining validity of tx channel configuration
+ * parameters. The tx channel configuration fields are not valid, and will not
+ * be used for ch configuration, if their corresponding valid bit is zero.
+ * Valid bit usage:
+ *    0 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_pause_on_err
+ *    1 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_atype
+ *    2 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_chan_type
+ *    3 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_fetch_size
+ *    4 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::txcq_qnum
+ *    5 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_priority
+ *    6 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_qos
+ *    7 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_orderid
+ *    8 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_sched_priority
+ *    9 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_filt_einfo
+ *   10 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_filt_pswords
+ *   11 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_supr_tdpkt
+ *   12 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_credit_count
+ *   13 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::fdepth
+ *
+ * @nav_id: SoC device ID of Navigator Subsystem where tx channel is located
+ *
+ * @index: UDMAP transmit channel index.
+ *
+ * @tx_pause_on_err: UDMAP transmit channel pause on error configuration to
+ * be programmed into the tx_pause_on_err field of the channel's TCHAN_TCFG
+ * register.
+ *
+ * @tx_filt_einfo: UDMAP transmit channel extended packet information passing
+ * configuration to be programmed into the tx_filt_einfo field of the
+ * channel's TCHAN_TCFG register.
+ *
+ * @tx_filt_pswords: UDMAP transmit channel protocol specific word passing
+ * configuration to be programmed into the tx_filt_pswords field of the
+ * channel's TCHAN_TCFG register.
+ *
+ * @tx_atype: UDMAP transmit channel non Ring Accelerator access pointer
+ * interpretation configuration to be programmed into the tx_atype field of
+ * the channel's TCHAN_TCFG register.
+ *
+ * @tx_chan_type: UDMAP transmit channel functional channel type and work
+ * passing mechanism configuration to be programmed into the tx_chan_type
+ * field of the channel's TCHAN_TCFG register.
+ *
+ * @tx_supr_tdpkt: UDMAP transmit channel teardown packet generation suppression
+ * configuration to be programmed into the tx_supr_tdpkt field of the channel's
+ * TCHAN_TCFG register.
+ *
+ * @tx_fetch_size: UDMAP transmit channel number of 32-bit descriptor words to
+ * fetch configuration to be programmed into the tx_fetch_size field of the
+ * channel's TCHAN_TCFG register.  The user must make sure to set the maximum
+ * word count that can pass through the channel for any allowed descriptor type.
+ *
+ * @tx_credit_count: UDMAP transmit channel transfer request credit count
+ * configuration to be programmed into the count field of the TCHAN_TCREDIT
+ * register.  Specifies how many credits for complete TRs are available.
+ *
+ * @txcq_qnum: UDMAP transmit channel completion queue configuration to be
+ * programmed into the txcq_qnum field of the TCHAN_TCQ register. The specified
+ * completion queue must be assigned to the host, or a subordinate of the host,
+ * requesting configuration of the transmit channel.
+ *
+ * @tx_priority: UDMAP transmit channel transmit priority value to be programmed
+ * into the priority field of the channel's TCHAN_TPRI_CTRL register.
+ *
+ * @tx_qos: UDMAP transmit channel transmit qos value to be programmed into the
+ * qos field of the channel's TCHAN_TPRI_CTRL register.
+ *
+ * @tx_orderid: UDMAP transmit channel bus order id value to be programmed into
+ * the orderid field of the channel's TCHAN_TPRI_CTRL register.
+ *
+ * @fdepth: UDMAP transmit channel FIFO depth configuration to be programmed
+ * into the fdepth field of the TCHAN_TFIFO_DEPTH register. Sets the number of
+ * Tx FIFO bytes which are allowed to be stored for the channel. Check the UDMAP
+ * section of the TRM for restrictions regarding this parameter.
+ *
+ * @tx_sched_priority: UDMAP transmit channel tx scheduling priority
+ * configuration to be programmed into the priority field of the channel's
+ * TCHAN_TST_SCHED register.
+ */
+struct ti_sci_msg_rm_udmap_tx_ch_cfg_req {
+       struct ti_sci_msg_hdr hdr;
+       u32 valid_params;
+       u16 nav_id;
+       u16 index;
+       u8 tx_pause_on_err;
+       u8 tx_filt_einfo;
+       u8 tx_filt_pswords;
+       u8 tx_atype;
+       u8 tx_chan_type;
+       u8 tx_supr_tdpkt;
+       u16 tx_fetch_size;
+       u8 tx_credit_count;
+       u16 txcq_qnum;
+       u8 tx_priority;
+       u8 tx_qos;
+       u8 tx_orderid;
+       u16 fdepth;
+       u8 tx_sched_priority;
+} __packed;
+
+/**
+ *  Response to configuring a UDMAP transmit channel.
+ *
+ * @hdr: Standard TISCI header
+ */
+struct ti_sci_msg_rm_udmap_tx_ch_cfg_resp {
+       struct ti_sci_msg_hdr hdr;
+} __packed;
+
+/**
+ * Configures a Navigator Subsystem UDMAP receive channel
+ *
+ * Configures the non-real-time registers of a Navigator Subsystem UDMAP
+ * receive channel.  The channel index must be assigned to the host defined
+ * in the TISCI header via the RM board configuration resource assignment
+ * range list.
+ *
+ * @hdr: Generic Header
+ *
+ * @valid_params: Bitfield defining validity of rx channel configuration
+ * parameters.
+ * The rx channel configuration fields are not valid, and will not be used for
+ * ch configuration, if their corresponding valid bit is zero.
+ * Valid bit usage:
+ *    0 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_pause_on_err
+ *    1 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_atype
+ *    2 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_chan_type
+ *    3 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_fetch_size
+ *    4 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rxcq_qnum
+ *    5 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_priority
+ *    6 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_qos
+ *    7 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_orderid
+ *    8 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_sched_priority
+ *    9 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::flowid_start
+ *   10 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::flowid_cnt
+ *   11 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_ignore_short
+ *   12 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_ignore_long
+ *
+ * @nav_id: SoC device ID of Navigator Subsystem where rx channel is located
+ *
+ * @index: UDMAP receive channel index.
+ *
+ * @rx_fetch_size: UDMAP receive channel number of 32-bit descriptor words to
+ * fetch configuration to be programmed into the rx_fetch_size field of the
+ * channel's RCHAN_RCFG register.
+ *
+ * @rxcq_qnum: UDMAP receive channel completion queue configuration to be
+ * programmed into the rxcq_qnum field of the RCHAN_RCQ register.
+ * The specified completion queue must be assigned to the host, or a subordinate
+ * of the host, requesting configuration of the receive channel.
+ *
+ * @rx_priority: UDMAP receive channel receive priority value to be programmed
+ * into the priority field of the channel's RCHAN_RPRI_CTRL register.
+ *
+ * @rx_qos: UDMAP receive channel receive qos value to be programmed into the
+ * qos field of the channel's RCHAN_RPRI_CTRL register.
+ *
+ * @rx_orderid: UDMAP receive channel bus order id value to be programmed into
+ * the orderid field of the channel's RCHAN_RPRI_CTRL register.
+ *
+ * @rx_sched_priority: UDMAP receive channel rx scheduling priority
+ * configuration to be programmed into the priority field of the channel's
+ * RCHAN_RST_SCHED register.
+ *
+ * @flowid_start: UDMAP receive channel additional flows starting index
+ * configuration to program into the flow_start field of the RCHAN_RFLOW_RNG
+ * register. Specifies the starting index for flow IDs the receive channel is to
+ * make use of beyond the default flow. flowid_start and @ref flowid_cnt must be
+ * set as valid and configured together. The starting flow ID set by
+ * @ref flowid_cnt must be a flow index within the Navigator Subsystem's subset
+ * of flows beyond the default flows statically mapped to receive channels.
+ * The additional flows must be assigned to the host, or a subordinate of the
+ * host, requesting configuration of the receive channel.
+ *
+ * @flowid_cnt: UDMAP receive channel additional flows count configuration to
+ * program into the flowid_cnt field of the RCHAN_RFLOW_RNG register.
+ * This field specifies how many flow IDs are in the additional contiguous range
+ * of legal flow IDs for the channel.  @ref flowid_start and flowid_cnt must be
+ * set as valid and configured together. Disabling the valid_params field bit
+ * for flowid_cnt indicates no flow IDs other than the default are to be
+ * allocated and used by the receive channel. @ref flowid_start plus flowid_cnt
+ * cannot be greater than the number of receive flows in the receive channel's
+ * Navigator Subsystem.  The additional flows must be assigned to the host, or a
+ * subordinate of the host, requesting configuration of the receive channel.
+ *
+ * @rx_pause_on_err: UDMAP receive channel pause on error configuration to be
+ * programmed into the rx_pause_on_err field of the channel's RCHAN_RCFG
+ * register.
+ *
+ * @rx_atype: UDMAP receive channel non Ring Accelerator access pointer
+ * interpretation configuration to be programmed into the rx_atype field of the
+ * channel's RCHAN_RCFG register.
+ *
+ * @rx_chan_type: UDMAP receive channel functional channel type and work passing
+ * mechanism configuration to be programmed into the rx_chan_type field of the
+ * channel's RCHAN_RCFG register.
+ *
+ * @rx_ignore_short: UDMAP receive channel short packet treatment configuration
+ * to be programmed into the rx_ignore_short field of the RCHAN_RCFG register.
+ *
+ * @rx_ignore_long: UDMAP receive channel long packet treatment configuration to
+ * be programmed into the rx_ignore_long field of the RCHAN_RCFG register.
+ */
+struct ti_sci_msg_rm_udmap_rx_ch_cfg_req {
+       struct ti_sci_msg_hdr hdr;
+       u32 valid_params;
+       u16 nav_id;
+       u16 index;
+       u16 rx_fetch_size;
+       u16 rxcq_qnum;
+       u8 rx_priority;
+       u8 rx_qos;
+       u8 rx_orderid;
+       u8 rx_sched_priority;
+       u16 flowid_start;
+       u16 flowid_cnt;
+       u8 rx_pause_on_err;
+       u8 rx_atype;
+       u8 rx_chan_type;
+       u8 rx_ignore_short;
+       u8 rx_ignore_long;
+} __packed;
+
+/**
+ * Response to configuring a UDMAP receive channel.
+ *
+ * @hdr: Standard TISCI header
+ */
+struct ti_sci_msg_rm_udmap_rx_ch_cfg_resp {
+       struct ti_sci_msg_hdr hdr;
+} __packed;
+
+/**
+ * Configures a Navigator Subsystem UDMAP receive flow
+ *
+ * Configures a Navigator Subsystem UDMAP receive flow's registers.
+ * Configuration does not include the flow registers which handle size-based
+ * free descriptor queue routing.
+ *
+ * The flow index must be assigned to the host defined in the TISCI header via
+ * the RM board configuration resource assignment range list.
+ *
+ * @hdr: Standard TISCI header
+ *
+ * @valid_params
+ * Bitfield defining validity of rx flow configuration parameters.  The
+ * rx flow configuration fields are not valid, and will not be used for flow
+ * configuration, if their corresponding valid bit is zero.  Valid bit usage:
+ *     0 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_einfo_present
+ *     1 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_psinfo_present
+ *     2 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_error_handling
+ *     3 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_desc_type
+ *     4 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_sop_offset
+ *     5 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_dest_qnum
+ *     6 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_src_tag_hi
+ *     7 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_src_tag_lo
+ *     8 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_dest_tag_hi
+ *     9 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_dest_tag_lo
+ *    10 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_src_tag_hi_sel
+ *    11 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_src_tag_lo_sel
+ *    12 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_dest_tag_hi_sel
+ *    13 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_dest_tag_lo_sel
+ *    14 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_fdq0_sz0_qnum
+ *    15 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_fdq1_sz0_qnum
+ *    16 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_fdq2_sz0_qnum
+ *    17 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_fdq3_sz0_qnum
+ *    18 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_ps_location
+ *
+ * @nav_id: SoC device ID of Navigator Subsystem from which the receive flow is
+ * allocated
+ *
+ * @flow_index: UDMAP receive flow index for non-optional configuration.
+ *
+ * @rx_einfo_present:
+ * UDMAP receive flow extended packet info present configuration to be
+ * programmed into the rx_einfo_present field of the flow's RFLOW_RFA register.
+ *
+ * @rx_psinfo_present:
+ * UDMAP receive flow PS words present configuration to be programmed into the
+ * rx_psinfo_present field of the flow's RFLOW_RFA register.
+ *
+ * @rx_error_handling:
+ * UDMAP receive flow error handling configuration to be programmed into the
+ * rx_error_handling field of the flow's RFLOW_RFA register.
+ *
+ * @rx_desc_type:
+ * UDMAP receive flow descriptor type configuration to be programmed into the
+ * rx_desc_type field field of the flow's RFLOW_RFA register.
+ *
+ * @rx_sop_offset:
+ * UDMAP receive flow start of packet offset configuration to be programmed
+ * into the rx_sop_offset field of the RFLOW_RFA register.  See the UDMAP
+ * section of the TRM for more information on this setting.  Valid values for
+ * this field are 0-255 bytes.
+ *
+ * @rx_dest_qnum:
+ * UDMAP receive flow destination queue configuration to be programmed into the
+ * rx_dest_qnum field of the flow's RFLOW_RFA register.  The specified
+ * destination queue must be valid within the Navigator Subsystem and must be
+ * owned by the host, or a subordinate of the host, requesting allocation and
+ * configuration of the receive flow.
+ *
+ * @rx_src_tag_hi:
+ * UDMAP receive flow source tag high byte constant configuration to be
+ * programmed into the rx_src_tag_hi field of the flow's RFLOW_RFB register.
+ * See the UDMAP section of the TRM for more information on this setting.
+ *
+ * @rx_src_tag_lo:
+ * UDMAP receive flow source tag low byte constant configuration to be
+ * programmed into the rx_src_tag_lo field of the flow's RFLOW_RFB register.
+ * See the UDMAP section of the TRM for more information on this setting.
+ *
+ * @rx_dest_tag_hi:
+ * UDMAP receive flow destination tag high byte constant configuration to be
+ * programmed into the rx_dest_tag_hi field of the flow's RFLOW_RFB register.
+ * See the UDMAP section of the TRM for more information on this setting.
+ *
+ * @rx_dest_tag_lo:
+ * UDMAP receive flow destination tag low byte constant configuration to be
+ * programmed into the rx_dest_tag_lo field of the flow's RFLOW_RFB register.
+ * See the UDMAP section of the TRM for more information on this setting.
+ *
+ * @rx_src_tag_hi_sel:
+ * UDMAP receive flow source tag high byte selector configuration to be
+ * programmed into the rx_src_tag_hi_sel field of the RFLOW_RFC register.  See
+ * the UDMAP section of the TRM for more information on this setting.
+ *
+ * @rx_src_tag_lo_sel:
+ * UDMAP receive flow source tag low byte selector configuration to be
+ * programmed into the rx_src_tag_lo_sel field of the RFLOW_RFC register.  See
+ * the UDMAP section of the TRM for more information on this setting.
+ *
+ * @rx_dest_tag_hi_sel:
+ * UDMAP receive flow destination tag high byte selector configuration to be
+ * programmed into the rx_dest_tag_hi_sel field of the RFLOW_RFC register.  See
+ * the UDMAP section of the TRM for more information on this setting.
+ *
+ * @rx_dest_tag_lo_sel:
+ * UDMAP receive flow destination tag low byte selector configuration to be
+ * programmed into the rx_dest_tag_lo_sel field of the RFLOW_RFC register.  See
+ * the UDMAP section of the TRM for more information on this setting.
+ *
+ * @rx_fdq0_sz0_qnum:
+ * UDMAP receive flow free descriptor queue 0 configuration to be programmed
+ * into the rx_fdq0_sz0_qnum field of the flow's RFLOW_RFD register.  See the
+ * UDMAP section of the TRM for more information on this setting. The specified
+ * free queue must be valid within the Navigator Subsystem and must be owned
+ * by the host, or a subordinate of the host, requesting allocation and
+ * configuration of the receive flow.
+ *
+ * @rx_fdq1_qnum:
+ * UDMAP receive flow free descriptor queue 1 configuration to be programmed
+ * into the rx_fdq1_qnum field of the flow's RFLOW_RFD register.  See the
+ * UDMAP section of the TRM for more information on this setting.  The specified
+ * free queue must be valid within the Navigator Subsystem and must be owned
+ * by the host, or a subordinate of the host, requesting allocation and
+ * configuration of the receive flow.
+ *
+ * @rx_fdq2_qnum:
+ * UDMAP receive flow free descriptor queue 2 configuration to be programmed
+ * into the rx_fdq2_qnum field of the flow's RFLOW_RFE register.  See the
+ * UDMAP section of the TRM for more information on this setting.  The specified
+ * free queue must be valid within the Navigator Subsystem and must be owned
+ * by the host, or a subordinate of the host, requesting allocation and
+ * configuration of the receive flow.
+ *
+ * @rx_fdq3_qnum:
+ * UDMAP receive flow free descriptor queue 3 configuration to be programmed
+ * into the rx_fdq3_qnum field of the flow's RFLOW_RFE register.  See the
+ * UDMAP section of the TRM for more information on this setting.  The specified
+ * free queue must be valid within the Navigator Subsystem and must be owned
+ * by the host, or a subordinate of the host, requesting allocation and
+ * configuration of the receive flow.
+ *
+ * @rx_ps_location:
+ * UDMAP receive flow PS words location configuration to be programmed into the
+ * rx_ps_location field of the flow's RFLOW_RFA register.
+ */
+struct ti_sci_msg_rm_udmap_flow_cfg_req {
+       struct ti_sci_msg_hdr hdr;
+       u32 valid_params;
+       u16 nav_id;
+       u16 flow_index;
+       u8 rx_einfo_present;
+       u8 rx_psinfo_present;
+       u8 rx_error_handling;
+       u8 rx_desc_type;
+       u16 rx_sop_offset;
+       u16 rx_dest_qnum;
+       u8 rx_src_tag_hi;
+       u8 rx_src_tag_lo;
+       u8 rx_dest_tag_hi;
+       u8 rx_dest_tag_lo;
+       u8 rx_src_tag_hi_sel;
+       u8 rx_src_tag_lo_sel;
+       u8 rx_dest_tag_hi_sel;
+       u8 rx_dest_tag_lo_sel;
+       u16 rx_fdq0_sz0_qnum;
+       u16 rx_fdq1_qnum;
+       u16 rx_fdq2_qnum;
+       u16 rx_fdq3_qnum;
+       u8 rx_ps_location;
+} __packed;
+
+/**
+ *  Response to configuring a Navigator Subsystem UDMAP receive flow
+ *
+ * @hdr: Standard TISCI header
+ */
+struct ti_sci_msg_rm_udmap_flow_cfg_resp {
+       struct ti_sci_msg_hdr hdr;
+} __packed;
+
 #endif /* __TI_SCI_H */
index 499310d0c0beff69ad024c78d0974dffc9cc3b85..069c63ba4562352126320a0494a84bd40704da5e 100644 (file)
@@ -408,6 +408,8 @@ static int zynq_load(xilinx_desc *desc, const void *buf, size_t bsize,
        if (bstype != BIT_PARTIAL)
                zynq_slcr_devcfg_enable();
 
+       puts("INFO:post config was not run, please run manually if needed\n");
+
        return FPGA_SUCCESS;
 }
 
@@ -421,7 +423,8 @@ static int zynq_loadfs(xilinx_desc *desc, const void *buf, size_t bsize,
        loff_t blocksize, actread;
        loff_t pos = 0;
        int fstype;
-       char *interface, *dev_part, *filename;
+       char *interface, *dev_part;
+       const char *filename;
 
        blocksize = fsinfo->blocksize;
        interface = fsinfo->interface;
index b103180cf3778f103575d7a7d740525993070a78..b3e4ecc50e1e23b5a66e152b5e6acd2359645f74 100644 (file)
@@ -23,7 +23,7 @@ config ALTERA_PIO
 
 config BCM6345_GPIO
        bool "BCM6345 GPIO driver"
-       depends on DM_GPIO && ARCH_BMIPS
+       depends on DM_GPIO && (ARCH_BMIPS || ARCH_BCM6858 || ARCH_BCM63158)
        help
          This driver supports the GPIO banks on BCM6345 SoCs.
 
index d1f6cfa8405d6f0e4ae9ff184f8fc3dfa37e7904..71a978cf4077880b18ecef073b166c5e4ef34d84 100644 (file)
@@ -22,7 +22,7 @@ static int bcm6345_gpio_get_value(struct udevice *dev, unsigned offset)
 {
        struct bcm6345_gpio_priv *priv = dev_get_priv(dev);
 
-       return !!(readl_be(priv->reg_data) & BIT(offset));
+       return !!(readl(priv->reg_data) & BIT(offset));
 }
 
 static int bcm6345_gpio_set_value(struct udevice *dev, unsigned offset,
@@ -31,9 +31,9 @@ static int bcm6345_gpio_set_value(struct udevice *dev, unsigned offset,
        struct bcm6345_gpio_priv *priv = dev_get_priv(dev);
 
        if (value)
-               setbits_be32(priv->reg_data, BIT(offset));
+               setbits_32(priv->reg_data, BIT(offset));
        else
-               clrbits_be32(priv->reg_data, BIT(offset));
+               clrbits_32(priv->reg_data, BIT(offset));
 
        return 0;
 }
@@ -42,9 +42,9 @@ static int bcm6345_gpio_set_direction(void __iomem *dirout, unsigned offset,
                                      bool input)
 {
        if (input)
-               clrbits_be32(dirout, BIT(offset));
+               clrbits_32(dirout, BIT(offset));
        else
-               setbits_be32(dirout, BIT(offset));
+               setbits_32(dirout, BIT(offset));
 
        return 0;
 }
@@ -70,7 +70,7 @@ static int bcm6345_gpio_get_function(struct udevice *dev, unsigned offset)
 {
        struct bcm6345_gpio_priv *priv = dev_get_priv(dev);
 
-       if (readl_be(priv->reg_dirout) & BIT(offset))
+       if (readl(priv->reg_dirout) & BIT(offset))
                return GPIOF_OUTPUT;
        else
                return GPIOF_INPUT;
index 49e23a0a4bf20d1662abfecf30cfe90c843bed59..e47abf18333f4452b31c8662e4160358ab4b575f 100644 (file)
@@ -593,6 +593,29 @@ int i2c_chip_ofdata_to_platdata(struct udevice *dev, struct dm_i2c_chip *chip)
 }
 #endif
 
+static int i2c_pre_probe(struct udevice *dev)
+{
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
+       struct dm_i2c_bus *i2c = dev_get_uclass_priv(dev);
+       unsigned int max = 0;
+       ofnode node;
+       int ret;
+
+       i2c->max_transaction_bytes = 0;
+       dev_for_each_subnode(node, dev) {
+               ret = ofnode_read_u32(node,
+                                     "u-boot,i2c-transaction-bytes",
+                                     &max);
+               if (!ret && max > i2c->max_transaction_bytes)
+                       i2c->max_transaction_bytes = max;
+       }
+
+       debug("%s: I2C bus: %s max transaction bytes: %d\n", __func__,
+             dev->name, i2c->max_transaction_bytes);
+#endif
+       return 0;
+}
+
 static int i2c_post_probe(struct udevice *dev)
 {
 #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
@@ -674,6 +697,7 @@ UCLASS_DRIVER(i2c) = {
        .post_bind      = i2c_post_bind,
        .init           = i2c_uclass_init,
        .priv_auto_alloc_size = sizeof(struct i2c_priv),
+       .pre_probe      = i2c_pre_probe,
        .post_probe     = i2c_post_probe,
        .per_device_auto_alloc_size = sizeof(struct dm_i2c_bus),
        .per_child_platdata_auto_alloc_size = sizeof(struct dm_i2c_chip),
index b0da67ce2c6b592009fb52200a30e39d19f11eaa..68f15261be771ca24fbe2d1c19776d69e4daf9af 100644 (file)
@@ -29,11 +29,12 @@ config I2C_MUX_PCA954x
        tristate "TI PCA954x I2C Mux/switches"
        depends on I2C_MUX
        help
-         If you say yes here you get support for the TI PCA954x
-         I2C mux/switch devices. It is x width I2C multiplexer which enables to
-         partitioning I2C bus and connect multiple devices with the same address
-         to the same I2C controller where driver handles proper routing to
-         target i2c device. PCA9544 and PCA9548 are supported.
+         If you say yes here you get support for the TI PCA954x I2C mux/switch
+         devices. It is x width I2C multiplexer which enables to partitioning
+         I2C bus and connect multiple devices with the same address to the same
+         I2C controller where driver handles proper routing to target i2c
+         device. Supported chips are PCA9543, PCA9544, PCA9547, PCA9548 and
+         PCA9646.
 
 config I2C_MUX_GPIO
         tristate "GPIO-based I2C multiplexer"
index bd4e9abe5f3c0ca6d913aed522e3dcc868ff6e25..a630ce991d04e3c5407e0a1bc23add78af2a442c 100644 (file)
@@ -15,6 +15,7 @@
 DECLARE_GLOBAL_DATA_PTR;
 
 enum pca_type {
+       PCA9543,
        PCA9544,
        PCA9547,
        PCA9548,
@@ -22,7 +23,7 @@ enum pca_type {
 };
 
 struct chip_desc {
-       u8 enable;
+       u8 enable; /* Enable mask in ctl register (used for muxes only) */
        enum muxtype {
                pca954x_ismux = 0,
                pca954x_isswi,
@@ -37,6 +38,10 @@ struct pca954x_priv {
 };
 
 static const struct chip_desc chips[] = {
+       [PCA9543] = {
+               .muxtype = pca954x_isswi,
+               .width = 2,
+       },
        [PCA9544] = {
                .enable = 0x4,
                .muxtype = pca954x_ismux,
@@ -48,12 +53,10 @@ static const struct chip_desc chips[] = {
                .width = 8,
        },
        [PCA9548] = {
-               .enable = 0x8,
                .muxtype = pca954x_isswi,
                .width = 8,
        },
        [PCA9646] = {
-               .enable = 0x0,
                .muxtype = pca954x_isswi,
                .width = 4,
        },
@@ -89,6 +92,7 @@ static const struct i2c_mux_ops pca954x_ops = {
 };
 
 static const struct udevice_id pca954x_ids[] = {
+       { .compatible = "nxp,pca9543", .data = PCA9543 },
        { .compatible = "nxp,pca9544", .data = PCA9544 },
        { .compatible = "nxp,pca9547", .data = PCA9547 },
        { .compatible = "nxp,pca9548", .data = PCA9548 },
index 9999d9fe5e4bd01fd5155a307b91017f0328eabe..5420afbc8e0de91b7f7529a94217ca1c2643dd52 100644 (file)
@@ -354,9 +354,10 @@ int i2c_idle_bus(struct mxc_i2c_bus *i2c_bus)
 int i2c_idle_bus(struct mxc_i2c_bus *i2c_bus)
 {
        struct udevice *bus = i2c_bus->bus;
+       struct dm_i2c_bus *i2c = dev_get_uclass_priv(bus);
        struct gpio_desc *scl_gpio = &i2c_bus->scl_gpio;
        struct gpio_desc *sda_gpio = &i2c_bus->sda_gpio;
-       int sda, scl;
+       int sda, scl, idle_sclks;
        int i, ret = 0;
        ulong elapsed, start_time;
 
@@ -380,8 +381,22 @@ int i2c_idle_bus(struct mxc_i2c_bus *i2c_bus)
        if ((sda & scl) == 1)
                goto exit;              /* Bus is idle already */
 
+       /*
+        * In most cases it is just enough to generate 8 + 1 SCLK
+        * clocks to recover I2C slave device from 'stuck' state
+        * (when for example SW reset was performed, in the middle of
+        * I2C transmission).
+        *
+        * However, there are devices which send data in packets of
+        * N bytes (N > 1). In such case we do need N * 8 + 1 SCLK
+        * clocks.
+        */
+       idle_sclks = 8 + 1;
+
+       if (i2c->max_transaction_bytes > 0)
+               idle_sclks = i2c->max_transaction_bytes * 8 + 1;
        /* Send high and low on the SCL line */
-       for (i = 0; i < 9; i++) {
+       for (i = 0; i < idle_sclks; i++) {
                dm_gpio_set_dir_flags(scl_gpio, GPIOD_IS_OUT);
                dm_gpio_set_value(scl_gpio, 0);
                udelay(50);
index 5da5c4af3925804a31e0606c96a8572d87b59564..5643939348c1f10f2469d747a7c9088a634b8524 100644 (file)
@@ -28,6 +28,13 @@ config LED_BCM6358
          LED HW controller accessed via MMIO registers.
          HW has no blinking capabilities and up to 32 LEDs can be controlled.
 
+config LED_BCM6858
+       bool "LED Support for BCM6858"
+       depends on LED && (ARCH_BCM6858 || ARCH_BCM63158)
+       help
+         This option enables support for LEDs connected to the BCM6858
+         HW has blinking capabilities and up to 32 LEDs can be controlled.
+
 config LED_BLINK
        bool "Support LED blinking"
        depends on LED
index 160a8f3ae8d687bb43d6f3e09dae7272d40d75a6..3654dd3c04b3b53cfafd001a58f7bfbf889ae172 100644 (file)
@@ -6,4 +6,5 @@
 obj-y += led-uclass.o
 obj-$(CONFIG_LED_BCM6328) += led_bcm6328.o
 obj-$(CONFIG_LED_BCM6358) += led_bcm6358.o
+obj-$(CONFIG_LED_BCM6858) += led_bcm6858.o
 obj-$(CONFIG_$(SPL_)LED_GPIO) += led_gpio.o
diff --git a/drivers/led/led_bcm6858.c b/drivers/led/led_bcm6858.c
new file mode 100644 (file)
index 0000000..27a76fc
--- /dev/null
@@ -0,0 +1,250 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019 Philippe Reynes <philippe.reynes@softathome.com>
+ *
+ * based on:
+ * drivers/led/led_bcm6328.c
+ * drivers/led/led_bcm6358.c
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <led.h>
+#include <asm/io.h>
+#include <dm/lists.h>
+
+#define LEDS_MAX               32
+#define LEDS_WAIT              100
+
+/* LED Mode register */
+#define LED_MODE_REG           0x0
+#define LED_MODE_OFF           0
+#define LED_MODE_ON            1
+#define LED_MODE_MASK          1
+
+/* LED Controller Global settings register */
+#define LED_CTRL_REG                   0x00
+#define LED_CTRL_MASK                  0x1f
+#define LED_CTRL_LED_TEST_MODE         BIT(0)
+#define LED_CTRL_SERIAL_LED_DATA_PPOL  BIT(1)
+#define LED_CTRL_SERIAL_LED_CLK_POL    BIT(2)
+#define LED_CTRL_SERIAL_LED_EN_POL     BIT(3)
+#define LED_CTRL_SERIAL_LED_MSB_FIRST  BIT(4)
+
+/* LED Controller IP LED source select register */
+#define LED_HW_LED_EN_REG              0x08
+/* LED Flash control register0 */
+#define LED_FLASH_RATE_CONTROL_REG0    0x10
+/* Soft LED input register */
+#define LED_SW_LED_IP_REG              0xb8
+/* Soft LED input polarity register */
+#define LED_SW_LED_IP_PPOL_REG         0xbc
+
+struct bcm6858_led_priv {
+       void __iomem *regs;
+       u8 pin;
+};
+
+#ifdef CONFIG_LED_BLINK
+/*
+ * The value for flash rate are:
+ * 0 : no blinking
+ * 1 : rate is 25 Hz => 40 ms (period)
+ * 2 : rate is 12.5 Hz => 80 ms (period)
+ * 3 : rate is 6.25 Hz => 160 ms (period)
+ * 4 : rate is 3.125 Hz => 320 ms (period)
+ * 5 : rate is 1.5625 Hz => 640 ms (period)
+ * 6 : rate is 0.7815 Hz => 1280 ms (period)
+ * 7 : rate is 0.390625 Hz => 2560 ms (period)
+ */
+static const int bcm6858_flash_rate[8] = {
+       0, 40, 80, 160, 320, 640, 1280, 2560
+};
+
+static u32 bcm6858_flash_rate_value(int period_ms)
+{
+       unsigned long value = 7;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(bcm6858_flash_rate); i++) {
+               if (period_ms <= bcm6858_flash_rate[i]) {
+                       value = i;
+                       break;
+               }
+       }
+
+       return value;
+}
+
+static int bcm6858_led_set_period(struct udevice *dev, int period_ms)
+{
+       struct bcm6858_led_priv *priv = dev_get_priv(dev);
+       u32 offset, shift, mask, value;
+
+       offset = (priv->pin / 8) * 4;
+       shift  = (priv->pin % 8) * 4;
+       mask   = 0x7 << shift;
+       value  = bcm6858_flash_rate_value(period_ms) << shift;
+
+       clrbits_32(priv->regs + LED_FLASH_RATE_CONTROL_REG0 + offset, mask);
+       setbits_32(priv->regs + LED_FLASH_RATE_CONTROL_REG0 + offset, value);
+
+       return 0;
+}
+#endif
+
+static enum led_state_t bcm6858_led_get_state(struct udevice *dev)
+{
+       struct bcm6858_led_priv *priv = dev_get_priv(dev);
+       enum led_state_t state = LEDST_OFF;
+       u32 sw_led_ip;
+
+       sw_led_ip = readl(priv->regs + LED_SW_LED_IP_REG);
+       if (sw_led_ip & (1 << priv->pin))
+               state = LEDST_ON;
+
+       return state;
+}
+
+static int bcm6858_led_set_state(struct udevice *dev, enum led_state_t state)
+{
+       struct bcm6858_led_priv *priv = dev_get_priv(dev);
+
+       switch (state) {
+       case LEDST_OFF:
+               clrbits_32(priv->regs + LED_SW_LED_IP_REG, (1 << priv->pin));
+#ifdef CONFIG_LED_BLINK
+               bcm6858_led_set_period(dev, 0);
+#endif
+               break;
+       case LEDST_ON:
+               setbits_32(priv->regs + LED_SW_LED_IP_REG, (1 << priv->pin));
+#ifdef CONFIG_LED_BLINK
+               bcm6858_led_set_period(dev, 0);
+#endif
+               break;
+       case LEDST_TOGGLE:
+               if (bcm6858_led_get_state(dev) == LEDST_OFF)
+                       return bcm6858_led_set_state(dev, LEDST_ON);
+               else
+                       return bcm6858_led_set_state(dev, LEDST_OFF);
+               break;
+#ifdef CONFIG_LED_BLINK
+       case LEDST_BLINK:
+               setbits_32(priv->regs + LED_SW_LED_IP_REG, (1 << priv->pin));
+               break;
+#endif
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static const struct led_ops bcm6858_led_ops = {
+       .get_state = bcm6858_led_get_state,
+       .set_state = bcm6858_led_set_state,
+#ifdef CONFIG_LED_BLINK
+       .set_period = bcm6858_led_set_period,
+#endif
+};
+
+static int bcm6858_led_probe(struct udevice *dev)
+{
+       struct led_uc_plat *uc_plat = dev_get_uclass_platdata(dev);
+
+       /* Top-level LED node */
+       if (!uc_plat->label) {
+               void __iomem *regs;
+               u32 set_bits = 0;
+
+               regs = dev_remap_addr(dev);
+               if (!regs)
+                       return -EINVAL;
+
+               if (dev_read_bool(dev, "brcm,serial-led-msb-first"))
+                       set_bits |= LED_CTRL_SERIAL_LED_MSB_FIRST;
+               if (dev_read_bool(dev, "brcm,serial-led-en-pol"))
+                       set_bits |= LED_CTRL_SERIAL_LED_EN_POL;
+               if (dev_read_bool(dev, "brcm,serial-led-clk-pol"))
+                       set_bits |= LED_CTRL_SERIAL_LED_CLK_POL;
+               if (dev_read_bool(dev, "brcm,serial-led-data-ppol"))
+                       set_bits |= LED_CTRL_SERIAL_LED_DATA_PPOL;
+               if (dev_read_bool(dev, "brcm,led-test-mode"))
+                       set_bits |= LED_CTRL_LED_TEST_MODE;
+
+               clrsetbits_32(regs + LED_CTRL_REG, ~0, set_bits);
+       } else {
+               struct bcm6858_led_priv *priv = dev_get_priv(dev);
+               void __iomem *regs;
+               unsigned int pin;
+
+               regs = dev_remap_addr(dev_get_parent(dev));
+               if (!regs)
+                       return -EINVAL;
+
+               pin = dev_read_u32_default(dev, "reg", LEDS_MAX);
+               if (pin >= LEDS_MAX)
+                       return -EINVAL;
+
+               priv->regs = regs;
+               priv->pin = pin;
+
+               /* this led is managed by software */
+               clrbits_32(regs + LED_HW_LED_EN_REG, 1 << pin);
+
+               /* configure the polarity */
+               if (dev_read_bool(dev, "active-low"))
+                       clrbits_32(regs + LED_SW_LED_IP_PPOL_REG, 1 << pin);
+               else
+                       setbits_32(regs + LED_SW_LED_IP_PPOL_REG, 1 << pin);
+       }
+
+       return 0;
+}
+
+static int bcm6858_led_bind(struct udevice *parent)
+{
+       ofnode node;
+
+       dev_for_each_subnode(node, parent) {
+               struct led_uc_plat *uc_plat;
+               struct udevice *dev;
+               const char *label;
+               int ret;
+
+               label = ofnode_read_string(node, "label");
+               if (!label) {
+                       debug("%s: node %s has no label\n", __func__,
+                             ofnode_get_name(node));
+                       return -EINVAL;
+               }
+
+               ret = device_bind_driver_to_node(parent, "bcm6858-led",
+                                                ofnode_get_name(node),
+                                                node, &dev);
+               if (ret)
+                       return ret;
+
+               uc_plat = dev_get_uclass_platdata(dev);
+               uc_plat->label = label;
+       }
+
+       return 0;
+}
+
+static const struct udevice_id bcm6858_led_ids[] = {
+       { .compatible = "brcm,bcm6858-leds" },
+       { /* sentinel */ }
+};
+
+U_BOOT_DRIVER(bcm6858_led) = {
+       .name = "bcm6858-led",
+       .id = UCLASS_LED,
+       .of_match = bcm6858_led_ids,
+       .bind = bcm6858_led_bind,
+       .probe = bcm6858_led_probe,
+       .priv_auto_alloc_size = sizeof(struct bcm6858_led_priv),
+       .ops = &bcm6858_led_ops,
+};
index d6e677fba847b9985935d4c61748bf03e2709d77..0e645f58be0e8b7735057461e01f0c56a14c3601 100644 (file)
@@ -128,6 +128,8 @@ config JZ4780_EFUSE
 
 config MXC_OCOTP
        bool "Enable MXC OCOTP Driver"
+       depends on ARCH_IMX8M || ARCH_MX6 || ARCH_MX7 || ARCH_VF610
+       default y
        help
          If you say Y here, you will get support for the One Time
          Programmable memory pages that are stored on the some
index 57a14a3479a39bf0b6f9282e545e54788660da55..f42eeff8f63cbf235b2abb7afb42be75e6a132f1 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
  /*
- * Copyright (C) 2018 Intel Corporation <www.intel.com>
+ * Copyright (C) 2018-2019 Intel Corporation <www.intel.com>
  *
  */
 #include <common.h>
@@ -219,32 +219,26 @@ int request_firmware_into_buf(struct udevice *dev,
 
 static int fs_loader_ofdata_to_platdata(struct udevice *dev)
 {
-       const char *fs_loader_path;
        u32 phandlepart[2];
 
-       fs_loader_path = ofnode_get_chosen_prop("firmware-loader");
+       ofnode fs_loader_node = dev_ofnode(dev);
 
-       if (fs_loader_path) {
-               ofnode fs_loader_node;
+       if (ofnode_valid(fs_loader_node)) {
+               struct device_platdata *plat;
 
-               fs_loader_node = ofnode_path(fs_loader_path);
-               if (ofnode_valid(fs_loader_node)) {
-                       struct device_platdata *plat;
-                       plat = dev->platdata;
-
-                       if (!ofnode_read_u32_array(fs_loader_node,
-                                                 "phandlepart",
-                                                 phandlepart, 2)) {
-                               plat->phandlepart.phandle = phandlepart[0];
-                               plat->phandlepart.partition = phandlepart[1];
-                       }
+               plat = dev->platdata;
+               if (!ofnode_read_u32_array(fs_loader_node,
+                                         "phandlepart",
+                                         phandlepart, 2)) {
+                       plat->phandlepart.phandle = phandlepart[0];
+                       plat->phandlepart.partition = phandlepart[1];
+               }
 
-                       plat->mtdpart = (char *)ofnode_read_string(
-                                        fs_loader_node, "mtdpart");
+               plat->mtdpart = (char *)ofnode_read_string(
+                                fs_loader_node, "mtdpart");
 
-                       plat->ubivol = (char *)ofnode_read_string(
-                                        fs_loader_node, "ubivol");
-               }
+               plat->ubivol = (char *)ofnode_read_string(
+                                fs_loader_node, "ubivol");
        }
 
        return 0;
@@ -252,6 +246,29 @@ static int fs_loader_ofdata_to_platdata(struct udevice *dev)
 
 static int fs_loader_probe(struct udevice *dev)
 {
+#if CONFIG_IS_ENABLED(DM) && CONFIG_IS_ENABLED(BLK)
+       int ret;
+       struct device_platdata *plat = dev->platdata;
+
+       if (plat->phandlepart.phandle) {
+               ofnode node = ofnode_get_by_phandle(plat->phandlepart.phandle);
+               struct udevice *parent_dev = NULL;
+
+               ret = device_get_global_by_ofnode(node, &parent_dev);
+               if (!ret) {
+                       struct udevice *dev;
+
+                       ret = blk_get_from_parent(parent_dev, &dev);
+                       if (ret) {
+                               debug("fs_loader: No block device: %d\n",
+                                       ret);
+
+                               return ret;
+                       }
+               }
+       }
+#endif
+
        return 0;
 };
 
index 29ad87c1d7b4b865e8c8170e8f83541f4da5ccd4..f25d0540075d55db29ba8eb256034146fbcd24a7 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <common.h>
 #include <linux/err.h>
+#include <linux/kernel.h>
 #include <dm.h>
 #include <i2c.h>
 #include <i2c_eeprom.h>
@@ -38,7 +39,24 @@ static int i2c_eeprom_std_read(struct udevice *dev, int offset, uint8_t *buf,
 static int i2c_eeprom_std_write(struct udevice *dev, int offset,
                                const uint8_t *buf, int size)
 {
-       return -ENODEV;
+       struct i2c_eeprom *priv = dev_get_priv(dev);
+       int ret;
+
+       while (size > 0) {
+               int write_size = min_t(int, size, priv->pagesize);
+
+               ret = dm_i2c_write(dev, offset, buf, write_size);
+               if (ret)
+                       return ret;
+
+               offset += write_size;
+               buf += write_size;
+               size -= write_size;
+
+               udelay(10000);
+       }
+
+       return 0;
 }
 
 static const struct i2c_eeprom_ops i2c_eeprom_std_ops = {
@@ -50,6 +68,12 @@ static int i2c_eeprom_std_ofdata_to_platdata(struct udevice *dev)
 {
        struct i2c_eeprom *priv = dev_get_priv(dev);
        u64 data = dev_get_driver_data(dev);
+       u32 pagesize;
+
+       if (dev_read_u32(dev, "pagesize", &pagesize) == 0) {
+               priv->pagesize = pagesize;
+               return 0;
+       }
 
        /* 6 bit -> page size of up to 2^63 (should be sufficient) */
        priv->pagewidth = data & 0x3F;
index 33943a231b1008e935f741e7de9e35cd88d03f4f..8dc246b0dbe8292fc2991634f61d1a1203407252 100644 (file)
@@ -9,8 +9,10 @@
 #include <errno.h>
 #include <dm/device.h>
 #include <dm/uclass.h>
+#include <power/stpmic1.h>
 
 #define STM32MP_OTP_BANK       0
+#define STM32MP_NVM_BANK       1
 
 /*
  * The 'fuse' command API
@@ -34,6 +36,13 @@ int fuse_read(u32 bank, u32 word, u32 *val)
                ret = 0;
                break;
 
+#ifdef CONFIG_PMIC_STPMIC1
+       case STM32MP_NVM_BANK:
+               *val = 0;
+               ret = stpmic1_shadow_read_byte(word, (u8 *)val);
+               break;
+#endif /* CONFIG_PMIC_STPMIC1 */
+
        default:
                printf("stm32mp %s: wrong value for bank %i\n", __func__, bank);
                ret = -EINVAL;
@@ -62,6 +71,12 @@ int fuse_prog(u32 bank, u32 word, u32 val)
                ret = 0;
                break;
 
+#ifdef CONFIG_PMIC_STPMIC1
+       case STM32MP_NVM_BANK:
+               ret = stpmic1_nvm_write_byte(word, (u8 *)&val);
+               break;
+#endif /* CONFIG_PMIC_STPMIC1 */
+
        default:
                printf("stm32mp %s: wrong value for bank %i\n", __func__, bank);
                ret = -EINVAL;
@@ -89,6 +104,13 @@ int fuse_sense(u32 bank, u32 word, u32 *val)
                ret = 0;
                break;
 
+#ifdef CONFIG_PMIC_STPMIC1
+       case STM32MP_NVM_BANK:
+               *val = 0;
+               ret = stpmic1_nvm_read_byte(word, (u8 *)val);
+               break;
+#endif /* CONFIG_PMIC_STPMIC1 */
+
        default:
                printf("stm32mp %s: wrong value for bank %i\n", __func__, bank);
                ret = -EINVAL;
@@ -117,6 +139,12 @@ int fuse_override(u32 bank, u32 word, u32 val)
                ret = 0;
                break;
 
+#ifdef CONFIG_PMIC_STPMIC1
+       case STM32MP_NVM_BANK:
+               ret = stpmic1_shadow_write_byte(word, (u8 *)&val);
+               break;
+#endif /* CONFIG_PMIC_STPMIC1 */
+
        default:
                printf("stm32mp %s: wrong value for bank %i\n",
                       __func__, bank);
index 04a4e7716f277ea062e97b773eefdda42d8404ab..c34dd5d18790f1c005c2d6b4c4a0cf502b64b138 100644 (file)
@@ -222,6 +222,16 @@ config MMC_DW_SOCFPGA
          Synopsys DesignWare Memory Card Interface driver. Select this option
          for platforms based on Altera SOCFPGA.
 
+config MMC_DW_SNPS
+       bool "Extensions for DW Memory Card Interface used in Synopsys ARC devboards"
+       depends on MMC_DW
+       depends on DM_MMC
+       depends on OF_CONTROL
+       depends on CLK
+       help
+         This selects support for Synopsys DesignWare Memory Card Interface driver
+         extensions used in various Synopsys ARC devboards.
+
 config MMC_MESON_GX
        bool "Meson GX EMMC controller support"
        depends on DM_MMC && BLK && ARCH_MESON
index 7892c468f05cb500249f7c54956249292199306a..0076fc393b8e491dcb29d61684bf6dcd9ce39862 100644 (file)
@@ -24,6 +24,7 @@ obj-$(CONFIG_MMC_DW_EXYNOS)           += exynos_dw_mmc.o
 obj-$(CONFIG_MMC_DW_K3)                        += hi6220_dw_mmc.o
 obj-$(CONFIG_MMC_DW_ROCKCHIP)          += rockchip_dw_mmc.o
 obj-$(CONFIG_MMC_DW_SOCFPGA)           += socfpga_dw_mmc.o
+obj-$(CONFIG_MMC_DW_SNPS)              += snps_dw_mmc.o
 obj-$(CONFIG_FSL_ESDHC) += fsl_esdhc.o
 obj-$(CONFIG_FTSDC010) += ftsdc010_mci.o
 obj-$(CONFIG_GENERIC_ATMEL_MCI) += gen_atmel_mci.o
index d3f07783688596c0850968350a956a7b346e3b21..e0ac3e9d695ec527933976d7a7e6f606412b3b24 100644 (file)
@@ -247,6 +247,7 @@ struct msdc_host {
        struct msdc_compatible *dev_comp;
 
        struct clk src_clk;     /* for SD/MMC bus clock */
+       struct clk src_clk_cg;  /* optional, MSDC source clock control gate */
        struct clk h_clk;       /* MSDC core clock */
 
        u32 src_clk_freq;       /* source clock */
@@ -269,7 +270,7 @@ struct msdc_host {
        bool builtin_cd;
 
        /* card detection / write protection GPIOs */
-#if IS_ENABLED(DM_GPIO)
+#if CONFIG_IS_ENABLED(DM_GPIO)
        struct gpio_desc gpio_wp;
        struct gpio_desc gpio_cd;
 #endif
@@ -849,7 +850,7 @@ static int msdc_ops_get_cd(struct udevice *dev)
                return !(val & MSDC_PS_CDSTS);
        }
 
-#if IS_ENABLED(DM_GPIO)
+#if CONFIG_IS_ENABLED(DM_GPIO)
        if (!host->gpio_cd.dev)
                return 1;
 
@@ -861,7 +862,7 @@ static int msdc_ops_get_cd(struct udevice *dev)
 
 static int msdc_ops_get_wp(struct udevice *dev)
 {
-#if IS_ENABLED(DM_GPIO)
+#if CONFIG_IS_ENABLED(DM_GPIO)
        struct msdc_host *host = dev_get_priv(dev);
 
        if (!host->gpio_wp.dev)
@@ -1269,6 +1270,8 @@ static void msdc_ungate_clock(struct msdc_host *host)
 {
        clk_enable(&host->src_clk);
        clk_enable(&host->h_clk);
+       if (host->src_clk_cg.dev)
+               clk_enable(&host->src_clk_cg);
 }
 
 static int msdc_drv_probe(struct udevice *dev)
@@ -1332,7 +1335,9 @@ static int msdc_ofdata_to_platdata(struct udevice *dev)
        if (ret < 0)
                return ret;
 
-#if IS_ENABLED(DM_GPIO)
+       clk_get_by_name(dev, "source_cg", &host->src_clk_cg); /* optional */
+
+#if CONFIG_IS_ENABLED(DM_GPIO)
        gpio_request_by_name(dev, "wp-gpios", 0, &host->gpio_wp, GPIOD_IS_IN);
        gpio_request_by_name(dev, "cd-gpios", 0, &host->gpio_cd, GPIOD_IS_IN);
 #endif
@@ -1376,8 +1381,18 @@ static const struct msdc_compatible mt7623_compat = {
        .enhance_rx = false
 };
 
+static const struct msdc_compatible mt8516_compat = {
+       .clk_div_bits = 12,
+       .pad_tune0 = true,
+       .async_fifo = true,
+       .data_tune = true,
+       .busy_check = true,
+       .stop_clk_fix = true,
+};
+
 static const struct udevice_id msdc_ids[] = {
        { .compatible = "mediatek,mt7623-mmc", .data = (ulong)&mt7623_compat },
+       { .compatible = "mediatek,mt8516-mmc", .data = (ulong)&mt8516_compat },
        {}
 };
 
index 826a39fad7256703471df372f14179b2db4f8a44..133cdc135278884798ddd8c83f0012c516704437 100644 (file)
@@ -264,7 +264,7 @@ static unsigned char mmc_board_init(struct mmc *mmc)
        !CONFIG_IS_ENABLED(DM_REGULATOR)
        /* PBIAS config needed for MMC1 only */
        if (mmc_get_blk_desc(mmc)->devnum == 0)
-               vmmc_pbias_config(LDO_VOLT_3V0);
+               vmmc_pbias_config(LDO_VOLT_3V3);
 #endif
 
        return 0;
@@ -418,7 +418,7 @@ static void omap_hsmmc_conf_bus_power(struct mmc *mmc, uint signal_voltage)
 
        switch (signal_voltage) {
        case MMC_SIGNAL_VOLTAGE_330:
-               hctl |= SDVS_3V0;
+               hctl |= SDVS_3V3;
                break;
        case MMC_SIGNAL_VOLTAGE_180:
                hctl |= SDVS_1V8;
@@ -514,10 +514,9 @@ static int omap_hsmmc_set_signal_voltage(struct mmc *mmc)
                return -EINVAL;
 
        if (mmc->signal_voltage == MMC_SIGNAL_VOLTAGE_330) {
-               /* Use 3.0V rather than 3.3V */
-               mv = 3000;
-               capa_mask = VS30_3V0SUP;
-               palmas_ldo_volt = LDO_VOLT_3V0;
+               mv = 3300;
+               capa_mask = VS33_3V3SUP;
+               palmas_ldo_volt = LDO_VOLT_3V3;
        } else if (mmc->signal_voltage == MMC_SIGNAL_VOLTAGE_180) {
                capa_mask = VS18_1V8SUP;
                palmas_ldo_volt = LDO_VOLT_1V8;
@@ -556,13 +555,13 @@ static uint32_t omap_hsmmc_set_capabilities(struct mmc *mmc)
        val = readl(&mmc_base->capa);
 
        if (priv->controller_flags & OMAP_HSMMC_SUPPORTS_DUAL_VOLT) {
-               val |= (VS30_3V0SUP | VS18_1V8SUP);
+               val |= (VS33_3V3SUP | VS18_1V8SUP);
        } else if (priv->controller_flags & OMAP_HSMMC_NO_1_8_V) {
-               val |= VS30_3V0SUP;
+               val |= VS33_3V3SUP;
                val &= ~VS18_1V8SUP;
        } else {
                val |= VS18_1V8SUP;
-               val &= ~VS30_3V0SUP;
+               val &= ~VS33_3V3SUP;
        }
 
        writel(val, &mmc_base->capa);
@@ -842,11 +841,11 @@ static int omap_hsmmc_init_setup(struct mmc *mmc)
 
 #if CONFIG_IS_ENABLED(DM_MMC)
        reg_val = omap_hsmmc_set_capabilities(mmc);
-       omap_hsmmc_conf_bus_power(mmc, (reg_val & VS30_3V0SUP) ?
+       omap_hsmmc_conf_bus_power(mmc, (reg_val & VS33_3V3SUP) ?
                          MMC_SIGNAL_VOLTAGE_330 : MMC_SIGNAL_VOLTAGE_180);
 #else
        writel(DTW_1_BITMODE | SDBP_PWROFF | SDVS_3V0, &mmc_base->hctl);
-       writel(readl(&mmc_base->capa) | VS30_3V0SUP | VS18_1V8SUP,
+       writel(readl(&mmc_base->capa) | VS33_3V3SUP | VS18_1V8SUP,
                &mmc_base->capa);
 #endif
 
diff --git a/drivers/mmc/snps_dw_mmc.c b/drivers/mmc/snps_dw_mmc.c
new file mode 100644 (file)
index 0000000..5a413f0
--- /dev/null
@@ -0,0 +1,199 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Synopsys DesignWare Multimedia Card Interface driver
+ * extensions used in various Synopsys ARC devboards.
+ *
+ * Copyright (C) 2019 Synopsys
+ * Author: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
+ */
+
+#include <common.h>
+#include <clk.h>
+#include <dm.h>
+#include <dwmmc.h>
+#include <errno.h>
+#include <fdtdec.h>
+#include <linux/libfdt.h>
+#include <linux/err.h>
+#include <malloc.h>
+
+#define CLOCK_MIN              400000  /*  400 kHz */
+#define FIFO_MIN               8
+#define FIFO_MAX               4096
+
+struct snps_dwmci_plat {
+       struct mmc_config       cfg;
+       struct mmc              mmc;
+};
+
+struct snps_dwmci_priv_data {
+       struct dwmci_host       host;
+       u32                     f_max;
+};
+
+static int snps_dwmmc_clk_setup(struct udevice *dev)
+{
+       struct snps_dwmci_priv_data *priv = dev_get_priv(dev);
+       struct dwmci_host *host = &priv->host;
+
+       struct clk clk_ciu, clk_biu;
+       int ret;
+
+       ret = clk_get_by_name(dev, "ciu", &clk_ciu);
+       if (ret)
+               goto clk_err;
+
+       ret = clk_enable(&clk_ciu);
+       if (ret && ret != -ENOSYS && ret != -ENOTSUPP)
+               goto clk_err_ciu;
+
+       host->bus_hz = clk_get_rate(&clk_ciu);
+       if (host->bus_hz < CLOCK_MIN) {
+               ret = -EINVAL;
+               goto clk_err_ciu_dis;
+       }
+
+       ret = clk_get_by_name(dev, "biu", &clk_biu);
+       if (ret)
+               goto clk_err_ciu_dis;
+
+       ret = clk_enable(&clk_biu);
+       if (ret && ret != -ENOSYS && ret != -ENOTSUPP)
+               goto clk_err_biu;
+
+       return 0;
+
+clk_err_biu:
+       clk_free(&clk_biu);
+clk_err_ciu_dis:
+       clk_disable(&clk_ciu);
+clk_err_ciu:
+       clk_free(&clk_ciu);
+clk_err:
+       dev_err(dev, "failed to setup clocks, ret %d\n", ret);
+
+       return ret;
+}
+
+static int snps_dwmmc_ofdata_to_platdata(struct udevice *dev)
+{
+       struct snps_dwmci_priv_data *priv = dev_get_priv(dev);
+       struct dwmci_host *host = &priv->host;
+       u32 fifo_depth;
+       int ret;
+
+       host->ioaddr = devfdt_get_addr_ptr(dev);
+
+       /*
+        * If fifo-depth is unset don't set fifoth_val - we will try to
+        * auto detect it.
+        */
+       ret = dev_read_u32(dev, "fifo-depth", &fifo_depth);
+       if (!ret) {
+               if (fifo_depth < FIFO_MIN || fifo_depth > FIFO_MAX)
+                       return -EINVAL;
+
+               host->fifoth_val = MSIZE(0x2) |
+                                  RX_WMARK(fifo_depth / 2 - 1) |
+                                  TX_WMARK(fifo_depth / 2);
+       }
+
+       host->buswidth = dev_read_u32_default(dev, "bus-width", 4);
+       if (host->buswidth != 1 && host->buswidth != 4 && host->buswidth != 8)
+               return -EINVAL;
+
+       /*
+        * If max-frequency is unset don't set priv->f_max - we will use
+        * host->bus_hz in probe() instead.
+        */
+       ret = dev_read_u32(dev, "max-frequency", &priv->f_max);
+       if (!ret && priv->f_max < CLOCK_MIN)
+               return -EINVAL;
+
+       host->fifo_mode = dev_read_bool(dev, "fifo-mode");
+       host->name = dev->name;
+       host->dev_index = 0;
+       host->priv = priv;
+
+       return 0;
+}
+
+int snps_dwmmc_getcd(struct udevice *dev)
+{
+       struct snps_dwmci_priv_data *priv = dev_get_priv(dev);
+       struct dwmci_host *host = &priv->host;
+
+       return !(dwmci_readl(host, DWMCI_CDETECT) & 1);
+}
+
+struct dm_mmc_ops snps_dwmci_dm_ops;
+
+static int snps_dwmmc_probe(struct udevice *dev)
+{
+#ifdef CONFIG_BLK
+       struct snps_dwmci_plat *plat = dev_get_platdata(dev);
+#endif
+       struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
+       struct snps_dwmci_priv_data *priv = dev_get_priv(dev);
+       struct dwmci_host *host = &priv->host;
+       unsigned int clock_max;
+       int ret;
+
+       /* Extend generic 'dm_dwmci_ops' with our 'getcd' implementation */
+       memcpy(&snps_dwmci_dm_ops, &dm_dwmci_ops, sizeof(struct dm_mmc_ops));
+       snps_dwmci_dm_ops.get_cd = snps_dwmmc_getcd;
+
+       ret = snps_dwmmc_clk_setup(dev);
+       if (ret)
+               return ret;
+
+       if (!priv->f_max)
+               clock_max = host->bus_hz;
+       else
+               clock_max = min_t(unsigned int, host->bus_hz, priv->f_max);
+
+#ifdef CONFIG_BLK
+       dwmci_setup_cfg(&plat->cfg, host, clock_max, CLOCK_MIN);
+       host->mmc = &plat->mmc;
+#else
+       ret = add_dwmci(host, clock_max, CLOCK_MIN);
+       if (ret)
+               return ret;
+#endif
+       host->mmc->priv = &priv->host;
+       upriv->mmc = host->mmc;
+       host->mmc->dev = dev;
+
+       return dwmci_probe(dev);
+}
+
+static int snps_dwmmc_bind(struct udevice *dev)
+{
+#ifdef CONFIG_BLK
+       struct snps_dwmci_plat *plat = dev_get_platdata(dev);
+       int ret;
+
+       ret = dwmci_bind(dev, &plat->mmc, &plat->cfg);
+       if (ret)
+               return ret;
+#endif
+
+       return 0;
+}
+
+static const struct udevice_id snps_dwmmc_ids[] = {
+       { .compatible = "snps,dw-mshc" },
+       { }
+};
+
+U_BOOT_DRIVER(snps_dwmmc_drv) = {
+       .name                           = "snps_dw_mmc",
+       .id                             = UCLASS_MMC,
+       .of_match                       = snps_dwmmc_ids,
+       .ofdata_to_platdata             = snps_dwmmc_ofdata_to_platdata,
+       .ops                            = &snps_dwmci_dm_ops,
+       .bind                           = snps_dwmmc_bind,
+       .probe                          = snps_dwmmc_probe,
+       .priv_auto_alloc_size           = sizeof(struct snps_dwmci_priv_data),
+       .platdata_auto_alloc_size       = sizeof(struct snps_dwmci_plat),
+};
index cb7ca38d0744d237c4eb5c760b9518abf8fc83e0..89ac8229f5844a8786c8af38f27d9da57fef4281 100644 (file)
@@ -1051,13 +1051,13 @@ static int mtd_check_oob_ops(struct mtd_info *mtd, loff_t offs,
                return -EINVAL;
 
        if (ops->ooblen) {
-               u64 maxooblen;
+               size_t maxooblen;
 
                if (ops->ooboffs >= mtd_oobavail(mtd, ops))
                        return -EINVAL;
 
-               maxooblen = ((mtd_div_by_ws(mtd->size, mtd) -
-                             mtd_div_by_ws(offs, mtd)) *
+               maxooblen = ((size_t)(mtd_div_by_ws(mtd->size, mtd) -
+                                     mtd_div_by_ws(offs, mtd)) *
                             mtd_oobavail(mtd, ops)) - ops->ooboffs;
                if (ops->ooblen > maxooblen)
                        return -EINVAL;
index 7f76e5ecef4fd20f039cc3760be27dd6a42a6460..f86035bcce508f8f0c3874f9332598eadff34d5c 100644 (file)
@@ -60,6 +60,31 @@ config SPL_GENERATE_ATMEL_PMECC_HEADER
 
 endif
 
+config NAND_BRCMNAND
+       bool "Support Broadcom NAND controller"
+       depends on OF_CONTROL && DM && MTD
+       help
+         Enable the driver for NAND flash on platforms using a Broadcom NAND
+         controller.
+
+config NAND_BRCMNAND_6838
+       bool "Support Broadcom NAND controller on bcm6838"
+       depends on NAND_BRCMNAND && ARCH_BMIPS && SOC_BMIPS_BCM6838
+       help
+         Enable support for broadcom nand driver on bcm6838.
+
+config NAND_BRCMNAND_6858
+       bool "Support Broadcom NAND controller on bcm6858"
+       depends on NAND_BRCMNAND && ARCH_BCM6858
+       help
+         Enable support for broadcom nand driver on bcm6858.
+
+config NAND_BRCMNAND_63158
+       bool "Support Broadcom NAND controller on bcm63158"
+       depends on NAND_BRCMNAND && ARCH_BCM63158
+       help
+         Enable support for broadcom nand driver on bcm63158.
+
 config NAND_DAVINCI
        bool "Support TI Davinci NAND controller"
        help
@@ -256,6 +281,17 @@ config NAND_ZYNQ_USE_BOOTLOADER1_TIMINGS
          This flag prevent U-boot reconfigure NAND flash controller and reuse
          the NAND timing from 1st stage bootloader.
 
+config NAND_STM32_FMC2
+       bool "Support for NAND controller on STM32MP SoCs"
+       depends on ARCH_STM32MP
+       select SYS_NAND_SELF_INIT
+       imply CMD_NAND
+       help
+         Enables support for NAND Flash chips on SoCs containing the FMC2
+         NAND controller. This controller is found on STM32MP SoCs.
+         The controller supports a maximum 8k page size and supports
+         a maximum 8-bit correction error per sector of 512 bytes.
+
 comment "Generic NAND options"
 
 config SYS_NAND_BLOCK_SIZE
index c61e3f38391aeb9027fd1599805d91e88c7eb2a9..9337f6482ed05b8485e930c9f18c41baf2853fb1 100644 (file)
@@ -41,6 +41,7 @@ obj-$(CONFIG_NAND_ECC_BCH) += nand_bch.o
 
 obj-$(CONFIG_NAND_ATMEL) += atmel_nand.o
 obj-$(CONFIG_NAND_ARASAN) += arasan_nfc.o
+obj-$(CONFIG_NAND_BRCMNAND) += brcmnand/
 obj-$(CONFIG_NAND_DAVINCI) += davinci_nand.o
 obj-$(CONFIG_NAND_DENALI) += denali.o
 obj-$(CONFIG_NAND_DENALI_DT) += denali_dt.o
@@ -65,6 +66,7 @@ obj-$(CONFIG_NAND_OMAP_ELM) += omap_elm.o
 obj-$(CONFIG_NAND_PLAT) += nand_plat.o
 obj-$(CONFIG_NAND_SUNXI) += sunxi_nand.o
 obj-$(CONFIG_NAND_ZYNQ) += zynq_nand.o
+obj-$(CONFIG_NAND_STM32_FMC2) += stm32_fmc2_nand.o
 
 else  # minimal SPL drivers
 
diff --git a/drivers/mtd/nand/raw/brcmnand/Makefile b/drivers/mtd/nand/raw/brcmnand/Makefile
new file mode 100644 (file)
index 0000000..a2363cc
--- /dev/null
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: GPL-2.0+
+
+obj-$(CONFIG_NAND_BRCMNAND_63158) += bcm63158_nand.o
+obj-$(CONFIG_NAND_BRCMNAND_6838) += bcm6838_nand.o
+obj-$(CONFIG_NAND_BRCMNAND_6858) += bcm6858_nand.o
+obj-$(CONFIG_NAND_BRCMNAND) += brcmnand.o
+obj-$(CONFIG_NAND_BRCMNAND) += brcmnand_compat.o
diff --git a/drivers/mtd/nand/raw/brcmnand/bcm63158_nand.c b/drivers/mtd/nand/raw/brcmnand/bcm63158_nand.c
new file mode 100644 (file)
index 0000000..16b0d44
--- /dev/null
@@ -0,0 +1,123 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#include <common.h>
+#include <asm/io.h>
+#include <memalign.h>
+#include <nand.h>
+#include <linux/errno.h>
+#include <linux/io.h>
+#include <linux/ioport.h>
+#include <dm.h>
+
+#include "brcmnand.h"
+
+struct bcm63158_nand_soc {
+       struct brcmnand_soc soc;
+       void __iomem *base;
+};
+
+#define BCM63158_NAND_INT              0x00
+#define BCM63158_NAND_STATUS_SHIFT     0
+#define BCM63158_NAND_STATUS_MASK      (0xfff << BCM63158_NAND_STATUS_SHIFT)
+
+#define BCM63158_NAND_INT_EN           0x04
+#define BCM63158_NAND_ENABLE_SHIFT     0
+#define BCM63158_NAND_ENABLE_MASK      (0xffff << BCM63158_NAND_ENABLE_SHIFT)
+
+enum {
+       BCM63158_NP_READ                = BIT(0),
+       BCM63158_BLOCK_ERASE    = BIT(1),
+       BCM63158_COPY_BACK      = BIT(2),
+       BCM63158_PAGE_PGM       = BIT(3),
+       BCM63158_CTRL_READY     = BIT(4),
+       BCM63158_DEV_RBPIN      = BIT(5),
+       BCM63158_ECC_ERR_UNC    = BIT(6),
+       BCM63158_ECC_ERR_CORR   = BIT(7),
+};
+
+static bool bcm63158_nand_intc_ack(struct brcmnand_soc *soc)
+{
+       struct bcm63158_nand_soc *priv =
+                       container_of(soc, struct bcm63158_nand_soc, soc);
+       void __iomem *mmio = priv->base + BCM63158_NAND_INT;
+       u32 val = brcmnand_readl(mmio);
+
+       if (val & (BCM63158_CTRL_READY << BCM63158_NAND_STATUS_SHIFT)) {
+               /* Ack interrupt */
+               val &= ~BCM63158_NAND_STATUS_MASK;
+               val |= BCM63158_CTRL_READY << BCM63158_NAND_STATUS_SHIFT;
+               brcmnand_writel(val, mmio);
+               return true;
+       }
+
+       return false;
+}
+
+static void bcm63158_nand_intc_set(struct brcmnand_soc *soc, bool en)
+{
+       struct bcm63158_nand_soc *priv =
+                       container_of(soc, struct bcm63158_nand_soc, soc);
+       void __iomem *mmio = priv->base + BCM63158_NAND_INT_EN;
+       u32 val = brcmnand_readl(mmio);
+
+       /* Don't ack any interrupts */
+       val &= ~BCM63158_NAND_STATUS_MASK;
+
+       if (en)
+               val |= BCM63158_CTRL_READY << BCM63158_NAND_ENABLE_SHIFT;
+       else
+               val &= ~(BCM63158_CTRL_READY << BCM63158_NAND_ENABLE_SHIFT);
+
+       brcmnand_writel(val, mmio);
+}
+
+static int bcm63158_nand_probe(struct udevice *dev)
+{
+       struct udevice *pdev = dev;
+       struct bcm63158_nand_soc *priv = dev_get_priv(dev);
+       struct brcmnand_soc *soc;
+       struct resource res;
+
+       soc = &priv->soc;
+
+       dev_read_resource_byname(pdev, "nand-int-base", &res);
+       priv->base = devm_ioremap(dev, res.start, resource_size(&res));
+       if (IS_ERR(priv->base))
+               return PTR_ERR(priv->base);
+
+       soc->ctlrdy_ack = bcm63158_nand_intc_ack;
+       soc->ctlrdy_set_enabled = bcm63158_nand_intc_set;
+
+       /* Disable and ack all interrupts  */
+       brcmnand_writel(0, priv->base + BCM63158_NAND_INT_EN);
+       brcmnand_writel(0, priv->base + BCM63158_NAND_INT);
+
+       return brcmnand_probe(pdev, soc);
+}
+
+static const struct udevice_id bcm63158_nand_dt_ids[] = {
+       {
+               .compatible = "brcm,nand-bcm63158",
+       },
+       { /* sentinel */ }
+};
+
+U_BOOT_DRIVER(bcm63158_nand) = {
+       .name = "bcm63158-nand",
+       .id = UCLASS_MTD,
+       .of_match = bcm63158_nand_dt_ids,
+       .probe = bcm63158_nand_probe,
+       .priv_auto_alloc_size = sizeof(struct bcm63158_nand_soc),
+};
+
+void board_nand_init(void)
+{
+       struct udevice *dev;
+       int ret;
+
+       ret = uclass_get_device_by_driver(UCLASS_MTD,
+                                         DM_GET_DRIVER(bcm63158_nand), &dev);
+       if (ret && ret != -ENODEV)
+               pr_err("Failed to initialize %s. (error %d)\n", dev->name,
+                      ret);
+}
diff --git a/drivers/mtd/nand/raw/brcmnand/bcm6838_nand.c b/drivers/mtd/nand/raw/brcmnand/bcm6838_nand.c
new file mode 100644 (file)
index 0000000..ece9444
--- /dev/null
@@ -0,0 +1,122 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#include <common.h>
+#include <asm/io.h>
+#include <memalign.h>
+#include <nand.h>
+#include <linux/errno.h>
+#include <linux/io.h>
+#include <linux/ioport.h>
+#include <dm.h>
+
+#include "brcmnand.h"
+
+struct bcm6838_nand_soc {
+       struct brcmnand_soc soc;
+       void __iomem *base;
+};
+
+#define BCM6838_NAND_INT               0x00
+#define  BCM6838_NAND_STATUS_SHIFT     0
+#define  BCM6838_NAND_STATUS_MASK      (0xfff << BCM6838_NAND_STATUS_SHIFT)
+#define  BCM6838_NAND_ENABLE_SHIFT     16
+#define  BCM6838_NAND_ENABLE_MASK      (0xffff << BCM6838_NAND_ENABLE_SHIFT)
+
+enum {
+       BCM6838_NP_READ         = BIT(0),
+       BCM6838_BLOCK_ERASE     = BIT(1),
+       BCM6838_COPY_BACK       = BIT(2),
+       BCM6838_PAGE_PGM        = BIT(3),
+       BCM6838_CTRL_READY      = BIT(4),
+       BCM6838_DEV_RBPIN       = BIT(5),
+       BCM6838_ECC_ERR_UNC     = BIT(6),
+       BCM6838_ECC_ERR_CORR    = BIT(7),
+};
+
+static bool bcm6838_nand_intc_ack(struct brcmnand_soc *soc)
+{
+       struct bcm6838_nand_soc *priv =
+                       container_of(soc, struct bcm6838_nand_soc, soc);
+       void __iomem *mmio = priv->base + BCM6838_NAND_INT;
+       u32 val = brcmnand_readl(mmio);
+
+       if (val & (BCM6838_CTRL_READY << BCM6838_NAND_STATUS_SHIFT)) {
+               /* Ack interrupt */
+               val &= ~BCM6838_NAND_STATUS_MASK;
+               val |= BCM6838_CTRL_READY << BCM6838_NAND_STATUS_SHIFT;
+               brcmnand_writel(val, mmio);
+               return true;
+       }
+
+       return false;
+}
+
+static void bcm6838_nand_intc_set(struct brcmnand_soc *soc, bool en)
+{
+       struct bcm6838_nand_soc *priv =
+                       container_of(soc, struct bcm6838_nand_soc, soc);
+       void __iomem *mmio = priv->base + BCM6838_NAND_INT;
+       u32 val = brcmnand_readl(mmio);
+
+       /* Don't ack any interrupts */
+       val &= ~BCM6838_NAND_STATUS_MASK;
+
+       if (en)
+               val |= BCM6838_CTRL_READY << BCM6838_NAND_ENABLE_SHIFT;
+       else
+               val &= ~(BCM6838_CTRL_READY << BCM6838_NAND_ENABLE_SHIFT);
+
+       brcmnand_writel(val, mmio);
+}
+
+static int bcm6838_nand_probe(struct udevice *dev)
+{
+       struct udevice *pdev = dev;
+       struct bcm6838_nand_soc *priv = dev_get_priv(dev);
+       struct brcmnand_soc *soc;
+       struct resource res;
+
+       soc = &priv->soc;
+
+       dev_read_resource_byname(pdev, "nand-int-base", &res);
+       priv->base = ioremap(res.start, resource_size(&res));
+       if (IS_ERR(priv->base))
+               return PTR_ERR(priv->base);
+
+       soc->ctlrdy_ack = bcm6838_nand_intc_ack;
+       soc->ctlrdy_set_enabled = bcm6838_nand_intc_set;
+
+       /* Disable and ack all interrupts  */
+       brcmnand_writel(0, priv->base + BCM6838_NAND_INT);
+       brcmnand_writel(BCM6838_NAND_STATUS_MASK,
+                       priv->base + BCM6838_NAND_INT);
+
+       return brcmnand_probe(pdev, soc);
+}
+
+static const struct udevice_id bcm6838_nand_dt_ids[] = {
+       {
+               .compatible = "brcm,nand-bcm6838",
+       },
+       { /* sentinel */ }
+};
+
+U_BOOT_DRIVER(bcm6838_nand) = {
+       .name = "bcm6838-nand",
+       .id = UCLASS_MTD,
+       .of_match = bcm6838_nand_dt_ids,
+       .probe = bcm6838_nand_probe,
+       .priv_auto_alloc_size = sizeof(struct bcm6838_nand_soc),
+};
+
+void board_nand_init(void)
+{
+       struct udevice *dev;
+       int ret;
+
+       ret = uclass_get_device_by_driver(UCLASS_MTD,
+                                         DM_GET_DRIVER(bcm6838_nand), &dev);
+       if (ret && ret != -ENODEV)
+               pr_err("Failed to initialize %s. (error %d)\n", dev->name,
+                      ret);
+}
diff --git a/drivers/mtd/nand/raw/brcmnand/bcm6858_nand.c b/drivers/mtd/nand/raw/brcmnand/bcm6858_nand.c
new file mode 100644 (file)
index 0000000..3586baa
--- /dev/null
@@ -0,0 +1,123 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#include <common.h>
+#include <asm/io.h>
+#include <memalign.h>
+#include <nand.h>
+#include <linux/errno.h>
+#include <linux/io.h>
+#include <linux/ioport.h>
+#include <dm.h>
+
+#include "brcmnand.h"
+
+struct bcm6858_nand_soc {
+       struct brcmnand_soc soc;
+       void __iomem *base;
+};
+
+#define BCM6858_NAND_INT               0x00
+#define BCM6858_NAND_STATUS_SHIFT      0
+#define BCM6858_NAND_STATUS_MASK       (0xfff << BCM6858_NAND_STATUS_SHIFT)
+
+#define BCM6858_NAND_INT_EN            0x04
+#define BCM6858_NAND_ENABLE_SHIFT      0
+#define BCM6858_NAND_ENABLE_MASK       (0xffff << BCM6858_NAND_ENABLE_SHIFT)
+
+enum {
+       BCM6858_NP_READ         = BIT(0),
+       BCM6858_BLOCK_ERASE     = BIT(1),
+       BCM6858_COPY_BACK       = BIT(2),
+       BCM6858_PAGE_PGM        = BIT(3),
+       BCM6858_CTRL_READY      = BIT(4),
+       BCM6858_DEV_RBPIN       = BIT(5),
+       BCM6858_ECC_ERR_UNC     = BIT(6),
+       BCM6858_ECC_ERR_CORR    = BIT(7),
+};
+
+static bool bcm6858_nand_intc_ack(struct brcmnand_soc *soc)
+{
+       struct bcm6858_nand_soc *priv =
+                       container_of(soc, struct bcm6858_nand_soc, soc);
+       void __iomem *mmio = priv->base + BCM6858_NAND_INT;
+       u32 val = brcmnand_readl(mmio);
+
+       if (val & (BCM6858_CTRL_READY << BCM6858_NAND_STATUS_SHIFT)) {
+               /* Ack interrupt */
+               val &= ~BCM6858_NAND_STATUS_MASK;
+               val |= BCM6858_CTRL_READY << BCM6858_NAND_STATUS_SHIFT;
+               brcmnand_writel(val, mmio);
+               return true;
+       }
+
+       return false;
+}
+
+static void bcm6858_nand_intc_set(struct brcmnand_soc *soc, bool en)
+{
+       struct bcm6858_nand_soc *priv =
+                       container_of(soc, struct bcm6858_nand_soc, soc);
+       void __iomem *mmio = priv->base + BCM6858_NAND_INT_EN;
+       u32 val = brcmnand_readl(mmio);
+
+       /* Don't ack any interrupts */
+       val &= ~BCM6858_NAND_STATUS_MASK;
+
+       if (en)
+               val |= BCM6858_CTRL_READY << BCM6858_NAND_ENABLE_SHIFT;
+       else
+               val &= ~(BCM6858_CTRL_READY << BCM6858_NAND_ENABLE_SHIFT);
+
+       brcmnand_writel(val, mmio);
+}
+
+static int bcm6858_nand_probe(struct udevice *dev)
+{
+       struct udevice *pdev = dev;
+       struct bcm6858_nand_soc *priv = dev_get_priv(dev);
+       struct brcmnand_soc *soc;
+       struct resource res;
+
+       soc = &priv->soc;
+
+       dev_read_resource_byname(pdev, "nand-int-base", &res);
+       priv->base = devm_ioremap(dev, res.start, resource_size(&res));
+       if (IS_ERR(priv->base))
+               return PTR_ERR(priv->base);
+
+       soc->ctlrdy_ack = bcm6858_nand_intc_ack;
+       soc->ctlrdy_set_enabled = bcm6858_nand_intc_set;
+
+       /* Disable and ack all interrupts  */
+       brcmnand_writel(0, priv->base + BCM6858_NAND_INT_EN);
+       brcmnand_writel(0, priv->base + BCM6858_NAND_INT);
+
+       return brcmnand_probe(pdev, soc);
+}
+
+static const struct udevice_id bcm6858_nand_dt_ids[] = {
+       {
+               .compatible = "brcm,nand-bcm6858",
+       },
+       { /* sentinel */ }
+};
+
+U_BOOT_DRIVER(bcm6858_nand) = {
+       .name = "bcm6858-nand",
+       .id = UCLASS_MTD,
+       .of_match = bcm6858_nand_dt_ids,
+       .probe = bcm6858_nand_probe,
+       .priv_auto_alloc_size = sizeof(struct bcm6858_nand_soc),
+};
+
+void board_nand_init(void)
+{
+       struct udevice *dev;
+       int ret;
+
+       ret = uclass_get_device_by_driver(UCLASS_MTD,
+                                         DM_GET_DRIVER(bcm6858_nand), &dev);
+       if (ret && ret != -ENODEV)
+               pr_err("Failed to initialize %s. (error %d)\n", dev->name,
+                      ret);
+}
diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
new file mode 100644 (file)
index 0000000..faa6da4
--- /dev/null
@@ -0,0 +1,2805 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright Â© 2010-2015 Broadcom Corporation
+ *
+ * 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.
+ *
+ * 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.
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <memalign.h>
+#include <nand.h>
+#include <clk.h>
+#include <linux/ioport.h>
+#include <linux/completion.h>
+#include <linux/errno.h>
+#include <linux/log2.h>
+#include <asm/processor.h>
+#include <dm.h>
+
+#include "brcmnand.h"
+#include "brcmnand_compat.h"
+
+/*
+ * This flag controls if WP stays on between erase/write commands to mitigate
+ * flash corruption due to power glitches. Values:
+ * 0: NAND_WP is not used or not available
+ * 1: NAND_WP is set by default, cleared for erase/write operations
+ * 2: NAND_WP is always cleared
+ */
+static int wp_on = 1;
+module_param(wp_on, int, 0444);
+
+/***********************************************************************
+ * Definitions
+ ***********************************************************************/
+
+#define DRV_NAME                       "brcmnand"
+
+#define CMD_NULL                       0x00
+#define CMD_PAGE_READ                  0x01
+#define CMD_SPARE_AREA_READ            0x02
+#define CMD_STATUS_READ                        0x03
+#define CMD_PROGRAM_PAGE               0x04
+#define CMD_PROGRAM_SPARE_AREA         0x05
+#define CMD_COPY_BACK                  0x06
+#define CMD_DEVICE_ID_READ             0x07
+#define CMD_BLOCK_ERASE                        0x08
+#define CMD_FLASH_RESET                        0x09
+#define CMD_BLOCKS_LOCK                        0x0a
+#define CMD_BLOCKS_LOCK_DOWN           0x0b
+#define CMD_BLOCKS_UNLOCK              0x0c
+#define CMD_READ_BLOCKS_LOCK_STATUS    0x0d
+#define CMD_PARAMETER_READ             0x0e
+#define CMD_PARAMETER_CHANGE_COL       0x0f
+#define CMD_LOW_LEVEL_OP               0x10
+
+struct brcm_nand_dma_desc {
+       u32 next_desc;
+       u32 next_desc_ext;
+       u32 cmd_irq;
+       u32 dram_addr;
+       u32 dram_addr_ext;
+       u32 tfr_len;
+       u32 total_len;
+       u32 flash_addr;
+       u32 flash_addr_ext;
+       u32 cs;
+       u32 pad2[5];
+       u32 status_valid;
+} __packed;
+
+/* Bitfields for brcm_nand_dma_desc::status_valid */
+#define FLASH_DMA_ECC_ERROR    (1 << 8)
+#define FLASH_DMA_CORR_ERROR   (1 << 9)
+
+/* 512B flash cache in the NAND controller HW */
+#define FC_SHIFT               9U
+#define FC_BYTES               512U
+#define FC_WORDS               (FC_BYTES >> 2)
+
+#define BRCMNAND_MIN_PAGESIZE  512
+#define BRCMNAND_MIN_BLOCKSIZE (8 * 1024)
+#define BRCMNAND_MIN_DEVSIZE   (4ULL * 1024 * 1024)
+
+#define NAND_CTRL_RDY                  (INTFC_CTLR_READY | INTFC_FLASH_READY)
+#define NAND_POLL_STATUS_TIMEOUT_MS    100
+
+/* Controller feature flags */
+enum {
+       BRCMNAND_HAS_1K_SECTORS                 = BIT(0),
+       BRCMNAND_HAS_PREFETCH                   = BIT(1),
+       BRCMNAND_HAS_CACHE_MODE                 = BIT(2),
+       BRCMNAND_HAS_WP                         = BIT(3),
+};
+
+struct brcmnand_controller {
+#ifndef __UBOOT__
+       struct device           *dev;
+#else
+       struct udevice          *dev;
+#endif /* __UBOOT__ */
+       struct nand_hw_control  controller;
+       void __iomem            *nand_base;
+       void __iomem            *nand_fc; /* flash cache */
+       void __iomem            *flash_dma_base;
+       unsigned int            irq;
+       unsigned int            dma_irq;
+       int                     nand_version;
+       int                     parameter_page_big_endian;
+
+       /* Some SoCs provide custom interrupt status register(s) */
+       struct brcmnand_soc     *soc;
+
+       /* Some SoCs have a gateable clock for the controller */
+       struct clk              *clk;
+
+       int                     cmd_pending;
+       bool                    dma_pending;
+       struct completion       done;
+       struct completion       dma_done;
+
+       /* List of NAND hosts (one for each chip-select) */
+       struct list_head host_list;
+
+       struct brcm_nand_dma_desc *dma_desc;
+       dma_addr_t              dma_pa;
+
+       /* in-memory cache of the FLASH_CACHE, used only for some commands */
+       u8                      flash_cache[FC_BYTES];
+
+       /* Controller revision details */
+       const u16               *reg_offsets;
+       unsigned int            reg_spacing; /* between CS1, CS2, ... regs */
+       const u8                *cs_offsets; /* within each chip-select */
+       const u8                *cs0_offsets; /* within CS0, if different */
+       unsigned int            max_block_size;
+       const unsigned int      *block_sizes;
+       unsigned int            max_page_size;
+       const unsigned int      *page_sizes;
+       unsigned int            max_oob;
+       u32                     features;
+
+       /* for low-power standby/resume only */
+       u32                     nand_cs_nand_select;
+       u32                     nand_cs_nand_xor;
+       u32                     corr_stat_threshold;
+       u32                     flash_dma_mode;
+};
+
+struct brcmnand_cfg {
+       u64                     device_size;
+       unsigned int            block_size;
+       unsigned int            page_size;
+       unsigned int            spare_area_size;
+       unsigned int            device_width;
+       unsigned int            col_adr_bytes;
+       unsigned int            blk_adr_bytes;
+       unsigned int            ful_adr_bytes;
+       unsigned int            sector_size_1k;
+       unsigned int            ecc_level;
+       /* use for low-power standby/resume only */
+       u32                     acc_control;
+       u32                     config;
+       u32                     config_ext;
+       u32                     timing_1;
+       u32                     timing_2;
+};
+
+struct brcmnand_host {
+       struct list_head        node;
+
+       struct nand_chip        chip;
+#ifndef __UBOOT__
+       struct platform_device  *pdev;
+#else
+       struct udevice  *pdev;
+#endif /* __UBOOT__ */
+       int                     cs;
+
+       unsigned int            last_cmd;
+       unsigned int            last_byte;
+       u64                     last_addr;
+       struct brcmnand_cfg     hwcfg;
+       struct brcmnand_controller *ctrl;
+};
+
+enum brcmnand_reg {
+       BRCMNAND_CMD_START = 0,
+       BRCMNAND_CMD_EXT_ADDRESS,
+       BRCMNAND_CMD_ADDRESS,
+       BRCMNAND_INTFC_STATUS,
+       BRCMNAND_CS_SELECT,
+       BRCMNAND_CS_XOR,
+       BRCMNAND_LL_OP,
+       BRCMNAND_CS0_BASE,
+       BRCMNAND_CS1_BASE,              /* CS1 regs, if non-contiguous */
+       BRCMNAND_CORR_THRESHOLD,
+       BRCMNAND_CORR_THRESHOLD_EXT,
+       BRCMNAND_UNCORR_COUNT,
+       BRCMNAND_CORR_COUNT,
+       BRCMNAND_CORR_EXT_ADDR,
+       BRCMNAND_CORR_ADDR,
+       BRCMNAND_UNCORR_EXT_ADDR,
+       BRCMNAND_UNCORR_ADDR,
+       BRCMNAND_SEMAPHORE,
+       BRCMNAND_ID,
+       BRCMNAND_ID_EXT,
+       BRCMNAND_LL_RDATA,
+       BRCMNAND_OOB_READ_BASE,
+       BRCMNAND_OOB_READ_10_BASE,      /* offset 0x10, if non-contiguous */
+       BRCMNAND_OOB_WRITE_BASE,
+       BRCMNAND_OOB_WRITE_10_BASE,     /* offset 0x10, if non-contiguous */
+       BRCMNAND_FC_BASE,
+};
+
+/* BRCMNAND v4.0 */
+static const u16 brcmnand_regs_v40[] = {
+       [BRCMNAND_CMD_START]            =  0x04,
+       [BRCMNAND_CMD_EXT_ADDRESS]      =  0x08,
+       [BRCMNAND_CMD_ADDRESS]          =  0x0c,
+       [BRCMNAND_INTFC_STATUS]         =  0x6c,
+       [BRCMNAND_CS_SELECT]            =  0x14,
+       [BRCMNAND_CS_XOR]               =  0x18,
+       [BRCMNAND_LL_OP]                = 0x178,
+       [BRCMNAND_CS0_BASE]             =  0x40,
+       [BRCMNAND_CS1_BASE]             =  0xd0,
+       [BRCMNAND_CORR_THRESHOLD]       =  0x84,
+       [BRCMNAND_CORR_THRESHOLD_EXT]   =     0,
+       [BRCMNAND_UNCORR_COUNT]         =     0,
+       [BRCMNAND_CORR_COUNT]           =     0,
+       [BRCMNAND_CORR_EXT_ADDR]        =  0x70,
+       [BRCMNAND_CORR_ADDR]            =  0x74,
+       [BRCMNAND_UNCORR_EXT_ADDR]      =  0x78,
+       [BRCMNAND_UNCORR_ADDR]          =  0x7c,
+       [BRCMNAND_SEMAPHORE]            =  0x58,
+       [BRCMNAND_ID]                   =  0x60,
+       [BRCMNAND_ID_EXT]               =  0x64,
+       [BRCMNAND_LL_RDATA]             = 0x17c,
+       [BRCMNAND_OOB_READ_BASE]        =  0x20,
+       [BRCMNAND_OOB_READ_10_BASE]     = 0x130,
+       [BRCMNAND_OOB_WRITE_BASE]       =  0x30,
+       [BRCMNAND_OOB_WRITE_10_BASE]    =     0,
+       [BRCMNAND_FC_BASE]              = 0x200,
+};
+
+/* BRCMNAND v5.0 */
+static const u16 brcmnand_regs_v50[] = {
+       [BRCMNAND_CMD_START]            =  0x04,
+       [BRCMNAND_CMD_EXT_ADDRESS]      =  0x08,
+       [BRCMNAND_CMD_ADDRESS]          =  0x0c,
+       [BRCMNAND_INTFC_STATUS]         =  0x6c,
+       [BRCMNAND_CS_SELECT]            =  0x14,
+       [BRCMNAND_CS_XOR]               =  0x18,
+       [BRCMNAND_LL_OP]                = 0x178,
+       [BRCMNAND_CS0_BASE]             =  0x40,
+       [BRCMNAND_CS1_BASE]             =  0xd0,
+       [BRCMNAND_CORR_THRESHOLD]       =  0x84,
+       [BRCMNAND_CORR_THRESHOLD_EXT]   =     0,
+       [BRCMNAND_UNCORR_COUNT]         =     0,
+       [BRCMNAND_CORR_COUNT]           =     0,
+       [BRCMNAND_CORR_EXT_ADDR]        =  0x70,
+       [BRCMNAND_CORR_ADDR]            =  0x74,
+       [BRCMNAND_UNCORR_EXT_ADDR]      =  0x78,
+       [BRCMNAND_UNCORR_ADDR]          =  0x7c,
+       [BRCMNAND_SEMAPHORE]            =  0x58,
+       [BRCMNAND_ID]                   =  0x60,
+       [BRCMNAND_ID_EXT]               =  0x64,
+       [BRCMNAND_LL_RDATA]             = 0x17c,
+       [BRCMNAND_OOB_READ_BASE]        =  0x20,
+       [BRCMNAND_OOB_READ_10_BASE]     = 0x130,
+       [BRCMNAND_OOB_WRITE_BASE]       =  0x30,
+       [BRCMNAND_OOB_WRITE_10_BASE]    = 0x140,
+       [BRCMNAND_FC_BASE]              = 0x200,
+};
+
+/* BRCMNAND v6.0 - v7.1 */
+static const u16 brcmnand_regs_v60[] = {
+       [BRCMNAND_CMD_START]            =  0x04,
+       [BRCMNAND_CMD_EXT_ADDRESS]      =  0x08,
+       [BRCMNAND_CMD_ADDRESS]          =  0x0c,
+       [BRCMNAND_INTFC_STATUS]         =  0x14,
+       [BRCMNAND_CS_SELECT]            =  0x18,
+       [BRCMNAND_CS_XOR]               =  0x1c,
+       [BRCMNAND_LL_OP]                =  0x20,
+       [BRCMNAND_CS0_BASE]             =  0x50,
+       [BRCMNAND_CS1_BASE]             =     0,
+       [BRCMNAND_CORR_THRESHOLD]       =  0xc0,
+       [BRCMNAND_CORR_THRESHOLD_EXT]   =  0xc4,
+       [BRCMNAND_UNCORR_COUNT]         =  0xfc,
+       [BRCMNAND_CORR_COUNT]           = 0x100,
+       [BRCMNAND_CORR_EXT_ADDR]        = 0x10c,
+       [BRCMNAND_CORR_ADDR]            = 0x110,
+       [BRCMNAND_UNCORR_EXT_ADDR]      = 0x114,
+       [BRCMNAND_UNCORR_ADDR]          = 0x118,
+       [BRCMNAND_SEMAPHORE]            = 0x150,
+       [BRCMNAND_ID]                   = 0x194,
+       [BRCMNAND_ID_EXT]               = 0x198,
+       [BRCMNAND_LL_RDATA]             = 0x19c,
+       [BRCMNAND_OOB_READ_BASE]        = 0x200,
+       [BRCMNAND_OOB_READ_10_BASE]     =     0,
+       [BRCMNAND_OOB_WRITE_BASE]       = 0x280,
+       [BRCMNAND_OOB_WRITE_10_BASE]    =     0,
+       [BRCMNAND_FC_BASE]              = 0x400,
+};
+
+/* BRCMNAND v7.1 */
+static const u16 brcmnand_regs_v71[] = {
+       [BRCMNAND_CMD_START]            =  0x04,
+       [BRCMNAND_CMD_EXT_ADDRESS]      =  0x08,
+       [BRCMNAND_CMD_ADDRESS]          =  0x0c,
+       [BRCMNAND_INTFC_STATUS]         =  0x14,
+       [BRCMNAND_CS_SELECT]            =  0x18,
+       [BRCMNAND_CS_XOR]               =  0x1c,
+       [BRCMNAND_LL_OP]                =  0x20,
+       [BRCMNAND_CS0_BASE]             =  0x50,
+       [BRCMNAND_CS1_BASE]             =     0,
+       [BRCMNAND_CORR_THRESHOLD]       =  0xdc,
+       [BRCMNAND_CORR_THRESHOLD_EXT]   =  0xe0,
+       [BRCMNAND_UNCORR_COUNT]         =  0xfc,
+       [BRCMNAND_CORR_COUNT]           = 0x100,
+       [BRCMNAND_CORR_EXT_ADDR]        = 0x10c,
+       [BRCMNAND_CORR_ADDR]            = 0x110,
+       [BRCMNAND_UNCORR_EXT_ADDR]      = 0x114,
+       [BRCMNAND_UNCORR_ADDR]          = 0x118,
+       [BRCMNAND_SEMAPHORE]            = 0x150,
+       [BRCMNAND_ID]                   = 0x194,
+       [BRCMNAND_ID_EXT]               = 0x198,
+       [BRCMNAND_LL_RDATA]             = 0x19c,
+       [BRCMNAND_OOB_READ_BASE]        = 0x200,
+       [BRCMNAND_OOB_READ_10_BASE]     =     0,
+       [BRCMNAND_OOB_WRITE_BASE]       = 0x280,
+       [BRCMNAND_OOB_WRITE_10_BASE]    =     0,
+       [BRCMNAND_FC_BASE]              = 0x400,
+};
+
+/* BRCMNAND v7.2 */
+static const u16 brcmnand_regs_v72[] = {
+       [BRCMNAND_CMD_START]            =  0x04,
+       [BRCMNAND_CMD_EXT_ADDRESS]      =  0x08,
+       [BRCMNAND_CMD_ADDRESS]          =  0x0c,
+       [BRCMNAND_INTFC_STATUS]         =  0x14,
+       [BRCMNAND_CS_SELECT]            =  0x18,
+       [BRCMNAND_CS_XOR]               =  0x1c,
+       [BRCMNAND_LL_OP]                =  0x20,
+       [BRCMNAND_CS0_BASE]             =  0x50,
+       [BRCMNAND_CS1_BASE]             =     0,
+       [BRCMNAND_CORR_THRESHOLD]       =  0xdc,
+       [BRCMNAND_CORR_THRESHOLD_EXT]   =  0xe0,
+       [BRCMNAND_UNCORR_COUNT]         =  0xfc,
+       [BRCMNAND_CORR_COUNT]           = 0x100,
+       [BRCMNAND_CORR_EXT_ADDR]        = 0x10c,
+       [BRCMNAND_CORR_ADDR]            = 0x110,
+       [BRCMNAND_UNCORR_EXT_ADDR]      = 0x114,
+       [BRCMNAND_UNCORR_ADDR]          = 0x118,
+       [BRCMNAND_SEMAPHORE]            = 0x150,
+       [BRCMNAND_ID]                   = 0x194,
+       [BRCMNAND_ID_EXT]               = 0x198,
+       [BRCMNAND_LL_RDATA]             = 0x19c,
+       [BRCMNAND_OOB_READ_BASE]        = 0x200,
+       [BRCMNAND_OOB_READ_10_BASE]     =     0,
+       [BRCMNAND_OOB_WRITE_BASE]       = 0x400,
+       [BRCMNAND_OOB_WRITE_10_BASE]    =     0,
+       [BRCMNAND_FC_BASE]              = 0x600,
+};
+
+enum brcmnand_cs_reg {
+       BRCMNAND_CS_CFG_EXT = 0,
+       BRCMNAND_CS_CFG,
+       BRCMNAND_CS_ACC_CONTROL,
+       BRCMNAND_CS_TIMING1,
+       BRCMNAND_CS_TIMING2,
+};
+
+/* Per chip-select offsets for v7.1 */
+static const u8 brcmnand_cs_offsets_v71[] = {
+       [BRCMNAND_CS_ACC_CONTROL]       = 0x00,
+       [BRCMNAND_CS_CFG_EXT]           = 0x04,
+       [BRCMNAND_CS_CFG]               = 0x08,
+       [BRCMNAND_CS_TIMING1]           = 0x0c,
+       [BRCMNAND_CS_TIMING2]           = 0x10,
+};
+
+/* Per chip-select offsets for pre v7.1, except CS0 on <= v5.0 */
+static const u8 brcmnand_cs_offsets[] = {
+       [BRCMNAND_CS_ACC_CONTROL]       = 0x00,
+       [BRCMNAND_CS_CFG_EXT]           = 0x04,
+       [BRCMNAND_CS_CFG]               = 0x04,
+       [BRCMNAND_CS_TIMING1]           = 0x08,
+       [BRCMNAND_CS_TIMING2]           = 0x0c,
+};
+
+/* Per chip-select offset for <= v5.0 on CS0 only */
+static const u8 brcmnand_cs_offsets_cs0[] = {
+       [BRCMNAND_CS_ACC_CONTROL]       = 0x00,
+       [BRCMNAND_CS_CFG_EXT]           = 0x08,
+       [BRCMNAND_CS_CFG]               = 0x08,
+       [BRCMNAND_CS_TIMING1]           = 0x10,
+       [BRCMNAND_CS_TIMING2]           = 0x14,
+};
+
+/*
+ * Bitfields for the CFG and CFG_EXT registers. Pre-v7.1 controllers only had
+ * one config register, but once the bitfields overflowed, newer controllers
+ * (v7.1 and newer) added a CFG_EXT register and shuffled a few fields around.
+ */
+enum {
+       CFG_BLK_ADR_BYTES_SHIFT         = 8,
+       CFG_COL_ADR_BYTES_SHIFT         = 12,
+       CFG_FUL_ADR_BYTES_SHIFT         = 16,
+       CFG_BUS_WIDTH_SHIFT             = 23,
+       CFG_BUS_WIDTH                   = BIT(CFG_BUS_WIDTH_SHIFT),
+       CFG_DEVICE_SIZE_SHIFT           = 24,
+
+       /* Only for pre-v7.1 (with no CFG_EXT register) */
+       CFG_PAGE_SIZE_SHIFT             = 20,
+       CFG_BLK_SIZE_SHIFT              = 28,
+
+       /* Only for v7.1+ (with CFG_EXT register) */
+       CFG_EXT_PAGE_SIZE_SHIFT         = 0,
+       CFG_EXT_BLK_SIZE_SHIFT          = 4,
+};
+
+/* BRCMNAND_INTFC_STATUS */
+enum {
+       INTFC_FLASH_STATUS              = GENMASK(7, 0),
+
+       INTFC_ERASED                    = BIT(27),
+       INTFC_OOB_VALID                 = BIT(28),
+       INTFC_CACHE_VALID               = BIT(29),
+       INTFC_FLASH_READY               = BIT(30),
+       INTFC_CTLR_READY                = BIT(31),
+};
+
+static inline u32 nand_readreg(struct brcmnand_controller *ctrl, u32 offs)
+{
+       return brcmnand_readl(ctrl->nand_base + offs);
+}
+
+static inline void nand_writereg(struct brcmnand_controller *ctrl, u32 offs,
+                                u32 val)
+{
+       brcmnand_writel(val, ctrl->nand_base + offs);
+}
+
+static int brcmnand_revision_init(struct brcmnand_controller *ctrl)
+{
+       static const unsigned int block_sizes_v6[] = { 8, 16, 128, 256, 512, 1024, 2048, 0 };
+       static const unsigned int block_sizes_v4[] = { 16, 128, 8, 512, 256, 1024, 2048, 0 };
+       static const unsigned int page_sizes[] = { 512, 2048, 4096, 8192, 0 };
+
+       ctrl->nand_version = nand_readreg(ctrl, 0) & 0xffff;
+
+       /* Only support v4.0+? */
+       if (ctrl->nand_version < 0x0400) {
+               dev_err(ctrl->dev, "version %#x not supported\n",
+                       ctrl->nand_version);
+               return -ENODEV;
+       }
+
+       /* Register offsets */
+       if (ctrl->nand_version >= 0x0702)
+               ctrl->reg_offsets = brcmnand_regs_v72;
+       else if (ctrl->nand_version >= 0x0701)
+               ctrl->reg_offsets = brcmnand_regs_v71;
+       else if (ctrl->nand_version >= 0x0600)
+               ctrl->reg_offsets = brcmnand_regs_v60;
+       else if (ctrl->nand_version >= 0x0500)
+               ctrl->reg_offsets = brcmnand_regs_v50;
+       else if (ctrl->nand_version >= 0x0400)
+               ctrl->reg_offsets = brcmnand_regs_v40;
+
+       /* Chip-select stride */
+       if (ctrl->nand_version >= 0x0701)
+               ctrl->reg_spacing = 0x14;
+       else
+               ctrl->reg_spacing = 0x10;
+
+       /* Per chip-select registers */
+       if (ctrl->nand_version >= 0x0701) {
+               ctrl->cs_offsets = brcmnand_cs_offsets_v71;
+       } else {
+               ctrl->cs_offsets = brcmnand_cs_offsets;
+
+               /* v5.0 and earlier has a different CS0 offset layout */
+               if (ctrl->nand_version <= 0x0500)
+                       ctrl->cs0_offsets = brcmnand_cs_offsets_cs0;
+       }
+
+       /* Page / block sizes */
+       if (ctrl->nand_version >= 0x0701) {
+               /* >= v7.1 use nice power-of-2 values! */
+               ctrl->max_page_size = 16 * 1024;
+               ctrl->max_block_size = 2 * 1024 * 1024;
+       } else {
+               ctrl->page_sizes = page_sizes;
+               if (ctrl->nand_version >= 0x0600)
+                       ctrl->block_sizes = block_sizes_v6;
+               else
+                       ctrl->block_sizes = block_sizes_v4;
+
+               if (ctrl->nand_version < 0x0400) {
+                       ctrl->max_page_size = 4096;
+                       ctrl->max_block_size = 512 * 1024;
+               }
+       }
+
+       /* Maximum spare area sector size (per 512B) */
+       if (ctrl->nand_version >= 0x0702)
+               ctrl->max_oob = 128;
+       else if (ctrl->nand_version >= 0x0600)
+               ctrl->max_oob = 64;
+       else if (ctrl->nand_version >= 0x0500)
+               ctrl->max_oob = 32;
+       else
+               ctrl->max_oob = 16;
+
+       /* v6.0 and newer (except v6.1) have prefetch support */
+       if (ctrl->nand_version >= 0x0600 && ctrl->nand_version != 0x0601)
+               ctrl->features |= BRCMNAND_HAS_PREFETCH;
+
+       /*
+        * v6.x has cache mode, but it's implemented differently. Ignore it for
+        * now.
+        */
+       if (ctrl->nand_version >= 0x0700)
+               ctrl->features |= BRCMNAND_HAS_CACHE_MODE;
+
+       if (ctrl->nand_version >= 0x0500)
+               ctrl->features |= BRCMNAND_HAS_1K_SECTORS;
+
+       if (ctrl->nand_version >= 0x0700)
+               ctrl->features |= BRCMNAND_HAS_WP;
+#ifndef __UBOOT__
+       else if (of_property_read_bool(ctrl->dev->of_node, "brcm,nand-has-wp"))
+#else
+       else if (dev_read_bool(ctrl->dev, "brcm,nand-has-wp"))
+#endif /* __UBOOT__ */
+               ctrl->features |= BRCMNAND_HAS_WP;
+
+       return 0;
+}
+
+static inline u32 brcmnand_read_reg(struct brcmnand_controller *ctrl,
+               enum brcmnand_reg reg)
+{
+       u16 offs = ctrl->reg_offsets[reg];
+
+       if (offs)
+               return nand_readreg(ctrl, offs);
+       else
+               return 0;
+}
+
+static inline void brcmnand_write_reg(struct brcmnand_controller *ctrl,
+                                     enum brcmnand_reg reg, u32 val)
+{
+       u16 offs = ctrl->reg_offsets[reg];
+
+       if (offs)
+               nand_writereg(ctrl, offs, val);
+}
+
+static inline void brcmnand_rmw_reg(struct brcmnand_controller *ctrl,
+                                   enum brcmnand_reg reg, u32 mask, unsigned
+                                   int shift, u32 val)
+{
+       u32 tmp = brcmnand_read_reg(ctrl, reg);
+
+       tmp &= ~mask;
+       tmp |= val << shift;
+       brcmnand_write_reg(ctrl, reg, tmp);
+}
+
+static inline u32 brcmnand_read_fc(struct brcmnand_controller *ctrl, int word)
+{
+       return __raw_readl(ctrl->nand_fc + word * 4);
+}
+
+static inline void brcmnand_write_fc(struct brcmnand_controller *ctrl,
+                                    int word, u32 val)
+{
+       __raw_writel(val, ctrl->nand_fc + word * 4);
+}
+
+static inline u16 brcmnand_cs_offset(struct brcmnand_controller *ctrl, int cs,
+                                    enum brcmnand_cs_reg reg)
+{
+       u16 offs_cs0 = ctrl->reg_offsets[BRCMNAND_CS0_BASE];
+       u16 offs_cs1 = ctrl->reg_offsets[BRCMNAND_CS1_BASE];
+       u8 cs_offs;
+
+       if (cs == 0 && ctrl->cs0_offsets)
+               cs_offs = ctrl->cs0_offsets[reg];
+       else
+               cs_offs = ctrl->cs_offsets[reg];
+
+       if (cs && offs_cs1)
+               return offs_cs1 + (cs - 1) * ctrl->reg_spacing + cs_offs;
+
+       return offs_cs0 + cs * ctrl->reg_spacing + cs_offs;
+}
+
+static inline u32 brcmnand_count_corrected(struct brcmnand_controller *ctrl)
+{
+       if (ctrl->nand_version < 0x0600)
+               return 1;
+       return brcmnand_read_reg(ctrl, BRCMNAND_CORR_COUNT);
+}
+
+static void brcmnand_wr_corr_thresh(struct brcmnand_host *host, u8 val)
+{
+       struct brcmnand_controller *ctrl = host->ctrl;
+       unsigned int shift = 0, bits;
+       enum brcmnand_reg reg = BRCMNAND_CORR_THRESHOLD;
+       int cs = host->cs;
+
+       if (ctrl->nand_version >= 0x0702)
+               bits = 7;
+       else if (ctrl->nand_version >= 0x0600)
+               bits = 6;
+       else if (ctrl->nand_version >= 0x0500)
+               bits = 5;
+       else
+               bits = 4;
+
+       if (ctrl->nand_version >= 0x0702) {
+               if (cs >= 4)
+                       reg = BRCMNAND_CORR_THRESHOLD_EXT;
+               shift = (cs % 4) * bits;
+       } else if (ctrl->nand_version >= 0x0600) {
+               if (cs >= 5)
+                       reg = BRCMNAND_CORR_THRESHOLD_EXT;
+               shift = (cs % 5) * bits;
+       }
+       brcmnand_rmw_reg(ctrl, reg, (bits - 1) << shift, shift, val);
+}
+
+static inline int brcmnand_cmd_shift(struct brcmnand_controller *ctrl)
+{
+       if (ctrl->nand_version < 0x0602)
+               return 24;
+       return 0;
+}
+
+/***********************************************************************
+ * NAND ACC CONTROL bitfield
+ *
+ * Some bits have remained constant throughout hardware revision, while
+ * others have shifted around.
+ ***********************************************************************/
+
+/* Constant for all versions (where supported) */
+enum {
+       /* See BRCMNAND_HAS_CACHE_MODE */
+       ACC_CONTROL_CACHE_MODE                          = BIT(22),
+
+       /* See BRCMNAND_HAS_PREFETCH */
+       ACC_CONTROL_PREFETCH                            = BIT(23),
+
+       ACC_CONTROL_PAGE_HIT                            = BIT(24),
+       ACC_CONTROL_WR_PREEMPT                          = BIT(25),
+       ACC_CONTROL_PARTIAL_PAGE                        = BIT(26),
+       ACC_CONTROL_RD_ERASED                           = BIT(27),
+       ACC_CONTROL_FAST_PGM_RDIN                       = BIT(28),
+       ACC_CONTROL_WR_ECC                              = BIT(30),
+       ACC_CONTROL_RD_ECC                              = BIT(31),
+};
+
+static inline u32 brcmnand_spare_area_mask(struct brcmnand_controller *ctrl)
+{
+       if (ctrl->nand_version >= 0x0702)
+               return GENMASK(7, 0);
+       else if (ctrl->nand_version >= 0x0600)
+               return GENMASK(6, 0);
+       else
+               return GENMASK(5, 0);
+}
+
+#define NAND_ACC_CONTROL_ECC_SHIFT     16
+#define NAND_ACC_CONTROL_ECC_EXT_SHIFT 13
+
+static inline u32 brcmnand_ecc_level_mask(struct brcmnand_controller *ctrl)
+{
+       u32 mask = (ctrl->nand_version >= 0x0600) ? 0x1f : 0x0f;
+
+       mask <<= NAND_ACC_CONTROL_ECC_SHIFT;
+
+       /* v7.2 includes additional ECC levels */
+       if (ctrl->nand_version >= 0x0702)
+               mask |= 0x7 << NAND_ACC_CONTROL_ECC_EXT_SHIFT;
+
+       return mask;
+}
+
+static void brcmnand_set_ecc_enabled(struct brcmnand_host *host, int en)
+{
+       struct brcmnand_controller *ctrl = host->ctrl;
+       u16 offs = brcmnand_cs_offset(ctrl, host->cs, BRCMNAND_CS_ACC_CONTROL);
+       u32 acc_control = nand_readreg(ctrl, offs);
+       u32 ecc_flags = ACC_CONTROL_WR_ECC | ACC_CONTROL_RD_ECC;
+
+       if (en) {
+               acc_control |= ecc_flags; /* enable RD/WR ECC */
+               acc_control |= host->hwcfg.ecc_level
+                              << NAND_ACC_CONTROL_ECC_SHIFT;
+       } else {
+               acc_control &= ~ecc_flags; /* disable RD/WR ECC */
+               acc_control &= ~brcmnand_ecc_level_mask(ctrl);
+       }
+
+       nand_writereg(ctrl, offs, acc_control);
+}
+
+static inline int brcmnand_sector_1k_shift(struct brcmnand_controller *ctrl)
+{
+       if (ctrl->nand_version >= 0x0702)
+               return 9;
+       else if (ctrl->nand_version >= 0x0600)
+               return 7;
+       else if (ctrl->nand_version >= 0x0500)
+               return 6;
+       else
+               return -1;
+}
+
+static int brcmnand_get_sector_size_1k(struct brcmnand_host *host)
+{
+       struct brcmnand_controller *ctrl = host->ctrl;
+       int shift = brcmnand_sector_1k_shift(ctrl);
+       u16 acc_control_offs = brcmnand_cs_offset(ctrl, host->cs,
+                                                 BRCMNAND_CS_ACC_CONTROL);
+
+       if (shift < 0)
+               return 0;
+
+       return (nand_readreg(ctrl, acc_control_offs) >> shift) & 0x1;
+}
+
+static void brcmnand_set_sector_size_1k(struct brcmnand_host *host, int val)
+{
+       struct brcmnand_controller *ctrl = host->ctrl;
+       int shift = brcmnand_sector_1k_shift(ctrl);
+       u16 acc_control_offs = brcmnand_cs_offset(ctrl, host->cs,
+                                                 BRCMNAND_CS_ACC_CONTROL);
+       u32 tmp;
+
+       if (shift < 0)
+               return;
+
+       tmp = nand_readreg(ctrl, acc_control_offs);
+       tmp &= ~(1 << shift);
+       tmp |= (!!val) << shift;
+       nand_writereg(ctrl, acc_control_offs, tmp);
+}
+
+/***********************************************************************
+ * CS_NAND_SELECT
+ ***********************************************************************/
+
+enum {
+       CS_SELECT_NAND_WP                       = BIT(29),
+       CS_SELECT_AUTO_DEVICE_ID_CFG            = BIT(30),
+};
+
+static int bcmnand_ctrl_poll_status(struct brcmnand_controller *ctrl,
+                                   u32 mask, u32 expected_val,
+                                   unsigned long timeout_ms)
+{
+#ifndef __UBOOT__
+       unsigned long limit;
+       u32 val;
+
+       if (!timeout_ms)
+               timeout_ms = NAND_POLL_STATUS_TIMEOUT_MS;
+
+       limit = jiffies + msecs_to_jiffies(timeout_ms);
+       do {
+               val = brcmnand_read_reg(ctrl, BRCMNAND_INTFC_STATUS);
+               if ((val & mask) == expected_val)
+                       return 0;
+
+               cpu_relax();
+       } while (time_after(limit, jiffies));
+#else
+       unsigned long base, limit;
+       u32 val;
+
+       if (!timeout_ms)
+               timeout_ms = NAND_POLL_STATUS_TIMEOUT_MS;
+
+       base = get_timer(0);
+       limit = CONFIG_SYS_HZ * timeout_ms / 1000;
+       do {
+               val = brcmnand_read_reg(ctrl, BRCMNAND_INTFC_STATUS);
+               if ((val & mask) == expected_val)
+                       return 0;
+
+               cpu_relax();
+       } while (get_timer(base) < limit);
+#endif /* __UBOOT__ */
+
+       dev_warn(ctrl->dev, "timeout on status poll (expected %x got %x)\n",
+                expected_val, val & mask);
+
+       return -ETIMEDOUT;
+}
+
+static inline void brcmnand_set_wp(struct brcmnand_controller *ctrl, bool en)
+{
+       u32 val = en ? CS_SELECT_NAND_WP : 0;
+
+       brcmnand_rmw_reg(ctrl, BRCMNAND_CS_SELECT, CS_SELECT_NAND_WP, 0, val);
+}
+
+/***********************************************************************
+ * Flash DMA
+ ***********************************************************************/
+
+enum flash_dma_reg {
+       FLASH_DMA_REVISION              = 0x00,
+       FLASH_DMA_FIRST_DESC            = 0x04,
+       FLASH_DMA_FIRST_DESC_EXT        = 0x08,
+       FLASH_DMA_CTRL                  = 0x0c,
+       FLASH_DMA_MODE                  = 0x10,
+       FLASH_DMA_STATUS                = 0x14,
+       FLASH_DMA_INTERRUPT_DESC        = 0x18,
+       FLASH_DMA_INTERRUPT_DESC_EXT    = 0x1c,
+       FLASH_DMA_ERROR_STATUS          = 0x20,
+       FLASH_DMA_CURRENT_DESC          = 0x24,
+       FLASH_DMA_CURRENT_DESC_EXT      = 0x28,
+};
+
+static inline bool has_flash_dma(struct brcmnand_controller *ctrl)
+{
+       return ctrl->flash_dma_base;
+}
+
+static inline bool flash_dma_buf_ok(const void *buf)
+{
+#ifndef __UBOOT__
+       return buf && !is_vmalloc_addr(buf) &&
+               likely(IS_ALIGNED((uintptr_t)buf, 4));
+#else
+       return buf && likely(IS_ALIGNED((uintptr_t)buf, 4));
+#endif /* __UBOOT__ */
+}
+
+static inline void flash_dma_writel(struct brcmnand_controller *ctrl, u8 offs,
+                                   u32 val)
+{
+       brcmnand_writel(val, ctrl->flash_dma_base + offs);
+}
+
+static inline u32 flash_dma_readl(struct brcmnand_controller *ctrl, u8 offs)
+{
+       return brcmnand_readl(ctrl->flash_dma_base + offs);
+}
+
+/* Low-level operation types: command, address, write, or read */
+enum brcmnand_llop_type {
+       LL_OP_CMD,
+       LL_OP_ADDR,
+       LL_OP_WR,
+       LL_OP_RD,
+};
+
+/***********************************************************************
+ * Internal support functions
+ ***********************************************************************/
+
+static inline bool is_hamming_ecc(struct brcmnand_controller *ctrl,
+                                 struct brcmnand_cfg *cfg)
+{
+       if (ctrl->nand_version <= 0x0701)
+               return cfg->sector_size_1k == 0 && cfg->spare_area_size == 16 &&
+                       cfg->ecc_level == 15;
+       else
+               return cfg->sector_size_1k == 0 && ((cfg->spare_area_size == 16 &&
+                       cfg->ecc_level == 15) ||
+                       (cfg->spare_area_size == 28 && cfg->ecc_level == 16));
+}
+
+/*
+ * Set mtd->ooblayout to the appropriate mtd_ooblayout_ops given
+ * the layout/configuration.
+ * Returns -ERRCODE on failure.
+ */
+static int brcmnand_hamming_ooblayout_ecc(struct mtd_info *mtd, int section,
+                                         struct mtd_oob_region *oobregion)
+{
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       struct brcmnand_cfg *cfg = &host->hwcfg;
+       int sas = cfg->spare_area_size << cfg->sector_size_1k;
+       int sectors = cfg->page_size / (512 << cfg->sector_size_1k);
+
+       if (section >= sectors)
+               return -ERANGE;
+
+       oobregion->offset = (section * sas) + 6;
+       oobregion->length = 3;
+
+       return 0;
+}
+
+static int brcmnand_hamming_ooblayout_free(struct mtd_info *mtd, int section,
+                                          struct mtd_oob_region *oobregion)
+{
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       struct brcmnand_cfg *cfg = &host->hwcfg;
+       int sas = cfg->spare_area_size << cfg->sector_size_1k;
+       int sectors = cfg->page_size / (512 << cfg->sector_size_1k);
+
+       if (section >= sectors * 2)
+               return -ERANGE;
+
+       oobregion->offset = (section / 2) * sas;
+
+       if (section & 1) {
+               oobregion->offset += 9;
+               oobregion->length = 7;
+       } else {
+               oobregion->length = 6;
+
+               /* First sector of each page may have BBI */
+               if (!section) {
+                       /*
+                        * Small-page NAND use byte 6 for BBI while large-page
+                        * NAND use byte 0.
+                        */
+                       if (cfg->page_size > 512)
+                               oobregion->offset++;
+                       oobregion->length--;
+               }
+       }
+
+       return 0;
+}
+
+static const struct mtd_ooblayout_ops brcmnand_hamming_ooblayout_ops = {
+       .ecc = brcmnand_hamming_ooblayout_ecc,
+       .free = brcmnand_hamming_ooblayout_free,
+};
+
+static int brcmnand_bch_ooblayout_ecc(struct mtd_info *mtd, int section,
+                                     struct mtd_oob_region *oobregion)
+{
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       struct brcmnand_cfg *cfg = &host->hwcfg;
+       int sas = cfg->spare_area_size << cfg->sector_size_1k;
+       int sectors = cfg->page_size / (512 << cfg->sector_size_1k);
+
+       if (section >= sectors)
+               return -ERANGE;
+
+       oobregion->offset = (section * (sas + 1)) - chip->ecc.bytes;
+       oobregion->length = chip->ecc.bytes;
+
+       return 0;
+}
+
+static int brcmnand_bch_ooblayout_free_lp(struct mtd_info *mtd, int section,
+                                         struct mtd_oob_region *oobregion)
+{
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       struct brcmnand_cfg *cfg = &host->hwcfg;
+       int sas = cfg->spare_area_size << cfg->sector_size_1k;
+       int sectors = cfg->page_size / (512 << cfg->sector_size_1k);
+
+       if (section >= sectors)
+               return -ERANGE;
+
+       if (sas <= chip->ecc.bytes)
+               return 0;
+
+       oobregion->offset = section * sas;
+       oobregion->length = sas - chip->ecc.bytes;
+
+       if (!section) {
+               oobregion->offset++;
+               oobregion->length--;
+       }
+
+       return 0;
+}
+
+static int brcmnand_bch_ooblayout_free_sp(struct mtd_info *mtd, int section,
+                                         struct mtd_oob_region *oobregion)
+{
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       struct brcmnand_cfg *cfg = &host->hwcfg;
+       int sas = cfg->spare_area_size << cfg->sector_size_1k;
+
+       if (section > 1 || sas - chip->ecc.bytes < 6 ||
+           (section && sas - chip->ecc.bytes == 6))
+               return -ERANGE;
+
+       if (!section) {
+               oobregion->offset = 0;
+               oobregion->length = 5;
+       } else {
+               oobregion->offset = 6;
+               oobregion->length = sas - chip->ecc.bytes - 6;
+       }
+
+       return 0;
+}
+
+static const struct mtd_ooblayout_ops brcmnand_bch_lp_ooblayout_ops = {
+       .ecc = brcmnand_bch_ooblayout_ecc,
+       .free = brcmnand_bch_ooblayout_free_lp,
+};
+
+static const struct mtd_ooblayout_ops brcmnand_bch_sp_ooblayout_ops = {
+       .ecc = brcmnand_bch_ooblayout_ecc,
+       .free = brcmnand_bch_ooblayout_free_sp,
+};
+
+static int brcmstb_choose_ecc_layout(struct brcmnand_host *host)
+{
+       struct brcmnand_cfg *p = &host->hwcfg;
+       struct mtd_info *mtd = nand_to_mtd(&host->chip);
+       struct nand_ecc_ctrl *ecc = &host->chip.ecc;
+       unsigned int ecc_level = p->ecc_level;
+       int sas = p->spare_area_size << p->sector_size_1k;
+       int sectors = p->page_size / (512 << p->sector_size_1k);
+
+       if (p->sector_size_1k)
+               ecc_level <<= 1;
+
+       if (is_hamming_ecc(host->ctrl, p)) {
+               ecc->bytes = 3 * sectors;
+               mtd_set_ooblayout(mtd, &brcmnand_hamming_ooblayout_ops);
+               return 0;
+       }
+
+       /*
+        * CONTROLLER_VERSION:
+        *   < v5.0: ECC_REQ = ceil(BCH_T * 13/8)
+        *  >= v5.0: ECC_REQ = ceil(BCH_T * 14/8)
+        * But we will just be conservative.
+        */
+       ecc->bytes = DIV_ROUND_UP(ecc_level * 14, 8);
+       if (p->page_size == 512)
+               mtd_set_ooblayout(mtd, &brcmnand_bch_sp_ooblayout_ops);
+       else
+               mtd_set_ooblayout(mtd, &brcmnand_bch_lp_ooblayout_ops);
+
+       if (ecc->bytes >= sas) {
+               dev_err(&host->pdev->dev,
+                       "error: ECC too large for OOB (ECC bytes %d, spare sector %d)\n",
+                       ecc->bytes, sas);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static void brcmnand_wp(struct mtd_info *mtd, int wp)
+{
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       struct brcmnand_controller *ctrl = host->ctrl;
+
+       if ((ctrl->features & BRCMNAND_HAS_WP) && wp_on == 1) {
+               static int old_wp = -1;
+               int ret;
+
+               if (old_wp != wp) {
+                       dev_dbg(ctrl->dev, "WP %s\n", wp ? "on" : "off");
+                       old_wp = wp;
+               }
+
+               /*
+                * make sure ctrl/flash ready before and after
+                * changing state of #WP pin
+                */
+               ret = bcmnand_ctrl_poll_status(ctrl, NAND_CTRL_RDY |
+                                              NAND_STATUS_READY,
+                                              NAND_CTRL_RDY |
+                                              NAND_STATUS_READY, 0);
+               if (ret)
+                       return;
+
+               brcmnand_set_wp(ctrl, wp);
+               nand_status_op(chip, NULL);
+               /* NAND_STATUS_WP 0x00 = protected, 0x80 = not protected */
+               ret = bcmnand_ctrl_poll_status(ctrl,
+                                              NAND_CTRL_RDY |
+                                              NAND_STATUS_READY |
+                                              NAND_STATUS_WP,
+                                              NAND_CTRL_RDY |
+                                              NAND_STATUS_READY |
+                                              (wp ? 0 : NAND_STATUS_WP), 0);
+#ifndef __UBOOT__
+               if (ret)
+                       dev_err_ratelimited(&host->pdev->dev,
+                                           "nand #WP expected %s\n",
+                                           wp ? "on" : "off");
+#else
+               if (ret)
+                       dev_err(&host->pdev->dev,
+                                           "nand #WP expected %s\n",
+                                           wp ? "on" : "off");
+#endif /* __UBOOT__ */
+       }
+}
+
+/* Helper functions for reading and writing OOB registers */
+static inline u8 oob_reg_read(struct brcmnand_controller *ctrl, u32 offs)
+{
+       u16 offset0, offset10, reg_offs;
+
+       offset0 = ctrl->reg_offsets[BRCMNAND_OOB_READ_BASE];
+       offset10 = ctrl->reg_offsets[BRCMNAND_OOB_READ_10_BASE];
+
+       if (offs >= ctrl->max_oob)
+               return 0x77;
+
+       if (offs >= 16 && offset10)
+               reg_offs = offset10 + ((offs - 0x10) & ~0x03);
+       else
+               reg_offs = offset0 + (offs & ~0x03);
+
+       return nand_readreg(ctrl, reg_offs) >> (24 - ((offs & 0x03) << 3));
+}
+
+static inline void oob_reg_write(struct brcmnand_controller *ctrl, u32 offs,
+                                u32 data)
+{
+       u16 offset0, offset10, reg_offs;
+
+       offset0 = ctrl->reg_offsets[BRCMNAND_OOB_WRITE_BASE];
+       offset10 = ctrl->reg_offsets[BRCMNAND_OOB_WRITE_10_BASE];
+
+       if (offs >= ctrl->max_oob)
+               return;
+
+       if (offs >= 16 && offset10)
+               reg_offs = offset10 + ((offs - 0x10) & ~0x03);
+       else
+               reg_offs = offset0 + (offs & ~0x03);
+
+       nand_writereg(ctrl, reg_offs, data);
+}
+
+/*
+ * read_oob_from_regs - read data from OOB registers
+ * @ctrl: NAND controller
+ * @i: sub-page sector index
+ * @oob: buffer to read to
+ * @sas: spare area sector size (i.e., OOB size per FLASH_CACHE)
+ * @sector_1k: 1 for 1KiB sectors, 0 for 512B, other values are illegal
+ */
+static int read_oob_from_regs(struct brcmnand_controller *ctrl, int i, u8 *oob,
+                             int sas, int sector_1k)
+{
+       int tbytes = sas << sector_1k;
+       int j;
+
+       /* Adjust OOB values for 1K sector size */
+       if (sector_1k && (i & 0x01))
+               tbytes = max(0, tbytes - (int)ctrl->max_oob);
+       tbytes = min_t(int, tbytes, ctrl->max_oob);
+
+       for (j = 0; j < tbytes; j++)
+               oob[j] = oob_reg_read(ctrl, j);
+       return tbytes;
+}
+
+/*
+ * write_oob_to_regs - write data to OOB registers
+ * @i: sub-page sector index
+ * @oob: buffer to write from
+ * @sas: spare area sector size (i.e., OOB size per FLASH_CACHE)
+ * @sector_1k: 1 for 1KiB sectors, 0 for 512B, other values are illegal
+ */
+static int write_oob_to_regs(struct brcmnand_controller *ctrl, int i,
+                            const u8 *oob, int sas, int sector_1k)
+{
+       int tbytes = sas << sector_1k;
+       int j;
+
+       /* Adjust OOB values for 1K sector size */
+       if (sector_1k && (i & 0x01))
+               tbytes = max(0, tbytes - (int)ctrl->max_oob);
+       tbytes = min_t(int, tbytes, ctrl->max_oob);
+
+       for (j = 0; j < tbytes; j += 4)
+               oob_reg_write(ctrl, j,
+                               (oob[j + 0] << 24) |
+                               (oob[j + 1] << 16) |
+                               (oob[j + 2] <<  8) |
+                               (oob[j + 3] <<  0));
+       return tbytes;
+}
+
+#ifndef __UBOOT__
+static irqreturn_t brcmnand_ctlrdy_irq(int irq, void *data)
+{
+       struct brcmnand_controller *ctrl = data;
+
+       /* Discard all NAND_CTLRDY interrupts during DMA */
+       if (ctrl->dma_pending)
+               return IRQ_HANDLED;
+
+       complete(&ctrl->done);
+       return IRQ_HANDLED;
+}
+
+/* Handle SoC-specific interrupt hardware */
+static irqreturn_t brcmnand_irq(int irq, void *data)
+{
+       struct brcmnand_controller *ctrl = data;
+
+       if (ctrl->soc->ctlrdy_ack(ctrl->soc))
+               return brcmnand_ctlrdy_irq(irq, data);
+
+       return IRQ_NONE;
+}
+
+static irqreturn_t brcmnand_dma_irq(int irq, void *data)
+{
+       struct brcmnand_controller *ctrl = data;
+
+       complete(&ctrl->dma_done);
+
+       return IRQ_HANDLED;
+}
+#endif /* __UBOOT__ */
+
+static void brcmnand_send_cmd(struct brcmnand_host *host, int cmd)
+{
+       struct brcmnand_controller *ctrl = host->ctrl;
+       int ret;
+
+       dev_dbg(ctrl->dev, "send native cmd %d addr_lo 0x%x\n", cmd,
+               brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS));
+       BUG_ON(ctrl->cmd_pending != 0);
+       ctrl->cmd_pending = cmd;
+
+       ret = bcmnand_ctrl_poll_status(ctrl, NAND_CTRL_RDY, NAND_CTRL_RDY, 0);
+       WARN_ON(ret);
+
+       mb(); /* flush previous writes */
+       brcmnand_write_reg(ctrl, BRCMNAND_CMD_START,
+                          cmd << brcmnand_cmd_shift(ctrl));
+}
+
+/***********************************************************************
+ * NAND MTD API: read/program/erase
+ ***********************************************************************/
+
+static void brcmnand_cmd_ctrl(struct mtd_info *mtd, int dat,
+       unsigned int ctrl)
+{
+       /* intentionally left blank */
+}
+
+static int brcmnand_waitfunc(struct mtd_info *mtd, struct nand_chip *this)
+{
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       struct brcmnand_controller *ctrl = host->ctrl;
+
+#ifndef __UBOOT__
+       unsigned long timeo = msecs_to_jiffies(100);
+
+       dev_dbg(ctrl->dev, "wait on native cmd %d\n", ctrl->cmd_pending);
+       if (ctrl->cmd_pending &&
+                       wait_for_completion_timeout(&ctrl->done, timeo) <= 0) {
+               u32 cmd = brcmnand_read_reg(ctrl, BRCMNAND_CMD_START)
+                                       >> brcmnand_cmd_shift(ctrl);
+
+               dev_err_ratelimited(ctrl->dev,
+                       "timeout waiting for command %#02x\n", cmd);
+               dev_err_ratelimited(ctrl->dev, "intfc status %08x\n",
+                       brcmnand_read_reg(ctrl, BRCMNAND_INTFC_STATUS));
+       }
+#else
+       unsigned long timeo = 100; /* 100 msec */
+       int ret;
+
+       dev_dbg(ctrl->dev, "wait on native cmd %d\n", ctrl->cmd_pending);
+
+       ret = bcmnand_ctrl_poll_status(ctrl, NAND_CTRL_RDY, NAND_CTRL_RDY, timeo);
+       WARN_ON(ret);
+#endif /* __UBOOT__ */
+
+       ctrl->cmd_pending = 0;
+       return brcmnand_read_reg(ctrl, BRCMNAND_INTFC_STATUS) &
+                                INTFC_FLASH_STATUS;
+}
+
+enum {
+       LLOP_RE                         = BIT(16),
+       LLOP_WE                         = BIT(17),
+       LLOP_ALE                        = BIT(18),
+       LLOP_CLE                        = BIT(19),
+       LLOP_RETURN_IDLE                = BIT(31),
+
+       LLOP_DATA_MASK                  = GENMASK(15, 0),
+};
+
+static int brcmnand_low_level_op(struct brcmnand_host *host,
+                                enum brcmnand_llop_type type, u32 data,
+                                bool last_op)
+{
+       struct mtd_info *mtd = nand_to_mtd(&host->chip);
+       struct nand_chip *chip = &host->chip;
+       struct brcmnand_controller *ctrl = host->ctrl;
+       u32 tmp;
+
+       tmp = data & LLOP_DATA_MASK;
+       switch (type) {
+       case LL_OP_CMD:
+               tmp |= LLOP_WE | LLOP_CLE;
+               break;
+       case LL_OP_ADDR:
+               /* WE | ALE */
+               tmp |= LLOP_WE | LLOP_ALE;
+               break;
+       case LL_OP_WR:
+               /* WE */
+               tmp |= LLOP_WE;
+               break;
+       case LL_OP_RD:
+               /* RE */
+               tmp |= LLOP_RE;
+               break;
+       }
+       if (last_op)
+               /* RETURN_IDLE */
+               tmp |= LLOP_RETURN_IDLE;
+
+       dev_dbg(ctrl->dev, "ll_op cmd %#x\n", tmp);
+
+       brcmnand_write_reg(ctrl, BRCMNAND_LL_OP, tmp);
+       (void)brcmnand_read_reg(ctrl, BRCMNAND_LL_OP);
+
+       brcmnand_send_cmd(host, CMD_LOW_LEVEL_OP);
+       return brcmnand_waitfunc(mtd, chip);
+}
+
+static void brcmnand_cmdfunc(struct mtd_info *mtd, unsigned command,
+                            int column, int page_addr)
+{
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       struct brcmnand_controller *ctrl = host->ctrl;
+       u64 addr = (u64)page_addr << chip->page_shift;
+       int native_cmd = 0;
+
+       if (command == NAND_CMD_READID || command == NAND_CMD_PARAM ||
+                       command == NAND_CMD_RNDOUT)
+               addr = (u64)column;
+       /* Avoid propagating a negative, don't-care address */
+       else if (page_addr < 0)
+               addr = 0;
+
+       dev_dbg(ctrl->dev, "cmd 0x%x addr 0x%llx\n", command,
+               (unsigned long long)addr);
+
+       host->last_cmd = command;
+       host->last_byte = 0;
+       host->last_addr = addr;
+
+       switch (command) {
+       case NAND_CMD_RESET:
+               native_cmd = CMD_FLASH_RESET;
+               break;
+       case NAND_CMD_STATUS:
+               native_cmd = CMD_STATUS_READ;
+               break;
+       case NAND_CMD_READID:
+               native_cmd = CMD_DEVICE_ID_READ;
+               break;
+       case NAND_CMD_READOOB:
+               native_cmd = CMD_SPARE_AREA_READ;
+               break;
+       case NAND_CMD_ERASE1:
+               native_cmd = CMD_BLOCK_ERASE;
+               brcmnand_wp(mtd, 0);
+               break;
+       case NAND_CMD_PARAM:
+               native_cmd = CMD_PARAMETER_READ;
+               break;
+       case NAND_CMD_SET_FEATURES:
+       case NAND_CMD_GET_FEATURES:
+               brcmnand_low_level_op(host, LL_OP_CMD, command, false);
+               brcmnand_low_level_op(host, LL_OP_ADDR, column, false);
+               break;
+       case NAND_CMD_RNDOUT:
+               native_cmd = CMD_PARAMETER_CHANGE_COL;
+               addr &= ~((u64)(FC_BYTES - 1));
+               /*
+                * HW quirk: PARAMETER_CHANGE_COL requires SECTOR_SIZE_1K=0
+                * NB: hwcfg.sector_size_1k may not be initialized yet
+                */
+               if (brcmnand_get_sector_size_1k(host)) {
+                       host->hwcfg.sector_size_1k =
+                               brcmnand_get_sector_size_1k(host);
+                       brcmnand_set_sector_size_1k(host, 0);
+               }
+               break;
+       }
+
+       if (!native_cmd)
+               return;
+
+       brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
+               (host->cs << 16) | ((addr >> 32) & 0xffff));
+       (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
+       brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, lower_32_bits(addr));
+       (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
+
+       brcmnand_send_cmd(host, native_cmd);
+       brcmnand_waitfunc(mtd, chip);
+
+       if (native_cmd == CMD_PARAMETER_READ ||
+                       native_cmd == CMD_PARAMETER_CHANGE_COL) {
+               /* Copy flash cache word-wise */
+               u32 *flash_cache = (u32 *)ctrl->flash_cache;
+               int i;
+
+               brcmnand_soc_data_bus_prepare(ctrl->soc, true);
+
+               /*
+                * Must cache the FLASH_CACHE now, since changes in
+                * SECTOR_SIZE_1K may invalidate it
+                */
+               for (i = 0; i < FC_WORDS; i++) {
+                       u32 fc;
+
+                       fc = brcmnand_read_fc(ctrl, i);
+
+                       /*
+                        * Flash cache is big endian for parameter pages, at
+                        * least on STB SoCs
+                        */
+                       if (ctrl->parameter_page_big_endian)
+                               flash_cache[i] = be32_to_cpu(fc);
+                       else
+                               flash_cache[i] = le32_to_cpu(fc);
+               }
+
+               brcmnand_soc_data_bus_unprepare(ctrl->soc, true);
+
+               /* Cleanup from HW quirk: restore SECTOR_SIZE_1K */
+               if (host->hwcfg.sector_size_1k)
+                       brcmnand_set_sector_size_1k(host,
+                                                   host->hwcfg.sector_size_1k);
+       }
+
+       /* Re-enable protection is necessary only after erase */
+       if (command == NAND_CMD_ERASE1)
+               brcmnand_wp(mtd, 1);
+}
+
+static uint8_t brcmnand_read_byte(struct mtd_info *mtd)
+{
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       struct brcmnand_controller *ctrl = host->ctrl;
+       uint8_t ret = 0;
+       int addr, offs;
+
+       switch (host->last_cmd) {
+       case NAND_CMD_READID:
+               if (host->last_byte < 4)
+                       ret = brcmnand_read_reg(ctrl, BRCMNAND_ID) >>
+                               (24 - (host->last_byte << 3));
+               else if (host->last_byte < 8)
+                       ret = brcmnand_read_reg(ctrl, BRCMNAND_ID_EXT) >>
+                               (56 - (host->last_byte << 3));
+               break;
+
+       case NAND_CMD_READOOB:
+               ret = oob_reg_read(ctrl, host->last_byte);
+               break;
+
+       case NAND_CMD_STATUS:
+               ret = brcmnand_read_reg(ctrl, BRCMNAND_INTFC_STATUS) &
+                                       INTFC_FLASH_STATUS;
+               if (wp_on) /* hide WP status */
+                       ret |= NAND_STATUS_WP;
+               break;
+
+       case NAND_CMD_PARAM:
+       case NAND_CMD_RNDOUT:
+               addr = host->last_addr + host->last_byte;
+               offs = addr & (FC_BYTES - 1);
+
+               /* At FC_BYTES boundary, switch to next column */
+               if (host->last_byte > 0 && offs == 0)
+                       nand_change_read_column_op(chip, addr, NULL, 0, false);
+
+               ret = ctrl->flash_cache[offs];
+               break;
+       case NAND_CMD_GET_FEATURES:
+               if (host->last_byte >= ONFI_SUBFEATURE_PARAM_LEN) {
+                       ret = 0;
+               } else {
+                       bool last = host->last_byte ==
+                               ONFI_SUBFEATURE_PARAM_LEN - 1;
+                       brcmnand_low_level_op(host, LL_OP_RD, 0, last);
+                       ret = brcmnand_read_reg(ctrl, BRCMNAND_LL_RDATA) & 0xff;
+               }
+       }
+
+       dev_dbg(ctrl->dev, "read byte = 0x%02x\n", ret);
+       host->last_byte++;
+
+       return ret;
+}
+
+static void brcmnand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
+{
+       int i;
+
+       for (i = 0; i < len; i++, buf++)
+               *buf = brcmnand_read_byte(mtd);
+}
+
+static void brcmnand_write_buf(struct mtd_info *mtd, const uint8_t *buf,
+                                  int len)
+{
+       int i;
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+
+       switch (host->last_cmd) {
+       case NAND_CMD_SET_FEATURES:
+               for (i = 0; i < len; i++)
+                       brcmnand_low_level_op(host, LL_OP_WR, buf[i],
+                                                 (i + 1) == len);
+               break;
+       default:
+               BUG();
+               break;
+       }
+}
+
+/**
+ * Construct a FLASH_DMA descriptor as part of a linked list. You must know the
+ * following ahead of time:
+ *  - Is this descriptor the beginning or end of a linked list?
+ *  - What is the (DMA) address of the next descriptor in the linked list?
+ */
+#ifndef __UBOOT__
+static int brcmnand_fill_dma_desc(struct brcmnand_host *host,
+                                 struct brcm_nand_dma_desc *desc, u64 addr,
+                                 dma_addr_t buf, u32 len, u8 dma_cmd,
+                                 bool begin, bool end,
+                                 dma_addr_t next_desc)
+{
+       memset(desc, 0, sizeof(*desc));
+       /* Descriptors are written in native byte order (wordwise) */
+       desc->next_desc = lower_32_bits(next_desc);
+       desc->next_desc_ext = upper_32_bits(next_desc);
+       desc->cmd_irq = (dma_cmd << 24) |
+               (end ? (0x03 << 8) : 0) | /* IRQ | STOP */
+               (!!begin) | ((!!end) << 1); /* head, tail */
+#ifdef CONFIG_CPU_BIG_ENDIAN
+       desc->cmd_irq |= 0x01 << 12;
+#endif
+       desc->dram_addr = lower_32_bits(buf);
+       desc->dram_addr_ext = upper_32_bits(buf);
+       desc->tfr_len = len;
+       desc->total_len = len;
+       desc->flash_addr = lower_32_bits(addr);
+       desc->flash_addr_ext = upper_32_bits(addr);
+       desc->cs = host->cs;
+       desc->status_valid = 0x01;
+       return 0;
+}
+
+/**
+ * Kick the FLASH_DMA engine, with a given DMA descriptor
+ */
+static void brcmnand_dma_run(struct brcmnand_host *host, dma_addr_t desc)
+{
+       struct brcmnand_controller *ctrl = host->ctrl;
+       unsigned long timeo = msecs_to_jiffies(100);
+
+       flash_dma_writel(ctrl, FLASH_DMA_FIRST_DESC, lower_32_bits(desc));
+       (void)flash_dma_readl(ctrl, FLASH_DMA_FIRST_DESC);
+       flash_dma_writel(ctrl, FLASH_DMA_FIRST_DESC_EXT, upper_32_bits(desc));
+       (void)flash_dma_readl(ctrl, FLASH_DMA_FIRST_DESC_EXT);
+
+       /* Start FLASH_DMA engine */
+       ctrl->dma_pending = true;
+       mb(); /* flush previous writes */
+       flash_dma_writel(ctrl, FLASH_DMA_CTRL, 0x03); /* wake | run */
+
+       if (wait_for_completion_timeout(&ctrl->dma_done, timeo) <= 0) {
+               dev_err(ctrl->dev,
+                               "timeout waiting for DMA; status %#x, error status %#x\n",
+                               flash_dma_readl(ctrl, FLASH_DMA_STATUS),
+                               flash_dma_readl(ctrl, FLASH_DMA_ERROR_STATUS));
+       }
+       ctrl->dma_pending = false;
+       flash_dma_writel(ctrl, FLASH_DMA_CTRL, 0); /* force stop */
+}
+
+static int brcmnand_dma_trans(struct brcmnand_host *host, u64 addr, u32 *buf,
+                             u32 len, u8 dma_cmd)
+{
+       struct brcmnand_controller *ctrl = host->ctrl;
+       dma_addr_t buf_pa;
+       int dir = dma_cmd == CMD_PAGE_READ ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
+
+       buf_pa = dma_map_single(ctrl->dev, buf, len, dir);
+       if (dma_mapping_error(ctrl->dev, buf_pa)) {
+               dev_err(ctrl->dev, "unable to map buffer for DMA\n");
+               return -ENOMEM;
+       }
+
+       brcmnand_fill_dma_desc(host, ctrl->dma_desc, addr, buf_pa, len,
+                                  dma_cmd, true, true, 0);
+
+       brcmnand_dma_run(host, ctrl->dma_pa);
+
+       dma_unmap_single(ctrl->dev, buf_pa, len, dir);
+
+       if (ctrl->dma_desc->status_valid & FLASH_DMA_ECC_ERROR)
+               return -EBADMSG;
+       else if (ctrl->dma_desc->status_valid & FLASH_DMA_CORR_ERROR)
+               return -EUCLEAN;
+
+       return 0;
+}
+#endif /* __UBOOT__ */
+
+/*
+ * Assumes proper CS is already set
+ */
+static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip,
+                               u64 addr, unsigned int trans, u32 *buf,
+                               u8 *oob, u64 *err_addr)
+{
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       struct brcmnand_controller *ctrl = host->ctrl;
+       int i, j, ret = 0;
+
+       /* Clear error addresses */
+       brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0);
+       brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0);
+       brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0);
+       brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0);
+
+       brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
+                       (host->cs << 16) | ((addr >> 32) & 0xffff));
+       (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
+
+       for (i = 0; i < trans; i++, addr += FC_BYTES) {
+               brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS,
+                                  lower_32_bits(addr));
+               (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
+               /* SPARE_AREA_READ does not use ECC, so just use PAGE_READ */
+               brcmnand_send_cmd(host, CMD_PAGE_READ);
+               brcmnand_waitfunc(mtd, chip);
+
+               if (likely(buf)) {
+                       brcmnand_soc_data_bus_prepare(ctrl->soc, false);
+
+                       for (j = 0; j < FC_WORDS; j++, buf++)
+                               *buf = brcmnand_read_fc(ctrl, j);
+
+                       brcmnand_soc_data_bus_unprepare(ctrl->soc, false);
+               }
+
+               if (oob)
+                       oob += read_oob_from_regs(ctrl, i, oob,
+                                       mtd->oobsize / trans,
+                                       host->hwcfg.sector_size_1k);
+
+               if (!ret) {
+                       *err_addr = brcmnand_read_reg(ctrl,
+                                       BRCMNAND_UNCORR_ADDR) |
+                               ((u64)(brcmnand_read_reg(ctrl,
+                                               BRCMNAND_UNCORR_EXT_ADDR)
+                                       & 0xffff) << 32);
+                       if (*err_addr)
+                               ret = -EBADMSG;
+               }
+
+               if (!ret) {
+                       *err_addr = brcmnand_read_reg(ctrl,
+                                       BRCMNAND_CORR_ADDR) |
+                               ((u64)(brcmnand_read_reg(ctrl,
+                                               BRCMNAND_CORR_EXT_ADDR)
+                                       & 0xffff) << 32);
+                       if (*err_addr)
+                               ret = -EUCLEAN;
+               }
+       }
+
+       return ret;
+}
+
+/*
+ * Check a page to see if it is erased (w/ bitflips) after an uncorrectable ECC
+ * error
+ *
+ * Because the HW ECC signals an ECC error if an erase paged has even a single
+ * bitflip, we must check each ECC error to see if it is actually an erased
+ * page with bitflips, not a truly corrupted page.
+ *
+ * On a real error, return a negative error code (-EBADMSG for ECC error), and
+ * buf will contain raw data.
+ * Otherwise, buf gets filled with 0xffs and return the maximum number of
+ * bitflips-per-ECC-sector to the caller.
+ *
+ */
+static int brcmstb_nand_verify_erased_page(struct mtd_info *mtd,
+                 struct nand_chip *chip, void *buf, u64 addr)
+{
+       int i, sas;
+       void *oob = chip->oob_poi;
+       int bitflips = 0;
+       int page = addr >> chip->page_shift;
+       int ret;
+
+       if (!buf) {
+#ifndef __UBOOT__
+               buf = chip->data_buf;
+#else
+               buf = chip->buffers->databuf;
+#endif
+               /* Invalidate page cache */
+               chip->pagebuf = -1;
+       }
+
+       sas = mtd->oobsize / chip->ecc.steps;
+
+       /* read without ecc for verification */
+       ret = chip->ecc.read_page_raw(mtd, chip, buf, true, page);
+       if (ret)
+               return ret;
+
+       for (i = 0; i < chip->ecc.steps; i++, oob += sas) {
+               ret = nand_check_erased_ecc_chunk(buf, chip->ecc.size,
+                                                 oob, sas, NULL, 0,
+                                                 chip->ecc.strength);
+               if (ret < 0)
+                       return ret;
+
+               bitflips = max(bitflips, ret);
+       }
+
+       return bitflips;
+}
+
+static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip,
+                        u64 addr, unsigned int trans, u32 *buf, u8 *oob)
+{
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       struct brcmnand_controller *ctrl = host->ctrl;
+       u64 err_addr = 0;
+       int err;
+       bool retry = true;
+
+       dev_dbg(ctrl->dev, "read %llx -> %p\n", (unsigned long long)addr, buf);
+
+try_dmaread:
+       brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_COUNT, 0);
+
+#ifndef __UBOOT__
+       if (has_flash_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) {
+               err = brcmnand_dma_trans(host, addr, buf, trans * FC_BYTES,
+                                            CMD_PAGE_READ);
+               if (err) {
+                       if (mtd_is_bitflip_or_eccerr(err))
+                               err_addr = addr;
+                       else
+                               return -EIO;
+               }
+       } else {
+               if (oob)
+                       memset(oob, 0x99, mtd->oobsize);
+
+               err = brcmnand_read_by_pio(mtd, chip, addr, trans, buf,
+                                              oob, &err_addr);
+       }
+#else
+       if (oob)
+               memset(oob, 0x99, mtd->oobsize);
+
+       err = brcmnand_read_by_pio(mtd, chip, addr, trans, buf,
+                                                          oob, &err_addr);
+#endif /* __UBOOT__ */
+
+       if (mtd_is_eccerr(err)) {
+               /*
+                * On controller version and 7.0, 7.1 , DMA read after a
+                * prior PIO read that reported uncorrectable error,
+                * the DMA engine captures this error following DMA read
+                * cleared only on subsequent DMA read, so just retry once
+                * to clear a possible false error reported for current DMA
+                * read
+                */
+               if ((ctrl->nand_version == 0x0700) ||
+                   (ctrl->nand_version == 0x0701)) {
+                       if (retry) {
+                               retry = false;
+                               goto try_dmaread;
+                       }
+               }
+
+               /*
+                * Controller version 7.2 has hw encoder to detect erased page
+                * bitflips, apply sw verification for older controllers only
+                */
+               if (ctrl->nand_version < 0x0702) {
+                       err = brcmstb_nand_verify_erased_page(mtd, chip, buf,
+                                                             addr);
+                       /* erased page bitflips corrected */
+                       if (err >= 0)
+                               return err;
+               }
+
+               dev_dbg(ctrl->dev, "uncorrectable error at 0x%llx\n",
+                       (unsigned long long)err_addr);
+               mtd->ecc_stats.failed++;
+               /* NAND layer expects zero on ECC errors */
+               return 0;
+       }
+
+       if (mtd_is_bitflip(err)) {
+               unsigned int corrected = brcmnand_count_corrected(ctrl);
+
+               dev_dbg(ctrl->dev, "corrected error at 0x%llx\n",
+                       (unsigned long long)err_addr);
+               mtd->ecc_stats.corrected += corrected;
+               /* Always exceed the software-imposed threshold */
+               return max(mtd->bitflip_threshold, corrected);
+       }
+
+       return 0;
+}
+
+static int brcmnand_read_page(struct mtd_info *mtd, struct nand_chip *chip,
+                             uint8_t *buf, int oob_required, int page)
+{
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       u8 *oob = oob_required ? (u8 *)chip->oob_poi : NULL;
+
+       nand_read_page_op(chip, page, 0, NULL, 0);
+
+       return brcmnand_read(mtd, chip, host->last_addr,
+                       mtd->writesize >> FC_SHIFT, (u32 *)buf, oob);
+}
+
+static int brcmnand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
+                                 uint8_t *buf, int oob_required, int page)
+{
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       u8 *oob = oob_required ? (u8 *)chip->oob_poi : NULL;
+       int ret;
+
+       nand_read_page_op(chip, page, 0, NULL, 0);
+
+       brcmnand_set_ecc_enabled(host, 0);
+       ret = brcmnand_read(mtd, chip, host->last_addr,
+                       mtd->writesize >> FC_SHIFT, (u32 *)buf, oob);
+       brcmnand_set_ecc_enabled(host, 1);
+       return ret;
+}
+
+static int brcmnand_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
+                            int page)
+{
+       return brcmnand_read(mtd, chip, (u64)page << chip->page_shift,
+                       mtd->writesize >> FC_SHIFT,
+                       NULL, (u8 *)chip->oob_poi);
+}
+
+static int brcmnand_read_oob_raw(struct mtd_info *mtd, struct nand_chip *chip,
+                                int page)
+{
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+
+       brcmnand_set_ecc_enabled(host, 0);
+       brcmnand_read(mtd, chip, (u64)page << chip->page_shift,
+               mtd->writesize >> FC_SHIFT,
+               NULL, (u8 *)chip->oob_poi);
+       brcmnand_set_ecc_enabled(host, 1);
+       return 0;
+}
+
+static int brcmnand_write(struct mtd_info *mtd, struct nand_chip *chip,
+                         u64 addr, const u32 *buf, u8 *oob)
+{
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       struct brcmnand_controller *ctrl = host->ctrl;
+       unsigned int i, j, trans = mtd->writesize >> FC_SHIFT;
+       int status, ret = 0;
+
+       dev_dbg(ctrl->dev, "write %llx <- %p\n", (unsigned long long)addr, buf);
+
+       if (unlikely((unsigned long)buf & 0x03)) {
+               dev_warn(ctrl->dev, "unaligned buffer: %p\n", buf);
+               buf = (u32 *)((unsigned long)buf & ~0x03);
+       }
+
+       brcmnand_wp(mtd, 0);
+
+       for (i = 0; i < ctrl->max_oob; i += 4)
+               oob_reg_write(ctrl, i, 0xffffffff);
+
+#ifndef __UBOOT__
+       if (has_flash_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) {
+               if (brcmnand_dma_trans(host, addr, (u32 *)buf,
+                                       mtd->writesize, CMD_PROGRAM_PAGE))
+                       ret = -EIO;
+               goto out;
+       }
+#endif /* __UBOOT__ */
+
+       brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
+                       (host->cs << 16) | ((addr >> 32) & 0xffff));
+       (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
+
+       for (i = 0; i < trans; i++, addr += FC_BYTES) {
+               /* full address MUST be set before populating FC */
+               brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS,
+                                  lower_32_bits(addr));
+               (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
+
+               if (buf) {
+                       brcmnand_soc_data_bus_prepare(ctrl->soc, false);
+
+                       for (j = 0; j < FC_WORDS; j++, buf++)
+                               brcmnand_write_fc(ctrl, j, *buf);
+
+                       brcmnand_soc_data_bus_unprepare(ctrl->soc, false);
+               } else if (oob) {
+                       for (j = 0; j < FC_WORDS; j++)
+                               brcmnand_write_fc(ctrl, j, 0xffffffff);
+               }
+
+               if (oob) {
+                       oob += write_oob_to_regs(ctrl, i, oob,
+                                       mtd->oobsize / trans,
+                                       host->hwcfg.sector_size_1k);
+               }
+
+               /* we cannot use SPARE_AREA_PROGRAM when PARTIAL_PAGE_EN=0 */
+               brcmnand_send_cmd(host, CMD_PROGRAM_PAGE);
+               status = brcmnand_waitfunc(mtd, chip);
+
+               if (status & NAND_STATUS_FAIL) {
+                       dev_info(ctrl->dev, "program failed at %llx\n",
+                               (unsigned long long)addr);
+                       ret = -EIO;
+                       goto out;
+               }
+       }
+out:
+       brcmnand_wp(mtd, 1);
+       return ret;
+}
+
+static int brcmnand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
+                              const uint8_t *buf, int oob_required, int page)
+{
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       void *oob = oob_required ? chip->oob_poi : NULL;
+
+       nand_prog_page_begin_op(chip, page, 0, NULL, 0);
+       brcmnand_write(mtd, chip, host->last_addr, (const u32 *)buf, oob);
+
+       return nand_prog_page_end_op(chip);
+}
+
+static int brcmnand_write_page_raw(struct mtd_info *mtd,
+                                  struct nand_chip *chip, const uint8_t *buf,
+                                  int oob_required, int page)
+{
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       void *oob = oob_required ? chip->oob_poi : NULL;
+
+       nand_prog_page_begin_op(chip, page, 0, NULL, 0);
+       brcmnand_set_ecc_enabled(host, 0);
+       brcmnand_write(mtd, chip, host->last_addr, (const u32 *)buf, oob);
+       brcmnand_set_ecc_enabled(host, 1);
+
+       return nand_prog_page_end_op(chip);
+}
+
+static int brcmnand_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
+                                 int page)
+{
+       return brcmnand_write(mtd, chip, (u64)page << chip->page_shift,
+                                 NULL, chip->oob_poi);
+}
+
+static int brcmnand_write_oob_raw(struct mtd_info *mtd, struct nand_chip *chip,
+                                 int page)
+{
+       struct brcmnand_host *host = nand_get_controller_data(chip);
+       int ret;
+
+       brcmnand_set_ecc_enabled(host, 0);
+       ret = brcmnand_write(mtd, chip, (u64)page << chip->page_shift, NULL,
+                                (u8 *)chip->oob_poi);
+       brcmnand_set_ecc_enabled(host, 1);
+
+       return ret;
+}
+
+/***********************************************************************
+ * Per-CS setup (1 NAND device)
+ ***********************************************************************/
+
+static int brcmnand_set_cfg(struct brcmnand_host *host,
+                           struct brcmnand_cfg *cfg)
+{
+       struct brcmnand_controller *ctrl = host->ctrl;
+       struct nand_chip *chip = &host->chip;
+       u16 cfg_offs = brcmnand_cs_offset(ctrl, host->cs, BRCMNAND_CS_CFG);
+       u16 cfg_ext_offs = brcmnand_cs_offset(ctrl, host->cs,
+                       BRCMNAND_CS_CFG_EXT);
+       u16 acc_control_offs = brcmnand_cs_offset(ctrl, host->cs,
+                       BRCMNAND_CS_ACC_CONTROL);
+       u8 block_size = 0, page_size = 0, device_size = 0;
+       u32 tmp;
+
+       if (ctrl->block_sizes) {
+               int i, found;
+
+               for (i = 0, found = 0; ctrl->block_sizes[i]; i++)
+                       if (ctrl->block_sizes[i] * 1024 == cfg->block_size) {
+                               block_size = i;
+                               found = 1;
+                       }
+               if (!found) {
+                       dev_warn(ctrl->dev, "invalid block size %u\n",
+                                       cfg->block_size);
+                       return -EINVAL;
+               }
+       } else {
+               block_size = ffs(cfg->block_size) - ffs(BRCMNAND_MIN_BLOCKSIZE);
+       }
+
+       if (cfg->block_size < BRCMNAND_MIN_BLOCKSIZE || (ctrl->max_block_size &&
+                               cfg->block_size > ctrl->max_block_size)) {
+               dev_warn(ctrl->dev, "invalid block size %u\n",
+                               cfg->block_size);
+               block_size = 0;
+       }
+
+       if (ctrl->page_sizes) {
+               int i, found;
+
+               for (i = 0, found = 0; ctrl->page_sizes[i]; i++)
+                       if (ctrl->page_sizes[i] == cfg->page_size) {
+                               page_size = i;
+                               found = 1;
+                       }
+               if (!found) {
+                       dev_warn(ctrl->dev, "invalid page size %u\n",
+                                       cfg->page_size);
+                       return -EINVAL;
+               }
+       } else {
+               page_size = ffs(cfg->page_size) - ffs(BRCMNAND_MIN_PAGESIZE);
+       }
+
+       if (cfg->page_size < BRCMNAND_MIN_PAGESIZE || (ctrl->max_page_size &&
+                               cfg->page_size > ctrl->max_page_size)) {
+               dev_warn(ctrl->dev, "invalid page size %u\n", cfg->page_size);
+               return -EINVAL;
+       }
+
+       if (fls64(cfg->device_size) < fls64(BRCMNAND_MIN_DEVSIZE)) {
+               dev_warn(ctrl->dev, "invalid device size 0x%llx\n",
+                       (unsigned long long)cfg->device_size);
+               return -EINVAL;
+       }
+       device_size = fls64(cfg->device_size) - fls64(BRCMNAND_MIN_DEVSIZE);
+
+       tmp = (cfg->blk_adr_bytes << CFG_BLK_ADR_BYTES_SHIFT) |
+               (cfg->col_adr_bytes << CFG_COL_ADR_BYTES_SHIFT) |
+               (cfg->ful_adr_bytes << CFG_FUL_ADR_BYTES_SHIFT) |
+               (!!(cfg->device_width == 16) << CFG_BUS_WIDTH_SHIFT) |
+               (device_size << CFG_DEVICE_SIZE_SHIFT);
+       if (cfg_offs == cfg_ext_offs) {
+               tmp |= (page_size << CFG_PAGE_SIZE_SHIFT) |
+                      (block_size << CFG_BLK_SIZE_SHIFT);
+               nand_writereg(ctrl, cfg_offs, tmp);
+       } else {
+               nand_writereg(ctrl, cfg_offs, tmp);
+               tmp = (page_size << CFG_EXT_PAGE_SIZE_SHIFT) |
+                     (block_size << CFG_EXT_BLK_SIZE_SHIFT);
+               nand_writereg(ctrl, cfg_ext_offs, tmp);
+       }
+
+       tmp = nand_readreg(ctrl, acc_control_offs);
+       tmp &= ~brcmnand_ecc_level_mask(ctrl);
+       tmp |= cfg->ecc_level << NAND_ACC_CONTROL_ECC_SHIFT;
+       tmp &= ~brcmnand_spare_area_mask(ctrl);
+       tmp |= cfg->spare_area_size;
+       nand_writereg(ctrl, acc_control_offs, tmp);
+
+       brcmnand_set_sector_size_1k(host, cfg->sector_size_1k);
+
+       /* threshold = ceil(BCH-level * 0.75) */
+       brcmnand_wr_corr_thresh(host, DIV_ROUND_UP(chip->ecc.strength * 3, 4));
+
+       return 0;
+}
+
+static void brcmnand_print_cfg(struct brcmnand_host *host,
+                              char *buf, struct brcmnand_cfg *cfg)
+{
+       buf += sprintf(buf,
+               "%lluMiB total, %uKiB blocks, %u%s pages, %uB OOB, %u-bit",
+               (unsigned long long)cfg->device_size >> 20,
+               cfg->block_size >> 10,
+               cfg->page_size >= 1024 ? cfg->page_size >> 10 : cfg->page_size,
+               cfg->page_size >= 1024 ? "KiB" : "B",
+               cfg->spare_area_size, cfg->device_width);
+
+       /* Account for Hamming ECC and for BCH 512B vs 1KiB sectors */
+       if (is_hamming_ecc(host->ctrl, cfg))
+               sprintf(buf, ", Hamming ECC");
+       else if (cfg->sector_size_1k)
+               sprintf(buf, ", BCH-%u (1KiB sector)", cfg->ecc_level << 1);
+       else
+               sprintf(buf, ", BCH-%u", cfg->ecc_level);
+}
+
+/*
+ * Minimum number of bytes to address a page. Calculated as:
+ *     roundup(log2(size / page-size) / 8)
+ *
+ * NB: the following does not "round up" for non-power-of-2 'size'; but this is
+ *     OK because many other things will break if 'size' is irregular...
+ */
+static inline int get_blk_adr_bytes(u64 size, u32 writesize)
+{
+       return ALIGN(ilog2(size) - ilog2(writesize), 8) >> 3;
+}
+
+static int brcmnand_setup_dev(struct brcmnand_host *host)
+{
+       struct mtd_info *mtd = nand_to_mtd(&host->chip);
+       struct nand_chip *chip = &host->chip;
+       struct brcmnand_controller *ctrl = host->ctrl;
+       struct brcmnand_cfg *cfg = &host->hwcfg;
+       char msg[128];
+       u32 offs, tmp, oob_sector;
+       int ret;
+
+       memset(cfg, 0, sizeof(*cfg));
+
+#ifndef __UBOOT__
+       ret = of_property_read_u32(nand_get_flash_node(chip),
+                                  "brcm,nand-oob-sector-size",
+                                  &oob_sector);
+#else
+       ret = ofnode_read_u32(nand_get_flash_node(chip),
+                             "brcm,nand-oob-sector-size",
+                             &oob_sector);
+#endif /* __UBOOT__ */
+       if (ret) {
+               /* Use detected size */
+               cfg->spare_area_size = mtd->oobsize /
+                                       (mtd->writesize >> FC_SHIFT);
+       } else {
+               cfg->spare_area_size = oob_sector;
+       }
+       if (cfg->spare_area_size > ctrl->max_oob)
+               cfg->spare_area_size = ctrl->max_oob;
+       /*
+        * Set oobsize to be consistent with controller's spare_area_size, as
+        * the rest is inaccessible.
+        */
+       mtd->oobsize = cfg->spare_area_size * (mtd->writesize >> FC_SHIFT);
+
+       cfg->device_size = mtd->size;
+       cfg->block_size = mtd->erasesize;
+       cfg->page_size = mtd->writesize;
+       cfg->device_width = (chip->options & NAND_BUSWIDTH_16) ? 16 : 8;
+       cfg->col_adr_bytes = 2;
+       cfg->blk_adr_bytes = get_blk_adr_bytes(mtd->size, mtd->writesize);
+
+       if (chip->ecc.mode != NAND_ECC_HW) {
+               dev_err(ctrl->dev, "only HW ECC supported; selected: %d\n",
+                       chip->ecc.mode);
+               return -EINVAL;
+       }
+
+       if (chip->ecc.algo == NAND_ECC_UNKNOWN) {
+               if (chip->ecc.strength == 1 && chip->ecc.size == 512)
+                       /* Default to Hamming for 1-bit ECC, if unspecified */
+                       chip->ecc.algo = NAND_ECC_HAMMING;
+               else
+                       /* Otherwise, BCH */
+                       chip->ecc.algo = NAND_ECC_BCH;
+       }
+
+       if (chip->ecc.algo == NAND_ECC_HAMMING && (chip->ecc.strength != 1 ||
+                                                  chip->ecc.size != 512)) {
+               dev_err(ctrl->dev, "invalid Hamming params: %d bits per %d bytes\n",
+                       chip->ecc.strength, chip->ecc.size);
+               return -EINVAL;
+       }
+
+       switch (chip->ecc.size) {
+       case 512:
+               if (chip->ecc.algo == NAND_ECC_HAMMING)
+                       cfg->ecc_level = 15;
+               else
+                       cfg->ecc_level = chip->ecc.strength;
+               cfg->sector_size_1k = 0;
+               break;
+       case 1024:
+               if (!(ctrl->features & BRCMNAND_HAS_1K_SECTORS)) {
+                       dev_err(ctrl->dev, "1KB sectors not supported\n");
+                       return -EINVAL;
+               }
+               if (chip->ecc.strength & 0x1) {
+                       dev_err(ctrl->dev,
+                               "odd ECC not supported with 1KB sectors\n");
+                       return -EINVAL;
+               }
+
+               cfg->ecc_level = chip->ecc.strength >> 1;
+               cfg->sector_size_1k = 1;
+               break;
+       default:
+               dev_err(ctrl->dev, "unsupported ECC size: %d\n",
+                       chip->ecc.size);
+               return -EINVAL;
+       }
+
+       cfg->ful_adr_bytes = cfg->blk_adr_bytes;
+       if (mtd->writesize > 512)
+               cfg->ful_adr_bytes += cfg->col_adr_bytes;
+       else
+               cfg->ful_adr_bytes += 1;
+
+       ret = brcmnand_set_cfg(host, cfg);
+       if (ret)
+               return ret;
+
+       brcmnand_set_ecc_enabled(host, 1);
+
+       brcmnand_print_cfg(host, msg, cfg);
+       dev_info(ctrl->dev, "detected %s\n", msg);
+
+       /* Configure ACC_CONTROL */
+       offs = brcmnand_cs_offset(ctrl, host->cs, BRCMNAND_CS_ACC_CONTROL);
+       tmp = nand_readreg(ctrl, offs);
+       tmp &= ~ACC_CONTROL_PARTIAL_PAGE;
+       tmp &= ~ACC_CONTROL_RD_ERASED;
+
+       /* We need to turn on Read from erased paged protected by ECC */
+       if (ctrl->nand_version >= 0x0702)
+               tmp |= ACC_CONTROL_RD_ERASED;
+       tmp &= ~ACC_CONTROL_FAST_PGM_RDIN;
+       if (ctrl->features & BRCMNAND_HAS_PREFETCH)
+               tmp &= ~ACC_CONTROL_PREFETCH;
+
+       nand_writereg(ctrl, offs, tmp);
+
+       return 0;
+}
+
+#ifndef __UBOOT__
+static int brcmnand_init_cs(struct brcmnand_host *host, struct device_node *dn)
+#else
+static int brcmnand_init_cs(struct brcmnand_host *host, ofnode dn)
+#endif
+{
+       struct brcmnand_controller *ctrl = host->ctrl;
+#ifndef __UBOOT__
+       struct platform_device *pdev = host->pdev;
+#else
+       struct udevice *pdev = host->pdev;
+#endif /* __UBOOT__ */
+       struct mtd_info *mtd;
+       struct nand_chip *chip;
+       int ret;
+       u16 cfg_offs;
+
+#ifndef __UBOOT__
+       ret = of_property_read_u32(dn, "reg", &host->cs);
+#else
+       ret = ofnode_read_s32(dn, "reg", &host->cs);
+#endif
+       if (ret) {
+               dev_err(&pdev->dev, "can't get chip-select\n");
+               return -ENXIO;
+       }
+
+       mtd = nand_to_mtd(&host->chip);
+       chip = &host->chip;
+
+       nand_set_flash_node(chip, dn);
+       nand_set_controller_data(chip, host);
+#ifndef __UBOOT__
+       mtd->name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "brcmnand.%d",
+                                  host->cs);
+#else
+       mtd->name = devm_kasprintf(pdev, GFP_KERNEL, "brcmnand.%d",
+                                  host->cs);
+#endif /* __UBOOT__ */
+       if (!mtd->name)
+               return -ENOMEM;
+
+       mtd->owner = THIS_MODULE;
+#ifndef __UBOOT__
+       mtd->dev.parent = &pdev->dev;
+#else
+       mtd->dev->parent = pdev;
+#endif /* __UBOOT__ */
+
+       chip->IO_ADDR_R = (void __iomem *)0xdeadbeef;
+       chip->IO_ADDR_W = (void __iomem *)0xdeadbeef;
+
+       chip->cmd_ctrl = brcmnand_cmd_ctrl;
+       chip->cmdfunc = brcmnand_cmdfunc;
+       chip->waitfunc = brcmnand_waitfunc;
+       chip->read_byte = brcmnand_read_byte;
+       chip->read_buf = brcmnand_read_buf;
+       chip->write_buf = brcmnand_write_buf;
+
+       chip->ecc.mode = NAND_ECC_HW;
+       chip->ecc.read_page = brcmnand_read_page;
+       chip->ecc.write_page = brcmnand_write_page;
+       chip->ecc.read_page_raw = brcmnand_read_page_raw;
+       chip->ecc.write_page_raw = brcmnand_write_page_raw;
+       chip->ecc.write_oob_raw = brcmnand_write_oob_raw;
+       chip->ecc.read_oob_raw = brcmnand_read_oob_raw;
+       chip->ecc.read_oob = brcmnand_read_oob;
+       chip->ecc.write_oob = brcmnand_write_oob;
+
+       chip->controller = &ctrl->controller;
+
+       /*
+        * The bootloader might have configured 16bit mode but
+        * NAND READID command only works in 8bit mode. We force
+        * 8bit mode here to ensure that NAND READID commands works.
+        */
+       cfg_offs = brcmnand_cs_offset(ctrl, host->cs, BRCMNAND_CS_CFG);
+       nand_writereg(ctrl, cfg_offs,
+                     nand_readreg(ctrl, cfg_offs) & ~CFG_BUS_WIDTH);
+
+       ret = nand_scan_ident(mtd, 1, NULL);
+       if (ret)
+               return ret;
+
+       chip->options |= NAND_NO_SUBPAGE_WRITE;
+       /*
+        * Avoid (for instance) kmap()'d buffers from JFFS2, which we can't DMA
+        * to/from, and have nand_base pass us a bounce buffer instead, as
+        * needed.
+        */
+       chip->options |= NAND_USE_BOUNCE_BUFFER;
+
+       if (chip->bbt_options & NAND_BBT_USE_FLASH)
+               chip->bbt_options |= NAND_BBT_NO_OOB;
+
+       if (brcmnand_setup_dev(host))
+               return -ENXIO;
+
+       chip->ecc.size = host->hwcfg.sector_size_1k ? 1024 : 512;
+       /* only use our internal HW threshold */
+       mtd->bitflip_threshold = 1;
+
+       ret = brcmstb_choose_ecc_layout(host);
+       if (ret)
+               return ret;
+
+       ret = nand_scan_tail(mtd);
+       if (ret)
+               return ret;
+
+#ifndef __UBOOT__
+       ret = mtd_device_register(mtd, NULL, 0);
+       if (ret)
+               nand_cleanup(chip);
+#else
+       ret = nand_register(0, mtd);
+#endif /* __UBOOT__ */
+
+       return ret;
+}
+
+#ifndef __UBOOT__
+static void brcmnand_save_restore_cs_config(struct brcmnand_host *host,
+                                           int restore)
+{
+       struct brcmnand_controller *ctrl = host->ctrl;
+       u16 cfg_offs = brcmnand_cs_offset(ctrl, host->cs, BRCMNAND_CS_CFG);
+       u16 cfg_ext_offs = brcmnand_cs_offset(ctrl, host->cs,
+                       BRCMNAND_CS_CFG_EXT);
+       u16 acc_control_offs = brcmnand_cs_offset(ctrl, host->cs,
+                       BRCMNAND_CS_ACC_CONTROL);
+       u16 t1_offs = brcmnand_cs_offset(ctrl, host->cs, BRCMNAND_CS_TIMING1);
+       u16 t2_offs = brcmnand_cs_offset(ctrl, host->cs, BRCMNAND_CS_TIMING2);
+
+       if (restore) {
+               nand_writereg(ctrl, cfg_offs, host->hwcfg.config);
+               if (cfg_offs != cfg_ext_offs)
+                       nand_writereg(ctrl, cfg_ext_offs,
+                                     host->hwcfg.config_ext);
+               nand_writereg(ctrl, acc_control_offs, host->hwcfg.acc_control);
+               nand_writereg(ctrl, t1_offs, host->hwcfg.timing_1);
+               nand_writereg(ctrl, t2_offs, host->hwcfg.timing_2);
+       } else {
+               host->hwcfg.config = nand_readreg(ctrl, cfg_offs);
+               if (cfg_offs != cfg_ext_offs)
+                       host->hwcfg.config_ext =
+                               nand_readreg(ctrl, cfg_ext_offs);
+               host->hwcfg.acc_control = nand_readreg(ctrl, acc_control_offs);
+               host->hwcfg.timing_1 = nand_readreg(ctrl, t1_offs);
+               host->hwcfg.timing_2 = nand_readreg(ctrl, t2_offs);
+       }
+}
+
+static int brcmnand_suspend(struct device *dev)
+{
+       struct brcmnand_controller *ctrl = dev_get_drvdata(dev);
+       struct brcmnand_host *host;
+
+       list_for_each_entry(host, &ctrl->host_list, node)
+               brcmnand_save_restore_cs_config(host, 0);
+
+       ctrl->nand_cs_nand_select = brcmnand_read_reg(ctrl, BRCMNAND_CS_SELECT);
+       ctrl->nand_cs_nand_xor = brcmnand_read_reg(ctrl, BRCMNAND_CS_XOR);
+       ctrl->corr_stat_threshold =
+               brcmnand_read_reg(ctrl, BRCMNAND_CORR_THRESHOLD);
+
+       if (has_flash_dma(ctrl))
+               ctrl->flash_dma_mode = flash_dma_readl(ctrl, FLASH_DMA_MODE);
+
+       return 0;
+}
+
+static int brcmnand_resume(struct device *dev)
+{
+       struct brcmnand_controller *ctrl = dev_get_drvdata(dev);
+       struct brcmnand_host *host;
+
+       if (has_flash_dma(ctrl)) {
+               flash_dma_writel(ctrl, FLASH_DMA_MODE, ctrl->flash_dma_mode);
+               flash_dma_writel(ctrl, FLASH_DMA_ERROR_STATUS, 0);
+       }
+
+       brcmnand_write_reg(ctrl, BRCMNAND_CS_SELECT, ctrl->nand_cs_nand_select);
+       brcmnand_write_reg(ctrl, BRCMNAND_CS_XOR, ctrl->nand_cs_nand_xor);
+       brcmnand_write_reg(ctrl, BRCMNAND_CORR_THRESHOLD,
+                       ctrl->corr_stat_threshold);
+       if (ctrl->soc) {
+               /* Clear/re-enable interrupt */
+               ctrl->soc->ctlrdy_ack(ctrl->soc);
+               ctrl->soc->ctlrdy_set_enabled(ctrl->soc, true);
+       }
+
+       list_for_each_entry(host, &ctrl->host_list, node) {
+               struct nand_chip *chip = &host->chip;
+
+               brcmnand_save_restore_cs_config(host, 1);
+
+               /* Reset the chip, required by some chips after power-up */
+               nand_reset_op(chip);
+       }
+
+       return 0;
+}
+
+const struct dev_pm_ops brcmnand_pm_ops = {
+       .suspend                = brcmnand_suspend,
+       .resume                 = brcmnand_resume,
+};
+EXPORT_SYMBOL_GPL(brcmnand_pm_ops);
+
+static const struct of_device_id brcmnand_of_match[] = {
+       { .compatible = "brcm,brcmnand-v4.0" },
+       { .compatible = "brcm,brcmnand-v5.0" },
+       { .compatible = "brcm,brcmnand-v6.0" },
+       { .compatible = "brcm,brcmnand-v6.1" },
+       { .compatible = "brcm,brcmnand-v6.2" },
+       { .compatible = "brcm,brcmnand-v7.0" },
+       { .compatible = "brcm,brcmnand-v7.1" },
+       { .compatible = "brcm,brcmnand-v7.2" },
+       {},
+};
+MODULE_DEVICE_TABLE(of, brcmnand_of_match);
+#endif  /* __UBOOT__ */
+
+/***********************************************************************
+ * Platform driver setup (per controller)
+ ***********************************************************************/
+
+#ifndef __UBOOT__
+int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc)
+#else
+int brcmnand_probe(struct udevice *dev, struct brcmnand_soc *soc)
+#endif /* __UBOOT__ */
+{
+#ifndef __UBOOT__
+       struct device *dev = &pdev->dev;
+       struct device_node *dn = dev->of_node, *child;
+#else
+       ofnode child;
+       struct udevice *pdev = dev;
+#endif /* __UBOOT__ */
+       struct brcmnand_controller *ctrl;
+#ifndef __UBOOT__
+       struct resource *res;
+#else
+       struct resource res;
+#endif /* __UBOOT__ */
+       int ret;
+
+#ifndef __UBOOT__
+       /* We only support device-tree instantiation */
+       if (!dn)
+               return -ENODEV;
+
+       if (!of_match_node(brcmnand_of_match, dn))
+               return -ENODEV;
+#endif /* __UBOOT__ */
+
+       ctrl = devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL);
+       if (!ctrl)
+               return -ENOMEM;
+
+#ifndef __UBOOT__
+       dev_set_drvdata(dev, ctrl);
+#else
+       /*
+        * in u-boot, the data for the driver is allocated before probing
+        * so to keep the reference to ctrl, we store it in the variable soc
+        */
+       soc->ctrl = ctrl;
+#endif /* __UBOOT__ */
+       ctrl->dev = dev;
+
+       init_completion(&ctrl->done);
+       init_completion(&ctrl->dma_done);
+       nand_hw_control_init(&ctrl->controller);
+       INIT_LIST_HEAD(&ctrl->host_list);
+
+       /* Is parameter page in big endian ? */
+       ctrl->parameter_page_big_endian =
+           dev_read_u32_default(dev, "parameter-page-big-endian", 1);
+
+       /* NAND register range */
+#ifndef __UBOOT__
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       ctrl->nand_base = devm_ioremap_resource(dev, res);
+#else
+       dev_read_resource(pdev, 0, &res);
+       ctrl->nand_base = devm_ioremap(pdev, res.start, resource_size(&res));
+#endif
+       if (IS_ERR(ctrl->nand_base))
+               return PTR_ERR(ctrl->nand_base);
+
+       /* Enable clock before using NAND registers */
+       ctrl->clk = devm_clk_get(dev, "nand");
+       if (!IS_ERR(ctrl->clk)) {
+               ret = clk_prepare_enable(ctrl->clk);
+               if (ret)
+                       return ret;
+       } else {
+               ret = PTR_ERR(ctrl->clk);
+               if (ret == -EPROBE_DEFER)
+                       return ret;
+
+               ctrl->clk = NULL;
+       }
+
+       /* Initialize NAND revision */
+       ret = brcmnand_revision_init(ctrl);
+       if (ret)
+               goto err;
+
+       /*
+        * Most chips have this cache at a fixed offset within 'nand' block.
+        * Some must specify this region separately.
+        */
+#ifndef __UBOOT__
+       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "nand-cache");
+       if (res) {
+               ctrl->nand_fc = devm_ioremap_resource(dev, res);
+               if (IS_ERR(ctrl->nand_fc)) {
+                       ret = PTR_ERR(ctrl->nand_fc);
+                       goto err;
+               }
+       } else {
+               ctrl->nand_fc = ctrl->nand_base +
+                               ctrl->reg_offsets[BRCMNAND_FC_BASE];
+       }
+#else
+       if (!dev_read_resource_byname(pdev, "nand-cache", &res)) {
+               ctrl->nand_fc = devm_ioremap(dev, res.start,
+                                            resource_size(&res));
+               if (IS_ERR(ctrl->nand_fc)) {
+                       ret = PTR_ERR(ctrl->nand_fc);
+                       goto err;
+               }
+       } else {
+               ctrl->nand_fc = ctrl->nand_base +
+                               ctrl->reg_offsets[BRCMNAND_FC_BASE];
+       }
+#endif
+
+#ifndef __UBOOT__
+       /* FLASH_DMA */
+       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "flash-dma");
+       if (res) {
+               ctrl->flash_dma_base = devm_ioremap_resource(dev, res);
+               if (IS_ERR(ctrl->flash_dma_base)) {
+                       ret = PTR_ERR(ctrl->flash_dma_base);
+                       goto err;
+               }
+
+               flash_dma_writel(ctrl, FLASH_DMA_MODE, 1); /* linked-list */
+               flash_dma_writel(ctrl, FLASH_DMA_ERROR_STATUS, 0);
+
+               /* Allocate descriptor(s) */
+               ctrl->dma_desc = dmam_alloc_coherent(dev,
+                                                    sizeof(*ctrl->dma_desc),
+                                                    &ctrl->dma_pa, GFP_KERNEL);
+               if (!ctrl->dma_desc) {
+                       ret = -ENOMEM;
+                       goto err;
+               }
+
+               ctrl->dma_irq = platform_get_irq(pdev, 1);
+               if ((int)ctrl->dma_irq < 0) {
+                       dev_err(dev, "missing FLASH_DMA IRQ\n");
+                       ret = -ENODEV;
+                       goto err;
+               }
+
+               ret = devm_request_irq(dev, ctrl->dma_irq,
+                               brcmnand_dma_irq, 0, DRV_NAME,
+                               ctrl);
+               if (ret < 0) {
+                       dev_err(dev, "can't allocate IRQ %d: error %d\n",
+                                       ctrl->dma_irq, ret);
+                       goto err;
+               }
+
+               dev_info(dev, "enabling FLASH_DMA\n");
+       }
+#endif /* __UBOOT__ */
+
+       /* Disable automatic device ID config, direct addressing */
+       brcmnand_rmw_reg(ctrl, BRCMNAND_CS_SELECT,
+                        CS_SELECT_AUTO_DEVICE_ID_CFG | 0xff, 0, 0);
+       /* Disable XOR addressing */
+       brcmnand_rmw_reg(ctrl, BRCMNAND_CS_XOR, 0xff, 0, 0);
+
+       /* Read the write-protect configuration in the device tree */
+       wp_on = dev_read_u32_default(dev, "write-protect", wp_on);
+
+       if (ctrl->features & BRCMNAND_HAS_WP) {
+               /* Permanently disable write protection */
+               if (wp_on == 2)
+                       brcmnand_set_wp(ctrl, false);
+       } else {
+               wp_on = 0;
+       }
+
+#ifndef __UBOOT__
+       /* IRQ */
+       ctrl->irq = platform_get_irq(pdev, 0);
+       if ((int)ctrl->irq < 0) {
+               dev_err(dev, "no IRQ defined\n");
+               ret = -ENODEV;
+               goto err;
+       }
+
+       /*
+        * Some SoCs integrate this controller (e.g., its interrupt bits) in
+        * interesting ways
+        */
+       if (soc) {
+               ctrl->soc = soc;
+
+               ret = devm_request_irq(dev, ctrl->irq, brcmnand_irq, 0,
+                                      DRV_NAME, ctrl);
+
+               /* Enable interrupt */
+               ctrl->soc->ctlrdy_ack(ctrl->soc);
+               ctrl->soc->ctlrdy_set_enabled(ctrl->soc, true);
+       } else {
+               /* Use standard interrupt infrastructure */
+               ret = devm_request_irq(dev, ctrl->irq, brcmnand_ctlrdy_irq, 0,
+                                      DRV_NAME, ctrl);
+       }
+       if (ret < 0) {
+               dev_err(dev, "can't allocate IRQ %d: error %d\n",
+                       ctrl->irq, ret);
+               goto err;
+       }
+#endif /* __UBOOT__ */
+
+#ifndef __UBOOT__
+       for_each_available_child_of_node(dn, child) {
+               if (of_device_is_compatible(child, "brcm,nandcs")) {
+                       struct brcmnand_host *host;
+
+                       host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL);
+                       if (!host) {
+                               of_node_put(child);
+                               ret = -ENOMEM;
+                               goto err;
+                       }
+                       host->pdev = pdev;
+                       host->ctrl = ctrl;
+
+                       ret = brcmnand_init_cs(host, child);
+                       if (ret) {
+                               devm_kfree(dev, host);
+                               continue; /* Try all chip-selects */
+                       }
+
+                       list_add_tail(&host->node, &ctrl->host_list);
+               }
+       }
+#else
+       ofnode_for_each_subnode(child, dev_ofnode(dev)) {
+               if (ofnode_device_is_compatible(child, "brcm,nandcs")) {
+                       struct brcmnand_host *host;
+
+                       host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL);
+                       if (!host) {
+                               ret = -ENOMEM;
+                               goto err;
+                       }
+                       host->pdev = pdev;
+                       host->ctrl = ctrl;
+
+                       ret = brcmnand_init_cs(host, child);
+                       if (ret) {
+                               devm_kfree(dev, host);
+                               continue; /* Try all chip-selects */
+                       }
+
+                       list_add_tail(&host->node, &ctrl->host_list);
+               }
+       }
+#endif /* __UBOOT__ */
+
+err:
+#ifndef __UBOOT__
+       clk_disable_unprepare(ctrl->clk);
+#else
+       if (ctrl->clk)
+               clk_disable(ctrl->clk);
+#endif /* __UBOOT__ */
+       return ret;
+
+}
+EXPORT_SYMBOL_GPL(brcmnand_probe);
+
+#ifndef __UBOOT__
+int brcmnand_remove(struct platform_device *pdev)
+{
+       struct brcmnand_controller *ctrl = dev_get_drvdata(&pdev->dev);
+       struct brcmnand_host *host;
+
+       list_for_each_entry(host, &ctrl->host_list, node)
+               nand_release(nand_to_mtd(&host->chip));
+
+       clk_disable_unprepare(ctrl->clk);
+
+       dev_set_drvdata(&pdev->dev, NULL);
+
+       return 0;
+}
+#else
+int brcmnand_remove(struct udevice *pdev)
+{
+       return 0;
+}
+#endif /* __UBOOT__ */
+EXPORT_SYMBOL_GPL(brcmnand_remove);
+
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Kevin Cernekee");
+MODULE_AUTHOR("Brian Norris");
+MODULE_DESCRIPTION("NAND driver for Broadcom chips");
+MODULE_ALIAS("platform:brcmnand");
diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.h b/drivers/mtd/nand/raw/brcmnand/brcmnand.h
new file mode 100644 (file)
index 0000000..6946a62
--- /dev/null
@@ -0,0 +1,63 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+
+#ifndef __BRCMNAND_H__
+#define __BRCMNAND_H__
+
+#include <linux/types.h>
+#include <linux/io.h>
+
+struct brcmnand_soc {
+       bool (*ctlrdy_ack)(struct brcmnand_soc *soc);
+       void (*ctlrdy_set_enabled)(struct brcmnand_soc *soc, bool en);
+       void (*prepare_data_bus)(struct brcmnand_soc *soc, bool prepare,
+                                bool is_param);
+       void *ctrl;
+};
+
+static inline void brcmnand_soc_data_bus_prepare(struct brcmnand_soc *soc,
+                                                bool is_param)
+{
+       if (soc && soc->prepare_data_bus)
+               soc->prepare_data_bus(soc, true, is_param);
+}
+
+static inline void brcmnand_soc_data_bus_unprepare(struct brcmnand_soc *soc,
+                                                  bool is_param)
+{
+       if (soc && soc->prepare_data_bus)
+               soc->prepare_data_bus(soc, false, is_param);
+}
+
+static inline u32 brcmnand_readl(void __iomem *addr)
+{
+       /*
+        * MIPS endianness is configured by boot strap, which also reverses all
+        * bus endianness (i.e., big-endian CPU + big endian bus ==> native
+        * endian I/O).
+        *
+        * Other architectures (e.g., ARM) either do not support big endian, or
+        * else leave I/O in little endian mode.
+        */
+       if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_SYS_BIG_ENDIAN))
+               return __raw_readl(addr);
+       else
+               return readl_relaxed(addr);
+}
+
+static inline void brcmnand_writel(u32 val, void __iomem *addr)
+{
+       /* See brcmnand_readl() comments */
+       if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_SYS_BIG_ENDIAN))
+               __raw_writel(val, addr);
+       else
+               writel_relaxed(val, addr);
+}
+
+int brcmnand_probe(struct udevice *dev, struct brcmnand_soc *soc);
+int brcmnand_remove(struct udevice *dev);
+
+#ifndef __UBOOT__
+extern const struct dev_pm_ops brcmnand_pm_ops;
+#endif /* __UBOOT__ */
+
+#endif /* __BRCMNAND_H__ */
diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand_compat.c b/drivers/mtd/nand/raw/brcmnand/brcmnand_compat.c
new file mode 100644 (file)
index 0000000..96b27e6
--- /dev/null
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#include <common.h>
+#include "brcmnand_compat.h"
+
+struct clk *devm_clk_get(struct udevice *dev, const char *id)
+{
+       struct clk *clk;
+       int ret;
+
+       clk = devm_kzalloc(dev, sizeof(*clk), GFP_KERNEL);
+       if (!clk) {
+               debug("%s: can't allocate clock\n", __func__);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       ret = clk_get_by_name(dev, id, clk);
+       if (ret < 0) {
+               debug("%s: can't get clock (ret = %d)!\n", __func__, ret);
+               return ERR_PTR(ret);
+       }
+
+       return clk;
+}
+
+int clk_prepare_enable(struct clk *clk)
+{
+       return clk_enable(clk);
+}
+
+void clk_disable_unprepare(struct clk *clk)
+{
+       clk_disable(clk);
+}
+
+static char *devm_kvasprintf(struct udevice *dev, gfp_t gfp, const char *fmt,
+                            va_list ap)
+{
+       unsigned int len;
+       char *p;
+       va_list aq;
+
+       va_copy(aq, ap);
+       len = vsnprintf(NULL, 0, fmt, aq);
+       va_end(aq);
+
+       p = devm_kmalloc(dev, len + 1, gfp);
+       if (!p)
+               return NULL;
+
+       vsnprintf(p, len + 1, fmt, ap);
+
+       return p;
+}
+
+char *devm_kasprintf(struct udevice *dev, gfp_t gfp, const char *fmt, ...)
+{
+       va_list ap;
+       char *p;
+
+       va_start(ap, fmt);
+       p = devm_kvasprintf(dev, gfp, fmt, ap);
+       va_end(ap);
+
+       return p;
+}
diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand_compat.h b/drivers/mtd/nand/raw/brcmnand/brcmnand_compat.h
new file mode 100644 (file)
index 0000000..02cab0f
--- /dev/null
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+
+#ifndef __BRCMNAND_COMPAT_H
+#define __BRCMNAND_COMPAT_H
+
+#include <clk.h>
+#include <dm.h>
+
+struct clk *devm_clk_get(struct udevice *dev, const char *id);
+int clk_prepare_enable(struct clk *clk);
+void clk_disable_unprepare(struct clk *clk);
+
+char *devm_kasprintf(struct udevice *dev, gfp_t gfp, const char *fmt, ...);
+
+#endif /* __BRCMNAND_COMPAT_H */
index 019deda094e5de952ad9725d4d4968aad9df764a..63ae828768c95c40f0d5ecb257561f9d968369cf 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/bitops.h>
 #include <linux/mtd/rawnand.h>
 #include <linux/types.h>
+#include <reset.h>
 
 #define DEVICE_RESET                           0x0
 #define     DEVICE_RESET__BANK(bank)                   BIT(bank)
@@ -315,6 +316,7 @@ struct denali_nand_info {
        void (*host_write)(struct denali_nand_info *denali, u32 addr, u32 data);
        void (*setup_dma)(struct denali_nand_info *denali, dma_addr_t dma_addr,
                          int page, int write);
+       struct reset_ctl_bulk resets;
 };
 
 #define DENALI_CAP_HW_ECC_FIXUP                        BIT(0)
index d384b974df1c9c8cbc6498133f11a667ce0d4744..0ce81324b90e468ef037b4326fe44b1949657c61 100644 (file)
@@ -131,15 +131,30 @@ static int denali_dt_probe(struct udevice *dev)
                denali->clk_x_rate = 200000000;
        }
 
+       ret = reset_get_bulk(dev, &denali->resets);
+       if (ret)
+               dev_warn(dev, "Can't get reset: %d\n", ret);
+       else
+               reset_deassert_bulk(&denali->resets);
+
        return denali_init(denali);
 }
 
+static int denali_dt_remove(struct udevice *dev)
+{
+       struct denali_nand_info *denali = dev_get_priv(dev);
+
+       return reset_release_bulk(&denali->resets);
+}
+
 U_BOOT_DRIVER(denali_nand_dt) = {
        .name = "denali-nand-dt",
        .id = UCLASS_MISC,
        .of_match = denali_nand_dt_ids,
        .probe = denali_dt_probe,
        .priv_auto_alloc_size = sizeof(struct denali_nand_info),
+       .remove = denali_dt_remove,
+       .flags = DM_FLAG_OS_PREPARE,
 };
 
 void board_nand_init(void)
index 6d2ff58d86a557a1f64ad01f3385f6c033d5c5d0..e07bd6b657eeba96f2afe9338500a5290c7b4b0a 100644 (file)
@@ -486,14 +486,19 @@ static int nand_block_markbad_lowlevel(struct mtd_info *mtd, loff_t ofs)
 static int nand_check_wp(struct mtd_info *mtd)
 {
        struct nand_chip *chip = mtd_to_nand(mtd);
+       u8 status;
+       int ret;
 
        /* Broken xD cards report WP despite being writable */
        if (chip->options & NAND_BROKEN_XD)
                return 0;
 
        /* Check the WP bit */
-       chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
-       return (chip->read_byte(mtd) & NAND_STATUS_WP) ? 0 : 1;
+       ret = nand_status_op(chip, &status);
+       if (ret)
+               return ret;
+
+       return status & NAND_STATUS_WP ? 0 : 1;
 }
 
 /**
@@ -575,11 +580,18 @@ static void nand_wait_status_ready(struct mtd_info *mtd, unsigned long timeo)
 {
        register struct nand_chip *chip = mtd_to_nand(mtd);
        u32 time_start;
+       int ret;
 
        timeo = (CONFIG_SYS_HZ * timeo) / 1000;
        time_start = get_timer(0);
        while (get_timer(time_start) < timeo) {
-               if ((chip->read_byte(mtd) & NAND_STATUS_READY))
+               u8 status;
+
+               ret = nand_read_data_op(chip, &status, sizeof(status), true);
+               if (ret)
+                       return;
+
+               if (status & NAND_STATUS_READY)
                        break;
                WATCHDOG_RESET();
        }
@@ -851,7 +863,15 @@ static void panic_nand_wait(struct mtd_info *mtd, struct nand_chip *chip,
                        if (chip->dev_ready(mtd))
                                break;
                } else {
-                       if (chip->read_byte(mtd) & NAND_STATUS_READY)
+                       int ret;
+                       u8 status;
+
+                       ret = nand_read_data_op(chip, &status, sizeof(status),
+                                               true);
+                       if (ret)
+                               return;
+
+                       if (status & NAND_STATUS_READY)
                                break;
                }
                mdelay(1);
@@ -867,8 +887,9 @@ static void panic_nand_wait(struct mtd_info *mtd, struct nand_chip *chip,
  */
 static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip)
 {
-       int status;
        unsigned long timeo = 400;
+       u8 status;
+       int ret;
 
        led_trigger_event(nand_led_trigger, LED_FULL);
 
@@ -878,7 +899,9 @@ static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip)
         */
        ndelay(100);
 
-       chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
+       ret = nand_status_op(chip, NULL);
+       if (ret)
+               return ret;
 
        u32 timer = (CONFIG_SYS_HZ * timeo) / 1000;
        u32 time_start;
@@ -889,13 +912,21 @@ static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip)
                        if (chip->dev_ready(mtd))
                                break;
                } else {
-                       if (chip->read_byte(mtd) & NAND_STATUS_READY)
+                       ret = nand_read_data_op(chip, &status,
+                                               sizeof(status), true);
+                       if (ret)
+                               return ret;
+
+                       if (status & NAND_STATUS_READY)
                                break;
                }
        }
        led_trigger_event(nand_led_trigger, LED_OFF);
 
-       status = (int)chip->read_byte(mtd);
+       ret = nand_read_data_op(chip, &status, sizeof(status), true);
+       if (ret)
+               return ret;
+
        /* This can happen if in case of timeout or buggy dev_ready */
        WARN_ON(!(status & NAND_STATUS_READY));
        return status;
@@ -1047,6 +1078,516 @@ static void __maybe_unused nand_release_data_interface(struct nand_chip *chip)
        kfree(chip->data_interface);
 }
 
+/**
+ * nand_read_page_op - Do a READ PAGE operation
+ * @chip: The NAND chip
+ * @page: page to read
+ * @offset_in_page: offset within the page
+ * @buf: buffer used to store the data
+ * @len: length of the buffer
+ *
+ * This function issues a READ PAGE operation.
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+int nand_read_page_op(struct nand_chip *chip, unsigned int page,
+                     unsigned int offset_in_page, void *buf, unsigned int len)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+
+       if (len && !buf)
+               return -EINVAL;
+
+       if (offset_in_page + len > mtd->writesize + mtd->oobsize)
+               return -EINVAL;
+
+       chip->cmdfunc(mtd, NAND_CMD_READ0, offset_in_page, page);
+       if (len)
+               chip->read_buf(mtd, buf, len);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(nand_read_page_op);
+
+/**
+ * nand_read_param_page_op - Do a READ PARAMETER PAGE operation
+ * @chip: The NAND chip
+ * @page: parameter page to read
+ * @buf: buffer used to store the data
+ * @len: length of the buffer
+ *
+ * This function issues a READ PARAMETER PAGE operation.
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+static int nand_read_param_page_op(struct nand_chip *chip, u8 page, void *buf,
+                                  unsigned int len)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+       unsigned int i;
+       u8 *p = buf;
+
+       if (len && !buf)
+               return -EINVAL;
+
+       chip->cmdfunc(mtd, NAND_CMD_PARAM, page, -1);
+       for (i = 0; i < len; i++)
+               p[i] = chip->read_byte(mtd);
+
+       return 0;
+}
+
+/**
+ * nand_change_read_column_op - Do a CHANGE READ COLUMN operation
+ * @chip: The NAND chip
+ * @offset_in_page: offset within the page
+ * @buf: buffer used to store the data
+ * @len: length of the buffer
+ * @force_8bit: force 8-bit bus access
+ *
+ * This function issues a CHANGE READ COLUMN operation.
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+int nand_change_read_column_op(struct nand_chip *chip,
+                              unsigned int offset_in_page, void *buf,
+                              unsigned int len, bool force_8bit)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+
+       if (len && !buf)
+               return -EINVAL;
+
+       if (offset_in_page + len > mtd->writesize + mtd->oobsize)
+               return -EINVAL;
+
+       chip->cmdfunc(mtd, NAND_CMD_RNDOUT, offset_in_page, -1);
+       if (len)
+               chip->read_buf(mtd, buf, len);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(nand_change_read_column_op);
+
+/**
+ * nand_read_oob_op - Do a READ OOB operation
+ * @chip: The NAND chip
+ * @page: page to read
+ * @offset_in_oob: offset within the OOB area
+ * @buf: buffer used to store the data
+ * @len: length of the buffer
+ *
+ * This function issues a READ OOB operation.
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+int nand_read_oob_op(struct nand_chip *chip, unsigned int page,
+                    unsigned int offset_in_oob, void *buf, unsigned int len)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+
+       if (len && !buf)
+               return -EINVAL;
+
+       if (offset_in_oob + len > mtd->oobsize)
+               return -EINVAL;
+
+       chip->cmdfunc(mtd, NAND_CMD_READOOB, offset_in_oob, page);
+       if (len)
+               chip->read_buf(mtd, buf, len);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(nand_read_oob_op);
+
+/**
+ * nand_prog_page_begin_op - starts a PROG PAGE operation
+ * @chip: The NAND chip
+ * @page: page to write
+ * @offset_in_page: offset within the page
+ * @buf: buffer containing the data to write to the page
+ * @len: length of the buffer
+ *
+ * This function issues the first half of a PROG PAGE operation.
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+int nand_prog_page_begin_op(struct nand_chip *chip, unsigned int page,
+                           unsigned int offset_in_page, const void *buf,
+                           unsigned int len)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+
+       if (len && !buf)
+               return -EINVAL;
+
+       if (offset_in_page + len > mtd->writesize + mtd->oobsize)
+               return -EINVAL;
+
+       chip->cmdfunc(mtd, NAND_CMD_SEQIN, offset_in_page, page);
+
+       if (buf)
+               chip->write_buf(mtd, buf, len);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(nand_prog_page_begin_op);
+
+/**
+ * nand_prog_page_end_op - ends a PROG PAGE operation
+ * @chip: The NAND chip
+ *
+ * This function issues the second half of a PROG PAGE operation.
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+int nand_prog_page_end_op(struct nand_chip *chip)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+       int status;
+
+       chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
+
+       status = chip->waitfunc(mtd, chip);
+       if (status & NAND_STATUS_FAIL)
+               return -EIO;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(nand_prog_page_end_op);
+
+/**
+ * nand_prog_page_op - Do a full PROG PAGE operation
+ * @chip: The NAND chip
+ * @page: page to write
+ * @offset_in_page: offset within the page
+ * @buf: buffer containing the data to write to the page
+ * @len: length of the buffer
+ *
+ * This function issues a full PROG PAGE operation.
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+int nand_prog_page_op(struct nand_chip *chip, unsigned int page,
+                     unsigned int offset_in_page, const void *buf,
+                     unsigned int len)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+       int status;
+
+       if (!len || !buf)
+               return -EINVAL;
+
+       if (offset_in_page + len > mtd->writesize + mtd->oobsize)
+               return -EINVAL;
+
+       chip->cmdfunc(mtd, NAND_CMD_SEQIN, offset_in_page, page);
+       chip->write_buf(mtd, buf, len);
+       chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
+
+       status = chip->waitfunc(mtd, chip);
+       if (status & NAND_STATUS_FAIL)
+               return -EIO;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(nand_prog_page_op);
+
+/**
+ * nand_change_write_column_op - Do a CHANGE WRITE COLUMN operation
+ * @chip: The NAND chip
+ * @offset_in_page: offset within the page
+ * @buf: buffer containing the data to send to the NAND
+ * @len: length of the buffer
+ * @force_8bit: force 8-bit bus access
+ *
+ * This function issues a CHANGE WRITE COLUMN operation.
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+int nand_change_write_column_op(struct nand_chip *chip,
+                               unsigned int offset_in_page,
+                               const void *buf, unsigned int len,
+                               bool force_8bit)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+
+       if (len && !buf)
+               return -EINVAL;
+
+       if (offset_in_page + len > mtd->writesize + mtd->oobsize)
+               return -EINVAL;
+
+       chip->cmdfunc(mtd, NAND_CMD_RNDIN, offset_in_page, -1);
+       if (len)
+               chip->write_buf(mtd, buf, len);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(nand_change_write_column_op);
+
+/**
+ * nand_readid_op - Do a READID operation
+ * @chip: The NAND chip
+ * @addr: address cycle to pass after the READID command
+ * @buf: buffer used to store the ID
+ * @len: length of the buffer
+ *
+ * This function sends a READID command and reads back the ID returned by the
+ * NAND.
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+int nand_readid_op(struct nand_chip *chip, u8 addr, void *buf,
+                  unsigned int len)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+       unsigned int i;
+       u8 *id = buf;
+
+       if (len && !buf)
+               return -EINVAL;
+
+       chip->cmdfunc(mtd, NAND_CMD_READID, addr, -1);
+
+       for (i = 0; i < len; i++)
+               id[i] = chip->read_byte(mtd);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(nand_readid_op);
+
+/**
+ * nand_status_op - Do a STATUS operation
+ * @chip: The NAND chip
+ * @status: out variable to store the NAND status
+ *
+ * This function sends a STATUS command and reads back the status returned by
+ * the NAND.
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+int nand_status_op(struct nand_chip *chip, u8 *status)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+
+       chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
+       if (status)
+               *status = chip->read_byte(mtd);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(nand_status_op);
+
+/**
+ * nand_exit_status_op - Exit a STATUS operation
+ * @chip: The NAND chip
+ *
+ * This function sends a READ0 command to cancel the effect of the STATUS
+ * command to avoid reading only the status until a new read command is sent.
+ *
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+int nand_exit_status_op(struct nand_chip *chip)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+
+       chip->cmdfunc(mtd, NAND_CMD_READ0, -1, -1);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(nand_exit_status_op);
+
+/**
+ * nand_erase_op - Do an erase operation
+ * @chip: The NAND chip
+ * @eraseblock: block to erase
+ *
+ * This function sends an ERASE command and waits for the NAND to be ready
+ * before returning.
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+int nand_erase_op(struct nand_chip *chip, unsigned int eraseblock)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+       unsigned int page = eraseblock <<
+                           (chip->phys_erase_shift - chip->page_shift);
+       int status;
+
+       chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page);
+       chip->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1);
+
+       status = chip->waitfunc(mtd, chip);
+       if (status < 0)
+               return status;
+
+       if (status & NAND_STATUS_FAIL)
+               return -EIO;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(nand_erase_op);
+
+/**
+ * nand_set_features_op - Do a SET FEATURES operation
+ * @chip: The NAND chip
+ * @feature: feature id
+ * @data: 4 bytes of data
+ *
+ * This function sends a SET FEATURES command and waits for the NAND to be
+ * ready before returning.
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+static int nand_set_features_op(struct nand_chip *chip, u8 feature,
+                               const void *data)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+       const u8 *params = data;
+       int i, status;
+
+       chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES, feature, -1);
+       for (i = 0; i < ONFI_SUBFEATURE_PARAM_LEN; ++i)
+               chip->write_byte(mtd, params[i]);
+
+       status = chip->waitfunc(mtd, chip);
+       if (status & NAND_STATUS_FAIL)
+               return -EIO;
+
+       return 0;
+}
+
+/**
+ * nand_get_features_op - Do a GET FEATURES operation
+ * @chip: The NAND chip
+ * @feature: feature id
+ * @data: 4 bytes of data
+ *
+ * This function sends a GET FEATURES command and waits for the NAND to be
+ * ready before returning.
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+static int nand_get_features_op(struct nand_chip *chip, u8 feature,
+                               void *data)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+       u8 *params = data;
+       int i;
+
+       chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES, feature, -1);
+       for (i = 0; i < ONFI_SUBFEATURE_PARAM_LEN; ++i)
+               params[i] = chip->read_byte(mtd);
+
+       return 0;
+}
+
+/**
+ * nand_reset_op - Do a reset operation
+ * @chip: The NAND chip
+ *
+ * This function sends a RESET command and waits for the NAND to be ready
+ * before returning.
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+int nand_reset_op(struct nand_chip *chip)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+
+       chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(nand_reset_op);
+
+/**
+ * nand_read_data_op - Read data from the NAND
+ * @chip: The NAND chip
+ * @buf: buffer used to store the data
+ * @len: length of the buffer
+ * @force_8bit: force 8-bit bus access
+ *
+ * This function does a raw data read on the bus. Usually used after launching
+ * another NAND operation like nand_read_page_op().
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+int nand_read_data_op(struct nand_chip *chip, void *buf, unsigned int len,
+                     bool force_8bit)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+
+       if (!len || !buf)
+               return -EINVAL;
+
+       if (force_8bit) {
+               u8 *p = buf;
+               unsigned int i;
+
+               for (i = 0; i < len; i++)
+                       p[i] = chip->read_byte(mtd);
+       } else {
+               chip->read_buf(mtd, buf, len);
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(nand_read_data_op);
+
+/**
+ * nand_write_data_op - Write data from the NAND
+ * @chip: The NAND chip
+ * @buf: buffer containing the data to send on the bus
+ * @len: length of the buffer
+ * @force_8bit: force 8-bit bus access
+ *
+ * This function does a raw data write on the bus. Usually used after launching
+ * another NAND operation like nand_write_page_begin_op().
+ * This function does not select/unselect the CS line.
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+int nand_write_data_op(struct nand_chip *chip, const void *buf,
+                      unsigned int len, bool force_8bit)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+
+       if (!len || !buf)
+               return -EINVAL;
+
+       if (force_8bit) {
+               const u8 *p = buf;
+               unsigned int i;
+
+               for (i = 0; i < len; i++)
+                       chip->write_byte(mtd, p[i]);
+       } else {
+               chip->write_buf(mtd, buf, len);
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(nand_write_data_op);
+
 /**
  * nand_reset - Reset and initialize a NAND device
  * @chip: The NAND chip
@@ -1068,8 +1609,10 @@ int nand_reset(struct nand_chip *chip, int chipnr)
         * interface settings, hence this weird ->select_chip() dance.
         */
        chip->select_chip(mtd, chipnr);
-       chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
+       ret = nand_reset_op(chip);
        chip->select_chip(mtd, -1);
+       if (ret)
+               return ret;
 
        chip->select_chip(mtd, chipnr);
        ret = nand_setup_data_interface(chip, chipnr);
@@ -1220,9 +1763,19 @@ EXPORT_SYMBOL(nand_check_erased_ecc_chunk);
 static int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
                              uint8_t *buf, int oob_required, int page)
 {
-       chip->read_buf(mtd, buf, mtd->writesize);
-       if (oob_required)
-               chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
+       int ret;
+
+       ret = nand_read_data_op(chip, buf, mtd->writesize, false);
+       if (ret)
+               return ret;
+
+       if (oob_required) {
+               ret = nand_read_data_op(chip, chip->oob_poi, mtd->oobsize,
+                                       false);
+               if (ret)
+                       return ret;
+       }
+
        return 0;
 }
 
@@ -1243,29 +1796,46 @@ static int nand_read_page_raw_syndrome(struct mtd_info *mtd,
        int eccsize = chip->ecc.size;
        int eccbytes = chip->ecc.bytes;
        uint8_t *oob = chip->oob_poi;
-       int steps, size;
+       int steps, size, ret;
 
        for (steps = chip->ecc.steps; steps > 0; steps--) {
-               chip->read_buf(mtd, buf, eccsize);
+               ret = nand_read_data_op(chip, buf, eccsize, false);
+               if (ret)
+                       return ret;
+
                buf += eccsize;
 
                if (chip->ecc.prepad) {
-                       chip->read_buf(mtd, oob, chip->ecc.prepad);
+                       ret = nand_read_data_op(chip, oob, chip->ecc.prepad,
+                                               false);
+                       if (ret)
+                               return ret;
+
                        oob += chip->ecc.prepad;
                }
 
-               chip->read_buf(mtd, oob, eccbytes);
+               ret = nand_read_data_op(chip, oob, eccbytes, false);
+               if (ret)
+                       return ret;
+
                oob += eccbytes;
 
                if (chip->ecc.postpad) {
-                       chip->read_buf(mtd, oob, chip->ecc.postpad);
+                       ret = nand_read_data_op(chip, oob, chip->ecc.postpad,
+                                               false);
+                       if (ret)
+                               return ret;
+
                        oob += chip->ecc.postpad;
                }
        }
 
        size = mtd->oobsize - (oob - chip->oob_poi);
-       if (size)
-               chip->read_buf(mtd, oob, size);
+       if (size) {
+               ret = nand_read_data_op(chip, oob, size, false);
+               if (ret)
+                       return ret;
+       }
 
        return 0;
 }
@@ -1336,6 +1906,7 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
        int busw = (chip->options & NAND_BUSWIDTH_16) ? 2 : 1;
        int index;
        unsigned int max_bitflips = 0;
+       int ret;
 
        /* Column address within the page aligned to ECC size (256bytes) */
        start_step = data_offs / chip->ecc.size;
@@ -1353,7 +1924,9 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
                chip->cmdfunc(mtd, NAND_CMD_RNDOUT, data_col_addr, -1);
 
        p = bufpoi + data_col_addr;
-       chip->read_buf(mtd, p, datafrag_len);
+       ret = nand_read_data_op(chip, p, datafrag_len, false);
+       if (ret)
+               return ret;
 
        /* Calculate ECC */
        for (i = 0; i < eccfrag_len ; i += chip->ecc.bytes, p += chip->ecc.size)
@@ -1370,8 +1943,11 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
                }
        }
        if (gaps) {
-               chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize, -1);
-               chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
+               ret = nand_change_read_column_op(chip, mtd->writesize,
+                                                chip->oob_poi, mtd->oobsize,
+                                                false);
+               if (ret)
+                       return ret;
        } else {
                /*
                 * Send the command to read the particular ECC bytes take care
@@ -1384,9 +1960,12 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
                if (eccpos[index + (num_steps * chip->ecc.bytes)] & (busw - 1))
                        aligned_len++;
 
-               chip->cmdfunc(mtd, NAND_CMD_RNDOUT,
-                                       mtd->writesize + aligned_pos, -1);
-               chip->read_buf(mtd, &chip->oob_poi[aligned_pos], aligned_len);
+               ret = nand_change_read_column_op(chip,
+                                                mtd->writesize + aligned_pos,
+                                                &chip->oob_poi[aligned_pos],
+                                                aligned_len, false);
+               if (ret)
+                       return ret;
        }
 
        for (i = 0; i < eccfrag_len; i++)
@@ -1439,13 +2018,21 @@ static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
        uint8_t *ecc_code = chip->buffers->ecccode;
        uint32_t *eccpos = chip->ecc.layout->eccpos;
        unsigned int max_bitflips = 0;
+       int ret;
 
        for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
                chip->ecc.hwctl(mtd, NAND_ECC_READ);
-               chip->read_buf(mtd, p, eccsize);
+
+               ret = nand_read_data_op(chip, p, eccsize, false);
+               if (ret)
+                       return ret;
+
                chip->ecc.calculate(mtd, p, &ecc_calc[i]);
        }
-       chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
+
+       ret = nand_read_data_op(chip, chip->oob_poi, mtd->oobsize, false);
+       if (ret)
+               return ret;
 
        for (i = 0; i < chip->ecc.total; i++)
                ecc_code[i] = chip->oob_poi[eccpos[i]];
@@ -1501,11 +2088,16 @@ static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
        uint32_t *eccpos = chip->ecc.layout->eccpos;
        uint8_t *ecc_calc = chip->buffers->ecccalc;
        unsigned int max_bitflips = 0;
+       int ret;
 
        /* Read the OOB area first */
-       chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
-       chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
-       chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
+       ret = nand_read_oob_op(chip, page, 0, chip->oob_poi, mtd->oobsize);
+       if (ret)
+               return ret;
+
+       ret = nand_read_page_op(chip, page, 0, NULL, 0);
+       if (ret)
+               return ret;
 
        for (i = 0; i < chip->ecc.total; i++)
                ecc_code[i] = chip->oob_poi[eccpos[i]];
@@ -1514,7 +2106,11 @@ static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
                int stat;
 
                chip->ecc.hwctl(mtd, NAND_ECC_READ);
-               chip->read_buf(mtd, p, eccsize);
+
+               ret = nand_read_data_op(chip, p, eccsize, false);
+               if (ret)
+                       return ret;
+
                chip->ecc.calculate(mtd, p, &ecc_calc[i]);
 
                stat = chip->ecc.correct(mtd, p, &ecc_code[i], NULL);
@@ -1551,7 +2147,7 @@ static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
 static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
                                   uint8_t *buf, int oob_required, int page)
 {
-       int i, eccsize = chip->ecc.size;
+       int ret, i, eccsize = chip->ecc.size;
        int eccbytes = chip->ecc.bytes;
        int eccsteps = chip->ecc.steps;
        int eccpadbytes = eccbytes + chip->ecc.prepad + chip->ecc.postpad;
@@ -1563,21 +2159,36 @@ static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
                int stat;
 
                chip->ecc.hwctl(mtd, NAND_ECC_READ);
-               chip->read_buf(mtd, p, eccsize);
+
+               ret = nand_read_data_op(chip, p, eccsize, false);
+               if (ret)
+                       return ret;
 
                if (chip->ecc.prepad) {
-                       chip->read_buf(mtd, oob, chip->ecc.prepad);
+                       ret = nand_read_data_op(chip, oob, chip->ecc.prepad,
+                                               false);
+                       if (ret)
+                               return ret;
+
                        oob += chip->ecc.prepad;
                }
 
                chip->ecc.hwctl(mtd, NAND_ECC_READSYN);
-               chip->read_buf(mtd, oob, eccbytes);
+
+               ret = nand_read_data_op(chip, oob, eccbytes, false);
+               if (ret)
+                       return ret;
+
                stat = chip->ecc.correct(mtd, p, oob, NULL);
 
                oob += eccbytes;
 
                if (chip->ecc.postpad) {
-                       chip->read_buf(mtd, oob, chip->ecc.postpad);
+                       ret = nand_read_data_op(chip, oob, chip->ecc.postpad,
+                                               false);
+                       if (ret)
+                               return ret;
+
                        oob += chip->ecc.postpad;
                }
 
@@ -1601,8 +2212,11 @@ static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
 
        /* Calculate remaining oob bytes */
        i = mtd->oobsize - (oob - chip->oob_poi);
-       if (i)
-               chip->read_buf(mtd, oob, i);
+       if (i) {
+               ret = nand_read_data_op(chip, oob, i, false);
+               if (ret)
+                       return ret;
+       }
 
        return max_bitflips;
 }
@@ -1739,8 +2353,11 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
                                                 __func__, buf);
 
 read_retry:
-                       if (nand_standard_page_accessors(&chip->ecc))
-                               chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
+                       if (nand_standard_page_accessors(&chip->ecc)) {
+                               ret = nand_read_page_op(chip, page, 0, NULL, 0);
+                               if (ret)
+                                       break;
+                       }
 
                        /*
                         * Now read the page into the buffer.  Absent an error,
@@ -1874,9 +2491,7 @@ read_retry:
 static int nand_read_oob_std(struct mtd_info *mtd, struct nand_chip *chip,
                             int page)
 {
-       chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
-       chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
-       return 0;
+       return nand_read_oob_op(chip, page, 0, chip->oob_poi, mtd->oobsize);
 }
 
 /**
@@ -1893,25 +2508,43 @@ static int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
        int chunk = chip->ecc.bytes + chip->ecc.prepad + chip->ecc.postpad;
        int eccsize = chip->ecc.size;
        uint8_t *bufpoi = chip->oob_poi;
-       int i, toread, sndrnd = 0, pos;
+       int i, toread, sndrnd = 0, pos, ret;
+
+       ret = nand_read_page_op(chip, page, chip->ecc.size, NULL, 0);
+       if (ret)
+               return ret;
 
-       chip->cmdfunc(mtd, NAND_CMD_READ0, chip->ecc.size, page);
        for (i = 0; i < chip->ecc.steps; i++) {
                if (sndrnd) {
+                       int ret;
+
                        pos = eccsize + i * (eccsize + chunk);
                        if (mtd->writesize > 512)
-                               chip->cmdfunc(mtd, NAND_CMD_RNDOUT, pos, -1);
+                               ret = nand_change_read_column_op(chip, pos,
+                                                                NULL, 0,
+                                                                false);
                        else
-                               chip->cmdfunc(mtd, NAND_CMD_READ0, pos, page);
+                               ret = nand_read_page_op(chip, page, pos, NULL,
+                                                       0);
+
+                       if (ret)
+                               return ret;
                } else
                        sndrnd = 1;
                toread = min_t(int, length, chunk);
-               chip->read_buf(mtd, bufpoi, toread);
+
+               ret = nand_read_data_op(chip, bufpoi, toread, false);
+               if (ret)
+                       return ret;
+
                bufpoi += toread;
                length -= toread;
        }
-       if (length > 0)
-               chip->read_buf(mtd, bufpoi, length);
+       if (length > 0) {
+               ret = nand_read_data_op(chip, bufpoi, length, false);
+               if (ret)
+                       return ret;
+       }
 
        return 0;
 }
@@ -1925,18 +2558,8 @@ static int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
 static int nand_write_oob_std(struct mtd_info *mtd, struct nand_chip *chip,
                              int page)
 {
-       int status = 0;
-       const uint8_t *buf = chip->oob_poi;
-       int length = mtd->oobsize;
-
-       chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize, page);
-       chip->write_buf(mtd, buf, length);
-       /* Send command to program the OOB data */
-       chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
-
-       status = chip->waitfunc(mtd, chip);
-
-       return status & NAND_STATUS_FAIL ? -EIO : 0;
+       return nand_prog_page_op(chip, page, mtd->writesize, chip->oob_poi,
+                                mtd->oobsize);
 }
 
 /**
@@ -1951,7 +2574,7 @@ static int nand_write_oob_syndrome(struct mtd_info *mtd,
 {
        int chunk = chip->ecc.bytes + chip->ecc.prepad + chip->ecc.postpad;
        int eccsize = chip->ecc.size, length = mtd->oobsize;
-       int i, len, pos, status = 0, sndcmd = 0, steps = chip->ecc.steps;
+       int ret, i, len, pos, sndcmd = 0, steps = chip->ecc.steps;
        const uint8_t *bufpoi = chip->oob_poi;
 
        /*
@@ -1965,7 +2588,10 @@ static int nand_write_oob_syndrome(struct mtd_info *mtd,
        } else
                pos = eccsize;
 
-       chip->cmdfunc(mtd, NAND_CMD_SEQIN, pos, page);
+       ret = nand_prog_page_begin_op(chip, page, pos, NULL, 0);
+       if (ret)
+               return ret;
+
        for (i = 0; i < steps; i++) {
                if (sndcmd) {
                        if (mtd->writesize <= 512) {
@@ -1974,28 +2600,40 @@ static int nand_write_oob_syndrome(struct mtd_info *mtd,
                                len = eccsize;
                                while (len > 0) {
                                        int num = min_t(int, len, 4);
-                                       chip->write_buf(mtd, (uint8_t *)&fill,
-                                                       num);
+
+                                       ret = nand_write_data_op(chip, &fill,
+                                                                num, false);
+                                       if (ret)
+                                               return ret;
+
                                        len -= num;
                                }
                        } else {
                                pos = eccsize + i * (eccsize + chunk);
-                               chip->cmdfunc(mtd, NAND_CMD_RNDIN, pos, -1);
+                               ret = nand_change_write_column_op(chip, pos,
+                                                                 NULL, 0,
+                                                                 false);
+                               if (ret)
+                                       return ret;
                        }
                } else
                        sndcmd = 1;
                len = min_t(int, length, chunk);
-               chip->write_buf(mtd, bufpoi, len);
+
+               ret = nand_write_data_op(chip, bufpoi, len, false);
+               if (ret)
+                       return ret;
+
                bufpoi += len;
                length -= len;
        }
-       if (length > 0)
-               chip->write_buf(mtd, bufpoi, length);
-
-       chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
-       status = chip->waitfunc(mtd, chip);
+       if (length > 0) {
+               ret = nand_write_data_op(chip, bufpoi, length, false);
+               if (ret)
+                       return ret;
+       }
 
-       return status & NAND_STATUS_FAIL ? -EIO : 0;
+       return nand_prog_page_end_op(chip);
 }
 
 /**
@@ -2154,9 +2792,18 @@ out:
 static int nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
                               const uint8_t *buf, int oob_required, int page)
 {
-       chip->write_buf(mtd, buf, mtd->writesize);
-       if (oob_required)
-               chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
+       int ret;
+
+       ret = nand_write_data_op(chip, buf, mtd->writesize, false);
+       if (ret)
+               return ret;
+
+       if (oob_required) {
+               ret = nand_write_data_op(chip, chip->oob_poi, mtd->oobsize,
+                                        false);
+               if (ret)
+                       return ret;
+       }
 
        return 0;
 }
@@ -2179,29 +2826,46 @@ static int nand_write_page_raw_syndrome(struct mtd_info *mtd,
        int eccsize = chip->ecc.size;
        int eccbytes = chip->ecc.bytes;
        uint8_t *oob = chip->oob_poi;
-       int steps, size;
+       int steps, size, ret;
 
        for (steps = chip->ecc.steps; steps > 0; steps--) {
-               chip->write_buf(mtd, buf, eccsize);
+               ret = nand_write_data_op(chip, buf, eccsize, false);
+               if (ret)
+                       return ret;
+
                buf += eccsize;
 
                if (chip->ecc.prepad) {
-                       chip->write_buf(mtd, oob, chip->ecc.prepad);
+                       ret = nand_write_data_op(chip, oob, chip->ecc.prepad,
+                                                false);
+                       if (ret)
+                               return ret;
+
                        oob += chip->ecc.prepad;
                }
 
-               chip->write_buf(mtd, oob, eccbytes);
+               ret = nand_write_data_op(chip, oob, eccbytes, false);
+               if (ret)
+                       return ret;
+
                oob += eccbytes;
 
                if (chip->ecc.postpad) {
-                       chip->write_buf(mtd, oob, chip->ecc.postpad);
+                       ret = nand_write_data_op(chip, oob, chip->ecc.postpad,
+                                                false);
+                       if (ret)
+                               return ret;
+
                        oob += chip->ecc.postpad;
                }
        }
 
        size = mtd->oobsize - (oob - chip->oob_poi);
-       if (size)
-               chip->write_buf(mtd, oob, size);
+       if (size) {
+               ret = nand_write_data_op(chip, oob, size, false);
+               if (ret)
+                       return ret;
+       }
 
        return 0;
 }
@@ -2252,17 +2916,24 @@ static int nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
        uint8_t *ecc_calc = chip->buffers->ecccalc;
        const uint8_t *p = buf;
        uint32_t *eccpos = chip->ecc.layout->eccpos;
+       int ret;
 
        for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
                chip->ecc.hwctl(mtd, NAND_ECC_WRITE);
-               chip->write_buf(mtd, p, eccsize);
+
+               ret = nand_write_data_op(chip, p, eccsize, false);
+               if (ret)
+                       return ret;
+
                chip->ecc.calculate(mtd, p, &ecc_calc[i]);
        }
 
        for (i = 0; i < chip->ecc.total; i++)
                chip->oob_poi[eccpos[i]] = ecc_calc[i];
 
-       chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
+       ret = nand_write_data_op(chip, chip->oob_poi, mtd->oobsize, false);
+       if (ret)
+               return ret;
 
        return 0;
 }
@@ -2293,13 +2964,16 @@ static int nand_write_subpage_hwecc(struct mtd_info *mtd,
        uint32_t end_step   = (offset + data_len - 1) / ecc_size;
        int oob_bytes       = mtd->oobsize / ecc_steps;
        int step, i;
+       int ret;
 
        for (step = 0; step < ecc_steps; step++) {
                /* configure controller for WRITE access */
                chip->ecc.hwctl(mtd, NAND_ECC_WRITE);
 
                /* write data (untouched subpages already masked by 0xFF) */
-               chip->write_buf(mtd, buf, ecc_size);
+               ret = nand_write_data_op(chip, buf, ecc_size, false);
+               if (ret)
+                       return ret;
 
                /* mask ECC of un-touched subpages by padding 0xFF */
                if ((step < start_step) || (step > end_step))
@@ -2324,7 +2998,9 @@ static int nand_write_subpage_hwecc(struct mtd_info *mtd,
                chip->oob_poi[eccpos[i]] = ecc_calc[i];
 
        /* write OOB buffer to NAND device */
-       chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
+       ret = nand_write_data_op(chip, chip->oob_poi, mtd->oobsize, false);
+       if (ret)
+               return ret;
 
        return 0;
 }
@@ -2351,31 +3027,49 @@ static int nand_write_page_syndrome(struct mtd_info *mtd,
        int eccsteps = chip->ecc.steps;
        const uint8_t *p = buf;
        uint8_t *oob = chip->oob_poi;
+       int ret;
 
        for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
-
                chip->ecc.hwctl(mtd, NAND_ECC_WRITE);
-               chip->write_buf(mtd, p, eccsize);
+
+               ret = nand_write_data_op(chip, p, eccsize, false);
+               if (ret)
+                       return ret;
 
                if (chip->ecc.prepad) {
-                       chip->write_buf(mtd, oob, chip->ecc.prepad);
+                       ret = nand_write_data_op(chip, oob, chip->ecc.prepad,
+                                                false);
+                       if (ret)
+                               return ret;
+
                        oob += chip->ecc.prepad;
                }
 
                chip->ecc.calculate(mtd, p, oob);
-               chip->write_buf(mtd, oob, eccbytes);
+
+               ret = nand_write_data_op(chip, oob, eccbytes, false);
+               if (ret)
+                       return ret;
+
                oob += eccbytes;
 
                if (chip->ecc.postpad) {
-                       chip->write_buf(mtd, oob, chip->ecc.postpad);
+                       ret = nand_write_data_op(chip, oob, chip->ecc.postpad,
+                                                false);
+                       if (ret)
+                               return ret;
+
                        oob += chip->ecc.postpad;
                }
        }
 
        /* Calculate remaining oob bytes */
        i = mtd->oobsize - (oob - chip->oob_poi);
-       if (i)
-               chip->write_buf(mtd, oob, i);
+       if (i) {
+               ret = nand_write_data_op(chip, oob, i, false);
+               if (ret)
+                       return ret;
+       }
 
        return 0;
 }
@@ -2403,8 +3097,11 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
        else
                subpage = 0;
 
-       if (nand_standard_page_accessors(&chip->ecc))
-               chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page);
+       if (nand_standard_page_accessors(&chip->ecc)) {
+               status = nand_prog_page_begin_op(chip, page, 0, NULL, 0);
+               if (status)
+                       return status;
+       }
 
        if (unlikely(raw))
                status = chip->ecc.write_page_raw(mtd, chip, buf,
@@ -2419,13 +3116,8 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
        if (status < 0)
                return status;
 
-       if (nand_standard_page_accessors(&chip->ecc)) {
-               chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
-
-               status = chip->waitfunc(mtd, chip);
-               if (status & NAND_STATUS_FAIL)
-                       return -EIO;
-       }
+       if (nand_standard_page_accessors(&chip->ecc))
+               return nand_prog_page_end_op(chip);
 
        return 0;
 }
@@ -2785,11 +3477,12 @@ out:
 static int single_erase(struct mtd_info *mtd, int page)
 {
        struct nand_chip *chip = mtd_to_nand(mtd);
+       unsigned int eraseblock;
+
        /* Send commands to erase a block */
-       chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page);
-       chip->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1);
+       eraseblock = page >> (chip->phys_erase_shift - chip->page_shift);
 
-       return chip->waitfunc(mtd, chip);
+       return nand_erase_op(chip, eraseblock);
 }
 
 /**
@@ -2982,9 +3675,6 @@ static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs)
 static int nand_onfi_set_features(struct mtd_info *mtd, struct nand_chip *chip,
                        int addr, uint8_t *subfeature_param)
 {
-       int status;
-       int i;
-
 #ifdef CONFIG_SYS_NAND_ONFI_DETECTION
        if (!chip->onfi_version ||
            !(le16_to_cpu(chip->onfi_params.opt_cmd)
@@ -2992,14 +3682,7 @@ static int nand_onfi_set_features(struct mtd_info *mtd, struct nand_chip *chip,
                return -ENOTSUPP;
 #endif
 
-       chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES, addr, -1);
-       for (i = 0; i < ONFI_SUBFEATURE_PARAM_LEN; ++i)
-               chip->write_byte(mtd, subfeature_param[i]);
-
-       status = chip->waitfunc(mtd, chip);
-       if (status & NAND_STATUS_FAIL)
-               return -EIO;
-       return 0;
+       return nand_set_features_op(chip, addr, subfeature_param);
 }
 
 /**
@@ -3012,8 +3695,6 @@ static int nand_onfi_set_features(struct mtd_info *mtd, struct nand_chip *chip,
 static int nand_onfi_get_features(struct mtd_info *mtd, struct nand_chip *chip,
                        int addr, uint8_t *subfeature_param)
 {
-       int i;
-
 #ifdef CONFIG_SYS_NAND_ONFI_DETECTION
        if (!chip->onfi_version ||
            !(le16_to_cpu(chip->onfi_params.opt_cmd)
@@ -3021,10 +3702,7 @@ static int nand_onfi_get_features(struct mtd_info *mtd, struct nand_chip *chip,
                return -ENOTSUPP;
 #endif
 
-       chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES, addr, -1);
-       for (i = 0; i < ONFI_SUBFEATURE_PARAM_LEN; ++i)
-               *subfeature_param++ = chip->read_byte(mtd);
-       return 0;
+       return nand_get_features_op(chip, addr, subfeature_param);
 }
 
 /* Set default functions */
@@ -3118,7 +3796,7 @@ static int nand_flash_detect_ext_param_page(struct mtd_info *mtd,
        struct onfi_ext_section *s;
        struct onfi_ext_ecc_info *ecc;
        uint8_t *cursor;
-       int ret = -EINVAL;
+       int ret;
        int len;
        int i;
 
@@ -3128,14 +3806,18 @@ static int nand_flash_detect_ext_param_page(struct mtd_info *mtd,
                return -ENOMEM;
 
        /* Send our own NAND_CMD_PARAM. */
-       chip->cmdfunc(mtd, NAND_CMD_PARAM, 0, -1);
+       ret = nand_read_param_page_op(chip, 0, NULL, 0);
+       if (ret)
+               goto ext_out;
 
        /* Use the Change Read Column command to skip the ONFI param pages. */
-       chip->cmdfunc(mtd, NAND_CMD_RNDOUT,
-                       sizeof(*p) * p->num_of_param_pages , -1);
+       ret = nand_change_read_column_op(chip,
+                                        sizeof(*p) * p->num_of_param_pages,
+                                        ep, len, true);
+       if (ret)
+               goto ext_out;
 
-       /* Read out the Extended Parameter Page. */
-       chip->read_buf(mtd, (uint8_t *)ep, len);
+       ret = -EINVAL;
        if ((onfi_crc16(ONFI_CRC_BASE, ((uint8_t *)ep) + 2, len - 2)
                != le16_to_cpu(ep->crc))) {
                pr_debug("fail in the CRC.\n");
@@ -3212,19 +3894,23 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,
                                        int *busw)
 {
        struct nand_onfi_params *p = &chip->onfi_params;
-       int i, j;
-       int val;
+       char id[4];
+       int i, ret, val;
 
        /* Try ONFI for unknown chip or LP */
-       chip->cmdfunc(mtd, NAND_CMD_READID, 0x20, -1);
-       if (chip->read_byte(mtd) != 'O' || chip->read_byte(mtd) != 'N' ||
-               chip->read_byte(mtd) != 'F' || chip->read_byte(mtd) != 'I')
+       ret = nand_readid_op(chip, 0x20, id, sizeof(id));
+       if (ret || strncmp(id, "ONFI", 4))
+               return 0;
+
+       ret = nand_read_param_page_op(chip, 0, NULL, 0);
+       if (ret)
                return 0;
 
-       chip->cmdfunc(mtd, NAND_CMD_PARAM, 0, -1);
        for (i = 0; i < 3; i++) {
-               for (j = 0; j < sizeof(*p); j++)
-                       ((uint8_t *)p)[j] = chip->read_byte(mtd);
+               ret = nand_read_data_op(chip, p, sizeof(*p), true);
+               if (ret)
+                       return 0;
+
                if (onfi_crc16(ONFI_CRC_BASE, (uint8_t *)p, 254) ==
                                le16_to_cpu(p->crc)) {
                        break;
@@ -3324,20 +4010,22 @@ static int nand_flash_detect_jedec(struct mtd_info *mtd, struct nand_chip *chip,
 {
        struct nand_jedec_params *p = &chip->jedec_params;
        struct jedec_ecc_info *ecc;
-       int val;
-       int i, j;
+       char id[5];
+       int i, val, ret;
 
        /* Try JEDEC for unknown chip or LP */
-       chip->cmdfunc(mtd, NAND_CMD_READID, 0x40, -1);
-       if (chip->read_byte(mtd) != 'J' || chip->read_byte(mtd) != 'E' ||
-               chip->read_byte(mtd) != 'D' || chip->read_byte(mtd) != 'E' ||
-               chip->read_byte(mtd) != 'C')
+       ret = nand_readid_op(chip, 0x40, id, sizeof(id));
+       if (ret || strncmp(id, "JEDEC", sizeof(id)))
+               return 0;
+
+       ret = nand_read_param_page_op(chip, 0x40, NULL, 0);
+       if (ret)
                return 0;
 
-       chip->cmdfunc(mtd, NAND_CMD_PARAM, 0x40, -1);
        for (i = 0; i < 3; i++) {
-               for (j = 0; j < sizeof(*p); j++)
-                       ((uint8_t *)p)[j] = chip->read_byte(mtd);
+               ret = nand_read_data_op(chip, p, sizeof(*p), true);
+               if (ret)
+                       return 0;
 
                if (onfi_crc16(ONFI_CRC_BASE, (uint8_t *)p, 510) ==
                                le16_to_cpu(p->crc))
@@ -3708,25 +4396,29 @@ struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
                                                  int *maf_id, int *dev_id,
                                                  struct nand_flash_dev *type)
 {
-       int busw;
-       int i, maf_idx;
+       int busw, ret;
+       int maf_idx;
        u8 id_data[8];
 
        /*
         * Reset the chip, required by some chips (e.g. Micron MT29FxGxxxxx)
         * after power-up.
         */
-       nand_reset(chip, 0);
+       ret = nand_reset(chip, 0);
+       if (ret)
+               return ERR_PTR(ret);
 
        /* Select the device */
        chip->select_chip(mtd, 0);
 
        /* Send the command for reading device ID */
-       chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
+       ret = nand_readid_op(chip, 0, id_data, 2);
+       if (ret)
+               return ERR_PTR(ret);
 
        /* Read manufacturer and device IDs */
-       *maf_id = chip->read_byte(mtd);
-       *dev_id = chip->read_byte(mtd);
+       *maf_id = id_data[0];
+       *dev_id = id_data[1];
 
        /*
         * Try again to make sure, as some systems the bus-hold or other
@@ -3735,11 +4427,10 @@ struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
         * not match, ignore the device completely.
         */
 
-       chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
-
        /* Read entire ID string */
-       for (i = 0; i < 8; i++)
-               id_data[i] = chip->read_byte(mtd);
+       ret = nand_readid_op(chip, 0, id_data, 8);
+       if (ret)
+               return ERR_PTR(ret);
 
        if (id_data[0] != *maf_id || id_data[1] != *dev_id) {
                pr_info("second ID read did not match %02x,%02x against %02x,%02x\n",
@@ -3999,15 +4690,17 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
 
        /* Check for a chip array */
        for (i = 1; i < maxchips; i++) {
+               u8 id[2];
+
                /* See comment in nand_get_flash_type for reset */
                nand_reset(chip, i);
 
                chip->select_chip(mtd, i);
                /* Send the command for reading device ID */
-               chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
+               nand_readid_op(chip, 0, id, sizeof(id));
+
                /* Read manufacturer and device IDs */
-               if (nand_maf_id != chip->read_byte(mtd) ||
-                   nand_dev_id != chip->read_byte(mtd)) {
+               if (nand_maf_id != id[0] || nand_dev_id != id[1]) {
                        chip->select_chip(mtd, -1);
                        break;
                }
diff --git a/drivers/mtd/nand/raw/stm32_fmc2_nand.c b/drivers/mtd/nand/raw/stm32_fmc2_nand.c
new file mode 100644 (file)
index 0000000..2bb749d
--- /dev/null
@@ -0,0 +1,1092 @@
+// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
+/*
+ * Copyright (C) STMicroelectronics 2019
+ * Author: Christophe Kerello <christophe.kerello@st.com>
+ */
+
+#include <common.h>
+#include <clk.h>
+#include <dm.h>
+#include <nand.h>
+#include <reset.h>
+#include <linux/iopoll.h>
+#include <linux/ioport.h>
+
+/* Bad block marker length */
+#define FMC2_BBM_LEN                   2
+
+/* ECC step size */
+#define FMC2_ECC_STEP_SIZE             512
+
+/* Command delay */
+#define FMC2_RB_DELAY_US               30
+
+/* Max chip enable */
+#define FMC2_MAX_CE                    2
+
+/* Timings */
+#define FMC2_THIZ                      1
+#define FMC2_TIO                       8000
+#define FMC2_TSYNC                     3000
+#define FMC2_PCR_TIMING_MASK           0xf
+#define FMC2_PMEM_PATT_TIMING_MASK     0xff
+
+/* FMC2 Controller Registers */
+#define FMC2_BCR1                      0x0
+#define FMC2_PCR                       0x80
+#define FMC2_SR                                0x84
+#define FMC2_PMEM                      0x88
+#define FMC2_PATT                      0x8c
+#define FMC2_HECCR                     0x94
+#define FMC2_BCHISR                    0x254
+#define FMC2_BCHICR                    0x258
+#define FMC2_BCHPBR1                   0x260
+#define FMC2_BCHPBR2                   0x264
+#define FMC2_BCHPBR3                   0x268
+#define FMC2_BCHPBR4                   0x26c
+#define FMC2_BCHDSR0                   0x27c
+#define FMC2_BCHDSR1                   0x280
+#define FMC2_BCHDSR2                   0x284
+#define FMC2_BCHDSR3                   0x288
+#define FMC2_BCHDSR4                   0x28c
+
+/* Register: FMC2_BCR1 */
+#define FMC2_BCR1_FMC2EN               BIT(31)
+
+/* Register: FMC2_PCR */
+#define FMC2_PCR_PWAITEN               BIT(1)
+#define FMC2_PCR_PBKEN                 BIT(2)
+#define FMC2_PCR_PWID_MASK             GENMASK(5, 4)
+#define FMC2_PCR_PWID(x)               (((x) & 0x3) << 4)
+#define FMC2_PCR_PWID_BUSWIDTH_8       0
+#define FMC2_PCR_PWID_BUSWIDTH_16      1
+#define FMC2_PCR_ECCEN                 BIT(6)
+#define FMC2_PCR_ECCALG                        BIT(8)
+#define FMC2_PCR_TCLR_MASK             GENMASK(12, 9)
+#define FMC2_PCR_TCLR(x)               (((x) & 0xf) << 9)
+#define FMC2_PCR_TCLR_DEFAULT          0xf
+#define FMC2_PCR_TAR_MASK              GENMASK(16, 13)
+#define FMC2_PCR_TAR(x)                        (((x) & 0xf) << 13)
+#define FMC2_PCR_TAR_DEFAULT           0xf
+#define FMC2_PCR_ECCSS_MASK            GENMASK(19, 17)
+#define FMC2_PCR_ECCSS(x)              (((x) & 0x7) << 17)
+#define FMC2_PCR_ECCSS_512             1
+#define FMC2_PCR_ECCSS_2048            3
+#define FMC2_PCR_BCHECC                        BIT(24)
+#define FMC2_PCR_WEN                   BIT(25)
+
+/* Register: FMC2_SR */
+#define FMC2_SR_NWRF                   BIT(6)
+
+/* Register: FMC2_PMEM */
+#define FMC2_PMEM_MEMSET(x)            (((x) & 0xff) << 0)
+#define FMC2_PMEM_MEMWAIT(x)           (((x) & 0xff) << 8)
+#define FMC2_PMEM_MEMHOLD(x)           (((x) & 0xff) << 16)
+#define FMC2_PMEM_MEMHIZ(x)            (((x) & 0xff) << 24)
+#define FMC2_PMEM_DEFAULT              0x0a0a0a0a
+
+/* Register: FMC2_PATT */
+#define FMC2_PATT_ATTSET(x)            (((x) & 0xff) << 0)
+#define FMC2_PATT_ATTWAIT(x)           (((x) & 0xff) << 8)
+#define FMC2_PATT_ATTHOLD(x)           (((x) & 0xff) << 16)
+#define FMC2_PATT_ATTHIZ(x)            (((x) & 0xff) << 24)
+#define FMC2_PATT_DEFAULT              0x0a0a0a0a
+
+/* Register: FMC2_BCHISR */
+#define FMC2_BCHISR_DERF               BIT(1)
+#define FMC2_BCHISR_EPBRF              BIT(4)
+
+/* Register: FMC2_BCHICR */
+#define FMC2_BCHICR_CLEAR_IRQ          GENMASK(4, 0)
+
+/* Register: FMC2_BCHDSR0 */
+#define FMC2_BCHDSR0_DUE               BIT(0)
+#define FMC2_BCHDSR0_DEF               BIT(1)
+#define FMC2_BCHDSR0_DEN_MASK          GENMASK(7, 4)
+#define FMC2_BCHDSR0_DEN_SHIFT         4
+
+/* Register: FMC2_BCHDSR1 */
+#define FMC2_BCHDSR1_EBP1_MASK         GENMASK(12, 0)
+#define FMC2_BCHDSR1_EBP2_MASK         GENMASK(28, 16)
+#define FMC2_BCHDSR1_EBP2_SHIFT                16
+
+/* Register: FMC2_BCHDSR2 */
+#define FMC2_BCHDSR2_EBP3_MASK         GENMASK(12, 0)
+#define FMC2_BCHDSR2_EBP4_MASK         GENMASK(28, 16)
+#define FMC2_BCHDSR2_EBP4_SHIFT                16
+
+/* Register: FMC2_BCHDSR3 */
+#define FMC2_BCHDSR3_EBP5_MASK         GENMASK(12, 0)
+#define FMC2_BCHDSR3_EBP6_MASK         GENMASK(28, 16)
+#define FMC2_BCHDSR3_EBP6_SHIFT                16
+
+/* Register: FMC2_BCHDSR4 */
+#define FMC2_BCHDSR4_EBP7_MASK         GENMASK(12, 0)
+#define FMC2_BCHDSR4_EBP8_MASK         GENMASK(28, 16)
+#define FMC2_BCHDSR4_EBP8_SHIFT                16
+
+#define FMC2_NSEC_PER_SEC              1000000000L
+
+enum stm32_fmc2_ecc {
+       FMC2_ECC_HAM = 1,
+       FMC2_ECC_BCH4 = 4,
+       FMC2_ECC_BCH8 = 8
+};
+
+struct stm32_fmc2_timings {
+       u8 tclr;
+       u8 tar;
+       u8 thiz;
+       u8 twait;
+       u8 thold_mem;
+       u8 tset_mem;
+       u8 thold_att;
+       u8 tset_att;
+};
+
+struct stm32_fmc2_nand {
+       struct nand_chip chip;
+       struct stm32_fmc2_timings timings;
+       int ncs;
+       int cs_used[FMC2_MAX_CE];
+};
+
+static inline struct stm32_fmc2_nand *to_fmc2_nand(struct nand_chip *chip)
+{
+       return container_of(chip, struct stm32_fmc2_nand, chip);
+}
+
+struct stm32_fmc2_nfc {
+       struct nand_hw_control base;
+       struct stm32_fmc2_nand nand;
+       struct nand_ecclayout ecclayout;
+       void __iomem *io_base;
+       void __iomem *data_base[FMC2_MAX_CE];
+       void __iomem *cmd_base[FMC2_MAX_CE];
+       void __iomem *addr_base[FMC2_MAX_CE];
+       struct clk clk;
+
+       u8 cs_assigned;
+       int cs_sel;
+};
+
+static inline struct stm32_fmc2_nfc *to_stm32_nfc(struct nand_hw_control *base)
+{
+       return container_of(base, struct stm32_fmc2_nfc, base);
+}
+
+/* Timings configuration */
+static void stm32_fmc2_timings_init(struct nand_chip *chip)
+{
+       struct stm32_fmc2_nfc *fmc2 = to_stm32_nfc(chip->controller);
+       struct stm32_fmc2_nand *nand = to_fmc2_nand(chip);
+       struct stm32_fmc2_timings *timings = &nand->timings;
+       u32 pcr = readl(fmc2->io_base + FMC2_PCR);
+       u32 pmem, patt;
+
+       /* Set tclr/tar timings */
+       pcr &= ~FMC2_PCR_TCLR_MASK;
+       pcr |= FMC2_PCR_TCLR(timings->tclr);
+       pcr &= ~FMC2_PCR_TAR_MASK;
+       pcr |= FMC2_PCR_TAR(timings->tar);
+
+       /* Set tset/twait/thold/thiz timings in common bank */
+       pmem = FMC2_PMEM_MEMSET(timings->tset_mem);
+       pmem |= FMC2_PMEM_MEMWAIT(timings->twait);
+       pmem |= FMC2_PMEM_MEMHOLD(timings->thold_mem);
+       pmem |= FMC2_PMEM_MEMHIZ(timings->thiz);
+
+       /* Set tset/twait/thold/thiz timings in attribut bank */
+       patt = FMC2_PATT_ATTSET(timings->tset_att);
+       patt |= FMC2_PATT_ATTWAIT(timings->twait);
+       patt |= FMC2_PATT_ATTHOLD(timings->thold_att);
+       patt |= FMC2_PATT_ATTHIZ(timings->thiz);
+
+       writel(pcr, fmc2->io_base + FMC2_PCR);
+       writel(pmem, fmc2->io_base + FMC2_PMEM);
+       writel(patt, fmc2->io_base + FMC2_PATT);
+}
+
+/* Controller configuration */
+static void stm32_fmc2_setup(struct nand_chip *chip)
+{
+       struct stm32_fmc2_nfc *fmc2 = to_stm32_nfc(chip->controller);
+       u32 pcr = readl(fmc2->io_base + FMC2_PCR);
+
+       /* Configure ECC algorithm (default configuration is Hamming) */
+       pcr &= ~FMC2_PCR_ECCALG;
+       pcr &= ~FMC2_PCR_BCHECC;
+       if (chip->ecc.strength == FMC2_ECC_BCH8) {
+               pcr |= FMC2_PCR_ECCALG;
+               pcr |= FMC2_PCR_BCHECC;
+       } else if (chip->ecc.strength == FMC2_ECC_BCH4) {
+               pcr |= FMC2_PCR_ECCALG;
+       }
+
+       /* Set buswidth */
+       pcr &= ~FMC2_PCR_PWID_MASK;
+       if (chip->options & NAND_BUSWIDTH_16)
+               pcr |= FMC2_PCR_PWID(FMC2_PCR_PWID_BUSWIDTH_16);
+
+       /* Set ECC sector size */
+       pcr &= ~FMC2_PCR_ECCSS_MASK;
+       pcr |= FMC2_PCR_ECCSS(FMC2_PCR_ECCSS_512);
+
+       writel(pcr, fmc2->io_base + FMC2_PCR);
+}
+
+/* Select target */
+static void stm32_fmc2_select_chip(struct mtd_info *mtd, int chipnr)
+{
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       struct stm32_fmc2_nfc *fmc2 = to_stm32_nfc(chip->controller);
+       struct stm32_fmc2_nand *nand = to_fmc2_nand(chip);
+
+       if (chipnr < 0 || chipnr >= nand->ncs)
+               return;
+
+       if (nand->cs_used[chipnr] == fmc2->cs_sel)
+               return;
+
+       fmc2->cs_sel = nand->cs_used[chipnr];
+       chip->IO_ADDR_R = fmc2->data_base[fmc2->cs_sel];
+       chip->IO_ADDR_W = fmc2->data_base[fmc2->cs_sel];
+
+       /* FMC2 setup routine */
+       stm32_fmc2_setup(chip);
+
+       /* Apply timings */
+       stm32_fmc2_timings_init(chip);
+}
+
+/* Set bus width to 16-bit or 8-bit */
+static void stm32_fmc2_set_buswidth_16(struct stm32_fmc2_nfc *fmc2, bool set)
+{
+       u32 pcr = readl(fmc2->io_base + FMC2_PCR);
+
+       pcr &= ~FMC2_PCR_PWID_MASK;
+       if (set)
+               pcr |= FMC2_PCR_PWID(FMC2_PCR_PWID_BUSWIDTH_16);
+       writel(pcr, fmc2->io_base + FMC2_PCR);
+}
+
+/* Enable/disable ECC */
+static void stm32_fmc2_set_ecc(struct stm32_fmc2_nfc *fmc2, bool enable)
+{
+       u32 pcr = readl(fmc2->io_base + FMC2_PCR);
+
+       pcr &= ~FMC2_PCR_ECCEN;
+       if (enable)
+               pcr |= FMC2_PCR_ECCEN;
+       writel(pcr, fmc2->io_base + FMC2_PCR);
+}
+
+/* Clear irq sources in case of bch is used */
+static inline void stm32_fmc2_clear_bch_irq(struct stm32_fmc2_nfc *fmc2)
+{
+       writel(FMC2_BCHICR_CLEAR_IRQ, fmc2->io_base + FMC2_BCHICR);
+}
+
+/* Send command and address cycles */
+static void stm32_fmc2_cmd_ctrl(struct mtd_info *mtd, int cmd,
+                               unsigned int ctrl)
+{
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       struct stm32_fmc2_nfc *fmc2 = to_stm32_nfc(chip->controller);
+
+       if (cmd == NAND_CMD_NONE)
+               return;
+
+       if (ctrl & NAND_CLE) {
+               writeb(cmd, fmc2->cmd_base[fmc2->cs_sel]);
+               return;
+       }
+
+       writeb(cmd, fmc2->addr_base[fmc2->cs_sel]);
+}
+
+/*
+ * Enable ECC logic and reset syndrome/parity bits previously calculated
+ * Syndrome/parity bits is cleared by setting the ECCEN bit to 0
+ */
+static void stm32_fmc2_hwctl(struct mtd_info *mtd, int mode)
+{
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       struct stm32_fmc2_nfc *fmc2 = to_stm32_nfc(chip->controller);
+
+       stm32_fmc2_set_ecc(fmc2, false);
+
+       if (chip->ecc.strength != FMC2_ECC_HAM) {
+               u32 pcr = readl(fmc2->io_base + FMC2_PCR);
+
+               if (mode == NAND_ECC_WRITE)
+                       pcr |= FMC2_PCR_WEN;
+               else
+                       pcr &= ~FMC2_PCR_WEN;
+               writel(pcr, fmc2->io_base + FMC2_PCR);
+
+               stm32_fmc2_clear_bch_irq(fmc2);
+       }
+
+       stm32_fmc2_set_ecc(fmc2, true);
+}
+
+/*
+ * ECC Hamming calculation
+ * ECC is 3 bytes for 512 bytes of data (supports error correction up to
+ * max of 1-bit)
+ */
+static int stm32_fmc2_ham_calculate(struct mtd_info *mtd, const u8 *data,
+                                   u8 *ecc)
+{
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       struct stm32_fmc2_nfc *fmc2 = to_stm32_nfc(chip->controller);
+       u32 heccr, sr;
+       int ret;
+
+       ret = readl_poll_timeout(fmc2->io_base + FMC2_SR, sr,
+                                sr & FMC2_SR_NWRF, 10000);
+       if (ret < 0) {
+               pr_err("Ham timeout\n");
+               return ret;
+       }
+
+       heccr = readl(fmc2->io_base + FMC2_HECCR);
+
+       ecc[0] = heccr;
+       ecc[1] = heccr >> 8;
+       ecc[2] = heccr >> 16;
+
+       /* Disable ecc */
+       stm32_fmc2_set_ecc(fmc2, false);
+
+       return 0;
+}
+
+static int stm32_fmc2_ham_correct(struct mtd_info *mtd, u8 *dat,
+                                 u8 *read_ecc, u8 *calc_ecc)
+{
+       u8 bit_position = 0, b0, b1, b2;
+       u32 byte_addr = 0, b;
+       u32 i, shifting = 1;
+
+       /* Indicate which bit and byte is faulty (if any) */
+       b0 = read_ecc[0] ^ calc_ecc[0];
+       b1 = read_ecc[1] ^ calc_ecc[1];
+       b2 = read_ecc[2] ^ calc_ecc[2];
+       b = b0 | (b1 << 8) | (b2 << 16);
+
+       /* No errors */
+       if (likely(!b))
+               return 0;
+
+       /* Calculate bit position */
+       for (i = 0; i < 3; i++) {
+               switch (b % 4) {
+               case 2:
+                       bit_position += shifting;
+               case 1:
+                       break;
+               default:
+                       return -EBADMSG;
+               }
+               shifting <<= 1;
+               b >>= 2;
+       }
+
+       /* Calculate byte position */
+       shifting = 1;
+       for (i = 0; i < 9; i++) {
+               switch (b % 4) {
+               case 2:
+                       byte_addr += shifting;
+               case 1:
+                       break;
+               default:
+                       return -EBADMSG;
+               }
+               shifting <<= 1;
+               b >>= 2;
+       }
+
+       /* Flip the bit */
+       dat[byte_addr] ^= (1 << bit_position);
+
+       return 1;
+}
+
+/*
+ * ECC BCH calculation and correction
+ * ECC is 7/13 bytes for 512 bytes of data (supports error correction up to
+ * max of 4-bit/8-bit)
+ */
+
+static int stm32_fmc2_bch_calculate(struct mtd_info *mtd, const u8 *data,
+                                   u8 *ecc)
+{
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       struct stm32_fmc2_nfc *fmc2 = to_stm32_nfc(chip->controller);
+       u32 bchpbr, bchisr;
+       int ret;
+
+       /* Wait until the BCH code is ready */
+       ret = readl_poll_timeout(fmc2->io_base + FMC2_BCHISR, bchisr,
+                                bchisr & FMC2_BCHISR_EPBRF, 10000);
+       if (ret < 0) {
+               pr_err("Bch timeout\n");
+               return ret;
+       }
+
+       /* Read parity bits */
+       bchpbr = readl(fmc2->io_base + FMC2_BCHPBR1);
+       ecc[0] = bchpbr;
+       ecc[1] = bchpbr >> 8;
+       ecc[2] = bchpbr >> 16;
+       ecc[3] = bchpbr >> 24;
+
+       bchpbr = readl(fmc2->io_base + FMC2_BCHPBR2);
+       ecc[4] = bchpbr;
+       ecc[5] = bchpbr >> 8;
+       ecc[6] = bchpbr >> 16;
+
+       if (chip->ecc.strength == FMC2_ECC_BCH8) {
+               ecc[7] = bchpbr >> 24;
+
+               bchpbr = readl(fmc2->io_base + FMC2_BCHPBR3);
+               ecc[8] = bchpbr;
+               ecc[9] = bchpbr >> 8;
+               ecc[10] = bchpbr >> 16;
+               ecc[11] = bchpbr >> 24;
+
+               bchpbr = readl(fmc2->io_base + FMC2_BCHPBR4);
+               ecc[12] = bchpbr;
+       }
+
+       /* Disable ecc */
+       stm32_fmc2_set_ecc(fmc2, false);
+
+       return 0;
+}
+
+/* BCH algorithm correction */
+static int stm32_fmc2_bch_correct(struct mtd_info *mtd, u8 *dat,
+                                 u8 *read_ecc, u8 *calc_ecc)
+{
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       struct stm32_fmc2_nfc *fmc2 = to_stm32_nfc(chip->controller);
+       u32 bchdsr0, bchdsr1, bchdsr2, bchdsr3, bchdsr4, bchisr;
+       u16 pos[8];
+       int i, ret, den, eccsize = chip->ecc.size;
+       unsigned int nb_errs = 0;
+
+       /* Wait until the decoding error is ready */
+       ret = readl_poll_timeout(fmc2->io_base + FMC2_BCHISR, bchisr,
+                                bchisr & FMC2_BCHISR_DERF, 10000);
+       if (ret < 0) {
+               pr_err("Bch timeout\n");
+               return ret;
+       }
+
+       bchdsr0 = readl(fmc2->io_base + FMC2_BCHDSR0);
+       bchdsr1 = readl(fmc2->io_base + FMC2_BCHDSR1);
+       bchdsr2 = readl(fmc2->io_base + FMC2_BCHDSR2);
+       bchdsr3 = readl(fmc2->io_base + FMC2_BCHDSR3);
+       bchdsr4 = readl(fmc2->io_base + FMC2_BCHDSR4);
+
+       /* Disable ECC */
+       stm32_fmc2_set_ecc(fmc2, false);
+
+       /* No errors found */
+       if (likely(!(bchdsr0 & FMC2_BCHDSR0_DEF)))
+               return 0;
+
+       /* Too many errors detected */
+       if (unlikely(bchdsr0 & FMC2_BCHDSR0_DUE))
+               return -EBADMSG;
+
+       pos[0] = bchdsr1 & FMC2_BCHDSR1_EBP1_MASK;
+       pos[1] = (bchdsr1 & FMC2_BCHDSR1_EBP2_MASK) >> FMC2_BCHDSR1_EBP2_SHIFT;
+       pos[2] = bchdsr2 & FMC2_BCHDSR2_EBP3_MASK;
+       pos[3] = (bchdsr2 & FMC2_BCHDSR2_EBP4_MASK) >> FMC2_BCHDSR2_EBP4_SHIFT;
+       pos[4] = bchdsr3 & FMC2_BCHDSR3_EBP5_MASK;
+       pos[5] = (bchdsr3 & FMC2_BCHDSR3_EBP6_MASK) >> FMC2_BCHDSR3_EBP6_SHIFT;
+       pos[6] = bchdsr4 & FMC2_BCHDSR4_EBP7_MASK;
+       pos[7] = (bchdsr4 & FMC2_BCHDSR4_EBP8_MASK) >> FMC2_BCHDSR4_EBP8_SHIFT;
+
+       den = (bchdsr0 & FMC2_BCHDSR0_DEN_MASK) >> FMC2_BCHDSR0_DEN_SHIFT;
+       for (i = 0; i < den; i++) {
+               if (pos[i] < eccsize * 8) {
+                       __change_bit(pos[i], (unsigned long *)dat);
+                       nb_errs++;
+               }
+       }
+
+       return nb_errs;
+}
+
+static int stm32_fmc2_read_page(struct mtd_info *mtd,
+                               struct nand_chip *chip, u8 *buf,
+                               int oob_required, int page)
+{
+       int i, s, stat, eccsize = chip->ecc.size;
+       int eccbytes = chip->ecc.bytes;
+       int eccsteps = chip->ecc.steps;
+       int eccstrength = chip->ecc.strength;
+       u8 *p = buf;
+       u8 *ecc_calc = chip->buffers->ecccalc;
+       u8 *ecc_code = chip->buffers->ecccode;
+       unsigned int max_bitflips = 0;
+
+       for (i = mtd->writesize + FMC2_BBM_LEN, s = 0; s < eccsteps;
+            s++, i += eccbytes, p += eccsize) {
+               chip->ecc.hwctl(mtd, NAND_ECC_READ);
+
+               /* Read the nand page sector (512 bytes) */
+               chip->cmdfunc(mtd, NAND_CMD_RNDOUT, s * eccsize, -1);
+               chip->read_buf(mtd, p, eccsize);
+
+               /* Read the corresponding ECC bytes */
+               chip->cmdfunc(mtd, NAND_CMD_RNDOUT, i, -1);
+               chip->read_buf(mtd, ecc_code, eccbytes);
+
+               /* Correct the data */
+               stat = chip->ecc.correct(mtd, p, ecc_code, ecc_calc);
+               if (stat == -EBADMSG)
+                       /* Check for empty pages with bitflips */
+                       stat = nand_check_erased_ecc_chunk(p, eccsize,
+                                                          ecc_code, eccbytes,
+                                                          NULL, 0,
+                                                          eccstrength);
+
+               if (stat < 0) {
+                       mtd->ecc_stats.failed++;
+               } else {
+                       mtd->ecc_stats.corrected += stat;
+                       max_bitflips = max_t(unsigned int, max_bitflips, stat);
+               }
+       }
+
+       /* Read oob */
+       if (oob_required) {
+               chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize, -1);
+               chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
+       }
+
+       return max_bitflips;
+}
+
+/* Controller initialization */
+static void stm32_fmc2_init(struct stm32_fmc2_nfc *fmc2)
+{
+       u32 pcr = readl(fmc2->io_base + FMC2_PCR);
+       u32 bcr1 = readl(fmc2->io_base + FMC2_BCR1);
+
+       /* Set CS used to undefined */
+       fmc2->cs_sel = -1;
+
+       /* Enable wait feature and nand flash memory bank */
+       pcr |= FMC2_PCR_PWAITEN;
+       pcr |= FMC2_PCR_PBKEN;
+
+       /* Set buswidth to 8 bits mode for identification */
+       pcr &= ~FMC2_PCR_PWID_MASK;
+
+       /* ECC logic is disabled */
+       pcr &= ~FMC2_PCR_ECCEN;
+
+       /* Default mode */
+       pcr &= ~FMC2_PCR_ECCALG;
+       pcr &= ~FMC2_PCR_BCHECC;
+       pcr &= ~FMC2_PCR_WEN;
+
+       /* Set default ECC sector size */
+       pcr &= ~FMC2_PCR_ECCSS_MASK;
+       pcr |= FMC2_PCR_ECCSS(FMC2_PCR_ECCSS_2048);
+
+       /* Set default tclr/tar timings */
+       pcr &= ~FMC2_PCR_TCLR_MASK;
+       pcr |= FMC2_PCR_TCLR(FMC2_PCR_TCLR_DEFAULT);
+       pcr &= ~FMC2_PCR_TAR_MASK;
+       pcr |= FMC2_PCR_TAR(FMC2_PCR_TAR_DEFAULT);
+
+       /* Enable FMC2 controller */
+       bcr1 |= FMC2_BCR1_FMC2EN;
+
+       writel(bcr1, fmc2->io_base + FMC2_BCR1);
+       writel(pcr, fmc2->io_base + FMC2_PCR);
+       writel(FMC2_PMEM_DEFAULT, fmc2->io_base + FMC2_PMEM);
+       writel(FMC2_PATT_DEFAULT, fmc2->io_base + FMC2_PATT);
+}
+
+/* Controller timings */
+static void stm32_fmc2_calc_timings(struct nand_chip *chip,
+                                   const struct nand_sdr_timings *sdrt)
+{
+       struct stm32_fmc2_nfc *fmc2 = to_stm32_nfc(chip->controller);
+       struct stm32_fmc2_nand *nand = to_fmc2_nand(chip);
+       struct stm32_fmc2_timings *tims = &nand->timings;
+       unsigned long hclk = clk_get_rate(&fmc2->clk);
+       unsigned long hclkp = FMC2_NSEC_PER_SEC / (hclk / 1000);
+       int tar, tclr, thiz, twait, tset_mem, tset_att, thold_mem, thold_att;
+
+       tar = hclkp;
+       if (tar < sdrt->tAR_min)
+               tar = sdrt->tAR_min;
+       tims->tar = DIV_ROUND_UP(tar, hclkp) - 1;
+       if (tims->tar > FMC2_PCR_TIMING_MASK)
+               tims->tar = FMC2_PCR_TIMING_MASK;
+
+       tclr = hclkp;
+       if (tclr < sdrt->tCLR_min)
+               tclr = sdrt->tCLR_min;
+       tims->tclr = DIV_ROUND_UP(tclr, hclkp) - 1;
+       if (tims->tclr > FMC2_PCR_TIMING_MASK)
+               tims->tclr = FMC2_PCR_TIMING_MASK;
+
+       tims->thiz = FMC2_THIZ;
+       thiz = (tims->thiz + 1) * hclkp;
+
+       /*
+        * tWAIT > tRP
+        * tWAIT > tWP
+        * tWAIT > tREA + tIO
+        */
+       twait = hclkp;
+       if (twait < sdrt->tRP_min)
+               twait = sdrt->tRP_min;
+       if (twait < sdrt->tWP_min)
+               twait = sdrt->tWP_min;
+       if (twait < sdrt->tREA_max + FMC2_TIO)
+               twait = sdrt->tREA_max + FMC2_TIO;
+       tims->twait = DIV_ROUND_UP(twait, hclkp);
+       if (tims->twait == 0)
+               tims->twait = 1;
+       else if (tims->twait > FMC2_PMEM_PATT_TIMING_MASK)
+               tims->twait = FMC2_PMEM_PATT_TIMING_MASK;
+
+       /*
+        * tSETUP_MEM > tCS - tWAIT
+        * tSETUP_MEM > tALS - tWAIT
+        * tSETUP_MEM > tDS - (tWAIT - tHIZ)
+        */
+       tset_mem = hclkp;
+       if (sdrt->tCS_min > twait && (tset_mem < sdrt->tCS_min - twait))
+               tset_mem = sdrt->tCS_min - twait;
+       if (sdrt->tALS_min > twait && (tset_mem < sdrt->tALS_min - twait))
+               tset_mem = sdrt->tALS_min - twait;
+       if (twait > thiz && (sdrt->tDS_min > twait - thiz) &&
+           (tset_mem < sdrt->tDS_min - (twait - thiz)))
+               tset_mem = sdrt->tDS_min - (twait - thiz);
+       tims->tset_mem = DIV_ROUND_UP(tset_mem, hclkp);
+       if (tims->tset_mem == 0)
+               tims->tset_mem = 1;
+       else if (tims->tset_mem > FMC2_PMEM_PATT_TIMING_MASK)
+               tims->tset_mem = FMC2_PMEM_PATT_TIMING_MASK;
+
+       /*
+        * tHOLD_MEM > tCH
+        * tHOLD_MEM > tREH - tSETUP_MEM
+        * tHOLD_MEM > max(tRC, tWC) - (tSETUP_MEM + tWAIT)
+        */
+       thold_mem = hclkp;
+       if (thold_mem < sdrt->tCH_min)
+               thold_mem = sdrt->tCH_min;
+       if (sdrt->tREH_min > tset_mem &&
+           (thold_mem < sdrt->tREH_min - tset_mem))
+               thold_mem = sdrt->tREH_min - tset_mem;
+       if ((sdrt->tRC_min > tset_mem + twait) &&
+           (thold_mem < sdrt->tRC_min - (tset_mem + twait)))
+               thold_mem = sdrt->tRC_min - (tset_mem + twait);
+       if ((sdrt->tWC_min > tset_mem + twait) &&
+           (thold_mem < sdrt->tWC_min - (tset_mem + twait)))
+               thold_mem = sdrt->tWC_min - (tset_mem + twait);
+       tims->thold_mem = DIV_ROUND_UP(thold_mem, hclkp);
+       if (tims->thold_mem == 0)
+               tims->thold_mem = 1;
+       else if (tims->thold_mem > FMC2_PMEM_PATT_TIMING_MASK)
+               tims->thold_mem = FMC2_PMEM_PATT_TIMING_MASK;
+
+       /*
+        * tSETUP_ATT > tCS - tWAIT
+        * tSETUP_ATT > tCLS - tWAIT
+        * tSETUP_ATT > tALS - tWAIT
+        * tSETUP_ATT > tRHW - tHOLD_MEM
+        * tSETUP_ATT > tDS - (tWAIT - tHIZ)
+        */
+       tset_att = hclkp;
+       if (sdrt->tCS_min > twait && (tset_att < sdrt->tCS_min - twait))
+               tset_att = sdrt->tCS_min - twait;
+       if (sdrt->tCLS_min > twait && (tset_att < sdrt->tCLS_min - twait))
+               tset_att = sdrt->tCLS_min - twait;
+       if (sdrt->tALS_min > twait && (tset_att < sdrt->tALS_min - twait))
+               tset_att = sdrt->tALS_min - twait;
+       if (sdrt->tRHW_min > thold_mem &&
+           (tset_att < sdrt->tRHW_min - thold_mem))
+               tset_att = sdrt->tRHW_min - thold_mem;
+       if (twait > thiz && (sdrt->tDS_min > twait - thiz) &&
+           (tset_att < sdrt->tDS_min - (twait - thiz)))
+               tset_att = sdrt->tDS_min - (twait - thiz);
+       tims->tset_att = DIV_ROUND_UP(tset_att, hclkp);
+       if (tims->tset_att == 0)
+               tims->tset_att = 1;
+       else if (tims->tset_att > FMC2_PMEM_PATT_TIMING_MASK)
+               tims->tset_att = FMC2_PMEM_PATT_TIMING_MASK;
+
+       /*
+        * tHOLD_ATT > tALH
+        * tHOLD_ATT > tCH
+        * tHOLD_ATT > tCLH
+        * tHOLD_ATT > tCOH
+        * tHOLD_ATT > tDH
+        * tHOLD_ATT > tWB + tIO + tSYNC - tSETUP_MEM
+        * tHOLD_ATT > tADL - tSETUP_MEM
+        * tHOLD_ATT > tWH - tSETUP_MEM
+        * tHOLD_ATT > tWHR - tSETUP_MEM
+        * tHOLD_ATT > tRC - (tSETUP_ATT + tWAIT)
+        * tHOLD_ATT > tWC - (tSETUP_ATT + tWAIT)
+        */
+       thold_att = hclkp;
+       if (thold_att < sdrt->tALH_min)
+               thold_att = sdrt->tALH_min;
+       if (thold_att < sdrt->tCH_min)
+               thold_att = sdrt->tCH_min;
+       if (thold_att < sdrt->tCLH_min)
+               thold_att = sdrt->tCLH_min;
+       if (thold_att < sdrt->tCOH_min)
+               thold_att = sdrt->tCOH_min;
+       if (thold_att < sdrt->tDH_min)
+               thold_att = sdrt->tDH_min;
+       if ((sdrt->tWB_max + FMC2_TIO + FMC2_TSYNC > tset_mem) &&
+           (thold_att < sdrt->tWB_max + FMC2_TIO + FMC2_TSYNC - tset_mem))
+               thold_att = sdrt->tWB_max + FMC2_TIO + FMC2_TSYNC - tset_mem;
+       if (sdrt->tADL_min > tset_mem &&
+           (thold_att < sdrt->tADL_min - tset_mem))
+               thold_att = sdrt->tADL_min - tset_mem;
+       if (sdrt->tWH_min > tset_mem &&
+           (thold_att < sdrt->tWH_min - tset_mem))
+               thold_att = sdrt->tWH_min - tset_mem;
+       if (sdrt->tWHR_min > tset_mem &&
+           (thold_att < sdrt->tWHR_min - tset_mem))
+               thold_att = sdrt->tWHR_min - tset_mem;
+       if ((sdrt->tRC_min > tset_att + twait) &&
+           (thold_att < sdrt->tRC_min - (tset_att + twait)))
+               thold_att = sdrt->tRC_min - (tset_att + twait);
+       if ((sdrt->tWC_min > tset_att + twait) &&
+           (thold_att < sdrt->tWC_min - (tset_att + twait)))
+               thold_att = sdrt->tWC_min - (tset_att + twait);
+       tims->thold_att = DIV_ROUND_UP(thold_att, hclkp);
+       if (tims->thold_att == 0)
+               tims->thold_att = 1;
+       else if (tims->thold_att > FMC2_PMEM_PATT_TIMING_MASK)
+               tims->thold_att = FMC2_PMEM_PATT_TIMING_MASK;
+}
+
+static int stm32_fmc2_setup_interface(struct mtd_info *mtd, int chipnr,
+                                     const struct nand_data_interface *conf)
+{
+       struct nand_chip *chip = mtd_to_nand(mtd);
+       const struct nand_sdr_timings *sdrt;
+
+       sdrt = nand_get_sdr_timings(conf);
+       if (IS_ERR(sdrt))
+               return PTR_ERR(sdrt);
+
+       if (chipnr == NAND_DATA_IFACE_CHECK_ONLY)
+               return 0;
+
+       stm32_fmc2_calc_timings(chip, sdrt);
+
+       /* Apply timings */
+       stm32_fmc2_timings_init(chip);
+
+       return 0;
+}
+
+/* NAND callbacks setup */
+static void stm32_fmc2_nand_callbacks_setup(struct nand_chip *chip)
+{
+       chip->ecc.hwctl = stm32_fmc2_hwctl;
+
+       /*
+        * Specific callbacks to read/write a page depending on
+        * the algo used (Hamming, BCH).
+        */
+       if (chip->ecc.strength == FMC2_ECC_HAM) {
+               /* Hamming is used */
+               chip->ecc.calculate = stm32_fmc2_ham_calculate;
+               chip->ecc.correct = stm32_fmc2_ham_correct;
+               chip->ecc.bytes = chip->options & NAND_BUSWIDTH_16 ? 4 : 3;
+               chip->ecc.options |= NAND_ECC_GENERIC_ERASED_CHECK;
+               return;
+       }
+
+       /* BCH is used */
+       chip->ecc.read_page = stm32_fmc2_read_page;
+       chip->ecc.calculate = stm32_fmc2_bch_calculate;
+       chip->ecc.correct = stm32_fmc2_bch_correct;
+
+       if (chip->ecc.strength == FMC2_ECC_BCH8)
+               chip->ecc.bytes = chip->options & NAND_BUSWIDTH_16 ? 14 : 13;
+       else
+               chip->ecc.bytes = chip->options & NAND_BUSWIDTH_16 ? 8 : 7;
+}
+
+/* FMC2 caps */
+static int stm32_fmc2_calc_ecc_bytes(int step_size, int strength)
+{
+       /* Hamming */
+       if (strength == FMC2_ECC_HAM)
+               return 4;
+
+       /* BCH8 */
+       if (strength == FMC2_ECC_BCH8)
+               return 14;
+
+       /* BCH4 */
+       return 8;
+}
+
+NAND_ECC_CAPS_SINGLE(stm32_fmc2_ecc_caps, stm32_fmc2_calc_ecc_bytes,
+                    FMC2_ECC_STEP_SIZE,
+                    FMC2_ECC_HAM, FMC2_ECC_BCH4, FMC2_ECC_BCH8);
+
+/* FMC2 probe */
+static int stm32_fmc2_parse_child(struct stm32_fmc2_nfc *fmc2,
+                                 ofnode node)
+{
+       struct stm32_fmc2_nand *nand = &fmc2->nand;
+       u32 cs[FMC2_MAX_CE];
+       int ret, i;
+
+       if (!ofnode_get_property(node, "reg", &nand->ncs))
+               return -EINVAL;
+
+       nand->ncs /= sizeof(u32);
+       if (!nand->ncs) {
+               pr_err("Invalid reg property size\n");
+               return -EINVAL;
+       }
+
+       ret = ofnode_read_u32_array(node, "reg", cs, nand->ncs);
+       if (ret < 0) {
+               pr_err("Could not retrieve reg property\n");
+               return -EINVAL;
+       }
+
+       for (i = 0; i < nand->ncs; i++) {
+               if (cs[i] > FMC2_MAX_CE) {
+                       pr_err("Invalid reg value: %d\n",
+                              nand->cs_used[i]);
+                       return -EINVAL;
+               }
+
+               if (fmc2->cs_assigned & BIT(cs[i])) {
+                       pr_err("Cs already assigned: %d\n",
+                              nand->cs_used[i]);
+                       return -EINVAL;
+               }
+
+               fmc2->cs_assigned |= BIT(cs[i]);
+               nand->cs_used[i] = cs[i];
+       }
+
+       nand->chip.flash_node = ofnode_to_offset(node);
+
+       return 0;
+}
+
+static int stm32_fmc2_parse_dt(struct udevice *dev,
+                              struct stm32_fmc2_nfc *fmc2)
+{
+       ofnode child;
+       int ret, nchips = 0;
+
+       dev_for_each_subnode(child, dev)
+               nchips++;
+
+       if (!nchips) {
+               pr_err("NAND chip not defined\n");
+               return -EINVAL;
+       }
+
+       if (nchips > 1) {
+               pr_err("Too many NAND chips defined\n");
+               return -EINVAL;
+       }
+
+       dev_for_each_subnode(child, dev) {
+               ret = stm32_fmc2_parse_child(fmc2, child);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
+static int stm32_fmc2_probe(struct udevice *dev)
+{
+       struct stm32_fmc2_nfc *fmc2 = dev_get_priv(dev);
+       struct stm32_fmc2_nand *nand = &fmc2->nand;
+       struct nand_chip *chip = &nand->chip;
+       struct mtd_info *mtd = &chip->mtd;
+       struct nand_ecclayout *ecclayout;
+       struct resource resource;
+       struct reset_ctl reset;
+       int oob_index, chip_cs, mem_region, ret, i;
+
+       spin_lock_init(&fmc2->controller.lock);
+       init_waitqueue_head(&fmc2->controller.wq);
+
+       ret = stm32_fmc2_parse_dt(dev, fmc2);
+       if (ret)
+               return ret;
+
+       /* Get resources */
+       ret = dev_read_resource(dev, 0, &resource);
+       if (ret) {
+               pr_err("Resource io_base not found");
+               return ret;
+       }
+       fmc2->io_base = (void __iomem *)resource.start;
+
+       for (chip_cs = 0, mem_region = 1; chip_cs < FMC2_MAX_CE;
+            chip_cs++, mem_region += 3) {
+               if (!(fmc2->cs_assigned & BIT(chip_cs)))
+                       continue;
+
+               ret = dev_read_resource(dev, mem_region, &resource);
+               if (ret) {
+                       pr_err("Resource data_base not found for cs%d",
+                              chip_cs);
+                       return ret;
+               }
+               fmc2->data_base[chip_cs] = (void __iomem *)resource.start;
+
+               ret = dev_read_resource(dev, mem_region + 1, &resource);
+               if (ret) {
+                       pr_err("Resource cmd_base not found for cs%d",
+                              chip_cs);
+                       return ret;
+               }
+               fmc2->cmd_base[chip_cs] = (void __iomem *)resource.start;
+
+               ret = dev_read_resource(dev, mem_region + 2, &resource);
+               if (ret) {
+                       pr_err("Resource addr_base not found for cs%d",
+                              chip_cs);
+                       return ret;
+               }
+               fmc2->addr_base[chip_cs] = (void __iomem *)resource.start;
+       }
+
+       /* Enable the clock */
+       ret = clk_get_by_index(dev, 0, &fmc2->clk);
+       if (ret)
+               return ret;
+
+       ret = clk_enable(&fmc2->clk);
+       if (ret)
+               return ret;
+
+       /* Reset */
+       ret = reset_get_by_index(dev, 0, &reset);
+       if (!ret) {
+               reset_assert(&reset);
+               udelay(2);
+               reset_deassert(&reset);
+       }
+
+       /* FMC2 init routine */
+       stm32_fmc2_init(fmc2);
+
+       chip->controller = &fmc2->base;
+       chip->select_chip = stm32_fmc2_select_chip;
+       chip->setup_data_interface = stm32_fmc2_setup_interface;
+       chip->cmd_ctrl = stm32_fmc2_cmd_ctrl;
+       chip->chip_delay = FMC2_RB_DELAY_US;
+       chip->options |= NAND_BUSWIDTH_AUTO | NAND_NO_SUBPAGE_WRITE |
+                        NAND_USE_BOUNCE_BUFFER;
+
+       /* Default ECC settings */
+       chip->ecc.mode = NAND_ECC_HW;
+       chip->ecc.size = FMC2_ECC_STEP_SIZE;
+       chip->ecc.strength = FMC2_ECC_BCH8;
+
+       /* Scan to find existence of the device */
+       ret = nand_scan_ident(mtd, nand->ncs, NULL);
+       if (ret)
+               return ret;
+
+       /*
+        * Only NAND_ECC_HW mode is actually supported
+        * Hamming => ecc.strength = 1
+        * BCH4 => ecc.strength = 4
+        * BCH8 => ecc.strength = 8
+        * ECC sector size = 512
+        */
+       if (chip->ecc.mode != NAND_ECC_HW) {
+               pr_err("Nand_ecc_mode is not well defined in the DT\n");
+               return -EINVAL;
+       }
+
+       ret = nand_check_ecc_caps(chip, &stm32_fmc2_ecc_caps,
+                                 mtd->oobsize - FMC2_BBM_LEN);
+       if (ret) {
+               pr_err("No valid ECC settings set\n");
+               return ret;
+       }
+
+       if (chip->bbt_options & NAND_BBT_USE_FLASH)
+               chip->bbt_options |= NAND_BBT_NO_OOB;
+
+       /* NAND callbacks setup */
+       stm32_fmc2_nand_callbacks_setup(chip);
+
+       /* Define ECC layout */
+       ecclayout = &fmc2->ecclayout;
+       ecclayout->eccbytes = chip->ecc.bytes *
+                             (mtd->writesize / chip->ecc.size);
+       oob_index = FMC2_BBM_LEN;
+       for (i = 0; i < ecclayout->eccbytes; i++, oob_index++)
+               ecclayout->eccpos[i] = oob_index;
+       ecclayout->oobfree->offset = oob_index;
+       ecclayout->oobfree->length = mtd->oobsize - ecclayout->oobfree->offset;
+       chip->ecc.layout = ecclayout;
+
+       /* Configure bus width to 16-bit */
+       if (chip->options & NAND_BUSWIDTH_16)
+               stm32_fmc2_set_buswidth_16(fmc2, true);
+
+       /* Scan the device to fill MTD data-structures */
+       ret = nand_scan_tail(mtd);
+       if (ret)
+               return ret;
+
+       return nand_register(0, mtd);
+}
+
+static const struct udevice_id stm32_fmc2_match[] = {
+       { .compatible = "st,stm32mp15-fmc2" },
+       { /* Sentinel */ }
+};
+
+U_BOOT_DRIVER(stm32_fmc2_nand) = {
+       .name = "stm32_fmc2_nand",
+       .id = UCLASS_MTD,
+       .of_match = stm32_fmc2_match,
+       .probe = stm32_fmc2_probe,
+       .priv_auto_alloc_size = sizeof(struct stm32_fmc2_nfc),
+};
+
+void board_nand_init(void)
+{
+       struct udevice *dev;
+       int ret;
+
+       ret = uclass_get_device_by_driver(UCLASS_MTD,
+                                         DM_GET_DRIVER(stm32_fmc2_nand),
+                                         &dev);
+       if (ret && ret != -ENODEV)
+               pr_err("Failed to initialize STM32 FMC2 NAND controller. (error %d)\n",
+                      ret);
+}
index 0bade208084dd6b9b130207765e7ba85bd82e752..3681c5eed9acf0ebc38f34350c706cec2b6731ac 100644 (file)
 #endif
 #include <linux/mtd/spinand.h>
 
-#define SPINAND_MFR_GIGADEVICE                 0xc8
+#define SPINAND_MFR_GIGADEVICE                 0xC8
+#define GD5FXGQ4XA_STATUS_ECC_1_7_BITFLIPS     (1 << 4)
+#define GD5FXGQ4XA_STATUS_ECC_8_BITFLIPS       (3 << 4)
 
-#define GIGADEVICE_STATUS_ECC_MASK             GENMASK(5, 4)
-#define GIGADEVICE_STATUS_ECC_NO_BITFLIPS      (0 << 4)
-#define GIGADEVICE_STATUS_ECC_1TO7_BITFLIPS    (1 << 4)
-#define GIGADEVICE_STATUS_ECC_8_BITFLIPS       (3 << 4)
+#define GD5FXGQ4XEXXG_REG_STATUS2              0xf0
 
 static SPINAND_OP_VARIANTS(read_cache_variants,
                SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
@@ -35,8 +34,8 @@ static SPINAND_OP_VARIANTS(update_cache_variants,
                SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
                SPINAND_PROG_LOAD(false, 0, NULL, 0));
 
-static int gd5f1gq4u_ooblayout_ecc(struct mtd_info *mtd, int section,
-                                  struct mtd_oob_region *region)
+static int gd5fxgq4xexxg_ooblayout_ecc(struct mtd_info *mtd, int section,
+                                      struct mtd_oob_region *region)
 {
        if (section)
                return -ERANGE;
@@ -47,38 +46,49 @@ static int gd5f1gq4u_ooblayout_ecc(struct mtd_info *mtd, int section,
        return 0;
 }
 
-static int gd5f1gq4u_ooblayout_free(struct mtd_info *mtd, int section,
-                                   struct mtd_oob_region *region)
+static int gd5fxgq4xexxg_ooblayout_free(struct mtd_info *mtd, int section,
+                                       struct mtd_oob_region *region)
 {
        if (section)
                return -ERANGE;
 
-       /* Reserve 2 bytes for the BBM. */
-       region->offset = 2;
-       region->length = 62;
+       /* Reserve 1 bytes for the BBM. */
+       region->offset = 1;
+       region->length = 63;
 
        return 0;
 }
 
-static const struct mtd_ooblayout_ops gd5f1gq4u_ooblayout = {
-       .ecc = gd5f1gq4u_ooblayout_ecc,
-       .free = gd5f1gq4u_ooblayout_free,
-};
-
-static int gd5f1gq4u_ecc_get_status(struct spinand_device *spinand,
-                                   u8 status)
+static int gd5fxgq4xexxg_ecc_get_status(struct spinand_device *spinand,
+                                       u8 status)
 {
-       if (status)
-               debug("%s (%d): status=%02x\n", __func__, __LINE__, status);
+       u8 status2;
+       struct spi_mem_op op = SPINAND_GET_FEATURE_OP(GD5FXGQ4XEXXG_REG_STATUS2,
+                                                     &status2);
+       int ret;
 
-       switch (status & GIGADEVICE_STATUS_ECC_MASK) {
+       switch (status & STATUS_ECC_MASK) {
        case STATUS_ECC_NO_BITFLIPS:
                return 0;
 
-       case GIGADEVICE_STATUS_ECC_1TO7_BITFLIPS:
-               return 7;
-
-       case GIGADEVICE_STATUS_ECC_8_BITFLIPS:
+       case GD5FXGQ4XA_STATUS_ECC_1_7_BITFLIPS:
+               /*
+                * Read status2 register to determine a more fine grained
+                * bit error status
+                */
+               ret = spi_mem_exec_op(spinand->slave, &op);
+               if (ret)
+                       return ret;
+
+               /*
+                * 4 ... 7 bits are flipped (1..4 can't be detected, so
+                * report the maximum of 4 in this case
+                */
+               /* bits sorted this way (3...0): ECCS1,ECCS0,ECCSE1,ECCSE0 */
+               return ((status & STATUS_ECC_MASK) >> 2) |
+                       ((status2 & STATUS_ECC_MASK) >> 4);
+
+       case GD5FXGQ4XA_STATUS_ECC_8_BITFLIPS:
                return 8;
 
        case STATUS_ECC_UNCOR_ERROR:
@@ -91,16 +101,21 @@ static int gd5f1gq4u_ecc_get_status(struct spinand_device *spinand,
        return -EINVAL;
 }
 
+static const struct mtd_ooblayout_ops gd5fxgq4xexxg_ooblayout = {
+       .ecc = gd5fxgq4xexxg_ooblayout_ecc,
+       .free = gd5fxgq4xexxg_ooblayout_free,
+};
+
 static const struct spinand_info gigadevice_spinand_table[] = {
-       SPINAND_INFO("GD5F1GQ4UC", 0xd1,
+       SPINAND_INFO("GD5F1GQ4UExxG", 0xd1,
                     NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
-                    NAND_ECCREQ(8, 2048),
+                    NAND_ECCREQ(8, 512),
                     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
                                              &write_cache_variants,
                                              &update_cache_variants),
                     0,
-                    SPINAND_ECCINFO(&gd5f1gq4u_ooblayout,
-                                    gd5f1gq4u_ecc_get_status)),
+                    SPINAND_ECCINFO(&gd5fxgq4xexxg_ooblayout,
+                                    gd5fxgq4xexxg_ecc_get_status)),
 };
 
 static int gigadevice_spinand_detect(struct spinand_device *spinand)
@@ -109,8 +124,8 @@ static int gigadevice_spinand_detect(struct spinand_device *spinand)
        int ret;
 
        /*
-        * Gigadevice SPI NAND read ID need a dummy byte,
-        * so the first byte in raw_id is dummy.
+        * For GD NANDs, There is an address byte needed to shift in before IDs
+        * are read out, so the first byte in raw_id is dummy.
         */
        if (id[1] != SPINAND_MFR_GIGADEVICE)
                return 0;
index 5671bca24a07e41200fd589ef31d4cc3a6acc462..d3b007a731dac0134beb13cecefe51657cca4d82 100644 (file)
@@ -62,6 +62,9 @@ config SF_DEFAULT_MODE
          The default mode may be provided by the platform
          to handle the common case when only a single serial
          flash is present on the system.
+         Not used for boot with device tree; the SPI driver reads
+         speed and mode from platdata values computed from
+         available node.
 
 config SF_DEFAULT_SPEED
        int "SPI Flash default speed in Hz"
@@ -71,6 +74,9 @@ config SF_DEFAULT_SPEED
          The default speed may be provided by the platform
          to handle the common case when only a single serial
          flash is present on the system.
+         Not used for boot with device tree; the SPI driver reads
+         speed and mode from platdata values computed from
+         available node.
 
 if SPI_FLASH
 
index 7f1378f4946d256e92e4eea8f9bbf9a30818febc..73297e1a0a512a0a82ce7ac38b9665e7bceddcca 100644 (file)
@@ -166,7 +166,6 @@ static const struct dm_spi_flash_ops spi_flash_std_ops = {
 };
 
 static const struct udevice_id spi_flash_std_ids[] = {
-       { .compatible = "spi-flash" },
        { .compatible = "jedec,spi-nor" },
        { }
 };
index b7f073387796a10e795e7c8b27f16c3a920ee583..c4e2f6a08fa8372cde2e9e5981784e08ec0dac4d 100644 (file)
@@ -524,8 +524,11 @@ static int read_bar(struct spi_nor *nor, const struct flash_info *info)
  */
 static int spi_nor_erase_sector(struct spi_nor *nor, u32 addr)
 {
-       u8 buf[SPI_NOR_MAX_ADDR_WIDTH];
-       int i;
+       struct spi_mem_op op =
+               SPI_MEM_OP(SPI_MEM_OP_CMD(nor->erase_opcode, 1),
+                          SPI_MEM_OP_ADDR(nor->addr_width, addr, 1),
+                          SPI_MEM_OP_NO_DUMMY,
+                          SPI_MEM_OP_NO_DATA);
 
        if (nor->erase)
                return nor->erase(nor, addr);
@@ -534,12 +537,7 @@ static int spi_nor_erase_sector(struct spi_nor *nor, u32 addr)
         * Default implementation, if driver doesn't have a specialized HW
         * control
         */
-       for (i = nor->addr_width - 1; i >= 0; i--) {
-               buf[i] = addr & 0xff;
-               addr >>= 8;
-       }
-
-       return nor->write_reg(nor, nor->erase_opcode, buf, nor->addr_width);
+       return spi_mem_exec_op(nor->spi, &op);
 }
 
 /*
index 3215e2431dc0dcc74a5223c324348d11d5507ecf..ec929760eee4768522bed3f564128b4963c717ea 100644 (file)
@@ -106,6 +106,11 @@ const struct flash_info spi_nor_ids[] = {
                        SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
                        SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
        },
+       {
+               INFO("gd25lq128", 0xc86018, 0, 64 * 1024, 256,
+                       SECT_4K | SPI_NOR_DUAL_READ |
+                       SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
+       },
 #endif
 #ifdef CONFIG_SPI_FLASH_ISSI           /* ISSI */
        /* ISSI */
@@ -142,6 +147,7 @@ const struct flash_info spi_nor_ids[] = {
        { INFO("mx25l25655e", 0xc22619, 0, 64 * 1024, 512, 0) },
        { INFO("mx66l51235l", 0xc2201a, 0, 64 * 1024, 1024, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
        { INFO("mx66u51235f", 0xc2253a, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
+       { INFO("mx66u2g45g",  0xc2253c, 0, 64 * 1024, 4096, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
        { INFO("mx66l1g45g",  0xc2201b, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
        { INFO("mx25l1633e", 0xc22415, 0, 64 * 1024,   32, SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES | SECT_4K) },
 #endif
@@ -187,6 +193,7 @@ const struct flash_info spi_nor_ids[] = {
        { INFO("s25fl116k",  0x014015,      0,  64 * 1024,  32, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
        { INFO("s25fl164k",  0x014017,      0,  64 * 1024, 128, SECT_4K) },
        { INFO("s25fl208k",  0x014014,      0,  64 * 1024,  16, SECT_4K | SPI_NOR_DUAL_READ) },
+       { INFO("s25fl064l",  0x016017,      0,  64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
        { INFO("s25fl128l",  0x016018,      0,  64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
 #endif
 #ifdef CONFIG_SPI_FLASH_SST            /* SST */
index 77d0b3a01f433dd10e678a387caa4dda7dd9d7ad..6e436b56abf064e40a639b7c198d5d8f0c574513 100644 (file)
@@ -190,7 +190,7 @@ config FEC_MXC_MDIO_BASE
 
 config FEC_MXC
        bool "FEC Ethernet controller"
-       depends on MX5 || MX6 || MX7 || IMX8
+       depends on MX5 || MX6 || MX7 || IMX8 || VF610
        help
          This driver supports the 10/100 Fast Ethernet controller for
          NXP i.MX processors.
@@ -528,4 +528,13 @@ config MEDIATEK_ETH
          This Driver support MediaTek Ethernet GMAC
          Say Y to enable support for the MediaTek Ethernet GMAC.
 
+config HIGMACV300_ETH
+       bool "HiSilicon Gigabit Ethernet Controller"
+       depends on DM_ETH
+       select DM_RESET
+       select PHYLIB
+       help
+         This driver supports HIGMACV300 Ethernet controller found on
+         HiSilicon SoCs.
+
 endif # NETDEVICES
index 51be72b0aa867eea9fa3a5e0a95741f4f00e18dd..8d02a378964b88facdbaef74756f9bdc838d3765 100644 (file)
@@ -76,3 +76,4 @@ obj-$(CONFIG_SNI_AVE) += sni_ave.o
 obj-y += ti/
 obj-$(CONFIG_MEDIATEK_ETH) += mtk_eth.o
 obj-y += mscc_eswitch/
+obj-$(CONFIG_HIGMACV300_ETH) += higmacv300.o
index 8146c3170e1643e293cb2e22d0e06fbed00718eb..7f1dee4b3e4d5b9e6a5b35cf34dde9f6136f05a0 100644 (file)
@@ -3,6 +3,7 @@
  * Atheros AR71xx / AR9xxx GMAC driver
  *
  * Copyright (C) 2016 Marek Vasut <marex@denx.de>
+ * Copyright (C) 2019 Rosy Song <rosysong@rosinson.com>
  */
 
 #include <common.h>
@@ -23,6 +24,8 @@ DECLARE_GLOBAL_DATA_PTR;
 enum ag7xxx_model {
        AG7XXX_MODEL_AG933X,
        AG7XXX_MODEL_AG934X,
+       AG7XXX_MODEL_AG953X,
+       AG7XXX_MODEL_AG956X
 };
 
 /* MAC Configuration 1 */
@@ -99,8 +102,29 @@ enum ag7xxx_model {
 /* Rx Status */
 #define AG7XXX_ETH_DMA_RX_STATUS               0x194
 
+/* Custom register at 0x1805002C */
+#define AG7XXX_ETH_XMII                        0x2C
+#define AG7XXX_ETH_XMII_TX_INVERT              BIT(31)
+#define AG7XXX_ETH_XMII_RX_DELAY_LSB           28
+#define AG7XXX_ETH_XMII_RX_DELAY_MASK          0x30000000
+#define AG7XXX_ETH_XMII_RX_DELAY_SET(x) \
+       (((x) << AG7XXX_ETH_XMII_RX_DELAY_LSB) & AG7XXX_ETH_XMII_RX_DELAY_MASK)
+#define AG7XXX_ETH_XMII_TX_DELAY_LSB           26
+#define AG7XXX_ETH_XMII_TX_DELAY_MASK          0x0c000000
+#define AG7XXX_ETH_XMII_TX_DELAY_SET(x) \
+       (((x) << AG7XXX_ETH_XMII_TX_DELAY_LSB) & AG7XXX_ETH_XMII_TX_DELAY_MASK)
+#define AG7XXX_ETH_XMII_GIGE           BIT(25)
+
 /* Custom register at 0x18070000 */
 #define AG7XXX_GMAC_ETH_CFG                    0x00
+#define AG7XXX_ETH_CFG_RXDV_DELAY_LSB          16
+#define AG7XXX_ETH_CFG_RXDV_DELAY_MASK         0x00030000
+#define AG7XXX_ETH_CFG_RXDV_DELAY_SET(x) \
+       (((x) << AG7XXX_ETH_CFG_RXDV_DELAY_LSB) & AG7XXX_ETH_CFG_RXDV_DELAY_MASK)
+#define AG7XXX_ETH_CFG_RXD_DELAY_LSB           14
+#define AG7XXX_ETH_CFG_RXD_DELAY_MASK          0x0000c000
+#define AG7XXX_ETH_CFG_RXD_DELAY_SET(x)        \
+       (((x) << AG7XXX_ETH_CFG_RXD_DELAY_LSB) & AG7XXX_ETH_CFG_RXD_DELAY_MASK)
 #define AG7XXX_ETH_CFG_SW_PHY_ADDR_SWAP                BIT(8)
 #define AG7XXX_ETH_CFG_SW_PHY_SWAP             BIT(7)
 #define AG7XXX_ETH_CFG_SW_ONLY_MODE            BIT(6)
@@ -197,24 +221,33 @@ static int ag7xxx_switch_reg_read(struct mii_dev *bus, int reg, u32 *val)
        u32 reg_addr;
        u32 phy_temp;
        u32 reg_temp;
+       u32 reg_temp_w = (reg & 0xfffffffc) >> 1;
        u16 rv = 0;
        int ret;
 
-       if (priv->model == AG7XXX_MODEL_AG933X) {
+       if (priv->model == AG7XXX_MODEL_AG933X ||
+           priv->model == AG7XXX_MODEL_AG953X) {
                phy_addr = 0x1f;
                reg_addr = 0x10;
-       } else if (priv->model == AG7XXX_MODEL_AG934X) {
+       } else if (priv->model == AG7XXX_MODEL_AG934X ||
+                  priv->model == AG7XXX_MODEL_AG956X) {
                phy_addr = 0x18;
                reg_addr = 0x00;
        } else
                return -EINVAL;
 
-       ret = ag7xxx_switch_write(bus, phy_addr, reg_addr, reg >> 9);
+       if (priv->model == AG7XXX_MODEL_AG956X)
+               ret = ag7xxx_switch_write(bus, phy_addr, reg_addr, (reg >> 9) & 0x1ff);
+       else
+               ret = ag7xxx_switch_write(bus, phy_addr, reg_addr, reg >> 9);
        if (ret)
                return ret;
 
        phy_temp = ((reg >> 6) & 0x7) | 0x10;
-       reg_temp = (reg >> 1) & 0x1e;
+       if (priv->model == AG7XXX_MODEL_AG956X)
+               reg_temp = reg_temp_w & 0x1f;
+       else
+               reg_temp = (reg >> 1) & 0x1e;
        *val = 0;
 
        ret = ag7xxx_switch_read(bus, phy_temp, reg_temp | 0, &rv);
@@ -222,7 +255,13 @@ static int ag7xxx_switch_reg_read(struct mii_dev *bus, int reg, u32 *val)
                return ret;
        *val |= rv;
 
-       ret = ag7xxx_switch_read(bus, phy_temp, reg_temp | 1, &rv);
+       if (priv->model == AG7XXX_MODEL_AG956X) {
+               phy_temp = (((reg_temp_w + 1) >> 5) & 0x7) | 0x10;
+               reg_temp = (reg_temp_w + 1) & 0x1f;
+               ret = ag7xxx_switch_read(bus, phy_temp, reg_temp, &rv);
+       } else {
+               ret = ag7xxx_switch_read(bus, phy_temp, reg_temp | 1, &rv);
+       }
        if (ret < 0)
                return ret;
        *val |= (rv << 16);
@@ -237,23 +276,34 @@ static int ag7xxx_switch_reg_write(struct mii_dev *bus, int reg, u32 val)
        u32 reg_addr;
        u32 phy_temp;
        u32 reg_temp;
+       u32 reg_temp_w = (reg & 0xfffffffc) >> 1;
        int ret;
 
-       if (priv->model == AG7XXX_MODEL_AG933X) {
+       if (priv->model == AG7XXX_MODEL_AG933X ||
+           priv->model == AG7XXX_MODEL_AG953X) {
                phy_addr = 0x1f;
                reg_addr = 0x10;
-       } else if (priv->model == AG7XXX_MODEL_AG934X) {
+       } else if (priv->model == AG7XXX_MODEL_AG934X ||
+                  priv->model == AG7XXX_MODEL_AG956X) {
                phy_addr = 0x18;
                reg_addr = 0x00;
        } else
                return -EINVAL;
 
-       ret = ag7xxx_switch_write(bus, phy_addr, reg_addr, reg >> 9);
+       if (priv->model == AG7XXX_MODEL_AG956X)
+               ret = ag7xxx_switch_write(bus, phy_addr, reg_addr, (reg >> 9) & 0x1ff);
+       else
+               ret = ag7xxx_switch_write(bus, phy_addr, reg_addr, reg >> 9);
        if (ret)
                return ret;
 
-       phy_temp = ((reg >> 6) & 0x7) | 0x10;
-       reg_temp = (reg >> 1) & 0x1e;
+       if (priv->model == AG7XXX_MODEL_AG956X) {
+               reg_temp = (reg_temp_w + 1) & 0x1f;
+               phy_temp = (((reg_temp_w + 1) >> 5) & 0x7) | 0x10;
+       } else {
+               phy_temp = ((reg >> 6) & 0x7) | 0x10;
+               reg_temp = (reg >> 1) & 0x1e;
+       }
 
        /*
         * The switch on AR933x has some special register behavior, which
@@ -272,10 +322,18 @@ static int ag7xxx_switch_reg_write(struct mii_dev *bus, int reg, u32 val)
                if (ret < 0)
                        return ret;
        } else {
-               ret = ag7xxx_switch_write(bus, phy_temp, reg_temp | 1, val >> 16);
+               if (priv->model == AG7XXX_MODEL_AG956X)
+                       ret = ag7xxx_switch_write(bus, phy_temp, reg_temp, val >> 16);
+               else
+                       ret = ag7xxx_switch_write(bus, phy_temp, reg_temp | 1, val >> 16);
                if (ret < 0)
                        return ret;
 
+               if (priv->model == AG7XXX_MODEL_AG956X) {
+                       phy_temp = ((reg_temp_w >> 5) & 0x7) | 0x10;
+                       reg_temp = reg_temp_w & 0x1f;
+               }
+
                ret = ag7xxx_switch_write(bus, phy_temp, reg_temp | 0, val & 0xffff);
                if (ret < 0)
                        return ret;
@@ -598,10 +656,19 @@ static int ag7xxx_mii_setup(struct udevice *dev)
                        return 0;
        }
 
-       if (priv->model == AG7XXX_MODEL_AG934X) {
-               writel(AG7XXX_ETH_MII_MGMT_CFG_RESET | 0x4,
+       if (priv->model == AG7XXX_MODEL_AG934X)
+               reg = 0x4;
+       else if (priv->model == AG7XXX_MODEL_AG953X)
+               reg = 0x2;
+       else if (priv->model == AG7XXX_MODEL_AG956X)
+               reg = 0x7;
+
+       if (priv->model == AG7XXX_MODEL_AG934X ||
+           priv->model == AG7XXX_MODEL_AG953X ||
+           priv->model == AG7XXX_MODEL_AG956X) {
+               writel(AG7XXX_ETH_MII_MGMT_CFG_RESET | reg,
                       priv->regs + AG7XXX_ETH_MII_MGMT_CFG);
-               writel(0x4, priv->regs + AG7XXX_ETH_MII_MGMT_CFG);
+               writel(reg, priv->regs + AG7XXX_ETH_MII_MGMT_CFG);
                return 0;
        }
 
@@ -698,14 +765,126 @@ static int ag933x_phy_setup_lan(struct udevice *dev)
        return 0;
 }
 
+static int ag953x_phy_setup_wan(struct udevice *dev)
+{
+       int ret;
+       u32 reg = 0;
+       struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
+
+       /* Set wan port connect to GE0 */
+       ret = ag7xxx_switch_reg_read(priv->bus, 0x8, &reg);
+       if (ret)
+               return ret;
+
+       ret = ag7xxx_switch_reg_write(priv->bus, 0x8, reg | BIT(28));
+       if (ret)
+               return ret;
+
+       /* Configure switch port 4 (GMAC0) */
+       ret = ag7xxx_switch_write(priv->bus, 4, MII_BMCR, 0x9000);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static int ag953x_phy_setup_lan(struct udevice *dev)
+{
+       struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
+       int i, ret;
+       u32 reg = 0;
+
+       /* Reset the switch */
+       ret = ag7xxx_switch_reg_read(priv->bus, 0, &reg);
+       if (ret)
+               return ret;
+
+       ret = ag7xxx_switch_reg_write(priv->bus, 0, reg | BIT(31));
+       if (ret)
+               return ret;
+
+       do {
+               ret = ag7xxx_switch_reg_read(priv->bus, 0, &reg);
+               if (ret)
+                       return ret;
+       } while (reg & BIT(31));
+
+       ret = ag7xxx_switch_reg_write(priv->bus, 0x100, 0x4e);
+       if (ret)
+               return ret;
+
+       /* Set GMII mode */
+       ret = ag7xxx_switch_reg_read(priv->bus, 0x4, &reg);
+       if (ret)
+               return ret;
+
+       ret = ag7xxx_switch_reg_write(priv->bus, 0x4, reg | BIT(6));
+       if (ret)
+               return ret;
+
+       /* Configure switch ports 0...4 (GMAC1) */
+       for (i = 0; i < 5; i++) {
+               ret = ag7xxx_switch_write(priv->bus, i, MII_BMCR, 0x9000);
+               if (ret)
+                       return ret;
+       }
+
+       for (i = 0; i < 5; i++) {
+               ret = ag7xxx_switch_reg_write(priv->bus, (i + 2) * 0x100, BIT(9));
+               if (ret)
+                       return ret;
+       }
+
+       /* QM Control */
+       ret = ag7xxx_switch_reg_write(priv->bus, 0x38, 0xc000050e);
+       if (ret)
+               return ret;
+
+       /* Disable Atheros header */
+       ret = ag7xxx_switch_reg_write(priv->bus, 0x104, 0x4004);
+       if (ret)
+               return ret;
+
+       /* Tag priority mapping */
+       ret = ag7xxx_switch_reg_write(priv->bus, 0x70, 0xfa50);
+       if (ret)
+               return ret;
+
+       /* Enable ARP packets to the CPU */
+       ret = ag7xxx_switch_reg_read(priv->bus, 0x5c, &reg);
+       if (ret)
+               return ret;
+
+       ret = ag7xxx_switch_reg_write(priv->bus, 0x5c, reg | 0x100000);
+       if (ret)
+               return ret;
+
+       /* Enable broadcast packets to the CPU */
+       ret = ag7xxx_switch_reg_read(priv->bus, 0x2c, &reg);
+       if (ret)
+               return ret;
+
+       ret = ag7xxx_switch_reg_write(priv->bus, 0x2c, reg | BIT(25) | BIT(26));
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
 static int ag933x_phy_setup_reset_set(struct udevice *dev, int port)
 {
        struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
        int ret;
 
-       ret = ag7xxx_mdio_write(priv->bus, port, 0, MII_ADVERTISE,
-                               ADVERTISE_ALL | ADVERTISE_PAUSE_CAP |
-                               ADVERTISE_PAUSE_ASYM);
+       if (priv->model == AG7XXX_MODEL_AG953X ||
+           priv->model == AG7XXX_MODEL_AG956X) {
+               ret = ag7xxx_switch_write(priv->bus, port, MII_ADVERTISE,
+                                       ADVERTISE_ALL);
+       } else {
+               ret = ag7xxx_mdio_write(priv->bus, port, 0, MII_ADVERTISE,
+                                       ADVERTISE_ALL | ADVERTISE_PAUSE_CAP |
+                                       ADVERTISE_PAUSE_ASYM);
+       }
        if (ret)
                return ret;
 
@@ -714,8 +893,18 @@ static int ag933x_phy_setup_reset_set(struct udevice *dev, int port)
                                        ADVERTISE_1000FULL);
                if (ret)
                        return ret;
+       } else if (priv->model == AG7XXX_MODEL_AG956X) {
+               ret = ag7xxx_switch_write(priv->bus, port, MII_CTRL1000,
+                                         ADVERTISE_1000FULL);
+               if (ret)
+                       return ret;
        }
 
+       if (priv->model == AG7XXX_MODEL_AG953X ||
+           priv->model == AG7XXX_MODEL_AG956X)
+               return ag7xxx_switch_write(priv->bus, port, MII_BMCR,
+                                        BMCR_ANENABLE | BMCR_RESET);
+
        return ag7xxx_mdio_write(priv->bus, port, 0, MII_BMCR,
                                 BMCR_ANENABLE | BMCR_RESET);
 }
@@ -724,13 +913,24 @@ static int ag933x_phy_setup_reset_fin(struct udevice *dev, int port)
 {
        struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
        int ret;
+       u16 reg;
 
-       do {
-               ret = ag7xxx_mdio_read(priv->bus, port, 0, MII_BMCR);
-               if (ret < 0)
-                       return ret;
-               mdelay(10);
-       } while (ret & BMCR_RESET);
+       if (priv->model == AG7XXX_MODEL_AG953X ||
+           priv->model == AG7XXX_MODEL_AG956X) {
+               do {
+                       ret = ag7xxx_switch_read(priv->bus, port, MII_BMCR, &reg);
+                       if (ret < 0)
+                               return ret;
+                       mdelay(10);
+               } while (reg & BMCR_RESET);
+       } else {
+               do {
+                       ret = ag7xxx_mdio_read(priv->bus, port, 0, MII_BMCR);
+                       if (ret < 0)
+                               return ret;
+                       mdelay(10);
+               } while (ret & BMCR_RESET);
+       }
 
        return 0;
 }
@@ -739,10 +939,13 @@ static int ag933x_phy_setup_common(struct udevice *dev)
 {
        struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
        int i, ret, phymax;
+       u16 reg;
 
        if (priv->model == AG7XXX_MODEL_AG933X)
                phymax = 4;
-       else if (priv->model == AG7XXX_MODEL_AG934X)
+       else if (priv->model == AG7XXX_MODEL_AG934X ||
+               priv->model == AG7XXX_MODEL_AG953X ||
+               priv->model == AG7XXX_MODEL_AG956X)
                phymax = 5;
        else
                return -EINVAL;
@@ -757,7 +960,10 @@ static int ag933x_phy_setup_common(struct udevice *dev)
                        return ret;
 
                /* Read out link status */
-               ret = ag7xxx_mdio_read(priv->bus, phymax, 0, MII_MIPSCR);
+               if (priv->model == AG7XXX_MODEL_AG953X)
+                       ret = ag7xxx_switch_read(priv->bus, phymax, MII_MIPSCR, &reg);
+               else
+                       ret = ag7xxx_mdio_read(priv->bus, phymax, 0, MII_MIPSCR);
                if (ret < 0)
                        return ret;
 
@@ -779,7 +985,11 @@ static int ag933x_phy_setup_common(struct udevice *dev)
 
        for (i = 0; i < phymax; i++) {
                /* Read out link status */
-               ret = ag7xxx_mdio_read(priv->bus, i, 0, MII_MIPSCR);
+               if (priv->model == AG7XXX_MODEL_AG953X ||
+                   priv->model == AG7XXX_MODEL_AG956X)
+                       ret = ag7xxx_switch_read(priv->bus, i, MII_MIPSCR, &reg);
+               else
+                       ret = ag7xxx_mdio_read(priv->bus, i, 0, MII_MIPSCR);
                if (ret < 0)
                        return ret;
        }
@@ -841,6 +1051,63 @@ static int ag934x_phy_setup(struct udevice *dev)
        return 0;
 }
 
+static int ag956x_phy_setup(struct udevice *dev)
+{
+       struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
+       int i, ret;
+       u32 reg, ctrl;
+
+       ret = ag7xxx_switch_reg_read(priv->bus, 0x0, &reg);
+       if (ret)
+               return ret;
+       if ((reg & 0xffff) >= 0x1301)
+               ctrl = 0xc74164de;
+       else
+               ctrl = 0xc74164d0;
+
+       ret = ag7xxx_switch_reg_write(priv->bus, 0x4, BIT(7));
+       if (ret)
+               return ret;
+
+       ret = ag7xxx_switch_reg_write(priv->bus, 0xe0, ctrl);
+       if (ret)
+               return ret;
+
+       ret = ag7xxx_switch_reg_write(priv->bus, 0x624, 0x7f7f7f7f);
+       if (ret)
+               return ret;
+
+       /*
+        * Values suggested by the switch team when s17 in sgmii
+        * configuration. 0x10(S17_PWS_REG) = 0x602613a0
+        */
+       ret = ag7xxx_switch_reg_write(priv->bus, 0x10, 0x602613a0);
+       if (ret)
+               return ret;
+
+       ret = ag7xxx_switch_reg_write(priv->bus, 0x7c, 0x0000007e);
+       if (ret)
+               return ret;
+
+       /* AR8337/AR8334 v1.0 fixup */
+       ret = ag7xxx_switch_reg_read(priv->bus, 0, &reg);
+       if (ret)
+               return ret;
+       if ((reg & 0xffff) == 0x1301) {
+               for (i = 0; i < 5; i++) {
+                       /* Turn on Gigabit clock */
+                       ret = ag7xxx_switch_write(priv->bus, i, 0x1d, 0x3d);
+                       if (ret)
+                               return ret;
+                       ret = ag7xxx_switch_write(priv->bus, i, 0x1e, 0x6820);
+                       if (ret)
+                               return ret;
+               }
+       }
+
+       return 0;
+}
+
 static int ag7xxx_mac_probe(struct udevice *dev)
 {
        struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
@@ -858,8 +1125,15 @@ static int ag7xxx_mac_probe(struct udevice *dev)
                        ret = ag933x_phy_setup_wan(dev);
                else
                        ret = ag933x_phy_setup_lan(dev);
+       } else if (priv->model == AG7XXX_MODEL_AG953X) {
+               if (priv->interface == PHY_INTERFACE_MODE_RMII)
+                       ret = ag953x_phy_setup_wan(dev);
+               else
+                       ret = ag953x_phy_setup_lan(dev);
        } else if (priv->model == AG7XXX_MODEL_AG934X) {
                ret = ag934x_phy_setup(dev);
+       } else if (priv->model == AG7XXX_MODEL_AG956X) {
+               ret = ag956x_phy_setup(dev);
        } else {
                return -EINVAL;
        }
@@ -997,6 +1271,8 @@ static int ag7xxx_eth_ofdata_to_platdata(struct udevice *dev)
 static const struct udevice_id ag7xxx_eth_ids[] = {
        { .compatible = "qca,ag933x-mac", .data = AG7XXX_MODEL_AG933X },
        { .compatible = "qca,ag934x-mac", .data = AG7XXX_MODEL_AG934X },
+       { .compatible = "qca,ag953x-mac", .data = AG7XXX_MODEL_AG953X },
+       { .compatible = "qca,ag956x-mac", .data = AG7XXX_MODEL_AG956X },
        { }
 };
 
index 84f010d80576457ddf2d9f6b67b8e002ab1396df..a672250e16a166ab22d4cbc77793c53626beaa0a 100644 (file)
@@ -1491,6 +1491,7 @@ static const struct udevice_id fecmxc_ids[] = {
        { .compatible = "fsl,imx6ul-fec" },
        { .compatible = "fsl,imx53-fec" },
        { .compatible = "fsl,imx7d-fec" },
+       { .compatible = "fsl,mvf600-fec" },
        { }
 };
 
diff --git a/drivers/net/higmacv300.c b/drivers/net/higmacv300.c
new file mode 100644 (file)
index 0000000..1be8359
--- /dev/null
@@ -0,0 +1,597 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019, Linaro Limited
+ */
+
+#include <asm/io.h>
+#include <common.h>
+#include <console.h>
+#include <linux/bug.h>
+#include <linux/mii.h>
+#include <miiphy.h>
+#include <net.h>
+#include <reset.h>
+#include <wait_bit.h>
+
+#define STATION_ADDR_LOW               0x0000
+#define STATION_ADDR_HIGH              0x0004
+#define MAC_DUPLEX_HALF_CTRL           0x0008
+#define PORT_MODE                      0x0040
+#define PORT_EN                                0x0044
+#define BIT_TX_EN                      BIT(2)
+#define BIT_RX_EN                      BIT(1)
+#define MODE_CHANGE_EN                 0x01b4
+#define BIT_MODE_CHANGE_EN             BIT(0)
+#define MDIO_SINGLE_CMD                        0x03c0
+#define BIT_MDIO_BUSY                  BIT(20)
+#define MDIO_READ                      (BIT(17) | BIT_MDIO_BUSY)
+#define MDIO_WRITE                     (BIT(16) | BIT_MDIO_BUSY)
+#define MDIO_SINGLE_DATA               0x03c4
+#define MDIO_RDATA_STATUS              0x03d0
+#define BIT_MDIO_RDATA_INVALID         BIT(0)
+#define RX_FQ_START_ADDR               0x0500
+#define RX_FQ_DEPTH                    0x0504
+#define RX_FQ_WR_ADDR                  0x0508
+#define RX_FQ_RD_ADDR                  0x050c
+#define RX_FQ_REG_EN                   0x0518
+#define RX_BQ_START_ADDR               0x0520
+#define RX_BQ_DEPTH                    0x0524
+#define RX_BQ_WR_ADDR                  0x0528
+#define RX_BQ_RD_ADDR                  0x052c
+#define RX_BQ_REG_EN                   0x0538
+#define TX_BQ_START_ADDR               0x0580
+#define TX_BQ_DEPTH                    0x0584
+#define TX_BQ_WR_ADDR                  0x0588
+#define TX_BQ_RD_ADDR                  0x058c
+#define TX_BQ_REG_EN                   0x0598
+#define TX_RQ_START_ADDR               0x05a0
+#define TX_RQ_DEPTH                    0x05a4
+#define TX_RQ_WR_ADDR                  0x05a8
+#define TX_RQ_RD_ADDR                  0x05ac
+#define TX_RQ_REG_EN                   0x05b8
+#define BIT_START_ADDR_EN              BIT(2)
+#define BIT_DEPTH_EN                   BIT(1)
+#define DESC_WR_RD_ENA                 0x05cc
+#define BIT_RX_OUTCFF_WR               BIT(3)
+#define BIT_RX_CFF_RD                  BIT(2)
+#define BIT_TX_OUTCFF_WR               BIT(1)
+#define BIT_TX_CFF_RD                  BIT(0)
+#define BITS_DESC_ENA                  (BIT_RX_OUTCFF_WR | BIT_RX_CFF_RD | \
+                                        BIT_TX_OUTCFF_WR | BIT_TX_CFF_RD)
+
+/* MACIF_CTRL */
+#define RGMII_SPEED_1000               0x2c
+#define RGMII_SPEED_100                        0x2f
+#define RGMII_SPEED_10                 0x2d
+#define MII_SPEED_100                  0x0f
+#define MII_SPEED_10                   0x0d
+#define GMAC_SPEED_1000                        0x05
+#define GMAC_SPEED_100                 0x01
+#define GMAC_SPEED_10                  0x00
+#define GMAC_FULL_DUPLEX               BIT(4)
+
+#define RX_DESC_NUM                    64
+#define TX_DESC_NUM                    2
+#define DESC_SIZE                      32
+#define DESC_WORD_SHIFT                        3
+#define DESC_BYTE_SHIFT                        5
+#define DESC_CNT(n)                    ((n) >> DESC_BYTE_SHIFT)
+#define DESC_BYTE(n)                   ((n) << DESC_BYTE_SHIFT)
+#define DESC_VLD_FREE                  0
+#define DESC_VLD_BUSY                  1
+
+#define MAC_MAX_FRAME_SIZE             1600
+
+enum higmac_queue {
+       RX_FQ,
+       RX_BQ,
+       TX_BQ,
+       TX_RQ,
+};
+
+struct higmac_desc {
+       unsigned int buf_addr;
+       unsigned int buf_len:11;
+       unsigned int reserve0:5;
+       unsigned int data_len:11;
+       unsigned int reserve1:2;
+       unsigned int fl:2;
+       unsigned int descvid:1;
+       unsigned int reserve2[6];
+};
+
+struct higmac_priv {
+       void __iomem *base;
+       void __iomem *macif_ctrl;
+       struct reset_ctl rst_phy;
+       struct higmac_desc *rxfq;
+       struct higmac_desc *rxbq;
+       struct higmac_desc *txbq;
+       struct higmac_desc *txrq;
+       int rxdesc_in_use;
+       struct mii_dev *bus;
+       struct phy_device *phydev;
+       int phyintf;
+       int phyaddr;
+};
+
+#define flush_desc(d) flush_cache((unsigned long)(d), sizeof(*(d)))
+#define invalidate_desc(d) \
+       invalidate_dcache_range((unsigned long)(d), \
+                               (unsigned long)(d) + sizeof(*(d)))
+
+static int higmac_write_hwaddr(struct udevice *dev)
+{
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+       struct higmac_priv *priv = dev_get_priv(dev);
+       unsigned char *mac = pdata->enetaddr;
+       u32 val;
+
+       val = mac[1] | (mac[0] << 8);
+       writel(val, priv->base + STATION_ADDR_HIGH);
+
+       val = mac[5] | (mac[4] << 8) | (mac[3] << 16) | (mac[2] << 24);
+       writel(val, priv->base + STATION_ADDR_LOW);
+
+       return 0;
+}
+
+static int higmac_free_pkt(struct udevice *dev, uchar *packet, int length)
+{
+       struct higmac_priv *priv = dev_get_priv(dev);
+
+       /* Inform GMAC that the RX descriptor is no longer in use */
+       writel(DESC_BYTE(priv->rxdesc_in_use), priv->base + RX_BQ_RD_ADDR);
+
+       return 0;
+}
+
+static int higmac_recv(struct udevice *dev, int flags, uchar **packetp)
+{
+       struct higmac_priv *priv = dev_get_priv(dev);
+       struct higmac_desc *fqd = priv->rxfq;
+       struct higmac_desc *bqd = priv->rxbq;
+       int fqw_pos, fqr_pos, bqw_pos, bqr_pos;
+       int timeout = 100000;
+       int len = 0;
+       int space;
+       int i;
+
+       fqw_pos = DESC_CNT(readl(priv->base + RX_FQ_WR_ADDR));
+       fqr_pos = DESC_CNT(readl(priv->base + RX_FQ_RD_ADDR));
+
+       if (fqw_pos >= fqr_pos)
+               space = RX_DESC_NUM - (fqw_pos - fqr_pos);
+       else
+               space = fqr_pos - fqw_pos;
+
+       /* Leave one free to distinguish full filled from empty buffer */
+       for (i = 0; i < space - 1; i++) {
+               fqd = priv->rxfq + fqw_pos;
+               invalidate_dcache_range(fqd->buf_addr,
+                                       fqd->buf_addr + MAC_MAX_FRAME_SIZE);
+
+               if (++fqw_pos >= RX_DESC_NUM)
+                       fqw_pos = 0;
+
+               writel(DESC_BYTE(fqw_pos), priv->base + RX_FQ_WR_ADDR);
+       }
+
+       bqr_pos = DESC_CNT(readl(priv->base + RX_BQ_RD_ADDR));
+       bqd += bqr_pos;
+       /* BQ is only ever written by GMAC */
+       invalidate_desc(bqd);
+
+       do {
+               bqw_pos = DESC_CNT(readl(priv->base + RX_BQ_WR_ADDR));
+               udelay(1);
+       } while (--timeout && bqw_pos == bqr_pos);
+
+       if (!timeout)
+               return -ETIMEDOUT;
+
+       if (++bqr_pos >= RX_DESC_NUM)
+               bqr_pos = 0;
+
+       len = bqd->data_len;
+
+       /* CPU should not have touched this buffer since we added it to FQ */
+       invalidate_dcache_range(bqd->buf_addr, bqd->buf_addr + len);
+       *packetp = (void *)(unsigned long)bqd->buf_addr;
+
+       /* Record the RX_BQ descriptor that is holding RX data */
+       priv->rxdesc_in_use = bqr_pos;
+
+       return len;
+}
+
+static int higmac_send(struct udevice *dev, void *packet, int length)
+{
+       struct higmac_priv *priv = dev_get_priv(dev);
+       struct higmac_desc *bqd = priv->txbq;
+       int bqw_pos, rqw_pos, rqr_pos;
+       int timeout = 1000;
+
+       flush_cache((unsigned long)packet, length);
+
+       bqw_pos = DESC_CNT(readl(priv->base + TX_BQ_WR_ADDR));
+       bqd += bqw_pos;
+       bqd->buf_addr = (unsigned long)packet;
+       bqd->descvid = DESC_VLD_BUSY;
+       bqd->data_len = length;
+       flush_desc(bqd);
+
+       if (++bqw_pos >= TX_DESC_NUM)
+               bqw_pos = 0;
+
+       writel(DESC_BYTE(bqw_pos), priv->base + TX_BQ_WR_ADDR);
+
+       rqr_pos = DESC_CNT(readl(priv->base + TX_RQ_RD_ADDR));
+       if (++rqr_pos >= TX_DESC_NUM)
+               rqr_pos = 0;
+
+       do {
+               rqw_pos = DESC_CNT(readl(priv->base + TX_RQ_WR_ADDR));
+               udelay(1);
+       } while (--timeout && rqr_pos != rqw_pos);
+
+       if (!timeout)
+               return -ETIMEDOUT;
+
+       writel(DESC_BYTE(rqr_pos), priv->base + TX_RQ_RD_ADDR);
+
+       return 0;
+}
+
+static int higmac_adjust_link(struct higmac_priv *priv)
+{
+       struct phy_device *phydev = priv->phydev;
+       int interface = priv->phyintf;
+       u32 val;
+
+       switch (interface) {
+       case PHY_INTERFACE_MODE_RGMII:
+               if (phydev->speed == SPEED_1000)
+                       val = RGMII_SPEED_1000;
+               else if (phydev->speed == SPEED_100)
+                       val = RGMII_SPEED_100;
+               else
+                       val = RGMII_SPEED_10;
+               break;
+       case PHY_INTERFACE_MODE_MII:
+               if (phydev->speed == SPEED_100)
+                       val = MII_SPEED_100;
+               else
+                       val = MII_SPEED_10;
+               break;
+       default:
+               debug("unsupported mode: %d\n", interface);
+               return -EINVAL;
+       }
+
+       if (phydev->duplex)
+               val |= GMAC_FULL_DUPLEX;
+
+       writel(val, priv->macif_ctrl);
+
+       if (phydev->speed == SPEED_1000)
+               val = GMAC_SPEED_1000;
+       else if (phydev->speed == SPEED_100)
+               val = GMAC_SPEED_100;
+       else
+               val = GMAC_SPEED_10;
+
+       writel(BIT_MODE_CHANGE_EN, priv->base + MODE_CHANGE_EN);
+       writel(val, priv->base + PORT_MODE);
+       writel(0, priv->base + MODE_CHANGE_EN);
+       writel(phydev->duplex, priv->base + MAC_DUPLEX_HALF_CTRL);
+
+       return 0;
+}
+
+static int higmac_start(struct udevice *dev)
+{
+       struct higmac_priv *priv = dev_get_priv(dev);
+       struct phy_device *phydev = priv->phydev;
+       int ret;
+
+       ret = phy_startup(phydev);
+       if (ret)
+               return ret;
+
+       if (!phydev->link) {
+               debug("%s: link down\n", phydev->dev->name);
+               return -ENODEV;
+       }
+
+       ret = higmac_adjust_link(priv);
+       if (ret)
+               return ret;
+
+       /* Enable port */
+       writel(BITS_DESC_ENA, priv->base + DESC_WR_RD_ENA);
+       writel(BIT_TX_EN | BIT_RX_EN, priv->base + PORT_EN);
+
+       return 0;
+}
+
+static void higmac_stop(struct udevice *dev)
+{
+       struct higmac_priv *priv = dev_get_priv(dev);
+
+       /* Disable port */
+       writel(0, priv->base + PORT_EN);
+       writel(0, priv->base + DESC_WR_RD_ENA);
+}
+
+static const struct eth_ops higmac_ops = {
+       .start          = higmac_start,
+       .send           = higmac_send,
+       .recv           = higmac_recv,
+       .free_pkt       = higmac_free_pkt,
+       .stop           = higmac_stop,
+       .write_hwaddr   = higmac_write_hwaddr,
+};
+
+static int higmac_mdio_read(struct mii_dev *bus, int addr, int devad, int reg)
+{
+       struct higmac_priv *priv = bus->priv;
+       int ret;
+
+       ret = wait_for_bit_le32(priv->base + MDIO_SINGLE_CMD, BIT_MDIO_BUSY,
+                               false, 1000, false);
+       if (ret)
+               return ret;
+
+       writel(MDIO_READ | addr << 8 | reg, priv->base + MDIO_SINGLE_CMD);
+
+       ret = wait_for_bit_le32(priv->base + MDIO_SINGLE_CMD, BIT_MDIO_BUSY,
+                               false, 1000, false);
+       if (ret)
+               return ret;
+
+       if (readl(priv->base + MDIO_RDATA_STATUS) & BIT_MDIO_RDATA_INVALID)
+               return -EINVAL;
+
+       return readl(priv->base + MDIO_SINGLE_DATA) >> 16;
+}
+
+static int higmac_mdio_write(struct mii_dev *bus, int addr, int devad,
+                            int reg, u16 value)
+{
+       struct higmac_priv *priv = bus->priv;
+       int ret;
+
+       ret = wait_for_bit_le32(priv->base + MDIO_SINGLE_CMD, BIT_MDIO_BUSY,
+                               false, 1000, false);
+       if (ret)
+               return ret;
+
+       writel(value, priv->base + MDIO_SINGLE_DATA);
+       writel(MDIO_WRITE | addr << 8 | reg, priv->base + MDIO_SINGLE_CMD);
+
+       return 0;
+}
+
+static int higmac_init_rx_descs(struct higmac_desc *descs, int num)
+{
+       int i;
+
+       for (i = 0; i < num; i++) {
+               struct higmac_desc *desc = &descs[i];
+
+               desc->buf_addr = (unsigned long)memalign(ARCH_DMA_MINALIGN,
+                                                        MAC_MAX_FRAME_SIZE);
+               if (!desc->buf_addr)
+                       goto free_bufs;
+
+               desc->descvid = DESC_VLD_FREE;
+               desc->buf_len = MAC_MAX_FRAME_SIZE - 1;
+               flush_desc(desc);
+       }
+
+       return 0;
+
+free_bufs:
+       while (--i > 0)
+               free((void *)(unsigned long)descs[i].buf_addr);
+       return -ENOMEM;
+}
+
+static int higmac_init_hw_queue(struct higmac_priv *priv,
+                               enum higmac_queue queue)
+{
+       struct higmac_desc *desc, **pdesc;
+       u32 regaddr, regen, regdep;
+       int depth;
+       int len;
+
+       switch (queue) {
+       case RX_FQ:
+               regaddr = RX_FQ_START_ADDR;
+               regen = RX_FQ_REG_EN;
+               regdep = RX_FQ_DEPTH;
+               depth = RX_DESC_NUM;
+               pdesc = &priv->rxfq;
+               break;
+       case RX_BQ:
+               regaddr = RX_BQ_START_ADDR;
+               regen = RX_BQ_REG_EN;
+               regdep = RX_BQ_DEPTH;
+               depth = RX_DESC_NUM;
+               pdesc = &priv->rxbq;
+               break;
+       case TX_BQ:
+               regaddr = TX_BQ_START_ADDR;
+               regen = TX_BQ_REG_EN;
+               regdep = TX_BQ_DEPTH;
+               depth = TX_DESC_NUM;
+               pdesc = &priv->txbq;
+               break;
+       case TX_RQ:
+               regaddr = TX_RQ_START_ADDR;
+               regen = TX_RQ_REG_EN;
+               regdep = TX_RQ_DEPTH;
+               depth = TX_DESC_NUM;
+               pdesc = &priv->txrq;
+               break;
+       }
+
+       /* Enable depth */
+       writel(BIT_DEPTH_EN, priv->base + regen);
+       writel(depth << DESC_WORD_SHIFT, priv->base + regdep);
+       writel(0, priv->base + regen);
+
+       len = depth * sizeof(*desc);
+       desc = memalign(ARCH_DMA_MINALIGN, len);
+       if (!desc)
+               return -ENOMEM;
+       memset(desc, 0, len);
+       flush_cache((unsigned long)desc, len);
+       *pdesc = desc;
+
+       /* Set up RX_FQ descriptors */
+       if (queue == RX_FQ)
+               higmac_init_rx_descs(desc, depth);
+
+       /* Enable start address */
+       writel(BIT_START_ADDR_EN, priv->base + regen);
+       writel((unsigned long)desc, priv->base + regaddr);
+       writel(0, priv->base + regen);
+
+       return 0;
+}
+
+static int higmac_hw_init(struct higmac_priv *priv)
+{
+       int ret;
+
+       /* Initialize hardware queues */
+       ret = higmac_init_hw_queue(priv, RX_FQ);
+       if (ret)
+               return ret;
+
+       ret = higmac_init_hw_queue(priv, RX_BQ);
+       if (ret)
+               goto free_rx_fq;
+
+       ret = higmac_init_hw_queue(priv, TX_BQ);
+       if (ret)
+               goto free_rx_bq;
+
+       ret = higmac_init_hw_queue(priv, TX_RQ);
+       if (ret)
+               goto free_tx_bq;
+
+       /* Reset phy */
+       reset_deassert(&priv->rst_phy);
+       mdelay(10);
+       reset_assert(&priv->rst_phy);
+       mdelay(30);
+       reset_deassert(&priv->rst_phy);
+       mdelay(30);
+
+       return 0;
+
+free_tx_bq:
+       free(priv->txbq);
+free_rx_bq:
+       free(priv->rxbq);
+free_rx_fq:
+       free(priv->rxfq);
+       return ret;
+}
+
+static int higmac_probe(struct udevice *dev)
+{
+       struct higmac_priv *priv = dev_get_priv(dev);
+       struct phy_device *phydev;
+       struct mii_dev *bus;
+       int ret;
+
+       ret = higmac_hw_init(priv);
+       if (ret)
+               return ret;
+
+       bus = mdio_alloc();
+       if (!bus)
+               return -ENOMEM;
+
+       bus->read = higmac_mdio_read;
+       bus->write = higmac_mdio_write;
+       bus->priv = priv;
+       priv->bus = bus;
+
+       ret = mdio_register_seq(bus, dev->seq);
+       if (ret)
+               return ret;
+
+       phydev = phy_connect(bus, priv->phyaddr, dev, priv->phyintf);
+       if (!phydev)
+               return -ENODEV;
+
+       phydev->supported &= PHY_GBIT_FEATURES;
+       phydev->advertising = phydev->supported;
+       priv->phydev = phydev;
+
+       return phy_config(phydev);
+}
+
+static int higmac_remove(struct udevice *dev)
+{
+       struct higmac_priv *priv = dev_get_priv(dev);
+       int i;
+
+       mdio_unregister(priv->bus);
+       mdio_free(priv->bus);
+
+       /* Free RX packet buffers */
+       for (i = 0; i < RX_DESC_NUM; i++)
+               free((void *)(unsigned long)priv->rxfq[i].buf_addr);
+
+       return 0;
+}
+
+static int higmac_ofdata_to_platdata(struct udevice *dev)
+{
+       struct higmac_priv *priv = dev_get_priv(dev);
+       int phyintf = PHY_INTERFACE_MODE_NONE;
+       const char *phy_mode;
+       ofnode phy_node;
+
+       priv->base = dev_remap_addr_index(dev, 0);
+       priv->macif_ctrl = dev_remap_addr_index(dev, 1);
+
+       phy_mode = dev_read_string(dev, "phy-mode");
+       if (phy_mode)
+               phyintf = phy_get_interface_by_name(phy_mode);
+       if (phyintf == PHY_INTERFACE_MODE_NONE)
+               return -ENODEV;
+       priv->phyintf = phyintf;
+
+       phy_node = dev_read_subnode(dev, "phy");
+       if (!ofnode_valid(phy_node)) {
+               debug("failed to find phy node\n");
+               return -ENODEV;
+       }
+       priv->phyaddr = ofnode_read_u32_default(phy_node, "reg", 0);
+
+       return reset_get_by_name(dev, "phy", &priv->rst_phy);
+}
+
+static const struct udevice_id higmac_ids[] = {
+       { .compatible = "hisilicon,hi3798cv200-gmac" },
+       { }
+};
+
+U_BOOT_DRIVER(eth_higmac) = {
+       .name   = "eth_higmac",
+       .id     = UCLASS_ETH,
+       .of_match = higmac_ids,
+       .ofdata_to_platdata = higmac_ofdata_to_platdata,
+       .probe  = higmac_probe,
+       .remove = higmac_remove,
+       .ops    = &higmac_ops,
+       .priv_auto_alloc_size = sizeof(struct higmac_priv),
+       .platdata_auto_alloc_size = sizeof(struct eth_pdata),
+};
index 88e5a97c4bfa982ae16c726b4d40d2c3f9cb9836..6359d0b61015915b7a0f63cdff9bd056e77fed3f 100644 (file)
@@ -15,3 +15,17 @@ config MSCC_LUTON_SWITCH
        select PHYLIB
        help
          This driver supports the Luton network switch device.
+
+config MSCC_JR2_SWITCH
+       bool "Jaguar2 switch driver"
+       depends on DM_ETH && ARCH_MSCC
+       select PHYLIB
+       help
+         This driver supports the Jaguar2 network switch device.
+
+config MSCC_SERVALT_SWITCH
+       bool "Servalt switch driver"
+       depends on DM_ETH && ARCH_MSCC
+       select PHYLIB
+       help
+         This driver supports the Servalt network switch device.
index 751a839a5f00b1208f60a808b8f1552a876d5299..bffd8ec77b0f6a11f00c12db1df91ac9b3f6be24 100644 (file)
@@ -1,3 +1,5 @@
 
 obj-$(CONFIG_MSCC_OCELOT_SWITCH) += ocelot_switch.o mscc_miim.o mscc_xfer.o mscc_mac_table.o
 obj-$(CONFIG_MSCC_LUTON_SWITCH) += luton_switch.o mscc_miim.o mscc_xfer.o mscc_mac_table.o
+obj-$(CONFIG_MSCC_JR2_SWITCH) += jr2_switch.o mscc_xfer.o
+obj-$(CONFIG_MSCC_SERVALT_SWITCH) += servalt_switch.o mscc_xfer.o
diff --git a/drivers/net/mscc_eswitch/jr2_switch.c b/drivers/net/mscc_eswitch/jr2_switch.c
new file mode 100644 (file)
index 0000000..60d408f
--- /dev/null
@@ -0,0 +1,1075 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2018 Microsemi Corporation
+ */
+
+#include <common.h>
+#include <config.h>
+#include <dm.h>
+#include <dm/of_access.h>
+#include <dm/of_addr.h>
+#include <fdt_support.h>
+#include <linux/io.h>
+#include <linux/ioport.h>
+#include <miiphy.h>
+#include <net.h>
+#include <wait_bit.h>
+
+#include <dt-bindings/mscc/jr2_data.h>
+#include "mscc_xfer.h"
+
+#define GCB_MIIM_MII_STATUS            0x0
+#define                GCB_MIIM_STAT_BUSY              BIT(3)
+#define GCB_MIIM_MII_CMD               0x8
+#define                GCB_MIIM_MII_CMD_SCAN           BIT(0)
+#define                GCB_MIIM_MII_CMD_OPR_WRITE      BIT(1)
+#define                GCB_MIIM_MII_CMD_OPR_READ       BIT(2)
+#define                GCB_MIIM_MII_CMD_SINGLE_SCAN    BIT(3)
+#define                GCB_MIIM_MII_CMD_WRDATA(x)      ((x) << 4)
+#define                GCB_MIIM_MII_CMD_REGAD(x)       ((x) << 20)
+#define                GCB_MIIM_MII_CMD_PHYAD(x)       ((x) << 25)
+#define                GCB_MIIM_MII_CMD_VLD            BIT(31)
+#define GCB_MIIM_DATA                  0xC
+#define                GCB_MIIM_DATA_ERROR             (0x3 << 16)
+
+#define ANA_AC_RAM_CTRL_RAM_INIT               0x94358
+#define ANA_AC_STAT_GLOBAL_CFG_PORT_RESET      0x94370
+
+#define ANA_CL_PORT_VLAN_CFG(x)                        (0x24018 + 0xc8 * (x))
+#define                ANA_CL_PORT_VLAN_CFG_AWARE_ENA                  BIT(19)
+#define                ANA_CL_PORT_VLAN_CFG_POP_CNT(x)                 ((x) << 17)
+
+#define ANA_L2_COMMON_FWD_CFG                  0x8a2a8
+#define                ANA_L2_COMMON_FWD_CFG_CPU_DMAC_COPY_ENA BIT(6)
+
+#define ASM_CFG_STAT_CFG                       0x3508
+#define ASM_CFG_PORT(x)                                (0x36c4 + 0x4 * (x))
+#define                ASM_CFG_PORT_NO_PREAMBLE_ENA            BIT(8)
+#define                ASM_CFG_PORT_INJ_FORMAT_CFG(x)          ((x) << 1)
+#define ASM_RAM_CTRL_RAM_INIT                  0x39b8
+
+#define DEV_DEV_CFG_DEV_RST_CTRL               0x0
+#define                DEV_DEV_CFG_DEV_RST_CTRL_SPEED_SEL(x)   ((x) << 20)
+#define DEV_MAC_CFG_MAC_ENA            0x1c
+#define                DEV_MAC_CFG_MAC_ENA_RX_ENA              BIT(4)
+#define                DEV_MAC_CFG_MAC_ENA_TX_ENA              BIT(0)
+#define        DEV_MAC_CFG_MAC_IFG             0x34
+#define                DEV_MAC_CFG_MAC_IFG_TX_IFG(x)           ((x) << 8)
+#define                DEV_MAC_CFG_MAC_IFG_RX_IFG2(x)          ((x) << 4)
+#define                DEV_MAC_CFG_MAC_IFG_RX_IFG1(x)          (x)
+#define        DEV_PCS1G_CFG_PCS1G_CFG         0x40
+#define                DEV_PCS1G_CFG_PCS1G_CFG_PCS_ENA         BIT(0)
+#define        DEV_PCS1G_CFG_PCS1G_MODE        0x44
+#define        DEV_PCS1G_CFG_PCS1G_SD          0x48
+#define        DEV_PCS1G_CFG_PCS1G_ANEG        0x4c
+#define                DEV_PCS1G_CFG_PCS1G_ANEG_ADV_ABILITY(x) ((x) << 16)
+
+#define DSM_RAM_CTRL_RAM_INIT          0x8
+
+#define HSIO_ANA_SERDES1G_DES_CFG              0xac
+#define                HSIO_ANA_SERDES1G_DES_CFG_BW_HYST(x)            ((x) << 1)
+#define                HSIO_ANA_SERDES1G_DES_CFG_BW_ANA(x)             ((x) << 5)
+#define                HSIO_ANA_SERDES1G_DES_CFG_MBTR_CTRL(x)          ((x) << 8)
+#define                HSIO_ANA_SERDES1G_DES_CFG_PHS_CTRL(x)           ((x) << 13)
+#define HSIO_ANA_SERDES1G_IB_CFG               0xb0
+#define                HSIO_ANA_SERDES1G_IB_CFG_RESISTOR_CTRL(x)       (x)
+#define                HSIO_ANA_SERDES1G_IB_CFG_EQ_GAIN(x)             ((x) << 6)
+#define                HSIO_ANA_SERDES1G_IB_CFG_ENA_OFFSET_COMP        BIT(9)
+#define                HSIO_ANA_SERDES1G_IB_CFG_ENA_DETLEV             BIT(11)
+#define                HSIO_ANA_SERDES1G_IB_CFG_ENA_CMV_TERM           BIT(13)
+#define                HSIO_ANA_SERDES1G_IB_CFG_DET_LEV(x)             ((x) << 19)
+#define                HSIO_ANA_SERDES1G_IB_CFG_ACJTAG_HYST(x)         ((x) << 24)
+#define HSIO_ANA_SERDES1G_OB_CFG               0xb4
+#define                HSIO_ANA_SERDES1G_OB_CFG_RESISTOR_CTRL(x)       (x)
+#define                HSIO_ANA_SERDES1G_OB_CFG_VCM_CTRL(x)            ((x) << 4)
+#define                HSIO_ANA_SERDES1G_OB_CFG_CMM_BIAS_CTRL(x)       ((x) << 10)
+#define                HSIO_ANA_SERDES1G_OB_CFG_AMP_CTRL(x)            ((x) << 13)
+#define                HSIO_ANA_SERDES1G_OB_CFG_SLP(x)                 ((x) << 17)
+#define HSIO_ANA_SERDES1G_SER_CFG              0xb8
+#define HSIO_ANA_SERDES1G_COMMON_CFG           0xbc
+#define                HSIO_ANA_SERDES1G_COMMON_CFG_IF_MODE            BIT(0)
+#define                HSIO_ANA_SERDES1G_COMMON_CFG_ENA_LANE           BIT(18)
+#define                HSIO_ANA_SERDES1G_COMMON_CFG_SYS_RST            BIT(31)
+#define HSIO_ANA_SERDES1G_PLL_CFG              0xc0
+#define                HSIO_ANA_SERDES1G_PLL_CFG_FSM_ENA               BIT(7)
+#define                HSIO_ANA_SERDES1G_PLL_CFG_FSM_CTRL_DATA(x)      ((x) << 8)
+#define                HSIO_ANA_SERDES1G_PLL_CFG_ENA_RC_DIV2           BIT(21)
+#define HSIO_DIG_SERDES1G_DFT_CFG0             0xc8
+#define HSIO_DIG_SERDES1G_TP_CFG               0xd4
+#define HSIO_DIG_SERDES1G_MISC_CFG             0xdc
+#define                HSIO_DIG_SERDES1G_MISC_CFG_LANE_RST             BIT(0)
+#define HSIO_MCB_SERDES1G_CFG                  0xe8
+#define                HSIO_MCB_SERDES1G_CFG_WR_ONE_SHOT               BIT(31)
+#define                HSIO_MCB_SERDES1G_CFG_ADDR(x)                   (x)
+
+#define HSIO_ANA_SERDES6G_DES_CFG              0x11c
+#define                HSIO_ANA_SERDES6G_DES_CFG_SWAP_ANA              BIT(0)
+#define                HSIO_ANA_SERDES6G_DES_CFG_BW_ANA(x)             ((x) << 1)
+#define                HSIO_ANA_SERDES6G_DES_CFG_SWAP_HYST             BIT(4)
+#define                HSIO_ANA_SERDES6G_DES_CFG_BW_HYST(x)            ((x) << 5)
+#define                HSIO_ANA_SERDES6G_DES_CFG_CPMD_SEL(x)           ((x) << 8)
+#define                HSIO_ANA_SERDES6G_DES_CFG_MBTR_CTRL(x)          ((x) << 10)
+#define                HSIO_ANA_SERDES6G_DES_CFG_PHS_CTRL(x)           ((x) << 13)
+#define HSIO_ANA_SERDES6G_IB_CFG               0x120
+#define                HSIO_ANA_SERDES6G_IB_CFG_REG_ENA                BIT(0)
+#define                HSIO_ANA_SERDES6G_IB_CFG_EQZ_ENA                BIT(1)
+#define                HSIO_ANA_SERDES6G_IB_CFG_SAM_ENA                BIT(2)
+#define                HSIO_ANA_SERDES6G_IB_CFG_CAL_ENA(x)             ((x) << 3)
+#define                HSIO_ANA_SERDES6G_IB_CFG_CONCUR                 BIT(4)
+#define                HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_ENA            BIT(5)
+#define                HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_OFF(x)     ((x) << 7)
+#define                HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_LP(x)      ((x) << 9)
+#define                HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_MID(x)     ((x) << 11)
+#define                HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_HP(x)      ((x) << 13)
+#define                HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_CLK_SEL(x)     ((x) << 15)
+#define                HSIO_ANA_SERDES6G_IB_CFG_TERM_MODE_SEL(x)       ((x) << 18)
+#define                HSIO_ANA_SERDES6G_IB_CFG_ICML_ADJ(x)            ((x) << 20)
+#define                HSIO_ANA_SERDES6G_IB_CFG_RTRM_ADJ(x)            ((x) << 24)
+#define                HSIO_ANA_SERDES6G_IB_CFG_VBULK_SEL              BIT(28)
+#define                HSIO_ANA_SERDES6G_IB_CFG_SOFSI(x)               ((x) << 29)
+#define HSIO_ANA_SERDES6G_IB_CFG1              0x124
+#define                HSIO_ANA_SERDES6G_IB_CFG1_FILT_OFFSET           BIT(4)
+#define                HSIO_ANA_SERDES6G_IB_CFG1_FILT_LP               BIT(5)
+#define                HSIO_ANA_SERDES6G_IB_CFG1_FILT_MID              BIT(6)
+#define                HSIO_ANA_SERDES6G_IB_CFG1_FILT_HP               BIT(7)
+#define                HSIO_ANA_SERDES6G_IB_CFG1_SCALY(x)              ((x) << 8)
+#define                HSIO_ANA_SERDES6G_IB_CFG1_TSDET(x)              ((x) << 12)
+#define                HSIO_ANA_SERDES6G_IB_CFG1_TJTAG(x)              ((x) << 17)
+#define HSIO_ANA_SERDES6G_IB_CFG2              0x128
+#define                HSIO_ANA_SERDES6G_IB_CFG2_UREG(x)               (x)
+#define                HSIO_ANA_SERDES6G_IB_CFG2_UMAX(x)               ((x) << 3)
+#define                HSIO_ANA_SERDES6G_IB_CFG2_TCALV(x)              ((x) << 5)
+#define                HSIO_ANA_SERDES6G_IB_CFG2_OCALS(x)              ((x) << 10)
+#define                HSIO_ANA_SERDES6G_IB_CFG2_OINFS(x)              ((x) << 16)
+#define                HSIO_ANA_SERDES6G_IB_CFG2_OINFI(x)              ((x) << 22)
+#define                HSIO_ANA_SERDES6G_IB_CFG2_TINFV(x)              ((x) << 27)
+#define HSIO_ANA_SERDES6G_IB_CFG3              0x12c
+#define                HSIO_ANA_SERDES6G_IB_CFG3_INI_OFFSET(x)         (x)
+#define                HSIO_ANA_SERDES6G_IB_CFG3_INI_LP(x)             ((x) << 6)
+#define                HSIO_ANA_SERDES6G_IB_CFG3_INI_MID(x)            ((x) << 12)
+#define                HSIO_ANA_SERDES6G_IB_CFG3_INI_HP(x)             ((x) << 18)
+#define HSIO_ANA_SERDES6G_IB_CFG4              0x130
+#define                HSIO_ANA_SERDES6G_IB_CFG4_MAX_OFFSET(x)         (x)
+#define                HSIO_ANA_SERDES6G_IB_CFG4_MAX_LP(x)             ((x) << 6)
+#define                HSIO_ANA_SERDES6G_IB_CFG4_MAX_MID(x)            ((x) << 12)
+#define                HSIO_ANA_SERDES6G_IB_CFG4_MAX_HP(x)             ((x) << 18)
+#define HSIO_ANA_SERDES6G_IB_CFG5              0x134
+#define                HSIO_ANA_SERDES6G_IB_CFG4_MIN_OFFSET(x)         (x)
+#define                HSIO_ANA_SERDES6G_IB_CFG4_MIN_LP(x)             ((x) << 6)
+#define                HSIO_ANA_SERDES6G_IB_CFG4_MIN_MID(x)            ((x) << 12)
+#define                HSIO_ANA_SERDES6G_IB_CFG4_MIN_HP(x)             ((x) << 18)
+#define HSIO_ANA_SERDES6G_OB_CFG               0x138
+#define                HSIO_ANA_SERDES6G_OB_CFG_RESISTOR_CTRL(x)       (x)
+#define                HSIO_ANA_SERDES6G_OB_CFG_SR(x)                  ((x) << 4)
+#define                HSIO_ANA_SERDES6G_OB_CFG_SR_H                   BIT(8)
+#define                HSIO_ANA_SERDES6G_OB_CFG_SEL_RCTRL              BIT(9)
+#define                HSIO_ANA_SERDES6G_OB_CFG_R_COR                  BIT(10)
+#define                HSIO_ANA_SERDES6G_OB_CFG_POST1(x)               ((x) << 11)
+#define                HSIO_ANA_SERDES6G_OB_CFG_R_ADJ_PDR              BIT(16)
+#define                HSIO_ANA_SERDES6G_OB_CFG_R_ADJ_MUX              BIT(17)
+#define                HSIO_ANA_SERDES6G_OB_CFG_PREC(x)                ((x) << 18)
+#define                HSIO_ANA_SERDES6G_OB_CFG_POST0(x)               ((x) << 23)
+#define                HSIO_ANA_SERDES6G_OB_CFG_POL                    BIT(29)
+#define                HSIO_ANA_SERDES6G_OB_CFG_ENA1V_MODE(x)          ((x) << 30)
+#define                HSIO_ANA_SERDES6G_OB_CFG_IDLE                   BIT(31)
+#define HSIO_ANA_SERDES6G_OB_CFG1              0x13c
+#define                HSIO_ANA_SERDES6G_OB_CFG1_LEV(x)                (x)
+#define                HSIO_ANA_SERDES6G_OB_CFG1_ENA_CAS(x)            ((x) << 6)
+#define HSIO_ANA_SERDES6G_SER_CFG              0x140
+#define HSIO_ANA_SERDES6G_COMMON_CFG           0x144
+#define                HSIO_ANA_SERDES6G_COMMON_CFG_IF_MODE(x)         (x)
+#define                HSIO_ANA_SERDES6G_COMMON_CFG_QRATE(x)           (x << 2)
+#define                HSIO_ANA_SERDES6G_COMMON_CFG_ENA_LANE           BIT(14)
+#define                HSIO_ANA_SERDES6G_COMMON_CFG_SYS_RST            BIT(16)
+#define HSIO_ANA_SERDES6G_PLL_CFG              0x148
+#define                HSIO_ANA_SERDES6G_PLL_CFG_ROT_FRQ               BIT(0)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_ROT_DIR               BIT(1)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_RB_DATA_SEL           BIT(2)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_FSM_OOR_RECAL_ENA     BIT(3)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_FSM_FORCE_SET_ENA     BIT(4)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_FSM_ENA               BIT(5)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_FSM_CTRL_DATA(x)      ((x) << 6)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_ENA_ROT               BIT(14)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_DIV4                  BIT(15)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_ENA_OFFS(x)           ((x) << 16)
+#define HSIO_DIG_SERDES6G_MISC_CFG             0x108
+#define                HSIO_DIG_SERDES6G_MISC_CFG_LANE_RST             BIT(0)
+#define HSIO_MCB_SERDES6G_CFG                  0x168
+#define                HSIO_MCB_SERDES6G_CFG_WR_ONE_SHOT               BIT(31)
+#define                HSIO_MCB_SERDES6G_CFG_ADDR(x)                   (x)
+#define HSIO_HW_CFGSTAT_HW_CFG                 0x16c
+
+#define LRN_COMMON_ACCESS_CTRL                 0x0
+#define                LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT    BIT(0)
+#define LRN_COMMON_MAC_ACCESS_CFG0             0x4
+#define LRN_COMMON_MAC_ACCESS_CFG1             0x8
+#define LRN_COMMON_MAC_ACCESS_CFG2             0xc
+#define                LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_ADDR(x)    (x)
+#define                LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_TYPE(x)    ((x) << 12)
+#define                LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_VLD        BIT(15)
+#define                LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_LOCKED     BIT(16)
+#define                LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_CPU_COPY   BIT(23)
+#define                LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_CPU_QU(x)  ((x) << 24)
+
+#define QFWD_SYSTEM_SWITCH_PORT_MODE(x)                (0x4 * (x))
+#define                QFWD_SYSTEM_SWITCH_PORT_MODE_PORT_ENA           BIT(17)
+
+#define QS_XTR_GRP_CFG(x)              (0x0 + 4 * (x))
+#define QS_INJ_GRP_CFG(x)              (0x24 + (x) * 4)
+
+#define QSYS_SYSTEM_RESET_CFG                  0xf0
+#define QSYS_CALCFG_CAL_AUTO(x)                        (0x3d4 + 4 * (x))
+#define QSYS_CALCFG_CAL_CTRL                   0x3e8
+#define                QSYS_CALCFG_CAL_CTRL_CAL_MODE(x)                ((x) << 11)
+#define QSYS_RAM_CTRL_RAM_INIT                 0x3ec
+
+#define REW_RAM_CTRL_RAM_INIT                  0x53528
+
+#define VOP_RAM_CTRL_RAM_INIT                  0x43638
+
+#define XTR_VALID_BYTES(x)     (4 - ((x) & 3))
+#define MAC_VID                        0
+#define CPU_PORT               53
+#define IFH_LEN                        7
+#define JR2_BUF_CELL_SZ                60
+#define ETH_ALEN               6
+#define PGID_BROADCAST         510
+#define PGID_UNICAST           511
+
+static const char * const regs_names[] = {
+       "port0", "port1", "port2", "port3", "port4", "port5", "port6", "port7",
+       "port8", "port9", "port10", "port11", "port12", "port13", "port14",
+       "port15", "port16", "port17", "port18", "port19", "port20", "port21",
+       "port22", "port23", "port24", "port25", "port26", "port27", "port28",
+       "port29", "port30", "port31", "port32", "port33", "port34", "port35",
+       "port36", "port37", "port38", "port39", "port40", "port41", "port42",
+       "port43", "port44", "port45", "port46", "port47",
+       "ana_ac", "ana_cl", "ana_l2", "asm", "hsio", "lrn",
+       "qfwd", "qs", "qsys", "rew",
+};
+
+#define REGS_NAMES_COUNT ARRAY_SIZE(regs_names) + 1
+#define MAX_PORT 48
+
+enum jr2_ctrl_regs {
+       ANA_AC = MAX_PORT,
+       ANA_CL,
+       ANA_L2,
+       ASM,
+       HSIO,
+       LRN,
+       QFWD,
+       QS,
+       QSYS,
+       REW,
+};
+
+#define JR2_MIIM_BUS_COUNT 3
+
+struct jr2_phy_port_t {
+       size_t phy_addr;
+       struct mii_dev *bus;
+       u8 serdes_index;
+       u8 phy_mode;
+};
+
+struct jr2_private {
+       void __iomem *regs[REGS_NAMES_COUNT];
+       struct mii_dev *bus[JR2_MIIM_BUS_COUNT];
+       struct jr2_phy_port_t ports[MAX_PORT];
+};
+
+struct jr2_miim_dev {
+       void __iomem *regs;
+       phys_addr_t miim_base;
+       unsigned long miim_size;
+       struct mii_dev *bus;
+};
+
+static const unsigned long jr2_regs_qs[] = {
+       [MSCC_QS_XTR_RD] = 0x8,
+       [MSCC_QS_XTR_FLUSH] = 0x18,
+       [MSCC_QS_XTR_DATA_PRESENT] = 0x1c,
+       [MSCC_QS_INJ_WR] = 0x2c,
+       [MSCC_QS_INJ_CTRL] = 0x34,
+};
+
+static struct jr2_miim_dev miim[JR2_MIIM_BUS_COUNT];
+static int miim_count = -1;
+
+static int mscc_miim_wait_ready(struct jr2_miim_dev *miim)
+{
+       unsigned long deadline;
+       u32 val;
+
+       deadline = timer_get_us() + 250000;
+
+       do {
+               val = readl(miim->regs + GCB_MIIM_MII_STATUS);
+       } while (timer_get_us() <= deadline && (val & GCB_MIIM_STAT_BUSY));
+
+       if (val & GCB_MIIM_STAT_BUSY)
+               return -ETIMEDOUT;
+
+       return 0;
+}
+
+static int mscc_miim_read(struct mii_dev *bus, int addr, int devad, int reg)
+{
+       struct jr2_miim_dev *miim = (struct jr2_miim_dev *)bus->priv;
+       u32 val;
+       int ret;
+
+       ret = mscc_miim_wait_ready(miim);
+       if (ret)
+               goto out;
+
+       writel(GCB_MIIM_MII_CMD_VLD | GCB_MIIM_MII_CMD_PHYAD(addr) |
+              GCB_MIIM_MII_CMD_REGAD(reg) | GCB_MIIM_MII_CMD_OPR_READ,
+              miim->regs + GCB_MIIM_MII_CMD);
+
+       ret = mscc_miim_wait_ready(miim);
+       if (ret)
+               goto out;
+
+       val = readl(miim->regs + GCB_MIIM_DATA);
+       if (val & GCB_MIIM_DATA_ERROR) {
+               ret = -EIO;
+               goto out;
+       }
+
+       ret = val & 0xFFFF;
+ out:
+       return ret;
+}
+
+static int mscc_miim_write(struct mii_dev *bus, int addr, int devad, int reg,
+                          u16 val)
+{
+       struct jr2_miim_dev *miim = (struct jr2_miim_dev *)bus->priv;
+       int ret;
+
+       ret = mscc_miim_wait_ready(miim);
+       if (ret < 0)
+               goto out;
+
+       writel(GCB_MIIM_MII_CMD_VLD | GCB_MIIM_MII_CMD_PHYAD(addr) |
+              GCB_MIIM_MII_CMD_REGAD(reg) | GCB_MIIM_MII_CMD_WRDATA(val) |
+              GCB_MIIM_MII_CMD_OPR_WRITE, miim->regs + GCB_MIIM_MII_CMD);
+
+ out:
+       return ret;
+}
+
+static struct mii_dev *jr2_mdiobus_init(phys_addr_t miim_base,
+                                       unsigned long miim_size)
+{
+       struct mii_dev *bus;
+
+       bus = mdio_alloc();
+       if (!bus)
+               return NULL;
+
+       ++miim_count;
+       sprintf(bus->name, "miim-bus%d", miim_count);
+
+       miim[miim_count].regs = ioremap(miim_base, miim_size);
+       miim[miim_count].miim_base = miim_base;
+       miim[miim_count].miim_size = miim_size;
+       bus->priv = &miim[miim_count];
+       bus->read = mscc_miim_read;
+       bus->write = mscc_miim_write;
+
+       if (mdio_register(bus))
+               return NULL;
+
+       miim[miim_count].bus = bus;
+       return bus;
+}
+
+static void jr2_cpu_capture_setup(struct jr2_private *priv)
+{
+       /* ASM: No preamble and IFH prefix on CPU injected frames */
+       writel(ASM_CFG_PORT_NO_PREAMBLE_ENA |
+              ASM_CFG_PORT_INJ_FORMAT_CFG(1),
+              priv->regs[ASM] + ASM_CFG_PORT(CPU_PORT));
+
+       /* Set Manual injection via DEVCPU_QS registers for CPU queue 0 */
+       writel(0x5, priv->regs[QS] + QS_INJ_GRP_CFG(0));
+
+       /* Set Manual extraction via DEVCPU_QS registers for CPU queue 0 */
+       writel(0x7, priv->regs[QS] + QS_XTR_GRP_CFG(0));
+
+       /* Enable CPU port for any frame transfer */
+       setbits_le32(priv->regs[QFWD] + QFWD_SYSTEM_SWITCH_PORT_MODE(CPU_PORT),
+                    QFWD_SYSTEM_SWITCH_PORT_MODE_PORT_ENA);
+
+       /* Send a copy to CPU when found as forwarding entry */
+       setbits_le32(priv->regs[ANA_L2] + ANA_L2_COMMON_FWD_CFG,
+                    ANA_L2_COMMON_FWD_CFG_CPU_DMAC_COPY_ENA);
+}
+
+static void jr2_port_init(struct jr2_private *priv, int port)
+{
+       void __iomem *regs = priv->regs[port];
+
+       /* Enable PCS */
+       writel(DEV_PCS1G_CFG_PCS1G_CFG_PCS_ENA,
+              regs + DEV_PCS1G_CFG_PCS1G_CFG);
+
+       /* Disable Signal Detect */
+       writel(0, regs + DEV_PCS1G_CFG_PCS1G_SD);
+
+       /* Enable MAC RX and TX */
+       writel(DEV_MAC_CFG_MAC_ENA_RX_ENA |
+              DEV_MAC_CFG_MAC_ENA_TX_ENA,
+              regs + DEV_MAC_CFG_MAC_ENA);
+
+       /* Clear sgmii_mode_ena */
+       writel(0, regs + DEV_PCS1G_CFG_PCS1G_MODE);
+
+       /*
+        * Clear sw_resolve_ena(bit 0) and set adv_ability to
+        * something meaningful just in case
+        */
+       writel(DEV_PCS1G_CFG_PCS1G_ANEG_ADV_ABILITY(0x20),
+              regs + DEV_PCS1G_CFG_PCS1G_ANEG);
+
+       /* Set MAC IFG Gaps */
+       writel(DEV_MAC_CFG_MAC_IFG_TX_IFG(4) |
+              DEV_MAC_CFG_MAC_IFG_RX_IFG1(5) |
+              DEV_MAC_CFG_MAC_IFG_RX_IFG2(1),
+              regs + DEV_MAC_CFG_MAC_IFG);
+
+       /* Set link speed and release all resets */
+       writel(DEV_DEV_CFG_DEV_RST_CTRL_SPEED_SEL(2),
+              regs + DEV_DEV_CFG_DEV_RST_CTRL);
+
+       /* Make VLAN aware for CPU traffic */
+       writel(ANA_CL_PORT_VLAN_CFG_AWARE_ENA |
+              ANA_CL_PORT_VLAN_CFG_POP_CNT(1) |
+              MAC_VID,
+              priv->regs[ANA_CL] + ANA_CL_PORT_VLAN_CFG(port));
+
+       /* Enable CPU port for any frame transfer */
+       setbits_le32(priv->regs[QFWD] + QFWD_SYSTEM_SWITCH_PORT_MODE(port),
+                    QFWD_SYSTEM_SWITCH_PORT_MODE_PORT_ENA);
+}
+
+static void serdes6g_write(void __iomem *base, u32 addr)
+{
+       u32 data;
+
+       writel(HSIO_MCB_SERDES6G_CFG_WR_ONE_SHOT |
+              HSIO_MCB_SERDES6G_CFG_ADDR(addr),
+              base + HSIO_MCB_SERDES6G_CFG);
+
+       do {
+               data = readl(base + HSIO_MCB_SERDES6G_CFG);
+       } while (data & HSIO_MCB_SERDES6G_CFG_WR_ONE_SHOT);
+}
+
+static void serdes6g_setup(void __iomem *base, uint32_t addr,
+                          phy_interface_t interface)
+{
+       u32 ib_if_mode = 0;
+       u32 ib_qrate = 0;
+       u32 ib_cal_ena = 0;
+       u32 ib1_tsdet = 0;
+       u32 ob_lev = 0;
+       u32 ob_ena_cas = 0;
+       u32 ob_ena1v_mode = 0;
+       u32 des_bw_ana = 0;
+       u32 pll_fsm_ctrl_data = 0;
+
+       switch (interface) {
+       case PHY_INTERFACE_MODE_SGMII:
+               ib_if_mode = 1;
+               ib_qrate = 1;
+               ib_cal_ena = 1;
+               ib1_tsdet = 3;
+               ob_lev = 48;
+               ob_ena_cas = 2;
+               ob_ena1v_mode = 1;
+               des_bw_ana = 3;
+               pll_fsm_ctrl_data = 60;
+               break;
+       case PHY_INTERFACE_MODE_QSGMII:
+               ib_if_mode = 3;
+               ib1_tsdet = 16;
+               ob_lev = 24;
+               des_bw_ana = 5;
+               pll_fsm_ctrl_data = 120;
+               break;
+       default:
+               pr_err("Interface not supported\n");
+               return;
+       }
+
+       if (interface == PHY_INTERFACE_MODE_QSGMII)
+               writel(0xfff, base + HSIO_HW_CFGSTAT_HW_CFG);
+
+       writel(HSIO_ANA_SERDES6G_COMMON_CFG_IF_MODE(3),
+              base + HSIO_ANA_SERDES6G_COMMON_CFG);
+       writel(HSIO_ANA_SERDES6G_PLL_CFG_FSM_CTRL_DATA(120) |
+              HSIO_ANA_SERDES6G_PLL_CFG_ENA_OFFS(3),
+              base + HSIO_ANA_SERDES6G_PLL_CFG);
+       writel(HSIO_ANA_SERDES6G_IB_CFG_REG_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_EQZ_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_SAM_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_CONCUR |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_OFF(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_LP(2) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_MID(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_HP(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_CLK_SEL(7) |
+              HSIO_ANA_SERDES6G_IB_CFG_TERM_MODE_SEL(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_ICML_ADJ(5) |
+              HSIO_ANA_SERDES6G_IB_CFG_RTRM_ADJ(13) |
+              HSIO_ANA_SERDES6G_IB_CFG_VBULK_SEL |
+              HSIO_ANA_SERDES6G_IB_CFG_SOFSI(1),
+              base + HSIO_ANA_SERDES6G_IB_CFG);
+       writel(HSIO_ANA_SERDES6G_IB_CFG1_FILT_OFFSET |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_LP |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_MID |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_HP |
+              HSIO_ANA_SERDES6G_IB_CFG1_SCALY(15) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TSDET(3) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TJTAG(8),
+              base + HSIO_ANA_SERDES6G_IB_CFG1);
+       writel(HSIO_DIG_SERDES6G_MISC_CFG_LANE_RST,
+              base + HSIO_DIG_SERDES6G_MISC_CFG);
+
+       serdes6g_write(base, addr);
+
+       writel(HSIO_ANA_SERDES6G_IB_CFG_REG_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_EQZ_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_SAM_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_CONCUR |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_OFF(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_LP(2) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_MID(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_HP(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_CLK_SEL(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_TERM_MODE_SEL(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_ICML_ADJ(5) |
+              HSIO_ANA_SERDES6G_IB_CFG_RTRM_ADJ(13) |
+              HSIO_ANA_SERDES6G_IB_CFG_VBULK_SEL |
+              HSIO_ANA_SERDES6G_IB_CFG_SOFSI(1),
+              base + HSIO_ANA_SERDES6G_IB_CFG);
+       writel(HSIO_ANA_SERDES6G_IB_CFG1_FILT_OFFSET |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_LP |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_MID |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_HP |
+              HSIO_ANA_SERDES6G_IB_CFG1_SCALY(15) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TSDET(16) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TJTAG(8),
+              base + HSIO_ANA_SERDES6G_IB_CFG1);
+
+       writel(0x0, base + HSIO_ANA_SERDES6G_SER_CFG);
+       writel(HSIO_ANA_SERDES6G_COMMON_CFG_IF_MODE(ib_if_mode) |
+              HSIO_ANA_SERDES6G_COMMON_CFG_QRATE(ib_qrate) |
+              HSIO_ANA_SERDES6G_COMMON_CFG_ENA_LANE |
+              HSIO_ANA_SERDES6G_COMMON_CFG_SYS_RST,
+              base + HSIO_ANA_SERDES6G_COMMON_CFG);
+       writel(HSIO_DIG_SERDES6G_MISC_CFG_LANE_RST,
+              base + HSIO_DIG_SERDES6G_MISC_CFG);
+
+       writel(HSIO_ANA_SERDES6G_OB_CFG_RESISTOR_CTRL(1) |
+              HSIO_ANA_SERDES6G_OB_CFG_SR(7) |
+              HSIO_ANA_SERDES6G_OB_CFG_SR_H |
+              HSIO_ANA_SERDES6G_OB_CFG_ENA1V_MODE(ob_ena1v_mode) |
+              HSIO_ANA_SERDES6G_OB_CFG_POL, base + HSIO_ANA_SERDES6G_OB_CFG);
+       writel(HSIO_ANA_SERDES6G_OB_CFG1_LEV(ob_lev) |
+              HSIO_ANA_SERDES6G_OB_CFG1_ENA_CAS(ob_ena_cas),
+              base + HSIO_ANA_SERDES6G_OB_CFG1);
+
+       writel(HSIO_ANA_SERDES6G_DES_CFG_BW_ANA(des_bw_ana) |
+              HSIO_ANA_SERDES6G_DES_CFG_BW_HYST(5) |
+              HSIO_ANA_SERDES6G_DES_CFG_MBTR_CTRL(2) |
+              HSIO_ANA_SERDES6G_DES_CFG_PHS_CTRL(6),
+              base + HSIO_ANA_SERDES6G_DES_CFG);
+       writel(HSIO_ANA_SERDES6G_PLL_CFG_FSM_CTRL_DATA(pll_fsm_ctrl_data) |
+              HSIO_ANA_SERDES6G_PLL_CFG_ENA_OFFS(3),
+              base + HSIO_ANA_SERDES6G_PLL_CFG);
+
+       serdes6g_write(base, addr);
+
+       /* set pll_fsm_ena = 1 */
+       writel(HSIO_ANA_SERDES6G_PLL_CFG_FSM_ENA |
+              HSIO_ANA_SERDES6G_PLL_CFG_FSM_CTRL_DATA(pll_fsm_ctrl_data) |
+              HSIO_ANA_SERDES6G_PLL_CFG_ENA_OFFS(3),
+              base + HSIO_ANA_SERDES6G_PLL_CFG);
+
+       serdes6g_write(base, addr);
+
+       /* wait 20ms for pll bringup */
+       mdelay(20);
+
+       /* start IB calibration by setting ib_cal_ena and clearing lane_rst */
+       writel(HSIO_ANA_SERDES6G_IB_CFG_REG_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_EQZ_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_SAM_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_CAL_ENA(ib_cal_ena) |
+              HSIO_ANA_SERDES6G_IB_CFG_CONCUR |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_OFF(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_LP(2) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_MID(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_HP(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_CLK_SEL(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_TERM_MODE_SEL(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_ICML_ADJ(5) |
+              HSIO_ANA_SERDES6G_IB_CFG_RTRM_ADJ(13) |
+              HSIO_ANA_SERDES6G_IB_CFG_VBULK_SEL |
+              HSIO_ANA_SERDES6G_IB_CFG_SOFSI(1),
+              base + HSIO_ANA_SERDES6G_IB_CFG);
+       writel(0x0, base + HSIO_DIG_SERDES6G_MISC_CFG);
+
+       serdes6g_write(base, addr);
+
+       /* wait 60 for calibration */
+       mdelay(60);
+
+       /* set ib_tsdet and ib_reg_pat_sel_offset back to correct values */
+       writel(HSIO_ANA_SERDES6G_IB_CFG_REG_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_EQZ_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_SAM_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_CAL_ENA(ib_cal_ena) |
+              HSIO_ANA_SERDES6G_IB_CFG_CONCUR |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_OFF(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_LP(2) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_MID(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_HP(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_CLK_SEL(7) |
+              HSIO_ANA_SERDES6G_IB_CFG_TERM_MODE_SEL(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_ICML_ADJ(5) |
+              HSIO_ANA_SERDES6G_IB_CFG_RTRM_ADJ(13) |
+              HSIO_ANA_SERDES6G_IB_CFG_VBULK_SEL |
+              HSIO_ANA_SERDES6G_IB_CFG_SOFSI(1),
+              base + HSIO_ANA_SERDES6G_IB_CFG);
+       writel(HSIO_ANA_SERDES6G_IB_CFG1_FILT_OFFSET |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_LP |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_MID |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_HP |
+              HSIO_ANA_SERDES6G_IB_CFG1_SCALY(15) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TSDET(ib1_tsdet) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TJTAG(8),
+              base + HSIO_ANA_SERDES6G_IB_CFG1);
+
+       serdes6g_write(base, addr);
+}
+
+static void serdes1g_write(void __iomem *base, u32 addr)
+{
+       u32 data;
+
+       writel(HSIO_MCB_SERDES1G_CFG_WR_ONE_SHOT |
+              HSIO_MCB_SERDES1G_CFG_ADDR(addr),
+              base + HSIO_MCB_SERDES1G_CFG);
+
+       do {
+               data = readl(base + HSIO_MCB_SERDES1G_CFG);
+       } while (data & HSIO_MCB_SERDES1G_CFG_WR_ONE_SHOT);
+}
+
+static void serdes1g_setup(void __iomem *base, uint32_t addr,
+                          phy_interface_t interface)
+{
+       writel(0x0, base + HSIO_ANA_SERDES1G_SER_CFG);
+       writel(0x0, base + HSIO_DIG_SERDES1G_TP_CFG);
+       writel(0x0, base + HSIO_DIG_SERDES1G_DFT_CFG0);
+       writel(HSIO_ANA_SERDES1G_OB_CFG_RESISTOR_CTRL(1) |
+              HSIO_ANA_SERDES1G_OB_CFG_VCM_CTRL(4) |
+              HSIO_ANA_SERDES1G_OB_CFG_CMM_BIAS_CTRL(2) |
+              HSIO_ANA_SERDES1G_OB_CFG_AMP_CTRL(12) |
+              HSIO_ANA_SERDES1G_OB_CFG_SLP(3),
+              base + HSIO_ANA_SERDES1G_OB_CFG);
+       writel(HSIO_ANA_SERDES1G_IB_CFG_RESISTOR_CTRL(13) |
+              HSIO_ANA_SERDES1G_IB_CFG_EQ_GAIN(2) |
+              HSIO_ANA_SERDES1G_IB_CFG_ENA_OFFSET_COMP |
+              HSIO_ANA_SERDES1G_IB_CFG_ENA_DETLEV |
+              HSIO_ANA_SERDES1G_IB_CFG_ENA_CMV_TERM |
+              HSIO_ANA_SERDES1G_IB_CFG_DET_LEV(3) |
+              HSIO_ANA_SERDES1G_IB_CFG_ACJTAG_HYST(1),
+              base + HSIO_ANA_SERDES1G_IB_CFG);
+       writel(HSIO_ANA_SERDES1G_DES_CFG_BW_HYST(7) |
+              HSIO_ANA_SERDES1G_DES_CFG_BW_ANA(6) |
+              HSIO_ANA_SERDES1G_DES_CFG_MBTR_CTRL(2) |
+              HSIO_ANA_SERDES1G_DES_CFG_PHS_CTRL(6),
+              base + HSIO_ANA_SERDES1G_DES_CFG);
+       writel(HSIO_DIG_SERDES1G_MISC_CFG_LANE_RST,
+              base + HSIO_DIG_SERDES1G_MISC_CFG);
+       writel(HSIO_ANA_SERDES1G_PLL_CFG_FSM_ENA |
+              HSIO_ANA_SERDES1G_PLL_CFG_FSM_CTRL_DATA(0xc8) |
+              HSIO_ANA_SERDES1G_PLL_CFG_ENA_RC_DIV2,
+              base + HSIO_ANA_SERDES1G_PLL_CFG);
+       writel(HSIO_ANA_SERDES1G_COMMON_CFG_IF_MODE |
+              HSIO_ANA_SERDES1G_COMMON_CFG_ENA_LANE |
+              HSIO_ANA_SERDES1G_COMMON_CFG_SYS_RST,
+              base + HSIO_ANA_SERDES1G_COMMON_CFG);
+
+       serdes1g_write(base, addr);
+
+       setbits_le32(base + HSIO_ANA_SERDES1G_COMMON_CFG,
+                    HSIO_ANA_SERDES1G_COMMON_CFG_SYS_RST);
+
+       serdes1g_write(base, addr);
+
+       clrbits_le32(base + HSIO_DIG_SERDES1G_MISC_CFG,
+                    HSIO_DIG_SERDES1G_MISC_CFG_LANE_RST);
+
+       serdes1g_write(base, addr);
+}
+
+static int ram_init(u32 val, void __iomem *addr)
+{
+       writel(val, addr);
+
+       if (wait_for_bit_le32(addr, BIT(1), false, 2000, false)) {
+               printf("Timeout in memory reset, reg = 0x%08x\n", val);
+               return 1;
+       }
+
+       return 0;
+}
+
+static int jr2_switch_init(struct jr2_private *priv)
+{
+       /* Initialize memories */
+       ram_init(0x3, priv->regs[QSYS] + QSYS_RAM_CTRL_RAM_INIT);
+       ram_init(0x3, priv->regs[ASM] + ASM_RAM_CTRL_RAM_INIT);
+       ram_init(0x3, priv->regs[ANA_AC] + ANA_AC_RAM_CTRL_RAM_INIT);
+       ram_init(0x3, priv->regs[REW] + REW_RAM_CTRL_RAM_INIT);
+
+       /* Reset counters */
+       writel(0x1, priv->regs[ANA_AC] + ANA_AC_STAT_GLOBAL_CFG_PORT_RESET);
+       writel(0x1, priv->regs[ASM] + ASM_CFG_STAT_CFG);
+
+       /* Enable switch-core and queue system */
+       writel(0x1, priv->regs[QSYS] + QSYS_SYSTEM_RESET_CFG);
+
+       return 0;
+}
+
+static void jr2_switch_config(struct jr2_private *priv)
+{
+       writel(0x55555555, priv->regs[QSYS] + QSYS_CALCFG_CAL_AUTO(0));
+       writel(0x55555555, priv->regs[QSYS] + QSYS_CALCFG_CAL_AUTO(1));
+       writel(0x55555555, priv->regs[QSYS] + QSYS_CALCFG_CAL_AUTO(2));
+       writel(0x55555555, priv->regs[QSYS] + QSYS_CALCFG_CAL_AUTO(3));
+
+       writel(readl(priv->regs[QSYS] + QSYS_CALCFG_CAL_CTRL) |
+              QSYS_CALCFG_CAL_CTRL_CAL_MODE(8),
+              priv->regs[QSYS] + QSYS_CALCFG_CAL_CTRL);
+}
+
+static int jr2_initialize(struct jr2_private *priv)
+{
+       int ret, i;
+
+       /* Initialize switch memories, enable core */
+       ret = jr2_switch_init(priv);
+       if (ret)
+               return ret;
+
+       jr2_switch_config(priv);
+
+       for (i = 0; i < MAX_PORT; i++)
+               jr2_port_init(priv, i);
+
+       jr2_cpu_capture_setup(priv);
+
+       return 0;
+}
+
+static inline int jr2_vlant_wait_for_completion(struct jr2_private *priv)
+{
+       if (wait_for_bit_le32(priv->regs[LRN] + LRN_COMMON_ACCESS_CTRL,
+                             LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT,
+                             false, 2000, false))
+               return -ETIMEDOUT;
+
+       return 0;
+}
+
+static int jr2_mac_table_add(struct jr2_private *priv,
+                            const unsigned char mac[ETH_ALEN], int pgid)
+{
+       u32 macl = 0, mach = 0;
+
+       /*
+        * Set the MAC address to handle and the vlan associated in a format
+        * understood by the hardware.
+        */
+       mach |= MAC_VID << 16;
+       mach |= ((u32)mac[0]) << 8;
+       mach |= ((u32)mac[1]) << 0;
+       macl |= ((u32)mac[2]) << 24;
+       macl |= ((u32)mac[3]) << 16;
+       macl |= ((u32)mac[4]) << 8;
+       macl |= ((u32)mac[5]) << 0;
+
+       writel(mach, priv->regs[LRN] + LRN_COMMON_MAC_ACCESS_CFG0);
+       writel(macl, priv->regs[LRN] + LRN_COMMON_MAC_ACCESS_CFG1);
+
+       writel(LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_ADDR(pgid) |
+              LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_TYPE(0x3) |
+              LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_CPU_COPY |
+              LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_CPU_QU(0) |
+              LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_VLD |
+              LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_LOCKED,
+              priv->regs[LRN] + LRN_COMMON_MAC_ACCESS_CFG2);
+
+       writel(LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT,
+              priv->regs[LRN] + LRN_COMMON_ACCESS_CTRL);
+
+       return jr2_vlant_wait_for_completion(priv);
+}
+
+static int jr2_write_hwaddr(struct udevice *dev)
+{
+       struct jr2_private *priv = dev_get_priv(dev);
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+
+       return jr2_mac_table_add(priv, pdata->enetaddr, PGID_UNICAST);
+}
+
+static void serdes_setup(struct jr2_private *priv)
+{
+       size_t mask;
+       int i = 0;
+
+       for (i = 0; i < MAX_PORT; ++i) {
+               if (!priv->ports[i].bus || priv->ports[i].serdes_index == 0xff)
+                       continue;
+
+               mask = BIT(priv->ports[i].serdes_index);
+               if (priv->ports[i].serdes_index < SERDES1G_MAX) {
+                       serdes1g_setup(priv->regs[HSIO], mask,
+                                      priv->ports[i].phy_mode);
+               } else {
+                       mask >>= SERDES6G(0);
+                       serdes6g_setup(priv->regs[HSIO], mask,
+                                      priv->ports[i].phy_mode);
+               }
+       }
+}
+
+static int jr2_start(struct udevice *dev)
+{
+       struct jr2_private *priv = dev_get_priv(dev);
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+       const unsigned char mac[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff,
+               0xff };
+       int ret;
+
+       ret = jr2_initialize(priv);
+       if (ret)
+               return ret;
+
+       /* Set MAC address tables entries for CPU redirection */
+       ret = jr2_mac_table_add(priv, mac, PGID_BROADCAST);
+       if (ret)
+               return ret;
+
+       ret = jr2_mac_table_add(priv, pdata->enetaddr, PGID_UNICAST);
+       if (ret)
+               return ret;
+
+       serdes_setup(priv);
+
+       return 0;
+}
+
+static void jr2_stop(struct udevice *dev)
+{
+}
+
+static int jr2_send(struct udevice *dev, void *packet, int length)
+{
+       struct jr2_private *priv = dev_get_priv(dev);
+       u32 ifh[IFH_LEN];
+       u32 *buf = packet;
+
+       memset(ifh, '\0', IFH_LEN);
+
+       /* Set DST PORT_MASK */
+       ifh[0] = htonl(0);
+       ifh[1] = htonl(0x1FFFFF);
+       ifh[2] = htonl(~0);
+       /* Set DST_MODE to INJECT and UPDATE_FCS */
+       ifh[5] = htonl(0x4c0);
+
+       return mscc_send(priv->regs[QS], jr2_regs_qs,
+                        ifh, IFH_LEN, buf, length);
+}
+
+static int jr2_recv(struct udevice *dev, int flags, uchar **packetp)
+{
+       struct jr2_private *priv = dev_get_priv(dev);
+       u32 *rxbuf = (u32 *)net_rx_packets[0];
+       int byte_cnt = 0;
+
+       byte_cnt = mscc_recv(priv->regs[QS], jr2_regs_qs, rxbuf, IFH_LEN,
+                            false);
+
+       *packetp = net_rx_packets[0];
+
+       return byte_cnt;
+}
+
+static struct mii_dev *get_mdiobus(phys_addr_t base, unsigned long size)
+{
+       int i = 0;
+
+       for (i = 0; i < JR2_MIIM_BUS_COUNT; ++i)
+               if (miim[i].miim_base == base && miim[i].miim_size == size)
+                       return miim[i].bus;
+
+       return NULL;
+}
+
+static void add_port_entry(struct jr2_private *priv, size_t index,
+                          size_t phy_addr, struct mii_dev *bus,
+                          u8 serdes_index, u8 phy_mode)
+{
+       priv->ports[index].phy_addr = phy_addr;
+       priv->ports[index].bus = bus;
+       priv->ports[index].serdes_index = serdes_index;
+       priv->ports[index].phy_mode = phy_mode;
+}
+
+static int jr2_probe(struct udevice *dev)
+{
+       struct jr2_private *priv = dev_get_priv(dev);
+       int i;
+       int ret;
+       struct resource res;
+       fdt32_t faddr;
+       phys_addr_t addr_base;
+       unsigned long addr_size;
+       ofnode eth_node, node, mdio_node;
+       size_t phy_addr;
+       struct mii_dev *bus;
+       struct ofnode_phandle_args phandle;
+       struct phy_device *phy;
+
+       if (!priv)
+               return -EINVAL;
+
+       /* Get registers and map them to the private structure */
+       for (i = 0; i < ARRAY_SIZE(regs_names); i++) {
+               priv->regs[i] = dev_remap_addr_name(dev, regs_names[i]);
+               if (!priv->regs[i]) {
+                       debug
+                           ("Error can't get regs base addresses for %s\n",
+                            regs_names[i]);
+                       return -ENOMEM;
+               }
+       }
+
+       /* Initialize miim buses */
+       memset(&miim, 0x0, sizeof(struct jr2_miim_dev) * JR2_MIIM_BUS_COUNT);
+
+       /* iterate all the ports and find out on which bus they are */
+       i = 0;
+       eth_node = dev_read_first_subnode(dev);
+       for (node = ofnode_first_subnode(eth_node);
+            ofnode_valid(node);
+            node = ofnode_next_subnode(node)) {
+               if (ofnode_read_resource(node, 0, &res))
+                       return -ENOMEM;
+               i = res.start;
+
+               ret = ofnode_parse_phandle_with_args(node, "phy-handle", NULL,
+                                                    0, 0, &phandle);
+               if (ret)
+                       continue;
+
+               /* Get phy address on mdio bus */
+               if (ofnode_read_resource(phandle.node, 0, &res))
+                       return -ENOMEM;
+               phy_addr = res.start;
+
+               /* Get mdio node */
+               mdio_node = ofnode_get_parent(phandle.node);
+
+               if (ofnode_read_resource(mdio_node, 0, &res))
+                       return -ENOMEM;
+               faddr = cpu_to_fdt32(res.start);
+
+               addr_base = ofnode_translate_address(mdio_node, &faddr);
+               addr_size = res.end - res.start;
+
+               /* If the bus is new then create a new bus */
+               if (!get_mdiobus(addr_base, addr_size))
+                       priv->bus[miim_count] =
+                               jr2_mdiobus_init(addr_base, addr_size);
+
+               /* Connect mdio bus with the port */
+               bus = get_mdiobus(addr_base, addr_size);
+
+               /* Get serdes info */
+               ret = ofnode_parse_phandle_with_args(node, "phys", NULL,
+                                                    3, 0, &phandle);
+               if (ret)
+                       return -ENOMEM;
+
+               add_port_entry(priv, i, phy_addr, bus, phandle.args[1],
+                              phandle.args[2]);
+       }
+
+       for (i = 0; i < MAX_PORT; i++) {
+               if (!priv->ports[i].bus)
+                       continue;
+
+               phy = phy_connect(priv->ports[i].bus,
+                                 priv->ports[i].phy_addr, dev,
+                                 PHY_INTERFACE_MODE_NONE);
+               if (phy)
+                       board_phy_config(phy);
+       }
+
+       return 0;
+}
+
+static int jr2_remove(struct udevice *dev)
+{
+       struct jr2_private *priv = dev_get_priv(dev);
+       int i;
+
+       for (i = 0; i < JR2_MIIM_BUS_COUNT; i++) {
+               mdio_unregister(priv->bus[i]);
+               mdio_free(priv->bus[i]);
+       }
+
+       return 0;
+}
+
+static const struct eth_ops jr2_ops = {
+       .start        = jr2_start,
+       .stop         = jr2_stop,
+       .send         = jr2_send,
+       .recv         = jr2_recv,
+       .write_hwaddr = jr2_write_hwaddr,
+};
+
+static const struct udevice_id mscc_jr2_ids[] = {
+       {.compatible = "mscc,vsc7454-switch" },
+       { /* Sentinel */ }
+};
+
+U_BOOT_DRIVER(jr2) = {
+       .name                           = "jr2-switch",
+       .id                             = UCLASS_ETH,
+       .of_match                       = mscc_jr2_ids,
+       .probe                          = jr2_probe,
+       .remove                         = jr2_remove,
+       .ops                            = &jr2_ops,
+       .priv_auto_alloc_size           = sizeof(struct jr2_private),
+       .platdata_auto_alloc_size       = sizeof(struct eth_pdata),
+};
index bf08c35ba04ffc8297926c1acd55755ee6c72f54..815c2da26469c54ff26388316b8ad7081bf19e5c 100644 (file)
@@ -142,18 +142,16 @@ static const unsigned long ocelot_regs_ana_table[] = {
 
 static struct mscc_miim_dev miim[NUM_PHY];
 
-static int mscc_miim_reset(struct mii_dev *bus)
+static void mscc_phy_reset(void)
 {
-       struct mscc_miim_dev *miim = (struct mscc_miim_dev *)bus->priv;
-
-       if (miim->phy_regs) {
-               writel(0, miim->phy_regs + PHY_CFG);
-               writel(PHY_CFG_RST | PHY_CFG_COMMON_RST
-                      | PHY_CFG_ENA, miim->phy_regs + PHY_CFG);
-               mdelay(500);
+       writel(0, miim[INTERNAL].phy_regs + PHY_CFG);
+       writel(PHY_CFG_RST | PHY_CFG_COMMON_RST
+              | PHY_CFG_ENA, miim[INTERNAL].phy_regs + PHY_CFG);
+       if (wait_for_bit_le32(miim[INTERNAL].phy_regs + PHY_STAT,
+                             PHY_STAT_SUPERVISOR_COMPLETE,
+                             true, 2000, false)) {
+               pr_err("Timeout in phy reset\n");
        }
-
-       return 0;
 }
 
 /* For now only setup the internal mdio bus */
@@ -194,7 +192,6 @@ static struct mii_dev *ocelot_mdiobus_init(struct udevice *dev)
        miim[INTERNAL].phy_regs = ioremap(phy_base[PHY], phy_size[PHY]);
        miim[INTERNAL].regs = ioremap(phy_base[MIIM], phy_size[MIIM]);
        bus->priv = &miim[INTERNAL];
-       bus->reset = mscc_miim_reset;
        bus->read = mscc_miim_read;
        bus->write = mscc_miim_write;
 
@@ -210,13 +207,8 @@ __weak void mscc_switch_reset(void)
 
 static void ocelot_stop(struct udevice *dev)
 {
-       struct ocelot_private *priv = dev_get_priv(dev);
-       int i;
-
        mscc_switch_reset();
-       for (i = 0; i < NUM_PHY; i++)
-               if (priv->bus[i])
-                       mscc_miim_reset(priv->bus[i]);
+       mscc_phy_reset();
 }
 
 static void ocelot_cpu_capture_setup(struct ocelot_private *priv)
@@ -473,6 +465,7 @@ static int ocelot_probe(struct udevice *dev)
        }
 
        priv->bus[INTERNAL] = ocelot_mdiobus_init(dev);
+       mscc_phy_reset();
 
        for (i = 0; i < 4; i++) {
                phy_connect(priv->bus[INTERNAL], i, dev,
diff --git a/drivers/net/mscc_eswitch/servalt_switch.c b/drivers/net/mscc_eswitch/servalt_switch.c
new file mode 100644 (file)
index 0000000..995c623
--- /dev/null
@@ -0,0 +1,622 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2019 Microsemi Corporation
+ */
+
+#include <common.h>
+#include <config.h>
+#include <dm.h>
+#include <dm/of_access.h>
+#include <dm/of_addr.h>
+#include <fdt_support.h>
+#include <linux/io.h>
+#include <linux/ioport.h>
+#include <miiphy.h>
+#include <net.h>
+#include <wait_bit.h>
+
+#include "mscc_xfer.h"
+
+#define GCB_MIIM_MII_STATUS            0x0
+#define                GCB_MIIM_STAT_BUSY              BIT(3)
+#define GCB_MIIM_MII_CMD               0x8
+#define                GCB_MIIM_MII_CMD_OPR_WRITE      BIT(1)
+#define                GCB_MIIM_MII_CMD_OPR_READ       BIT(2)
+#define                GCB_MIIM_MII_CMD_WRDATA(x)      ((x) << 4)
+#define                GCB_MIIM_MII_CMD_REGAD(x)       ((x) << 20)
+#define                GCB_MIIM_MII_CMD_PHYAD(x)       ((x) << 25)
+#define                GCB_MIIM_MII_CMD_VLD            BIT(31)
+#define GCB_MIIM_DATA                  0xC
+#define                GCB_MIIM_DATA_ERROR             (0x3 << 16)
+
+#define PHY_CFG                                0x0
+#define PHY_CFG_ENA                            0x3
+#define PHY_CFG_COMMON_RST                     BIT(2)
+#define PHY_CFG_RST                            (0x3 << 3)
+#define PHY_STAT                       0x4
+#define PHY_STAT_SUPERVISOR_COMPLETE           BIT(0)
+
+#define ANA_AC_RAM_CTRL_RAM_INIT               0x14fdc
+#define ANA_AC_STAT_GLOBAL_CFG_PORT_RESET      0x15474
+
+#define ANA_CL_PORT_VLAN_CFG(x)                        (0xa018 + 0xc8 * (x))
+#define                ANA_CL_PORT_VLAN_CFG_AWARE_ENA                  BIT(19)
+#define                ANA_CL_PORT_VLAN_CFG_POP_CNT(x)                 ((x) << 17)
+
+#define ANA_L2_COMMON_FWD_CFG                  0x18498
+#define                ANA_L2_COMMON_FWD_CFG_CPU_DMAC_COPY_ENA BIT(6)
+
+#define ASM_CFG_STAT_CFG                       0xb08
+#define ASM_CFG_PORT(x)                                (0xb74 + 0x4 * (x))
+#define                ASM_CFG_PORT_NO_PREAMBLE_ENA            BIT(8)
+#define                ASM_CFG_PORT_INJ_FORMAT_CFG(x)          ((x) << 1)
+#define ASM_RAM_CTRL_RAM_INIT                  0xbfc
+
+#define DEV_DEV_CFG_DEV_RST_CTRL       0x0
+#define                DEV_DEV_CFG_DEV_RST_CTRL_SPEED_SEL(x)   ((x) << 20)
+#define DEV_MAC_CFG_MAC_ENA            0x24
+#define                DEV_MAC_CFG_MAC_ENA_RX_ENA              BIT(4)
+#define                DEV_MAC_CFG_MAC_ENA_TX_ENA              BIT(0)
+#define DEV_MAC_CFG_MAC_IFG            0x3c
+#define                DEV_MAC_CFG_MAC_IFG_TX_IFG(x)           ((x) << 8)
+#define                DEV_MAC_CFG_MAC_IFG_RX_IFG2(x)          ((x) << 4)
+#define                DEV_MAC_CFG_MAC_IFG_RX_IFG1(x)          (x)
+#define DEV_PCS1G_CFG_PCS1G_CFG                0x48
+#define                DEV_PCS1G_CFG_PCS1G_CFG_PCS_ENA         BIT(0)
+#define DEV_PCS1G_CFG_PCS1G_MODE       0x4c
+#define DEV_PCS1G_CFG_PCS1G_SD         0x50
+#define DEV_PCS1G_CFG_PCS1G_ANEG       0x54
+#define                DEV_PCS1G_CFG_PCS1G_ANEG_ADV_ABILITY(x) ((x) << 16)
+
+#define LRN_COMMON_ACCESS_CTRL                 0x0
+#define                LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT    BIT(0)
+#define LRN_COMMON_MAC_ACCESS_CFG0             0x4
+#define LRN_COMMON_MAC_ACCESS_CFG1             0x8
+#define LRN_COMMON_MAC_ACCESS_CFG2             0xc
+#define                LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_ADDR(x)    (x)
+#define                LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_TYPE(x)    ((x) << 12)
+#define                LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_VLD        BIT(15)
+#define                LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_LOCKED     BIT(16)
+#define                LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_CPU_COPY   BIT(23)
+#define                LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_CPU_QU(x)  ((x) << 24)
+
+#define QFWD_SYSTEM_SWITCH_PORT_MODE(x)                (0x4400 + 0x4 * (x))
+#define                QFWD_SYSTEM_SWITCH_PORT_MODE_PORT_ENA           BIT(17)
+
+#define QS_XTR_GRP_CFG(x)              (4 * (x))
+#define QS_INJ_GRP_CFG(x)              (0x24 + (x) * 4)
+
+#define QSYS_SYSTEM_RESET_CFG                  0x1048
+#define QSYS_CALCFG_CAL_AUTO                   0x1134
+#define QSYS_CALCFG_CAL_CTRL                   0x113c
+#define                QSYS_CALCFG_CAL_CTRL_CAL_MODE(x)                ((x) << 11)
+#define QSYS_RAM_CTRL_RAM_INIT                 0x1140
+
+#define REW_RAM_CTRL_RAM_INIT                  0xFFF4
+
+#define MAC_VID                        0
+#define CPU_PORT               11
+#define IFH_LEN                        7
+#define ETH_ALEN               6
+#define PGID_BROADCAST         50
+#define PGID_UNICAST           51
+
+static const char * const regs_names[] = {
+       "port0", "port1",
+       "ana_ac", "ana_cl", "ana_l2", "asm", "lrn", "qfwd", "qs", "qsys", "rew",
+};
+
+#define REGS_NAMES_COUNT ARRAY_SIZE(regs_names) + 1
+#define MAX_PORT 2
+
+enum servalt_ctrl_regs {
+       ANA_AC = MAX_PORT,
+       ANA_CL,
+       ANA_L2,
+       ASM,
+       LRN,
+       QFWD,
+       QS,
+       QSYS,
+       REW,
+};
+
+#define SERVALT_MIIM_BUS_COUNT 2
+
+struct servalt_phy_port_t {
+       size_t phy_addr;
+       struct mii_dev *bus;
+};
+
+struct servalt_private {
+       void __iomem *regs[REGS_NAMES_COUNT];
+       struct mii_dev *bus[SERVALT_MIIM_BUS_COUNT];
+       struct servalt_phy_port_t ports[MAX_PORT];
+};
+
+struct mscc_miim_dev {
+       void __iomem *regs;
+       phys_addr_t miim_base;
+       unsigned long miim_size;
+       struct mii_dev *bus;
+};
+
+static const unsigned long servalt_regs_qs[] = {
+       [MSCC_QS_XTR_RD] = 0x8,
+       [MSCC_QS_XTR_FLUSH] = 0x18,
+       [MSCC_QS_XTR_DATA_PRESENT] = 0x1c,
+       [MSCC_QS_INJ_WR] = 0x2c,
+       [MSCC_QS_INJ_CTRL] = 0x34,
+};
+
+static struct mscc_miim_dev miim[SERVALT_MIIM_BUS_COUNT];
+static int miim_count = -1;
+
+static int mscc_miim_wait_ready(struct mscc_miim_dev *miim)
+{
+       return wait_for_bit_le32(miim->regs + GCB_MIIM_MII_STATUS,
+                                GCB_MIIM_STAT_BUSY, false, 250, false);
+}
+
+static int mscc_miim_read(struct mii_dev *bus, int addr, int devad, int reg)
+{
+       struct mscc_miim_dev *miim = (struct mscc_miim_dev *)bus->priv;
+       u32 val;
+       int ret;
+
+       ret = mscc_miim_wait_ready(miim);
+       if (ret)
+               goto out;
+
+       writel(GCB_MIIM_MII_CMD_VLD | GCB_MIIM_MII_CMD_PHYAD(addr) |
+              GCB_MIIM_MII_CMD_REGAD(reg) | GCB_MIIM_MII_CMD_OPR_READ,
+              miim->regs + GCB_MIIM_MII_CMD);
+
+       ret = mscc_miim_wait_ready(miim);
+       if (ret)
+               goto out;
+
+       val = readl(miim->regs + GCB_MIIM_DATA);
+       if (val & GCB_MIIM_DATA_ERROR) {
+               ret = -EIO;
+               goto out;
+       }
+
+       ret = val & 0xFFFF;
+out:
+       return ret;
+}
+
+static int mscc_miim_write(struct mii_dev *bus, int addr, int devad, int reg,
+                          u16 val)
+{
+       struct mscc_miim_dev *miim = (struct mscc_miim_dev *)bus->priv;
+       int ret;
+
+       ret = mscc_miim_wait_ready(miim);
+       if (ret < 0)
+               goto out;
+
+       writel(GCB_MIIM_MII_CMD_VLD | GCB_MIIM_MII_CMD_PHYAD(addr) |
+              GCB_MIIM_MII_CMD_REGAD(reg) | GCB_MIIM_MII_CMD_WRDATA(val) |
+              GCB_MIIM_MII_CMD_OPR_WRITE, miim->regs + GCB_MIIM_MII_CMD);
+
+out:
+       return ret;
+}
+
+static struct mii_dev *servalt_mdiobus_init(phys_addr_t miim_base,
+                                           unsigned long miim_size)
+{
+       struct mii_dev *bus;
+
+       bus = mdio_alloc();
+       if (!bus)
+               return NULL;
+
+       ++miim_count;
+       sprintf(bus->name, "miim-bus%d", miim_count);
+
+       miim[miim_count].regs = ioremap(miim_base, miim_size);
+       miim[miim_count].miim_base = miim_base;
+       miim[miim_count].miim_size = miim_size;
+       bus->priv = &miim[miim_count];
+       bus->read = mscc_miim_read;
+       bus->write = mscc_miim_write;
+
+       if (mdio_register(bus))
+               return NULL;
+
+       miim[miim_count].bus = bus;
+       return bus;
+}
+
+static void mscc_phy_reset(void)
+{
+       writel(0, BASE_DEVCPU_GCB + GCB_PHY_CFG + PHY_CFG);
+       writel(PHY_CFG_RST | PHY_CFG_COMMON_RST
+              | PHY_CFG_ENA, BASE_DEVCPU_GCB + GCB_PHY_CFG + PHY_CFG);
+       if (wait_for_bit_le32((const void *)(BASE_DEVCPU_GCB + GCB_PHY_CFG) +
+                             PHY_STAT, PHY_STAT_SUPERVISOR_COMPLETE,
+                             true, 2000, false)) {
+               pr_err("Timeout in phy reset\n");
+       }
+}
+
+static void servalt_cpu_capture_setup(struct servalt_private *priv)
+{
+       /* ASM: No preamble and IFH prefix on CPU injected frames */
+       writel(ASM_CFG_PORT_NO_PREAMBLE_ENA |
+              ASM_CFG_PORT_INJ_FORMAT_CFG(1),
+              priv->regs[ASM] + ASM_CFG_PORT(CPU_PORT));
+
+       /* Set Manual injection via DEVCPU_QS registers for CPU queue 0 */
+       writel(0x5, priv->regs[QS] + QS_INJ_GRP_CFG(0));
+
+       /* Set Manual extraction via DEVCPU_QS registers for CPU queue 0 */
+       writel(0x7, priv->regs[QS] + QS_XTR_GRP_CFG(0));
+
+       /* Enable CPU port for any frame transfer */
+       setbits_le32(priv->regs[QFWD] + QFWD_SYSTEM_SWITCH_PORT_MODE(CPU_PORT),
+                    QFWD_SYSTEM_SWITCH_PORT_MODE_PORT_ENA);
+
+       /* Send a copy to CPU when found as forwarding entry */
+       setbits_le32(priv->regs[ANA_L2] + ANA_L2_COMMON_FWD_CFG,
+                    ANA_L2_COMMON_FWD_CFG_CPU_DMAC_COPY_ENA);
+}
+
+static void servalt_port_init(struct servalt_private *priv, int port)
+{
+       void __iomem *regs = priv->regs[port];
+
+       /* Enable PCS */
+       writel(DEV_PCS1G_CFG_PCS1G_CFG_PCS_ENA,
+              regs + DEV_PCS1G_CFG_PCS1G_CFG);
+
+       /* Disable Signal Detect */
+       writel(0, regs + DEV_PCS1G_CFG_PCS1G_SD);
+
+       /* Enable MAC RX and TX */
+       writel(DEV_MAC_CFG_MAC_ENA_RX_ENA |
+              DEV_MAC_CFG_MAC_ENA_TX_ENA,
+              regs + DEV_MAC_CFG_MAC_ENA);
+
+       /* Clear sgmii_mode_ena */
+       writel(0, regs + DEV_PCS1G_CFG_PCS1G_MODE);
+
+       /*
+        * Clear sw_resolve_ena(bit 0) and set adv_ability to
+        * something meaningful just in case
+        */
+       writel(DEV_PCS1G_CFG_PCS1G_ANEG_ADV_ABILITY(0x20),
+              regs + DEV_PCS1G_CFG_PCS1G_ANEG);
+
+       /* Set MAC IFG Gaps */
+       writel(DEV_MAC_CFG_MAC_IFG_TX_IFG(4) |
+              DEV_MAC_CFG_MAC_IFG_RX_IFG1(5) |
+              DEV_MAC_CFG_MAC_IFG_RX_IFG2(1),
+              regs + DEV_MAC_CFG_MAC_IFG);
+
+       /* Set link speed and release all resets */
+       writel(DEV_DEV_CFG_DEV_RST_CTRL_SPEED_SEL(2),
+              regs + DEV_DEV_CFG_DEV_RST_CTRL);
+
+       /* Make VLAN aware for CPU traffic */
+       writel(ANA_CL_PORT_VLAN_CFG_AWARE_ENA |
+              ANA_CL_PORT_VLAN_CFG_POP_CNT(1) |
+              MAC_VID,
+              priv->regs[ANA_CL] + ANA_CL_PORT_VLAN_CFG(port));
+
+       /* Enable CPU port for any frame transfer */
+       setbits_le32(priv->regs[QFWD] + QFWD_SYSTEM_SWITCH_PORT_MODE(port),
+                    QFWD_SYSTEM_SWITCH_PORT_MODE_PORT_ENA);
+}
+
+static int ram_init(u32 val, void __iomem *addr)
+{
+       writel(val, addr);
+
+       if (wait_for_bit_le32(addr, BIT(1), false, 2000, false)) {
+               printf("Timeout in memory reset, reg = 0x%08x\n", val);
+               return 1;
+       }
+
+       return 0;
+}
+
+static int servalt_switch_init(struct servalt_private *priv)
+{
+       /* Initialize memories */
+       ram_init(0x3, priv->regs[QSYS] + QSYS_RAM_CTRL_RAM_INIT);
+       ram_init(0x3, priv->regs[ASM] + ASM_RAM_CTRL_RAM_INIT);
+       ram_init(0x3, priv->regs[ANA_AC] + ANA_AC_RAM_CTRL_RAM_INIT);
+       ram_init(0x3, priv->regs[REW] + REW_RAM_CTRL_RAM_INIT);
+
+       /* Reset counters */
+       writel(0x1, priv->regs[ANA_AC] + ANA_AC_STAT_GLOBAL_CFG_PORT_RESET);
+       writel(0x1, priv->regs[ASM] + ASM_CFG_STAT_CFG);
+
+       /* Enable switch-core and queue system */
+       writel(0x1, priv->regs[QSYS] + QSYS_SYSTEM_RESET_CFG);
+
+       return 0;
+}
+
+static void servalt_switch_config(struct servalt_private *priv)
+{
+       writel(0x55555555, priv->regs[QSYS] + QSYS_CALCFG_CAL_AUTO);
+
+       writel(readl(priv->regs[QSYS] + QSYS_CALCFG_CAL_CTRL) |
+              QSYS_CALCFG_CAL_CTRL_CAL_MODE(8),
+              priv->regs[QSYS] + QSYS_CALCFG_CAL_CTRL);
+}
+
+static int servalt_initialize(struct servalt_private *priv)
+{
+       int ret, i;
+
+       /* Initialize switch memories, enable core */
+       ret = servalt_switch_init(priv);
+       if (ret)
+               return ret;
+
+       servalt_switch_config(priv);
+
+       for (i = 0; i < MAX_PORT; i++)
+               servalt_port_init(priv, i);
+
+       servalt_cpu_capture_setup(priv);
+
+       return 0;
+}
+
+static inline
+int servalt_vlant_wait_for_completion(struct servalt_private *priv)
+{
+       if (wait_for_bit_le32(priv->regs[LRN] + LRN_COMMON_ACCESS_CTRL,
+                             LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT,
+                             false, 2000, false))
+               return -ETIMEDOUT;
+
+       return 0;
+}
+
+static int servalt_mac_table_add(struct servalt_private *priv,
+                                const unsigned char mac[ETH_ALEN], int pgid)
+{
+       u32 macl = 0, mach = 0;
+
+       /*
+        * Set the MAC address to handle and the vlan associated in a format
+        * understood by the hardware.
+        */
+       mach |= MAC_VID << 16;
+       mach |= ((u32)mac[0]) << 8;
+       mach |= ((u32)mac[1]) << 0;
+       macl |= ((u32)mac[2]) << 24;
+       macl |= ((u32)mac[3]) << 16;
+       macl |= ((u32)mac[4]) << 8;
+       macl |= ((u32)mac[5]) << 0;
+
+       writel(mach, priv->regs[LRN] + LRN_COMMON_MAC_ACCESS_CFG0);
+       writel(macl, priv->regs[LRN] + LRN_COMMON_MAC_ACCESS_CFG1);
+
+       writel(LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_ADDR(pgid) |
+              LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_TYPE(0x3) |
+              LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_CPU_COPY |
+              LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_CPU_QU(0) |
+              LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_VLD |
+              LRN_COMMON_MAC_ACCESS_CFG2_MAC_ENTRY_LOCKED,
+              priv->regs[LRN] + LRN_COMMON_MAC_ACCESS_CFG2);
+
+       writel(LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT,
+              priv->regs[LRN] + LRN_COMMON_ACCESS_CTRL);
+
+       return servalt_vlant_wait_for_completion(priv);
+}
+
+static int servalt_write_hwaddr(struct udevice *dev)
+{
+       struct servalt_private *priv = dev_get_priv(dev);
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+
+       return servalt_mac_table_add(priv, pdata->enetaddr, PGID_UNICAST);
+}
+
+static int servalt_start(struct udevice *dev)
+{
+       struct servalt_private *priv = dev_get_priv(dev);
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+       const unsigned char mac[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff,
+               0xff };
+       int ret;
+
+       ret = servalt_initialize(priv);
+       if (ret)
+               return ret;
+
+       /* Set MAC address tables entries for CPU redirection */
+       ret = servalt_mac_table_add(priv, mac, PGID_BROADCAST);
+       if (ret)
+               return ret;
+
+       ret = servalt_mac_table_add(priv, pdata->enetaddr, PGID_UNICAST);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static void servalt_stop(struct udevice *dev)
+{
+}
+
+static int servalt_send(struct udevice *dev, void *packet, int length)
+{
+       struct servalt_private *priv = dev_get_priv(dev);
+       u32 ifh[IFH_LEN];
+       u32 *buf = packet;
+
+       memset(ifh, '\0', IFH_LEN * 4);
+
+       /* Set DST PORT_MASK */
+       ifh[0] = htonl(0);
+       ifh[1] = htonl(0x1FFFFF);
+       ifh[2] = htonl(~0);
+       /* Set DST_MODE to INJECT and UPDATE_FCS */
+       ifh[5] = htonl(0x4c0);
+
+       return mscc_send(priv->regs[QS], servalt_regs_qs,
+                        ifh, IFH_LEN, buf, length);
+}
+
+static int servalt_recv(struct udevice *dev, int flags, uchar **packetp)
+{
+       struct servalt_private *priv = dev_get_priv(dev);
+       u32 *rxbuf = (u32 *)net_rx_packets[0];
+       int byte_cnt = 0;
+
+       byte_cnt = mscc_recv(priv->regs[QS], servalt_regs_qs, rxbuf, IFH_LEN,
+                            false);
+
+       *packetp = net_rx_packets[0];
+
+       return byte_cnt;
+}
+
+static struct mii_dev *get_mdiobus(phys_addr_t base, unsigned long size)
+{
+       int i = 0;
+
+       for (i = 0; i < SERVALT_MIIM_BUS_COUNT; ++i)
+               if (miim[i].miim_base == base && miim[i].miim_size == size)
+                       return miim[i].bus;
+
+       return NULL;
+}
+
+static void add_port_entry(struct servalt_private *priv, size_t index,
+                          size_t phy_addr, struct mii_dev *bus)
+{
+       priv->ports[index].phy_addr = phy_addr;
+       priv->ports[index].bus = bus;
+}
+
+static int servalt_probe(struct udevice *dev)
+{
+       struct servalt_private *priv = dev_get_priv(dev);
+       int i;
+       struct resource res;
+       fdt32_t faddr;
+       phys_addr_t addr_base;
+       unsigned long addr_size;
+       ofnode eth_node, node, mdio_node;
+       size_t phy_addr;
+       struct mii_dev *bus;
+       struct ofnode_phandle_args phandle;
+
+       if (!priv)
+               return -EINVAL;
+
+       /* Get registers and map them to the private structure */
+       for (i = 0; i < ARRAY_SIZE(regs_names); i++) {
+               priv->regs[i] = dev_remap_addr_name(dev, regs_names[i]);
+               if (!priv->regs[i]) {
+                       debug
+                           ("Error can't get regs base addresses for %s\n",
+                            regs_names[i]);
+                       return -ENOMEM;
+               }
+       }
+
+       /* Initialize miim buses */
+       memset(&miim, 0x0, sizeof(struct mscc_miim_dev) *
+              SERVALT_MIIM_BUS_COUNT);
+
+       /* iterate all the ports and find out on which bus they are */
+       i = 0;
+       eth_node = dev_read_first_subnode(dev);
+       for (node = ofnode_first_subnode(eth_node);
+            ofnode_valid(node);
+            node = ofnode_next_subnode(node)) {
+               if (ofnode_read_resource(node, 0, &res))
+                       return -ENOMEM;
+               i = res.start;
+
+               ofnode_parse_phandle_with_args(node, "phy-handle", NULL, 0, 0,
+                                              &phandle);
+
+               /* Get phy address on mdio bus */
+               if (ofnode_read_resource(phandle.node, 0, &res))
+                       return -ENOMEM;
+               phy_addr = res.start;
+
+               /* Get mdio node */
+               mdio_node = ofnode_get_parent(phandle.node);
+
+               if (ofnode_read_resource(mdio_node, 0, &res))
+                       return -ENOMEM;
+               faddr = cpu_to_fdt32(res.start);
+
+               addr_base = ofnode_translate_address(mdio_node, &faddr);
+               addr_size = res.end - res.start;
+
+               /* If the bus is new then create a new bus */
+               if (!get_mdiobus(addr_base, addr_size))
+                       priv->bus[miim_count] =
+                               servalt_mdiobus_init(addr_base, addr_size);
+
+               /* Connect mdio bus with the port */
+               bus = get_mdiobus(addr_base, addr_size);
+               add_port_entry(priv, i, phy_addr, bus);
+       }
+
+       mscc_phy_reset();
+
+       for (i = 0; i < MAX_PORT; i++) {
+               if (!priv->ports[i].bus)
+                       continue;
+
+               phy_connect(priv->ports[i].bus, priv->ports[i].phy_addr, dev,
+                           PHY_INTERFACE_MODE_NONE);
+       }
+
+       return 0;
+}
+
+static int servalt_remove(struct udevice *dev)
+{
+       struct servalt_private *priv = dev_get_priv(dev);
+       int i;
+
+       for (i = 0; i < SERVALT_MIIM_BUS_COUNT; i++) {
+               mdio_unregister(priv->bus[i]);
+               mdio_free(priv->bus[i]);
+       }
+
+       return 0;
+}
+
+static const struct eth_ops servalt_ops = {
+       .start        = servalt_start,
+       .stop         = servalt_stop,
+       .send         = servalt_send,
+       .recv         = servalt_recv,
+       .write_hwaddr = servalt_write_hwaddr,
+};
+
+static const struct udevice_id mscc_servalt_ids[] = {
+       {.compatible = "mscc,vsc7437-switch" },
+       { /* Sentinel */ }
+};
+
+U_BOOT_DRIVER(servalt) = {
+       .name                           = "servalt-switch",
+       .id                             = UCLASS_ETH,
+       .of_match                       = mscc_servalt_ids,
+       .probe                          = servalt_probe,
+       .remove                         = servalt_remove,
+       .ops                            = &servalt_ops,
+       .priv_auto_alloc_size           = sizeof(struct servalt_private),
+       .platdata_auto_alloc_size       = sizeof(struct eth_pdata),
+};
index 2e1123c488a37ee8eed544a20f65abf872adcf55..4646f2ba4ec4ae213109f5cd588f2b1a408840ea 100644 (file)
@@ -769,19 +769,9 @@ static int sh_ether_start(struct udevice *dev)
        struct sh_eth_dev *eth = &priv->shdev;
        int ret;
 
-       ret = clk_enable(&priv->clk);
-       if (ret)
-               return ret;
-
        ret = sh_eth_init_common(eth, pdata->enetaddr);
        if (ret)
-               goto err_clk;
-
-       ret = sh_eth_phy_config(dev);
-       if (ret) {
-               printf(SHETHER_NAME ": phy config timeout\n");
-               goto err_start;
-       }
+               return ret;
 
        ret = sh_eth_start_common(eth);
        if (ret)
@@ -792,17 +782,17 @@ static int sh_ether_start(struct udevice *dev)
 err_start:
        sh_eth_tx_desc_free(eth);
        sh_eth_rx_desc_free(eth);
-err_clk:
-       clk_disable(&priv->clk);
        return ret;
 }
 
 static void sh_ether_stop(struct udevice *dev)
 {
        struct sh_ether_priv *priv = dev_get_priv(dev);
+       struct sh_eth_dev *eth = &priv->shdev;
+       struct sh_eth_info *port_info = &eth->port_info[eth->port];
 
+       phy_shutdown(port_info->phydev);
        sh_eth_stop(&priv->shdev);
-       clk_disable(&priv->clk);
 }
 
 static int sh_ether_probe(struct udevice *udev)
@@ -853,8 +843,20 @@ static int sh_ether_probe(struct udevice *udev)
        eth->port_info[eth->port].iobase =
                (void __iomem *)(BASE_IO_ADDR + 0x800 * eth->port);
 
+       ret = clk_enable(&priv->clk);
+       if (ret)
+               goto err_mdio_register;
+
+       ret = sh_eth_phy_config(udev);
+       if (ret) {
+               printf(SHETHER_NAME ": phy config timeout\n");
+               goto err_phy_config;
+       }
+
        return 0;
 
+err_phy_config:
+       clk_disable(&priv->clk);
 err_mdio_register:
        mdio_free(mdiodev);
        return ret;
@@ -866,6 +868,7 @@ static int sh_ether_remove(struct udevice *udev)
        struct sh_eth_dev *eth = &priv->shdev;
        struct sh_eth_info *port_info = &eth->port_info[eth->port];
 
+       clk_disable(&priv->clk);
        free(port_info->phydev);
        mdio_unregister(priv->bus);
        mdio_free(priv->bus);
index c9798445c7dd1a675f7cba2034fef3e850fff1c3..98bd7a58232fd0e9416529e67bd835f8949202a0 100644 (file)
 #include <asm/arch/clock.h>
 #include <asm/arch/gpio.h>
 #include <common.h>
+#include <clk.h>
 #include <dm.h>
 #include <fdt_support.h>
 #include <linux/err.h>
 #include <malloc.h>
 #include <miiphy.h>
 #include <net.h>
+#include <reset.h>
 #include <dt-bindings/pinctrl/sun4i-a10.h>
 #ifdef CONFIG_DM_GPIO
 #include <asm-generic/gpio.h>
@@ -135,6 +137,8 @@ struct emac_eth_dev {
        phys_addr_t sysctl_reg;
        struct phy_device *phydev;
        struct mii_dev *bus;
+       struct clk tx_clk;
+       struct reset_ctl tx_rst;
 #ifdef CONFIG_DM_GPIO
        struct gpio_desc reset_gpio;
 #endif
@@ -285,10 +289,18 @@ static int sun8i_emac_set_syscon(struct sun8i_eth_pdata *pdata,
        int ret;
        u32 reg;
 
-       reg = readl(priv->sysctl_reg + 0x30);
+       if (priv->variant == R40_GMAC) {
+               /* Select RGMII for R40 */
+               reg = readl(priv->sysctl_reg + 0x164);
+               reg |= CCM_GMAC_CTRL_TX_CLK_SRC_INT_RGMII |
+                      CCM_GMAC_CTRL_GPIT_RGMII |
+                      CCM_GMAC_CTRL_TX_CLK_DELAY(CONFIG_GMAC_TX_DELAY);
 
-       if (priv->variant == R40_GMAC)
+               writel(reg, priv->sysctl_reg + 0x164);
                return 0;
+       }
+
+       reg = readl(priv->sysctl_reg + 0x30);
 
        if (priv->variant == H3_EMAC) {
                ret = sun8i_emac_set_syscon_ephy(priv, &reg);
@@ -639,9 +651,24 @@ static int sun8i_eth_write_hwaddr(struct udevice *dev)
        return _sun8i_write_hwaddr(priv, pdata->enetaddr);
 }
 
-static void sun8i_emac_board_setup(struct emac_eth_dev *priv)
+static int sun8i_emac_board_setup(struct emac_eth_dev *priv)
 {
        struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
+       int ret;
+
+       ret = clk_enable(&priv->tx_clk);
+       if (ret) {
+               dev_err(dev, "failed to enable TX clock\n");
+               return ret;
+       }
+
+       if (reset_valid(&priv->tx_rst)) {
+               ret = reset_deassert(&priv->tx_rst);
+               if (ret) {
+                       dev_err(dev, "failed to deassert TX reset\n");
+                       goto err_tx_clk;
+               }
+       }
 
        if (priv->variant == H3_EMAC) {
                /* Only H3/H5 have clock controls for internal EPHY */
@@ -656,26 +683,11 @@ static void sun8i_emac_board_setup(struct emac_eth_dev *priv)
                }
        }
 
-       if (priv->variant == R40_GMAC) {
-               /* Set clock gating for emac */
-               setbits_le32(&ccm->ahb_reset1_cfg, BIT(AHB_RESET_OFFSET_GMAC));
-
-               /* De-assert EMAC */
-               setbits_le32(&ccm->ahb_gate1, BIT(AHB_GATE_OFFSET_GMAC));
+       return 0;
 
-               /* Select RGMII for R40 */
-               setbits_le32(&ccm->gmac_clk_cfg,
-                            CCM_GMAC_CTRL_TX_CLK_SRC_INT_RGMII |
-                            CCM_GMAC_CTRL_GPIT_RGMII);
-               setbits_le32(&ccm->gmac_clk_cfg,
-                            CCM_GMAC_CTRL_TX_CLK_DELAY(CONFIG_GMAC_TX_DELAY));
-       } else {
-               /* Set clock gating for emac */
-               setbits_le32(&ccm->ahb_gate0, BIT(AHB_GATE_OFFSET_GMAC));
-
-               /* De-assert EMAC */
-               setbits_le32(&ccm->ahb_reset0_cfg, BIT(AHB_RESET_OFFSET_GMAC));
-       }
+err_tx_clk:
+       clk_disable(&priv->tx_clk);
+       return ret;
 }
 
 #if defined(CONFIG_DM_GPIO)
@@ -802,10 +814,14 @@ static int sun8i_emac_eth_probe(struct udevice *dev)
        struct sun8i_eth_pdata *sun8i_pdata = dev_get_platdata(dev);
        struct eth_pdata *pdata = &sun8i_pdata->eth_pdata;
        struct emac_eth_dev *priv = dev_get_priv(dev);
+       int ret;
 
        priv->mac_reg = (void *)pdata->iobase;
 
-       sun8i_emac_board_setup(priv);
+       ret = sun8i_emac_board_setup(priv);
+       if (ret)
+               return ret;
+
        sun8i_emac_set_syscon(sun8i_pdata, priv);
 
        sun8i_mdio_init(dev->name, dev);
@@ -834,8 +850,8 @@ static int sun8i_emac_eth_ofdata_to_platdata(struct udevice *dev)
        int offset = 0;
 #ifdef CONFIG_DM_GPIO
        int reset_flags = GPIOD_IS_OUT;
-       int ret = 0;
 #endif
+       int ret;
 
        pdata->iobase = devfdt_get_addr(dev);
        if (pdata->iobase == FDT_ADDR_T_NONE) {
@@ -850,25 +866,35 @@ static int sun8i_emac_eth_ofdata_to_platdata(struct udevice *dev)
                return -EINVAL;
        }
 
-       if (priv->variant != R40_GMAC) {
-               offset = fdtdec_lookup_phandle(gd->fdt_blob, node, "syscon");
-               if (offset < 0) {
-                       debug("%s: cannot find syscon node\n", __func__);
-                       return -EINVAL;
-               }
-               reg = fdt_getprop(gd->fdt_blob, offset, "reg", NULL);
-               if (!reg) {
-                       debug("%s: cannot find reg property in syscon node\n",
-                             __func__);
-                       return -EINVAL;
-               }
-               priv->sysctl_reg = fdt_translate_address((void *)gd->fdt_blob,
-                                                        offset, reg);
-               if (priv->sysctl_reg == FDT_ADDR_T_NONE) {
-                       debug("%s: Cannot find syscon base address\n",
-                             __func__);
-                       return -EINVAL;
-               }
+       ret = clk_get_by_name(dev, "stmmaceth", &priv->tx_clk);
+       if (ret) {
+               dev_err(dev, "failed to get TX clock\n");
+               return ret;
+       }
+
+       ret = reset_get_by_name(dev, "stmmaceth", &priv->tx_rst);
+       if (ret && ret != -ENOENT) {
+               dev_err(dev, "failed to get TX reset\n");
+               return ret;
+       }
+
+       offset = fdtdec_lookup_phandle(gd->fdt_blob, node, "syscon");
+       if (offset < 0) {
+               debug("%s: cannot find syscon node\n", __func__);
+               return -EINVAL;
+       }
+
+       reg = fdt_getprop(gd->fdt_blob, offset, "reg", NULL);
+       if (!reg) {
+               debug("%s: cannot find reg property in syscon node\n",
+                     __func__);
+               return -EINVAL;
+       }
+       priv->sysctl_reg = fdt_translate_address((void *)gd->fdt_blob,
+                                                offset, reg);
+       if (priv->sysctl_reg == FDT_ADDR_T_NONE) {
+               debug("%s: Cannot find syscon base address\n", __func__);
+               return -EINVAL;
        }
 
        pdata->phy_interface = -1;
index 8dbd3c50c117ce25729fbfdbf9314d6fde1a2bb5..9a5f7fd3c7bcbb80458b5746736f1f411017c745 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include <common.h>
+#include <clk.h>
 #include <dm.h>
 #include <linux/err.h>
 #include <malloc.h>
@@ -157,6 +158,7 @@ struct sunxi_sramc_regs {
 
 struct emac_eth_dev {
        struct emac_regs *regs;
+       struct clk clk;
        struct mii_dev *bus;
        struct phy_device *phydev;
        int link_printed;
@@ -500,14 +502,12 @@ static int _sunxi_emac_eth_send(struct emac_eth_dev *priv, void *packet,
        return 0;
 }
 
-static void sunxi_emac_board_setup(struct emac_eth_dev *priv)
+static int sunxi_emac_board_setup(struct emac_eth_dev *priv)
 {
-       struct sunxi_ccm_reg *const ccm =
-               (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
        struct sunxi_sramc_regs *sram =
                (struct sunxi_sramc_regs *)SUNXI_SRAMC_BASE;
        struct emac_regs *regs = priv->regs;
-       int pin;
+       int pin, ret;
 
        /* Map SRAM to EMAC */
        setbits_le32(&sram->ctrl1, 0x5 << 2);
@@ -517,10 +517,16 @@ static void sunxi_emac_board_setup(struct emac_eth_dev *priv)
                sunxi_gpio_set_cfgpin(pin, SUNXI_GPA_EMAC);
 
        /* Set up clock gating */
-       setbits_le32(&ccm->ahb_gate0, 0x1 << AHB_GATE_OFFSET_EMAC);
+       ret = clk_enable(&priv->clk);
+       if (ret) {
+               dev_err(dev, "failed to enable emac clock\n");
+               return ret;
+       }
 
        /* Set MII clock */
        clrsetbits_le32(&regs->mac_mcfg, 0xf << 2, 0xd << 2);
+
+       return 0;
 }
 
 static int sunxi_emac_eth_start(struct udevice *dev)
@@ -557,9 +563,19 @@ static int sunxi_emac_eth_probe(struct udevice *dev)
 {
        struct eth_pdata *pdata = dev_get_platdata(dev);
        struct emac_eth_dev *priv = dev_get_priv(dev);
+       int ret;
 
        priv->regs = (struct emac_regs *)pdata->iobase;
-       sunxi_emac_board_setup(priv);
+
+       ret = clk_get_by_index(dev, 0, &priv->clk);
+       if (ret) {
+               dev_err(dev, "failed to get emac clock\n");
+               return ret;
+       }
+
+       ret = sunxi_emac_board_setup(priv);
+       if (ret)
+               return ret;
 
        return sunxi_emac_init_phy(priv, dev);
 }
index 6c8ddbd93618b913e9c2eec08032f671b049f438..ac12cfe9b86bd989777943915c5e1f34f94d7a00 100644 (file)
@@ -16,35 +16,11 @@ DECLARE_GLOBAL_DATA_PTR;
 
 #define CTRL_MAC_REG(offset, id) ((offset) + 0x8 * (id))
 
-static int davinci_emac_3517_get_macid(struct udevice *dev, u16 offset,
-                                      int slave, u8 *mac_addr)
+static void davinci_emac_3517_get_macid(u32 addr, u8 *mac_addr)
 {
-       void *fdt = (void *)gd->fdt_blob;
-       int node = dev_of_offset(dev);
-       u32 macid_lsb;
-       u32 macid_msb;
-       fdt32_t gmii = 0;
-       int syscon;
-       u32 addr;
-
-       syscon = fdtdec_lookup_phandle(fdt, node, "syscon");
-       if (syscon < 0) {
-               pr_err("Syscon offset not found\n");
-               return -ENOENT;
-       }
-
-       addr = (u32)map_physmem(fdt_translate_address(fdt, syscon, &gmii),
-                               sizeof(u32), MAP_NOCACHE);
-       if (addr == FDT_ADDR_T_NONE) {
-               pr_err("Not able to get syscon address to get mac efuse address\n");
-               return -ENOENT;
-       }
-
-       addr += CTRL_MAC_REG(offset, slave);
-
        /* try reading mac address from efuse */
-       macid_lsb = readl(addr);
-       macid_msb = readl(addr + 4);
+       u32 macid_lsb = readl(addr);
+       u32 macid_msb = readl(addr + 4);
 
        mac_addr[0] = (macid_msb >> 16) & 0xff;
        mac_addr[1] = (macid_msb >> 8)  & 0xff;
@@ -52,20 +28,62 @@ static int davinci_emac_3517_get_macid(struct udevice *dev, u16 offset,
        mac_addr[3] = (macid_lsb >> 16) & 0xff;
        mac_addr[4] = (macid_lsb >> 8)  & 0xff;
        mac_addr[5] = macid_lsb & 0xff;
+}
 
-       return 0;
+static void cpsw_am33xx_cm_get_macid(u32 addr, u8 *mac_addr)
+{
+       /* try reading mac address from efuse */
+       u32 macid_lo = readl(addr);
+       u32 macid_hi = readl(addr + 4);
+
+       mac_addr[5] = (macid_lo >> 8) & 0xff;
+       mac_addr[4] = macid_lo & 0xff;
+       mac_addr[3] = (macid_hi >> 24) & 0xff;
+       mac_addr[2] = (macid_hi >> 16) & 0xff;
+       mac_addr[1] = (macid_hi >> 8) & 0xff;
+       mac_addr[0] = macid_hi & 0xff;
+}
+
+void ti_cm_get_macid(struct udevice *dev, struct cpsw_platform_data *data,
+                    u8 *mac_addr)
+{
+       if (!strcmp(data->macid_sel_compat, "cpsw,am33xx"))
+               cpsw_am33xx_cm_get_macid(data->syscon_addr, mac_addr);
+       else if (!strcmp(data->macid_sel_compat, "davinci,emac"))
+               davinci_emac_3517_get_macid(data->syscon_addr, mac_addr);
 }
 
-static int cpsw_am33xx_cm_get_macid(struct udevice *dev, u16 offset, int slave,
-                                   u8 *mac_addr)
+int ti_cm_get_macid_addr(struct udevice *dev, int slave,
+                        struct cpsw_platform_data *data)
 {
        void *fdt = (void *)gd->fdt_blob;
        int node = dev_of_offset(dev);
-       u32 macid_lo;
-       u32 macid_hi;
        fdt32_t gmii = 0;
        int syscon;
-       u32 addr;
+       u16 offset;
+
+       if (of_machine_is_compatible("ti,dm8148")) {
+               offset = 0x630;
+               data->macid_sel_compat = "cpsw,am33xx";
+       } else if (of_machine_is_compatible("ti,am33xx")) {
+               offset = 0x630;
+               data->macid_sel_compat = "cpsw,am33xx";
+       } else if (device_is_compatible(dev, "ti,am3517-emac")) {
+               offset = 0x110;
+               data->macid_sel_compat = "davinci,emac";
+       } else if (device_is_compatible(dev, "ti,dm816-emac")) {
+               offset = 0x30;
+               data->macid_sel_compat = "cpsw,am33xx";
+       } else if (of_machine_is_compatible("ti,am43")) {
+               offset = 0x630;
+               data->macid_sel_compat = "cpsw,am33xx";
+       } else if (of_machine_is_compatible("ti,dra7")) {
+               offset = 0x514;
+               data->macid_sel_compat = "davinci,emac";
+       } else {
+               dev_err(dev, "incompatible machine/device type for reading mac address\n");
+               return -ENOENT;
+       }
 
        syscon = fdtdec_lookup_phandle(fdt, node, "syscon");
        if (syscon < 0) {
@@ -73,49 +91,16 @@ static int cpsw_am33xx_cm_get_macid(struct udevice *dev, u16 offset, int slave,
                return -ENOENT;
        }
 
-       addr = (u32)map_physmem(fdt_translate_address(fdt, syscon, &gmii),
-                               sizeof(u32), MAP_NOCACHE);
-       if (addr == FDT_ADDR_T_NONE) {
+       data->syscon_addr = (u32)map_physmem(fdt_translate_address(fdt, syscon,
+                                                                  &gmii),
+                                            sizeof(u32), MAP_NOCACHE);
+       if (data->syscon_addr == FDT_ADDR_T_NONE) {
                pr_err("Not able to get syscon address to get mac efuse address\n");
                return -ENOENT;
        }
 
-       addr += CTRL_MAC_REG(offset, slave);
-
-       /* try reading mac address from efuse */
-       macid_lo = readl(addr);
-       macid_hi = readl(addr + 4);
-
-       mac_addr[5] = (macid_lo >> 8) & 0xff;
-       mac_addr[4] = macid_lo & 0xff;
-       mac_addr[3] = (macid_hi >> 24) & 0xff;
-       mac_addr[2] = (macid_hi >> 16) & 0xff;
-       mac_addr[1] = (macid_hi >> 8) & 0xff;
-       mac_addr[0] = macid_hi & 0xff;
+       data->syscon_addr += CTRL_MAC_REG(offset, slave);
 
        return 0;
-}
-
-int ti_cm_get_macid(struct udevice *dev, int slave, u8 *mac_addr)
-{
-       if (of_machine_is_compatible("ti,dm8148"))
-               return cpsw_am33xx_cm_get_macid(dev, 0x630, slave, mac_addr);
-
-       if (of_machine_is_compatible("ti,am33xx"))
-               return cpsw_am33xx_cm_get_macid(dev, 0x630, slave, mac_addr);
-
-       if (device_is_compatible(dev, "ti,am3517-emac"))
-               return davinci_emac_3517_get_macid(dev, 0x110, slave, mac_addr);
-
-       if (device_is_compatible(dev, "ti,dm816-emac"))
-               return cpsw_am33xx_cm_get_macid(dev, 0x30, slave, mac_addr);
-
-       if (of_machine_is_compatible("ti,am43"))
-               return cpsw_am33xx_cm_get_macid(dev, 0x630, slave, mac_addr);
-
-       if (of_machine_is_compatible("ti,dra7"))
-               return davinci_emac_3517_get_macid(dev, 0x514, slave, mac_addr);
 
-       dev_err(dev, "incompatible machine/device type for reading mac address\n");
-       return -ENOENT;
 }
index f5fd02efe1af47b398f684e6e1c5b9577b0656c6..20ddb44dd89460989d1f16d0e2b01c6f110fc38a 100644 (file)
@@ -33,24 +33,6 @@ DECLARE_GLOBAL_DATA_PTR;
 #define GIGABITEN              BIT(7)
 #define FULLDUPLEXEN           BIT(0)
 #define MIIEN                  BIT(15)
-
-/* reg offset */
-#define CPSW_HOST_PORT_OFFSET  0x108
-#define CPSW_SLAVE0_OFFSET     0x208
-#define CPSW_SLAVE1_OFFSET     0x308
-#define CPSW_SLAVE_SIZE                0x100
-#define CPSW_CPDMA_OFFSET      0x800
-#define CPSW_HW_STATS          0x900
-#define CPSW_STATERAM_OFFSET   0xa00
-#define CPSW_CPTS_OFFSET       0xc00
-#define CPSW_ALE_OFFSET                0xd00
-#define CPSW_SLIVER0_OFFSET    0xd80
-#define CPSW_SLIVER1_OFFSET    0xdc0
-#define CPSW_BD_OFFSET         0x2000
-#define CPSW_MDIO_DIV          0xff
-
-#define AM335X_GMII_SEL_OFFSET 0x630
-
 /* DMA Registers */
 #define CPDMA_TXCONTROL                0x004
 #define CPDMA_RXCONTROL                0x014
@@ -209,10 +191,10 @@ struct cpdma_chan {
 #define chan_read_ptr(chan, fld)       ((void *)__raw_readl((chan)->fld))
 
 #define for_active_slave(slave, priv) \
-       slave = (priv)->slaves + (priv)->data.active_slave; if (slave)
+       slave = (priv)->slaves + ((priv)->data)->active_slave; if (slave)
 #define for_each_slave(slave, priv) \
        for (slave = (priv)->slaves; slave != (priv)->slaves + \
-                               (priv)->data.slaves; slave++)
+                               ((priv)->data)->slaves; slave++)
 
 struct cpsw_priv {
 #ifdef CONFIG_DM_ETH
@@ -220,7 +202,7 @@ struct cpsw_priv {
 #else
        struct eth_device               *dev;
 #endif
-       struct cpsw_platform_data       data;
+       struct cpsw_platform_data       *data;
        int                             host_port;
 
        struct cpsw_regs                *regs;
@@ -327,7 +309,7 @@ static int cpsw_ale_match_addr(struct cpsw_priv *priv, const u8 *addr)
        u32 ale_entry[ALE_ENTRY_WORDS];
        int type, idx;
 
-       for (idx = 0; idx < priv->data.ale_entries; idx++) {
+       for (idx = 0; idx < priv->data->ale_entries; idx++) {
                u8 entry_addr[6];
 
                cpsw_ale_read(priv, idx, ale_entry);
@@ -346,7 +328,7 @@ static int cpsw_ale_match_free(struct cpsw_priv *priv)
        u32 ale_entry[ALE_ENTRY_WORDS];
        int type, idx;
 
-       for (idx = 0; idx < priv->data.ale_entries; idx++) {
+       for (idx = 0; idx < priv->data->ale_entries; idx++) {
                cpsw_ale_read(priv, idx, ale_entry);
                type = cpsw_ale_get_entry_type(ale_entry);
                if (type == ALE_TYPE_FREE)
@@ -360,7 +342,7 @@ static int cpsw_ale_find_ageable(struct cpsw_priv *priv)
        u32 ale_entry[ALE_ENTRY_WORDS];
        int type, idx;
 
-       for (idx = 0; idx < priv->data.ale_entries; idx++) {
+       for (idx = 0; idx < priv->data->ale_entries; idx++) {
                cpsw_ale_read(priv, idx, ale_entry);
                type = cpsw_ale_get_entry_type(ale_entry);
                if (type != ALE_TYPE_ADDR && type != ALE_TYPE_VLAN_ADDR)
@@ -500,7 +482,7 @@ static int cpsw_slave_update_link(struct cpsw_slave *slave,
                *link = phy->link;
 
        if (phy->link) { /* link up */
-               mac_control = priv->data.mac_control;
+               mac_control = priv->data->mac_control;
                if (phy->speed == 1000)
                        mac_control |= GIGABITEN;
                if (phy->duplex == DUPLEX_FULL)
@@ -710,7 +692,7 @@ static int _cpsw_init(struct cpsw_priv *priv, u8 *enetaddr)
        priv->desc_free = &priv->descs[0];
 
        /* initialize channels */
-       if (priv->data.version == CPSW_CTRL_VERSION_2) {
+       if (priv->data->version == CPSW_CTRL_VERSION_2) {
                memset(&priv->rx_chan, 0, sizeof(struct cpdma_chan));
                priv->rx_chan.hdp       = priv->dma_regs + CPDMA_RXHDP_VER2;
                priv->rx_chan.cp        = priv->dma_regs + CPDMA_RXCP_VER2;
@@ -733,8 +715,8 @@ static int _cpsw_init(struct cpsw_priv *priv, u8 *enetaddr)
        /* clear dma state */
        setbit_and_wait_for_clear32(priv->dma_regs + CPDMA_SOFTRESET);
 
-       if (priv->data.version == CPSW_CTRL_VERSION_2) {
-               for (i = 0; i < priv->data.channels; i++) {
+       if (priv->data->version == CPSW_CTRL_VERSION_2) {
+               for (i = 0; i < priv->data->channels; i++) {
                        __raw_writel(0, priv->dma_regs + CPDMA_RXHDP_VER2 + 4
                                        * i);
                        __raw_writel(0, priv->dma_regs + CPDMA_RXFREE + 4
@@ -747,7 +729,7 @@ static int _cpsw_init(struct cpsw_priv *priv, u8 *enetaddr)
                                        * i);
                }
        } else {
-               for (i = 0; i < priv->data.channels; i++) {
+               for (i = 0; i < priv->data->channels; i++) {
                        __raw_writel(0, priv->dma_regs + CPDMA_RXHDP_VER1 + 4
                                        * i);
                        __raw_writel(0, priv->dma_regs + CPDMA_RXFREE + 4
@@ -843,7 +825,7 @@ static void cpsw_slave_setup(struct cpsw_slave *slave, int slave_num,
                            struct cpsw_priv *priv)
 {
        void                    *regs = priv->regs;
-       struct cpsw_slave_data  *data = priv->data.slave_data + slave_num;
+       struct cpsw_slave_data  *data = priv->data->slave_data + slave_num;
        slave->slave_num = slave_num;
        slave->data     = data;
        slave->regs     = regs + data->slave_reg_ofs;
@@ -879,7 +861,7 @@ static int cpsw_phy_init(struct cpsw_priv *priv, struct cpsw_slave *slave)
 
 static void cpsw_phy_addr_update(struct cpsw_priv *priv)
 {
-       struct cpsw_platform_data *data = &priv->data;
+       struct cpsw_platform_data *data = priv->data;
        u16 alive = cpsw_mdio_get_alive(priv->bus);
        int active = data->active_slave;
        int new_addr = ffs(alive) - 1;
@@ -899,7 +881,7 @@ static void cpsw_phy_addr_update(struct cpsw_priv *priv)
 int _cpsw_register(struct cpsw_priv *priv)
 {
        struct cpsw_slave       *slave;
-       struct cpsw_platform_data *data = &priv->data;
+       struct cpsw_platform_data *data = priv->data;
        void                    *regs = (void *)data->cpsw_base;
 
        priv->slaves = malloc(sizeof(struct cpsw_slave) * data->slaves);
@@ -988,7 +970,7 @@ int cpsw_register(struct cpsw_platform_data *data)
        }
 
        priv->dev = dev;
-       priv->data = *data;
+       priv->data = data;
 
        strcpy(dev->name, "cpsw");
        dev->iobase     = 0;
@@ -1048,16 +1030,6 @@ static void cpsw_eth_stop(struct udevice *dev)
        return _cpsw_halt(priv);
 }
 
-
-static int cpsw_eth_probe(struct udevice *dev)
-{
-       struct cpsw_priv *priv = dev_get_priv(dev);
-
-       priv->dev = dev;
-
-       return _cpsw_register(priv);
-}
-
 static const struct eth_ops cpsw_eth_ops = {
        .start          = cpsw_eth_start,
        .send           = cpsw_eth_send,
@@ -1079,9 +1051,9 @@ static void cpsw_gmii_sel_am3352(struct cpsw_priv *priv,
        u32 mask;
        u32 mode = 0;
        bool rgmii_id = false;
-       int slave = priv->data.active_slave;
+       int slave = priv->data->active_slave;
 
-       reg = readl(priv->data.gmii_sel);
+       reg = readl(priv->data->gmii_sel);
 
        switch (phy_mode) {
        case PHY_INTERFACE_MODE_RMII:
@@ -1107,7 +1079,7 @@ static void cpsw_gmii_sel_am3352(struct cpsw_priv *priv,
        mask = GMII_SEL_MODE_MASK << (slave * 2) | BIT(slave + 6);
        mode <<= slave * 2;
 
-       if (priv->data.rmii_clock_external) {
+       if (priv->data->rmii_clock_external) {
                if (slave == 0)
                        mode |= AM33XX_GMII_SEL_RMII1_IO_CLK_EN;
                else
@@ -1124,7 +1096,7 @@ static void cpsw_gmii_sel_am3352(struct cpsw_priv *priv,
        reg &= ~mask;
        reg |= mode;
 
-       writel(reg, priv->data.gmii_sel);
+       writel(reg, priv->data->gmii_sel);
 }
 
 static void cpsw_gmii_sel_dra7xx(struct cpsw_priv *priv,
@@ -1133,9 +1105,9 @@ static void cpsw_gmii_sel_dra7xx(struct cpsw_priv *priv,
        u32 reg;
        u32 mask;
        u32 mode = 0;
-       int slave = priv->data.active_slave;
+       int slave = priv->data->active_slave;
 
-       reg = readl(priv->data.gmii_sel);
+       reg = readl(priv->data->gmii_sel);
 
        switch (phy_mode) {
        case PHY_INTERFACE_MODE_RMII:
@@ -1168,13 +1140,13 @@ static void cpsw_gmii_sel_dra7xx(struct cpsw_priv *priv,
                return;
        }
 
-       if (priv->data.rmii_clock_external)
+       if (priv->data->rmii_clock_external)
                dev_err(priv->dev, "RMII External clock is not supported\n");
 
        reg &= ~mask;
        reg |= mode;
 
-       writel(reg, priv->data.gmii_sel);
+       writel(reg, priv->data->gmii_sel);
 }
 
 static void cpsw_phy_sel(struct cpsw_priv *priv, const char *compat,
@@ -1188,13 +1160,28 @@ static void cpsw_phy_sel(struct cpsw_priv *priv, const char *compat,
                cpsw_gmii_sel_dra7xx(priv, phy_mode);
 }
 
+static int cpsw_eth_probe(struct udevice *dev)
+{
+       struct cpsw_priv *priv = dev_get_priv(dev);
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+
+       priv->dev = dev;
+       priv->data = pdata->priv_pdata;
+       ti_cm_get_macid(dev, priv->data, pdata->enetaddr);
+       /* Select phy interface in control module */
+       cpsw_phy_sel(priv, priv->data->phy_sel_compat,
+                    pdata->phy_interface);
+
+       return _cpsw_register(priv);
+}
+
+#if CONFIG_IS_ENABLED(OF_CONTROL)
 static int cpsw_eth_ofdata_to_platdata(struct udevice *dev)
 {
        struct eth_pdata *pdata = dev_get_platdata(dev);
-       struct cpsw_priv *priv = dev_get_priv(dev);
+       struct cpsw_platform_data *data;
        struct gpio_desc *mode_gpios;
        const char *phy_mode;
-       const char *phy_sel_compat = NULL;
        const void *fdt = gd->fdt_blob;
        int node = dev_of_offset(dev);
        int subnode;
@@ -1203,45 +1190,47 @@ static int cpsw_eth_ofdata_to_platdata(struct udevice *dev)
        int num_mode_gpios;
        int ret;
 
+       data = calloc(1, sizeof(struct cpsw_platform_data));
+       pdata->priv_pdata = data;
        pdata->iobase = devfdt_get_addr(dev);
-       priv->data.version = CPSW_CTRL_VERSION_2;
-       priv->data.bd_ram_ofs = CPSW_BD_OFFSET;
-       priv->data.ale_reg_ofs = CPSW_ALE_OFFSET;
-       priv->data.cpdma_reg_ofs = CPSW_CPDMA_OFFSET;
-       priv->data.mdio_div = CPSW_MDIO_DIV;
-       priv->data.host_port_reg_ofs = CPSW_HOST_PORT_OFFSET,
+       data->version = CPSW_CTRL_VERSION_2;
+       data->bd_ram_ofs = CPSW_BD_OFFSET;
+       data->ale_reg_ofs = CPSW_ALE_OFFSET;
+       data->cpdma_reg_ofs = CPSW_CPDMA_OFFSET;
+       data->mdio_div = CPSW_MDIO_DIV;
+       data->host_port_reg_ofs = CPSW_HOST_PORT_OFFSET,
 
        pdata->phy_interface = -1;
 
-       priv->data.cpsw_base = pdata->iobase;
-       priv->data.channels = fdtdec_get_int(fdt, node, "cpdma_channels", -1);
-       if (priv->data.channels <= 0) {
+       data->cpsw_base = pdata->iobase;
+       data->channels = fdtdec_get_int(fdt, node, "cpdma_channels", -1);
+       if (data->channels <= 0) {
                printf("error: cpdma_channels not found in dt\n");
                return -ENOENT;
        }
 
-       priv->data.slaves = fdtdec_get_int(fdt, node, "slaves", -1);
-       if (priv->data.slaves <= 0) {
+       data->slaves = fdtdec_get_int(fdt, node, "slaves", -1);
+       if (data->slaves <= 0) {
                printf("error: slaves not found in dt\n");
                return -ENOENT;
        }
-       priv->data.slave_data = malloc(sizeof(struct cpsw_slave_data) *
-                                      priv->data.slaves);
+       data->slave_data = malloc(sizeof(struct cpsw_slave_data) *
+                                      data->slaves);
 
-       priv->data.ale_entries = fdtdec_get_int(fdt, node, "ale_entries", -1);
-       if (priv->data.ale_entries <= 0) {
+       data->ale_entries = fdtdec_get_int(fdt, node, "ale_entries", -1);
+       if (data->ale_entries <= 0) {
                printf("error: ale_entries not found in dt\n");
                return -ENOENT;
        }
 
-       priv->data.bd_ram_ofs = fdtdec_get_int(fdt, node, "bd_ram_size", -1);
-       if (priv->data.bd_ram_ofs <= 0) {
+       data->bd_ram_ofs = fdtdec_get_int(fdt, node, "bd_ram_size", -1);
+       if (data->bd_ram_ofs <= 0) {
                printf("error: bd_ram_size not found in dt\n");
                return -ENOENT;
        }
 
-       priv->data.mac_control = fdtdec_get_int(fdt, node, "mac_control", -1);
-       if (priv->data.mac_control <= 0) {
+       data->mac_control = fdtdec_get_int(fdt, node, "mac_control", -1);
+       if (data->mac_control <= 0) {
                printf("error: ale_entries not found in dt\n");
                return -ENOENT;
        }
@@ -1256,7 +1245,7 @@ static int cpsw_eth_ofdata_to_platdata(struct udevice *dev)
        }
 
        active_slave = fdtdec_get_int(fdt, node, "active_slave", 0);
-       priv->data.active_slave = active_slave;
+       data->active_slave = active_slave;
 
        fdt_for_each_subnode(subnode, fdt, node) {
                int len;
@@ -1271,108 +1260,107 @@ static int cpsw_eth_ofdata_to_platdata(struct udevice *dev)
                                pr_err("Not able to get MDIO address space\n");
                                return -ENOENT;
                        }
-                       priv->data.mdio_base = mdio_base;
+                       data->mdio_base = mdio_base;
                }
 
                if (!strncmp(name, "slave", 5)) {
                        u32 phy_id[2];
 
-                       if (slave_index >= priv->data.slaves)
+                       if (slave_index >= data->slaves)
                                continue;
                        phy_mode = fdt_getprop(fdt, subnode, "phy-mode", NULL);
                        if (phy_mode)
-                               priv->data.slave_data[slave_index].phy_if =
+                               data->slave_data[slave_index].phy_if =
                                        phy_get_interface_by_name(phy_mode);
 
-                       priv->data.slave_data[slave_index].phy_of_handle =
+                       data->slave_data[slave_index].phy_of_handle =
                                fdtdec_lookup_phandle(fdt, subnode,
                                                      "phy-handle");
 
-                       if (priv->data.slave_data[slave_index].phy_of_handle >= 0) {
-                               priv->data.slave_data[slave_index].phy_addr =
+                       if (data->slave_data[slave_index].phy_of_handle >= 0) {
+                               data->slave_data[slave_index].phy_addr =
                                                fdtdec_get_int(gd->fdt_blob,
-                                                              priv->data.slave_data[slave_index].phy_of_handle,
+                                               data->slave_data[slave_index].phy_of_handle,
                                                               "reg", -1);
                        } else {
                                fdtdec_get_int_array(fdt, subnode, "phy_id",
                                                     phy_id, 2);
-                               priv->data.slave_data[slave_index].phy_addr =
+                               data->slave_data[slave_index].phy_addr =
                                                phy_id[1];
                        }
                        slave_index++;
                }
 
                if (!strncmp(name, "cpsw-phy-sel", 12)) {
-                       priv->data.gmii_sel = cpsw_get_addr_by_node(fdt,
-                                                                   subnode);
+                       data->gmii_sel = cpsw_get_addr_by_node(fdt, subnode);
 
-                       if (priv->data.gmii_sel == FDT_ADDR_T_NONE) {
+                       if (data->gmii_sel == FDT_ADDR_T_NONE) {
                                pr_err("Not able to get gmii_sel reg address\n");
                                return -ENOENT;
                        }
 
                        if (fdt_get_property(fdt, subnode, "rmii-clock-ext",
                                             NULL))
-                               priv->data.rmii_clock_external = true;
+                               data->rmii_clock_external = true;
 
-                       phy_sel_compat = fdt_getprop(fdt, subnode, "compatible",
-                                                    NULL);
-                       if (!phy_sel_compat) {
+                       data->phy_sel_compat = fdt_getprop(fdt, subnode,
+                                                          "compatible", NULL);
+                       if (!data->phy_sel_compat) {
                                pr_err("Not able to get gmii_sel compatible\n");
                                return -ENOENT;
                        }
                }
        }
 
-       priv->data.slave_data[0].slave_reg_ofs = CPSW_SLAVE0_OFFSET;
-       priv->data.slave_data[0].sliver_reg_ofs = CPSW_SLIVER0_OFFSET;
+       data->slave_data[0].slave_reg_ofs = CPSW_SLAVE0_OFFSET;
+       data->slave_data[0].sliver_reg_ofs = CPSW_SLIVER0_OFFSET;
 
-       if (priv->data.slaves == 2) {
-               priv->data.slave_data[1].slave_reg_ofs = CPSW_SLAVE1_OFFSET;
-               priv->data.slave_data[1].sliver_reg_ofs = CPSW_SLIVER1_OFFSET;
+       if (data->slaves == 2) {
+               data->slave_data[1].slave_reg_ofs = CPSW_SLAVE1_OFFSET;
+               data->slave_data[1].sliver_reg_ofs = CPSW_SLIVER1_OFFSET;
        }
 
-       ret = ti_cm_get_macid(dev, active_slave, pdata->enetaddr);
+       ret = ti_cm_get_macid_addr(dev, active_slave, data);
        if (ret < 0) {
                pr_err("cpsw read efuse mac failed\n");
                return ret;
        }
 
-       pdata->phy_interface = priv->data.slave_data[active_slave].phy_if;
+       pdata->phy_interface = data->slave_data[active_slave].phy_if;
        if (pdata->phy_interface == -1) {
                debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
                return -EINVAL;
        }
 
-       /* Select phy interface in control module */
-       cpsw_phy_sel(priv, phy_sel_compat, pdata->phy_interface);
-
        return 0;
 }
 
+static const struct udevice_id cpsw_eth_ids[] = {
+       { .compatible = "ti,cpsw" },
+       { .compatible = "ti,am335x-cpsw" },
+       { }
+};
+#endif
+
 int cpsw_get_slave_phy_addr(struct udevice *dev, int slave)
 {
        struct cpsw_priv *priv = dev_get_priv(dev);
-       struct cpsw_platform_data *data = &priv->data;
+       struct cpsw_platform_data *data = priv->data;
 
        return data->slave_data[slave].phy_addr;
 }
 
-static const struct udevice_id cpsw_eth_ids[] = {
-       { .compatible = "ti,cpsw" },
-       { .compatible = "ti,am335x-cpsw" },
-       { }
-};
-
 U_BOOT_DRIVER(eth_cpsw) = {
        .name   = "eth_cpsw",
        .id     = UCLASS_ETH,
+#if CONFIG_IS_ENABLED(OF_CONTROL)
        .of_match = cpsw_eth_ids,
        .ofdata_to_platdata = cpsw_eth_ofdata_to_platdata,
+       .platdata_auto_alloc_size = sizeof(struct eth_pdata),
+#endif
        .probe  = cpsw_eth_probe,
        .ops    = &cpsw_eth_ops,
        .priv_auto_alloc_size = sizeof(struct cpsw_priv),
-       .platdata_auto_alloc_size = sizeof(struct eth_pdata),
-       .flags = DM_FLAG_ALLOC_PRIV_DMA,
+       .flags = DM_FLAG_ALLOC_PRIV_DMA | DM_FLAG_PRE_RELOC,
 };
 #endif /* CONFIG_DM_ETH */
index a3ba91cc3f5600a8bc928908ffae4b4d33f62ac0..4baeeb83f109cb551cc748c520b2f05e6264010c 100644 (file)
@@ -88,6 +88,7 @@ struct ks2_eth_priv {
        struct mii_dev                  *mdio_bus;
        int                             phy_addr;
        phy_interface_t                 phy_if;
+       int                             phy_of_handle;
        int                             sgmii_link_type;
        void                            *mdio_base;
        struct rx_buff_desc             net_rx_buffs;
@@ -588,6 +589,10 @@ static int ks2_eth_probe(struct udevice *dev)
        if (priv->has_mdio) {
                priv->phydev = phy_connect(priv->mdio_bus, priv->phy_addr,
                                           dev, priv->phy_if);
+#ifdef CONFIG_DM_ETH
+       if (priv->phy_of_handle)
+               priv->phydev->node = offset_to_ofnode(priv->phy_of_handle);
+#endif
                phy_config(priv->phydev);
        }
 
@@ -679,6 +684,7 @@ static int ks2_eth_parse_slave_interface(int netcp, int slave,
        int phy;
        int dma_count;
        u32 dma_channel[8];
+       const char *phy_mode;
 
        priv->slave_port = fdtdec_get_int(fdt, slave, "slave-port", -1);
        priv->net_rx_buffs.rx_flow = priv->slave_port * 8;
@@ -700,7 +706,9 @@ static int ks2_eth_parse_slave_interface(int netcp, int slave,
        priv->link_type = fdtdec_get_int(fdt, slave, "link-interface", -1);
 
        phy = fdtdec_lookup_phandle(fdt, slave, "phy-handle");
+
        if (phy >= 0) {
+               priv->phy_of_handle = phy;
                priv->phy_addr = fdtdec_get_int(fdt, phy, "reg", -1);
 
                mdio = fdt_parent_offset(fdt, phy);
@@ -717,7 +725,19 @@ static int ks2_eth_parse_slave_interface(int netcp, int slave,
                priv->sgmii_link_type = SGMII_LINK_MAC_PHY;
                priv->has_mdio = true;
        } else if (priv->link_type == LINK_TYPE_RGMII_LINK_MAC_PHY) {
-               priv->phy_if = PHY_INTERFACE_MODE_RGMII;
+               phy_mode = fdt_getprop(fdt, slave, "phy-mode", NULL);
+               if (phy_mode) {
+                       priv->phy_if = phy_get_interface_by_name(phy_mode);
+                       if (priv->phy_if != PHY_INTERFACE_MODE_RGMII &&
+                           priv->phy_if != PHY_INTERFACE_MODE_RGMII_ID &&
+                           priv->phy_if != PHY_INTERFACE_MODE_RGMII_RXID &&
+                           priv->phy_if != PHY_INTERFACE_MODE_RGMII_TXID) {
+                               pr_err("invalid phy-mode\n");
+                               return -EINVAL;
+                       }
+               } else {
+                       priv->phy_if = PHY_INTERFACE_MODE_RGMII;
+               }
                pdata->phy_interface = priv->phy_if;
                priv->has_mdio = true;
        }
index 3bd0093b7ab1e001939136e140fcf52b0a37e53c..033efb819569d75bc728386b9f9892fc16f263ac 100644 (file)
@@ -261,45 +261,6 @@ static int phywrite(struct zynq_gem_priv *priv, u32 phy_addr,
                            ZYNQ_GEM_PHYMNTNC_OP_W_MASK, &data);
 }
 
-static int phy_detection(struct udevice *dev)
-{
-       int i;
-       u16 phyreg = 0;
-       struct zynq_gem_priv *priv = dev->priv;
-
-       if (priv->phyaddr != -1) {
-               phyread(priv, priv->phyaddr, PHY_DETECT_REG, &phyreg);
-               if ((phyreg != 0xFFFF) &&
-                   ((phyreg & PHY_DETECT_MASK) == PHY_DETECT_MASK)) {
-                       /* Found a valid PHY address */
-                       debug("Default phy address %d is valid\n",
-                             priv->phyaddr);
-                       return 0;
-               } else {
-                       debug("PHY address is not setup correctly %d\n",
-                             priv->phyaddr);
-                       priv->phyaddr = -1;
-               }
-       }
-
-       debug("detecting phy address\n");
-       if (priv->phyaddr == -1) {
-               /* detect the PHY address */
-               for (i = 31; i >= 0; i--) {
-                       phyread(priv, i, PHY_DETECT_REG, &phyreg);
-                       if ((phyreg != 0xFFFF) &&
-                           ((phyreg & PHY_DETECT_MASK) == PHY_DETECT_MASK)) {
-                               /* Found a valid PHY address */
-                               priv->phyaddr = i;
-                               debug("Found valid phy address, %d\n", i);
-                               return 0;
-                       }
-               }
-       }
-       printf("PHY is not detected\n");
-       return -1;
-}
-
 static int zynq_gem_setup_mac(struct udevice *dev)
 {
        u32 i, macaddrlow, macaddrhigh;
@@ -345,28 +306,20 @@ static int zynq_phy_init(struct udevice *dev)
        /* Enable only MDIO bus */
        writel(ZYNQ_GEM_NWCTRL_MDEN_MASK, &regs->nwctrl);
 
-       if ((priv->interface != PHY_INTERFACE_MODE_SGMII) &&
-           (priv->interface != PHY_INTERFACE_MODE_GMII)) {
-               ret = phy_detection(dev);
-               if (ret) {
-                       printf("GEM PHY init failed\n");
-                       return ret;
-               }
-       }
-
        priv->phydev = phy_connect(priv->bus, priv->phyaddr, dev,
                                   priv->interface);
        if (!priv->phydev)
                return -ENODEV;
 
-       priv->phydev->supported &= supported | ADVERTISED_Pause |
-                                 ADVERTISED_Asym_Pause;
        if (priv->max_speed) {
                ret = phy_set_supported(priv->phydev, priv->max_speed);
                if (ret)
                        return ret;
        }
 
+       priv->phydev->supported &= supported | ADVERTISED_Pause |
+                                 ADVERTISED_Asym_Pause;
+
        priv->phydev->advertising = priv->phydev->supported;
        priv->phydev->node = priv->phy_of_node;
 
index 824fa11907472c0bed5332c9614ae4eed7d7348e..cf1e7617ae3522599b1f0ca2b7ece743920af330 100644 (file)
@@ -918,6 +918,11 @@ static void decode_regions(struct pci_controller *hose, ofnode parent_node,
                return;
 
        for (i = 0; i < CONFIG_NR_DRAM_BANKS; ++i) {
+               if (hose->region_count == MAX_PCI_REGIONS) {
+                       pr_err("maximum number of regions parsed, aborting\n");
+                       break;
+               }
+
                if (bd->bi_dram[i].size) {
                        pci_set_region(hose->regions + hose->region_count++,
                                       bd->bi_dram[i].start,
index 32bbf41dd1f5972e6aaa8c25d36d151e14f92f3a..102fb91fffd07cc0f65a8aef150247dae6459a15 100644 (file)
@@ -174,4 +174,12 @@ config KEYSTONE_USB_PHY
 
          This PHY is found on some Keystone (K2) devices supporting USB.
 
+config MT76X8_USB_PHY
+       bool "MediaTek MT76x8 (7628/88) USB PHY support"
+       depends on PHY
+       help
+          Support the USB PHY in MT76x8 SoCs
+
+         This PHY is found on MT76x8 devices supporting USB.
+
 endmenu
index 099551d693082596878f52bbc592962e70429fb3..b55917bce1ae62353fb4ace629c74e790fedf808 100644 (file)
@@ -19,3 +19,4 @@ obj-$(CONFIG_MESON_GXL_USB_PHY) += meson-gxl-usb2.o meson-gxl-usb3.o
 obj-$(CONFIG_MSM8916_USB_PHY) += msm8916-usbh-phy.o
 obj-$(CONFIG_OMAP_USB2_PHY) += omap-usb2-phy.o
 obj-$(CONFIG_KEYSTONE_USB_PHY) += keystone-usb-phy.o
+obj-$(CONFIG_MT76X8_USB_PHY) += mt76x8-usb-phy.o
diff --git a/drivers/phy/mt76x8-usb-phy.c b/drivers/phy/mt76x8-usb-phy.c
new file mode 100644 (file)
index 0000000..268da8e
--- /dev/null
@@ -0,0 +1,161 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019 Stefan Roese <sr@denx.de>
+ *
+ * Derived from linux/drivers/phy/ralink/phy-ralink-usb.c
+ *     Copyright (C) 2017 John Crispin <john@phrozen.org>
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <generic-phy.h>
+#include <regmap.h>
+#include <reset-uclass.h>
+#include <syscon.h>
+#include <asm/io.h>
+
+#define RT_SYSC_REG_SYSCFG1            0x014
+#define RT_SYSC_REG_CLKCFG1            0x030
+#define RT_SYSC_REG_USB_PHY_CFG                0x05c
+
+#define OFS_U2_PHY_AC0                 0x800
+#define OFS_U2_PHY_AC1                 0x804
+#define OFS_U2_PHY_AC2                 0x808
+#define OFS_U2_PHY_ACR0                        0x810
+#define OFS_U2_PHY_ACR1                        0x814
+#define OFS_U2_PHY_ACR2                        0x818
+#define OFS_U2_PHY_ACR3                        0x81C
+#define OFS_U2_PHY_ACR4                        0x820
+#define OFS_U2_PHY_AMON0               0x824
+#define OFS_U2_PHY_DCR0                        0x860
+#define OFS_U2_PHY_DCR1                        0x864
+#define OFS_U2_PHY_DTM0                        0x868
+#define OFS_U2_PHY_DTM1                        0x86C
+
+#define RT_RSTCTRL_UDEV                        BIT(25)
+#define RT_RSTCTRL_UHST                        BIT(22)
+#define RT_SYSCFG1_USB0_HOST_MODE      BIT(10)
+
+#define MT7620_CLKCFG1_UPHY0_CLK_EN    BIT(25)
+#define MT7620_CLKCFG1_UPHY1_CLK_EN    BIT(22)
+#define RT_CLKCFG1_UPHY1_CLK_EN                BIT(20)
+#define RT_CLKCFG1_UPHY0_CLK_EN                BIT(18)
+
+#define USB_PHY_UTMI_8B60M             BIT(1)
+#define UDEV_WAKEUP                    BIT(0)
+
+struct mt76x8_usb_phy {
+       u32                     clk;
+       void __iomem            *base;
+       struct regmap           *sysctl;
+};
+
+static void u2_phy_w32(struct mt76x8_usb_phy *phy, u32 val, u32 reg)
+{
+       writel(val, phy->base + reg);
+}
+
+static u32 u2_phy_r32(struct mt76x8_usb_phy *phy, u32 reg)
+{
+       return readl(phy->base + reg);
+}
+
+static void mt76x8_usb_phy_init(struct mt76x8_usb_phy *phy)
+{
+       u2_phy_r32(phy, OFS_U2_PHY_AC2);
+       u2_phy_r32(phy, OFS_U2_PHY_ACR0);
+       u2_phy_r32(phy, OFS_U2_PHY_DCR0);
+
+       u2_phy_w32(phy, 0x00ffff02, OFS_U2_PHY_DCR0);
+       u2_phy_r32(phy, OFS_U2_PHY_DCR0);
+       u2_phy_w32(phy, 0x00555502, OFS_U2_PHY_DCR0);
+       u2_phy_r32(phy, OFS_U2_PHY_DCR0);
+       u2_phy_w32(phy, 0x00aaaa02, OFS_U2_PHY_DCR0);
+       u2_phy_r32(phy, OFS_U2_PHY_DCR0);
+       u2_phy_w32(phy, 0x00000402, OFS_U2_PHY_DCR0);
+       u2_phy_r32(phy, OFS_U2_PHY_DCR0);
+       u2_phy_w32(phy, 0x0048086a, OFS_U2_PHY_AC0);
+       u2_phy_w32(phy, 0x4400001c, OFS_U2_PHY_AC1);
+       u2_phy_w32(phy, 0xc0200000, OFS_U2_PHY_ACR3);
+       u2_phy_w32(phy, 0x02000000, OFS_U2_PHY_DTM0);
+}
+
+static int mt76x8_usb_phy_power_on(struct phy *_phy)
+{
+       struct mt76x8_usb_phy *phy = dev_get_priv(_phy->dev);
+       u32 t;
+
+       /* enable the phy */
+       regmap_update_bits(phy->sysctl, RT_SYSC_REG_CLKCFG1,
+                          phy->clk, phy->clk);
+
+       /* setup host mode */
+       regmap_update_bits(phy->sysctl, RT_SYSC_REG_SYSCFG1,
+                          RT_SYSCFG1_USB0_HOST_MODE,
+                          RT_SYSCFG1_USB0_HOST_MODE);
+
+       /*
+        * The SDK kernel had a delay of 100ms. however on device
+        * testing showed that 10ms is enough
+        */
+       mdelay(10);
+
+       if (phy->base)
+               mt76x8_usb_phy_init(phy);
+
+       /* print some status info */
+       regmap_read(phy->sysctl, RT_SYSC_REG_USB_PHY_CFG, &t);
+       printf("remote usb device wakeup %s\n",
+              (t & UDEV_WAKEUP) ? "enabled" : "disabled");
+       if (t & USB_PHY_UTMI_8B60M)
+               printf("UTMI 8bit 60MHz\n");
+       else
+               printf("UTMI 16bit 30MHz\n");
+
+       return 0;
+}
+
+static int mt76x8_usb_phy_power_off(struct phy *_phy)
+{
+       struct mt76x8_usb_phy *phy = dev_get_priv(_phy->dev);
+
+       /* disable the phy */
+       regmap_update_bits(phy->sysctl, RT_SYSC_REG_CLKCFG1,
+                          phy->clk, 0);
+
+       return 0;
+}
+
+static int mt76x8_usb_phy_probe(struct udevice *dev)
+{
+       struct mt76x8_usb_phy *phy = dev_get_priv(dev);
+
+       phy->sysctl = syscon_regmap_lookup_by_phandle(dev, "ralink,sysctl");
+       if (IS_ERR(phy->sysctl))
+               return PTR_ERR(phy->sysctl);
+
+       phy->base = dev_read_addr_ptr(dev);
+       if (!phy->base)
+               return -EINVAL;
+
+       return 0;
+}
+
+static struct phy_ops mt76x8_usb_phy_ops = {
+       .power_on = mt76x8_usb_phy_power_on,
+       .power_off = mt76x8_usb_phy_power_off,
+};
+
+static const struct udevice_id mt76x8_usb_phy_ids[] = {
+       { .compatible = "mediatek,mt7628-usbphy" },
+       { }
+};
+
+U_BOOT_DRIVER(mt76x8_usb_phy) = {
+       .name           = "mt76x8_usb_phy",
+       .id             = UCLASS_PHY,
+       .of_match       = mt76x8_usb_phy_ids,
+       .ops            = &mt76x8_usb_phy_ops,
+       .probe          = mt76x8_usb_phy_probe,
+       .priv_auto_alloc_size = sizeof(struct mt76x8_usb_phy),
+};
index 8e98b4b627bf6cef5046484a21c9b7d169911297..6f1119036d787573bfab94ab803587087c238616 100644 (file)
@@ -37,7 +37,8 @@
 
 #define MAX_PHYS               2
 
-#define PLL_LOCK_TIME_US       100
+/* max 100 us for PLL lock and 100 us for PHY init */
+#define PLL_INIT_TIME_US       200
 #define PLL_PWR_DOWN_TIME_US   5
 #define PLL_FVCO               2880     /* in MHz */
 #define PLL_INFF_MIN_RATE      19200000 /* in Hz */
@@ -51,17 +52,17 @@ struct pll_params {
 struct stm32_usbphyc {
        fdt_addr_t base;
        struct clk clk;
+       struct udevice *vdda1v1;
+       struct udevice *vdda1v8;
        struct stm32_usbphyc_phy {
                struct udevice *vdd;
-               struct udevice *vdda1v1;
-               struct udevice *vdda1v8;
-               int index;
                bool init;
                bool powered;
        } phys[MAX_PHYS];
 };
 
-void stm32_usbphyc_get_pll_params(u32 clk_rate, struct pll_params *pll_params)
+static void stm32_usbphyc_get_pll_params(u32 clk_rate,
+                                        struct pll_params *pll_params)
 {
        unsigned long long fvco, ndiv, frac;
 
@@ -154,6 +155,18 @@ static int stm32_usbphyc_phy_init(struct phy *phy)
        if (pllen && stm32_usbphyc_is_init(usbphyc))
                goto initialized;
 
+       if (usbphyc->vdda1v1) {
+               ret = regulator_set_enable(usbphyc->vdda1v1, true);
+               if (ret)
+                       return ret;
+       }
+
+       if (usbphyc->vdda1v8) {
+               ret = regulator_set_enable(usbphyc->vdda1v8, true);
+               if (ret)
+                       return ret;
+       }
+
        if (pllen) {
                clrbits_le32(usbphyc->base + STM32_USBPHYC_PLL, PLLEN);
                udelay(PLL_PWR_DOWN_TIME_US);
@@ -165,11 +178,8 @@ static int stm32_usbphyc_phy_init(struct phy *phy)
 
        setbits_le32(usbphyc->base + STM32_USBPHYC_PLL, PLLEN);
 
-       /*
-        * We must wait PLL_LOCK_TIME_US before checking that PLLEN
-        * bit is still set
-        */
-       udelay(PLL_LOCK_TIME_US);
+       /* We must wait PLL_INIT_TIME_US before using PHY */
+       udelay(PLL_INIT_TIME_US);
 
        if (!(readl(usbphyc->base + STM32_USBPHYC_PLL) & PLLEN))
                return -EIO;
@@ -184,6 +194,7 @@ static int stm32_usbphyc_phy_exit(struct phy *phy)
 {
        struct stm32_usbphyc *usbphyc = dev_get_priv(phy->dev);
        struct stm32_usbphyc_phy *usbphyc_phy = usbphyc->phys + phy->id;
+       int ret;
 
        pr_debug("%s phy ID = %lu\n", __func__, phy->id);
        usbphyc_phy->init = false;
@@ -203,6 +214,18 @@ static int stm32_usbphyc_phy_exit(struct phy *phy)
        if (readl(usbphyc->base + STM32_USBPHYC_PLL) & PLLEN)
                return -EIO;
 
+       if (usbphyc->vdda1v1) {
+               ret = regulator_set_enable(usbphyc->vdda1v1, false);
+               if (ret)
+                       return ret;
+       }
+
+       if (usbphyc->vdda1v8) {
+               ret = regulator_set_enable(usbphyc->vdda1v8, false);
+               if (ret)
+                       return ret;
+       }
+
        return 0;
 }
 
@@ -213,17 +236,6 @@ static int stm32_usbphyc_phy_power_on(struct phy *phy)
        int ret;
 
        pr_debug("%s phy ID = %lu\n", __func__, phy->id);
-       if (usbphyc_phy->vdda1v1) {
-               ret = regulator_set_enable(usbphyc_phy->vdda1v1, true);
-               if (ret)
-                       return ret;
-       }
-
-       if (usbphyc_phy->vdda1v8) {
-               ret = regulator_set_enable(usbphyc_phy->vdda1v8, true);
-               if (ret)
-                       return ret;
-       }
        if (usbphyc_phy->vdd) {
                ret = regulator_set_enable(usbphyc_phy->vdd, true);
                if (ret)
@@ -247,18 +259,6 @@ static int stm32_usbphyc_phy_power_off(struct phy *phy)
        if (stm32_usbphyc_is_powered(usbphyc))
                return 0;
 
-       if (usbphyc_phy->vdda1v1) {
-               ret = regulator_set_enable(usbphyc_phy->vdda1v1, false);
-               if (ret)
-                       return ret;
-       }
-
-       if (usbphyc_phy->vdda1v8) {
-               ret = regulator_set_enable(usbphyc_phy->vdda1v8, false);
-               if (ret)
-                       return ret;
-       }
-
        if (usbphyc_phy->vdd) {
                ret = regulator_set_enable(usbphyc_phy->vdd, false);
                if (ret)
@@ -298,19 +298,20 @@ static int stm32_usbphyc_get_regulator(struct udevice *dev, ofnode node,
 static int stm32_usbphyc_of_xlate(struct phy *phy,
                                  struct ofnode_phandle_args *args)
 {
-       if (args->args_count > 1) {
-               pr_debug("%s: invalid args_count: %d\n", __func__,
-                        args->args_count);
-               return -EINVAL;
-       }
+       if (args->args_count < 1)
+               return -ENODEV;
 
        if (args->args[0] >= MAX_PHYS)
                return -ENODEV;
 
-       if (args->args_count)
-               phy->id = args->args[0];
-       else
-               phy->id = 0;
+       phy->id = args->args[0];
+
+       if ((phy->id == 0 && args->args_count != 1) ||
+           (phy->id == 1 && args->args_count != 2)) {
+               dev_err(dev, "invalid number of cells for phy port%ld\n",
+                       phy->id);
+               return -EINVAL;
+       }
 
        return 0;
 }
@@ -351,6 +352,21 @@ static int stm32_usbphyc_probe(struct udevice *dev)
                reset_deassert(&reset);
        }
 
+       /* get usbphyc regulator */
+       ret = device_get_supply_regulator(dev, "vdda1v1-supply",
+                                         &usbphyc->vdda1v1);
+       if (ret) {
+               dev_err(dev, "Can't get vdda1v1-supply regulator\n");
+               return ret;
+       }
+
+       ret = device_get_supply_regulator(dev, "vdda1v8-supply",
+                                         &usbphyc->vdda1v8);
+       if (ret) {
+               dev_err(dev, "Can't get vdda1v8-supply regulator\n");
+               return ret;
+       }
+
        /*
         * parse all PHY subnodes in order to populate regulator associated
         * to each PHY port
@@ -359,7 +375,6 @@ static int stm32_usbphyc_probe(struct udevice *dev)
        for (i = 0; i < MAX_PHYS; i++) {
                struct stm32_usbphyc_phy *usbphyc_phy = usbphyc->phys + i;
 
-               usbphyc_phy->index = i;
                usbphyc_phy->init = false;
                usbphyc_phy->powered = false;
                ret = stm32_usbphyc_get_regulator(dev, node, "phy-supply",
@@ -367,16 +382,6 @@ static int stm32_usbphyc_probe(struct udevice *dev)
                if (ret)
                        return ret;
 
-               ret = stm32_usbphyc_get_regulator(dev, node, "vdda1v1-supply",
-                                                 &usbphyc_phy->vdda1v1);
-               if (ret)
-                       return ret;
-
-               ret = stm32_usbphyc_get_regulator(dev, node, "vdda1v8-supply",
-                                                 &usbphyc_phy->vdda1v8);
-               if (ret)
-                       return ret;
-
                node = dev_read_next_subnode(node);
        }
 
index be709f73d7dfe55d5f1d4e09e3a898fce16ca2e5..a0ac167d145a548bd738d2440e215889a3955bc5 100644 (file)
@@ -209,6 +209,25 @@ config PINCTRL_STM32
          the GPIO definitions and pin control functions for each available
          multiplex function.
 
+config PINCTRL_STMFX
+       bool "STMicroelectronics STMFX I2C GPIO expander pinctrl driver"
+       depends on DM && PINCTRL_FULL
+       help
+         I2C driver for STMicroelectronics Multi-Function eXpander (STMFX)
+         GPIO expander.
+         Supports pin multiplexing control on stm32 SoCs.
+
+         The driver is controlled by a device tree node which contains both
+         the GPIO definitions and pin control functions for each available
+         multiplex function.
+
+config SPL_PINCTRL_STMFX
+       bool "STMicroelectronics STMFX I2C GPIO expander pinctrl driver in SPL"
+       depends on SPL_PINCTRL_FULL
+       help
+         This option is an SPL-variant of the SPL_PINCTRL_STMFX option.
+         See the help of PINCTRL_STMFX for details.
+
 config ASPEED_AST2500_PINCTRL
   bool "Aspeed AST2500 pin control driver"
   depends on DM && PINCTRL_GENERIC && ASPEED_AST2500
index e2c2b159d8c8894384d870a3c5f9ea6cc5b5a911..4b080b74dcd19f9689d1eeb3515214871f06541e 100644 (file)
@@ -22,4 +22,5 @@ obj-$(CONFIG_ARCH_MVEBU)      += mvebu/
 obj-$(CONFIG_PINCTRL_SINGLE)   += pinctrl-single.o
 obj-$(CONFIG_PINCTRL_STI)      += pinctrl-sti.o
 obj-$(CONFIG_PINCTRL_STM32)    += pinctrl_stm32.o
+obj-$(CONFIG_$(SPL_)PINCTRL_STMFX)     += pinctrl-stmfx.o
 obj-y                          += broadcom/
index 1daa2123a149e65084827ad41e7b6b243e889c8e..c7d1e44882e8438c6373c5a45ce61c43e3dc0bda 100644 (file)
@@ -1,4 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0+
 
 obj-$(CONFIG_PINCTRL_AR933X) += pinctrl_ar933x.o
-obj-$(CONFIG_PINCTRL_QCA953x) += pinctrl_qca953x.o
+obj-$(CONFIG_PINCTRL_QCA953X) += pinctrl_qca953x.o
index 1bd9a925a5896b308e19ffefbd2acfaaae0260b8..9930ca1faf477242a575fd3f0e293f96e603ceeb 100644 (file)
@@ -12,4 +12,8 @@ config PINCTRL_MT7629
        bool "MT7629 SoC pinctrl driver"
        select PINCTRL_MTK
 
+config PINCTRL_MT8516
+       bool "MT8516 SoC pinctrl driver"
+       select PINCTRL_MTK
+
 endif
index f6ef3627e8069727ae825ba6d8d6e4480c2ab01b..c4f29088d21f84caad1f43f149fd17940088b2dd 100644 (file)
@@ -5,3 +5,4 @@ obj-$(CONFIG_PINCTRL_MTK) += pinctrl-mtk-common.o
 # SoC Drivers
 obj-$(CONFIG_PINCTRL_MT7623) += pinctrl-mt7623.o
 obj-$(CONFIG_PINCTRL_MT7629) += pinctrl-mt7629.o
+obj-$(CONFIG_PINCTRL_MT8516) += pinctrl-mt8516.o
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt8516.c b/drivers/pinctrl/mediatek/pinctrl-mt8516.c
new file mode 100644 (file)
index 0000000..829b30e
--- /dev/null
@@ -0,0 +1,391 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 BayLibre, SAS
+ * Author: Fabien Parent <fparent@baylibre.com>
+ */
+
+#include <dm.h>
+
+#include "pinctrl-mtk-common.h"
+
+#define PIN_FIELD(_s_pin, _e_pin, _s_addr, _x_addrs, _s_bit, _x_bits)  \
+       PIN_FIELD_CALC(_s_pin, _e_pin, _s_addr, _x_addrs, _s_bit,       \
+                      _x_bits, 16, false)
+
+static const struct mtk_pin_field_calc mt8516_pin_mode_range[] = {
+       PIN_FIELD_CALC(0, 124, 0x300, 0x10, 0, 3, 15, false),
+};
+
+static const struct mtk_pin_field_calc mt8516_pin_dir_range[] = {
+       PIN_FIELD(0, 124, 0x0, 0x10, 0, 1),
+};
+
+static const struct mtk_pin_field_calc mt8516_pin_di_range[] = {
+       PIN_FIELD(0, 124, 0x200, 0x10, 0, 1),
+};
+
+static const struct mtk_pin_field_calc mt8516_pin_do_range[] = {
+       PIN_FIELD(0, 124, 0x100, 0x10, 0, 1),
+};
+
+static const struct mtk_pin_field_calc mt8516_pin_ies_range[] = {
+       PIN_FIELD(0, 6, 0x900, 0x10, 2, 1),
+       PIN_FIELD(7, 10, 0x900, 0x10, 3, 1),
+       PIN_FIELD(11, 13, 0x900, 0x10, 12, 1),
+       PIN_FIELD(14, 17, 0x900, 0x10, 13, 1),
+       PIN_FIELD(18, 20, 0x910, 0x10, 10, 1),
+       PIN_FIELD(21, 23, 0x900, 0x10, 13, 1),
+       PIN_FIELD(24, 25, 0x900, 0x10, 12, 1),
+       PIN_FIELD(26, 30, 0x900, 0x10, 0, 1),
+       PIN_FIELD(31, 33, 0x900, 0x10, 1, 1),
+       PIN_FIELD(34, 39, 0x900, 0x10, 2, 1),
+       PIN_FIELD(40, 40, 0x910, 0x10, 11, 1),
+       PIN_FIELD(41, 43, 0x900, 0x10, 10, 1),
+       PIN_FIELD(44, 47, 0x900, 0x10, 11, 1),
+       PIN_FIELD(48, 51, 0x900, 0x10, 14, 1),
+       PIN_FIELD(52, 53, 0x910, 0x10, 0, 1),
+       PIN_FIELD(54, 54, 0x910, 0x10, 2, 1),
+       PIN_FIELD(55, 57, 0x910, 0x10, 4, 1),
+       PIN_FIELD(58, 59, 0x900, 0x10, 15, 1),
+       PIN_FIELD(60, 61, 0x910, 0x10, 1, 1),
+       PIN_FIELD(62, 65, 0x910, 0x10, 5, 1),
+       PIN_FIELD(66, 67, 0x910, 0x10, 6, 1),
+       PIN_FIELD(68, 68, 0x930, 0x10, 2, 1),
+       PIN_FIELD(69, 69, 0x930, 0x10, 1, 1),
+       PIN_FIELD(70, 70, 0x930, 0x10, 6, 1),
+       PIN_FIELD(71, 71, 0x930, 0x10, 5, 1),
+       PIN_FIELD(72, 72, 0x930, 0x10, 4, 1),
+       PIN_FIELD(73, 73, 0x930, 0x10, 3, 1),
+
+       PIN_FIELD(100, 103, 0x910, 0x10, 7, 1),
+       PIN_FIELD(104, 104, 0x920, 0x10, 12, 1),
+       PIN_FIELD(105, 105, 0x920, 0x10, 11, 1),
+       PIN_FIELD(106, 106, 0x930, 0x10, 0, 1),
+       PIN_FIELD(107, 107, 0x920, 0x10, 15, 1),
+       PIN_FIELD(108, 108, 0x920, 0x10, 14, 1),
+       PIN_FIELD(109, 109, 0x920, 0x10, 13, 1),
+       PIN_FIELD(110, 110, 0x920, 0x10, 9, 1),
+       PIN_FIELD(111, 111, 0x920, 0x10, 8, 1),
+       PIN_FIELD(112, 112, 0x920, 0x10, 7, 1),
+       PIN_FIELD(113, 113, 0x920, 0x10, 6, 1),
+       PIN_FIELD(114, 114, 0x920, 0x10, 10, 1),
+       PIN_FIELD(115, 115, 0x920, 0x10, 1, 1),
+       PIN_FIELD(116, 116, 0x920, 0x10, 0, 1),
+       PIN_FIELD(117, 117, 0x920, 0x10, 5, 1),
+       PIN_FIELD(118, 118, 0x920, 0x10, 4, 1),
+       PIN_FIELD(119, 119, 0x920, 0x10, 3, 1),
+       PIN_FIELD(120, 120, 0x920, 0x10, 2, 1),
+       PIN_FIELD(121, 124, 0x910, 0x10, 9, 1),
+};
+
+static const struct mtk_pin_field_calc mt8516_pin_smt_range[] = {
+       PIN_FIELD(0, 6, 0xA00, 0x10, 2, 1),
+       PIN_FIELD(7, 10, 0xA00, 0x10, 3, 1),
+       PIN_FIELD(11, 13, 0xA00, 0x10, 12, 1),
+       PIN_FIELD(14, 17, 0xA00, 0x10, 13, 1),
+       PIN_FIELD(18, 20, 0xA10, 0x10, 10, 1),
+       PIN_FIELD(21, 23, 0xA00, 0x10, 13, 1),
+       PIN_FIELD(24, 25, 0xA00, 0x10, 12, 1),
+       PIN_FIELD(26, 30, 0xA00, 0x10, 0, 1),
+       PIN_FIELD(31, 33, 0xA00, 0x10, 1, 1),
+       PIN_FIELD(40, 40, 0xA10, 0x10, 11, 1),
+       PIN_FIELD(41, 43, 0xA00, 0x10, 10, 1),
+       PIN_FIELD(44, 47, 0xA00, 0x10, 11, 1),
+       PIN_FIELD(48, 51, 0xA00, 0x10, 14, 1),
+       PIN_FIELD(52, 53, 0xA10, 0x10, 0, 1),
+       PIN_FIELD(54, 54, 0xA10, 0x10, 2, 1),
+       PIN_FIELD(55, 57, 0xA10, 0x10, 4, 1),
+       PIN_FIELD(58, 59, 0xA00, 0x10, 15, 1),
+       PIN_FIELD(60, 61, 0xA10, 0x10, 1, 1),
+       PIN_FIELD(62, 65, 0xA10, 0x10, 5, 1),
+       PIN_FIELD(66, 67, 0xA10, 0x10, 6, 1),
+       PIN_FIELD(68, 68, 0xA30, 0x10, 2, 1),
+       PIN_FIELD(69, 69, 0xA30, 0x10, 1, 1),
+       PIN_FIELD(70, 70, 0xA30, 0x10, 3, 1),
+       PIN_FIELD(71, 71, 0xA30, 0x10, 4, 1),
+       PIN_FIELD(72, 72, 0xA30, 0x10, 5, 1),
+       PIN_FIELD(73, 73, 0xA30, 0x10, 6, 1),
+
+       PIN_FIELD(100, 103, 0xA10, 0x10, 7, 1),
+       PIN_FIELD(104, 104, 0xA20, 0x10, 12, 1),
+       PIN_FIELD(105, 105, 0xA20, 0x10, 11, 1),
+       PIN_FIELD(106, 106, 0xA30, 0x10, 13, 1),
+       PIN_FIELD(107, 107, 0xA20, 0x10, 14, 1),
+       PIN_FIELD(108, 108, 0xA20, 0x10, 15, 1),
+       PIN_FIELD(109, 109, 0xA30, 0x10, 0, 1),
+       PIN_FIELD(110, 110, 0xA20, 0x10, 9, 1),
+       PIN_FIELD(111, 111, 0xA20, 0x10, 8, 1),
+       PIN_FIELD(112, 112, 0xA20, 0x10, 7, 1),
+       PIN_FIELD(113, 113, 0xA20, 0x10, 6, 1),
+       PIN_FIELD(114, 114, 0xA20, 0x10, 10, 1),
+       PIN_FIELD(115, 115, 0xA20, 0x10, 1, 1),
+       PIN_FIELD(116, 116, 0xA20, 0x10, 0, 1),
+       PIN_FIELD(117, 117, 0xA20, 0x10, 5, 1),
+       PIN_FIELD(118, 118, 0xA20, 0x10, 4, 1),
+       PIN_FIELD(119, 119, 0xA20, 0x10, 3, 1),
+       PIN_FIELD(120, 120, 0xA20, 0x10, 2, 1),
+       PIN_FIELD(121, 124, 0xA10, 0x10, 9, 1),
+};
+
+static const struct mtk_pin_field_calc mt8516_pin_pullen_range[] = {
+       PIN_FIELD(0, 13, 0x500, 0x10, 0, 1),
+       PIN_FIELD(18, 20, 0x510, 0x10, 2, 1),
+       PIN_FIELD(24, 31, 0x510, 0x10, 8, 1),
+       PIN_FIELD(32, 39, 0x520, 0x10, 0, 1),
+       PIN_FIELD(44, 47, 0x520, 0x10, 12, 1),
+       PIN_FIELD(48, 63, 0x530, 0x10, 0, 1),
+       PIN_FIELD(64, 67, 0x540, 0x10, 0, 1),
+       PIN_FIELD(100, 103, 0x560, 0x10, 4, 1),
+       PIN_FIELD(121, 124, 0x570, 0x10, 9, 1),
+};
+
+static const struct mtk_pin_field_calc mt8516_pin_pullsel_range[] = {
+       PIN_FIELD(0, 13, 0x600, 0x10, 0, 1),
+       PIN_FIELD(18, 20, 0x610, 0x10, 2, 1),
+       PIN_FIELD(24, 31, 0x610, 0x10, 8, 1),
+       PIN_FIELD(32, 39, 0x620, 0x10, 0, 1),
+       PIN_FIELD(44, 47, 0x620, 0x10, 12, 1),
+       PIN_FIELD(48, 63, 0x630, 0x10, 0, 1),
+       PIN_FIELD(64, 67, 0x640, 0x10, 0, 1),
+       PIN_FIELD(100, 103, 0x660, 0x10, 4, 1),
+       PIN_FIELD(121, 124, 0x670, 0x10, 9, 1),
+};
+
+static const struct mtk_pin_field_calc mt8516_pin_drv_range[] = {
+       PIN_FIELD(0, 4, 0xd00, 0x10, 0, 4),
+       PIN_FIELD(5, 10, 0xd00, 0x10, 4, 4),
+       PIN_FIELD(11, 13, 0xd00, 0x10, 8, 4),
+       PIN_FIELD(14, 17, 0xd00, 0x10, 12, 4),
+       PIN_FIELD(18, 20, 0xd10, 0x10, 0, 4),
+       PIN_FIELD(21, 23, 0xd00, 0x10, 12, 4),
+       PIN_FIELD(24, 25, 0xd00, 0x10, 8, 4),
+       PIN_FIELD(26, 30, 0xd10, 0x10, 4, 4),
+       PIN_FIELD(31, 33, 0xd10, 0x10, 8, 4),
+       PIN_FIELD(34, 35, 0xd10, 0x10, 12, 4),
+       PIN_FIELD(36, 39, 0xd20, 0x10, 0, 4),
+       PIN_FIELD(40, 40, 0xd20, 0x10, 4, 4),
+       PIN_FIELD(41, 43, 0xd20, 0x10, 8, 4),
+       PIN_FIELD(44, 47, 0xd20, 0x10, 12, 4),
+       PIN_FIELD(48, 51, 0xd30, 0x10, 0, 4),
+       PIN_FIELD(54, 54, 0xd30, 0x10, 8, 4),
+       PIN_FIELD(55, 57, 0xd30, 0x10, 12, 4),
+       PIN_FIELD(62, 67, 0xd40, 0x10, 8, 4),
+       PIN_FIELD(68, 68, 0xd40, 0x10, 12, 4),
+       PIN_FIELD(69, 69, 0xd50, 0x10, 0, 4),
+       PIN_FIELD(70, 73, 0xd50, 0x10, 4, 4),
+       PIN_FIELD(100, 103, 0xd50, 0x10, 8, 4),
+       PIN_FIELD(104, 104, 0xd50, 0x10, 12, 4),
+       PIN_FIELD(105, 105, 0xd60, 0x10, 0, 4),
+       PIN_FIELD(106, 109, 0xd60, 0x10, 4, 4),
+       PIN_FIELD(110, 113, 0xd70, 0x10, 0, 4),
+       PIN_FIELD(114, 114, 0xd70, 0x10, 4, 4),
+       PIN_FIELD(115, 115, 0xd60, 0x10, 12, 4),
+       PIN_FIELD(116, 116, 0xd60, 0x10, 8, 4),
+       PIN_FIELD(117, 120, 0xd70, 0x10, 0, 4),
+};
+
+static const struct mtk_pin_reg_calc mt8516_reg_cals[] = {
+       [PINCTRL_PIN_REG_MODE] = MTK_RANGE(mt8516_pin_mode_range),
+       [PINCTRL_PIN_REG_DIR] = MTK_RANGE(mt8516_pin_dir_range),
+       [PINCTRL_PIN_REG_DI] = MTK_RANGE(mt8516_pin_di_range),
+       [PINCTRL_PIN_REG_DO] = MTK_RANGE(mt8516_pin_do_range),
+       [PINCTRL_PIN_REG_IES] = MTK_RANGE(mt8516_pin_ies_range),
+       [PINCTRL_PIN_REG_SMT] = MTK_RANGE(mt8516_pin_smt_range),
+       [PINCTRL_PIN_REG_PULLSEL] = MTK_RANGE(mt8516_pin_pullsel_range),
+       [PINCTRL_PIN_REG_PULLEN] = MTK_RANGE(mt8516_pin_pullen_range),
+       [PINCTRL_PIN_REG_DRV] = MTK_RANGE(mt8516_pin_drv_range),
+};
+
+static const struct mtk_pin_desc mt8516_pins[] = {
+       MTK_PIN(0, "EINT0", DRV_GRP0),
+       MTK_PIN(1, "EINT1", DRV_GRP0),
+       MTK_PIN(2, "EINT2", DRV_GRP0),
+       MTK_PIN(3, "EINT3", DRV_GRP0),
+       MTK_PIN(4, "EINT4", DRV_GRP0),
+       MTK_PIN(5, "EINT5", DRV_GRP0),
+       MTK_PIN(6, "EINT6", DRV_GRP0),
+       MTK_PIN(7, "EINT7", DRV_GRP0),
+       MTK_PIN(8, "EINT8", DRV_GRP0),
+       MTK_PIN(9, "EINT9", DRV_GRP0),
+       MTK_PIN(10, "EINT10", DRV_GRP0),
+       MTK_PIN(11, "EINT11", DRV_GRP0),
+       MTK_PIN(12, "EINT12", DRV_GRP0),
+       MTK_PIN(13, "EINT13", DRV_GRP0),
+       MTK_PIN(14, "EINT14", DRV_GRP2),
+       MTK_PIN(15, "EINT15", DRV_GRP2),
+       MTK_PIN(16, "EINT16", DRV_GRP2),
+       MTK_PIN(17, "EINT17", DRV_GRP2),
+       MTK_PIN(18, "EINT18", DRV_GRP0),
+       MTK_PIN(19, "EINT19", DRV_GRP0),
+       MTK_PIN(20, "EINT20", DRV_GRP0),
+       MTK_PIN(21, "EINT21", DRV_GRP2),
+       MTK_PIN(22, "EINT22", DRV_GRP2),
+       MTK_PIN(23, "EINT23", DRV_GRP2),
+       MTK_PIN(24, "EINT24", DRV_GRP0),
+       MTK_PIN(25, "EINT25", DRV_GRP0),
+       MTK_PIN(26, "PWRAP_SPI0_MI", DRV_GRP4),
+       MTK_PIN(27, "PWRAP_SPI0_MO", DRV_GRP4),
+       MTK_PIN(28, "PWRAP_INT", DRV_GRP4),
+       MTK_PIN(29, "PWRAP_SPIO0_CK", DRV_GRP4),
+       MTK_PIN(30, "PWARP_SPI0_CSN", DRV_GRP4),
+       MTK_PIN(31, "RTC32K_CK", DRV_GRP4),
+       MTK_PIN(32, "WATCHDOG", DRV_GRP4),
+       MTK_PIN(33, "SRCLKENA0", DRV_GRP4),
+       MTK_PIN(34, "URXD2", DRV_GRP0),
+       MTK_PIN(35, "UTXD2", DRV_GRP0),
+       MTK_PIN(36, "MRG_CLK", DRV_GRP0),
+       MTK_PIN(37, "MRG_SYNC", DRV_GRP0),
+       MTK_PIN(38, "MRG_DI", DRV_GRP0),
+       MTK_PIN(39, "MRG_DO", DRV_GRP0),
+       MTK_PIN(40, "KPROW0", DRV_GRP2),
+       MTK_PIN(41, "KPROW1", DRV_GRP2),
+       MTK_PIN(42, "KPCOL0", DRV_GRP2),
+       MTK_PIN(43, "KPCOL1", DRV_GRP2),
+       MTK_PIN(44, "JMTS", DRV_GRP2),
+       MTK_PIN(45, "JTCK", DRV_GRP2),
+       MTK_PIN(46, "JTDI", DRV_GRP2),
+       MTK_PIN(47, "JTDO", DRV_GRP2),
+       MTK_PIN(48, "SPI_CS", DRV_GRP2),
+       MTK_PIN(49, "SPI_CK", DRV_GRP2),
+       MTK_PIN(50, "SPI_MI", DRV_GRP2),
+       MTK_PIN(51, "SPI_MO", DRV_GRP2),
+       MTK_PIN(52, "SDA1", DRV_GRP2),
+       MTK_PIN(53, "SCL1", DRV_GRP2),
+       MTK_PIN(54, "DISP_PWM", DRV_GRP2),
+       MTK_PIN(55, "I2S_DATA_IN", DRV_GRP2),
+       MTK_PIN(56, "I2S_LRCK", DRV_GRP2),
+       MTK_PIN(57, "I2S_BCK", DRV_GRP2),
+       MTK_PIN(58, "SDA0", DRV_GRP2),
+       MTK_PIN(59, "SCL0", DRV_GRP2),
+       MTK_PIN(60, "SDA2", DRV_GRP2),
+       MTK_PIN(61, "SCL2", DRV_GRP2),
+       MTK_PIN(62, "URXD0", DRV_GRP2),
+       MTK_PIN(63, "UTXD0", DRV_GRP2),
+       MTK_PIN(64, "URXD1", DRV_GRP2),
+       MTK_PIN(65, "UTXD1", DRV_GRP2),
+       MTK_PIN(66, "LCM_RST", DRV_GRP2),
+       MTK_PIN(67, "DSI_TE", DRV_GRP2),
+       MTK_PIN(68, "MSDC2_CMD", DRV_GRP4),
+       MTK_PIN(69, "MSDC2_CLK", DRV_GRP4),
+       MTK_PIN(70, "MSDC2_DAT0", DRV_GRP4),
+       MTK_PIN(71, "MSDC2_DAT1", DRV_GRP4),
+       MTK_PIN(72, "MSDC2_DAT2", DRV_GRP4),
+       MTK_PIN(73, "MSDC2_DAT3", DRV_GRP4),
+       MTK_PIN(74, "TDN3", DRV_GRP0),
+       MTK_PIN(75, "TDP3", DRV_GRP0),
+       MTK_PIN(76, "TDN2", DRV_GRP0),
+       MTK_PIN(77, "TDP2", DRV_GRP0),
+       MTK_PIN(78, "TCN", DRV_GRP0),
+       MTK_PIN(79, "TCP", DRV_GRP0),
+       MTK_PIN(80, "TDN1", DRV_GRP0),
+       MTK_PIN(81, "TDP1", DRV_GRP0),
+       MTK_PIN(82, "TDN0", DRV_GRP0),
+       MTK_PIN(83, "TDP0", DRV_GRP0),
+       MTK_PIN(84, "RDN0", DRV_GRP0),
+       MTK_PIN(85, "RDP0", DRV_GRP0),
+       MTK_PIN(86, "RDN1", DRV_GRP0),
+       MTK_PIN(87, "RDP1", DRV_GRP0),
+       MTK_PIN(88, "RCN", DRV_GRP0),
+       MTK_PIN(89, "RCP", DRV_GRP0),
+       MTK_PIN(90, "RDN2", DRV_GRP0),
+       MTK_PIN(91, "RDP2", DRV_GRP0),
+       MTK_PIN(92, "RDN3", DRV_GRP0),
+       MTK_PIN(93, "RDP3", DRV_GRP0),
+       MTK_PIN(94, "RCN_A", DRV_GRP0),
+       MTK_PIN(95, "RCP_A", DRV_GRP0),
+       MTK_PIN(96, "RDN1_A", DRV_GRP0),
+       MTK_PIN(97, "RDP1_A", DRV_GRP0),
+       MTK_PIN(98, "RDN0_A", DRV_GRP0),
+       MTK_PIN(99, "RDP0_A", DRV_GRP0),
+       MTK_PIN(100, "CMDDAT0", DRV_GRP2),
+       MTK_PIN(101, "CMDDAT1", DRV_GRP2),
+       MTK_PIN(102, "CMMCLK", DRV_GRP2),
+       MTK_PIN(103, "CMPCLK", DRV_GRP2),
+       MTK_PIN(104, "MSDC1_CMD", DRV_GRP4),
+       MTK_PIN(105, "MSDC1_CLK", DRV_GRP4),
+       MTK_PIN(106, "MSDC1_DAT0", DRV_GRP4),
+       MTK_PIN(107, "MSDC1_DAT1", DRV_GRP4),
+       MTK_PIN(108, "MSDC1_DAT2", DRV_GRP4),
+       MTK_PIN(109, "MSDC1_DAT3", DRV_GRP4),
+       MTK_PIN(110, "MSDC0_DAT7", DRV_GRP4),
+       MTK_PIN(111, "MSDC0_DAT6", DRV_GRP4),
+       MTK_PIN(112, "MSDC0_DAT5", DRV_GRP4),
+       MTK_PIN(113, "MSDC0_DAT4", DRV_GRP4),
+       MTK_PIN(114, "MSDC0_RSTB", DRV_GRP4),
+       MTK_PIN(115, "MSDC0_CMD", DRV_GRP4),
+       MTK_PIN(116, "MSDC0_CLK", DRV_GRP4),
+       MTK_PIN(117, "MSDC0_DAT3", DRV_GRP4),
+       MTK_PIN(118, "MSDC0_DAT2", DRV_GRP4),
+       MTK_PIN(119, "MSDC0_DAT1", DRV_GRP4),
+       MTK_PIN(120, "MSDC0_DAT0", DRV_GRP4),
+};
+
+/* List all groups consisting of these pins dedicated to the enablement of
+ * certain hardware block and the corresponding mode for all of the pins.
+ * The hardware probably has multiple combinations of these pinouts.
+ */
+
+/* UART */
+static int mt8516_uart0_0_rxd_txd_pins[]               = { 62, 63, };
+static int mt8516_uart0_0_rxd_txd_funcs[]              = {  1,  1, };
+static int mt8516_uart1_0_rxd_txd_pins[]               = { 64, 65, };
+static int mt8516_uart1_0_rxd_txd_funcs[]              = {  1,  1, };
+static int mt8516_uart2_0_rxd_txd_pins[]               = { 34, 35, };
+static int mt8516_uart2_0_rxd_txd_funcs[]              = {  1,  1, };
+
+/* Joint those groups owning the same capability in user point of view which
+ * allows that people tend to use through the device tree.
+ */
+static const char *const mt8516_uart_groups[] = { "uart0_0_rxd_txd",
+                                               "uart1_0_rxd_txd",
+                                               "uart2_0_rxd_txd", };
+
+/* MMC0 */
+static int mt8516_msdc0_pins[] = { 110, 111, 112, 113, 114, 115, 116, 117, 118,
+                                  119, 120, };
+static int mt8516_msdc0_funcs[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, };
+
+static const struct mtk_group_desc mt8516_groups[] = {
+       PINCTRL_PIN_GROUP("uart0_0_rxd_txd", mt8516_uart0_0_rxd_txd),
+       PINCTRL_PIN_GROUP("uart1_0_rxd_txd", mt8516_uart1_0_rxd_txd),
+       PINCTRL_PIN_GROUP("uart2_0_rxd_txd", mt8516_uart2_0_rxd_txd),
+
+       PINCTRL_PIN_GROUP("msdc0", mt8516_msdc0),
+};
+
+static const char *const mt8516_msdc_groups[] = { "msdc0" };
+
+static const struct mtk_function_desc mt8516_functions[] = {
+       {"uart", mt8516_uart_groups, ARRAY_SIZE(mt8516_uart_groups)},
+       {"msdc", mt8516_msdc_groups, ARRAY_SIZE(mt8516_msdc_groups)},
+};
+
+static struct mtk_pinctrl_soc mt8516_data = {
+       .name = "mt8516_pinctrl",
+       .reg_cal = mt8516_reg_cals,
+       .pins = mt8516_pins,
+       .npins = ARRAY_SIZE(mt8516_pins),
+       .grps = mt8516_groups,
+       .ngrps = ARRAY_SIZE(mt8516_groups),
+       .funcs = mt8516_functions,
+       .nfuncs = ARRAY_SIZE(mt8516_functions),
+};
+
+static int mtk_pinctrl_mt8516_probe(struct udevice *dev)
+{
+       return mtk_pinctrl_common_probe(dev, &mt8516_data);
+}
+
+static const struct udevice_id mt8516_pctrl_match[] = {
+       { .compatible = "mediatek,mt8516-pinctrl" },
+       { /* sentinel */ }
+};
+
+U_BOOT_DRIVER(mt8516_pinctrl) = {
+       .name = "mt8516_pinctrl",
+       .id = UCLASS_PINCTRL,
+       .of_match = mt8516_pctrl_match,
+       .ops = &mtk_pinctrl_ops,
+       .probe = mtk_pinctrl_mt8516_probe,
+       .priv_auto_alloc_size = sizeof(struct mtk_pinctrl_priv),
+};
diff --git a/drivers/pinctrl/pinctrl-stmfx.c b/drivers/pinctrl/pinctrl-stmfx.c
new file mode 100644 (file)
index 0000000..5431df9
--- /dev/null
@@ -0,0 +1,431 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
+ *
+ * Driver for STMicroelectronics Multi-Function eXpander (STMFX) GPIO expander
+ * based on Linux driver : pinctrl/pinctrl-stmfx.c
+ */
+#include <common.h>
+#include <dm.h>
+#include <i2c.h>
+#include <asm/gpio.h>
+#include <dm/device.h>
+#include <dm/device-internal.h>
+#include <dm/lists.h>
+#include <dm/pinctrl.h>
+#include <linux/bitfield.h>
+#include <power/regulator.h>
+
+/* STMFX pins = GPIO[15:0] + aGPIO[7:0] */
+#define STMFX_MAX_GPIO                 16
+#define STMFX_MAX_AGPIO                        8
+
+/* General */
+#define STMFX_REG_CHIP_ID              0x00 /* R */
+#define STMFX_REG_FW_VERSION_MSB       0x01 /* R */
+#define STMFX_REG_FW_VERSION_LSB       0x02 /* R */
+#define STMFX_REG_SYS_CTRL             0x40 /* RW */
+
+/* MFX boot time is around 10ms, so after reset, we have to wait this delay */
+#define STMFX_BOOT_TIME_MS 10
+
+/* GPIOs expander */
+/* GPIO_STATE1 0x10, GPIO_STATE2 0x11, GPIO_STATE3 0x12 */
+#define STMFX_REG_GPIO_STATE           0x10 /* R */
+/* GPIO_DIR1 0x60, GPIO_DIR2 0x61, GPIO_DIR3 0x63 */
+#define STMFX_REG_GPIO_DIR             0x60 /* RW */
+/* GPIO_TYPE1 0x64, GPIO_TYPE2 0x65, GPIO_TYPE3 0x66 */
+#define STMFX_REG_GPIO_TYPE            0x64 /* RW */
+/* GPIO_PUPD1 0x68, GPIO_PUPD2 0x69, GPIO_PUPD3 0x6A */
+#define STMFX_REG_GPIO_PUPD            0x68 /* RW */
+/* GPO_SET1 0x6C, GPO_SET2 0x6D, GPO_SET3 0x6E */
+#define STMFX_REG_GPO_SET              0x6C /* RW */
+/* GPO_CLR1 0x70, GPO_CLR2 0x71, GPO_CLR3 0x72 */
+#define STMFX_REG_GPO_CLR              0x70 /* RW */
+
+/* STMFX_REG_CHIP_ID bitfields */
+#define STMFX_REG_CHIP_ID_MASK         GENMASK(7, 0)
+
+/* STMFX_REG_SYS_CTRL bitfields */
+#define STMFX_REG_SYS_CTRL_GPIO_EN     BIT(0)
+#define STMFX_REG_SYS_CTRL_ALTGPIO_EN  BIT(3)
+#define STMFX_REG_SYS_CTRL_SWRST       BIT(7)
+
+#define NR_GPIO_REGS                   3
+#define NR_GPIOS_PER_REG               8
+#define get_reg(offset)                        ((offset) / NR_GPIOS_PER_REG)
+#define get_shift(offset)              ((offset) % NR_GPIOS_PER_REG)
+#define get_mask(offset)               (BIT(get_shift(offset)))
+
+struct stmfx_pinctrl {
+       struct udevice *gpio;
+};
+
+static int stmfx_read(struct udevice *dev, uint offset)
+{
+       return  dm_i2c_reg_read(dev_get_parent(dev), offset);
+}
+
+static int stmfx_write(struct udevice *dev, uint offset, unsigned int val)
+{
+       return dm_i2c_reg_write(dev_get_parent(dev), offset, val);
+}
+
+static int stmfx_gpio_get(struct udevice *dev, unsigned int offset)
+{
+       u32 reg = STMFX_REG_GPIO_STATE + get_reg(offset);
+       u32 mask = get_mask(offset);
+       int ret;
+
+       ret = stmfx_read(dev, reg);
+
+       return ret < 0 ? ret : !!(ret & mask);
+}
+
+static int stmfx_gpio_set(struct udevice *dev, unsigned int offset, int value)
+{
+       u32 reg = value ? STMFX_REG_GPO_SET : STMFX_REG_GPO_CLR;
+       u32 mask = get_mask(offset);
+
+       return stmfx_write(dev, reg + get_reg(offset), mask);
+}
+
+static int stmfx_gpio_get_function(struct udevice *dev, unsigned int offset)
+{
+       u32 reg = STMFX_REG_GPIO_DIR + get_reg(offset);
+       u32 mask = get_mask(offset);
+       int ret;
+
+       ret = stmfx_read(dev, reg);
+
+       if (ret < 0)
+               return ret;
+       /* On stmfx, gpio pins direction is (0)input, (1)output. */
+
+       return ret & mask ? GPIOF_OUTPUT : GPIOF_INPUT;
+}
+
+static int stmfx_gpio_direction_input(struct udevice *dev, unsigned int offset)
+{
+       u32 reg = STMFX_REG_GPIO_DIR + get_reg(offset);
+       u32 mask = get_mask(offset);
+       int ret;
+
+       ret = stmfx_read(dev, reg);
+       if (ret < 0)
+               return ret;
+
+       ret &= ~mask;
+
+       return stmfx_write(dev, reg, ret & ~mask);
+}
+
+static int stmfx_gpio_direction_output(struct udevice *dev,
+                                      unsigned int offset, int value)
+{
+       u32 reg = STMFX_REG_GPIO_DIR + get_reg(offset);
+       u32 mask = get_mask(offset);
+       int ret;
+
+       ret = stmfx_gpio_set(dev, offset, value);
+       if (ret < 0)
+               return ret;
+
+       ret = stmfx_read(dev, reg);
+       if (ret < 0)
+               return ret;
+
+       return stmfx_write(dev, reg, ret | mask);
+}
+
+static int stmfx_gpio_probe(struct udevice *dev)
+{
+       struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
+       struct ofnode_phandle_args args;
+       u8 sys_ctrl;
+
+       uc_priv->bank_name = "stmfx";
+       uc_priv->gpio_count = STMFX_MAX_GPIO + STMFX_MAX_AGPIO;
+       if (!dev_read_phandle_with_args(dev, "gpio-ranges",
+                                       NULL, 3, 0, &args)) {
+               uc_priv->gpio_count = args.args[2];
+       }
+
+       /* enable GPIO function */
+       sys_ctrl = STMFX_REG_SYS_CTRL_GPIO_EN;
+       if (uc_priv->gpio_count > STMFX_MAX_GPIO)
+               sys_ctrl |= STMFX_REG_SYS_CTRL_ALTGPIO_EN;
+       stmfx_write(dev, STMFX_REG_SYS_CTRL, sys_ctrl);
+
+       return 0;
+}
+
+static const struct dm_gpio_ops stmfx_gpio_ops = {
+       .set_value = stmfx_gpio_set,
+       .get_value = stmfx_gpio_get,
+       .get_function = stmfx_gpio_get_function,
+       .direction_input = stmfx_gpio_direction_input,
+       .direction_output = stmfx_gpio_direction_output,
+};
+
+U_BOOT_DRIVER(stmfx_gpio) = {
+       .name   = "stmfx-gpio",
+       .id     = UCLASS_GPIO,
+       .probe  = stmfx_gpio_probe,
+       .ops    = &stmfx_gpio_ops,
+};
+
+#if CONFIG_IS_ENABLED(PINCONF)
+static const struct pinconf_param stmfx_pinctrl_conf_params[] = {
+       { "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
+       { "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 0 },
+       { "bias-pull-pin-default", PIN_CONFIG_BIAS_PULL_PIN_DEFAULT, 0 },
+       { "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 0 },
+       { "drive-open-drain", PIN_CONFIG_DRIVE_OPEN_DRAIN, 0 },
+       { "drive-push-pull", PIN_CONFIG_DRIVE_PUSH_PULL, 0 },
+       { "output-high", PIN_CONFIG_OUTPUT, 1 },
+       { "output-low", PIN_CONFIG_OUTPUT, 0 },
+};
+
+static int stmfx_pinctrl_set_pupd(struct udevice *dev,
+                                 unsigned int pin, u32 pupd)
+{
+       u8 reg = STMFX_REG_GPIO_PUPD + get_reg(pin);
+       u32 mask = get_mask(pin);
+       int ret;
+
+       ret = stmfx_read(dev, reg);
+       if (ret < 0)
+               return ret;
+       ret = (ret & ~mask) | (pupd ? mask : 0);
+
+       return stmfx_write(dev, reg, ret);
+}
+
+static int stmfx_pinctrl_set_type(struct udevice *dev,
+                                 unsigned int pin, u32 type)
+{
+       u8 reg = STMFX_REG_GPIO_TYPE + get_reg(pin);
+       u32 mask = get_mask(pin);
+       int ret;
+
+       ret = stmfx_read(dev, reg);
+       if (ret < 0)
+               return ret;
+       ret = (ret & ~mask) | (type ? mask : 0);
+
+       return stmfx_write(dev, reg, ret);
+}
+
+static int stmfx_pinctrl_conf_set(struct udevice *dev, unsigned int pin,
+                                 unsigned int param, unsigned int arg)
+{
+       int ret, dir;
+       struct stmfx_pinctrl *plat = dev_get_platdata(dev);
+
+       dir = stmfx_gpio_get_function(plat->gpio, pin);
+
+       if (dir < 0)
+               return dir;
+
+       switch (param) {
+       case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
+       case PIN_CONFIG_BIAS_DISABLE:
+       case PIN_CONFIG_BIAS_PULL_DOWN:
+               ret = stmfx_pinctrl_set_pupd(dev, pin, 0);
+               break;
+       case PIN_CONFIG_BIAS_PULL_UP:
+               ret = stmfx_pinctrl_set_pupd(dev, pin, 1);
+               break;
+       case PIN_CONFIG_DRIVE_OPEN_DRAIN:
+               if (dir == GPIOF_OUTPUT)
+                       ret = stmfx_pinctrl_set_type(dev, pin, 1);
+               else
+                       ret = stmfx_pinctrl_set_type(dev, pin, 0);
+               break;
+       case PIN_CONFIG_DRIVE_PUSH_PULL:
+               if (dir == GPIOF_OUTPUT)
+                       ret = stmfx_pinctrl_set_type(dev, pin, 0);
+               else
+                       ret = stmfx_pinctrl_set_type(dev, pin, 1);
+               break;
+       case PIN_CONFIG_OUTPUT:
+               ret = stmfx_gpio_direction_output(plat->gpio, pin, arg);
+               break;
+       default:
+               return -ENOTSUPP;
+       }
+
+       return ret;
+}
+#endif
+
+static int stmfx_pinctrl_get_pins_count(struct udevice *dev)
+{
+       struct stmfx_pinctrl *plat = dev_get_platdata(dev);
+       struct gpio_dev_priv *uc_priv;
+
+       uc_priv = dev_get_uclass_priv(plat->gpio);
+
+       return uc_priv->gpio_count;
+}
+
+/*
+ * STMFX pins[15:0] are called "gpio[15:0]"
+ * and STMFX pins[23:16] are called "agpio[7:0]"
+ */
+#define MAX_PIN_NAME_LEN 7
+static char pin_name[MAX_PIN_NAME_LEN];
+static const char *stmfx_pinctrl_get_pin_name(struct udevice *dev,
+                                             unsigned int selector)
+{
+       if (selector < STMFX_MAX_GPIO)
+               snprintf(pin_name, MAX_PIN_NAME_LEN, "gpio%u", selector);
+       else
+               snprintf(pin_name, MAX_PIN_NAME_LEN, "agpio%u", selector - 16);
+       return pin_name;
+}
+
+static int stmfx_pinctrl_get_pin_muxing(struct udevice *dev,
+                                       unsigned int selector,
+                                       char *buf, int size)
+{
+       struct stmfx_pinctrl *plat = dev_get_platdata(dev);
+       int func;
+
+       func = stmfx_gpio_get_function(plat->gpio, selector);
+       if (func < 0)
+               return func;
+
+       snprintf(buf, size, "%s", func == GPIOF_INPUT ? "input" : "output");
+
+       return 0;
+}
+
+static int stmfx_pinctrl_bind(struct udevice *dev)
+{
+       struct stmfx_pinctrl *plat = dev_get_platdata(dev);
+
+       return device_bind_driver_to_node(dev->parent,
+                                         "stmfx-gpio", "stmfx-gpio",
+                                         dev_ofnode(dev), &plat->gpio);
+};
+
+static int stmfx_pinctrl_probe(struct udevice *dev)
+{
+       struct stmfx_pinctrl *plat = dev_get_platdata(dev);
+
+       return device_probe(plat->gpio);
+};
+
+const struct pinctrl_ops stmfx_pinctrl_ops = {
+       .get_pins_count = stmfx_pinctrl_get_pins_count,
+       .get_pin_name = stmfx_pinctrl_get_pin_name,
+       .set_state = pinctrl_generic_set_state,
+       .get_pin_muxing = stmfx_pinctrl_get_pin_muxing,
+#if CONFIG_IS_ENABLED(PINCONF)
+       .pinconf_set = stmfx_pinctrl_conf_set,
+       .pinconf_num_params = ARRAY_SIZE(stmfx_pinctrl_conf_params),
+       .pinconf_params = stmfx_pinctrl_conf_params,
+#endif
+};
+
+static const struct udevice_id stmfx_pinctrl_match[] = {
+       { .compatible = "st,stmfx-0300-pinctrl", },
+};
+
+U_BOOT_DRIVER(stmfx_pinctrl) = {
+       .name = "stmfx-pinctrl",
+       .id = UCLASS_PINCTRL,
+       .of_match = of_match_ptr(stmfx_pinctrl_match),
+       .bind = stmfx_pinctrl_bind,
+       .probe = stmfx_pinctrl_probe,
+       .ops = &stmfx_pinctrl_ops,
+       .platdata_auto_alloc_size = sizeof(struct stmfx_pinctrl),
+};
+
+static int stmfx_chip_init(struct udevice *dev)
+{
+       u8 id;
+       u8 version[2];
+       int ret;
+       struct dm_i2c_chip *chip = dev_get_parent_platdata(dev);
+
+       id = dm_i2c_reg_read(dev, STMFX_REG_CHIP_ID);
+       if (id < 0) {
+               dev_err(dev, "error reading chip id: %d\n", id);
+               return ret;
+       }
+       /*
+        * Check that ID is the complement of the I2C address:
+        * STMFX I2C address follows the 7-bit format (MSB), that's why
+        * client->addr is shifted.
+        *
+        * STMFX_I2C_ADDR|       STMFX         |        Linux
+        *   input pin   | I2C device address  | I2C device address
+        *---------------------------------------------------------
+        *       0       | b: 1000 010x h:0x84 |       0x42
+        *       1       | b: 1000 011x h:0x86 |       0x43
+        */
+       if (FIELD_GET(STMFX_REG_CHIP_ID_MASK, ~id) != (chip->chip_addr << 1)) {
+               dev_err(dev, "unknown chip id: %#x\n", id);
+               return -EINVAL;
+       }
+
+       ret = dm_i2c_read(dev, STMFX_REG_FW_VERSION_MSB,
+                         version, sizeof(version));
+       if (ret) {
+               dev_err(dev, "error reading fw version: %d\n", ret);
+               return ret;
+       }
+
+       dev_info(dev, "STMFX id: %#x, fw version: %x.%02x\n",
+                id, version[0], version[1]);
+
+       ret = dm_i2c_reg_read(dev, STMFX_REG_SYS_CTRL);
+
+       if (ret < 0)
+               return ret;
+
+       ret = dm_i2c_reg_write(dev, STMFX_REG_SYS_CTRL,
+                              ret | STMFX_REG_SYS_CTRL_SWRST);
+       if (ret)
+               return ret;
+
+       mdelay(STMFX_BOOT_TIME_MS);
+
+       return ret;
+}
+
+static int stmfx_probe(struct udevice *dev)
+{
+       struct udevice *vdd;
+       int ret;
+
+       ret = device_get_supply_regulator(dev, "vdd-supply", &vdd);
+       if (ret && ret != -ENOENT) {
+               dev_err(dev, "vdd regulator error:%d\n", ret);
+               return ret;
+       }
+       if (!ret) {
+               ret = regulator_set_enable(vdd, true);
+               if (ret) {
+                       dev_err(dev, "vdd enable failed: %d\n", ret);
+                       return ret;
+               }
+       }
+
+       return stmfx_chip_init(dev);
+}
+
+static const struct udevice_id stmfx_match[] = {
+       { .compatible = "st,stmfx-0300", },
+};
+
+U_BOOT_DRIVER(stmfx) = {
+       .name = "stmfx",
+       .id = UCLASS_I2C_GENERIC,
+       .of_match = of_match_ptr(stmfx_match),
+       .probe = stmfx_probe,
+       .bind = dm_scan_fdt_dev,
+};
index 0e3260afd1ee72afa4fa349114334a534e4cedf8..0e6c559d5efb21ed66325338ca86aadda70daed3 100644 (file)
@@ -27,28 +27,6 @@ int pinctrl_decode_pin_config(const void *blob, int node)
        return flags;
 }
 
-/*
- * TODO: this function is temporary for v2019.01.
- * It should be renamed to pinctrl_decode_pin_config(),
- * the original pinctrl_decode_pin_config() function should
- * be removed and all callers of the original function should
- * be migrated to use the new one.
- */
-int pinctrl_decode_pin_config_dm(struct udevice *dev)
-{
-       int pinconfig = 0;
-
-       if (dev->uclass->uc_drv->id != UCLASS_PINCONFIG)
-               return -EINVAL;
-
-       if (dev_read_bool(dev, "bias-pull-up"))
-               pinconfig |= 1 << PIN_CONFIG_BIAS_PULL_UP;
-       else if (dev_read_bool(dev, "bias-pull-down"))
-               pinconfig |= 1 << PIN_CONFIG_BIAS_PULL_DOWN;
-
-       return pinconfig;
-}
-
 #if CONFIG_IS_ENABLED(PINCTRL_FULL)
 /**
  * pinctrl_config_one() - apply pinctrl settings for a single node
@@ -149,6 +127,9 @@ static int pinconfig_post_bind(struct udevice *dev)
                ofnode_get_property(node, "compatible", &ret);
                if (ret >= 0)
                        continue;
+               /* If this node has "gpio-controller" property, skip */
+               if (ofnode_read_bool(node, "gpio-controller"))
+                       continue;
 
                if (ret != -FDT_ERR_NOTFOUND)
                        return ret;
@@ -201,11 +182,14 @@ static int pinctrl_select_state_simple(struct udevice *dev)
        int ret;
 
        /*
-        * For simplicity, assume the first device of PINCTRL uclass
-        * is the correct one.  This is most likely OK as there is
-        * usually only one pinctrl device on the system.
+        * For most system, there is only one pincontroller device. But in
+        * case of multiple pincontroller devices, probe the one with sequence
+        * number 0 (defined by alias) to avoid race condition.
         */
-       ret = uclass_get_device(UCLASS_PINCTRL, 0, &pctldev);
+       ret = uclass_get_device_by_seq(UCLASS_PINCTRL, 0, &pctldev);
+       if (ret)
+               /* if not found, get the first one */
+               ret = uclass_get_device(UCLASS_PINCTRL, 0, &pctldev);
        if (ret)
                return ret;
 
index 0cb577037c3b36eb2d47e79e977828af6f17cde0..152414ce31c03689004182c357997fd4bf9f1fd5 100644 (file)
@@ -76,6 +76,16 @@ config PINCTRL_PFC_R8A7796
          the GPIO definitions and pin control functions for each available
          multiplex function.
 
+config PINCTRL_PFC_R8A77965
+       bool "Renesas RCar Gen3 R8A77965 pin control driver"
+       depends on PINCTRL_PFC
+       help
+         Support pin multiplexing control on Renesas RCar Gen3 R8A77965 SoCs.
+
+         The driver is controlled by a device tree node which contains both
+         the GPIO definitions and pin control functions for each available
+         multiplex function.
+
 config PINCTRL_PFC_R8A77970
        bool "Renesas RCar Gen3 R8A77970 pin control driver"
        depends on PINCTRL_PFC
index 62bc40b8c10cc94a4dc82addeab77cbea030af3b..596b0023a3aee48a91b7fcb6436f67c3ff4815ea 100644 (file)
@@ -6,6 +6,7 @@ obj-$(CONFIG_PINCTRL_PFC_R8A7793) += pfc-r8a7791.o
 obj-$(CONFIG_PINCTRL_PFC_R8A7794) += pfc-r8a7794.o
 obj-$(CONFIG_PINCTRL_PFC_R8A7795) += pfc-r8a7795.o
 obj-$(CONFIG_PINCTRL_PFC_R8A7796) += pfc-r8a7796.o
+obj-$(CONFIG_PINCTRL_PFC_R8A77965) += pfc-r8a77965.o
 obj-$(CONFIG_PINCTRL_PFC_R8A77970) += pfc-r8a77970.o
 obj-$(CONFIG_PINCTRL_PFC_R8A77990) += pfc-r8a77990.o
 obj-$(CONFIG_PINCTRL_PFC_R8A77995) += pfc-r8a77995.o
index ad492b5366b261c568999d831fcd40808a34f7f6..ef23ca278ab3ccd9bf1ac2d047bc0873e5506032 100644 (file)
@@ -5694,7 +5694,18 @@ static int r8a7790_pin_to_pocctrl(struct sh_pfc *pfc, unsigned int pin, u32 *poc
        return 31 - (pin & 0x1f);
 }
 
+static int r8a7790_pinmux_soc_init(struct sh_pfc *pfc)
+{
+       /* Initialize TDSEL on old revisions */
+       if ((rmobile_get_cpu_rev_integer() == 1) &&
+           (rmobile_get_cpu_rev_fraction() == 0))
+               sh_pfc_write(pfc, 0xe6060088, 0x00155554);
+
+       return 0;
+}
+
 static const struct sh_pfc_soc_operations r8a7790_pinmux_ops = {
+       .init = r8a7790_pinmux_soc_init,
        .pin_to_pocctrl = r8a7790_pin_to_pocctrl,
 };
 
index 0b6a1b0c1ddc8f87c0d55f9b17d6438461cd6a8e..81669554597bd75d866a5c51b47909de31c9516a 100644 (file)
@@ -3221,8 +3221,7 @@ static const unsigned int qspi_data4_b_pins[] = {
        RCAR_GP_PIN(6, 4),
 };
 static const unsigned int qspi_data4_b_mux[] = {
-       SPCLK_B_MARK, MOSI_IO0_B_MARK, MISO_IO1_B_MARK,
-       IO2_B_MARK, IO3_B_MARK, SSL_B_MARK,
+       MOSI_IO0_B_MARK, MISO_IO1_B_MARK, IO2_B_MARK, IO3_B_MARK,
 };
 /* - SCIF0 ------------------------------------------------------------------ */
 static const unsigned int scif0_data_pins[] = {
@@ -4322,7 +4321,7 @@ static const unsigned int vin1_clk_pins[] = {
 static const unsigned int vin1_clk_mux[] = {
        VI1_CLK_MARK,
 };
-static const union vin_data vin1_b_data_pins = {
+static const union vin_data vin1_data_b_pins = {
        .data24 = {
                /* B */
                RCAR_GP_PIN(3, 0), RCAR_GP_PIN(3, 1),
@@ -4341,7 +4340,7 @@ static const union vin_data vin1_b_data_pins = {
                RCAR_GP_PIN(2, 19), RCAR_GP_PIN(2, 20),
        },
 };
-static const union vin_data vin1_b_data_mux = {
+static const union vin_data vin1_data_b_mux = {
        .data24 = {
                /* B */
                VI1_DATA0_B_MARK, VI1_DATA1_B_MARK,
@@ -4360,7 +4359,7 @@ static const union vin_data vin1_b_data_mux = {
                VI1_R6_B_MARK, VI1_R7_B_MARK,
        },
 };
-static const unsigned int vin1_b_data18_pins[] = {
+static const unsigned int vin1_data18_b_pins[] = {
        /* B */
        RCAR_GP_PIN(3, 8), RCAR_GP_PIN(3, 9),
        RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11),
@@ -4374,47 +4373,44 @@ static const unsigned int vin1_b_data18_pins[] = {
        RCAR_GP_PIN(2, 17), RCAR_GP_PIN(2, 18),
        RCAR_GP_PIN(2, 19), RCAR_GP_PIN(2, 20),
 };
-static const unsigned int vin1_b_data18_mux[] = {
+static const unsigned int vin1_data18_b_mux[] = {
        /* B */
-       VI1_DATA0_B_MARK, VI1_DATA1_B_MARK,
        VI1_DATA2_B_MARK, VI1_DATA3_B_MARK,
        VI1_DATA4_B_MARK, VI1_DATA5_B_MARK,
        VI1_DATA6_B_MARK, VI1_DATA7_B_MARK,
        /* G */
-       VI1_G0_B_MARK, VI1_G1_B_MARK,
        VI1_G2_B_MARK, VI1_G3_B_MARK,
        VI1_G4_B_MARK, VI1_G5_B_MARK,
        VI1_G6_B_MARK, VI1_G7_B_MARK,
        /* R */
-       VI1_R0_B_MARK, VI1_R1_B_MARK,
        VI1_R2_B_MARK, VI1_R3_B_MARK,
        VI1_R4_B_MARK, VI1_R5_B_MARK,
        VI1_R6_B_MARK, VI1_R7_B_MARK,
 };
-static const unsigned int vin1_b_sync_pins[] = {
+static const unsigned int vin1_sync_b_pins[] = {
        RCAR_GP_PIN(3, 17), /* HSYNC */
        RCAR_GP_PIN(3, 18), /* VSYNC */
 };
-static const unsigned int vin1_b_sync_mux[] = {
+static const unsigned int vin1_sync_b_mux[] = {
        VI1_HSYNC_N_B_MARK,
        VI1_VSYNC_N_B_MARK,
 };
-static const unsigned int vin1_b_field_pins[] = {
+static const unsigned int vin1_field_b_pins[] = {
        RCAR_GP_PIN(3, 20),
 };
-static const unsigned int vin1_b_field_mux[] = {
+static const unsigned int vin1_field_b_mux[] = {
        VI1_FIELD_B_MARK,
 };
-static const unsigned int vin1_b_clkenb_pins[] = {
+static const unsigned int vin1_clkenb_b_pins[] = {
        RCAR_GP_PIN(3, 19),
 };
-static const unsigned int vin1_b_clkenb_mux[] = {
+static const unsigned int vin1_clkenb_b_mux[] = {
        VI1_CLKENB_B_MARK,
 };
-static const unsigned int vin1_b_clk_pins[] = {
+static const unsigned int vin1_clk_b_pins[] = {
        RCAR_GP_PIN(3, 16),
 };
-static const unsigned int vin1_b_clk_mux[] = {
+static const unsigned int vin1_clk_b_mux[] = {
        VI1_CLK_B_MARK,
 };
 /* - VIN2 ----------------------------------------------------------------- */
@@ -4459,7 +4455,7 @@ static const unsigned int vin2_clk_mux[] = {
 
 static const struct {
        struct sh_pfc_pin_group common[346];
-       struct sh_pfc_pin_group r8a779x[9];
+       struct sh_pfc_pin_group automotive[9];
 } pinmux_groups = {
        .common = {
                SH_PFC_PIN_GROUP(audio_clk_a),
@@ -4792,24 +4788,24 @@ static const struct {
                SH_PFC_PIN_GROUP(vin1_field),
                SH_PFC_PIN_GROUP(vin1_clkenb),
                SH_PFC_PIN_GROUP(vin1_clk),
-               VIN_DATA_PIN_GROUP(vin1_b_data, 24),
-               VIN_DATA_PIN_GROUP(vin1_b_data, 20),
-               SH_PFC_PIN_GROUP(vin1_b_data18),
-               VIN_DATA_PIN_GROUP(vin1_b_data, 16),
-               VIN_DATA_PIN_GROUP(vin1_b_data, 12),
-               VIN_DATA_PIN_GROUP(vin1_b_data, 10),
-               VIN_DATA_PIN_GROUP(vin1_b_data, 8),
-               SH_PFC_PIN_GROUP(vin1_b_sync),
-               SH_PFC_PIN_GROUP(vin1_b_field),
-               SH_PFC_PIN_GROUP(vin1_b_clkenb),
-               SH_PFC_PIN_GROUP(vin1_b_clk),
+               VIN_DATA_PIN_GROUP(vin1_data, 24, _b),
+               VIN_DATA_PIN_GROUP(vin1_data, 20, _b),
+               SH_PFC_PIN_GROUP(vin1_data18_b),
+               VIN_DATA_PIN_GROUP(vin1_data, 16, _b),
+               VIN_DATA_PIN_GROUP(vin1_data, 12, _b),
+               VIN_DATA_PIN_GROUP(vin1_data, 10, _b),
+               VIN_DATA_PIN_GROUP(vin1_data, 8, _b),
+               SH_PFC_PIN_GROUP(vin1_sync_b),
+               SH_PFC_PIN_GROUP(vin1_field_b),
+               SH_PFC_PIN_GROUP(vin1_clkenb_b),
+               SH_PFC_PIN_GROUP(vin1_clk_b),
                SH_PFC_PIN_GROUP(vin2_data8),
                SH_PFC_PIN_GROUP(vin2_sync),
                SH_PFC_PIN_GROUP(vin2_field),
                SH_PFC_PIN_GROUP(vin2_clkenb),
                SH_PFC_PIN_GROUP(vin2_clk),
        },
-       .r8a779x = {
+       .automotive = {
                SH_PFC_PIN_GROUP(adi_common),
                SH_PFC_PIN_GROUP(adi_chsel0),
                SH_PFC_PIN_GROUP(adi_chsel1),
@@ -5244,7 +5240,7 @@ static const char * const scifb2_groups[] = {
        "scifb2_data_b",
        "scifb2_clk_b",
        "scifb2_ctrl_b",
-       "scifb0_data_c",
+       "scifb2_data_c",
        "scifb2_clk_c",
        "scifb2_data_d",
 };
@@ -5343,17 +5339,17 @@ static const char * const vin1_groups[] = {
        "vin1_field",
        "vin1_clkenb",
        "vin1_clk",
-       "vin1_b_data24",
-       "vin1_b_data20",
-       "vin1_b_data18",
-       "vin1_b_data16",
-       "vin1_b_data12",
-       "vin1_b_data10",
-       "vin1_b_data8",
-       "vin1_b_sync",
-       "vin1_b_field",
-       "vin1_b_clkenb",
-       "vin1_b_clk",
+       "vin1_data24_b",
+       "vin1_data20_b",
+       "vin1_data18_b",
+       "vin1_data16_b",
+       "vin1_data12_b",
+       "vin1_data10_b",
+       "vin1_data8_b",
+       "vin1_sync_b",
+       "vin1_field_b",
+       "vin1_clkenb_b",
+       "vin1_clk_b",
 };
 
 static const char * const vin2_groups[] = {
@@ -5366,7 +5362,7 @@ static const char * const vin2_groups[] = {
 
 static const struct {
        struct sh_pfc_function common[58];
-       struct sh_pfc_function r8a779x[2];
+       struct sh_pfc_function automotive[2];
 } pinmux_functions = {
        .common = {
                SH_PFC_FUNCTION(audio_clk),
@@ -5428,7 +5424,7 @@ static const struct {
                SH_PFC_FUNCTION(vin1),
                SH_PFC_FUNCTION(vin2),
        },
-       .r8a779x = {
+       .automotive = {
                SH_PFC_FUNCTION(adi),
                SH_PFC_FUNCTION(mlb),
        }
@@ -6635,6 +6631,28 @@ const struct sh_pfc_soc_info r8a7743_pinmux_info = {
 };
 #endif
 
+#ifdef CONFIG_PINCTRL_PFC_R8A7744
+const struct sh_pfc_soc_info r8a7744_pinmux_info = {
+       .name = "r8a77440_pfc",
+       .ops = &r8a7791_pinmux_ops,
+       .unlock_reg = 0xe6060000, /* PMMR */
+
+       .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
+
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .groups = pinmux_groups.common,
+       .nr_groups = ARRAY_SIZE(pinmux_groups.common),
+       .functions = pinmux_functions.common,
+       .nr_functions = ARRAY_SIZE(pinmux_functions.common),
+
+       .cfg_regs = pinmux_config_regs,
+
+       .pinmux_data = pinmux_data,
+       .pinmux_data_size = ARRAY_SIZE(pinmux_data),
+};
+#endif
+
 #ifdef CONFIG_PINCTRL_PFC_R8A7791
 const struct sh_pfc_soc_info r8a7791_pinmux_info = {
        .name = "r8a77910_pfc",
@@ -6647,10 +6665,10 @@ const struct sh_pfc_soc_info r8a7791_pinmux_info = {
        .nr_pins = ARRAY_SIZE(pinmux_pins),
        .groups = pinmux_groups.common,
        .nr_groups = ARRAY_SIZE(pinmux_groups.common) +
-                    ARRAY_SIZE(pinmux_groups.r8a779x),
+                    ARRAY_SIZE(pinmux_groups.automotive),
        .functions = pinmux_functions.common,
        .nr_functions = ARRAY_SIZE(pinmux_functions.common) +
-                       ARRAY_SIZE(pinmux_functions.r8a779x),
+                       ARRAY_SIZE(pinmux_functions.automotive),
 
        .cfg_regs = pinmux_config_regs,
 
@@ -6671,10 +6689,10 @@ const struct sh_pfc_soc_info r8a7793_pinmux_info = {
        .nr_pins = ARRAY_SIZE(pinmux_pins),
        .groups = pinmux_groups.common,
        .nr_groups = ARRAY_SIZE(pinmux_groups.common) +
-                    ARRAY_SIZE(pinmux_groups.r8a779x),
+                    ARRAY_SIZE(pinmux_groups.automotive),
        .functions = pinmux_functions.common,
        .nr_functions = ARRAY_SIZE(pinmux_functions.common) +
-                       ARRAY_SIZE(pinmux_functions.r8a779x),
+                       ARRAY_SIZE(pinmux_functions.automotive),
 
        .cfg_regs = pinmux_config_regs,
 
index d0063c06bf02235d408c2ab344ba83c89bcd342d..95bb5237d92235b4132ba1bf4f289e8ef49871c7 100644 (file)
@@ -1477,7 +1477,7 @@ static const unsigned int vin1_clk_mux[] = {
        VI1_CLK_MARK,
 };
 /* - VIN2 ------------------------------------------------------------------- */
-static const union vin_data vin2_data_pins = {
+static const union vin_data16 vin2_data_pins = {
        .data16 = {
                RCAR_GP_PIN(6, 4), RCAR_GP_PIN(6, 5),
                RCAR_GP_PIN(6, 6), RCAR_GP_PIN(6, 7),
@@ -1489,7 +1489,7 @@ static const union vin_data vin2_data_pins = {
                RCAR_GP_PIN(8, 11), RCAR_GP_PIN(8, 12),
        },
 };
-static const union vin_data vin2_data_mux = {
+static const union vin_data16 vin2_data_mux = {
        .data16 = {
                VI2_D0_C0_MARK, VI2_D1_C1_MARK,
                VI2_D2_C2_MARK, VI2_D3_C3_MARK,
@@ -1527,7 +1527,7 @@ static const unsigned int vin2_clk_mux[] = {
        VI2_CLK_MARK,
 };
 /* - VIN3 ------------------------------------------------------------------- */
-static const union vin_data vin3_data_pins = {
+static const union vin_data16 vin3_data_pins = {
        .data16 = {
                RCAR_GP_PIN(7, 4), RCAR_GP_PIN(7, 5),
                RCAR_GP_PIN(7, 6), RCAR_GP_PIN(7, 7),
@@ -1539,7 +1539,7 @@ static const union vin_data vin3_data_pins = {
                RCAR_GP_PIN(8, 15), RCAR_GP_PIN(8, 16),
        },
 };
-static const union vin_data vin3_data_mux = {
+static const union vin_data16 vin3_data_mux = {
        .data16 = {
                VI3_D0_C0_MARK, VI3_D1_C1_MARK,
                VI3_D2_C2_MARK, VI3_D3_C3_MARK,
@@ -1577,7 +1577,7 @@ static const unsigned int vin3_clk_mux[] = {
        VI3_CLK_MARK,
 };
 /* - VIN4 ------------------------------------------------------------------- */
-static const union vin_data vin4_data_pins = {
+static const union vin_data12 vin4_data_pins = {
        .data12 = {
                RCAR_GP_PIN(8, 4), RCAR_GP_PIN(8, 5),
                RCAR_GP_PIN(8, 6), RCAR_GP_PIN(8, 7),
@@ -1587,7 +1587,7 @@ static const union vin_data vin4_data_pins = {
                RCAR_GP_PIN(8, 14), RCAR_GP_PIN(8, 15),
        },
 };
-static const union vin_data vin4_data_mux = {
+static const union vin_data12 vin4_data_mux = {
        .data12 = {
                VI4_D0_C0_MARK, VI4_D1_C1_MARK,
                VI4_D2_C2_MARK, VI4_D3_C3_MARK,
@@ -1623,7 +1623,7 @@ static const unsigned int vin4_clk_mux[] = {
        VI4_CLK_MARK,
 };
 /* - VIN5 ------------------------------------------------------------------- */
-static const union vin_data vin5_data_pins = {
+static const union vin_data12 vin5_data_pins = {
        .data12 = {
                RCAR_GP_PIN(9, 4), RCAR_GP_PIN(9, 5),
                RCAR_GP_PIN(9, 6), RCAR_GP_PIN(9, 7),
@@ -1633,7 +1633,7 @@ static const union vin_data vin5_data_pins = {
                RCAR_GP_PIN(9, 14), RCAR_GP_PIN(9, 15),
        },
 };
-static const union vin_data vin5_data_mux = {
+static const union vin_data12 vin5_data_mux = {
        .data12 = {
                VI5_D0_C0_MARK, VI5_D1_C1_MARK,
                VI5_D2_C2_MARK, VI5_D3_C3_MARK,
@@ -1747,10 +1747,10 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        VIN_DATA_PIN_GROUP(vin1_data, 12),
        VIN_DATA_PIN_GROUP(vin1_data, 10),
        VIN_DATA_PIN_GROUP(vin1_data, 8),
-       VIN_DATA_PIN_GROUP(vin1_data_b, 24),
-       VIN_DATA_PIN_GROUP(vin1_data_b, 20),
+       VIN_DATA_PIN_GROUP(vin1_data, 24, _b),
+       VIN_DATA_PIN_GROUP(vin1_data, 20, _b),
        SH_PFC_PIN_GROUP(vin1_data18_b),
-       VIN_DATA_PIN_GROUP(vin1_data_b, 16),
+       VIN_DATA_PIN_GROUP(vin1_data, 16, _b),
        SH_PFC_PIN_GROUP(vin1_sync),
        SH_PFC_PIN_GROUP(vin1_field),
        SH_PFC_PIN_GROUP(vin1_clkenb),
@@ -1916,6 +1916,7 @@ static const char * const vin1_groups[] = {
        "vin1_data8",
        "vin1_data24_b",
        "vin1_data20_b",
+       "vin1_data18_b",
        "vin1_data16_b",
        "vin1_sync",
        "vin1_field",
index 7264c70e85f3e9823dea13d6e10c87c450a5d1fa..657ebca783bb6adf1a9d6160baaebad7816f8a50 100644 (file)
@@ -3707,7 +3707,7 @@ static const unsigned int vin0_clk_mux[] = {
        VI0_CLK_MARK,
 };
 /* - VIN1 ------------------------------------------------------------------- */
-static const union vin_data vin1_data_pins = {
+static const union vin_data12 vin1_data_pins = {
        .data12 = {
                RCAR_GP_PIN(5, 12), RCAR_GP_PIN(5, 13),
                RCAR_GP_PIN(5, 14), RCAR_GP_PIN(5, 15),
@@ -3717,7 +3717,7 @@ static const union vin_data vin1_data_pins = {
                RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 13),
        },
 };
-static const union vin_data vin1_data_mux = {
+static const union vin_data12 vin1_data_mux = {
        .data12 = {
                VI1_DATA0_MARK, VI1_DATA1_MARK,
                VI1_DATA2_MARK, VI1_DATA3_MARK,
@@ -5215,7 +5215,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = {
                FN_AVB_MDC, FN_SSI_SDATA6_B, 0, 0, }
        },
        { PINMUX_CFG_REG_VAR("IPSR9", 0xE6060044, 32,
-                            1, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3, 3) {
+                            1, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3) {
                /* IP9_31 [1] */
                0, 0,
                /* IP9_30_28 [3] */
@@ -5563,7 +5563,18 @@ static int r8a7794_pin_to_pocctrl(struct sh_pfc *pfc, unsigned int pin, u32 *poc
        return -EINVAL;
 }
 
+static int r8a7794_pinmux_soc_init(struct sh_pfc *pfc)
+{
+       /* Initialize TDSEL on old revisions */
+       if ((rmobile_get_cpu_rev_integer() == 1) &&
+           (rmobile_get_cpu_rev_fraction() == 0))
+               sh_pfc_write(pfc, 0xe6060068, 0x55555500);
+
+       return 0;
+}
+
 static const struct sh_pfc_soc_operations r8a7794_pinmux_ops = {
+       .init = r8a7794_pinmux_soc_init,
        .pin_to_pocctrl = r8a7794_pin_to_pocctrl,
 };
 
index b60134351cbd62ed1a82d46a48b7c027b6036057..89ae6f6ed7dfc441680a082643cf0f9c2c3e3f71 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * R8A7795 ES2.0+ processor support - PFC hardware block.
  *
- * Copyright (C) 2015-2019 Renesas Electronics Corporation
+ * Copyright (C) 2015-2017 Renesas Electronics Corporation
  */
 
 #include <common.h>
 #define GPSR6_0                F_(SSI_SCK01239,                IP14_23_20)
 
 /* GPSR7 */
-#define GPSR7_3                FM(GP7_03)
-#define GPSR7_2                FM(GP7_02)
+#define GPSR7_3                FM(HDMI1_CEC)
+#define GPSR7_2                FM(HDMI0_CEC)
 #define GPSR7_1                FM(AVS2)
 #define GPSR7_0                FM(AVS1)
 
 #define IP16_23_20     FM(SSI_SDATA7)          FM(HCTS2_N_B)   FM(MSIOF1_RXD_C)        F_(0, 0)                        F_(0, 0)        FM(TS_SDEN1_A)  FM(STP_ISEN_1_A)        FM(RIF1_D0_A)   FM(RIF3_D0_A)           F_(0, 0)        FM(TCLK2_A)     F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP16_27_24     FM(SSI_SDATA8)          FM(HRTS2_N_B)   FM(MSIOF1_TXD_C)        F_(0, 0)                        F_(0, 0)        FM(TS_SPSYNC1_A)FM(STP_ISSYNC_1_A)      FM(RIF1_D1_A)   FM(RIF3_D1_A)           F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP16_31_28     FM(SSI_SDATA9_A)        FM(HSCK2_B)     FM(MSIOF1_SS1_C)        FM(HSCK1_A)                     FM(SSI_WS1_B)   FM(SCK1)        FM(STP_IVCXO27_1_A)     FM(SCK5_A)      F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP17_3_0       FM(AUDIO_CLKA_A)        F_(0, 0)        F_(0, 0)                F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP17_3_0       FM(AUDIO_CLKA_A)        F_(0, 0)        F_(0, 0)                F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        FM(CC5_OSCOUT)  F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP17_7_4       FM(AUDIO_CLKB_B)        FM(SCIF_CLK_A)  F_(0, 0)                F_(0, 0)                        F_(0, 0)        F_(0, 0)        FM(STP_IVCXO27_1_D)     FM(REMOCON_A)   F_(0, 0)                F_(0, 0)        FM(TCLK1_A)     F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP17_11_8      FM(USB0_PWEN)           F_(0, 0)        F_(0, 0)                FM(SIM0_RST_C)                  F_(0, 0)        FM(TS_SCK1_D)   FM(STP_ISCLK_1_D)       FM(BPFCLK_B)    FM(RIF3_CLK_B)          F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) FM(HSCK2_C) F_(0, 0) F_(0, 0)
 #define IP17_15_12     FM(USB0_OVC)            F_(0, 0)        F_(0, 0)                FM(SIM0_D_C)                    F_(0, 0)        FM(TS_SDAT1_D)  FM(STP_ISD_1_D)         F_(0, 0)        FM(RIF3_SYNC_B)         F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) FM(HRX2_C) F_(0, 0) F_(0, 0)
@@ -463,7 +463,7 @@ FM(IP16_31_28)      IP16_31_28      FM(IP17_31_28)  IP17_31_28
 #define MOD_SEL0_9_8           FM(SEL_DRIF1_0)         FM(SEL_DRIF1_1)         FM(SEL_DRIF1_2)         F_(0, 0)
 #define MOD_SEL0_7_6           FM(SEL_DRIF0_0)         FM(SEL_DRIF0_1)         FM(SEL_DRIF0_2)         F_(0, 0)
 #define MOD_SEL0_5             FM(SEL_CANFD0_0)        FM(SEL_CANFD0_1)
-#define MOD_SEL0_4_3           FM(SEL_ADGA_0)          FM(SEL_ADGA_1)          FM(SEL_ADGA_2)          FM(SEL_ADGA_3)
+#define MOD_SEL0_4_3           FM(SEL_ADG_A_0)         FM(SEL_ADG_A_1)         FM(SEL_ADG_A_2)         FM(SEL_ADG_A_3)
 
 /* MOD_SEL1 */                 /* 0 */                 /* 1 */                 /* 2 */                 /* 3 */                 /* 4 */                 /* 5 */                 /* 6 */                 /* 7 */
 #define MOD_SEL1_31_30         FM(SEL_TSIF1_0)         FM(SEL_TSIF1_1)         FM(SEL_TSIF1_2)         FM(SEL_TSIF1_3)
@@ -499,8 +499,8 @@ FM(IP16_31_28)      IP16_31_28      FM(IP17_31_28)  IP17_31_28
 #define MOD_SEL2_21            FM(SEL_SSI2_0)          FM(SEL_SSI2_1)
 #define MOD_SEL2_20            FM(SEL_SSI9_0)          FM(SEL_SSI9_1)
 #define MOD_SEL2_19            FM(SEL_TIMER_TMU2_0)    FM(SEL_TIMER_TMU2_1)
-#define MOD_SEL2_18            FM(SEL_ADGB_0)          FM(SEL_ADGB_1)
-#define MOD_SEL2_17            FM(SEL_ADGC_0)          FM(SEL_ADGC_1)
+#define MOD_SEL2_18            FM(SEL_ADG_B_0)         FM(SEL_ADG_B_1)
+#define MOD_SEL2_17            FM(SEL_ADG_C_0)         FM(SEL_ADG_C_1)
 #define MOD_SEL2_0             FM(SEL_VIN4_0)          FM(SEL_VIN4_1)
 
 #define PINMUX_MOD_SELS        \
@@ -552,6 +552,9 @@ MOD_SEL0_4_3                MOD_SEL1_4 \
        FM(DU_DOTCLKIN0) FM(DU_DOTCLKIN1) FM(DU_DOTCLKIN2) FM(DU_DOTCLKIN3) \
        FM(TMS) FM(TDO) FM(ASEBRK) FM(MLB_REF) FM(TDI) FM(TCK) FM(TRST) FM(EXTALR)
 
+#define PINMUX_PHYS \
+       FM(SCL0) FM(SDA0) FM(SCL3) FM(SDA3) FM(SCL5) FM(SDA5)
+
 enum {
        PINMUX_RESERVED = 0,
 
@@ -577,6 +580,7 @@ enum {
        PINMUX_IPSR
        PINMUX_MOD_SELS
        PINMUX_STATIC
+       PINMUX_PHYS
        PINMUX_MARK_END,
 #undef F_
 #undef FM
@@ -588,11 +592,8 @@ static const u16 pinmux_data[] = {
        PINMUX_SINGLE(AVS1),
        PINMUX_SINGLE(AVS2),
        PINMUX_SINGLE(CLKOUT),
-       PINMUX_SINGLE(GP7_02),
-       PINMUX_SINGLE(GP7_03),
-       PINMUX_SINGLE(I2C_SEL_0_1),
-       PINMUX_SINGLE(I2C_SEL_3_1),
-       PINMUX_SINGLE(I2C_SEL_5_1),
+       PINMUX_SINGLE(HDMI0_CEC),
+       PINMUX_SINGLE(HDMI1_CEC),
        PINMUX_SINGLE(MSIOF0_RXD),
        PINMUX_SINGLE(MSIOF0_SCK),
        PINMUX_SINGLE(MSIOF0_TXD),
@@ -616,14 +617,16 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_MSEL(IP0_15_12,     MSIOF2_SCK_C,           SEL_MSIOF2_2),
        PINMUX_IPSR_MSEL(IP0_15_12,     TX4_A,                  SEL_SCIF4_0),
 
-       PINMUX_IPSR_MSEL(IP0_19_16,     AVB_AVTP_MATCH_A,       SEL_ETHERAVB_0),
-       PINMUX_IPSR_MSEL(IP0_19_16,     MSIOF2_RXD_C,           SEL_MSIOF2_2),
-       PINMUX_IPSR_MSEL(IP0_19_16,     CTS4_N_A,               SEL_SCIF4_0),
-       PINMUX_IPSR_GPSR(IP0_19_16,     FSCLKST2_N_A),
+       PINMUX_IPSR_PHYS_MSEL(IP0_19_16, AVB_AVTP_MATCH_A,      I2C_SEL_5_0,    SEL_ETHERAVB_0),
+       PINMUX_IPSR_PHYS_MSEL(IP0_19_16, MSIOF2_RXD_C,          I2C_SEL_5_0,    SEL_MSIOF2_2),
+       PINMUX_IPSR_PHYS_MSEL(IP0_19_16, CTS4_N_A,              I2C_SEL_5_0,    SEL_SCIF4_0),
+       PINMUX_IPSR_MSEL(IP0_19_16,     FSCLKST2_N_A,           I2C_SEL_5_0),
+       PINMUX_IPSR_PHYS(IP0_19_16,     SCL5,                   I2C_SEL_5_1),
 
-       PINMUX_IPSR_MSEL(IP0_23_20,     AVB_AVTP_CAPTURE_A,     SEL_ETHERAVB_0),
-       PINMUX_IPSR_MSEL(IP0_23_20,     MSIOF2_TXD_C,           SEL_MSIOF2_2),
-       PINMUX_IPSR_MSEL(IP0_23_20,     RTS4_N_A,               SEL_SCIF4_0),
+       PINMUX_IPSR_PHYS_MSEL(IP0_23_20, AVB_AVTP_CAPTURE_A,    I2C_SEL_5_0,    SEL_ETHERAVB_0),
+       PINMUX_IPSR_PHYS_MSEL(IP0_23_20, MSIOF2_TXD_C,          I2C_SEL_5_0,    SEL_MSIOF2_2),
+       PINMUX_IPSR_PHYS_MSEL(IP0_23_20, RTS4_N_A,              I2C_SEL_5_0,    SEL_SCIF4_0),
+       PINMUX_IPSR_PHYS(IP0_23_20,     SDA5,                   I2C_SEL_5_1),
 
        PINMUX_IPSR_GPSR(IP0_27_24,     IRQ0),
        PINMUX_IPSR_GPSR(IP0_27_24,     QPOLB),
@@ -676,14 +679,16 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_MSEL(IP1_19_16,     VI4_DATA6_B,            SEL_VIN4_1),
        PINMUX_IPSR_MSEL(IP1_19_16,     IECLK_B,                SEL_IEBUS_1),
 
-       PINMUX_IPSR_MSEL(IP1_23_20,     PWM1_A,                 SEL_PWM1_0),
-       PINMUX_IPSR_MSEL(IP1_23_20,     HRX3_D,                 SEL_HSCIF3_3),
-       PINMUX_IPSR_MSEL(IP1_23_20,     VI4_DATA7_B,            SEL_VIN4_1),
-       PINMUX_IPSR_MSEL(IP1_23_20,     IERX_B,                 SEL_IEBUS_1),
+       PINMUX_IPSR_PHYS_MSEL(IP1_23_20, PWM1_A,                I2C_SEL_3_0,    SEL_PWM1_0),
+       PINMUX_IPSR_PHYS_MSEL(IP1_23_20, HRX3_D,                I2C_SEL_3_0,    SEL_HSCIF3_3),
+       PINMUX_IPSR_PHYS_MSEL(IP1_23_20, VI4_DATA7_B,           I2C_SEL_3_0,    SEL_VIN4_1),
+       PINMUX_IPSR_PHYS_MSEL(IP1_23_20, IERX_B,                I2C_SEL_3_0,    SEL_IEBUS_1),
+       PINMUX_IPSR_PHYS(IP0_23_20,     SCL3,                   I2C_SEL_3_1),
 
-       PINMUX_IPSR_MSEL(IP1_27_24,     PWM2_A,                 SEL_PWM2_0),
-       PINMUX_IPSR_MSEL(IP1_27_24,     HTX3_D,                 SEL_HSCIF3_3),
-       PINMUX_IPSR_MSEL(IP1_27_24,     IETX_B,                 SEL_IEBUS_1),
+       PINMUX_IPSR_PHYS_MSEL(IP1_27_24, PWM2_A,                I2C_SEL_3_0,    SEL_PWM2_0),
+       PINMUX_IPSR_PHYS_MSEL(IP1_27_24, HTX3_D,                I2C_SEL_3_0,    SEL_HSCIF3_3),
+       PINMUX_IPSR_PHYS_MSEL(IP1_27_24, IETX_B,                I2C_SEL_3_0,    SEL_IEBUS_1),
+       PINMUX_IPSR_PHYS(IP1_27_24,     SDA3,                   I2C_SEL_3_1),
 
        PINMUX_IPSR_GPSR(IP1_31_28,     A0),
        PINMUX_IPSR_GPSR(IP1_31_28,     LCDOUT16),
@@ -1115,16 +1120,18 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_GPSR(IP11_15_12,    SD0_WP),
        PINMUX_IPSR_MSEL(IP11_15_12,    SDA2_B,                 SEL_I2C2_1),
 
-       PINMUX_IPSR_GPSR(IP11_19_16,    SD1_CD),
-       PINMUX_IPSR_MSEL(IP11_19_16,    SIM0_CLK_B,             SEL_SIMCARD_1),
+       PINMUX_IPSR_MSEL(IP11_19_16,    SD1_CD,                 I2C_SEL_0_0),
+       PINMUX_IPSR_PHYS_MSEL(IP11_19_16, SIM0_CLK_B,           I2C_SEL_0_0,    SEL_SIMCARD_1),
+       PINMUX_IPSR_PHYS(IP11_19_16,    SCL0,                   I2C_SEL_0_1),
 
-       PINMUX_IPSR_GPSR(IP11_23_20,    SD1_WP),
-       PINMUX_IPSR_MSEL(IP11_23_20,    SIM0_D_B,               SEL_SIMCARD_1),
+       PINMUX_IPSR_MSEL(IP11_23_20,    SD1_WP,                 I2C_SEL_0_0),
+       PINMUX_IPSR_PHYS_MSEL(IP11_23_20, SIM0_D_B,             I2C_SEL_0_0,    SEL_SIMCARD_1),
+       PINMUX_IPSR_PHYS(IP11_23_20,    SDA0,                   I2C_SEL_0_1),
 
        PINMUX_IPSR_GPSR(IP11_27_24,    SCK0),
        PINMUX_IPSR_MSEL(IP11_27_24,    HSCK1_B,                SEL_HSCIF1_1),
        PINMUX_IPSR_MSEL(IP11_27_24,    MSIOF1_SS2_B,           SEL_MSIOF1_1),
-       PINMUX_IPSR_MSEL(IP11_27_24,    AUDIO_CLKC_B,           SEL_ADGC_1),
+       PINMUX_IPSR_MSEL(IP11_27_24,    AUDIO_CLKC_B,           SEL_ADG_C_1),
        PINMUX_IPSR_MSEL(IP11_27_24,    SDA2_A,                 SEL_I2C2_0),
        PINMUX_IPSR_MSEL(IP11_27_24,    SIM0_RST_B,             SEL_SIMCARD_1),
        PINMUX_IPSR_MSEL(IP11_27_24,    STP_OPWM_0_C,           SEL_SSP1_0_2),
@@ -1157,7 +1164,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_GPSR(IP12_11_8,     RTS0_N),
        PINMUX_IPSR_MSEL(IP12_11_8,     HRTS1_N_B,              SEL_HSCIF1_1),
        PINMUX_IPSR_MSEL(IP12_11_8,     MSIOF1_SS1_B,           SEL_MSIOF1_1),
-       PINMUX_IPSR_MSEL(IP12_11_8,     AUDIO_CLKA_B,           SEL_ADGA_1),
+       PINMUX_IPSR_MSEL(IP12_11_8,     AUDIO_CLKA_B,           SEL_ADG_A_1),
        PINMUX_IPSR_MSEL(IP12_11_8,     SCL2_A,                 SEL_I2C2_0),
        PINMUX_IPSR_MSEL(IP12_11_8,     STP_IVCXO27_1_C,        SEL_SSP1_1_2),
        PINMUX_IPSR_MSEL(IP12_11_8,     RIF0_SYNC_B,            SEL_DRIF0_1),
@@ -1216,7 +1223,7 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_GPSR(IP13_11_8,     HSCK0),
        PINMUX_IPSR_MSEL(IP13_11_8,     MSIOF1_SCK_D,           SEL_MSIOF1_3),
-       PINMUX_IPSR_MSEL(IP13_11_8,     AUDIO_CLKB_A,           SEL_ADGB_0),
+       PINMUX_IPSR_MSEL(IP13_11_8,     AUDIO_CLKB_A,           SEL_ADG_B_0),
        PINMUX_IPSR_MSEL(IP13_11_8,     SSI_SDATA1_B,           SEL_SSI1_1),
        PINMUX_IPSR_MSEL(IP13_11_8,     TS_SCK0_D,              SEL_TSIF0_3),
        PINMUX_IPSR_MSEL(IP13_11_8,     STP_ISCLK_0_D,          SEL_SSP1_0_3),
@@ -1263,7 +1270,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_GPSR(IP14_3_0,      MSIOF0_SS1),
        PINMUX_IPSR_MSEL(IP14_3_0,      RX5_A,                  SEL_SCIF5_0),
        PINMUX_IPSR_GPSR(IP14_3_0,      NFWP_N_A),
-       PINMUX_IPSR_MSEL(IP14_3_0,      AUDIO_CLKA_C,           SEL_ADGA_2),
+       PINMUX_IPSR_MSEL(IP14_3_0,      AUDIO_CLKA_C,           SEL_ADG_A_2),
        PINMUX_IPSR_MSEL(IP14_3_0,      SSI_SCK2_A,             SEL_SSI2_0),
        PINMUX_IPSR_MSEL(IP14_3_0,      STP_IVCXO27_0_C,        SEL_SSP1_0_2),
        PINMUX_IPSR_GPSR(IP14_3_0,      AUDIO_CLKOUT3_A),
@@ -1272,7 +1279,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_GPSR(IP14_7_4,      MSIOF0_SS2),
        PINMUX_IPSR_MSEL(IP14_7_4,      TX5_A,                  SEL_SCIF5_0),
        PINMUX_IPSR_MSEL(IP14_7_4,      MSIOF1_SS2_D,           SEL_MSIOF1_3),
-       PINMUX_IPSR_MSEL(IP14_7_4,      AUDIO_CLKC_A,           SEL_ADGC_0),
+       PINMUX_IPSR_MSEL(IP14_7_4,      AUDIO_CLKC_A,           SEL_ADG_C_0),
        PINMUX_IPSR_MSEL(IP14_7_4,      SSI_WS2_A,              SEL_SSI2_0),
        PINMUX_IPSR_MSEL(IP14_7_4,      STP_OPWM_0_D,           SEL_SSP1_0_3),
        PINMUX_IPSR_GPSR(IP14_7_4,      AUDIO_CLKOUT_D),
@@ -1403,9 +1410,10 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_MSEL(IP16_31_28,    SCK5_A,                 SEL_SCIF5_0),
 
        /* IPSR17 */
-       PINMUX_IPSR_MSEL(IP17_3_0,      AUDIO_CLKA_A,           SEL_ADGA_0),
+       PINMUX_IPSR_MSEL(IP17_3_0,      AUDIO_CLKA_A,           SEL_ADG_A_0),
+       PINMUX_IPSR_GPSR(IP17_3_0,      CC5_OSCOUT),
 
-       PINMUX_IPSR_MSEL(IP17_7_4,      AUDIO_CLKB_B,           SEL_ADGB_1),
+       PINMUX_IPSR_MSEL(IP17_7_4,      AUDIO_CLKB_B,           SEL_ADG_B_1),
        PINMUX_IPSR_MSEL(IP17_7_4,      SCIF_CLK_A,             SEL_SCIF_0),
        PINMUX_IPSR_MSEL(IP17_7_4,      STP_IVCXO27_1_D,        SEL_SSP1_1_3),
        PINMUX_IPSR_MSEL(IP17_7_4,      REMOCON_A,              SEL_REMOCON_0),
@@ -1491,10 +1499,10 @@ static const u16 pinmux_data[] = {
 
 /*
  * Static pins can not be muxed between different functions but
- * still needs a mark entry in the pinmux list. Add each static
+ * still need mark entries in the pinmux list. Add each static
  * pin to the list without an associated function. The sh-pfc
- * core will do the right thing and skip trying to mux then pin
- * while still applying configuration to it
+ * core will do the right thing and skip trying to mux the pin
+ * while still applying configuration to it.
  */
 #define FM(x)  PINMUX_DATA(x##_MARK, 0),
        PINMUX_STATIC
@@ -2125,23 +2133,20 @@ static const unsigned int du_disp_mux[] = {
        DU_DISP_MARK,
 };
 
-/* - GP7_02/03 -------------------------------------------------------------- */
-static const unsigned int gp7_02_pins[] = {
-       /* GP7_02 */
+/* - HDMI ------------------------------------------------------------------- */
+static const unsigned int hdmi0_cec_pins[] = {
+       /* HDMI0_CEC */
        RCAR_GP_PIN(7, 2),
 };
-
-static const unsigned int gp7_02_mux[] = {
-       GP7_02_MARK,
+static const unsigned int hdmi0_cec_mux[] = {
+       HDMI0_CEC_MARK,
 };
-
-static const unsigned int gp7_03_pins[] = {
-       /* GP7_03 */
+static const unsigned int hdmi1_cec_pins[] = {
+       /* HDMI1_CEC */
        RCAR_GP_PIN(7, 3),
 };
-
-static const unsigned int gp7_03_mux[] = {
-       GP7_03_MARK,
+static const unsigned int hdmi1_cec_mux[] = {
+       HDMI1_CEC_MARK,
 };
 
 /* - HSCIF0 ----------------------------------------------------------------- */
@@ -2352,6 +2357,15 @@ static const unsigned int hscif4_data_b_mux[] = {
 };
 
 /* - I2C -------------------------------------------------------------------- */
+static const unsigned int i2c0_pins[] = {
+       /* SCL, SDA */
+       RCAR_GP_PIN(3, 14), RCAR_GP_PIN(3, 15),
+};
+
+static const unsigned int i2c0_mux[] = {
+       SCL0_MARK, SDA0_MARK,
+};
+
 static const unsigned int i2c1_a_pins[] = {
        /* SDA, SCL */
        RCAR_GP_PIN(5, 11), RCAR_GP_PIN(5, 10),
@@ -2380,6 +2394,25 @@ static const unsigned int i2c2_b_pins[] = {
 static const unsigned int i2c2_b_mux[] = {
        SDA2_B_MARK, SCL2_B_MARK,
 };
+
+static const unsigned int i2c3_pins[] = {
+       /* SCL, SDA */
+       RCAR_GP_PIN(2, 7), RCAR_GP_PIN(2, 8),
+};
+
+static const unsigned int i2c3_mux[] = {
+       SCL3_MARK, SDA3_MARK,
+};
+
+static const unsigned int i2c5_pins[] = {
+       /* SCL, SDA */
+       RCAR_GP_PIN(2, 13), RCAR_GP_PIN(2, 14),
+};
+
+static const unsigned int i2c5_mux[] = {
+       SCL5_MARK, SDA5_MARK,
+};
+
 static const unsigned int i2c6_a_pins[] = {
        /* SDA, SCL */
        RCAR_GP_PIN(1, 8), RCAR_GP_PIN(1, 11),
@@ -3123,7 +3156,7 @@ static const unsigned int msiof3_ss1_e_mux[] = {
        MSIOF3_SS1_E_MARK,
 };
 static const unsigned int msiof3_ss2_e_pins[] = {
-       /* SS1 */
+       /* SS2 */
        RCAR_GP_PIN(2, 0),
 };
 static const unsigned int msiof3_ss2_e_mux[] = {
@@ -4067,67 +4100,29 @@ static const unsigned int vin4_clk_mux[] = {
 };
 
 /* - VIN5 ------------------------------------------------------------------- */
-static const unsigned int vin5_data8_pins[] = {
-       RCAR_GP_PIN(0, 0), RCAR_GP_PIN(0, 1),
-       RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3),
-       RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
-       RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7),
-};
-static const unsigned int vin5_data8_mux[] = {
-       VI5_DATA0_MARK, VI5_DATA1_MARK,
-       VI5_DATA2_MARK, VI5_DATA3_MARK,
-       VI5_DATA4_MARK, VI5_DATA5_MARK,
-       VI5_DATA6_MARK, VI5_DATA7_MARK,
-};
-static const unsigned int vin5_data10_pins[] = {
-       RCAR_GP_PIN(0, 0), RCAR_GP_PIN(0, 1),
-       RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3),
-       RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
-       RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7),
-       RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 13),
-};
-static const unsigned int vin5_data10_mux[] = {
-       VI5_DATA0_MARK, VI5_DATA1_MARK,
-       VI5_DATA2_MARK, VI5_DATA3_MARK,
-       VI5_DATA4_MARK, VI5_DATA5_MARK,
-       VI5_DATA6_MARK, VI5_DATA7_MARK,
-       VI5_DATA8_MARK,  VI5_DATA9_MARK,
-};
-static const unsigned int vin5_data12_pins[] = {
-       RCAR_GP_PIN(0, 0), RCAR_GP_PIN(0, 1),
-       RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3),
-       RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
-       RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7),
-       RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 13),
-       RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 15),
-};
-static const unsigned int vin5_data12_mux[] = {
-       VI5_DATA0_MARK, VI5_DATA1_MARK,
-       VI5_DATA2_MARK, VI5_DATA3_MARK,
-       VI5_DATA4_MARK, VI5_DATA5_MARK,
-       VI5_DATA6_MARK, VI5_DATA7_MARK,
-       VI5_DATA8_MARK,  VI5_DATA9_MARK,
-       VI5_DATA10_MARK, VI5_DATA11_MARK,
-};
-static const unsigned int vin5_data16_pins[] = {
-       RCAR_GP_PIN(0, 0), RCAR_GP_PIN(0, 1),
-       RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3),
-       RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
-       RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7),
-       RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 13),
-       RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 15),
-       RCAR_GP_PIN(1, 4), RCAR_GP_PIN(1, 5),
-       RCAR_GP_PIN(1, 6), RCAR_GP_PIN(1, 7),
+static const union vin_data16 vin5_data_pins = {
+       .data16 = {
+               RCAR_GP_PIN(0, 0), RCAR_GP_PIN(0, 1),
+               RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3),
+               RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
+               RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7),
+               RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 13),
+               RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 15),
+               RCAR_GP_PIN(1, 4), RCAR_GP_PIN(1, 5),
+               RCAR_GP_PIN(1, 6), RCAR_GP_PIN(1, 7),
+       },
 };
-static const unsigned int vin5_data16_mux[] = {
-       VI5_DATA0_MARK, VI5_DATA1_MARK,
-       VI5_DATA2_MARK, VI5_DATA3_MARK,
-       VI5_DATA4_MARK, VI5_DATA5_MARK,
-       VI5_DATA6_MARK, VI5_DATA7_MARK,
-       VI5_DATA8_MARK,  VI5_DATA9_MARK,
-       VI5_DATA10_MARK, VI5_DATA11_MARK,
-       VI5_DATA12_MARK, VI5_DATA13_MARK,
-       VI5_DATA14_MARK, VI5_DATA15_MARK,
+static const union vin_data16 vin5_data_mux = {
+       .data16 = {
+               VI5_DATA0_MARK, VI5_DATA1_MARK,
+               VI5_DATA2_MARK, VI5_DATA3_MARK,
+               VI5_DATA4_MARK, VI5_DATA5_MARK,
+               VI5_DATA6_MARK, VI5_DATA7_MARK,
+               VI5_DATA8_MARK,  VI5_DATA9_MARK,
+               VI5_DATA10_MARK, VI5_DATA11_MARK,
+               VI5_DATA12_MARK, VI5_DATA13_MARK,
+               VI5_DATA14_MARK, VI5_DATA15_MARK,
+       },
 };
 static const unsigned int vin5_sync_pins[] = {
        /* HSYNC#, VSYNC# */
@@ -4232,8 +4227,8 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(du_oddf),
        SH_PFC_PIN_GROUP(du_cde),
        SH_PFC_PIN_GROUP(du_disp),
-       SH_PFC_PIN_GROUP(gp7_02),
-       SH_PFC_PIN_GROUP(gp7_03),
+       SH_PFC_PIN_GROUP(hdmi0_cec),
+       SH_PFC_PIN_GROUP(hdmi1_cec),
        SH_PFC_PIN_GROUP(hscif0_data),
        SH_PFC_PIN_GROUP(hscif0_clk),
        SH_PFC_PIN_GROUP(hscif0_ctrl),
@@ -4262,10 +4257,13 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(hscif4_clk),
        SH_PFC_PIN_GROUP(hscif4_ctrl),
        SH_PFC_PIN_GROUP(hscif4_data_b),
+       SH_PFC_PIN_GROUP(i2c0),
        SH_PFC_PIN_GROUP(i2c1_a),
        SH_PFC_PIN_GROUP(i2c1_b),
        SH_PFC_PIN_GROUP(i2c2_a),
        SH_PFC_PIN_GROUP(i2c2_b),
+       SH_PFC_PIN_GROUP(i2c3),
+       SH_PFC_PIN_GROUP(i2c5),
        SH_PFC_PIN_GROUP(i2c6_a),
        SH_PFC_PIN_GROUP(i2c6_b),
        SH_PFC_PIN_GROUP(i2c6_c),
@@ -4478,28 +4476,28 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(usb2),
        SH_PFC_PIN_GROUP(usb2_ch3),
        SH_PFC_PIN_GROUP(usb30),
-       VIN_DATA_PIN_GROUP(vin4_data_a, 8),
-       VIN_DATA_PIN_GROUP(vin4_data_a, 10),
-       VIN_DATA_PIN_GROUP(vin4_data_a, 12),
-       VIN_DATA_PIN_GROUP(vin4_data_a, 16),
+       VIN_DATA_PIN_GROUP(vin4_data, 8, _a),
+       VIN_DATA_PIN_GROUP(vin4_data, 10, _a),
+       VIN_DATA_PIN_GROUP(vin4_data, 12, _a),
+       VIN_DATA_PIN_GROUP(vin4_data, 16, _a),
        SH_PFC_PIN_GROUP(vin4_data18_a),
-       VIN_DATA_PIN_GROUP(vin4_data_a, 20),
-       VIN_DATA_PIN_GROUP(vin4_data_a, 24),
-       VIN_DATA_PIN_GROUP(vin4_data_b, 8),
-       VIN_DATA_PIN_GROUP(vin4_data_b, 10),
-       VIN_DATA_PIN_GROUP(vin4_data_b, 12),
-       VIN_DATA_PIN_GROUP(vin4_data_b, 16),
+       VIN_DATA_PIN_GROUP(vin4_data, 20, _a),
+       VIN_DATA_PIN_GROUP(vin4_data, 24, _a),
+       VIN_DATA_PIN_GROUP(vin4_data, 8, _b),
+       VIN_DATA_PIN_GROUP(vin4_data, 10, _b),
+       VIN_DATA_PIN_GROUP(vin4_data, 12, _b),
+       VIN_DATA_PIN_GROUP(vin4_data, 16, _b),
        SH_PFC_PIN_GROUP(vin4_data18_b),
-       VIN_DATA_PIN_GROUP(vin4_data_b, 20),
-       VIN_DATA_PIN_GROUP(vin4_data_b, 24),
+       VIN_DATA_PIN_GROUP(vin4_data, 20, _b),
+       VIN_DATA_PIN_GROUP(vin4_data, 24, _b),
        SH_PFC_PIN_GROUP(vin4_sync),
        SH_PFC_PIN_GROUP(vin4_field),
        SH_PFC_PIN_GROUP(vin4_clkenb),
        SH_PFC_PIN_GROUP(vin4_clk),
-       SH_PFC_PIN_GROUP(vin5_data8),
-       SH_PFC_PIN_GROUP(vin5_data10),
-       SH_PFC_PIN_GROUP(vin5_data12),
-       SH_PFC_PIN_GROUP(vin5_data16),
+       VIN_DATA_PIN_GROUP(vin5_data, 8),
+       VIN_DATA_PIN_GROUP(vin5_data, 10),
+       VIN_DATA_PIN_GROUP(vin5_data, 12),
+       VIN_DATA_PIN_GROUP(vin5_data, 16),
        SH_PFC_PIN_GROUP(vin5_sync),
        SH_PFC_PIN_GROUP(vin5_field),
        SH_PFC_PIN_GROUP(vin5_clkenb),
@@ -4615,12 +4613,12 @@ static const char * const du_groups[] = {
        "du_disp",
 };
 
-static const char * const gp7_02_groups[] = {
-       "gp7_02",
+static const char * const hdmi0_groups[] = {
+       "hdmi0_cec",
 };
 
-static const char * const gp7_03_groups[] = {
-       "gp7_03",
+static const char * const hdmi1_groups[] = {
+       "hdmi1_cec",
 };
 
 static const char * const hscif0_groups[] = {
@@ -4666,6 +4664,10 @@ static const char * const hscif4_groups[] = {
        "hscif4_data_b",
 };
 
+static const char * const i2c0_groups[] = {
+       "i2c0",
+};
+
 static const char * const i2c1_groups[] = {
        "i2c1_a",
        "i2c1_b",
@@ -4676,6 +4678,14 @@ static const char * const i2c2_groups[] = {
        "i2c2_b",
 };
 
+static const char * const i2c3_groups[] = {
+       "i2c3",
+};
+
+static const char * const i2c5_groups[] = {
+       "i2c5",
+};
+
 static const char * const i2c6_groups[] = {
        "i2c6_a",
        "i2c6_b",
@@ -5029,15 +5039,18 @@ static const struct sh_pfc_function pinmux_functions[] = {
        SH_PFC_FUNCTION(drif2),
        SH_PFC_FUNCTION(drif3),
        SH_PFC_FUNCTION(du),
-       SH_PFC_FUNCTION(gp7_02),
-       SH_PFC_FUNCTION(gp7_03),
+       SH_PFC_FUNCTION(hdmi0),
+       SH_PFC_FUNCTION(hdmi1),
        SH_PFC_FUNCTION(hscif0),
        SH_PFC_FUNCTION(hscif1),
        SH_PFC_FUNCTION(hscif2),
        SH_PFC_FUNCTION(hscif3),
        SH_PFC_FUNCTION(hscif4),
+       SH_PFC_FUNCTION(i2c0),
        SH_PFC_FUNCTION(i2c1),
        SH_PFC_FUNCTION(i2c2),
+       SH_PFC_FUNCTION(i2c3),
+       SH_PFC_FUNCTION(i2c5),
        SH_PFC_FUNCTION(i2c6),
        SH_PFC_FUNCTION(intc_ex),
        SH_PFC_FUNCTION(msiof0),
@@ -5751,8 +5764,8 @@ static const struct pinmux_drive_reg pinmux_drive_regs[] = {
                { RCAR_GP_PIN(0, 15),   24, 3 },        /* D15 */
                { RCAR_GP_PIN(7,  0),   20, 3 },        /* AVS1 */
                { RCAR_GP_PIN(7,  1),   16, 3 },        /* AVS2 */
-               { RCAR_GP_PIN(7,  2),   12, 3 },        /* GP7_02 */
-               { RCAR_GP_PIN(7,  3),    8, 3 },        /* GP7_03 */
+               { RCAR_GP_PIN(7,  2),   12, 3 },        /* HDMI0_CEC */
+               { RCAR_GP_PIN(7,  3),    8, 3 },        /* HDMI1_CEC */
                { PIN_A_NUMBER('P', 7),  4, 2 },        /* DU_DOTCLKIN0 */
                { PIN_A_NUMBER('P', 8),  0, 2 },        /* DU_DOTCLKIN1 */
        } },
@@ -6006,8 +6019,8 @@ static const struct pinmux_bias_reg pinmux_bias_regs[] = {
                [25] = RCAR_GP_PIN(0, 15),      /* D15 */
                [26] = RCAR_GP_PIN(7,  0),      /* AVS1 */
                [27] = RCAR_GP_PIN(7,  1),      /* AVS2 */
-               [28] = RCAR_GP_PIN(7,  2),      /* GP7_02 */
-               [29] = RCAR_GP_PIN(7,  3),      /* GP7_03 */
+               [28] = RCAR_GP_PIN(7,  2),      /* HDMI0_CEC */
+               [29] = RCAR_GP_PIN(7,  3),      /* HDMI1_CEC */
                [30] = PIN_A_NUMBER('P', 7),    /* DU_DOTCLKIN0 */
                [31] = PIN_A_NUMBER('P', 8),    /* DU_DOTCLKIN1 */
        } },
index 90dbf3994a68c85713c1d029cf721fe1f19de5ce..24fbbf19aa967d81a04ca75253cacf31ee35f8c4 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * R8A7796 processor support - PFC hardware block.
  *
- * Copyright (C) 2016 Renesas Electronics Corp.
+ * Copyright (C) 2016-2017 Renesas Electronics Corp.
  *
  * This file is based on the drivers/pinctrl/sh-pfc/pfc-r8a7795.c
  *
 
 /* GPSR7 */
 #define GPSR7_3                FM(GP7_03)
-#define GPSR7_2                FM(GP7_02)
+#define GPSR7_2                FM(HDMI0_CEC)
 #define GPSR7_1                FM(AVS2)
 #define GPSR7_0                FM(AVS1)
 
 #define IP16_23_20     FM(SSI_SDATA7)          FM(HCTS2_N_B)   FM(MSIOF1_RXD_C)        F_(0, 0)                        F_(0, 0)        FM(TS_SDEN1_A)  FM(STP_ISEN_1_A)        FM(RIF1_D0_A)   FM(RIF3_D0_A)           F_(0, 0)        FM(TCLK2_A)     F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP16_27_24     FM(SSI_SDATA8)          FM(HRTS2_N_B)   FM(MSIOF1_TXD_C)        F_(0, 0)                        F_(0, 0)        FM(TS_SPSYNC1_A)FM(STP_ISSYNC_1_A)      FM(RIF1_D1_A)   FM(RIF3_D1_A)           F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP16_31_28     FM(SSI_SDATA9_A)        FM(HSCK2_B)     FM(MSIOF1_SS1_C)        FM(HSCK1_A)                     FM(SSI_WS1_B)   FM(SCK1)        FM(STP_IVCXO27_1_A)     FM(SCK5_A)      F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP17_3_0       FM(AUDIO_CLKA_A)        F_(0, 0)        F_(0, 0)                F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP17_3_0       FM(AUDIO_CLKA_A)        F_(0, 0)        F_(0, 0)                F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        FM(CC5_OSCOUT)  F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP17_7_4       FM(AUDIO_CLKB_B)        FM(SCIF_CLK_A)  F_(0, 0)                F_(0, 0)                        F_(0, 0)        F_(0, 0)        FM(STP_IVCXO27_1_D)     FM(REMOCON_A)   F_(0, 0)                F_(0, 0)        FM(TCLK1_A)     F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP17_11_8      FM(USB0_PWEN)           F_(0, 0)        F_(0, 0)                FM(SIM0_RST_C)                  F_(0, 0)        FM(TS_SCK1_D)   FM(STP_ISCLK_1_D)       FM(BPFCLK_B)    FM(RIF3_CLK_B)          F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) FM(HSCK2_C) F_(0, 0) F_(0, 0)
 #define IP17_15_12     FM(USB0_OVC)            F_(0, 0)        F_(0, 0)                FM(SIM0_D_C)                    F_(0, 0)        FM(TS_SDAT1_D)  FM(STP_ISD_1_D)         F_(0, 0)        FM(RIF3_SYNC_B)         F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) FM(HRX2_C) F_(0, 0) F_(0, 0)
@@ -469,7 +469,7 @@ FM(IP16_31_28)      IP16_31_28      FM(IP17_31_28)  IP17_31_28
 #define MOD_SEL0_9_8           FM(SEL_DRIF1_0)         FM(SEL_DRIF1_1)         FM(SEL_DRIF1_2)         F_(0, 0)
 #define MOD_SEL0_7_6           FM(SEL_DRIF0_0)         FM(SEL_DRIF0_1)         FM(SEL_DRIF0_2)         F_(0, 0)
 #define MOD_SEL0_5             FM(SEL_CANFD0_0)        FM(SEL_CANFD0_1)
-#define MOD_SEL0_4_3           FM(SEL_ADGA_0)          FM(SEL_ADGA_1)          FM(SEL_ADGA_2)          FM(SEL_ADGA_3)
+#define MOD_SEL0_4_3           FM(SEL_ADG_A_0)         FM(SEL_ADG_A_1)         FM(SEL_ADG_A_2)         FM(SEL_ADG_A_3)
 
 /* MOD_SEL1 */                 /* 0 */                 /* 1 */                 /* 2 */                 /* 3 */                 /* 4 */                 /* 5 */                 /* 6 */                 /* 7 */
 #define MOD_SEL1_31_30         FM(SEL_TSIF1_0)         FM(SEL_TSIF1_1)         FM(SEL_TSIF1_2)         FM(SEL_TSIF1_3)
@@ -502,12 +502,12 @@ FM(IP16_31_28)    IP16_31_28      FM(IP17_31_28)  IP17_31_28
 #define MOD_SEL2_28_27         FM(SEL_FM_0)            FM(SEL_FM_1)            FM(SEL_FM_2)            FM(SEL_FM_3)
 #define MOD_SEL2_26            FM(SEL_SCIF5_0)         FM(SEL_SCIF5_1)
 #define MOD_SEL2_25_24_23      FM(SEL_I2C6_0)          FM(SEL_I2C6_1)          FM(SEL_I2C6_2)          F_(0, 0)                F_(0, 0)                F_(0, 0)                F_(0, 0)                F_(0, 0)
-#define MOD_SEL2_22            FM(SEL_NDF_0)           FM(SEL_NDF_1)
+#define MOD_SEL2_22            FM(SEL_NDFC_0)          FM(SEL_NDFC_1)
 #define MOD_SEL2_21            FM(SEL_SSI2_0)          FM(SEL_SSI2_1)
 #define MOD_SEL2_20            FM(SEL_SSI9_0)          FM(SEL_SSI9_1)
 #define MOD_SEL2_19            FM(SEL_TIMER_TMU2_0)    FM(SEL_TIMER_TMU2_1)
-#define MOD_SEL2_18            FM(SEL_ADGB_0)          FM(SEL_ADGB_1)
-#define MOD_SEL2_17            FM(SEL_ADGC_0)          FM(SEL_ADGC_1)
+#define MOD_SEL2_18            FM(SEL_ADG_B_0)         FM(SEL_ADG_B_1)
+#define MOD_SEL2_17            FM(SEL_ADG_C_0)         FM(SEL_ADG_C_1)
 #define MOD_SEL2_0             FM(SEL_VIN4_0)          FM(SEL_VIN4_1)
 
 #define PINMUX_MOD_SELS        \
@@ -559,6 +559,9 @@ MOD_SEL0_4_3                MOD_SEL1_4 \
        FM(DU_DOTCLKIN0) FM(DU_DOTCLKIN1) FM(DU_DOTCLKIN2) \
        FM(TMS) FM(TDO) FM(ASEBRK) FM(MLB_REF) FM(TDI) FM(TCK) FM(TRST) FM(EXTALR)
 
+#define PINMUX_PHYS \
+       FM(SCL0) FM(SDA0) FM(SCL3) FM(SDA3) FM(SCL5) FM(SDA5)
+
 enum {
        PINMUX_RESERVED = 0,
 
@@ -584,6 +587,7 @@ enum {
        PINMUX_IPSR
        PINMUX_MOD_SELS
        PINMUX_STATIC
+       PINMUX_PHYS
        PINMUX_MARK_END,
 #undef F_
 #undef FM
@@ -596,7 +600,7 @@ static const u16 pinmux_data[] = {
        PINMUX_SINGLE(AVS2),
        PINMUX_SINGLE(CLKOUT),
        PINMUX_SINGLE(GP7_03),
-       PINMUX_SINGLE(GP7_02),
+       PINMUX_SINGLE(HDMI0_CEC),
        PINMUX_SINGLE(MSIOF0_RXD),
        PINMUX_SINGLE(MSIOF0_SCK),
        PINMUX_SINGLE(MSIOF0_TXD),
@@ -620,13 +624,15 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_MSEL(IP0_15_12,     MSIOF2_SCK_C,           SEL_MSIOF2_2),
        PINMUX_IPSR_MSEL(IP0_15_12,     TX4_A,                  SEL_SCIF4_0),
 
-       PINMUX_IPSR_MSEL(IP0_19_16,     AVB_AVTP_MATCH_A,       SEL_ETHERAVB_0),
-       PINMUX_IPSR_MSEL(IP0_19_16,     MSIOF2_RXD_C,           SEL_MSIOF2_2),
-       PINMUX_IPSR_MSEL(IP0_19_16,     CTS4_N_A,               SEL_SCIF4_0),
+       PINMUX_IPSR_PHYS_MSEL(IP0_19_16, AVB_AVTP_MATCH_A,      I2C_SEL_5_0,    SEL_ETHERAVB_0),
+       PINMUX_IPSR_PHYS_MSEL(IP0_19_16, MSIOF2_RXD_C,          I2C_SEL_5_0,    SEL_MSIOF2_2),
+       PINMUX_IPSR_PHYS_MSEL(IP0_19_16, CTS4_N_A,              I2C_SEL_5_0,    SEL_SCIF4_0),
+       PINMUX_IPSR_PHYS(IP0_19_16,     SCL5,                   I2C_SEL_5_1),
 
-       PINMUX_IPSR_MSEL(IP0_23_20,     AVB_AVTP_CAPTURE_A,     SEL_ETHERAVB_0),
-       PINMUX_IPSR_MSEL(IP0_23_20,     MSIOF2_TXD_C,           SEL_MSIOF2_2),
-       PINMUX_IPSR_MSEL(IP0_23_20,     RTS4_N_A,               SEL_SCIF4_0),
+       PINMUX_IPSR_PHYS_MSEL(IP0_23_20, AVB_AVTP_CAPTURE_A,    I2C_SEL_5_0,    SEL_ETHERAVB_0),
+       PINMUX_IPSR_PHYS_MSEL(IP0_23_20, MSIOF2_TXD_C,          I2C_SEL_5_0,    SEL_MSIOF2_2),
+       PINMUX_IPSR_PHYS_MSEL(IP0_23_20, RTS4_N_A,              I2C_SEL_5_0,    SEL_SCIF4_0),
+       PINMUX_IPSR_PHYS(IP0_23_20,     SDA5,                   I2C_SEL_5_1),
 
        PINMUX_IPSR_GPSR(IP0_27_24,     IRQ0),
        PINMUX_IPSR_GPSR(IP0_27_24,     QPOLB),
@@ -678,14 +684,16 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_MSEL(IP1_19_16,     VI4_DATA6_B,            SEL_VIN4_1),
        PINMUX_IPSR_MSEL(IP1_19_16,     IECLK_B,                SEL_IEBUS_1),
 
-       PINMUX_IPSR_MSEL(IP1_23_20,     PWM1_A,                 SEL_PWM1_0),
-       PINMUX_IPSR_MSEL(IP1_23_20,     HRX3_D,                 SEL_HSCIF3_3),
-       PINMUX_IPSR_MSEL(IP1_23_20,     VI4_DATA7_B,            SEL_VIN4_1),
-       PINMUX_IPSR_MSEL(IP1_23_20,     IERX_B,                 SEL_IEBUS_1),
+       PINMUX_IPSR_PHYS_MSEL(IP1_23_20, PWM1_A,                I2C_SEL_3_0,    SEL_PWM1_0),
+       PINMUX_IPSR_PHYS_MSEL(IP1_23_20, HRX3_D,                I2C_SEL_3_0,    SEL_HSCIF3_3),
+       PINMUX_IPSR_PHYS_MSEL(IP1_23_20, VI4_DATA7_B,           I2C_SEL_3_0,    SEL_VIN4_1),
+       PINMUX_IPSR_PHYS_MSEL(IP1_23_20, IERX_B,                I2C_SEL_3_0,    SEL_IEBUS_1),
+       PINMUX_IPSR_PHYS(IP0_23_20,     SCL3,                   I2C_SEL_3_1),
 
-       PINMUX_IPSR_MSEL(IP1_27_24,     PWM2_A,                 SEL_PWM2_0),
-       PINMUX_IPSR_MSEL(IP1_27_24,     HTX3_D,                 SEL_HSCIF3_3),
-       PINMUX_IPSR_MSEL(IP1_27_24,     IETX_B,                 SEL_IEBUS_1),
+       PINMUX_IPSR_PHYS_MSEL(IP1_27_24, PWM2_A,                I2C_SEL_3_0,    SEL_PWM2_0),
+       PINMUX_IPSR_PHYS_MSEL(IP1_27_24, HTX3_D,                I2C_SEL_3_0,    SEL_HSCIF3_3),
+       PINMUX_IPSR_PHYS_MSEL(IP1_27_24, IETX_B,                I2C_SEL_3_0,    SEL_IEBUS_1),
+       PINMUX_IPSR_PHYS(IP1_27_24,     SDA3,                   I2C_SEL_3_1),
 
        PINMUX_IPSR_GPSR(IP1_31_28,     A0),
        PINMUX_IPSR_GPSR(IP1_31_28,     LCDOUT16),
@@ -1016,35 +1024,35 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_GPSR(IP8_15_12,     SD1_CMD),
        PINMUX_IPSR_MSEL(IP8_15_12,     MSIOF1_SYNC_G,          SEL_MSIOF1_6),
-       PINMUX_IPSR_MSEL(IP8_15_12,     NFCE_N_B,               SEL_NDF_1),
+       PINMUX_IPSR_MSEL(IP8_15_12,     NFCE_N_B,               SEL_NDFC_1),
        PINMUX_IPSR_MSEL(IP8_15_12,     SIM0_D_A,               SEL_SIMCARD_0),
        PINMUX_IPSR_MSEL(IP8_15_12,     STP_IVCXO27_1_B,        SEL_SSP1_1_1),
 
        PINMUX_IPSR_GPSR(IP8_19_16,     SD1_DAT0),
        PINMUX_IPSR_GPSR(IP8_19_16,     SD2_DAT4),
        PINMUX_IPSR_MSEL(IP8_19_16,     MSIOF1_RXD_G,           SEL_MSIOF1_6),
-       PINMUX_IPSR_MSEL(IP8_19_16,     NFWP_N_B,               SEL_NDF_1),
+       PINMUX_IPSR_MSEL(IP8_19_16,     NFWP_N_B,               SEL_NDFC_1),
        PINMUX_IPSR_MSEL(IP8_19_16,     TS_SCK1_B,              SEL_TSIF1_1),
        PINMUX_IPSR_MSEL(IP8_19_16,     STP_ISCLK_1_B,          SEL_SSP1_1_1),
 
        PINMUX_IPSR_GPSR(IP8_23_20,     SD1_DAT1),
        PINMUX_IPSR_GPSR(IP8_23_20,     SD2_DAT5),
        PINMUX_IPSR_MSEL(IP8_23_20,     MSIOF1_TXD_G,           SEL_MSIOF1_6),
-       PINMUX_IPSR_MSEL(IP8_23_20,     NFDATA14_B,             SEL_NDF_1),
+       PINMUX_IPSR_MSEL(IP8_23_20,     NFDATA14_B,             SEL_NDFC_1),
        PINMUX_IPSR_MSEL(IP8_23_20,     TS_SPSYNC1_B,           SEL_TSIF1_1),
        PINMUX_IPSR_MSEL(IP8_23_20,     STP_ISSYNC_1_B,         SEL_SSP1_1_1),
 
        PINMUX_IPSR_GPSR(IP8_27_24,     SD1_DAT2),
        PINMUX_IPSR_GPSR(IP8_27_24,     SD2_DAT6),
        PINMUX_IPSR_MSEL(IP8_27_24,     MSIOF1_SS1_G,           SEL_MSIOF1_6),
-       PINMUX_IPSR_MSEL(IP8_27_24,     NFDATA15_B,             SEL_NDF_1),
+       PINMUX_IPSR_MSEL(IP8_27_24,     NFDATA15_B,             SEL_NDFC_1),
        PINMUX_IPSR_MSEL(IP8_27_24,     TS_SDAT1_B,             SEL_TSIF1_1),
        PINMUX_IPSR_MSEL(IP8_27_24,     STP_ISD_1_B,            SEL_SSP1_1_1),
 
        PINMUX_IPSR_GPSR(IP8_31_28,     SD1_DAT3),
        PINMUX_IPSR_GPSR(IP8_31_28,     SD2_DAT7),
        PINMUX_IPSR_MSEL(IP8_31_28,     MSIOF1_SS2_G,           SEL_MSIOF1_6),
-       PINMUX_IPSR_MSEL(IP8_31_28,     NFRB_N_B,               SEL_NDF_1),
+       PINMUX_IPSR_MSEL(IP8_31_28,     NFRB_N_B,               SEL_NDFC_1),
        PINMUX_IPSR_MSEL(IP8_31_28,     TS_SDEN1_B,             SEL_TSIF1_1),
        PINMUX_IPSR_MSEL(IP8_31_28,     STP_ISEN_1_B,           SEL_SSP1_1_1),
 
@@ -1110,26 +1118,28 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_GPSR(IP11_7_4,      NFCLE),
 
        PINMUX_IPSR_GPSR(IP11_11_8,     SD0_CD),
-       PINMUX_IPSR_MSEL(IP11_11_8,     NFDATA14_A,             SEL_NDF_0),
+       PINMUX_IPSR_MSEL(IP11_11_8,     NFDATA14_A,             SEL_NDFC_0),
        PINMUX_IPSR_MSEL(IP11_11_8,     SCL2_B,                 SEL_I2C2_1),
        PINMUX_IPSR_MSEL(IP11_11_8,     SIM0_RST_A,             SEL_SIMCARD_0),
 
        PINMUX_IPSR_GPSR(IP11_15_12,    SD0_WP),
-       PINMUX_IPSR_MSEL(IP11_15_12,    NFDATA15_A,             SEL_NDF_0),
+       PINMUX_IPSR_MSEL(IP11_15_12,    NFDATA15_A,             SEL_NDFC_0),
        PINMUX_IPSR_MSEL(IP11_15_12,    SDA2_B,                 SEL_I2C2_1),
 
-       PINMUX_IPSR_GPSR(IP11_19_16,    SD1_CD),
-       PINMUX_IPSR_MSEL(IP11_19_16,    NFRB_N_A,               SEL_NDF_0),
-       PINMUX_IPSR_MSEL(IP11_19_16,    SIM0_CLK_B,             SEL_SIMCARD_1),
+       PINMUX_IPSR_MSEL(IP11_19_16,    SD1_CD,                 I2C_SEL_0_0),
+       PINMUX_IPSR_PHYS_MSEL(IP11_19_16, NFRB_N_A,             I2C_SEL_0_0,    SEL_NDFC_0),
+       PINMUX_IPSR_PHYS_MSEL(IP11_19_16, SIM0_CLK_B,           I2C_SEL_0_0,    SEL_SIMCARD_1),
+       PINMUX_IPSR_PHYS(IP11_19_16,    SCL0,                   I2C_SEL_0_1),
 
-       PINMUX_IPSR_GPSR(IP11_23_20,    SD1_WP),
-       PINMUX_IPSR_MSEL(IP11_23_20,    NFCE_N_A,               SEL_NDF_0),
-       PINMUX_IPSR_MSEL(IP11_23_20,    SIM0_D_B,               SEL_SIMCARD_1),
+       PINMUX_IPSR_MSEL(IP11_23_20,    SD1_WP,                 I2C_SEL_0_0),
+       PINMUX_IPSR_PHYS_MSEL(IP11_23_20, NFCE_N_A,             I2C_SEL_0_0,    SEL_NDFC_0),
+       PINMUX_IPSR_PHYS_MSEL(IP11_23_20, SIM0_D_B,             I2C_SEL_0_0,    SEL_SIMCARD_1),
+       PINMUX_IPSR_PHYS(IP11_23_20,    SDA0,                   I2C_SEL_0_1),
 
        PINMUX_IPSR_GPSR(IP11_27_24,    SCK0),
        PINMUX_IPSR_MSEL(IP11_27_24,    HSCK1_B,                SEL_HSCIF1_1),
        PINMUX_IPSR_MSEL(IP11_27_24,    MSIOF1_SS2_B,           SEL_MSIOF1_1),
-       PINMUX_IPSR_MSEL(IP11_27_24,    AUDIO_CLKC_B,           SEL_ADGC_1),
+       PINMUX_IPSR_MSEL(IP11_27_24,    AUDIO_CLKC_B,           SEL_ADG_C_1),
        PINMUX_IPSR_MSEL(IP11_27_24,    SDA2_A,                 SEL_I2C2_0),
        PINMUX_IPSR_MSEL(IP11_27_24,    SIM0_RST_B,             SEL_SIMCARD_1),
        PINMUX_IPSR_MSEL(IP11_27_24,    STP_OPWM_0_C,           SEL_SSP1_0_2),
@@ -1162,7 +1172,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_GPSR(IP12_11_8,     RTS0_N),
        PINMUX_IPSR_MSEL(IP12_11_8,     HRTS1_N_B,              SEL_HSCIF1_1),
        PINMUX_IPSR_MSEL(IP12_11_8,     MSIOF1_SS1_B,           SEL_MSIOF1_1),
-       PINMUX_IPSR_MSEL(IP12_11_8,     AUDIO_CLKA_B,           SEL_ADGA_1),
+       PINMUX_IPSR_MSEL(IP12_11_8,     AUDIO_CLKA_B,           SEL_ADG_A_1),
        PINMUX_IPSR_MSEL(IP12_11_8,     SCL2_A,                 SEL_I2C2_0),
        PINMUX_IPSR_MSEL(IP12_11_8,     STP_IVCXO27_1_C,        SEL_SSP1_1_2),
        PINMUX_IPSR_MSEL(IP12_11_8,     RIF0_SYNC_B,            SEL_DRIF0_1),
@@ -1221,7 +1231,7 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_GPSR(IP13_11_8,     HSCK0),
        PINMUX_IPSR_MSEL(IP13_11_8,     MSIOF1_SCK_D,           SEL_MSIOF1_3),
-       PINMUX_IPSR_MSEL(IP13_11_8,     AUDIO_CLKB_A,           SEL_ADGB_0),
+       PINMUX_IPSR_MSEL(IP13_11_8,     AUDIO_CLKB_A,           SEL_ADG_B_0),
        PINMUX_IPSR_MSEL(IP13_11_8,     SSI_SDATA1_B,           SEL_SSI1_1),
        PINMUX_IPSR_MSEL(IP13_11_8,     TS_SCK0_D,              SEL_TSIF0_3),
        PINMUX_IPSR_MSEL(IP13_11_8,     STP_ISCLK_0_D,          SEL_SSP1_0_3),
@@ -1267,8 +1277,8 @@ static const u16 pinmux_data[] = {
        /* IPSR14 */
        PINMUX_IPSR_GPSR(IP14_3_0,      MSIOF0_SS1),
        PINMUX_IPSR_MSEL(IP14_3_0,      RX5_A,                  SEL_SCIF5_0),
-       PINMUX_IPSR_MSEL(IP14_3_0,      NFWP_N_A,               SEL_NDF_0),
-       PINMUX_IPSR_MSEL(IP14_3_0,      AUDIO_CLKA_C,           SEL_ADGA_2),
+       PINMUX_IPSR_MSEL(IP14_3_0,      NFWP_N_A,               SEL_NDFC_0),
+       PINMUX_IPSR_MSEL(IP14_3_0,      AUDIO_CLKA_C,           SEL_ADG_A_2),
        PINMUX_IPSR_MSEL(IP14_3_0,      SSI_SCK2_A,             SEL_SSI2_0),
        PINMUX_IPSR_MSEL(IP14_3_0,      STP_IVCXO27_0_C,        SEL_SSP1_0_2),
        PINMUX_IPSR_GPSR(IP14_3_0,      AUDIO_CLKOUT3_A),
@@ -1277,7 +1287,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_GPSR(IP14_7_4,      MSIOF0_SS2),
        PINMUX_IPSR_MSEL(IP14_7_4,      TX5_A,                  SEL_SCIF5_0),
        PINMUX_IPSR_MSEL(IP14_7_4,      MSIOF1_SS2_D,           SEL_MSIOF1_3),
-       PINMUX_IPSR_MSEL(IP14_7_4,      AUDIO_CLKC_A,           SEL_ADGC_0),
+       PINMUX_IPSR_MSEL(IP14_7_4,      AUDIO_CLKC_A,           SEL_ADG_C_0),
        PINMUX_IPSR_MSEL(IP14_7_4,      SSI_WS2_A,              SEL_SSI2_0),
        PINMUX_IPSR_MSEL(IP14_7_4,      STP_OPWM_0_D,           SEL_SSP1_0_3),
        PINMUX_IPSR_GPSR(IP14_7_4,      AUDIO_CLKOUT_D),
@@ -1405,9 +1415,10 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_MSEL(IP16_31_28,    SCK5_A,                 SEL_SCIF5_0),
 
        /* IPSR17 */
-       PINMUX_IPSR_MSEL(IP17_3_0,      AUDIO_CLKA_A,           SEL_ADGA_0),
+       PINMUX_IPSR_MSEL(IP17_3_0,      AUDIO_CLKA_A,           SEL_ADG_A_0),
+       PINMUX_IPSR_GPSR(IP17_3_0,      CC5_OSCOUT),
 
-       PINMUX_IPSR_MSEL(IP17_7_4,      AUDIO_CLKB_B,           SEL_ADGB_1),
+       PINMUX_IPSR_MSEL(IP17_7_4,      AUDIO_CLKB_B,           SEL_ADG_B_1),
        PINMUX_IPSR_MSEL(IP17_7_4,      SCIF_CLK_A,             SEL_SCIF_0),
        PINMUX_IPSR_MSEL(IP17_7_4,      STP_IVCXO27_1_D,        SEL_SSP1_1_3),
        PINMUX_IPSR_MSEL(IP17_7_4,      REMOCON_A,              SEL_REMOCON_0),
@@ -1498,10 +1509,10 @@ static const u16 pinmux_data[] = {
 
 /*
  * Static pins can not be muxed between different functions but
- * still needs a mark entry in the pinmux list. Add each static
+ * still need mark entries in the pinmux list. Add each static
  * pin to the list without an associated function. The sh-pfc
- * core will do the right thing and skip trying to mux then pin
- * while still applying configuration to it
+ * core will do the right thing and skip trying to mux the pin
+ * while still applying configuration to it.
  */
 #define FM(x)   PINMUX_DATA(x##_MARK, 0),
        PINMUX_STATIC
@@ -2132,23 +2143,13 @@ static const unsigned int du_disp_mux[] = {
        DU_DISP_MARK,
 };
 
-/* - GP7_02/03 -------------------------------------------------------------- */
-static const unsigned int gp7_02_pins[] = {
-       /* GP7_02 */
+/* - HDMI ------------------------------------------------------------------- */
+static const unsigned int hdmi0_cec_pins[] = {
+       /* HDMI0_CEC */
        RCAR_GP_PIN(7, 2),
 };
-
-static const unsigned int gp7_02_mux[] = {
-       GP7_02_MARK,
-};
-
-static const unsigned int gp7_03_pins[] = {
-       /* GP7_03 */
-       RCAR_GP_PIN(7, 3),
-};
-
-static const unsigned int gp7_03_mux[] = {
-       GP7_03_MARK,
+static const unsigned int hdmi0_cec_mux[] = {
+       HDMI0_CEC_MARK,
 };
 
 /* - HSCIF0 ----------------------------------------------------------------- */
@@ -2359,6 +2360,15 @@ static const unsigned int hscif4_data_b_mux[] = {
 };
 
 /* - I2C -------------------------------------------------------------------- */
+static const unsigned int i2c0_pins[] = {
+       /* SCL, SDA */
+       RCAR_GP_PIN(3, 14), RCAR_GP_PIN(3, 15),
+};
+
+static const unsigned int i2c0_mux[] = {
+       SCL0_MARK, SDA0_MARK,
+};
+
 static const unsigned int i2c1_a_pins[] = {
        /* SDA, SCL */
        RCAR_GP_PIN(5, 11), RCAR_GP_PIN(5, 10),
@@ -2387,6 +2397,25 @@ static const unsigned int i2c2_b_pins[] = {
 static const unsigned int i2c2_b_mux[] = {
        SDA2_B_MARK, SCL2_B_MARK,
 };
+
+static const unsigned int i2c3_pins[] = {
+       /* SCL, SDA */
+       RCAR_GP_PIN(2, 7), RCAR_GP_PIN(2, 8),
+};
+
+static const unsigned int i2c3_mux[] = {
+       SCL3_MARK, SDA3_MARK,
+};
+
+static const unsigned int i2c5_pins[] = {
+       /* SCL, SDA */
+       RCAR_GP_PIN(2, 13), RCAR_GP_PIN(2, 14),
+};
+
+static const unsigned int i2c5_mux[] = {
+       SCL5_MARK, SDA5_MARK,
+};
+
 static const unsigned int i2c6_a_pins[] = {
        /* SDA, SCL */
        RCAR_GP_PIN(1, 8), RCAR_GP_PIN(1, 11),
@@ -3131,7 +3160,7 @@ static const unsigned int msiof3_ss1_e_mux[] = {
        MSIOF3_SS1_E_MARK,
 };
 static const unsigned int msiof3_ss2_e_pins[] = {
-       /* SS1 */
+       /* SS2 */
        RCAR_GP_PIN(2, 0),
 };
 static const unsigned int msiof3_ss2_e_mux[] = {
@@ -4044,67 +4073,29 @@ static const unsigned int vin4_clk_mux[] = {
 };
 
 /* - VIN5 ------------------------------------------------------------------- */
-static const unsigned int vin5_data8_pins[] = {
-       RCAR_GP_PIN(0, 0), RCAR_GP_PIN(0, 1),
-       RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3),
-       RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
-       RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7),
-};
-static const unsigned int vin5_data8_mux[] = {
-       VI5_DATA0_MARK, VI5_DATA1_MARK,
-       VI5_DATA2_MARK, VI5_DATA3_MARK,
-       VI5_DATA4_MARK, VI5_DATA5_MARK,
-       VI5_DATA6_MARK, VI5_DATA7_MARK,
-};
-static const unsigned int vin5_data10_pins[] = {
-       RCAR_GP_PIN(0, 0), RCAR_GP_PIN(0, 1),
-       RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3),
-       RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
-       RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7),
-       RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 13),
-};
-static const unsigned int vin5_data10_mux[] = {
-       VI5_DATA0_MARK, VI5_DATA1_MARK,
-       VI5_DATA2_MARK, VI5_DATA3_MARK,
-       VI5_DATA4_MARK, VI5_DATA5_MARK,
-       VI5_DATA6_MARK, VI5_DATA7_MARK,
-       VI5_DATA8_MARK,  VI5_DATA9_MARK,
-};
-static const unsigned int vin5_data12_pins[] = {
-       RCAR_GP_PIN(0, 0), RCAR_GP_PIN(0, 1),
-       RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3),
-       RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
-       RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7),
-       RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 13),
-       RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 15),
-};
-static const unsigned int vin5_data12_mux[] = {
-       VI5_DATA0_MARK, VI5_DATA1_MARK,
-       VI5_DATA2_MARK, VI5_DATA3_MARK,
-       VI5_DATA4_MARK, VI5_DATA5_MARK,
-       VI5_DATA6_MARK, VI5_DATA7_MARK,
-       VI5_DATA8_MARK,  VI5_DATA9_MARK,
-       VI5_DATA10_MARK, VI5_DATA11_MARK,
-};
-static const unsigned int vin5_data16_pins[] = {
-       RCAR_GP_PIN(0, 0), RCAR_GP_PIN(0, 1),
-       RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3),
-       RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
-       RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7),
-       RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 13),
-       RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 15),
-       RCAR_GP_PIN(1, 4), RCAR_GP_PIN(1, 5),
-       RCAR_GP_PIN(1, 6), RCAR_GP_PIN(1, 7),
+static const union vin_data16 vin5_data_pins = {
+       .data16 = {
+               RCAR_GP_PIN(0, 0), RCAR_GP_PIN(0, 1),
+               RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3),
+               RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
+               RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7),
+               RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 13),
+               RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 15),
+               RCAR_GP_PIN(1, 4), RCAR_GP_PIN(1, 5),
+               RCAR_GP_PIN(1, 6), RCAR_GP_PIN(1, 7),
+       },
 };
-static const unsigned int vin5_data16_mux[] = {
-       VI5_DATA0_MARK, VI5_DATA1_MARK,
-       VI5_DATA2_MARK, VI5_DATA3_MARK,
-       VI5_DATA4_MARK, VI5_DATA5_MARK,
-       VI5_DATA6_MARK, VI5_DATA7_MARK,
-       VI5_DATA8_MARK,  VI5_DATA9_MARK,
-       VI5_DATA10_MARK, VI5_DATA11_MARK,
-       VI5_DATA12_MARK, VI5_DATA13_MARK,
-       VI5_DATA14_MARK, VI5_DATA15_MARK,
+static const union vin_data16 vin5_data_mux = {
+       .data16 = {
+               VI5_DATA0_MARK, VI5_DATA1_MARK,
+               VI5_DATA2_MARK, VI5_DATA3_MARK,
+               VI5_DATA4_MARK, VI5_DATA5_MARK,
+               VI5_DATA6_MARK, VI5_DATA7_MARK,
+               VI5_DATA8_MARK,  VI5_DATA9_MARK,
+               VI5_DATA10_MARK, VI5_DATA11_MARK,
+               VI5_DATA12_MARK, VI5_DATA13_MARK,
+               VI5_DATA14_MARK, VI5_DATA15_MARK,
+       },
 };
 static const unsigned int vin5_sync_pins[] = {
        /* HSYNC#, VSYNC# */
@@ -4135,348 +4126,357 @@ static const unsigned int vin5_clk_mux[] = {
        VI5_CLK_MARK,
 };
 
-static const struct sh_pfc_pin_group pinmux_groups[] = {
-       SH_PFC_PIN_GROUP(audio_clk_a_a),
-       SH_PFC_PIN_GROUP(audio_clk_a_b),
-       SH_PFC_PIN_GROUP(audio_clk_a_c),
-       SH_PFC_PIN_GROUP(audio_clk_b_a),
-       SH_PFC_PIN_GROUP(audio_clk_b_b),
-       SH_PFC_PIN_GROUP(audio_clk_c_a),
-       SH_PFC_PIN_GROUP(audio_clk_c_b),
-       SH_PFC_PIN_GROUP(audio_clkout_a),
-       SH_PFC_PIN_GROUP(audio_clkout_b),
-       SH_PFC_PIN_GROUP(audio_clkout_c),
-       SH_PFC_PIN_GROUP(audio_clkout_d),
-       SH_PFC_PIN_GROUP(audio_clkout1_a),
-       SH_PFC_PIN_GROUP(audio_clkout1_b),
-       SH_PFC_PIN_GROUP(audio_clkout2_a),
-       SH_PFC_PIN_GROUP(audio_clkout2_b),
-       SH_PFC_PIN_GROUP(audio_clkout3_a),
-       SH_PFC_PIN_GROUP(audio_clkout3_b),
-       SH_PFC_PIN_GROUP(avb_link),
-       SH_PFC_PIN_GROUP(avb_magic),
-       SH_PFC_PIN_GROUP(avb_phy_int),
-       SH_PFC_PIN_GROUP_ALIAS(avb_mdc, avb_mdio),      /* Deprecated */
-       SH_PFC_PIN_GROUP(avb_mdio),
-       SH_PFC_PIN_GROUP(avb_mii),
-       SH_PFC_PIN_GROUP(avb_avtp_pps),
-       SH_PFC_PIN_GROUP(avb_avtp_match_a),
-       SH_PFC_PIN_GROUP(avb_avtp_capture_a),
-       SH_PFC_PIN_GROUP(avb_avtp_match_b),
-       SH_PFC_PIN_GROUP(avb_avtp_capture_b),
-       SH_PFC_PIN_GROUP(can0_data_a),
-       SH_PFC_PIN_GROUP(can0_data_b),
-       SH_PFC_PIN_GROUP(can1_data),
-       SH_PFC_PIN_GROUP(can_clk),
-       SH_PFC_PIN_GROUP(canfd0_data_a),
-       SH_PFC_PIN_GROUP(canfd0_data_b),
-       SH_PFC_PIN_GROUP(canfd1_data),
-       SH_PFC_PIN_GROUP(drif0_ctrl_a),
-       SH_PFC_PIN_GROUP(drif0_data0_a),
-       SH_PFC_PIN_GROUP(drif0_data1_a),
-       SH_PFC_PIN_GROUP(drif0_ctrl_b),
-       SH_PFC_PIN_GROUP(drif0_data0_b),
-       SH_PFC_PIN_GROUP(drif0_data1_b),
-       SH_PFC_PIN_GROUP(drif0_ctrl_c),
-       SH_PFC_PIN_GROUP(drif0_data0_c),
-       SH_PFC_PIN_GROUP(drif0_data1_c),
-       SH_PFC_PIN_GROUP(drif1_ctrl_a),
-       SH_PFC_PIN_GROUP(drif1_data0_a),
-       SH_PFC_PIN_GROUP(drif1_data1_a),
-       SH_PFC_PIN_GROUP(drif1_ctrl_b),
-       SH_PFC_PIN_GROUP(drif1_data0_b),
-       SH_PFC_PIN_GROUP(drif1_data1_b),
-       SH_PFC_PIN_GROUP(drif1_ctrl_c),
-       SH_PFC_PIN_GROUP(drif1_data0_c),
-       SH_PFC_PIN_GROUP(drif1_data1_c),
-       SH_PFC_PIN_GROUP(drif2_ctrl_a),
-       SH_PFC_PIN_GROUP(drif2_data0_a),
-       SH_PFC_PIN_GROUP(drif2_data1_a),
-       SH_PFC_PIN_GROUP(drif2_ctrl_b),
-       SH_PFC_PIN_GROUP(drif2_data0_b),
-       SH_PFC_PIN_GROUP(drif2_data1_b),
-       SH_PFC_PIN_GROUP(drif3_ctrl_a),
-       SH_PFC_PIN_GROUP(drif3_data0_a),
-       SH_PFC_PIN_GROUP(drif3_data1_a),
-       SH_PFC_PIN_GROUP(drif3_ctrl_b),
-       SH_PFC_PIN_GROUP(drif3_data0_b),
-       SH_PFC_PIN_GROUP(drif3_data1_b),
-       SH_PFC_PIN_GROUP(du_rgb666),
-       SH_PFC_PIN_GROUP(du_rgb888),
-       SH_PFC_PIN_GROUP(du_clk_out_0),
-       SH_PFC_PIN_GROUP(du_clk_out_1),
-       SH_PFC_PIN_GROUP(du_sync),
-       SH_PFC_PIN_GROUP(du_oddf),
-       SH_PFC_PIN_GROUP(du_cde),
-       SH_PFC_PIN_GROUP(du_disp),
-       SH_PFC_PIN_GROUP(gp7_02),
-       SH_PFC_PIN_GROUP(gp7_03),
-       SH_PFC_PIN_GROUP(hscif0_data),
-       SH_PFC_PIN_GROUP(hscif0_clk),
-       SH_PFC_PIN_GROUP(hscif0_ctrl),
-       SH_PFC_PIN_GROUP(hscif1_data_a),
-       SH_PFC_PIN_GROUP(hscif1_clk_a),
-       SH_PFC_PIN_GROUP(hscif1_ctrl_a),
-       SH_PFC_PIN_GROUP(hscif1_data_b),
-       SH_PFC_PIN_GROUP(hscif1_clk_b),
-       SH_PFC_PIN_GROUP(hscif1_ctrl_b),
-       SH_PFC_PIN_GROUP(hscif2_data_a),
-       SH_PFC_PIN_GROUP(hscif2_clk_a),
-       SH_PFC_PIN_GROUP(hscif2_ctrl_a),
-       SH_PFC_PIN_GROUP(hscif2_data_b),
-       SH_PFC_PIN_GROUP(hscif2_clk_b),
-       SH_PFC_PIN_GROUP(hscif2_ctrl_b),
-       SH_PFC_PIN_GROUP(hscif2_data_c),
-       SH_PFC_PIN_GROUP(hscif2_clk_c),
-       SH_PFC_PIN_GROUP(hscif2_ctrl_c),
-       SH_PFC_PIN_GROUP(hscif3_data_a),
-       SH_PFC_PIN_GROUP(hscif3_clk),
-       SH_PFC_PIN_GROUP(hscif3_ctrl),
-       SH_PFC_PIN_GROUP(hscif3_data_b),
-       SH_PFC_PIN_GROUP(hscif3_data_c),
-       SH_PFC_PIN_GROUP(hscif3_data_d),
-       SH_PFC_PIN_GROUP(hscif4_data_a),
-       SH_PFC_PIN_GROUP(hscif4_clk),
-       SH_PFC_PIN_GROUP(hscif4_ctrl),
-       SH_PFC_PIN_GROUP(hscif4_data_b),
-       SH_PFC_PIN_GROUP(i2c1_a),
-       SH_PFC_PIN_GROUP(i2c1_b),
-       SH_PFC_PIN_GROUP(i2c2_a),
-       SH_PFC_PIN_GROUP(i2c2_b),
-       SH_PFC_PIN_GROUP(i2c6_a),
-       SH_PFC_PIN_GROUP(i2c6_b),
-       SH_PFC_PIN_GROUP(i2c6_c),
-       SH_PFC_PIN_GROUP(intc_ex_irq0),
-       SH_PFC_PIN_GROUP(intc_ex_irq1),
-       SH_PFC_PIN_GROUP(intc_ex_irq2),
-       SH_PFC_PIN_GROUP(intc_ex_irq3),
-       SH_PFC_PIN_GROUP(intc_ex_irq4),
-       SH_PFC_PIN_GROUP(intc_ex_irq5),
-       SH_PFC_PIN_GROUP(msiof0_clk),
-       SH_PFC_PIN_GROUP(msiof0_sync),
-       SH_PFC_PIN_GROUP(msiof0_ss1),
-       SH_PFC_PIN_GROUP(msiof0_ss2),
-       SH_PFC_PIN_GROUP(msiof0_txd),
-       SH_PFC_PIN_GROUP(msiof0_rxd),
-       SH_PFC_PIN_GROUP(msiof1_clk_a),
-       SH_PFC_PIN_GROUP(msiof1_sync_a),
-       SH_PFC_PIN_GROUP(msiof1_ss1_a),
-       SH_PFC_PIN_GROUP(msiof1_ss2_a),
-       SH_PFC_PIN_GROUP(msiof1_txd_a),
-       SH_PFC_PIN_GROUP(msiof1_rxd_a),
-       SH_PFC_PIN_GROUP(msiof1_clk_b),
-       SH_PFC_PIN_GROUP(msiof1_sync_b),
-       SH_PFC_PIN_GROUP(msiof1_ss1_b),
-       SH_PFC_PIN_GROUP(msiof1_ss2_b),
-       SH_PFC_PIN_GROUP(msiof1_txd_b),
-       SH_PFC_PIN_GROUP(msiof1_rxd_b),
-       SH_PFC_PIN_GROUP(msiof1_clk_c),
-       SH_PFC_PIN_GROUP(msiof1_sync_c),
-       SH_PFC_PIN_GROUP(msiof1_ss1_c),
-       SH_PFC_PIN_GROUP(msiof1_ss2_c),
-       SH_PFC_PIN_GROUP(msiof1_txd_c),
-       SH_PFC_PIN_GROUP(msiof1_rxd_c),
-       SH_PFC_PIN_GROUP(msiof1_clk_d),
-       SH_PFC_PIN_GROUP(msiof1_sync_d),
-       SH_PFC_PIN_GROUP(msiof1_ss1_d),
-       SH_PFC_PIN_GROUP(msiof1_ss2_d),
-       SH_PFC_PIN_GROUP(msiof1_txd_d),
-       SH_PFC_PIN_GROUP(msiof1_rxd_d),
-       SH_PFC_PIN_GROUP(msiof1_clk_e),
-       SH_PFC_PIN_GROUP(msiof1_sync_e),
-       SH_PFC_PIN_GROUP(msiof1_ss1_e),
-       SH_PFC_PIN_GROUP(msiof1_ss2_e),
-       SH_PFC_PIN_GROUP(msiof1_txd_e),
-       SH_PFC_PIN_GROUP(msiof1_rxd_e),
-       SH_PFC_PIN_GROUP(msiof1_clk_f),
-       SH_PFC_PIN_GROUP(msiof1_sync_f),
-       SH_PFC_PIN_GROUP(msiof1_ss1_f),
-       SH_PFC_PIN_GROUP(msiof1_ss2_f),
-       SH_PFC_PIN_GROUP(msiof1_txd_f),
-       SH_PFC_PIN_GROUP(msiof1_rxd_f),
-       SH_PFC_PIN_GROUP(msiof1_clk_g),
-       SH_PFC_PIN_GROUP(msiof1_sync_g),
-       SH_PFC_PIN_GROUP(msiof1_ss1_g),
-       SH_PFC_PIN_GROUP(msiof1_ss2_g),
-       SH_PFC_PIN_GROUP(msiof1_txd_g),
-       SH_PFC_PIN_GROUP(msiof1_rxd_g),
-       SH_PFC_PIN_GROUP(msiof2_clk_a),
-       SH_PFC_PIN_GROUP(msiof2_sync_a),
-       SH_PFC_PIN_GROUP(msiof2_ss1_a),
-       SH_PFC_PIN_GROUP(msiof2_ss2_a),
-       SH_PFC_PIN_GROUP(msiof2_txd_a),
-       SH_PFC_PIN_GROUP(msiof2_rxd_a),
-       SH_PFC_PIN_GROUP(msiof2_clk_b),
-       SH_PFC_PIN_GROUP(msiof2_sync_b),
-       SH_PFC_PIN_GROUP(msiof2_ss1_b),
-       SH_PFC_PIN_GROUP(msiof2_ss2_b),
-       SH_PFC_PIN_GROUP(msiof2_txd_b),
-       SH_PFC_PIN_GROUP(msiof2_rxd_b),
-       SH_PFC_PIN_GROUP(msiof2_clk_c),
-       SH_PFC_PIN_GROUP(msiof2_sync_c),
-       SH_PFC_PIN_GROUP(msiof2_ss1_c),
-       SH_PFC_PIN_GROUP(msiof2_ss2_c),
-       SH_PFC_PIN_GROUP(msiof2_txd_c),
-       SH_PFC_PIN_GROUP(msiof2_rxd_c),
-       SH_PFC_PIN_GROUP(msiof2_clk_d),
-       SH_PFC_PIN_GROUP(msiof2_sync_d),
-       SH_PFC_PIN_GROUP(msiof2_ss1_d),
-       SH_PFC_PIN_GROUP(msiof2_ss2_d),
-       SH_PFC_PIN_GROUP(msiof2_txd_d),
-       SH_PFC_PIN_GROUP(msiof2_rxd_d),
-       SH_PFC_PIN_GROUP(msiof3_clk_a),
-       SH_PFC_PIN_GROUP(msiof3_sync_a),
-       SH_PFC_PIN_GROUP(msiof3_ss1_a),
-       SH_PFC_PIN_GROUP(msiof3_ss2_a),
-       SH_PFC_PIN_GROUP(msiof3_txd_a),
-       SH_PFC_PIN_GROUP(msiof3_rxd_a),
-       SH_PFC_PIN_GROUP(msiof3_clk_b),
-       SH_PFC_PIN_GROUP(msiof3_sync_b),
-       SH_PFC_PIN_GROUP(msiof3_ss1_b),
-       SH_PFC_PIN_GROUP(msiof3_ss2_b),
-       SH_PFC_PIN_GROUP(msiof3_txd_b),
-       SH_PFC_PIN_GROUP(msiof3_rxd_b),
-       SH_PFC_PIN_GROUP(msiof3_clk_c),
-       SH_PFC_PIN_GROUP(msiof3_sync_c),
-       SH_PFC_PIN_GROUP(msiof3_txd_c),
-       SH_PFC_PIN_GROUP(msiof3_rxd_c),
-       SH_PFC_PIN_GROUP(msiof3_clk_d),
-       SH_PFC_PIN_GROUP(msiof3_sync_d),
-       SH_PFC_PIN_GROUP(msiof3_ss1_d),
-       SH_PFC_PIN_GROUP(msiof3_txd_d),
-       SH_PFC_PIN_GROUP(msiof3_rxd_d),
-       SH_PFC_PIN_GROUP(msiof3_clk_e),
-       SH_PFC_PIN_GROUP(msiof3_sync_e),
-       SH_PFC_PIN_GROUP(msiof3_ss1_e),
-       SH_PFC_PIN_GROUP(msiof3_ss2_e),
-       SH_PFC_PIN_GROUP(msiof3_txd_e),
-       SH_PFC_PIN_GROUP(msiof3_rxd_e),
-       SH_PFC_PIN_GROUP(pwm0),
-       SH_PFC_PIN_GROUP(pwm1_a),
-       SH_PFC_PIN_GROUP(pwm1_b),
-       SH_PFC_PIN_GROUP(pwm2_a),
-       SH_PFC_PIN_GROUP(pwm2_b),
-       SH_PFC_PIN_GROUP(pwm3_a),
-       SH_PFC_PIN_GROUP(pwm3_b),
-       SH_PFC_PIN_GROUP(pwm4_a),
-       SH_PFC_PIN_GROUP(pwm4_b),
-       SH_PFC_PIN_GROUP(pwm5_a),
-       SH_PFC_PIN_GROUP(pwm5_b),
-       SH_PFC_PIN_GROUP(pwm6_a),
-       SH_PFC_PIN_GROUP(pwm6_b),
-       SH_PFC_PIN_GROUP(scif0_data),
-       SH_PFC_PIN_GROUP(scif0_clk),
-       SH_PFC_PIN_GROUP(scif0_ctrl),
-       SH_PFC_PIN_GROUP(scif1_data_a),
-       SH_PFC_PIN_GROUP(scif1_clk),
-       SH_PFC_PIN_GROUP(scif1_ctrl),
-       SH_PFC_PIN_GROUP(scif1_data_b),
-       SH_PFC_PIN_GROUP(scif2_data_a),
-       SH_PFC_PIN_GROUP(scif2_clk),
-       SH_PFC_PIN_GROUP(scif2_data_b),
-       SH_PFC_PIN_GROUP(scif3_data_a),
-       SH_PFC_PIN_GROUP(scif3_clk),
-       SH_PFC_PIN_GROUP(scif3_ctrl),
-       SH_PFC_PIN_GROUP(scif3_data_b),
-       SH_PFC_PIN_GROUP(scif4_data_a),
-       SH_PFC_PIN_GROUP(scif4_clk_a),
-       SH_PFC_PIN_GROUP(scif4_ctrl_a),
-       SH_PFC_PIN_GROUP(scif4_data_b),
-       SH_PFC_PIN_GROUP(scif4_clk_b),
-       SH_PFC_PIN_GROUP(scif4_ctrl_b),
-       SH_PFC_PIN_GROUP(scif4_data_c),
-       SH_PFC_PIN_GROUP(scif4_clk_c),
-       SH_PFC_PIN_GROUP(scif4_ctrl_c),
-       SH_PFC_PIN_GROUP(scif5_data_a),
-       SH_PFC_PIN_GROUP(scif5_clk_a),
-       SH_PFC_PIN_GROUP(scif5_data_b),
-       SH_PFC_PIN_GROUP(scif5_clk_b),
-       SH_PFC_PIN_GROUP(scif_clk_a),
-       SH_PFC_PIN_GROUP(scif_clk_b),
-       SH_PFC_PIN_GROUP(sdhi0_data1),
-       SH_PFC_PIN_GROUP(sdhi0_data4),
-       SH_PFC_PIN_GROUP(sdhi0_ctrl),
-       SH_PFC_PIN_GROUP(sdhi0_cd),
-       SH_PFC_PIN_GROUP(sdhi0_wp),
-       SH_PFC_PIN_GROUP(sdhi1_data1),
-       SH_PFC_PIN_GROUP(sdhi1_data4),
-       SH_PFC_PIN_GROUP(sdhi1_ctrl),
-       SH_PFC_PIN_GROUP(sdhi1_cd),
-       SH_PFC_PIN_GROUP(sdhi1_wp),
-       SH_PFC_PIN_GROUP(sdhi2_data1),
-       SH_PFC_PIN_GROUP(sdhi2_data4),
-       SH_PFC_PIN_GROUP(sdhi2_data8),
-       SH_PFC_PIN_GROUP(sdhi2_ctrl),
-       SH_PFC_PIN_GROUP(sdhi2_cd_a),
-       SH_PFC_PIN_GROUP(sdhi2_wp_a),
-       SH_PFC_PIN_GROUP(sdhi2_cd_b),
-       SH_PFC_PIN_GROUP(sdhi2_wp_b),
-       SH_PFC_PIN_GROUP(sdhi2_ds),
-       SH_PFC_PIN_GROUP(sdhi3_data1),
-       SH_PFC_PIN_GROUP(sdhi3_data4),
-       SH_PFC_PIN_GROUP(sdhi3_data8),
-       SH_PFC_PIN_GROUP(sdhi3_ctrl),
-       SH_PFC_PIN_GROUP(sdhi3_cd),
-       SH_PFC_PIN_GROUP(sdhi3_wp),
-       SH_PFC_PIN_GROUP(sdhi3_ds),
-       SH_PFC_PIN_GROUP(ssi0_data),
-       SH_PFC_PIN_GROUP(ssi01239_ctrl),
-       SH_PFC_PIN_GROUP(ssi1_data_a),
-       SH_PFC_PIN_GROUP(ssi1_data_b),
-       SH_PFC_PIN_GROUP(ssi1_ctrl_a),
-       SH_PFC_PIN_GROUP(ssi1_ctrl_b),
-       SH_PFC_PIN_GROUP(ssi2_data_a),
-       SH_PFC_PIN_GROUP(ssi2_data_b),
-       SH_PFC_PIN_GROUP(ssi2_ctrl_a),
-       SH_PFC_PIN_GROUP(ssi2_ctrl_b),
-       SH_PFC_PIN_GROUP(ssi3_data),
-       SH_PFC_PIN_GROUP(ssi349_ctrl),
-       SH_PFC_PIN_GROUP(ssi4_data),
-       SH_PFC_PIN_GROUP(ssi4_ctrl),
-       SH_PFC_PIN_GROUP(ssi5_data),
-       SH_PFC_PIN_GROUP(ssi5_ctrl),
-       SH_PFC_PIN_GROUP(ssi6_data),
-       SH_PFC_PIN_GROUP(ssi6_ctrl),
-       SH_PFC_PIN_GROUP(ssi7_data),
-       SH_PFC_PIN_GROUP(ssi78_ctrl),
-       SH_PFC_PIN_GROUP(ssi8_data),
-       SH_PFC_PIN_GROUP(ssi9_data_a),
-       SH_PFC_PIN_GROUP(ssi9_data_b),
-       SH_PFC_PIN_GROUP(ssi9_ctrl_a),
-       SH_PFC_PIN_GROUP(ssi9_ctrl_b),
-       SH_PFC_PIN_GROUP(tmu_tclk1_a),
-       SH_PFC_PIN_GROUP(tmu_tclk1_b),
-       SH_PFC_PIN_GROUP(tmu_tclk2_a),
-       SH_PFC_PIN_GROUP(tmu_tclk2_b),
-       SH_PFC_PIN_GROUP(usb0),
-       SH_PFC_PIN_GROUP(usb1),
-       SH_PFC_PIN_GROUP(usb30),
-       VIN_DATA_PIN_GROUP(vin4_data_a, 8),
-       VIN_DATA_PIN_GROUP(vin4_data_a, 10),
-       VIN_DATA_PIN_GROUP(vin4_data_a, 12),
-       VIN_DATA_PIN_GROUP(vin4_data_a, 16),
-       SH_PFC_PIN_GROUP(vin4_data18_a),
-       VIN_DATA_PIN_GROUP(vin4_data_a, 20),
-       VIN_DATA_PIN_GROUP(vin4_data_a, 24),
-       VIN_DATA_PIN_GROUP(vin4_data_b, 8),
-       VIN_DATA_PIN_GROUP(vin4_data_b, 10),
-       VIN_DATA_PIN_GROUP(vin4_data_b, 12),
-       VIN_DATA_PIN_GROUP(vin4_data_b, 16),
-       SH_PFC_PIN_GROUP(vin4_data18_b),
-       VIN_DATA_PIN_GROUP(vin4_data_b, 20),
-       VIN_DATA_PIN_GROUP(vin4_data_b, 24),
-       SH_PFC_PIN_GROUP(vin4_sync),
-       SH_PFC_PIN_GROUP(vin4_field),
-       SH_PFC_PIN_GROUP(vin4_clkenb),
-       SH_PFC_PIN_GROUP(vin4_clk),
-       SH_PFC_PIN_GROUP(vin5_data8),
-       SH_PFC_PIN_GROUP(vin5_data10),
-       SH_PFC_PIN_GROUP(vin5_data12),
-       SH_PFC_PIN_GROUP(vin5_data16),
-       SH_PFC_PIN_GROUP(vin5_sync),
-       SH_PFC_PIN_GROUP(vin5_field),
-       SH_PFC_PIN_GROUP(vin5_clkenb),
-       SH_PFC_PIN_GROUP(vin5_clk),
+static const struct {
+       struct sh_pfc_pin_group common[310];
+       struct sh_pfc_pin_group automotive[33];
+} pinmux_groups = {
+       .common = {
+               SH_PFC_PIN_GROUP(audio_clk_a_a),
+               SH_PFC_PIN_GROUP(audio_clk_a_b),
+               SH_PFC_PIN_GROUP(audio_clk_a_c),
+               SH_PFC_PIN_GROUP(audio_clk_b_a),
+               SH_PFC_PIN_GROUP(audio_clk_b_b),
+               SH_PFC_PIN_GROUP(audio_clk_c_a),
+               SH_PFC_PIN_GROUP(audio_clk_c_b),
+               SH_PFC_PIN_GROUP(audio_clkout_a),
+               SH_PFC_PIN_GROUP(audio_clkout_b),
+               SH_PFC_PIN_GROUP(audio_clkout_c),
+               SH_PFC_PIN_GROUP(audio_clkout_d),
+               SH_PFC_PIN_GROUP(audio_clkout1_a),
+               SH_PFC_PIN_GROUP(audio_clkout1_b),
+               SH_PFC_PIN_GROUP(audio_clkout2_a),
+               SH_PFC_PIN_GROUP(audio_clkout2_b),
+               SH_PFC_PIN_GROUP(audio_clkout3_a),
+               SH_PFC_PIN_GROUP(audio_clkout3_b),
+               SH_PFC_PIN_GROUP(avb_link),
+               SH_PFC_PIN_GROUP(avb_magic),
+               SH_PFC_PIN_GROUP(avb_phy_int),
+               SH_PFC_PIN_GROUP_ALIAS(avb_mdc, avb_mdio), /* Deprecated */
+               SH_PFC_PIN_GROUP(avb_mdio),
+               SH_PFC_PIN_GROUP(avb_mii),
+               SH_PFC_PIN_GROUP(avb_avtp_pps),
+               SH_PFC_PIN_GROUP(avb_avtp_match_a),
+               SH_PFC_PIN_GROUP(avb_avtp_capture_a),
+               SH_PFC_PIN_GROUP(avb_avtp_match_b),
+               SH_PFC_PIN_GROUP(avb_avtp_capture_b),
+               SH_PFC_PIN_GROUP(can0_data_a),
+               SH_PFC_PIN_GROUP(can0_data_b),
+               SH_PFC_PIN_GROUP(can1_data),
+               SH_PFC_PIN_GROUP(can_clk),
+               SH_PFC_PIN_GROUP(du_rgb666),
+               SH_PFC_PIN_GROUP(du_rgb888),
+               SH_PFC_PIN_GROUP(du_clk_out_0),
+               SH_PFC_PIN_GROUP(du_clk_out_1),
+               SH_PFC_PIN_GROUP(du_sync),
+               SH_PFC_PIN_GROUP(du_oddf),
+               SH_PFC_PIN_GROUP(du_cde),
+               SH_PFC_PIN_GROUP(du_disp),
+               SH_PFC_PIN_GROUP(hdmi0_cec),
+               SH_PFC_PIN_GROUP(hscif0_data),
+               SH_PFC_PIN_GROUP(hscif0_clk),
+               SH_PFC_PIN_GROUP(hscif0_ctrl),
+               SH_PFC_PIN_GROUP(hscif1_data_a),
+               SH_PFC_PIN_GROUP(hscif1_clk_a),
+               SH_PFC_PIN_GROUP(hscif1_ctrl_a),
+               SH_PFC_PIN_GROUP(hscif1_data_b),
+               SH_PFC_PIN_GROUP(hscif1_clk_b),
+               SH_PFC_PIN_GROUP(hscif1_ctrl_b),
+               SH_PFC_PIN_GROUP(hscif2_data_a),
+               SH_PFC_PIN_GROUP(hscif2_clk_a),
+               SH_PFC_PIN_GROUP(hscif2_ctrl_a),
+               SH_PFC_PIN_GROUP(hscif2_data_b),
+               SH_PFC_PIN_GROUP(hscif2_clk_b),
+               SH_PFC_PIN_GROUP(hscif2_ctrl_b),
+               SH_PFC_PIN_GROUP(hscif2_data_c),
+               SH_PFC_PIN_GROUP(hscif2_clk_c),
+               SH_PFC_PIN_GROUP(hscif2_ctrl_c),
+               SH_PFC_PIN_GROUP(hscif3_data_a),
+               SH_PFC_PIN_GROUP(hscif3_clk),
+               SH_PFC_PIN_GROUP(hscif3_ctrl),
+               SH_PFC_PIN_GROUP(hscif3_data_b),
+               SH_PFC_PIN_GROUP(hscif3_data_c),
+               SH_PFC_PIN_GROUP(hscif3_data_d),
+               SH_PFC_PIN_GROUP(hscif4_data_a),
+               SH_PFC_PIN_GROUP(hscif4_clk),
+               SH_PFC_PIN_GROUP(hscif4_ctrl),
+               SH_PFC_PIN_GROUP(hscif4_data_b),
+               SH_PFC_PIN_GROUP(i2c0),
+               SH_PFC_PIN_GROUP(i2c1_a),
+               SH_PFC_PIN_GROUP(i2c1_b),
+               SH_PFC_PIN_GROUP(i2c2_a),
+               SH_PFC_PIN_GROUP(i2c2_b),
+               SH_PFC_PIN_GROUP(i2c3),
+               SH_PFC_PIN_GROUP(i2c5),
+               SH_PFC_PIN_GROUP(i2c6_a),
+               SH_PFC_PIN_GROUP(i2c6_b),
+               SH_PFC_PIN_GROUP(i2c6_c),
+               SH_PFC_PIN_GROUP(intc_ex_irq0),
+               SH_PFC_PIN_GROUP(intc_ex_irq1),
+               SH_PFC_PIN_GROUP(intc_ex_irq2),
+               SH_PFC_PIN_GROUP(intc_ex_irq3),
+               SH_PFC_PIN_GROUP(intc_ex_irq4),
+               SH_PFC_PIN_GROUP(intc_ex_irq5),
+               SH_PFC_PIN_GROUP(msiof0_clk),
+               SH_PFC_PIN_GROUP(msiof0_sync),
+               SH_PFC_PIN_GROUP(msiof0_ss1),
+               SH_PFC_PIN_GROUP(msiof0_ss2),
+               SH_PFC_PIN_GROUP(msiof0_txd),
+               SH_PFC_PIN_GROUP(msiof0_rxd),
+               SH_PFC_PIN_GROUP(msiof1_clk_a),
+               SH_PFC_PIN_GROUP(msiof1_sync_a),
+               SH_PFC_PIN_GROUP(msiof1_ss1_a),
+               SH_PFC_PIN_GROUP(msiof1_ss2_a),
+               SH_PFC_PIN_GROUP(msiof1_txd_a),
+               SH_PFC_PIN_GROUP(msiof1_rxd_a),
+               SH_PFC_PIN_GROUP(msiof1_clk_b),
+               SH_PFC_PIN_GROUP(msiof1_sync_b),
+               SH_PFC_PIN_GROUP(msiof1_ss1_b),
+               SH_PFC_PIN_GROUP(msiof1_ss2_b),
+               SH_PFC_PIN_GROUP(msiof1_txd_b),
+               SH_PFC_PIN_GROUP(msiof1_rxd_b),
+               SH_PFC_PIN_GROUP(msiof1_clk_c),
+               SH_PFC_PIN_GROUP(msiof1_sync_c),
+               SH_PFC_PIN_GROUP(msiof1_ss1_c),
+               SH_PFC_PIN_GROUP(msiof1_ss2_c),
+               SH_PFC_PIN_GROUP(msiof1_txd_c),
+               SH_PFC_PIN_GROUP(msiof1_rxd_c),
+               SH_PFC_PIN_GROUP(msiof1_clk_d),
+               SH_PFC_PIN_GROUP(msiof1_sync_d),
+               SH_PFC_PIN_GROUP(msiof1_ss1_d),
+               SH_PFC_PIN_GROUP(msiof1_ss2_d),
+               SH_PFC_PIN_GROUP(msiof1_txd_d),
+               SH_PFC_PIN_GROUP(msiof1_rxd_d),
+               SH_PFC_PIN_GROUP(msiof1_clk_e),
+               SH_PFC_PIN_GROUP(msiof1_sync_e),
+               SH_PFC_PIN_GROUP(msiof1_ss1_e),
+               SH_PFC_PIN_GROUP(msiof1_ss2_e),
+               SH_PFC_PIN_GROUP(msiof1_txd_e),
+               SH_PFC_PIN_GROUP(msiof1_rxd_e),
+               SH_PFC_PIN_GROUP(msiof1_clk_f),
+               SH_PFC_PIN_GROUP(msiof1_sync_f),
+               SH_PFC_PIN_GROUP(msiof1_ss1_f),
+               SH_PFC_PIN_GROUP(msiof1_ss2_f),
+               SH_PFC_PIN_GROUP(msiof1_txd_f),
+               SH_PFC_PIN_GROUP(msiof1_rxd_f),
+               SH_PFC_PIN_GROUP(msiof1_clk_g),
+               SH_PFC_PIN_GROUP(msiof1_sync_g),
+               SH_PFC_PIN_GROUP(msiof1_ss1_g),
+               SH_PFC_PIN_GROUP(msiof1_ss2_g),
+               SH_PFC_PIN_GROUP(msiof1_txd_g),
+               SH_PFC_PIN_GROUP(msiof1_rxd_g),
+               SH_PFC_PIN_GROUP(msiof2_clk_a),
+               SH_PFC_PIN_GROUP(msiof2_sync_a),
+               SH_PFC_PIN_GROUP(msiof2_ss1_a),
+               SH_PFC_PIN_GROUP(msiof2_ss2_a),
+               SH_PFC_PIN_GROUP(msiof2_txd_a),
+               SH_PFC_PIN_GROUP(msiof2_rxd_a),
+               SH_PFC_PIN_GROUP(msiof2_clk_b),
+               SH_PFC_PIN_GROUP(msiof2_sync_b),
+               SH_PFC_PIN_GROUP(msiof2_ss1_b),
+               SH_PFC_PIN_GROUP(msiof2_ss2_b),
+               SH_PFC_PIN_GROUP(msiof2_txd_b),
+               SH_PFC_PIN_GROUP(msiof2_rxd_b),
+               SH_PFC_PIN_GROUP(msiof2_clk_c),
+               SH_PFC_PIN_GROUP(msiof2_sync_c),
+               SH_PFC_PIN_GROUP(msiof2_ss1_c),
+               SH_PFC_PIN_GROUP(msiof2_ss2_c),
+               SH_PFC_PIN_GROUP(msiof2_txd_c),
+               SH_PFC_PIN_GROUP(msiof2_rxd_c),
+               SH_PFC_PIN_GROUP(msiof2_clk_d),
+               SH_PFC_PIN_GROUP(msiof2_sync_d),
+               SH_PFC_PIN_GROUP(msiof2_ss1_d),
+               SH_PFC_PIN_GROUP(msiof2_ss2_d),
+               SH_PFC_PIN_GROUP(msiof2_txd_d),
+               SH_PFC_PIN_GROUP(msiof2_rxd_d),
+               SH_PFC_PIN_GROUP(msiof3_clk_a),
+               SH_PFC_PIN_GROUP(msiof3_sync_a),
+               SH_PFC_PIN_GROUP(msiof3_ss1_a),
+               SH_PFC_PIN_GROUP(msiof3_ss2_a),
+               SH_PFC_PIN_GROUP(msiof3_txd_a),
+               SH_PFC_PIN_GROUP(msiof3_rxd_a),
+               SH_PFC_PIN_GROUP(msiof3_clk_b),
+               SH_PFC_PIN_GROUP(msiof3_sync_b),
+               SH_PFC_PIN_GROUP(msiof3_ss1_b),
+               SH_PFC_PIN_GROUP(msiof3_ss2_b),
+               SH_PFC_PIN_GROUP(msiof3_txd_b),
+               SH_PFC_PIN_GROUP(msiof3_rxd_b),
+               SH_PFC_PIN_GROUP(msiof3_clk_c),
+               SH_PFC_PIN_GROUP(msiof3_sync_c),
+               SH_PFC_PIN_GROUP(msiof3_txd_c),
+               SH_PFC_PIN_GROUP(msiof3_rxd_c),
+               SH_PFC_PIN_GROUP(msiof3_clk_d),
+               SH_PFC_PIN_GROUP(msiof3_sync_d),
+               SH_PFC_PIN_GROUP(msiof3_ss1_d),
+               SH_PFC_PIN_GROUP(msiof3_txd_d),
+               SH_PFC_PIN_GROUP(msiof3_rxd_d),
+               SH_PFC_PIN_GROUP(msiof3_clk_e),
+               SH_PFC_PIN_GROUP(msiof3_sync_e),
+               SH_PFC_PIN_GROUP(msiof3_ss1_e),
+               SH_PFC_PIN_GROUP(msiof3_ss2_e),
+               SH_PFC_PIN_GROUP(msiof3_txd_e),
+               SH_PFC_PIN_GROUP(msiof3_rxd_e),
+               SH_PFC_PIN_GROUP(pwm0),
+               SH_PFC_PIN_GROUP(pwm1_a),
+               SH_PFC_PIN_GROUP(pwm1_b),
+               SH_PFC_PIN_GROUP(pwm2_a),
+               SH_PFC_PIN_GROUP(pwm2_b),
+               SH_PFC_PIN_GROUP(pwm3_a),
+               SH_PFC_PIN_GROUP(pwm3_b),
+               SH_PFC_PIN_GROUP(pwm4_a),
+               SH_PFC_PIN_GROUP(pwm4_b),
+               SH_PFC_PIN_GROUP(pwm5_a),
+               SH_PFC_PIN_GROUP(pwm5_b),
+               SH_PFC_PIN_GROUP(pwm6_a),
+               SH_PFC_PIN_GROUP(pwm6_b),
+               SH_PFC_PIN_GROUP(scif0_data),
+               SH_PFC_PIN_GROUP(scif0_clk),
+               SH_PFC_PIN_GROUP(scif0_ctrl),
+               SH_PFC_PIN_GROUP(scif1_data_a),
+               SH_PFC_PIN_GROUP(scif1_clk),
+               SH_PFC_PIN_GROUP(scif1_ctrl),
+               SH_PFC_PIN_GROUP(scif1_data_b),
+               SH_PFC_PIN_GROUP(scif2_data_a),
+               SH_PFC_PIN_GROUP(scif2_clk),
+               SH_PFC_PIN_GROUP(scif2_data_b),
+               SH_PFC_PIN_GROUP(scif3_data_a),
+               SH_PFC_PIN_GROUP(scif3_clk),
+               SH_PFC_PIN_GROUP(scif3_ctrl),
+               SH_PFC_PIN_GROUP(scif3_data_b),
+               SH_PFC_PIN_GROUP(scif4_data_a),
+               SH_PFC_PIN_GROUP(scif4_clk_a),
+               SH_PFC_PIN_GROUP(scif4_ctrl_a),
+               SH_PFC_PIN_GROUP(scif4_data_b),
+               SH_PFC_PIN_GROUP(scif4_clk_b),
+               SH_PFC_PIN_GROUP(scif4_ctrl_b),
+               SH_PFC_PIN_GROUP(scif4_data_c),
+               SH_PFC_PIN_GROUP(scif4_clk_c),
+               SH_PFC_PIN_GROUP(scif4_ctrl_c),
+               SH_PFC_PIN_GROUP(scif5_data_a),
+               SH_PFC_PIN_GROUP(scif5_clk_a),
+               SH_PFC_PIN_GROUP(scif5_data_b),
+               SH_PFC_PIN_GROUP(scif5_clk_b),
+               SH_PFC_PIN_GROUP(scif_clk_a),
+               SH_PFC_PIN_GROUP(scif_clk_b),
+               SH_PFC_PIN_GROUP(sdhi0_data1),
+               SH_PFC_PIN_GROUP(sdhi0_data4),
+               SH_PFC_PIN_GROUP(sdhi0_ctrl),
+               SH_PFC_PIN_GROUP(sdhi0_cd),
+               SH_PFC_PIN_GROUP(sdhi0_wp),
+               SH_PFC_PIN_GROUP(sdhi1_data1),
+               SH_PFC_PIN_GROUP(sdhi1_data4),
+               SH_PFC_PIN_GROUP(sdhi1_ctrl),
+               SH_PFC_PIN_GROUP(sdhi1_cd),
+               SH_PFC_PIN_GROUP(sdhi1_wp),
+               SH_PFC_PIN_GROUP(sdhi2_data1),
+               SH_PFC_PIN_GROUP(sdhi2_data4),
+               SH_PFC_PIN_GROUP(sdhi2_data8),
+               SH_PFC_PIN_GROUP(sdhi2_ctrl),
+               SH_PFC_PIN_GROUP(sdhi2_cd_a),
+               SH_PFC_PIN_GROUP(sdhi2_wp_a),
+               SH_PFC_PIN_GROUP(sdhi2_cd_b),
+               SH_PFC_PIN_GROUP(sdhi2_wp_b),
+               SH_PFC_PIN_GROUP(sdhi2_ds),
+               SH_PFC_PIN_GROUP(sdhi3_data1),
+               SH_PFC_PIN_GROUP(sdhi3_data4),
+               SH_PFC_PIN_GROUP(sdhi3_data8),
+               SH_PFC_PIN_GROUP(sdhi3_ctrl),
+               SH_PFC_PIN_GROUP(sdhi3_cd),
+               SH_PFC_PIN_GROUP(sdhi3_wp),
+               SH_PFC_PIN_GROUP(sdhi3_ds),
+               SH_PFC_PIN_GROUP(ssi0_data),
+               SH_PFC_PIN_GROUP(ssi01239_ctrl),
+               SH_PFC_PIN_GROUP(ssi1_data_a),
+               SH_PFC_PIN_GROUP(ssi1_data_b),
+               SH_PFC_PIN_GROUP(ssi1_ctrl_a),
+               SH_PFC_PIN_GROUP(ssi1_ctrl_b),
+               SH_PFC_PIN_GROUP(ssi2_data_a),
+               SH_PFC_PIN_GROUP(ssi2_data_b),
+               SH_PFC_PIN_GROUP(ssi2_ctrl_a),
+               SH_PFC_PIN_GROUP(ssi2_ctrl_b),
+               SH_PFC_PIN_GROUP(ssi3_data),
+               SH_PFC_PIN_GROUP(ssi349_ctrl),
+               SH_PFC_PIN_GROUP(ssi4_data),
+               SH_PFC_PIN_GROUP(ssi4_ctrl),
+               SH_PFC_PIN_GROUP(ssi5_data),
+               SH_PFC_PIN_GROUP(ssi5_ctrl),
+               SH_PFC_PIN_GROUP(ssi6_data),
+               SH_PFC_PIN_GROUP(ssi6_ctrl),
+               SH_PFC_PIN_GROUP(ssi7_data),
+               SH_PFC_PIN_GROUP(ssi78_ctrl),
+               SH_PFC_PIN_GROUP(ssi8_data),
+               SH_PFC_PIN_GROUP(ssi9_data_a),
+               SH_PFC_PIN_GROUP(ssi9_data_b),
+               SH_PFC_PIN_GROUP(ssi9_ctrl_a),
+               SH_PFC_PIN_GROUP(ssi9_ctrl_b),
+               SH_PFC_PIN_GROUP(tmu_tclk1_a),
+               SH_PFC_PIN_GROUP(tmu_tclk1_b),
+               SH_PFC_PIN_GROUP(tmu_tclk2_a),
+               SH_PFC_PIN_GROUP(tmu_tclk2_b),
+               SH_PFC_PIN_GROUP(usb0),
+               SH_PFC_PIN_GROUP(usb1),
+               SH_PFC_PIN_GROUP(usb30),
+               VIN_DATA_PIN_GROUP(vin4_data, 8, _a),
+               VIN_DATA_PIN_GROUP(vin4_data, 10, _a),
+               VIN_DATA_PIN_GROUP(vin4_data, 12, _a),
+               VIN_DATA_PIN_GROUP(vin4_data, 16, _a),
+               SH_PFC_PIN_GROUP(vin4_data18_a),
+               VIN_DATA_PIN_GROUP(vin4_data, 20, _a),
+               VIN_DATA_PIN_GROUP(vin4_data, 24, _a),
+               VIN_DATA_PIN_GROUP(vin4_data, 8, _b),
+               VIN_DATA_PIN_GROUP(vin4_data, 10, _b),
+               VIN_DATA_PIN_GROUP(vin4_data, 12, _b),
+               VIN_DATA_PIN_GROUP(vin4_data, 16, _b),
+               SH_PFC_PIN_GROUP(vin4_data18_b),
+               VIN_DATA_PIN_GROUP(vin4_data, 20, _b),
+               VIN_DATA_PIN_GROUP(vin4_data, 24, _b),
+               SH_PFC_PIN_GROUP(vin4_sync),
+               SH_PFC_PIN_GROUP(vin4_field),
+               SH_PFC_PIN_GROUP(vin4_clkenb),
+               SH_PFC_PIN_GROUP(vin4_clk),
+               VIN_DATA_PIN_GROUP(vin5_data, 8),
+               VIN_DATA_PIN_GROUP(vin5_data, 10),
+               VIN_DATA_PIN_GROUP(vin5_data, 12),
+               VIN_DATA_PIN_GROUP(vin5_data, 16),
+               SH_PFC_PIN_GROUP(vin5_sync),
+               SH_PFC_PIN_GROUP(vin5_field),
+               SH_PFC_PIN_GROUP(vin5_clkenb),
+               SH_PFC_PIN_GROUP(vin5_clk),
+       },
+       .automotive = {
+               SH_PFC_PIN_GROUP(canfd0_data_a),
+               SH_PFC_PIN_GROUP(canfd0_data_b),
+               SH_PFC_PIN_GROUP(canfd1_data),
+               SH_PFC_PIN_GROUP(drif0_ctrl_a),
+               SH_PFC_PIN_GROUP(drif0_data0_a),
+               SH_PFC_PIN_GROUP(drif0_data1_a),
+               SH_PFC_PIN_GROUP(drif0_ctrl_b),
+               SH_PFC_PIN_GROUP(drif0_data0_b),
+               SH_PFC_PIN_GROUP(drif0_data1_b),
+               SH_PFC_PIN_GROUP(drif0_ctrl_c),
+               SH_PFC_PIN_GROUP(drif0_data0_c),
+               SH_PFC_PIN_GROUP(drif0_data1_c),
+               SH_PFC_PIN_GROUP(drif1_ctrl_a),
+               SH_PFC_PIN_GROUP(drif1_data0_a),
+               SH_PFC_PIN_GROUP(drif1_data1_a),
+               SH_PFC_PIN_GROUP(drif1_ctrl_b),
+               SH_PFC_PIN_GROUP(drif1_data0_b),
+               SH_PFC_PIN_GROUP(drif1_data1_b),
+               SH_PFC_PIN_GROUP(drif1_ctrl_c),
+               SH_PFC_PIN_GROUP(drif1_data0_c),
+               SH_PFC_PIN_GROUP(drif1_data1_c),
+               SH_PFC_PIN_GROUP(drif2_ctrl_a),
+               SH_PFC_PIN_GROUP(drif2_data0_a),
+               SH_PFC_PIN_GROUP(drif2_data1_a),
+               SH_PFC_PIN_GROUP(drif2_ctrl_b),
+               SH_PFC_PIN_GROUP(drif2_data0_b),
+               SH_PFC_PIN_GROUP(drif2_data1_b),
+               SH_PFC_PIN_GROUP(drif3_ctrl_a),
+               SH_PFC_PIN_GROUP(drif3_data0_a),
+               SH_PFC_PIN_GROUP(drif3_data1_a),
+               SH_PFC_PIN_GROUP(drif3_ctrl_b),
+               SH_PFC_PIN_GROUP(drif3_data0_b),
+               SH_PFC_PIN_GROUP(drif3_data1_b),
+       }
 };
 
 static const char * const audio_clk_groups[] = {
@@ -4588,12 +4588,8 @@ static const char * const du_groups[] = {
        "du_disp",
 };
 
-static const char * const gp7_02_groups[] = {
-       "gp7_02",
-};
-
-static const char * const gp7_03_groups[] = {
-       "gp7_03",
+static const char * const hdmi0_groups[] = {
+       "hdmi0_cec",
 };
 
 static const char * const hscif0_groups[] = {
@@ -4639,6 +4635,10 @@ static const char * const hscif4_groups[] = {
        "hscif4_data_b",
 };
 
+static const char * const i2c0_groups[] = {
+       "i2c0",
+};
+
 static const char * const i2c1_groups[] = {
        "i2c1_a",
        "i2c1_b",
@@ -4649,6 +4649,14 @@ static const char * const i2c2_groups[] = {
        "i2c2_b",
 };
 
+static const char * const i2c3_groups[] = {
+       "i2c3",
+};
+
+static const char * const i2c5_groups[] = {
+       "i2c5",
+};
+
 static const char * const i2c6_groups[] = {
        "i2c6_a",
        "i2c6_b",
@@ -4976,59 +4984,68 @@ static const char * const vin5_groups[] = {
        "vin5_clk",
 };
 
-static const struct sh_pfc_function pinmux_functions[] = {
-       SH_PFC_FUNCTION(audio_clk),
-       SH_PFC_FUNCTION(avb),
-       SH_PFC_FUNCTION(can0),
-       SH_PFC_FUNCTION(can1),
-       SH_PFC_FUNCTION(can_clk),
-       SH_PFC_FUNCTION(canfd0),
-       SH_PFC_FUNCTION(canfd1),
-       SH_PFC_FUNCTION(drif0),
-       SH_PFC_FUNCTION(drif1),
-       SH_PFC_FUNCTION(drif2),
-       SH_PFC_FUNCTION(drif3),
-       SH_PFC_FUNCTION(du),
-       SH_PFC_FUNCTION(gp7_02),
-       SH_PFC_FUNCTION(gp7_03),
-       SH_PFC_FUNCTION(hscif0),
-       SH_PFC_FUNCTION(hscif1),
-       SH_PFC_FUNCTION(hscif2),
-       SH_PFC_FUNCTION(hscif3),
-       SH_PFC_FUNCTION(hscif4),
-       SH_PFC_FUNCTION(i2c1),
-       SH_PFC_FUNCTION(i2c2),
-       SH_PFC_FUNCTION(i2c6),
-       SH_PFC_FUNCTION(intc_ex),
-       SH_PFC_FUNCTION(msiof0),
-       SH_PFC_FUNCTION(msiof1),
-       SH_PFC_FUNCTION(msiof2),
-       SH_PFC_FUNCTION(msiof3),
-       SH_PFC_FUNCTION(pwm0),
-       SH_PFC_FUNCTION(pwm1),
-       SH_PFC_FUNCTION(pwm2),
-       SH_PFC_FUNCTION(pwm3),
-       SH_PFC_FUNCTION(pwm4),
-       SH_PFC_FUNCTION(pwm5),
-       SH_PFC_FUNCTION(pwm6),
-       SH_PFC_FUNCTION(scif0),
-       SH_PFC_FUNCTION(scif1),
-       SH_PFC_FUNCTION(scif2),
-       SH_PFC_FUNCTION(scif3),
-       SH_PFC_FUNCTION(scif4),
-       SH_PFC_FUNCTION(scif5),
-       SH_PFC_FUNCTION(scif_clk),
-       SH_PFC_FUNCTION(sdhi0),
-       SH_PFC_FUNCTION(sdhi1),
-       SH_PFC_FUNCTION(sdhi2),
-       SH_PFC_FUNCTION(sdhi3),
-       SH_PFC_FUNCTION(ssi),
-       SH_PFC_FUNCTION(tmu),
-       SH_PFC_FUNCTION(usb0),
-       SH_PFC_FUNCTION(usb1),
-       SH_PFC_FUNCTION(usb30),
-       SH_PFC_FUNCTION(vin4),
-       SH_PFC_FUNCTION(vin5),
+static const struct {
+       struct sh_pfc_function common[48];
+       struct sh_pfc_function automotive[6];
+} pinmux_functions = {
+       .common = {
+               SH_PFC_FUNCTION(audio_clk),
+               SH_PFC_FUNCTION(avb),
+               SH_PFC_FUNCTION(can0),
+               SH_PFC_FUNCTION(can1),
+               SH_PFC_FUNCTION(can_clk),
+               SH_PFC_FUNCTION(du),
+               SH_PFC_FUNCTION(hdmi0),
+               SH_PFC_FUNCTION(hscif0),
+               SH_PFC_FUNCTION(hscif1),
+               SH_PFC_FUNCTION(hscif2),
+               SH_PFC_FUNCTION(hscif3),
+               SH_PFC_FUNCTION(hscif4),
+               SH_PFC_FUNCTION(i2c0),
+               SH_PFC_FUNCTION(i2c1),
+               SH_PFC_FUNCTION(i2c2),
+               SH_PFC_FUNCTION(i2c3),
+               SH_PFC_FUNCTION(i2c5),
+               SH_PFC_FUNCTION(i2c6),
+               SH_PFC_FUNCTION(intc_ex),
+               SH_PFC_FUNCTION(msiof0),
+               SH_PFC_FUNCTION(msiof1),
+               SH_PFC_FUNCTION(msiof2),
+               SH_PFC_FUNCTION(msiof3),
+               SH_PFC_FUNCTION(pwm0),
+               SH_PFC_FUNCTION(pwm1),
+               SH_PFC_FUNCTION(pwm2),
+               SH_PFC_FUNCTION(pwm3),
+               SH_PFC_FUNCTION(pwm4),
+               SH_PFC_FUNCTION(pwm5),
+               SH_PFC_FUNCTION(pwm6),
+               SH_PFC_FUNCTION(scif0),
+               SH_PFC_FUNCTION(scif1),
+               SH_PFC_FUNCTION(scif2),
+               SH_PFC_FUNCTION(scif3),
+               SH_PFC_FUNCTION(scif4),
+               SH_PFC_FUNCTION(scif5),
+               SH_PFC_FUNCTION(scif_clk),
+               SH_PFC_FUNCTION(sdhi0),
+               SH_PFC_FUNCTION(sdhi1),
+               SH_PFC_FUNCTION(sdhi2),
+               SH_PFC_FUNCTION(sdhi3),
+               SH_PFC_FUNCTION(ssi),
+               SH_PFC_FUNCTION(tmu),
+               SH_PFC_FUNCTION(usb0),
+               SH_PFC_FUNCTION(usb1),
+               SH_PFC_FUNCTION(usb30),
+               SH_PFC_FUNCTION(vin4),
+               SH_PFC_FUNCTION(vin5),
+       },
+       .automotive = {
+               SH_PFC_FUNCTION(canfd0),
+               SH_PFC_FUNCTION(canfd1),
+               SH_PFC_FUNCTION(drif0),
+               SH_PFC_FUNCTION(drif1),
+               SH_PFC_FUNCTION(drif2),
+               SH_PFC_FUNCTION(drif3),
+       }
 };
 
 static const struct pinmux_cfg_reg pinmux_config_regs[] = {
@@ -5707,7 +5724,7 @@ static const struct pinmux_drive_reg pinmux_drive_regs[] = {
                { RCAR_GP_PIN(0, 15),   24, 3 },        /* D15 */
                { RCAR_GP_PIN(7,  0),   20, 3 },        /* AVS1 */
                { RCAR_GP_PIN(7,  1),   16, 3 },        /* AVS2 */
-               { RCAR_GP_PIN(7,  2),   12, 3 },        /* GP7_02 */
+               { RCAR_GP_PIN(7,  2),   12, 3 },        /* HDMI0_CEC */
                { RCAR_GP_PIN(7,  3),    8, 3 },        /* GP7_03 */
                { PIN_A_NUMBER('P', 7),  4, 2 },        /* DU_DOTCLKIN0 */
                { PIN_A_NUMBER('P', 8),  0, 2 },        /* DU_DOTCLKIN1 */
@@ -5961,7 +5978,7 @@ static const struct pinmux_bias_reg pinmux_bias_regs[] = {
                [25] = RCAR_GP_PIN(0, 15),      /* D15 */
                [26] = RCAR_GP_PIN(7,  0),      /* AVS1 */
                [27] = RCAR_GP_PIN(7,  1),      /* AVS2 */
-               [28] = RCAR_GP_PIN(7,  2),      /* GP7_02 */
+               [28] = RCAR_GP_PIN(7,  2),      /* HDMI0_CEC */
                [29] = RCAR_GP_PIN(7,  3),      /* GP7_03 */
                [30] = PIN_A_NUMBER('P', 7),    /* DU_DOTCLKIN0 */
                [31] = PIN_A_NUMBER('P', 8),    /* DU_DOTCLKIN1 */
@@ -6152,6 +6169,32 @@ static const struct sh_pfc_soc_operations r8a7796_pinmux_ops = {
        .set_bias = r8a7796_pinmux_set_bias,
 };
 
+#ifdef CONFIG_PINCTRL_PFC_R8A774A1
+const struct sh_pfc_soc_info r8a774a1_pinmux_info = {
+       .name = "r8a774a1_pfc",
+       .ops = &r8a7796_pinmux_ops,
+       .unlock_reg = 0xe6060000, /* PMMR */
+
+       .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
+
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .groups = pinmux_groups.common,
+       .nr_groups = ARRAY_SIZE(pinmux_groups.common),
+       .functions = pinmux_functions.common,
+       .nr_functions = ARRAY_SIZE(pinmux_functions.common),
+
+       .cfg_regs = pinmux_config_regs,
+       .drive_regs = pinmux_drive_regs,
+       .bias_regs = pinmux_bias_regs,
+       .ioctrl_regs = pinmux_ioctrl_regs,
+
+       .pinmux_data = pinmux_data,
+       .pinmux_data_size = ARRAY_SIZE(pinmux_data),
+};
+#endif
+
+#ifdef CONFIG_PINCTRL_PFC_R8A7796
 const struct sh_pfc_soc_info r8a7796_pinmux_info = {
        .name = "r8a77960_pfc",
        .ops = &r8a7796_pinmux_ops,
@@ -6161,10 +6204,12 @@ const struct sh_pfc_soc_info r8a7796_pinmux_info = {
 
        .pins = pinmux_pins,
        .nr_pins = ARRAY_SIZE(pinmux_pins),
-       .groups = pinmux_groups,
-       .nr_groups = ARRAY_SIZE(pinmux_groups),
-       .functions = pinmux_functions,
-       .nr_functions = ARRAY_SIZE(pinmux_functions),
+       .groups = pinmux_groups.common,
+       .nr_groups = ARRAY_SIZE(pinmux_groups.common) +
+               ARRAY_SIZE(pinmux_groups.automotive),
+       .functions = pinmux_functions.common,
+       .nr_functions = ARRAY_SIZE(pinmux_functions.common) +
+               ARRAY_SIZE(pinmux_functions.automotive),
 
        .cfg_regs = pinmux_config_regs,
        .drive_regs = pinmux_drive_regs,
@@ -6174,3 +6219,4 @@ const struct sh_pfc_soc_info r8a7796_pinmux_info = {
        .pinmux_data = pinmux_data,
        .pinmux_data_size = ARRAY_SIZE(pinmux_data),
 };
+#endif
diff --git a/drivers/pinctrl/renesas/pfc-r8a77965.c b/drivers/pinctrl/renesas/pfc-r8a77965.c
new file mode 100644 (file)
index 0000000..7c24836
--- /dev/null
@@ -0,0 +1,6350 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * R8A77965 processor support - PFC hardware block.
+ *
+ * Copyright (C) 2018 Jacopo Mondi <jacopo+renesas@jmondi.org>
+ * Copyright (C) 2016 Renesas Electronics Corp.
+ *
+ * This file is based on the drivers/pinctrl/sh-pfc/pfc-r8a7796.c
+ *
+ * R-Car Gen3 processor support - PFC hardware block.
+ *
+ * Copyright (C) 2015  Renesas Electronics Corporation
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <dm/pinctrl.h>
+#include <linux/kernel.h>
+
+#include "sh_pfc.h"
+
+#define CFG_FLAGS (SH_PFC_PIN_CFG_DRIVE_STRENGTH | \
+                  SH_PFC_PIN_CFG_PULL_UP | \
+                  SH_PFC_PIN_CFG_PULL_DOWN)
+
+#define CPU_ALL_PORT(fn, sfx)                                          \
+       PORT_GP_CFG_16(0, fn, sfx, CFG_FLAGS),  \
+       PORT_GP_CFG_29(1, fn, sfx, CFG_FLAGS),  \
+       PORT_GP_CFG_15(2, fn, sfx, CFG_FLAGS),  \
+       PORT_GP_CFG_12(3, fn, sfx, CFG_FLAGS | SH_PFC_PIN_CFG_IO_VOLTAGE),      \
+       PORT_GP_CFG_1(3, 12, fn, sfx, CFG_FLAGS),       \
+       PORT_GP_CFG_1(3, 13, fn, sfx, CFG_FLAGS),       \
+       PORT_GP_CFG_1(3, 14, fn, sfx, CFG_FLAGS),       \
+       PORT_GP_CFG_1(3, 15, fn, sfx, CFG_FLAGS),       \
+       PORT_GP_CFG_18(4, fn, sfx, CFG_FLAGS | SH_PFC_PIN_CFG_IO_VOLTAGE),      \
+       PORT_GP_CFG_26(5, fn, sfx, CFG_FLAGS),  \
+       PORT_GP_CFG_32(6, fn, sfx, CFG_FLAGS),  \
+       PORT_GP_CFG_4(7, fn, sfx, CFG_FLAGS)
+/*
+ * F_() : just information
+ * FM() : macro for FN_xxx / xxx_MARK
+ */
+
+/* GPSR0 */
+#define GPSR0_15       F_(D15,                 IP7_11_8)
+#define GPSR0_14       F_(D14,                 IP7_7_4)
+#define GPSR0_13       F_(D13,                 IP7_3_0)
+#define GPSR0_12       F_(D12,                 IP6_31_28)
+#define GPSR0_11       F_(D11,                 IP6_27_24)
+#define GPSR0_10       F_(D10,                 IP6_23_20)
+#define GPSR0_9                F_(D9,                  IP6_19_16)
+#define GPSR0_8                F_(D8,                  IP6_15_12)
+#define GPSR0_7                F_(D7,                  IP6_11_8)
+#define GPSR0_6                F_(D6,                  IP6_7_4)
+#define GPSR0_5                F_(D5,                  IP6_3_0)
+#define GPSR0_4                F_(D4,                  IP5_31_28)
+#define GPSR0_3                F_(D3,                  IP5_27_24)
+#define GPSR0_2                F_(D2,                  IP5_23_20)
+#define GPSR0_1                F_(D1,                  IP5_19_16)
+#define GPSR0_0                F_(D0,                  IP5_15_12)
+
+/* GPSR1 */
+#define GPSR1_28       FM(CLKOUT)
+#define GPSR1_27       F_(EX_WAIT0_A,          IP5_11_8)
+#define GPSR1_26       F_(WE1_N,               IP5_7_4)
+#define GPSR1_25       F_(WE0_N,               IP5_3_0)
+#define GPSR1_24       F_(RD_WR_N,             IP4_31_28)
+#define GPSR1_23       F_(RD_N,                IP4_27_24)
+#define GPSR1_22       F_(BS_N,                IP4_23_20)
+#define GPSR1_21       F_(CS1_N,               IP4_19_16)
+#define GPSR1_20       F_(CS0_N,               IP4_15_12)
+#define GPSR1_19       F_(A19,                 IP4_11_8)
+#define GPSR1_18       F_(A18,                 IP4_7_4)
+#define GPSR1_17       F_(A17,                 IP4_3_0)
+#define GPSR1_16       F_(A16,                 IP3_31_28)
+#define GPSR1_15       F_(A15,                 IP3_27_24)
+#define GPSR1_14       F_(A14,                 IP3_23_20)
+#define GPSR1_13       F_(A13,                 IP3_19_16)
+#define GPSR1_12       F_(A12,                 IP3_15_12)
+#define GPSR1_11       F_(A11,                 IP3_11_8)
+#define GPSR1_10       F_(A10,                 IP3_7_4)
+#define GPSR1_9                F_(A9,                  IP3_3_0)
+#define GPSR1_8                F_(A8,                  IP2_31_28)
+#define GPSR1_7                F_(A7,                  IP2_27_24)
+#define GPSR1_6                F_(A6,                  IP2_23_20)
+#define GPSR1_5                F_(A5,                  IP2_19_16)
+#define GPSR1_4                F_(A4,                  IP2_15_12)
+#define GPSR1_3                F_(A3,                  IP2_11_8)
+#define GPSR1_2                F_(A2,                  IP2_7_4)
+#define GPSR1_1                F_(A1,                  IP2_3_0)
+#define GPSR1_0                F_(A0,                  IP1_31_28)
+
+/* GPSR2 */
+#define GPSR2_14       F_(AVB_AVTP_CAPTURE_A,  IP0_23_20)
+#define GPSR2_13       F_(AVB_AVTP_MATCH_A,    IP0_19_16)
+#define GPSR2_12       F_(AVB_LINK,            IP0_15_12)
+#define GPSR2_11       F_(AVB_PHY_INT,         IP0_11_8)
+#define GPSR2_10       F_(AVB_MAGIC,           IP0_7_4)
+#define GPSR2_9                F_(AVB_MDC,             IP0_3_0)
+#define GPSR2_8                F_(PWM2_A,              IP1_27_24)
+#define GPSR2_7                F_(PWM1_A,              IP1_23_20)
+#define GPSR2_6                F_(PWM0,                IP1_19_16)
+#define GPSR2_5                F_(IRQ5,                IP1_15_12)
+#define GPSR2_4                F_(IRQ4,                IP1_11_8)
+#define GPSR2_3                F_(IRQ3,                IP1_7_4)
+#define GPSR2_2                F_(IRQ2,                IP1_3_0)
+#define GPSR2_1                F_(IRQ1,                IP0_31_28)
+#define GPSR2_0                F_(IRQ0,                IP0_27_24)
+
+/* GPSR3 */
+#define GPSR3_15       F_(SD1_WP,              IP11_23_20)
+#define GPSR3_14       F_(SD1_CD,              IP11_19_16)
+#define GPSR3_13       F_(SD0_WP,              IP11_15_12)
+#define GPSR3_12       F_(SD0_CD,              IP11_11_8)
+#define GPSR3_11       F_(SD1_DAT3,            IP8_31_28)
+#define GPSR3_10       F_(SD1_DAT2,            IP8_27_24)
+#define GPSR3_9                F_(SD1_DAT1,            IP8_23_20)
+#define GPSR3_8                F_(SD1_DAT0,            IP8_19_16)
+#define GPSR3_7                F_(SD1_CMD,             IP8_15_12)
+#define GPSR3_6                F_(SD1_CLK,             IP8_11_8)
+#define GPSR3_5                F_(SD0_DAT3,            IP8_7_4)
+#define GPSR3_4                F_(SD0_DAT2,            IP8_3_0)
+#define GPSR3_3                F_(SD0_DAT1,            IP7_31_28)
+#define GPSR3_2                F_(SD0_DAT0,            IP7_27_24)
+#define GPSR3_1                F_(SD0_CMD,             IP7_23_20)
+#define GPSR3_0                F_(SD0_CLK,             IP7_19_16)
+
+/* GPSR4 */
+#define GPSR4_17       F_(SD3_DS,              IP11_7_4)
+#define GPSR4_16       F_(SD3_DAT7,            IP11_3_0)
+#define GPSR4_15       F_(SD3_DAT6,            IP10_31_28)
+#define GPSR4_14       F_(SD3_DAT5,            IP10_27_24)
+#define GPSR4_13       F_(SD3_DAT4,            IP10_23_20)
+#define GPSR4_12       F_(SD3_DAT3,            IP10_19_16)
+#define GPSR4_11       F_(SD3_DAT2,            IP10_15_12)
+#define GPSR4_10       F_(SD3_DAT1,            IP10_11_8)
+#define GPSR4_9                F_(SD3_DAT0,            IP10_7_4)
+#define GPSR4_8                F_(SD3_CMD,             IP10_3_0)
+#define GPSR4_7                F_(SD3_CLK,             IP9_31_28)
+#define GPSR4_6                F_(SD2_DS,              IP9_27_24)
+#define GPSR4_5                F_(SD2_DAT3,            IP9_23_20)
+#define GPSR4_4                F_(SD2_DAT2,            IP9_19_16)
+#define GPSR4_3                F_(SD2_DAT1,            IP9_15_12)
+#define GPSR4_2                F_(SD2_DAT0,            IP9_11_8)
+#define GPSR4_1                F_(SD2_CMD,             IP9_7_4)
+#define GPSR4_0                F_(SD2_CLK,             IP9_3_0)
+
+/* GPSR5 */
+#define GPSR5_25       F_(MLB_DAT,             IP14_19_16)
+#define GPSR5_24       F_(MLB_SIG,             IP14_15_12)
+#define GPSR5_23       F_(MLB_CLK,             IP14_11_8)
+#define GPSR5_22       FM(MSIOF0_RXD)
+#define GPSR5_21       F_(MSIOF0_SS2,          IP14_7_4)
+#define GPSR5_20       FM(MSIOF0_TXD)
+#define GPSR5_19       F_(MSIOF0_SS1,          IP14_3_0)
+#define GPSR5_18       F_(MSIOF0_SYNC,         IP13_31_28)
+#define GPSR5_17       FM(MSIOF0_SCK)
+#define GPSR5_16       F_(HRTS0_N,             IP13_27_24)
+#define GPSR5_15       F_(HCTS0_N,             IP13_23_20)
+#define GPSR5_14       F_(HTX0,                IP13_19_16)
+#define GPSR5_13       F_(HRX0,                IP13_15_12)
+#define GPSR5_12       F_(HSCK0,               IP13_11_8)
+#define GPSR5_11       F_(RX2_A,               IP13_7_4)
+#define GPSR5_10       F_(TX2_A,               IP13_3_0)
+#define GPSR5_9                F_(SCK2,                IP12_31_28)
+#define GPSR5_8                F_(RTS1_N,              IP12_27_24)
+#define GPSR5_7                F_(CTS1_N,              IP12_23_20)
+#define GPSR5_6                F_(TX1_A,               IP12_19_16)
+#define GPSR5_5                F_(RX1_A,               IP12_15_12)
+#define GPSR5_4                F_(RTS0_N,              IP12_11_8)
+#define GPSR5_3                F_(CTS0_N,              IP12_7_4)
+#define GPSR5_2                F_(TX0,                 IP12_3_0)
+#define GPSR5_1                F_(RX0,                 IP11_31_28)
+#define GPSR5_0                F_(SCK0,                IP11_27_24)
+
+/* GPSR6 */
+#define GPSR6_31       F_(GP6_31,              IP18_7_4)
+#define GPSR6_30       F_(GP6_30,              IP18_3_0)
+#define GPSR6_29       F_(USB30_OVC,           IP17_31_28)
+#define GPSR6_28       F_(USB30_PWEN,          IP17_27_24)
+#define GPSR6_27       F_(USB1_OVC,            IP17_23_20)
+#define GPSR6_26       F_(USB1_PWEN,           IP17_19_16)
+#define GPSR6_25       F_(USB0_OVC,            IP17_15_12)
+#define GPSR6_24       F_(USB0_PWEN,           IP17_11_8)
+#define GPSR6_23       F_(AUDIO_CLKB_B,        IP17_7_4)
+#define GPSR6_22       F_(AUDIO_CLKA_A,        IP17_3_0)
+#define GPSR6_21       F_(SSI_SDATA9_A,        IP16_31_28)
+#define GPSR6_20       F_(SSI_SDATA8,          IP16_27_24)
+#define GPSR6_19       F_(SSI_SDATA7,          IP16_23_20)
+#define GPSR6_18       F_(SSI_WS78,            IP16_19_16)
+#define GPSR6_17       F_(SSI_SCK78,           IP16_15_12)
+#define GPSR6_16       F_(SSI_SDATA6,          IP16_11_8)
+#define GPSR6_15       F_(SSI_WS6,             IP16_7_4)
+#define GPSR6_14       F_(SSI_SCK6,            IP16_3_0)
+#define GPSR6_13       FM(SSI_SDATA5)
+#define GPSR6_12       FM(SSI_WS5)
+#define GPSR6_11       FM(SSI_SCK5)
+#define GPSR6_10       F_(SSI_SDATA4,          IP15_31_28)
+#define GPSR6_9                F_(SSI_WS4,             IP15_27_24)
+#define GPSR6_8                F_(SSI_SCK4,            IP15_23_20)
+#define GPSR6_7                F_(SSI_SDATA3,          IP15_19_16)
+#define GPSR6_6                F_(SSI_WS349,           IP15_15_12)
+#define GPSR6_5                F_(SSI_SCK349,          IP15_11_8)
+#define GPSR6_4                F_(SSI_SDATA2_A,        IP15_7_4)
+#define GPSR6_3                F_(SSI_SDATA1_A,        IP15_3_0)
+#define GPSR6_2                F_(SSI_SDATA0,          IP14_31_28)
+#define GPSR6_1                F_(SSI_WS01239,         IP14_27_24)
+#define GPSR6_0                F_(SSI_SCK01239,        IP14_23_20)
+
+/* GPSR7 */
+#define GPSR7_3                FM(GP7_03)
+#define GPSR7_2                FM(HDMI0_CEC)
+#define GPSR7_1                FM(AVS2)
+#define GPSR7_0                FM(AVS1)
+
+
+/* IPSRx */            /* 0 */                 /* 1 */         /* 2 */                 /* 3 */                         /* 4 */         /* 5 */         /* 6 */                 /* 7 */         /* 8 */                 /* 9 */         /* A */         /* B */         /* C - F */
+#define IP0_3_0                FM(AVB_MDC)             F_(0, 0)        FM(MSIOF2_SS2_C)        F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP0_7_4                FM(AVB_MAGIC)           F_(0, 0)        FM(MSIOF2_SS1_C)        FM(SCK4_A)                      F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP0_11_8       FM(AVB_PHY_INT)         F_(0, 0)        FM(MSIOF2_SYNC_C)       FM(RX4_A)                       F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP0_15_12      FM(AVB_LINK)            F_(0, 0)        FM(MSIOF2_SCK_C)        FM(TX4_A)                       F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP0_19_16      FM(AVB_AVTP_MATCH_A)    F_(0, 0)        FM(MSIOF2_RXD_C)        FM(CTS4_N_A)                    F_(0, 0)        FM(FSCLKST2_N_A) F_(0, 0)               F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP0_23_20      FM(AVB_AVTP_CAPTURE_A)  F_(0, 0)        FM(MSIOF2_TXD_C)        FM(RTS4_N_A)                    F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP0_27_24      FM(IRQ0)                FM(QPOLB)       F_(0, 0)                FM(DU_CDE)                      FM(VI4_DATA0_B) FM(CAN0_TX_B)   FM(CANFD0_TX_B)         FM(MSIOF3_SS2_E) F_(0, 0)               F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP0_31_28      FM(IRQ1)                FM(QPOLA)       F_(0, 0)                FM(DU_DISP)                     FM(VI4_DATA1_B) FM(CAN0_RX_B)   FM(CANFD0_RX_B)         FM(MSIOF3_SS1_E) F_(0, 0)               F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_3_0                FM(IRQ2)                FM(QCPV_QDE)    F_(0, 0)                FM(DU_EXODDF_DU_ODDF_DISP_CDE)  FM(VI4_DATA2_B) F_(0, 0)        F_(0, 0)                FM(MSIOF3_SYNC_E) F_(0, 0)              FM(PWM3_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_7_4                FM(IRQ3)                FM(QSTVB_QVE)   F_(0, 0)                FM(DU_DOTCLKOUT1)               FM(VI4_DATA3_B) F_(0, 0)        F_(0, 0)                FM(MSIOF3_SCK_E) F_(0, 0)               FM(PWM4_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_11_8       FM(IRQ4)                FM(QSTH_QHS)    F_(0, 0)                FM(DU_EXHSYNC_DU_HSYNC)         FM(VI4_DATA4_B) F_(0, 0)        F_(0, 0)                FM(MSIOF3_RXD_E) F_(0, 0)               FM(PWM5_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_15_12      FM(IRQ5)                FM(QSTB_QHE)    F_(0, 0)                FM(DU_EXVSYNC_DU_VSYNC)         FM(VI4_DATA5_B) FM(FSCLKST2_N_B) F_(0, 0)               FM(MSIOF3_TXD_E) F_(0, 0)               FM(PWM6_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_19_16      FM(PWM0)                FM(AVB_AVTP_PPS)F_(0, 0)                F_(0, 0)                        FM(VI4_DATA6_B) F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                FM(IECLK_B)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_23_20      FM(PWM1_A)              F_(0, 0)        F_(0, 0)                FM(HRX3_D)                      FM(VI4_DATA7_B) F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                FM(IERX_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_27_24      FM(PWM2_A)              F_(0, 0)        F_(0, 0)                FM(HTX3_D)                      F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                FM(IETX_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_31_28      FM(A0)                  FM(LCDOUT16)    FM(MSIOF3_SYNC_B)       F_(0, 0)                        FM(VI4_DATA8)   F_(0, 0)        FM(DU_DB0)              F_(0, 0)        F_(0, 0)                FM(PWM3_A)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP2_3_0                FM(A1)                  FM(LCDOUT17)    FM(MSIOF3_TXD_B)        F_(0, 0)                        FM(VI4_DATA9)   F_(0, 0)        FM(DU_DB1)              F_(0, 0)        F_(0, 0)                FM(PWM4_A)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP2_7_4                FM(A2)                  FM(LCDOUT18)    FM(MSIOF3_SCK_B)        F_(0, 0)                        FM(VI4_DATA10)  F_(0, 0)        FM(DU_DB2)              F_(0, 0)        F_(0, 0)                FM(PWM5_A)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP2_11_8       FM(A3)                  FM(LCDOUT19)    FM(MSIOF3_RXD_B)        F_(0, 0)                        FM(VI4_DATA11)  F_(0, 0)        FM(DU_DB3)              F_(0, 0)        F_(0, 0)                FM(PWM6_A)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP2_15_12      FM(A4)                  FM(LCDOUT20)    FM(MSIOF3_SS1_B)        F_(0, 0)                        FM(VI4_DATA12)  FM(VI5_DATA12)  FM(DU_DB4)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP2_19_16      FM(A5)                  FM(LCDOUT21)    FM(MSIOF3_SS2_B)        FM(SCK4_B)                      FM(VI4_DATA13)  FM(VI5_DATA13)  FM(DU_DB5)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP2_23_20      FM(A6)                  FM(LCDOUT22)    FM(MSIOF2_SS1_A)        FM(RX4_B)                       FM(VI4_DATA14)  FM(VI5_DATA14)  FM(DU_DB6)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP2_27_24      FM(A7)                  FM(LCDOUT23)    FM(MSIOF2_SS2_A)        FM(TX4_B)                       FM(VI4_DATA15)  FM(VI5_DATA15)  FM(DU_DB7)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP2_31_28      FM(A8)                  FM(RX3_B)       FM(MSIOF2_SYNC_A)       FM(HRX4_B)                      F_(0, 0)        F_(0, 0)        F_(0, 0)                FM(SDA6_A)      FM(AVB_AVTP_MATCH_B)    FM(PWM1_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_3_0                FM(A9)                  F_(0, 0)        FM(MSIOF2_SCK_A)        FM(CTS4_N_B)                    F_(0, 0)        FM(VI5_VSYNC_N) F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_7_4                FM(A10)                 F_(0, 0)        FM(MSIOF2_RXD_A)        FM(RTS4_N_B)                    F_(0, 0)        FM(VI5_HSYNC_N) F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_11_8       FM(A11)                 FM(TX3_B)       FM(MSIOF2_TXD_A)        FM(HTX4_B)                      FM(HSCK4)       FM(VI5_FIELD)   F_(0, 0)                FM(SCL6_A)      FM(AVB_AVTP_CAPTURE_B)  FM(PWM2_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+
+/* IPSRx */            /* 0 */                 /* 1 */         /* 2 */                 /* 3 */                         /* 4 */         /* 5 */         /* 6 */                 /* 7 */         /* 8 */                 /* 9 */         /* A */         /* B */         /* C - F */
+#define IP3_15_12      FM(A12)                 FM(LCDOUT12)    FM(MSIOF3_SCK_C)        F_(0, 0)                        FM(HRX4_A)      FM(VI5_DATA8)   FM(DU_DG4)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_19_16      FM(A13)                 FM(LCDOUT13)    FM(MSIOF3_SYNC_C)       F_(0, 0)                        FM(HTX4_A)      FM(VI5_DATA9)   FM(DU_DG5)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_23_20      FM(A14)                 FM(LCDOUT14)    FM(MSIOF3_RXD_C)        F_(0, 0)                        FM(HCTS4_N)     FM(VI5_DATA10)  FM(DU_DG6)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_27_24      FM(A15)                 FM(LCDOUT15)    FM(MSIOF3_TXD_C)        F_(0, 0)                        FM(HRTS4_N)     FM(VI5_DATA11)  FM(DU_DG7)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_31_28      FM(A16)                 FM(LCDOUT8)     F_(0, 0)                F_(0, 0)                        FM(VI4_FIELD)   F_(0, 0)        FM(DU_DG0)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP4_3_0                FM(A17)                 FM(LCDOUT9)     F_(0, 0)                F_(0, 0)                        FM(VI4_VSYNC_N) F_(0, 0)        FM(DU_DG1)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP4_7_4                FM(A18)                 FM(LCDOUT10)    F_(0, 0)                F_(0, 0)                        FM(VI4_HSYNC_N) F_(0, 0)        FM(DU_DG2)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP4_11_8       FM(A19)                 FM(LCDOUT11)    F_(0, 0)                F_(0, 0)                        FM(VI4_CLKENB)  F_(0, 0)        FM(DU_DG3)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP4_15_12      FM(CS0_N)               F_(0, 0)        F_(0, 0)                F_(0, 0)                        F_(0, 0)        FM(VI5_CLKENB)  F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP4_19_16      FM(CS1_N)               F_(0, 0)        F_(0, 0)                F_(0, 0)                        F_(0, 0)        FM(VI5_CLK)     F_(0, 0)                FM(EX_WAIT0_B)  F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP4_23_20      FM(BS_N)                FM(QSTVA_QVS)   FM(MSIOF3_SCK_D)        FM(SCK3)                        FM(HSCK3)       F_(0, 0)        F_(0, 0)                F_(0, 0)        FM(CAN1_TX)             FM(CANFD1_TX)   FM(IETX_A)      F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP4_27_24      FM(RD_N)                F_(0, 0)        FM(MSIOF3_SYNC_D)       FM(RX3_A)                       FM(HRX3_A)      F_(0, 0)        F_(0, 0)                F_(0, 0)        FM(CAN0_TX_A)           FM(CANFD0_TX_A) F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP4_31_28      FM(RD_WR_N)             F_(0, 0)        FM(MSIOF3_RXD_D)        FM(TX3_A)                       FM(HTX3_A)      F_(0, 0)        F_(0, 0)                F_(0, 0)        FM(CAN0_RX_A)           FM(CANFD0_RX_A) F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_3_0                FM(WE0_N)               F_(0, 0)        FM(MSIOF3_TXD_D)        FM(CTS3_N)                      FM(HCTS3_N)     F_(0, 0)        F_(0, 0)                FM(SCL6_B)      FM(CAN_CLK)             F_(0, 0)        FM(IECLK_A)     F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_7_4                FM(WE1_N)               F_(0, 0)        FM(MSIOF3_SS1_D)        FM(RTS3_N)                      FM(HRTS3_N)     F_(0, 0)        F_(0, 0)                FM(SDA6_B)      FM(CAN1_RX)             FM(CANFD1_RX)   FM(IERX_A)      F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_11_8       FM(EX_WAIT0_A)          FM(QCLK)        F_(0, 0)                F_(0, 0)                        FM(VI4_CLK)     F_(0, 0)        FM(DU_DOTCLKOUT0)       F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_15_12      FM(D0)                  FM(MSIOF2_SS1_B)FM(MSIOF3_SCK_A)        F_(0, 0)                        FM(VI4_DATA16)  FM(VI5_DATA0)   F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_19_16      FM(D1)                  FM(MSIOF2_SS2_B)FM(MSIOF3_SYNC_A)       F_(0, 0)                        FM(VI4_DATA17)  FM(VI5_DATA1)   F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_23_20      FM(D2)                  F_(0, 0)        FM(MSIOF3_RXD_A)        F_(0, 0)                        FM(VI4_DATA18)  FM(VI5_DATA2)   F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_27_24      FM(D3)                  F_(0, 0)        FM(MSIOF3_TXD_A)        F_(0, 0)                        FM(VI4_DATA19)  FM(VI5_DATA3)   F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_31_28      FM(D4)                  FM(MSIOF2_SCK_B)F_(0, 0)                F_(0, 0)                        FM(VI4_DATA20)  FM(VI5_DATA4)   F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_3_0                FM(D5)                  FM(MSIOF2_SYNC_B)F_(0, 0)               F_(0, 0)                        FM(VI4_DATA21)  FM(VI5_DATA5)   F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_7_4                FM(D6)                  FM(MSIOF2_RXD_B)F_(0, 0)                F_(0, 0)                        FM(VI4_DATA22)  FM(VI5_DATA6)   F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_11_8       FM(D7)                  FM(MSIOF2_TXD_B)F_(0, 0)                F_(0, 0)                        FM(VI4_DATA23)  FM(VI5_DATA7)   F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_15_12      FM(D8)                  FM(LCDOUT0)     FM(MSIOF2_SCK_D)        FM(SCK4_C)                      FM(VI4_DATA0_A) F_(0, 0)        FM(DU_DR0)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_19_16      FM(D9)                  FM(LCDOUT1)     FM(MSIOF2_SYNC_D)       F_(0, 0)                        FM(VI4_DATA1_A) F_(0, 0)        FM(DU_DR1)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_23_20      FM(D10)                 FM(LCDOUT2)     FM(MSIOF2_RXD_D)        FM(HRX3_B)                      FM(VI4_DATA2_A) FM(CTS4_N_C)    FM(DU_DR2)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_27_24      FM(D11)                 FM(LCDOUT3)     FM(MSIOF2_TXD_D)        FM(HTX3_B)                      FM(VI4_DATA3_A) FM(RTS4_N_C)    FM(DU_DR3)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_31_28      FM(D12)                 FM(LCDOUT4)     FM(MSIOF2_SS1_D)        FM(RX4_C)                       FM(VI4_DATA4_A) F_(0, 0)        FM(DU_DR4)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+
+/* IPSRx */            /* 0 */                 /* 1 */         /* 2 */                 /* 3 */                         /* 4 */         /* 5 */         /* 6 */                 /* 7 */         /* 8 */                 /* 9 */         /* A */         /* B */         /* C - F */
+#define IP7_3_0                FM(D13)                 FM(LCDOUT5)     FM(MSIOF2_SS2_D)        FM(TX4_C)                       FM(VI4_DATA5_A) F_(0, 0)        FM(DU_DR5)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP7_7_4                FM(D14)                 FM(LCDOUT6)     FM(MSIOF3_SS1_A)        FM(HRX3_C)                      FM(VI4_DATA6_A) F_(0, 0)        FM(DU_DR6)              FM(SCL6_C)      F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP7_11_8       FM(D15)                 FM(LCDOUT7)     FM(MSIOF3_SS2_A)        FM(HTX3_C)                      FM(VI4_DATA7_A) F_(0, 0)        FM(DU_DR7)              FM(SDA6_C)      F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP7_19_16      FM(SD0_CLK)             F_(0, 0)        FM(MSIOF1_SCK_E)        F_(0, 0)                        F_(0, 0)        F_(0, 0)        FM(STP_OPWM_0_B)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP7_23_20      FM(SD0_CMD)             F_(0, 0)        FM(MSIOF1_SYNC_E)       F_(0, 0)                        F_(0, 0)        F_(0, 0)        FM(STP_IVCXO27_0_B)     F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP7_27_24      FM(SD0_DAT0)            F_(0, 0)        FM(MSIOF1_RXD_E)        F_(0, 0)                        F_(0, 0)        FM(TS_SCK0_B)   FM(STP_ISCLK_0_B)       F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP7_31_28      FM(SD0_DAT1)            F_(0, 0)        FM(MSIOF1_TXD_E)        F_(0, 0)                        F_(0, 0)        FM(TS_SPSYNC0_B)FM(STP_ISSYNC_0_B)      F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP8_3_0                FM(SD0_DAT2)            F_(0, 0)        FM(MSIOF1_SS1_E)        F_(0, 0)                        F_(0, 0)        FM(TS_SDAT0_B)  FM(STP_ISD_0_B)         F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP8_7_4                FM(SD0_DAT3)            F_(0, 0)        FM(MSIOF1_SS2_E)        F_(0, 0)                        F_(0, 0)        FM(TS_SDEN0_B)  FM(STP_ISEN_0_B)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP8_11_8       FM(SD1_CLK)             F_(0, 0)        FM(MSIOF1_SCK_G)        F_(0, 0)                        F_(0, 0)        FM(SIM0_CLK_A)  F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP8_15_12      FM(SD1_CMD)             F_(0, 0)        FM(MSIOF1_SYNC_G)       FM(NFCE_N_B)                    F_(0, 0)        FM(SIM0_D_A)    FM(STP_IVCXO27_1_B)     F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP8_19_16      FM(SD1_DAT0)            FM(SD2_DAT4)    FM(MSIOF1_RXD_G)        FM(NFWP_N_B)                    F_(0, 0)        FM(TS_SCK1_B)   FM(STP_ISCLK_1_B)       F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP8_23_20      FM(SD1_DAT1)            FM(SD2_DAT5)    FM(MSIOF1_TXD_G)        FM(NFDATA14_B)                  F_(0, 0)        FM(TS_SPSYNC1_B)FM(STP_ISSYNC_1_B)      F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP8_27_24      FM(SD1_DAT2)            FM(SD2_DAT6)    FM(MSIOF1_SS1_G)        FM(NFDATA15_B)                  F_(0, 0)        FM(TS_SDAT1_B)  FM(STP_ISD_1_B)         F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP8_31_28      FM(SD1_DAT3)            FM(SD2_DAT7)    FM(MSIOF1_SS2_G)        FM(NFRB_N_B)                    F_(0, 0)        FM(TS_SDEN1_B)  FM(STP_ISEN_1_B)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP9_3_0                FM(SD2_CLK)             F_(0, 0)        FM(NFDATA8)             F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP9_7_4                FM(SD2_CMD)             F_(0, 0)        FM(NFDATA9)             F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP9_11_8       FM(SD2_DAT0)            F_(0, 0)        FM(NFDATA10)            F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP9_15_12      FM(SD2_DAT1)            F_(0, 0)        FM(NFDATA11)            F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP9_19_16      FM(SD2_DAT2)            F_(0, 0)        FM(NFDATA12)            F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP9_23_20      FM(SD2_DAT3)            F_(0, 0)        FM(NFDATA13)            F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP9_27_24      FM(SD2_DS)              F_(0, 0)        FM(NFALE)               F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        FM(SATA_DEVSLP_B)       F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP9_31_28      FM(SD3_CLK)             F_(0, 0)        FM(NFWE_N)              F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP10_3_0       FM(SD3_CMD)             F_(0, 0)        FM(NFRE_N)              F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP10_7_4       FM(SD3_DAT0)            F_(0, 0)        FM(NFDATA0)             F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP10_11_8      FM(SD3_DAT1)            F_(0, 0)        FM(NFDATA1)             F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP10_15_12     FM(SD3_DAT2)            F_(0, 0)        FM(NFDATA2)             F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP10_19_16     FM(SD3_DAT3)            F_(0, 0)        FM(NFDATA3)             F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP10_23_20     FM(SD3_DAT4)            FM(SD2_CD_A)    FM(NFDATA4)             F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP10_27_24     FM(SD3_DAT5)            FM(SD2_WP_A)    FM(NFDATA5)             F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP10_31_28     FM(SD3_DAT6)            FM(SD3_CD)      FM(NFDATA6)             F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP11_3_0       FM(SD3_DAT7)            FM(SD3_WP)      FM(NFDATA7)             F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP11_7_4       FM(SD3_DS)              F_(0, 0)        FM(NFCLE)               F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP11_11_8      FM(SD0_CD)              F_(0, 0)        FM(NFDATA14_A)          F_(0, 0)                        FM(SCL2_B)      FM(SIM0_RST_A)  F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+
+/* IPSRx */            /* 0 */                 /* 1 */         /* 2 */                 /* 3 */                         /* 4 */         /* 5 */         /* 6 */                 /* 7 */         /* 8 */                 /* 9 */         /* A */         /* B */         /* C - F */
+#define IP11_15_12     FM(SD0_WP)              F_(0, 0)        FM(NFDATA15_A)          F_(0, 0)                        FM(SDA2_B)      F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP11_19_16     FM(SD1_CD)              F_(0, 0)        FM(NFRB_N_A)            F_(0, 0)                        F_(0, 0)        FM(SIM0_CLK_B)  F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP11_23_20     FM(SD1_WP)              F_(0, 0)        FM(NFCE_N_A)            F_(0, 0)                        F_(0, 0)        FM(SIM0_D_B)    F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP11_27_24     FM(SCK0)                FM(HSCK1_B)     FM(MSIOF1_SS2_B)        FM(AUDIO_CLKC_B)                FM(SDA2_A)      FM(SIM0_RST_B)  FM(STP_OPWM_0_C)        FM(RIF0_CLK_B)  F_(0, 0)                FM(ADICHS2)     FM(SCK5_B)      F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP11_31_28     FM(RX0)                 FM(HRX1_B)      F_(0, 0)                F_(0, 0)                        F_(0, 0)        FM(TS_SCK0_C)   FM(STP_ISCLK_0_C)       FM(RIF0_D0_B)   F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP12_3_0       FM(TX0)                 FM(HTX1_B)      F_(0, 0)                F_(0, 0)                        F_(0, 0)        FM(TS_SPSYNC0_C)FM(STP_ISSYNC_0_C)      FM(RIF0_D1_B)   F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP12_7_4       FM(CTS0_N)              FM(HCTS1_N_B)   FM(MSIOF1_SYNC_B)       F_(0, 0)                        F_(0, 0)        FM(TS_SPSYNC1_C)FM(STP_ISSYNC_1_C)      FM(RIF1_SYNC_B) FM(AUDIO_CLKOUT_C)      FM(ADICS_SAMP)  F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP12_11_8      FM(RTS0_N)              FM(HRTS1_N_B)   FM(MSIOF1_SS1_B)        FM(AUDIO_CLKA_B)                FM(SCL2_A)      F_(0, 0)        FM(STP_IVCXO27_1_C)     FM(RIF0_SYNC_B) F_(0, 0)                FM(ADICHS1)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP12_15_12     FM(RX1_A)               FM(HRX1_A)      F_(0, 0)                F_(0, 0)                        F_(0, 0)        FM(TS_SDAT0_C)  FM(STP_ISD_0_C)         FM(RIF1_CLK_C)  F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP12_19_16     FM(TX1_A)               FM(HTX1_A)      F_(0, 0)                F_(0, 0)                        F_(0, 0)        FM(TS_SDEN0_C)  FM(STP_ISEN_0_C)        FM(RIF1_D0_C)   F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP12_23_20     FM(CTS1_N)              FM(HCTS1_N_A)   FM(MSIOF1_RXD_B)        F_(0, 0)                        F_(0, 0)        FM(TS_SDEN1_C)  FM(STP_ISEN_1_C)        FM(RIF1_D0_B)   F_(0, 0)                FM(ADIDATA)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP12_27_24     FM(RTS1_N)              FM(HRTS1_N_A)   FM(MSIOF1_TXD_B)        F_(0, 0)                        F_(0, 0)        FM(TS_SDAT1_C)  FM(STP_ISD_1_C)         FM(RIF1_D1_B)   F_(0, 0)                FM(ADICHS0)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP12_31_28     FM(SCK2)                FM(SCIF_CLK_B)  FM(MSIOF1_SCK_B)        F_(0, 0)                        F_(0, 0)        FM(TS_SCK1_C)   FM(STP_ISCLK_1_C)       FM(RIF1_CLK_B)  F_(0, 0)                FM(ADICLK)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP13_3_0       FM(TX2_A)               F_(0, 0)        F_(0, 0)                FM(SD2_CD_B)                    FM(SCL1_A)      F_(0, 0)        FM(FMCLK_A)             FM(RIF1_D1_C)   F_(0, 0)                FM(FSO_CFE_0_N) F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP13_7_4       FM(RX2_A)               F_(0, 0)        F_(0, 0)                FM(SD2_WP_B)                    FM(SDA1_A)      F_(0, 0)        FM(FMIN_A)              FM(RIF1_SYNC_C) F_(0, 0)                FM(FSO_CFE_1_N) F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP13_11_8      FM(HSCK0)               F_(0, 0)        FM(MSIOF1_SCK_D)        FM(AUDIO_CLKB_A)                FM(SSI_SDATA1_B)FM(TS_SCK0_D)   FM(STP_ISCLK_0_D)       FM(RIF0_CLK_C)  F_(0, 0)                F_(0, 0)        FM(RX5_B)       F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP13_15_12     FM(HRX0)                F_(0, 0)        FM(MSIOF1_RXD_D)        F_(0, 0)                        FM(SSI_SDATA2_B)FM(TS_SDEN0_D)  FM(STP_ISEN_0_D)        FM(RIF0_D0_C)   F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP13_19_16     FM(HTX0)                F_(0, 0)        FM(MSIOF1_TXD_D)        F_(0, 0)                        FM(SSI_SDATA9_B)FM(TS_SDAT0_D)  FM(STP_ISD_0_D)         FM(RIF0_D1_C)   F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP13_23_20     FM(HCTS0_N)             FM(RX2_B)       FM(MSIOF1_SYNC_D)       F_(0, 0)                        FM(SSI_SCK9_A)  FM(TS_SPSYNC0_D)FM(STP_ISSYNC_0_D)      FM(RIF0_SYNC_C) FM(AUDIO_CLKOUT1_A)     F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP13_27_24     FM(HRTS0_N)             FM(TX2_B)       FM(MSIOF1_SS1_D)        F_(0, 0)                        FM(SSI_WS9_A)   F_(0, 0)        FM(STP_IVCXO27_0_D)     FM(BPFCLK_A)    FM(AUDIO_CLKOUT2_A)     F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP13_31_28     FM(MSIOF0_SYNC)         F_(0, 0)        F_(0, 0)                F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        FM(AUDIO_CLKOUT_A)      F_(0, 0)        FM(TX5_B)       F_(0, 0)        F_(0, 0) FM(BPFCLK_D) F_(0, 0) F_(0, 0)
+#define IP14_3_0       FM(MSIOF0_SS1)          FM(RX5_A)       FM(NFWP_N_A)            FM(AUDIO_CLKA_C)                FM(SSI_SCK2_A)  F_(0, 0)        FM(STP_IVCXO27_0_C)     F_(0, 0)        FM(AUDIO_CLKOUT3_A)     F_(0, 0)        FM(TCLK1_B)     F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP14_7_4       FM(MSIOF0_SS2)          FM(TX5_A)       FM(MSIOF1_SS2_D)        FM(AUDIO_CLKC_A)                FM(SSI_WS2_A)   F_(0, 0)        FM(STP_OPWM_0_D)        F_(0, 0)        FM(AUDIO_CLKOUT_D)      F_(0, 0)        FM(SPEEDIN_B)   F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP14_11_8      FM(MLB_CLK)             F_(0, 0)        FM(MSIOF1_SCK_F)        F_(0, 0)                        FM(SCL1_B)      F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP14_15_12     FM(MLB_SIG)             FM(RX1_B)       FM(MSIOF1_SYNC_F)       F_(0, 0)                        FM(SDA1_B)      F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP14_19_16     FM(MLB_DAT)             FM(TX1_B)       FM(MSIOF1_RXD_F)        F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP14_23_20     FM(SSI_SCK01239)        F_(0, 0)        FM(MSIOF1_TXD_F)        F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP14_27_24     FM(SSI_WS01239)         F_(0, 0)        FM(MSIOF1_SS1_F)        F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+
+/* IPSRx */            /* 0 */                 /* 1 */         /* 2 */                 /* 3 */                         /* 4 */         /* 5 */         /* 6 */                 /* 7 */         /* 8 */                 /* 9 */         /* A */         /* B */         /* C - F */
+#define IP14_31_28     FM(SSI_SDATA0)          F_(0, 0)        FM(MSIOF1_SS2_F)        F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP15_3_0       FM(SSI_SDATA1_A)        F_(0, 0)        F_(0, 0)                F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP15_7_4       FM(SSI_SDATA2_A)        F_(0, 0)        F_(0, 0)                F_(0, 0)                        FM(SSI_SCK1_B)  F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP15_11_8      FM(SSI_SCK349)          F_(0, 0)        FM(MSIOF1_SS1_A)        F_(0, 0)                        F_(0, 0)        F_(0, 0)        FM(STP_OPWM_0_A)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP15_15_12     FM(SSI_WS349)           FM(HCTS2_N_A)   FM(MSIOF1_SS2_A)        F_(0, 0)                        F_(0, 0)        F_(0, 0)        FM(STP_IVCXO27_0_A)     F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP15_19_16     FM(SSI_SDATA3)          FM(HRTS2_N_A)   FM(MSIOF1_TXD_A)        F_(0, 0)                        F_(0, 0)        FM(TS_SCK0_A)   FM(STP_ISCLK_0_A)       FM(RIF0_D1_A)   FM(RIF2_D0_A)           F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP15_23_20     FM(SSI_SCK4)            FM(HRX2_A)      FM(MSIOF1_SCK_A)        F_(0, 0)                        F_(0, 0)        FM(TS_SDAT0_A)  FM(STP_ISD_0_A)         FM(RIF0_CLK_A)  FM(RIF2_CLK_A)          F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP15_27_24     FM(SSI_WS4)             FM(HTX2_A)      FM(MSIOF1_SYNC_A)       F_(0, 0)                        F_(0, 0)        FM(TS_SDEN0_A)  FM(STP_ISEN_0_A)        FM(RIF0_SYNC_A) FM(RIF2_SYNC_A)         F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP15_31_28     FM(SSI_SDATA4)          FM(HSCK2_A)     FM(MSIOF1_RXD_A)        F_(0, 0)                        F_(0, 0)        FM(TS_SPSYNC0_A)FM(STP_ISSYNC_0_A)      FM(RIF0_D0_A)   FM(RIF2_D1_A)           F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP16_3_0       FM(SSI_SCK6)            F_(0, 0)        F_(0, 0)                FM(SIM0_RST_D)                  F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP16_7_4       FM(SSI_WS6)             F_(0, 0)        F_(0, 0)                FM(SIM0_D_D)                    F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP16_11_8      FM(SSI_SDATA6)          F_(0, 0)        F_(0, 0)                FM(SIM0_CLK_D)                  F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        FM(SATA_DEVSLP_A)       F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP16_15_12     FM(SSI_SCK78)           FM(HRX2_B)      FM(MSIOF1_SCK_C)        F_(0, 0)                        F_(0, 0)        FM(TS_SCK1_A)   FM(STP_ISCLK_1_A)       FM(RIF1_CLK_A)  FM(RIF3_CLK_A)          F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP16_19_16     FM(SSI_WS78)            FM(HTX2_B)      FM(MSIOF1_SYNC_C)       F_(0, 0)                        F_(0, 0)        FM(TS_SDAT1_A)  FM(STP_ISD_1_A)         FM(RIF1_SYNC_A) FM(RIF3_SYNC_A)         F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP16_23_20     FM(SSI_SDATA7)          FM(HCTS2_N_B)   FM(MSIOF1_RXD_C)        F_(0, 0)                        F_(0, 0)        FM(TS_SDEN1_A)  FM(STP_ISEN_1_A)        FM(RIF1_D0_A)   FM(RIF3_D0_A)           F_(0, 0)        FM(TCLK2_A)     F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP16_27_24     FM(SSI_SDATA8)          FM(HRTS2_N_B)   FM(MSIOF1_TXD_C)        F_(0, 0)                        F_(0, 0)        FM(TS_SPSYNC1_A)FM(STP_ISSYNC_1_A)      FM(RIF1_D1_A)   FM(RIF3_D1_A)           F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP16_31_28     FM(SSI_SDATA9_A)        FM(HSCK2_B)     FM(MSIOF1_SS1_C)        FM(HSCK1_A)                     FM(SSI_WS1_B)   FM(SCK1)        FM(STP_IVCXO27_1_A)     FM(SCK5_A)      F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP17_3_0       FM(AUDIO_CLKA_A)        F_(0, 0)        F_(0, 0)                F_(0, 0)                        F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        FM(CC5_OSCOUT)  F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP17_7_4       FM(AUDIO_CLKB_B)        FM(SCIF_CLK_A)  F_(0, 0)                F_(0, 0)                        F_(0, 0)        F_(0, 0)        FM(STP_IVCXO27_1_D)     FM(REMOCON_A)   F_(0, 0)                F_(0, 0)        FM(TCLK1_A)     F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP17_11_8      FM(USB0_PWEN)           F_(0, 0)        F_(0, 0)                FM(SIM0_RST_C)                  F_(0, 0)        FM(TS_SCK1_D)   FM(STP_ISCLK_1_D)       FM(BPFCLK_B)    FM(RIF3_CLK_B)          F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) FM(HSCK2_C) F_(0, 0) F_(0, 0)
+#define IP17_15_12     FM(USB0_OVC)            F_(0, 0)        F_(0, 0)                FM(SIM0_D_C)                    F_(0, 0)        FM(TS_SDAT1_D)  FM(STP_ISD_1_D)         F_(0, 0)        FM(RIF3_SYNC_B)         F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) FM(HRX2_C) F_(0, 0) F_(0, 0)
+#define IP17_19_16     FM(USB1_PWEN)           F_(0, 0)        F_(0, 0)                FM(SIM0_CLK_C)                  FM(SSI_SCK1_A)  FM(TS_SCK0_E)   FM(STP_ISCLK_0_E)       FM(FMCLK_B)     FM(RIF2_CLK_B)          F_(0, 0)        FM(SPEEDIN_A)   F_(0, 0)        F_(0, 0) FM(HTX2_C) F_(0, 0) F_(0, 0)
+#define IP17_23_20     FM(USB1_OVC)            F_(0, 0)        FM(MSIOF1_SS2_C)        F_(0, 0)                        FM(SSI_WS1_A)   FM(TS_SDAT0_E)  FM(STP_ISD_0_E)         FM(FMIN_B)      FM(RIF2_SYNC_B)         F_(0, 0)        FM(REMOCON_B)   F_(0, 0)        F_(0, 0) FM(HCTS2_N_C) F_(0, 0) F_(0, 0)
+#define IP17_27_24     FM(USB30_PWEN)          F_(0, 0)        F_(0, 0)                FM(AUDIO_CLKOUT_B)              FM(SSI_SCK2_B)  FM(TS_SDEN1_D)  FM(STP_ISEN_1_D)        FM(STP_OPWM_0_E)FM(RIF3_D0_B)           F_(0, 0)        FM(TCLK2_B)     FM(TPU0TO0)     FM(BPFCLK_C) FM(HRTS2_N_C) F_(0, 0) F_(0, 0)
+#define IP17_31_28     FM(USB30_OVC)           F_(0, 0)        F_(0, 0)                FM(AUDIO_CLKOUT1_B)             FM(SSI_WS2_B)   FM(TS_SPSYNC1_D)FM(STP_ISSYNC_1_D)      FM(STP_IVCXO27_0_E)FM(RIF3_D1_B)        F_(0, 0)        FM(FSO_TOE_N)   FM(TPU0TO1)     F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP18_3_0       FM(GP6_30)              F_(0, 0)        F_(0, 0)                FM(AUDIO_CLKOUT2_B)             FM(SSI_SCK9_B)  FM(TS_SDEN0_E)  FM(STP_ISEN_0_E)        F_(0, 0)        FM(RIF2_D0_B)           F_(0, 0)        F_(0, 0)        FM(TPU0TO2)     FM(FMCLK_C) FM(FMCLK_D) F_(0, 0) F_(0, 0)
+#define IP18_7_4       FM(GP6_31)              F_(0, 0)        F_(0, 0)                FM(AUDIO_CLKOUT3_B)             FM(SSI_WS9_B)   FM(TS_SPSYNC0_E)FM(STP_ISSYNC_0_E)      F_(0, 0)        FM(RIF2_D1_B)           F_(0, 0)        F_(0, 0)        FM(TPU0TO3)     FM(FMIN_C) FM(FMIN_D) F_(0, 0) F_(0, 0)
+
+#define PINMUX_GPSR    \
+\
+                                                                                               GPSR6_31 \
+                                                                                               GPSR6_30 \
+                                                                                               GPSR6_29 \
+               GPSR1_28                                                                        GPSR6_28 \
+               GPSR1_27                                                                        GPSR6_27 \
+               GPSR1_26                                                                        GPSR6_26 \
+               GPSR1_25                                                        GPSR5_25        GPSR6_25 \
+               GPSR1_24                                                        GPSR5_24        GPSR6_24 \
+               GPSR1_23                                                        GPSR5_23        GPSR6_23 \
+               GPSR1_22                                                        GPSR5_22        GPSR6_22 \
+               GPSR1_21                                                        GPSR5_21        GPSR6_21 \
+               GPSR1_20                                                        GPSR5_20        GPSR6_20 \
+               GPSR1_19                                                        GPSR5_19        GPSR6_19 \
+               GPSR1_18                                                        GPSR5_18        GPSR6_18 \
+               GPSR1_17                                        GPSR4_17        GPSR5_17        GPSR6_17 \
+               GPSR1_16                                        GPSR4_16        GPSR5_16        GPSR6_16 \
+GPSR0_15       GPSR1_15                        GPSR3_15        GPSR4_15        GPSR5_15        GPSR6_15 \
+GPSR0_14       GPSR1_14        GPSR2_14        GPSR3_14        GPSR4_14        GPSR5_14        GPSR6_14 \
+GPSR0_13       GPSR1_13        GPSR2_13        GPSR3_13        GPSR4_13        GPSR5_13        GPSR6_13 \
+GPSR0_12       GPSR1_12        GPSR2_12        GPSR3_12        GPSR4_12        GPSR5_12        GPSR6_12 \
+GPSR0_11       GPSR1_11        GPSR2_11        GPSR3_11        GPSR4_11        GPSR5_11        GPSR6_11 \
+GPSR0_10       GPSR1_10        GPSR2_10        GPSR3_10        GPSR4_10        GPSR5_10        GPSR6_10 \
+GPSR0_9                GPSR1_9         GPSR2_9         GPSR3_9         GPSR4_9         GPSR5_9         GPSR6_9 \
+GPSR0_8                GPSR1_8         GPSR2_8         GPSR3_8         GPSR4_8         GPSR5_8         GPSR6_8 \
+GPSR0_7                GPSR1_7         GPSR2_7         GPSR3_7         GPSR4_7         GPSR5_7         GPSR6_7 \
+GPSR0_6                GPSR1_6         GPSR2_6         GPSR3_6         GPSR4_6         GPSR5_6         GPSR6_6 \
+GPSR0_5                GPSR1_5         GPSR2_5         GPSR3_5         GPSR4_5         GPSR5_5         GPSR6_5 \
+GPSR0_4                GPSR1_4         GPSR2_4         GPSR3_4         GPSR4_4         GPSR5_4         GPSR6_4 \
+GPSR0_3                GPSR1_3         GPSR2_3         GPSR3_3         GPSR4_3         GPSR5_3         GPSR6_3         GPSR7_3 \
+GPSR0_2                GPSR1_2         GPSR2_2         GPSR3_2         GPSR4_2         GPSR5_2         GPSR6_2         GPSR7_2 \
+GPSR0_1                GPSR1_1         GPSR2_1         GPSR3_1         GPSR4_1         GPSR5_1         GPSR6_1         GPSR7_1 \
+GPSR0_0                GPSR1_0         GPSR2_0         GPSR3_0         GPSR4_0         GPSR5_0         GPSR6_0         GPSR7_0
+
+#define PINMUX_IPSR                            \
+\
+FM(IP0_3_0)    IP0_3_0         FM(IP1_3_0)     IP1_3_0         FM(IP2_3_0)     IP2_3_0         FM(IP3_3_0)     IP3_3_0 \
+FM(IP0_7_4)    IP0_7_4         FM(IP1_7_4)     IP1_7_4         FM(IP2_7_4)     IP2_7_4         FM(IP3_7_4)     IP3_7_4 \
+FM(IP0_11_8)   IP0_11_8        FM(IP1_11_8)    IP1_11_8        FM(IP2_11_8)    IP2_11_8        FM(IP3_11_8)    IP3_11_8 \
+FM(IP0_15_12)  IP0_15_12       FM(IP1_15_12)   IP1_15_12       FM(IP2_15_12)   IP2_15_12       FM(IP3_15_12)   IP3_15_12 \
+FM(IP0_19_16)  IP0_19_16       FM(IP1_19_16)   IP1_19_16       FM(IP2_19_16)   IP2_19_16       FM(IP3_19_16)   IP3_19_16 \
+FM(IP0_23_20)  IP0_23_20       FM(IP1_23_20)   IP1_23_20       FM(IP2_23_20)   IP2_23_20       FM(IP3_23_20)   IP3_23_20 \
+FM(IP0_27_24)  IP0_27_24       FM(IP1_27_24)   IP1_27_24       FM(IP2_27_24)   IP2_27_24       FM(IP3_27_24)   IP3_27_24 \
+FM(IP0_31_28)  IP0_31_28       FM(IP1_31_28)   IP1_31_28       FM(IP2_31_28)   IP2_31_28       FM(IP3_31_28)   IP3_31_28 \
+\
+FM(IP4_3_0)    IP4_3_0         FM(IP5_3_0)     IP5_3_0         FM(IP6_3_0)     IP6_3_0         FM(IP7_3_0)     IP7_3_0 \
+FM(IP4_7_4)    IP4_7_4         FM(IP5_7_4)     IP5_7_4         FM(IP6_7_4)     IP6_7_4         FM(IP7_7_4)     IP7_7_4 \
+FM(IP4_11_8)   IP4_11_8        FM(IP5_11_8)    IP5_11_8        FM(IP6_11_8)    IP6_11_8        FM(IP7_11_8)    IP7_11_8 \
+FM(IP4_15_12)  IP4_15_12       FM(IP5_15_12)   IP5_15_12       FM(IP6_15_12)   IP6_15_12 \
+FM(IP4_19_16)  IP4_19_16       FM(IP5_19_16)   IP5_19_16       FM(IP6_19_16)   IP6_19_16       FM(IP7_19_16)   IP7_19_16 \
+FM(IP4_23_20)  IP4_23_20       FM(IP5_23_20)   IP5_23_20       FM(IP6_23_20)   IP6_23_20       FM(IP7_23_20)   IP7_23_20 \
+FM(IP4_27_24)  IP4_27_24       FM(IP5_27_24)   IP5_27_24       FM(IP6_27_24)   IP6_27_24       FM(IP7_27_24)   IP7_27_24 \
+FM(IP4_31_28)  IP4_31_28       FM(IP5_31_28)   IP5_31_28       FM(IP6_31_28)   IP6_31_28       FM(IP7_31_28)   IP7_31_28 \
+\
+FM(IP8_3_0)    IP8_3_0         FM(IP9_3_0)     IP9_3_0         FM(IP10_3_0)    IP10_3_0        FM(IP11_3_0)    IP11_3_0 \
+FM(IP8_7_4)    IP8_7_4         FM(IP9_7_4)     IP9_7_4         FM(IP10_7_4)    IP10_7_4        FM(IP11_7_4)    IP11_7_4 \
+FM(IP8_11_8)   IP8_11_8        FM(IP9_11_8)    IP9_11_8        FM(IP10_11_8)   IP10_11_8       FM(IP11_11_8)   IP11_11_8 \
+FM(IP8_15_12)  IP8_15_12       FM(IP9_15_12)   IP9_15_12       FM(IP10_15_12)  IP10_15_12      FM(IP11_15_12)  IP11_15_12 \
+FM(IP8_19_16)  IP8_19_16       FM(IP9_19_16)   IP9_19_16       FM(IP10_19_16)  IP10_19_16      FM(IP11_19_16)  IP11_19_16 \
+FM(IP8_23_20)  IP8_23_20       FM(IP9_23_20)   IP9_23_20       FM(IP10_23_20)  IP10_23_20      FM(IP11_23_20)  IP11_23_20 \
+FM(IP8_27_24)  IP8_27_24       FM(IP9_27_24)   IP9_27_24       FM(IP10_27_24)  IP10_27_24      FM(IP11_27_24)  IP11_27_24 \
+FM(IP8_31_28)  IP8_31_28       FM(IP9_31_28)   IP9_31_28       FM(IP10_31_28)  IP10_31_28      FM(IP11_31_28)  IP11_31_28 \
+\
+FM(IP12_3_0)   IP12_3_0        FM(IP13_3_0)    IP13_3_0        FM(IP14_3_0)    IP14_3_0        FM(IP15_3_0)    IP15_3_0 \
+FM(IP12_7_4)   IP12_7_4        FM(IP13_7_4)    IP13_7_4        FM(IP14_7_4)    IP14_7_4        FM(IP15_7_4)    IP15_7_4 \
+FM(IP12_11_8)  IP12_11_8       FM(IP13_11_8)   IP13_11_8       FM(IP14_11_8)   IP14_11_8       FM(IP15_11_8)   IP15_11_8 \
+FM(IP12_15_12) IP12_15_12      FM(IP13_15_12)  IP13_15_12      FM(IP14_15_12)  IP14_15_12      FM(IP15_15_12)  IP15_15_12 \
+FM(IP12_19_16) IP12_19_16      FM(IP13_19_16)  IP13_19_16      FM(IP14_19_16)  IP14_19_16      FM(IP15_19_16)  IP15_19_16 \
+FM(IP12_23_20) IP12_23_20      FM(IP13_23_20)  IP13_23_20      FM(IP14_23_20)  IP14_23_20      FM(IP15_23_20)  IP15_23_20 \
+FM(IP12_27_24) IP12_27_24      FM(IP13_27_24)  IP13_27_24      FM(IP14_27_24)  IP14_27_24      FM(IP15_27_24)  IP15_27_24 \
+FM(IP12_31_28) IP12_31_28      FM(IP13_31_28)  IP13_31_28      FM(IP14_31_28)  IP14_31_28      FM(IP15_31_28)  IP15_31_28 \
+\
+FM(IP16_3_0)   IP16_3_0        FM(IP17_3_0)    IP17_3_0        FM(IP18_3_0)    IP18_3_0 \
+FM(IP16_7_4)   IP16_7_4        FM(IP17_7_4)    IP17_7_4        FM(IP18_7_4)    IP18_7_4 \
+FM(IP16_11_8)  IP16_11_8       FM(IP17_11_8)   IP17_11_8 \
+FM(IP16_15_12) IP16_15_12      FM(IP17_15_12)  IP17_15_12 \
+FM(IP16_19_16) IP16_19_16      FM(IP17_19_16)  IP17_19_16 \
+FM(IP16_23_20) IP16_23_20      FM(IP17_23_20)  IP17_23_20 \
+FM(IP16_27_24) IP16_27_24      FM(IP17_27_24)  IP17_27_24 \
+FM(IP16_31_28) IP16_31_28      FM(IP17_31_28)  IP17_31_28
+
+/* MOD_SEL0 */                 /* 0 */                 /* 1 */                 /* 2 */                 /* 3 */                 /* 4 */                 /* 5 */                 /* 6 */                 /* 7 */
+#define MOD_SEL0_31_30_29      FM(SEL_MSIOF3_0)        FM(SEL_MSIOF3_1)        FM(SEL_MSIOF3_2)        FM(SEL_MSIOF3_3)        FM(SEL_MSIOF3_4)        F_(0, 0)                F_(0, 0)                F_(0, 0)
+#define MOD_SEL0_28_27         FM(SEL_MSIOF2_0)        FM(SEL_MSIOF2_1)        FM(SEL_MSIOF2_2)        FM(SEL_MSIOF2_3)
+#define MOD_SEL0_26_25_24      FM(SEL_MSIOF1_0)        FM(SEL_MSIOF1_1)        FM(SEL_MSIOF1_2)        FM(SEL_MSIOF1_3)        FM(SEL_MSIOF1_4)        FM(SEL_MSIOF1_5)        FM(SEL_MSIOF1_6)        F_(0, 0)
+#define MOD_SEL0_23            FM(SEL_LBSC_0)          FM(SEL_LBSC_1)
+#define MOD_SEL0_22            FM(SEL_IEBUS_0)         FM(SEL_IEBUS_1)
+#define MOD_SEL0_21            FM(SEL_I2C2_0)          FM(SEL_I2C2_1)
+#define MOD_SEL0_20            FM(SEL_I2C1_0)          FM(SEL_I2C1_1)
+#define MOD_SEL0_19            FM(SEL_HSCIF4_0)        FM(SEL_HSCIF4_1)
+#define MOD_SEL0_18_17         FM(SEL_HSCIF3_0)        FM(SEL_HSCIF3_1)        FM(SEL_HSCIF3_2)        FM(SEL_HSCIF3_3)
+#define MOD_SEL0_16            FM(SEL_HSCIF1_0)        FM(SEL_HSCIF1_1)
+#define MOD_SEL0_14_13         FM(SEL_HSCIF2_0)        FM(SEL_HSCIF2_1)        FM(SEL_HSCIF2_2)        F_(0, 0)
+#define MOD_SEL0_12            FM(SEL_ETHERAVB_0)      FM(SEL_ETHERAVB_1)
+#define MOD_SEL0_11            FM(SEL_DRIF3_0)         FM(SEL_DRIF3_1)
+#define MOD_SEL0_10            FM(SEL_DRIF2_0)         FM(SEL_DRIF2_1)
+#define MOD_SEL0_9_8           FM(SEL_DRIF1_0)         FM(SEL_DRIF1_1)         FM(SEL_DRIF1_2)         F_(0, 0)
+#define MOD_SEL0_7_6           FM(SEL_DRIF0_0)         FM(SEL_DRIF0_1)         FM(SEL_DRIF0_2)         F_(0, 0)
+#define MOD_SEL0_5             FM(SEL_CANFD0_0)        FM(SEL_CANFD0_1)
+#define MOD_SEL0_4_3           FM(SEL_ADG_A_0)         FM(SEL_ADG_A_1)         FM(SEL_ADG_A_2)         FM(SEL_ADG_A_3)
+
+/* MOD_SEL1 */                 /* 0 */                 /* 1 */                 /* 2 */                 /* 3 */                 /* 4 */                 /* 5 */                 /* 6 */                 /* 7 */
+#define MOD_SEL1_31_30         FM(SEL_TSIF1_0)         FM(SEL_TSIF1_1)         FM(SEL_TSIF1_2)         FM(SEL_TSIF1_3)
+#define MOD_SEL1_29_28_27      FM(SEL_TSIF0_0)         FM(SEL_TSIF0_1)         FM(SEL_TSIF0_2)         FM(SEL_TSIF0_3)         FM(SEL_TSIF0_4)         F_(0, 0)                F_(0, 0)                F_(0, 0)
+#define MOD_SEL1_26            FM(SEL_TIMER_TMU_0)     FM(SEL_TIMER_TMU_1)
+#define MOD_SEL1_25_24         FM(SEL_SSP1_1_0)        FM(SEL_SSP1_1_1)        FM(SEL_SSP1_1_2)        FM(SEL_SSP1_1_3)
+#define MOD_SEL1_23_22_21      FM(SEL_SSP1_0_0)        FM(SEL_SSP1_0_1)        FM(SEL_SSP1_0_2)        FM(SEL_SSP1_0_3)        FM(SEL_SSP1_0_4)        F_(0, 0)                F_(0, 0)                F_(0, 0)
+#define MOD_SEL1_20            FM(SEL_SSI1_0)          FM(SEL_SSI1_1)
+#define MOD_SEL1_19            FM(SEL_SPEED_PULSE_0)   FM(SEL_SPEED_PULSE_1)
+#define MOD_SEL1_18_17         FM(SEL_SIMCARD_0)       FM(SEL_SIMCARD_1)       FM(SEL_SIMCARD_2)       FM(SEL_SIMCARD_3)
+#define MOD_SEL1_16            FM(SEL_SDHI2_0)         FM(SEL_SDHI2_1)
+#define MOD_SEL1_15_14         FM(SEL_SCIF4_0)         FM(SEL_SCIF4_1)         FM(SEL_SCIF4_2)         F_(0, 0)
+#define MOD_SEL1_13            FM(SEL_SCIF3_0)         FM(SEL_SCIF3_1)
+#define MOD_SEL1_12            FM(SEL_SCIF2_0)         FM(SEL_SCIF2_1)
+#define MOD_SEL1_11            FM(SEL_SCIF1_0)         FM(SEL_SCIF1_1)
+#define MOD_SEL1_10            FM(SEL_SCIF_0)          FM(SEL_SCIF_1)
+#define MOD_SEL1_9             FM(SEL_REMOCON_0)       FM(SEL_REMOCON_1)
+#define MOD_SEL1_6             FM(SEL_RCAN0_0)         FM(SEL_RCAN0_1)
+#define MOD_SEL1_5             FM(SEL_PWM6_0)          FM(SEL_PWM6_1)
+#define MOD_SEL1_4             FM(SEL_PWM5_0)          FM(SEL_PWM5_1)
+#define MOD_SEL1_3             FM(SEL_PWM4_0)          FM(SEL_PWM4_1)
+#define MOD_SEL1_2             FM(SEL_PWM3_0)          FM(SEL_PWM3_1)
+#define MOD_SEL1_1             FM(SEL_PWM2_0)          FM(SEL_PWM2_1)
+#define MOD_SEL1_0             FM(SEL_PWM1_0)          FM(SEL_PWM1_1)
+
+/* MOD_SEL2 */                 /* 0 */                 /* 1 */                 /* 2 */                 /* 3 */                 /* 4 */                 /* 5 */                 /* 6 */                 /* 7 */
+#define MOD_SEL2_31            FM(I2C_SEL_5_0)         FM(I2C_SEL_5_1)
+#define MOD_SEL2_30            FM(I2C_SEL_3_0)         FM(I2C_SEL_3_1)
+#define MOD_SEL2_29            FM(I2C_SEL_0_0)         FM(I2C_SEL_0_1)
+#define MOD_SEL2_28_27         FM(SEL_FM_0)            FM(SEL_FM_1)            FM(SEL_FM_2)            FM(SEL_FM_3)
+#define MOD_SEL2_26            FM(SEL_SCIF5_0)         FM(SEL_SCIF5_1)
+#define MOD_SEL2_25_24_23      FM(SEL_I2C6_0)          FM(SEL_I2C6_1)          FM(SEL_I2C6_2)          F_(0, 0)                F_(0, 0)                F_(0, 0)                F_(0, 0)                F_(0, 0)
+#define MOD_SEL2_22            FM(SEL_NDFC_0)          FM(SEL_NDFC_1)
+#define MOD_SEL2_21            FM(SEL_SSI2_0)          FM(SEL_SSI2_1)
+#define MOD_SEL2_20            FM(SEL_SSI9_0)          FM(SEL_SSI9_1)
+#define MOD_SEL2_19            FM(SEL_TIMER_TMU2_0)    FM(SEL_TIMER_TMU2_1)
+#define MOD_SEL2_18            FM(SEL_ADG_B_0)         FM(SEL_ADG_B_1)
+#define MOD_SEL2_17            FM(SEL_ADG_C_0)         FM(SEL_ADG_C_1)
+#define MOD_SEL2_0             FM(SEL_VIN4_0)          FM(SEL_VIN4_1)
+
+#define PINMUX_MOD_SELS        \
+\
+MOD_SEL0_31_30_29      MOD_SEL1_31_30          MOD_SEL2_31 \
+                                               MOD_SEL2_30 \
+                       MOD_SEL1_29_28_27       MOD_SEL2_29 \
+MOD_SEL0_28_27                                 MOD_SEL2_28_27 \
+MOD_SEL0_26_25_24      MOD_SEL1_26             MOD_SEL2_26 \
+                       MOD_SEL1_25_24          MOD_SEL2_25_24_23 \
+MOD_SEL0_23            MOD_SEL1_23_22_21 \
+MOD_SEL0_22                                    MOD_SEL2_22 \
+MOD_SEL0_21                                    MOD_SEL2_21 \
+MOD_SEL0_20            MOD_SEL1_20             MOD_SEL2_20 \
+MOD_SEL0_19            MOD_SEL1_19             MOD_SEL2_19 \
+MOD_SEL0_18_17         MOD_SEL1_18_17          MOD_SEL2_18 \
+                                               MOD_SEL2_17 \
+MOD_SEL0_16            MOD_SEL1_16 \
+                       MOD_SEL1_15_14 \
+MOD_SEL0_14_13 \
+                       MOD_SEL1_13 \
+MOD_SEL0_12            MOD_SEL1_12 \
+MOD_SEL0_11            MOD_SEL1_11 \
+MOD_SEL0_10            MOD_SEL1_10 \
+MOD_SEL0_9_8           MOD_SEL1_9 \
+MOD_SEL0_7_6 \
+                       MOD_SEL1_6 \
+MOD_SEL0_5             MOD_SEL1_5 \
+MOD_SEL0_4_3           MOD_SEL1_4 \
+                       MOD_SEL1_3 \
+                       MOD_SEL1_2 \
+                       MOD_SEL1_1 \
+                       MOD_SEL1_0              MOD_SEL2_0
+
+/*
+ * These pins are not able to be muxed but have other properties
+ * that can be set, such as drive-strength or pull-up/pull-down enable.
+ */
+#define PINMUX_STATIC \
+       FM(QSPI0_SPCLK) FM(QSPI0_SSL) FM(QSPI0_MOSI_IO0) FM(QSPI0_MISO_IO1) \
+       FM(QSPI0_IO2) FM(QSPI0_IO3) \
+       FM(QSPI1_SPCLK) FM(QSPI1_SSL) FM(QSPI1_MOSI_IO0) FM(QSPI1_MISO_IO1) \
+       FM(QSPI1_IO2) FM(QSPI1_IO3) \
+       FM(RPC_INT) FM(RPC_WP) FM(RPC_RESET) \
+       FM(AVB_TX_CTL) FM(AVB_TXC) FM(AVB_TD0) FM(AVB_TD1) FM(AVB_TD2) FM(AVB_TD3) \
+       FM(AVB_RX_CTL) FM(AVB_RXC) FM(AVB_RD0) FM(AVB_RD1) FM(AVB_RD2) FM(AVB_RD3) \
+       FM(AVB_TXCREFCLK) FM(AVB_MDIO) \
+       FM(PRESETOUT) \
+       FM(DU_DOTCLKIN0) FM(DU_DOTCLKIN1) FM(DU_DOTCLKIN3) \
+       FM(TMS) FM(TDO) FM(ASEBRK) FM(MLB_REF) FM(TDI) FM(TCK) FM(TRST) FM(EXTALR)
+
+enum {
+       PINMUX_RESERVED = 0,
+
+       PINMUX_DATA_BEGIN,
+       GP_ALL(DATA),
+       PINMUX_DATA_END,
+
+#define F_(x, y)
+#define FM(x)  FN_##x,
+       PINMUX_FUNCTION_BEGIN,
+       GP_ALL(FN),
+       PINMUX_GPSR
+       PINMUX_IPSR
+       PINMUX_MOD_SELS
+       PINMUX_FUNCTION_END,
+#undef F_
+#undef FM
+
+#define F_(x, y)
+#define FM(x)  x##_MARK,
+       PINMUX_MARK_BEGIN,
+       PINMUX_GPSR
+       PINMUX_IPSR
+       PINMUX_MOD_SELS
+       PINMUX_STATIC
+       PINMUX_MARK_END,
+#undef F_
+#undef FM
+};
+
+static const u16 pinmux_data[] = {
+       PINMUX_DATA_GP_ALL(),
+
+       PINMUX_SINGLE(AVS1),
+       PINMUX_SINGLE(AVS2),
+       PINMUX_SINGLE(CLKOUT),
+       PINMUX_SINGLE(GP7_03),
+       PINMUX_SINGLE(HDMI0_CEC),
+       PINMUX_SINGLE(MSIOF0_RXD),
+       PINMUX_SINGLE(MSIOF0_SCK),
+       PINMUX_SINGLE(MSIOF0_TXD),
+       PINMUX_SINGLE(SSI_SCK5),
+       PINMUX_SINGLE(SSI_SDATA5),
+       PINMUX_SINGLE(SSI_WS5),
+
+       /* IPSR0 */
+       PINMUX_IPSR_GPSR(IP0_3_0,       AVB_MDC),
+       PINMUX_IPSR_MSEL(IP0_3_0,       MSIOF2_SS2_C,           SEL_MSIOF2_2),
+
+       PINMUX_IPSR_GPSR(IP0_7_4,       AVB_MAGIC),
+       PINMUX_IPSR_MSEL(IP0_7_4,       MSIOF2_SS1_C,           SEL_MSIOF2_2),
+       PINMUX_IPSR_MSEL(IP0_7_4,       SCK4_A,                 SEL_SCIF4_0),
+
+       PINMUX_IPSR_GPSR(IP0_11_8,      AVB_PHY_INT),
+       PINMUX_IPSR_MSEL(IP0_11_8,      MSIOF2_SYNC_C,          SEL_MSIOF2_2),
+       PINMUX_IPSR_MSEL(IP0_11_8,      RX4_A,                  SEL_SCIF4_0),
+
+       PINMUX_IPSR_GPSR(IP0_15_12,     AVB_LINK),
+       PINMUX_IPSR_MSEL(IP0_15_12,     MSIOF2_SCK_C,           SEL_MSIOF2_2),
+       PINMUX_IPSR_MSEL(IP0_15_12,     TX4_A,                  SEL_SCIF4_0),
+       PINMUX_IPSR_GPSR(IP0_19_16,     FSCLKST2_N_A),
+
+       PINMUX_IPSR_MSEL(IP0_19_16,     AVB_AVTP_MATCH_A,       SEL_ETHERAVB_0),
+       PINMUX_IPSR_MSEL(IP0_19_16,     MSIOF2_RXD_C,           SEL_MSIOF2_2),
+       PINMUX_IPSR_MSEL(IP0_19_16,     CTS4_N_A,               SEL_SCIF4_0),
+
+       PINMUX_IPSR_MSEL(IP0_23_20,     AVB_AVTP_CAPTURE_A,     SEL_ETHERAVB_0),
+       PINMUX_IPSR_MSEL(IP0_23_20,     MSIOF2_TXD_C,           SEL_MSIOF2_2),
+       PINMUX_IPSR_MSEL(IP0_23_20,     RTS4_N_A,               SEL_SCIF4_0),
+
+       PINMUX_IPSR_GPSR(IP0_27_24,     IRQ0),
+       PINMUX_IPSR_GPSR(IP0_27_24,     QPOLB),
+       PINMUX_IPSR_GPSR(IP0_27_24,     DU_CDE),
+       PINMUX_IPSR_MSEL(IP0_27_24,     VI4_DATA0_B,            SEL_VIN4_1),
+       PINMUX_IPSR_MSEL(IP0_27_24,     CAN0_TX_B,              SEL_RCAN0_1),
+       PINMUX_IPSR_MSEL(IP0_27_24,     CANFD0_TX_B,            SEL_CANFD0_1),
+       PINMUX_IPSR_MSEL(IP0_27_24,     MSIOF3_SS2_E,           SEL_MSIOF3_4),
+
+       PINMUX_IPSR_GPSR(IP0_31_28,     IRQ1),
+       PINMUX_IPSR_GPSR(IP0_31_28,     QPOLA),
+       PINMUX_IPSR_GPSR(IP0_31_28,     DU_DISP),
+       PINMUX_IPSR_MSEL(IP0_31_28,     VI4_DATA1_B,            SEL_VIN4_1),
+       PINMUX_IPSR_MSEL(IP0_31_28,     CAN0_RX_B,              SEL_RCAN0_1),
+       PINMUX_IPSR_MSEL(IP0_31_28,     CANFD0_RX_B,            SEL_CANFD0_1),
+       PINMUX_IPSR_MSEL(IP0_31_28,     MSIOF3_SS1_E,           SEL_MSIOF3_4),
+
+       /* IPSR1 */
+       PINMUX_IPSR_GPSR(IP1_3_0,       IRQ2),
+       PINMUX_IPSR_GPSR(IP1_3_0,       QCPV_QDE),
+       PINMUX_IPSR_GPSR(IP1_3_0,       DU_EXODDF_DU_ODDF_DISP_CDE),
+       PINMUX_IPSR_MSEL(IP1_3_0,       VI4_DATA2_B,            SEL_VIN4_1),
+       PINMUX_IPSR_MSEL(IP1_3_0,       PWM3_B,                 SEL_PWM3_1),
+       PINMUX_IPSR_MSEL(IP1_3_0,       MSIOF3_SYNC_E,          SEL_MSIOF3_4),
+
+       PINMUX_IPSR_GPSR(IP1_7_4,       IRQ3),
+       PINMUX_IPSR_GPSR(IP1_7_4,       QSTVB_QVE),
+       PINMUX_IPSR_GPSR(IP1_7_4,       DU_DOTCLKOUT1),
+       PINMUX_IPSR_MSEL(IP1_7_4,       VI4_DATA3_B,            SEL_VIN4_1),
+       PINMUX_IPSR_MSEL(IP1_7_4,       PWM4_B,                 SEL_PWM4_1),
+       PINMUX_IPSR_MSEL(IP1_7_4,       MSIOF3_SCK_E,           SEL_MSIOF3_4),
+
+       PINMUX_IPSR_GPSR(IP1_11_8,      IRQ4),
+       PINMUX_IPSR_GPSR(IP1_11_8,      QSTH_QHS),
+       PINMUX_IPSR_GPSR(IP1_11_8,      DU_EXHSYNC_DU_HSYNC),
+       PINMUX_IPSR_MSEL(IP1_11_8,      VI4_DATA4_B,            SEL_VIN4_1),
+       PINMUX_IPSR_MSEL(IP1_11_8,      PWM5_B,                 SEL_PWM5_1),
+       PINMUX_IPSR_MSEL(IP1_11_8,      MSIOF3_RXD_E,           SEL_MSIOF3_4),
+
+       PINMUX_IPSR_GPSR(IP1_15_12,     IRQ5),
+       PINMUX_IPSR_GPSR(IP1_15_12,     QSTB_QHE),
+       PINMUX_IPSR_GPSR(IP1_15_12,     DU_EXVSYNC_DU_VSYNC),
+       PINMUX_IPSR_MSEL(IP1_15_12,     VI4_DATA5_B,            SEL_VIN4_1),
+       PINMUX_IPSR_MSEL(IP1_15_12,     PWM6_B,                 SEL_PWM6_1),
+       PINMUX_IPSR_GPSR(IP1_15_12,     FSCLKST2_N_B),
+       PINMUX_IPSR_MSEL(IP1_15_12,     MSIOF3_TXD_E,           SEL_MSIOF3_4),
+
+       PINMUX_IPSR_GPSR(IP1_19_16,     PWM0),
+       PINMUX_IPSR_GPSR(IP1_19_16,     AVB_AVTP_PPS),
+       PINMUX_IPSR_MSEL(IP1_19_16,     VI4_DATA6_B,            SEL_VIN4_1),
+       PINMUX_IPSR_MSEL(IP1_19_16,     IECLK_B,                SEL_IEBUS_1),
+
+       PINMUX_IPSR_MSEL(IP1_23_20,     PWM1_A,                 SEL_PWM1_0),
+       PINMUX_IPSR_MSEL(IP1_23_20,     HRX3_D,                 SEL_HSCIF3_3),
+       PINMUX_IPSR_MSEL(IP1_23_20,     VI4_DATA7_B,            SEL_VIN4_1),
+       PINMUX_IPSR_MSEL(IP1_23_20,     IERX_B,                 SEL_IEBUS_1),
+
+       PINMUX_IPSR_MSEL(IP1_27_24,     PWM2_A,                 SEL_PWM2_0),
+       PINMUX_IPSR_MSEL(IP1_27_24,     HTX3_D,                 SEL_HSCIF3_3),
+       PINMUX_IPSR_MSEL(IP1_27_24,     IETX_B,                 SEL_IEBUS_1),
+
+       PINMUX_IPSR_GPSR(IP1_31_28,     A0),
+       PINMUX_IPSR_GPSR(IP1_31_28,     LCDOUT16),
+       PINMUX_IPSR_MSEL(IP1_31_28,     MSIOF3_SYNC_B,          SEL_MSIOF3_1),
+       PINMUX_IPSR_GPSR(IP1_31_28,     VI4_DATA8),
+       PINMUX_IPSR_GPSR(IP1_31_28,     DU_DB0),
+       PINMUX_IPSR_MSEL(IP1_31_28,     PWM3_A,                 SEL_PWM3_0),
+
+       /* IPSR2 */
+       PINMUX_IPSR_GPSR(IP2_3_0,       A1),
+       PINMUX_IPSR_GPSR(IP2_3_0,       LCDOUT17),
+       PINMUX_IPSR_MSEL(IP2_3_0,       MSIOF3_TXD_B,           SEL_MSIOF3_1),
+       PINMUX_IPSR_GPSR(IP2_3_0,       VI4_DATA9),
+       PINMUX_IPSR_GPSR(IP2_3_0,       DU_DB1),
+       PINMUX_IPSR_MSEL(IP2_3_0,       PWM4_A,                 SEL_PWM4_0),
+
+       PINMUX_IPSR_GPSR(IP2_7_4,       A2),
+       PINMUX_IPSR_GPSR(IP2_7_4,       LCDOUT18),
+       PINMUX_IPSR_MSEL(IP2_7_4,       MSIOF3_SCK_B,           SEL_MSIOF3_1),
+       PINMUX_IPSR_GPSR(IP2_7_4,       VI4_DATA10),
+       PINMUX_IPSR_GPSR(IP2_7_4,       DU_DB2),
+       PINMUX_IPSR_MSEL(IP2_7_4,       PWM5_A,                 SEL_PWM5_0),
+
+       PINMUX_IPSR_GPSR(IP2_11_8,      A3),
+       PINMUX_IPSR_GPSR(IP2_11_8,      LCDOUT19),
+       PINMUX_IPSR_MSEL(IP2_11_8,      MSIOF3_RXD_B,           SEL_MSIOF3_1),
+       PINMUX_IPSR_GPSR(IP2_11_8,      VI4_DATA11),
+       PINMUX_IPSR_GPSR(IP2_11_8,      DU_DB3),
+       PINMUX_IPSR_MSEL(IP2_11_8,      PWM6_A,                 SEL_PWM6_0),
+
+       PINMUX_IPSR_GPSR(IP2_15_12,     A4),
+       PINMUX_IPSR_GPSR(IP2_15_12,     LCDOUT20),
+       PINMUX_IPSR_MSEL(IP2_15_12,     MSIOF3_SS1_B,           SEL_MSIOF3_1),
+       PINMUX_IPSR_GPSR(IP2_15_12,     VI4_DATA12),
+       PINMUX_IPSR_GPSR(IP2_15_12,     VI5_DATA12),
+       PINMUX_IPSR_GPSR(IP2_15_12,     DU_DB4),
+
+       PINMUX_IPSR_GPSR(IP2_19_16,     A5),
+       PINMUX_IPSR_GPSR(IP2_19_16,     LCDOUT21),
+       PINMUX_IPSR_MSEL(IP2_19_16,     MSIOF3_SS2_B,           SEL_MSIOF3_1),
+       PINMUX_IPSR_MSEL(IP2_19_16,     SCK4_B,                 SEL_SCIF4_1),
+       PINMUX_IPSR_GPSR(IP2_19_16,     VI4_DATA13),
+       PINMUX_IPSR_GPSR(IP2_19_16,     VI5_DATA13),
+       PINMUX_IPSR_GPSR(IP2_19_16,     DU_DB5),
+
+       PINMUX_IPSR_GPSR(IP2_23_20,     A6),
+       PINMUX_IPSR_GPSR(IP2_23_20,     LCDOUT22),
+       PINMUX_IPSR_MSEL(IP2_23_20,     MSIOF2_SS1_A,           SEL_MSIOF2_0),
+       PINMUX_IPSR_MSEL(IP2_23_20,     RX4_B,                  SEL_SCIF4_1),
+       PINMUX_IPSR_GPSR(IP2_23_20,     VI4_DATA14),
+       PINMUX_IPSR_GPSR(IP2_23_20,     VI5_DATA14),
+       PINMUX_IPSR_GPSR(IP2_23_20,     DU_DB6),
+
+       PINMUX_IPSR_GPSR(IP2_27_24,     A7),
+       PINMUX_IPSR_GPSR(IP2_27_24,     LCDOUT23),
+       PINMUX_IPSR_MSEL(IP2_27_24,     MSIOF2_SS2_A,           SEL_MSIOF2_0),
+       PINMUX_IPSR_MSEL(IP2_27_24,     TX4_B,                  SEL_SCIF4_1),
+       PINMUX_IPSR_GPSR(IP2_27_24,     VI4_DATA15),
+       PINMUX_IPSR_GPSR(IP2_27_24,     VI5_DATA15),
+       PINMUX_IPSR_GPSR(IP2_27_24,     DU_DB7),
+
+       PINMUX_IPSR_GPSR(IP2_31_28,     A8),
+       PINMUX_IPSR_MSEL(IP2_31_28,     RX3_B,                  SEL_SCIF3_1),
+       PINMUX_IPSR_MSEL(IP2_31_28,     MSIOF2_SYNC_A,          SEL_MSIOF2_0),
+       PINMUX_IPSR_MSEL(IP2_31_28,     HRX4_B,                 SEL_HSCIF4_1),
+       PINMUX_IPSR_MSEL(IP2_31_28,     SDA6_A,                 SEL_I2C6_0),
+       PINMUX_IPSR_MSEL(IP2_31_28,     AVB_AVTP_MATCH_B,       SEL_ETHERAVB_1),
+       PINMUX_IPSR_MSEL(IP2_31_28,     PWM1_B,                 SEL_PWM1_1),
+
+       /* IPSR3 */
+       PINMUX_IPSR_GPSR(IP3_3_0,       A9),
+       PINMUX_IPSR_MSEL(IP3_3_0,       MSIOF2_SCK_A,           SEL_MSIOF2_0),
+       PINMUX_IPSR_MSEL(IP3_3_0,       CTS4_N_B,               SEL_SCIF4_1),
+       PINMUX_IPSR_GPSR(IP3_3_0,       VI5_VSYNC_N),
+
+       PINMUX_IPSR_GPSR(IP3_7_4,       A10),
+       PINMUX_IPSR_MSEL(IP3_7_4,       MSIOF2_RXD_A,           SEL_MSIOF2_0),
+       PINMUX_IPSR_MSEL(IP3_7_4,       RTS4_N_B,               SEL_SCIF4_1),
+       PINMUX_IPSR_GPSR(IP3_7_4,       VI5_HSYNC_N),
+
+       PINMUX_IPSR_GPSR(IP3_11_8,      A11),
+       PINMUX_IPSR_MSEL(IP3_11_8,      TX3_B,                  SEL_SCIF3_1),
+       PINMUX_IPSR_MSEL(IP3_11_8,      MSIOF2_TXD_A,           SEL_MSIOF2_0),
+       PINMUX_IPSR_MSEL(IP3_11_8,      HTX4_B,                 SEL_HSCIF4_1),
+       PINMUX_IPSR_GPSR(IP3_11_8,      HSCK4),
+       PINMUX_IPSR_GPSR(IP3_11_8,      VI5_FIELD),
+       PINMUX_IPSR_MSEL(IP3_11_8,      SCL6_A,                 SEL_I2C6_0),
+       PINMUX_IPSR_MSEL(IP3_11_8,      AVB_AVTP_CAPTURE_B,     SEL_ETHERAVB_1),
+       PINMUX_IPSR_MSEL(IP3_11_8,      PWM2_B,                 SEL_PWM2_1),
+
+       PINMUX_IPSR_GPSR(IP3_15_12,     A12),
+       PINMUX_IPSR_GPSR(IP3_15_12,     LCDOUT12),
+       PINMUX_IPSR_MSEL(IP3_15_12,     MSIOF3_SCK_C,           SEL_MSIOF3_2),
+       PINMUX_IPSR_MSEL(IP3_15_12,     HRX4_A,                 SEL_HSCIF4_0),
+       PINMUX_IPSR_GPSR(IP3_15_12,     VI5_DATA8),
+       PINMUX_IPSR_GPSR(IP3_15_12,     DU_DG4),
+
+       PINMUX_IPSR_GPSR(IP3_19_16,     A13),
+       PINMUX_IPSR_GPSR(IP3_19_16,     LCDOUT13),
+       PINMUX_IPSR_MSEL(IP3_19_16,     MSIOF3_SYNC_C,          SEL_MSIOF3_2),
+       PINMUX_IPSR_MSEL(IP3_19_16,     HTX4_A,                 SEL_HSCIF4_0),
+       PINMUX_IPSR_GPSR(IP3_19_16,     VI5_DATA9),
+       PINMUX_IPSR_GPSR(IP3_19_16,     DU_DG5),
+
+       PINMUX_IPSR_GPSR(IP3_23_20,     A14),
+       PINMUX_IPSR_GPSR(IP3_23_20,     LCDOUT14),
+       PINMUX_IPSR_MSEL(IP3_23_20,     MSIOF3_RXD_C,           SEL_MSIOF3_2),
+       PINMUX_IPSR_GPSR(IP3_23_20,     HCTS4_N),
+       PINMUX_IPSR_GPSR(IP3_23_20,     VI5_DATA10),
+       PINMUX_IPSR_GPSR(IP3_23_20,     DU_DG6),
+
+       PINMUX_IPSR_GPSR(IP3_27_24,     A15),
+       PINMUX_IPSR_GPSR(IP3_27_24,     LCDOUT15),
+       PINMUX_IPSR_MSEL(IP3_27_24,     MSIOF3_TXD_C,           SEL_MSIOF3_2),
+       PINMUX_IPSR_GPSR(IP3_27_24,     HRTS4_N),
+       PINMUX_IPSR_GPSR(IP3_27_24,     VI5_DATA11),
+       PINMUX_IPSR_GPSR(IP3_27_24,     DU_DG7),
+
+       PINMUX_IPSR_GPSR(IP3_31_28,     A16),
+       PINMUX_IPSR_GPSR(IP3_31_28,     LCDOUT8),
+       PINMUX_IPSR_GPSR(IP3_31_28,     VI4_FIELD),
+       PINMUX_IPSR_GPSR(IP3_31_28,     DU_DG0),
+
+       /* IPSR4 */
+       PINMUX_IPSR_GPSR(IP4_3_0,       A17),
+       PINMUX_IPSR_GPSR(IP4_3_0,       LCDOUT9),
+       PINMUX_IPSR_GPSR(IP4_3_0,       VI4_VSYNC_N),
+       PINMUX_IPSR_GPSR(IP4_3_0,       DU_DG1),
+
+       PINMUX_IPSR_GPSR(IP4_7_4,       A18),
+       PINMUX_IPSR_GPSR(IP4_7_4,       LCDOUT10),
+       PINMUX_IPSR_GPSR(IP4_7_4,       VI4_HSYNC_N),
+       PINMUX_IPSR_GPSR(IP4_7_4,       DU_DG2),
+
+       PINMUX_IPSR_GPSR(IP4_11_8,      A19),
+       PINMUX_IPSR_GPSR(IP4_11_8,      LCDOUT11),
+       PINMUX_IPSR_GPSR(IP4_11_8,      VI4_CLKENB),
+       PINMUX_IPSR_GPSR(IP4_11_8,      DU_DG3),
+
+       PINMUX_IPSR_GPSR(IP4_15_12,     CS0_N),
+       PINMUX_IPSR_GPSR(IP4_15_12,     VI5_CLKENB),
+
+       PINMUX_IPSR_GPSR(IP4_19_16,     CS1_N),
+       PINMUX_IPSR_GPSR(IP4_19_16,     VI5_CLK),
+       PINMUX_IPSR_MSEL(IP4_19_16,     EX_WAIT0_B,             SEL_LBSC_1),
+
+       PINMUX_IPSR_GPSR(IP4_23_20,     BS_N),
+       PINMUX_IPSR_GPSR(IP4_23_20,     QSTVA_QVS),
+       PINMUX_IPSR_MSEL(IP4_23_20,     MSIOF3_SCK_D,           SEL_MSIOF3_3),
+       PINMUX_IPSR_GPSR(IP4_23_20,     SCK3),
+       PINMUX_IPSR_GPSR(IP4_23_20,     HSCK3),
+       PINMUX_IPSR_GPSR(IP4_23_20,     CAN1_TX),
+       PINMUX_IPSR_GPSR(IP4_23_20,     CANFD1_TX),
+       PINMUX_IPSR_MSEL(IP4_23_20,     IETX_A,                 SEL_IEBUS_0),
+
+       PINMUX_IPSR_GPSR(IP4_27_24,     RD_N),
+       PINMUX_IPSR_MSEL(IP4_27_24,     MSIOF3_SYNC_D,          SEL_MSIOF3_3),
+       PINMUX_IPSR_MSEL(IP4_27_24,     RX3_A,                  SEL_SCIF3_0),
+       PINMUX_IPSR_MSEL(IP4_27_24,     HRX3_A,                 SEL_HSCIF3_0),
+       PINMUX_IPSR_MSEL(IP4_27_24,     CAN0_TX_A,              SEL_RCAN0_0),
+       PINMUX_IPSR_MSEL(IP4_27_24,     CANFD0_TX_A,            SEL_CANFD0_0),
+
+       PINMUX_IPSR_GPSR(IP4_31_28,     RD_WR_N),
+       PINMUX_IPSR_MSEL(IP4_31_28,     MSIOF3_RXD_D,           SEL_MSIOF3_3),
+       PINMUX_IPSR_MSEL(IP4_31_28,     TX3_A,                  SEL_SCIF3_0),
+       PINMUX_IPSR_MSEL(IP4_31_28,     HTX3_A,                 SEL_HSCIF3_0),
+       PINMUX_IPSR_MSEL(IP4_31_28,     CAN0_RX_A,              SEL_RCAN0_0),
+       PINMUX_IPSR_MSEL(IP4_31_28,     CANFD0_RX_A,            SEL_CANFD0_0),
+
+       /* IPSR5 */
+       PINMUX_IPSR_GPSR(IP5_3_0,       WE0_N),
+       PINMUX_IPSR_MSEL(IP5_3_0,       MSIOF3_TXD_D,           SEL_MSIOF3_3),
+       PINMUX_IPSR_GPSR(IP5_3_0,       CTS3_N),
+       PINMUX_IPSR_GPSR(IP5_3_0,       HCTS3_N),
+       PINMUX_IPSR_MSEL(IP5_3_0,       SCL6_B,                 SEL_I2C6_1),
+       PINMUX_IPSR_GPSR(IP5_3_0,       CAN_CLK),
+       PINMUX_IPSR_MSEL(IP5_3_0,       IECLK_A,                SEL_IEBUS_0),
+
+       PINMUX_IPSR_GPSR(IP5_7_4,       WE1_N),
+       PINMUX_IPSR_MSEL(IP5_7_4,       MSIOF3_SS1_D,           SEL_MSIOF3_3),
+       PINMUX_IPSR_GPSR(IP5_7_4,       RTS3_N),
+       PINMUX_IPSR_GPSR(IP5_7_4,       HRTS3_N),
+       PINMUX_IPSR_MSEL(IP5_7_4,       SDA6_B,                 SEL_I2C6_1),
+       PINMUX_IPSR_GPSR(IP5_7_4,       CAN1_RX),
+       PINMUX_IPSR_GPSR(IP5_7_4,       CANFD1_RX),
+       PINMUX_IPSR_MSEL(IP5_7_4,       IERX_A,                 SEL_IEBUS_0),
+
+       PINMUX_IPSR_MSEL(IP5_11_8,      EX_WAIT0_A,             SEL_LBSC_0),
+       PINMUX_IPSR_GPSR(IP5_11_8,      QCLK),
+       PINMUX_IPSR_GPSR(IP5_11_8,      VI4_CLK),
+       PINMUX_IPSR_GPSR(IP5_11_8,      DU_DOTCLKOUT0),
+
+       PINMUX_IPSR_GPSR(IP5_15_12,     D0),
+       PINMUX_IPSR_MSEL(IP5_15_12,     MSIOF2_SS1_B,           SEL_MSIOF2_1),
+       PINMUX_IPSR_MSEL(IP5_15_12,     MSIOF3_SCK_A,           SEL_MSIOF3_0),
+       PINMUX_IPSR_GPSR(IP5_15_12,     VI4_DATA16),
+       PINMUX_IPSR_GPSR(IP5_15_12,     VI5_DATA0),
+
+       PINMUX_IPSR_GPSR(IP5_19_16,     D1),
+       PINMUX_IPSR_MSEL(IP5_19_16,     MSIOF2_SS2_B,           SEL_MSIOF2_1),
+       PINMUX_IPSR_MSEL(IP5_19_16,     MSIOF3_SYNC_A,          SEL_MSIOF3_0),
+       PINMUX_IPSR_GPSR(IP5_19_16,     VI4_DATA17),
+       PINMUX_IPSR_GPSR(IP5_19_16,     VI5_DATA1),
+
+       PINMUX_IPSR_GPSR(IP5_23_20,     D2),
+       PINMUX_IPSR_MSEL(IP5_23_20,     MSIOF3_RXD_A,           SEL_MSIOF3_0),
+       PINMUX_IPSR_GPSR(IP5_23_20,     VI4_DATA18),
+       PINMUX_IPSR_GPSR(IP5_23_20,     VI5_DATA2),
+
+       PINMUX_IPSR_GPSR(IP5_27_24,     D3),
+       PINMUX_IPSR_MSEL(IP5_27_24,     MSIOF3_TXD_A,           SEL_MSIOF3_0),
+       PINMUX_IPSR_GPSR(IP5_27_24,     VI4_DATA19),
+       PINMUX_IPSR_GPSR(IP5_27_24,     VI5_DATA3),
+
+       PINMUX_IPSR_GPSR(IP5_31_28,     D4),
+       PINMUX_IPSR_MSEL(IP5_31_28,     MSIOF2_SCK_B,           SEL_MSIOF2_1),
+       PINMUX_IPSR_GPSR(IP5_31_28,     VI4_DATA20),
+       PINMUX_IPSR_GPSR(IP5_31_28,     VI5_DATA4),
+
+       /* IPSR6 */
+       PINMUX_IPSR_GPSR(IP6_3_0,       D5),
+       PINMUX_IPSR_MSEL(IP6_3_0,       MSIOF2_SYNC_B,          SEL_MSIOF2_1),
+       PINMUX_IPSR_GPSR(IP6_3_0,       VI4_DATA21),
+       PINMUX_IPSR_GPSR(IP6_3_0,       VI5_DATA5),
+
+       PINMUX_IPSR_GPSR(IP6_7_4,       D6),
+       PINMUX_IPSR_MSEL(IP6_7_4,       MSIOF2_RXD_B,           SEL_MSIOF2_1),
+       PINMUX_IPSR_GPSR(IP6_7_4,       VI4_DATA22),
+       PINMUX_IPSR_GPSR(IP6_7_4,       VI5_DATA6),
+
+       PINMUX_IPSR_GPSR(IP6_11_8,      D7),
+       PINMUX_IPSR_MSEL(IP6_11_8,      MSIOF2_TXD_B,           SEL_MSIOF2_1),
+       PINMUX_IPSR_GPSR(IP6_11_8,      VI4_DATA23),
+       PINMUX_IPSR_GPSR(IP6_11_8,      VI5_DATA7),
+
+       PINMUX_IPSR_GPSR(IP6_15_12,     D8),
+       PINMUX_IPSR_GPSR(IP6_15_12,     LCDOUT0),
+       PINMUX_IPSR_MSEL(IP6_15_12,     MSIOF2_SCK_D,           SEL_MSIOF2_3),
+       PINMUX_IPSR_MSEL(IP6_15_12,     SCK4_C,                 SEL_SCIF4_2),
+       PINMUX_IPSR_MSEL(IP6_15_12,     VI4_DATA0_A,            SEL_VIN4_0),
+       PINMUX_IPSR_GPSR(IP6_15_12,     DU_DR0),
+
+       PINMUX_IPSR_GPSR(IP6_19_16,     D9),
+       PINMUX_IPSR_GPSR(IP6_19_16,     LCDOUT1),
+       PINMUX_IPSR_MSEL(IP6_19_16,     MSIOF2_SYNC_D,          SEL_MSIOF2_3),
+       PINMUX_IPSR_MSEL(IP6_19_16,     VI4_DATA1_A,            SEL_VIN4_0),
+       PINMUX_IPSR_GPSR(IP6_19_16,     DU_DR1),
+
+       PINMUX_IPSR_GPSR(IP6_23_20,     D10),
+       PINMUX_IPSR_GPSR(IP6_23_20,     LCDOUT2),
+       PINMUX_IPSR_MSEL(IP6_23_20,     MSIOF2_RXD_D,           SEL_MSIOF2_3),
+       PINMUX_IPSR_MSEL(IP6_23_20,     HRX3_B,                 SEL_HSCIF3_1),
+       PINMUX_IPSR_MSEL(IP6_23_20,     VI4_DATA2_A,            SEL_VIN4_0),
+       PINMUX_IPSR_MSEL(IP6_23_20,     CTS4_N_C,               SEL_SCIF4_2),
+       PINMUX_IPSR_GPSR(IP6_23_20,     DU_DR2),
+
+       PINMUX_IPSR_GPSR(IP6_27_24,     D11),
+       PINMUX_IPSR_GPSR(IP6_27_24,     LCDOUT3),
+       PINMUX_IPSR_MSEL(IP6_27_24,     MSIOF2_TXD_D,           SEL_MSIOF2_3),
+       PINMUX_IPSR_MSEL(IP6_27_24,     HTX3_B,                 SEL_HSCIF3_1),
+       PINMUX_IPSR_MSEL(IP6_27_24,     VI4_DATA3_A,            SEL_VIN4_0),
+       PINMUX_IPSR_MSEL(IP6_27_24,     RTS4_N_C,               SEL_SCIF4_2),
+       PINMUX_IPSR_GPSR(IP6_27_24,     DU_DR3),
+
+       PINMUX_IPSR_GPSR(IP6_31_28,     D12),
+       PINMUX_IPSR_GPSR(IP6_31_28,     LCDOUT4),
+       PINMUX_IPSR_MSEL(IP6_31_28,     MSIOF2_SS1_D,           SEL_MSIOF2_3),
+       PINMUX_IPSR_MSEL(IP6_31_28,     RX4_C,                  SEL_SCIF4_2),
+       PINMUX_IPSR_MSEL(IP6_31_28,     VI4_DATA4_A,            SEL_VIN4_0),
+       PINMUX_IPSR_GPSR(IP6_31_28,     DU_DR4),
+
+       /* IPSR7 */
+       PINMUX_IPSR_GPSR(IP7_3_0,       D13),
+       PINMUX_IPSR_GPSR(IP7_3_0,       LCDOUT5),
+       PINMUX_IPSR_MSEL(IP7_3_0,       MSIOF2_SS2_D,           SEL_MSIOF2_3),
+       PINMUX_IPSR_MSEL(IP7_3_0,       TX4_C,                  SEL_SCIF4_2),
+       PINMUX_IPSR_MSEL(IP7_3_0,       VI4_DATA5_A,            SEL_VIN4_0),
+       PINMUX_IPSR_GPSR(IP7_3_0,       DU_DR5),
+
+       PINMUX_IPSR_GPSR(IP7_7_4,       D14),
+       PINMUX_IPSR_GPSR(IP7_7_4,       LCDOUT6),
+       PINMUX_IPSR_MSEL(IP7_7_4,       MSIOF3_SS1_A,           SEL_MSIOF3_0),
+       PINMUX_IPSR_MSEL(IP7_7_4,       HRX3_C,                 SEL_HSCIF3_2),
+       PINMUX_IPSR_MSEL(IP7_7_4,       VI4_DATA6_A,            SEL_VIN4_0),
+       PINMUX_IPSR_GPSR(IP7_7_4,       DU_DR6),
+       PINMUX_IPSR_MSEL(IP7_7_4,       SCL6_C,                 SEL_I2C6_2),
+
+       PINMUX_IPSR_GPSR(IP7_11_8,      D15),
+       PINMUX_IPSR_GPSR(IP7_11_8,      LCDOUT7),
+       PINMUX_IPSR_MSEL(IP7_11_8,      MSIOF3_SS2_A,           SEL_MSIOF3_0),
+       PINMUX_IPSR_MSEL(IP7_11_8,      HTX3_C,                 SEL_HSCIF3_2),
+       PINMUX_IPSR_MSEL(IP7_11_8,      VI4_DATA7_A,            SEL_VIN4_0),
+       PINMUX_IPSR_GPSR(IP7_11_8,      DU_DR7),
+       PINMUX_IPSR_MSEL(IP7_11_8,      SDA6_C,                 SEL_I2C6_2),
+
+       PINMUX_IPSR_GPSR(IP7_19_16,     SD0_CLK),
+       PINMUX_IPSR_MSEL(IP7_19_16,     MSIOF1_SCK_E,           SEL_MSIOF1_4),
+       PINMUX_IPSR_MSEL(IP7_19_16,     STP_OPWM_0_B,           SEL_SSP1_0_1),
+
+       PINMUX_IPSR_GPSR(IP7_23_20,     SD0_CMD),
+       PINMUX_IPSR_MSEL(IP7_23_20,     MSIOF1_SYNC_E,          SEL_MSIOF1_4),
+       PINMUX_IPSR_MSEL(IP7_23_20,     STP_IVCXO27_0_B,        SEL_SSP1_0_1),
+
+       PINMUX_IPSR_GPSR(IP7_27_24,     SD0_DAT0),
+       PINMUX_IPSR_MSEL(IP7_27_24,     MSIOF1_RXD_E,           SEL_MSIOF1_4),
+       PINMUX_IPSR_MSEL(IP7_27_24,     TS_SCK0_B,              SEL_TSIF0_1),
+       PINMUX_IPSR_MSEL(IP7_27_24,     STP_ISCLK_0_B,          SEL_SSP1_0_1),
+
+       PINMUX_IPSR_GPSR(IP7_31_28,     SD0_DAT1),
+       PINMUX_IPSR_MSEL(IP7_31_28,     MSIOF1_TXD_E,           SEL_MSIOF1_4),
+       PINMUX_IPSR_MSEL(IP7_31_28,     TS_SPSYNC0_B,           SEL_TSIF0_1),
+       PINMUX_IPSR_MSEL(IP7_31_28,     STP_ISSYNC_0_B,         SEL_SSP1_0_1),
+
+       /* IPSR8 */
+       PINMUX_IPSR_GPSR(IP8_3_0,       SD0_DAT2),
+       PINMUX_IPSR_MSEL(IP8_3_0,       MSIOF1_SS1_E,           SEL_MSIOF1_4),
+       PINMUX_IPSR_MSEL(IP8_3_0,       TS_SDAT0_B,             SEL_TSIF0_1),
+       PINMUX_IPSR_MSEL(IP8_3_0,       STP_ISD_0_B,            SEL_SSP1_0_1),
+
+       PINMUX_IPSR_GPSR(IP8_7_4,       SD0_DAT3),
+       PINMUX_IPSR_MSEL(IP8_7_4,       MSIOF1_SS2_E,           SEL_MSIOF1_4),
+       PINMUX_IPSR_MSEL(IP8_7_4,       TS_SDEN0_B,             SEL_TSIF0_1),
+       PINMUX_IPSR_MSEL(IP8_7_4,       STP_ISEN_0_B,           SEL_SSP1_0_1),
+
+       PINMUX_IPSR_GPSR(IP8_11_8,      SD1_CLK),
+       PINMUX_IPSR_MSEL(IP8_11_8,      MSIOF1_SCK_G,           SEL_MSIOF1_6),
+       PINMUX_IPSR_MSEL(IP8_11_8,      SIM0_CLK_A,             SEL_SIMCARD_0),
+
+       PINMUX_IPSR_GPSR(IP8_15_12,     SD1_CMD),
+       PINMUX_IPSR_MSEL(IP8_15_12,     MSIOF1_SYNC_G,          SEL_MSIOF1_6),
+       PINMUX_IPSR_MSEL(IP8_15_12,     NFCE_N_B,               SEL_NDFC_1),
+       PINMUX_IPSR_MSEL(IP8_15_12,     SIM0_D_A,               SEL_SIMCARD_0),
+       PINMUX_IPSR_MSEL(IP8_15_12,     STP_IVCXO27_1_B,        SEL_SSP1_1_1),
+
+       PINMUX_IPSR_GPSR(IP8_19_16,     SD1_DAT0),
+       PINMUX_IPSR_GPSR(IP8_19_16,     SD2_DAT4),
+       PINMUX_IPSR_MSEL(IP8_19_16,     MSIOF1_RXD_G,           SEL_MSIOF1_6),
+       PINMUX_IPSR_MSEL(IP8_19_16,     NFWP_N_B,               SEL_NDFC_1),
+       PINMUX_IPSR_MSEL(IP8_19_16,     TS_SCK1_B,              SEL_TSIF1_1),
+       PINMUX_IPSR_MSEL(IP8_19_16,     STP_ISCLK_1_B,          SEL_SSP1_1_1),
+
+       PINMUX_IPSR_GPSR(IP8_23_20,     SD1_DAT1),
+       PINMUX_IPSR_GPSR(IP8_23_20,     SD2_DAT5),
+       PINMUX_IPSR_MSEL(IP8_23_20,     MSIOF1_TXD_G,           SEL_MSIOF1_6),
+       PINMUX_IPSR_MSEL(IP8_23_20,     NFDATA14_B,             SEL_NDFC_1),
+       PINMUX_IPSR_MSEL(IP8_23_20,     TS_SPSYNC1_B,           SEL_TSIF1_1),
+       PINMUX_IPSR_MSEL(IP8_23_20,     STP_ISSYNC_1_B,         SEL_SSP1_1_1),
+
+       PINMUX_IPSR_GPSR(IP8_27_24,     SD1_DAT2),
+       PINMUX_IPSR_GPSR(IP8_27_24,     SD2_DAT6),
+       PINMUX_IPSR_MSEL(IP8_27_24,     MSIOF1_SS1_G,           SEL_MSIOF1_6),
+       PINMUX_IPSR_MSEL(IP8_27_24,     NFDATA15_B,             SEL_NDFC_1),
+       PINMUX_IPSR_MSEL(IP8_27_24,     TS_SDAT1_B,             SEL_TSIF1_1),
+       PINMUX_IPSR_MSEL(IP8_27_24,     STP_ISD_1_B,            SEL_SSP1_1_1),
+
+       PINMUX_IPSR_GPSR(IP8_31_28,     SD1_DAT3),
+       PINMUX_IPSR_GPSR(IP8_31_28,     SD2_DAT7),
+       PINMUX_IPSR_MSEL(IP8_31_28,     MSIOF1_SS2_G,           SEL_MSIOF1_6),
+       PINMUX_IPSR_MSEL(IP8_31_28,     NFRB_N_B,               SEL_NDFC_1),
+       PINMUX_IPSR_MSEL(IP8_31_28,     TS_SDEN1_B,             SEL_TSIF1_1),
+       PINMUX_IPSR_MSEL(IP8_31_28,     STP_ISEN_1_B,           SEL_SSP1_1_1),
+
+       /* IPSR9 */
+       PINMUX_IPSR_GPSR(IP9_3_0,       SD2_CLK),
+       PINMUX_IPSR_GPSR(IP9_3_0,       NFDATA8),
+
+       PINMUX_IPSR_GPSR(IP9_7_4,       SD2_CMD),
+       PINMUX_IPSR_GPSR(IP9_7_4,       NFDATA9),
+
+       PINMUX_IPSR_GPSR(IP9_11_8,      SD2_DAT0),
+       PINMUX_IPSR_GPSR(IP9_11_8,      NFDATA10),
+
+       PINMUX_IPSR_GPSR(IP9_15_12,     SD2_DAT1),
+       PINMUX_IPSR_GPSR(IP9_15_12,     NFDATA11),
+
+       PINMUX_IPSR_GPSR(IP9_19_16,     SD2_DAT2),
+       PINMUX_IPSR_GPSR(IP9_19_16,     NFDATA12),
+
+       PINMUX_IPSR_GPSR(IP9_23_20,     SD2_DAT3),
+       PINMUX_IPSR_GPSR(IP9_23_20,     NFDATA13),
+
+       PINMUX_IPSR_GPSR(IP9_27_24,     SD2_DS),
+       PINMUX_IPSR_GPSR(IP9_27_24,     NFALE),
+       PINMUX_IPSR_GPSR(IP9_27_24,     SATA_DEVSLP_B),
+
+       PINMUX_IPSR_GPSR(IP9_31_28,     SD3_CLK),
+       PINMUX_IPSR_GPSR(IP9_31_28,     NFWE_N),
+
+       /* IPSR10 */
+       PINMUX_IPSR_GPSR(IP10_3_0,      SD3_CMD),
+       PINMUX_IPSR_GPSR(IP10_3_0,      NFRE_N),
+
+       PINMUX_IPSR_GPSR(IP10_7_4,      SD3_DAT0),
+       PINMUX_IPSR_GPSR(IP10_7_4,      NFDATA0),
+
+       PINMUX_IPSR_GPSR(IP10_11_8,     SD3_DAT1),
+       PINMUX_IPSR_GPSR(IP10_11_8,     NFDATA1),
+
+       PINMUX_IPSR_GPSR(IP10_15_12,    SD3_DAT2),
+       PINMUX_IPSR_GPSR(IP10_15_12,    NFDATA2),
+
+       PINMUX_IPSR_GPSR(IP10_19_16,    SD3_DAT3),
+       PINMUX_IPSR_GPSR(IP10_19_16,    NFDATA3),
+
+       PINMUX_IPSR_GPSR(IP10_23_20,    SD3_DAT4),
+       PINMUX_IPSR_MSEL(IP10_23_20,    SD2_CD_A,               SEL_SDHI2_0),
+       PINMUX_IPSR_GPSR(IP10_23_20,    NFDATA4),
+
+       PINMUX_IPSR_GPSR(IP10_27_24,    SD3_DAT5),
+       PINMUX_IPSR_MSEL(IP10_27_24,    SD2_WP_A,               SEL_SDHI2_0),
+       PINMUX_IPSR_GPSR(IP10_27_24,    NFDATA5),
+
+       PINMUX_IPSR_GPSR(IP10_31_28,    SD3_DAT6),
+       PINMUX_IPSR_GPSR(IP10_31_28,    SD3_CD),
+       PINMUX_IPSR_GPSR(IP10_31_28,    NFDATA6),
+
+       /* IPSR11 */
+       PINMUX_IPSR_GPSR(IP11_3_0,      SD3_DAT7),
+       PINMUX_IPSR_GPSR(IP11_3_0,      SD3_WP),
+       PINMUX_IPSR_GPSR(IP11_3_0,      NFDATA7),
+
+       PINMUX_IPSR_GPSR(IP11_7_4,      SD3_DS),
+       PINMUX_IPSR_GPSR(IP11_7_4,      NFCLE),
+
+       PINMUX_IPSR_GPSR(IP11_11_8,     SD0_CD),
+       PINMUX_IPSR_MSEL(IP11_11_8,     NFDATA14_A,             SEL_NDFC_0),
+       PINMUX_IPSR_MSEL(IP11_11_8,     SCL2_B,                 SEL_I2C2_1),
+       PINMUX_IPSR_MSEL(IP11_11_8,     SIM0_RST_A,             SEL_SIMCARD_0),
+
+       PINMUX_IPSR_GPSR(IP11_15_12,    SD0_WP),
+       PINMUX_IPSR_MSEL(IP11_15_12,    NFDATA15_A,             SEL_NDFC_0),
+       PINMUX_IPSR_MSEL(IP11_15_12,    SDA2_B,                 SEL_I2C2_1),
+
+       PINMUX_IPSR_GPSR(IP11_19_16,    SD1_CD),
+       PINMUX_IPSR_MSEL(IP11_19_16,    NFRB_N_A,               SEL_NDFC_0),
+       PINMUX_IPSR_MSEL(IP11_19_16,    SIM0_CLK_B,             SEL_SIMCARD_1),
+
+       PINMUX_IPSR_GPSR(IP11_23_20,    SD1_WP),
+       PINMUX_IPSR_MSEL(IP11_23_20,    NFCE_N_A,               SEL_NDFC_0),
+       PINMUX_IPSR_MSEL(IP11_23_20,    SIM0_D_B,               SEL_SIMCARD_1),
+
+       PINMUX_IPSR_GPSR(IP11_27_24,    SCK0),
+       PINMUX_IPSR_MSEL(IP11_27_24,    HSCK1_B,                SEL_HSCIF1_1),
+       PINMUX_IPSR_MSEL(IP11_27_24,    MSIOF1_SS2_B,           SEL_MSIOF1_1),
+       PINMUX_IPSR_MSEL(IP11_27_24,    AUDIO_CLKC_B,           SEL_ADG_C_1),
+       PINMUX_IPSR_MSEL(IP11_27_24,    SDA2_A,                 SEL_I2C2_0),
+       PINMUX_IPSR_MSEL(IP11_27_24,    SIM0_RST_B,             SEL_SIMCARD_1),
+       PINMUX_IPSR_MSEL(IP11_27_24,    STP_OPWM_0_C,           SEL_SSP1_0_2),
+       PINMUX_IPSR_MSEL(IP11_27_24,    RIF0_CLK_B,             SEL_DRIF0_1),
+       PINMUX_IPSR_GPSR(IP11_27_24,    ADICHS2),
+       PINMUX_IPSR_MSEL(IP11_27_24,    SCK5_B,                 SEL_SCIF5_1),
+
+       PINMUX_IPSR_GPSR(IP11_31_28,    RX0),
+       PINMUX_IPSR_MSEL(IP11_31_28,    HRX1_B,                 SEL_HSCIF1_1),
+       PINMUX_IPSR_MSEL(IP11_31_28,    TS_SCK0_C,              SEL_TSIF0_2),
+       PINMUX_IPSR_MSEL(IP11_31_28,    STP_ISCLK_0_C,          SEL_SSP1_0_2),
+       PINMUX_IPSR_MSEL(IP11_31_28,    RIF0_D0_B,              SEL_DRIF0_1),
+
+       /* IPSR12 */
+       PINMUX_IPSR_GPSR(IP12_3_0,      TX0),
+       PINMUX_IPSR_MSEL(IP12_3_0,      HTX1_B,                 SEL_HSCIF1_1),
+       PINMUX_IPSR_MSEL(IP12_3_0,      TS_SPSYNC0_C,           SEL_TSIF0_2),
+       PINMUX_IPSR_MSEL(IP12_3_0,      STP_ISSYNC_0_C,         SEL_SSP1_0_2),
+       PINMUX_IPSR_MSEL(IP12_3_0,      RIF0_D1_B,              SEL_DRIF0_1),
+
+       PINMUX_IPSR_GPSR(IP12_7_4,      CTS0_N),
+       PINMUX_IPSR_MSEL(IP12_7_4,      HCTS1_N_B,              SEL_HSCIF1_1),
+       PINMUX_IPSR_MSEL(IP12_7_4,      MSIOF1_SYNC_B,          SEL_MSIOF1_1),
+       PINMUX_IPSR_MSEL(IP12_7_4,      TS_SPSYNC1_C,           SEL_TSIF1_2),
+       PINMUX_IPSR_MSEL(IP12_7_4,      STP_ISSYNC_1_C,         SEL_SSP1_1_2),
+       PINMUX_IPSR_MSEL(IP12_7_4,      RIF1_SYNC_B,            SEL_DRIF1_1),
+       PINMUX_IPSR_GPSR(IP12_7_4,      AUDIO_CLKOUT_C),
+       PINMUX_IPSR_GPSR(IP12_7_4,      ADICS_SAMP),
+
+       PINMUX_IPSR_GPSR(IP12_11_8,     RTS0_N),
+       PINMUX_IPSR_MSEL(IP12_11_8,     HRTS1_N_B,              SEL_HSCIF1_1),
+       PINMUX_IPSR_MSEL(IP12_11_8,     MSIOF1_SS1_B,           SEL_MSIOF1_1),
+       PINMUX_IPSR_MSEL(IP12_11_8,     AUDIO_CLKA_B,           SEL_ADG_A_1),
+       PINMUX_IPSR_MSEL(IP12_11_8,     SCL2_A,                 SEL_I2C2_0),
+       PINMUX_IPSR_MSEL(IP12_11_8,     STP_IVCXO27_1_C,        SEL_SSP1_1_2),
+       PINMUX_IPSR_MSEL(IP12_11_8,     RIF0_SYNC_B,            SEL_DRIF0_1),
+       PINMUX_IPSR_GPSR(IP12_11_8,     ADICHS1),
+
+       PINMUX_IPSR_MSEL(IP12_15_12,    RX1_A,                  SEL_SCIF1_0),
+       PINMUX_IPSR_MSEL(IP12_15_12,    HRX1_A,                 SEL_HSCIF1_0),
+       PINMUX_IPSR_MSEL(IP12_15_12,    TS_SDAT0_C,             SEL_TSIF0_2),
+       PINMUX_IPSR_MSEL(IP12_15_12,    STP_ISD_0_C,            SEL_SSP1_0_2),
+       PINMUX_IPSR_MSEL(IP12_15_12,    RIF1_CLK_C,             SEL_DRIF1_2),
+
+       PINMUX_IPSR_MSEL(IP12_19_16,    TX1_A,                  SEL_SCIF1_0),
+       PINMUX_IPSR_MSEL(IP12_19_16,    HTX1_A,                 SEL_HSCIF1_0),
+       PINMUX_IPSR_MSEL(IP12_19_16,    TS_SDEN0_C,             SEL_TSIF0_2),
+       PINMUX_IPSR_MSEL(IP12_19_16,    STP_ISEN_0_C,           SEL_SSP1_0_2),
+       PINMUX_IPSR_MSEL(IP12_19_16,    RIF1_D0_C,              SEL_DRIF1_2),
+
+       PINMUX_IPSR_GPSR(IP12_23_20,    CTS1_N),
+       PINMUX_IPSR_MSEL(IP12_23_20,    HCTS1_N_A,              SEL_HSCIF1_0),
+       PINMUX_IPSR_MSEL(IP12_23_20,    MSIOF1_RXD_B,           SEL_MSIOF1_1),
+       PINMUX_IPSR_MSEL(IP12_23_20,    TS_SDEN1_C,             SEL_TSIF1_2),
+       PINMUX_IPSR_MSEL(IP12_23_20,    STP_ISEN_1_C,           SEL_SSP1_1_2),
+       PINMUX_IPSR_MSEL(IP12_23_20,    RIF1_D0_B,              SEL_DRIF1_1),
+       PINMUX_IPSR_GPSR(IP12_23_20,    ADIDATA),
+
+       PINMUX_IPSR_GPSR(IP12_27_24,    RTS1_N),
+       PINMUX_IPSR_MSEL(IP12_27_24,    HRTS1_N_A,              SEL_HSCIF1_0),
+       PINMUX_IPSR_MSEL(IP12_27_24,    MSIOF1_TXD_B,           SEL_MSIOF1_1),
+       PINMUX_IPSR_MSEL(IP12_27_24,    TS_SDAT1_C,             SEL_TSIF1_2),
+       PINMUX_IPSR_MSEL(IP12_27_24,    STP_ISD_1_C,            SEL_SSP1_1_2),
+       PINMUX_IPSR_MSEL(IP12_27_24,    RIF1_D1_B,              SEL_DRIF1_1),
+       PINMUX_IPSR_GPSR(IP12_27_24,    ADICHS0),
+
+       PINMUX_IPSR_GPSR(IP12_31_28,    SCK2),
+       PINMUX_IPSR_MSEL(IP12_31_28,    SCIF_CLK_B,             SEL_SCIF_1),
+       PINMUX_IPSR_MSEL(IP12_31_28,    MSIOF1_SCK_B,           SEL_MSIOF1_1),
+       PINMUX_IPSR_MSEL(IP12_31_28,    TS_SCK1_C,              SEL_TSIF1_2),
+       PINMUX_IPSR_MSEL(IP12_31_28,    STP_ISCLK_1_C,          SEL_SSP1_1_2),
+       PINMUX_IPSR_MSEL(IP12_31_28,    RIF1_CLK_B,             SEL_DRIF1_1),
+       PINMUX_IPSR_GPSR(IP12_31_28,    ADICLK),
+
+       /* IPSR13 */
+       PINMUX_IPSR_MSEL(IP13_3_0,      TX2_A,                  SEL_SCIF2_0),
+       PINMUX_IPSR_MSEL(IP13_3_0,      SD2_CD_B,               SEL_SDHI2_1),
+       PINMUX_IPSR_MSEL(IP13_3_0,      SCL1_A,                 SEL_I2C1_0),
+       PINMUX_IPSR_MSEL(IP13_3_0,      FMCLK_A,                SEL_FM_0),
+       PINMUX_IPSR_MSEL(IP13_3_0,      RIF1_D1_C,              SEL_DRIF1_2),
+       PINMUX_IPSR_GPSR(IP13_3_0,      FSO_CFE_0_N),
+
+       PINMUX_IPSR_MSEL(IP13_7_4,      RX2_A,                  SEL_SCIF2_0),
+       PINMUX_IPSR_MSEL(IP13_7_4,      SD2_WP_B,               SEL_SDHI2_1),
+       PINMUX_IPSR_MSEL(IP13_7_4,      SDA1_A,                 SEL_I2C1_0),
+       PINMUX_IPSR_MSEL(IP13_7_4,      FMIN_A,                 SEL_FM_0),
+       PINMUX_IPSR_MSEL(IP13_7_4,      RIF1_SYNC_C,            SEL_DRIF1_2),
+       PINMUX_IPSR_GPSR(IP13_7_4,      FSO_CFE_1_N),
+
+       PINMUX_IPSR_GPSR(IP13_11_8,     HSCK0),
+       PINMUX_IPSR_MSEL(IP13_11_8,     MSIOF1_SCK_D,           SEL_MSIOF1_3),
+       PINMUX_IPSR_MSEL(IP13_11_8,     AUDIO_CLKB_A,           SEL_ADG_B_0),
+       PINMUX_IPSR_MSEL(IP13_11_8,     SSI_SDATA1_B,           SEL_SSI1_1),
+       PINMUX_IPSR_MSEL(IP13_11_8,     TS_SCK0_D,              SEL_TSIF0_3),
+       PINMUX_IPSR_MSEL(IP13_11_8,     STP_ISCLK_0_D,          SEL_SSP1_0_3),
+       PINMUX_IPSR_MSEL(IP13_11_8,     RIF0_CLK_C,             SEL_DRIF0_2),
+       PINMUX_IPSR_MSEL(IP13_11_8,     RX5_B,                  SEL_SCIF5_1),
+
+       PINMUX_IPSR_GPSR(IP13_15_12,    HRX0),
+       PINMUX_IPSR_MSEL(IP13_15_12,    MSIOF1_RXD_D,           SEL_MSIOF1_3),
+       PINMUX_IPSR_MSEL(IP13_15_12,    SSI_SDATA2_B,           SEL_SSI2_1),
+       PINMUX_IPSR_MSEL(IP13_15_12,    TS_SDEN0_D,             SEL_TSIF0_3),
+       PINMUX_IPSR_MSEL(IP13_15_12,    STP_ISEN_0_D,           SEL_SSP1_0_3),
+       PINMUX_IPSR_MSEL(IP13_15_12,    RIF0_D0_C,              SEL_DRIF0_2),
+
+       PINMUX_IPSR_GPSR(IP13_19_16,    HTX0),
+       PINMUX_IPSR_MSEL(IP13_19_16,    MSIOF1_TXD_D,           SEL_MSIOF1_3),
+       PINMUX_IPSR_MSEL(IP13_19_16,    SSI_SDATA9_B,           SEL_SSI9_1),
+       PINMUX_IPSR_MSEL(IP13_19_16,    TS_SDAT0_D,             SEL_TSIF0_3),
+       PINMUX_IPSR_MSEL(IP13_19_16,    STP_ISD_0_D,            SEL_SSP1_0_3),
+       PINMUX_IPSR_MSEL(IP13_19_16,    RIF0_D1_C,              SEL_DRIF0_2),
+
+       PINMUX_IPSR_GPSR(IP13_23_20,    HCTS0_N),
+       PINMUX_IPSR_MSEL(IP13_23_20,    RX2_B,                  SEL_SCIF2_1),
+       PINMUX_IPSR_MSEL(IP13_23_20,    MSIOF1_SYNC_D,          SEL_MSIOF1_3),
+       PINMUX_IPSR_MSEL(IP13_23_20,    SSI_SCK9_A,             SEL_SSI9_0),
+       PINMUX_IPSR_MSEL(IP13_23_20,    TS_SPSYNC0_D,           SEL_TSIF0_3),
+       PINMUX_IPSR_MSEL(IP13_23_20,    STP_ISSYNC_0_D,         SEL_SSP1_0_3),
+       PINMUX_IPSR_MSEL(IP13_23_20,    RIF0_SYNC_C,            SEL_DRIF0_2),
+       PINMUX_IPSR_GPSR(IP13_23_20,    AUDIO_CLKOUT1_A),
+
+       PINMUX_IPSR_GPSR(IP13_27_24,    HRTS0_N),
+       PINMUX_IPSR_MSEL(IP13_27_24,    TX2_B,                  SEL_SCIF2_1),
+       PINMUX_IPSR_MSEL(IP13_27_24,    MSIOF1_SS1_D,           SEL_MSIOF1_3),
+       PINMUX_IPSR_MSEL(IP13_27_24,    SSI_WS9_A,              SEL_SSI9_0),
+       PINMUX_IPSR_MSEL(IP13_27_24,    STP_IVCXO27_0_D,        SEL_SSP1_0_3),
+       PINMUX_IPSR_MSEL(IP13_27_24,    BPFCLK_A,               SEL_FM_0),
+       PINMUX_IPSR_GPSR(IP13_27_24,    AUDIO_CLKOUT2_A),
+
+       PINMUX_IPSR_GPSR(IP13_31_28,    MSIOF0_SYNC),
+       PINMUX_IPSR_GPSR(IP13_31_28,    AUDIO_CLKOUT_A),
+       PINMUX_IPSR_MSEL(IP13_31_28,    TX5_B,                  SEL_SCIF5_1),
+       PINMUX_IPSR_MSEL(IP13_31_28,    BPFCLK_D,               SEL_FM_3),
+
+       /* IPSR14 */
+       PINMUX_IPSR_GPSR(IP14_3_0,      MSIOF0_SS1),
+       PINMUX_IPSR_MSEL(IP14_3_0,      RX5_A,                  SEL_SCIF5_0),
+       PINMUX_IPSR_MSEL(IP14_3_0,      NFWP_N_A,               SEL_NDFC_0),
+       PINMUX_IPSR_MSEL(IP14_3_0,      AUDIO_CLKA_C,           SEL_ADG_A_2),
+       PINMUX_IPSR_MSEL(IP14_3_0,      SSI_SCK2_A,             SEL_SSI2_0),
+       PINMUX_IPSR_MSEL(IP14_3_0,      STP_IVCXO27_0_C,        SEL_SSP1_0_2),
+       PINMUX_IPSR_GPSR(IP14_3_0,      AUDIO_CLKOUT3_A),
+       PINMUX_IPSR_MSEL(IP14_3_0,      TCLK1_B,                SEL_TIMER_TMU_1),
+
+       PINMUX_IPSR_GPSR(IP14_7_4,      MSIOF0_SS2),
+       PINMUX_IPSR_MSEL(IP14_7_4,      TX5_A,                  SEL_SCIF5_0),
+       PINMUX_IPSR_MSEL(IP14_7_4,      MSIOF1_SS2_D,           SEL_MSIOF1_3),
+       PINMUX_IPSR_MSEL(IP14_7_4,      AUDIO_CLKC_A,           SEL_ADG_C_0),
+       PINMUX_IPSR_MSEL(IP14_7_4,      SSI_WS2_A,              SEL_SSI2_0),
+       PINMUX_IPSR_MSEL(IP14_7_4,      STP_OPWM_0_D,           SEL_SSP1_0_3),
+       PINMUX_IPSR_GPSR(IP14_7_4,      AUDIO_CLKOUT_D),
+       PINMUX_IPSR_MSEL(IP14_7_4,      SPEEDIN_B,              SEL_SPEED_PULSE_1),
+
+       PINMUX_IPSR_GPSR(IP14_11_8,     MLB_CLK),
+       PINMUX_IPSR_MSEL(IP14_11_8,     MSIOF1_SCK_F,           SEL_MSIOF1_5),
+       PINMUX_IPSR_MSEL(IP14_11_8,     SCL1_B,                 SEL_I2C1_1),
+
+       PINMUX_IPSR_GPSR(IP14_15_12,    MLB_SIG),
+       PINMUX_IPSR_MSEL(IP14_15_12,    RX1_B,                  SEL_SCIF1_1),
+       PINMUX_IPSR_MSEL(IP14_15_12,    MSIOF1_SYNC_F,          SEL_MSIOF1_5),
+       PINMUX_IPSR_MSEL(IP14_15_12,    SDA1_B,                 SEL_I2C1_1),
+
+       PINMUX_IPSR_GPSR(IP14_19_16,    MLB_DAT),
+       PINMUX_IPSR_MSEL(IP14_19_16,    TX1_B,                  SEL_SCIF1_1),
+       PINMUX_IPSR_MSEL(IP14_19_16,    MSIOF1_RXD_F,           SEL_MSIOF1_5),
+
+       PINMUX_IPSR_GPSR(IP14_23_20,    SSI_SCK01239),
+       PINMUX_IPSR_MSEL(IP14_23_20,    MSIOF1_TXD_F,           SEL_MSIOF1_5),
+
+       PINMUX_IPSR_GPSR(IP14_27_24,    SSI_WS01239),
+       PINMUX_IPSR_MSEL(IP14_27_24,    MSIOF1_SS1_F,           SEL_MSIOF1_5),
+
+       PINMUX_IPSR_GPSR(IP14_31_28,    SSI_SDATA0),
+       PINMUX_IPSR_MSEL(IP14_31_28,    MSIOF1_SS2_F,           SEL_MSIOF1_5),
+
+       /* IPSR15 */
+       PINMUX_IPSR_MSEL(IP15_3_0,      SSI_SDATA1_A,           SEL_SSI1_0),
+
+       PINMUX_IPSR_MSEL(IP15_7_4,      SSI_SDATA2_A,           SEL_SSI2_0),
+       PINMUX_IPSR_MSEL(IP15_7_4,      SSI_SCK1_B,             SEL_SSI1_1),
+
+       PINMUX_IPSR_GPSR(IP15_11_8,     SSI_SCK349),
+       PINMUX_IPSR_MSEL(IP15_11_8,     MSIOF1_SS1_A,           SEL_MSIOF1_0),
+       PINMUX_IPSR_MSEL(IP15_11_8,     STP_OPWM_0_A,           SEL_SSP1_0_0),
+
+       PINMUX_IPSR_GPSR(IP15_15_12,    SSI_WS349),
+       PINMUX_IPSR_MSEL(IP15_15_12,    HCTS2_N_A,              SEL_HSCIF2_0),
+       PINMUX_IPSR_MSEL(IP15_15_12,    MSIOF1_SS2_A,           SEL_MSIOF1_0),
+       PINMUX_IPSR_MSEL(IP15_15_12,    STP_IVCXO27_0_A,        SEL_SSP1_0_0),
+
+       PINMUX_IPSR_GPSR(IP15_19_16,    SSI_SDATA3),
+       PINMUX_IPSR_MSEL(IP15_19_16,    HRTS2_N_A,              SEL_HSCIF2_0),
+       PINMUX_IPSR_MSEL(IP15_19_16,    MSIOF1_TXD_A,           SEL_MSIOF1_0),
+       PINMUX_IPSR_MSEL(IP15_19_16,    TS_SCK0_A,              SEL_TSIF0_0),
+       PINMUX_IPSR_MSEL(IP15_19_16,    STP_ISCLK_0_A,          SEL_SSP1_0_0),
+       PINMUX_IPSR_MSEL(IP15_19_16,    RIF0_D1_A,              SEL_DRIF0_0),
+       PINMUX_IPSR_MSEL(IP15_19_16,    RIF2_D0_A,              SEL_DRIF2_0),
+
+       PINMUX_IPSR_GPSR(IP15_23_20,    SSI_SCK4),
+       PINMUX_IPSR_MSEL(IP15_23_20,    HRX2_A,                 SEL_HSCIF2_0),
+       PINMUX_IPSR_MSEL(IP15_23_20,    MSIOF1_SCK_A,           SEL_MSIOF1_0),
+       PINMUX_IPSR_MSEL(IP15_23_20,    TS_SDAT0_A,             SEL_TSIF0_0),
+       PINMUX_IPSR_MSEL(IP15_23_20,    STP_ISD_0_A,            SEL_SSP1_0_0),
+       PINMUX_IPSR_MSEL(IP15_23_20,    RIF0_CLK_A,             SEL_DRIF0_0),
+       PINMUX_IPSR_MSEL(IP15_23_20,    RIF2_CLK_A,             SEL_DRIF2_0),
+
+       PINMUX_IPSR_GPSR(IP15_27_24,    SSI_WS4),
+       PINMUX_IPSR_MSEL(IP15_27_24,    HTX2_A,                 SEL_HSCIF2_0),
+       PINMUX_IPSR_MSEL(IP15_27_24,    MSIOF1_SYNC_A,          SEL_MSIOF1_0),
+       PINMUX_IPSR_MSEL(IP15_27_24,    TS_SDEN0_A,             SEL_TSIF0_0),
+       PINMUX_IPSR_MSEL(IP15_27_24,    STP_ISEN_0_A,           SEL_SSP1_0_0),
+       PINMUX_IPSR_MSEL(IP15_27_24,    RIF0_SYNC_A,            SEL_DRIF0_0),
+       PINMUX_IPSR_MSEL(IP15_27_24,    RIF2_SYNC_A,            SEL_DRIF2_0),
+
+       PINMUX_IPSR_GPSR(IP15_31_28,    SSI_SDATA4),
+       PINMUX_IPSR_MSEL(IP15_31_28,    HSCK2_A,                SEL_HSCIF2_0),
+       PINMUX_IPSR_MSEL(IP15_31_28,    MSIOF1_RXD_A,           SEL_MSIOF1_0),
+       PINMUX_IPSR_MSEL(IP15_31_28,    TS_SPSYNC0_A,           SEL_TSIF0_0),
+       PINMUX_IPSR_MSEL(IP15_31_28,    STP_ISSYNC_0_A,         SEL_SSP1_0_0),
+       PINMUX_IPSR_MSEL(IP15_31_28,    RIF0_D0_A,              SEL_DRIF0_0),
+       PINMUX_IPSR_MSEL(IP15_31_28,    RIF2_D1_A,              SEL_DRIF2_0),
+
+       /* IPSR16 */
+       PINMUX_IPSR_GPSR(IP16_3_0,      SSI_SCK6),
+       PINMUX_IPSR_MSEL(IP16_3_0,      SIM0_RST_D,             SEL_SIMCARD_3),
+
+       PINMUX_IPSR_GPSR(IP16_7_4,      SSI_WS6),
+       PINMUX_IPSR_MSEL(IP16_7_4,      SIM0_D_D,               SEL_SIMCARD_3),
+
+       PINMUX_IPSR_GPSR(IP16_11_8,     SSI_SDATA6),
+       PINMUX_IPSR_MSEL(IP16_11_8,     SIM0_CLK_D,             SEL_SIMCARD_3),
+       PINMUX_IPSR_GPSR(IP16_11_8,     SATA_DEVSLP_A),
+
+       PINMUX_IPSR_GPSR(IP16_15_12,    SSI_SCK78),
+       PINMUX_IPSR_MSEL(IP16_15_12,    HRX2_B,                 SEL_HSCIF2_1),
+       PINMUX_IPSR_MSEL(IP16_15_12,    MSIOF1_SCK_C,           SEL_MSIOF1_2),
+       PINMUX_IPSR_MSEL(IP16_15_12,    TS_SCK1_A,              SEL_TSIF1_0),
+       PINMUX_IPSR_MSEL(IP16_15_12,    STP_ISCLK_1_A,          SEL_SSP1_1_0),
+       PINMUX_IPSR_MSEL(IP16_15_12,    RIF1_CLK_A,             SEL_DRIF1_0),
+       PINMUX_IPSR_MSEL(IP16_15_12,    RIF3_CLK_A,             SEL_DRIF3_0),
+
+       PINMUX_IPSR_GPSR(IP16_19_16,    SSI_WS78),
+       PINMUX_IPSR_MSEL(IP16_19_16,    HTX2_B,                 SEL_HSCIF2_1),
+       PINMUX_IPSR_MSEL(IP16_19_16,    MSIOF1_SYNC_C,          SEL_MSIOF1_2),
+       PINMUX_IPSR_MSEL(IP16_19_16,    TS_SDAT1_A,             SEL_TSIF1_0),
+       PINMUX_IPSR_MSEL(IP16_19_16,    STP_ISD_1_A,            SEL_SSP1_1_0),
+       PINMUX_IPSR_MSEL(IP16_19_16,    RIF1_SYNC_A,            SEL_DRIF1_0),
+       PINMUX_IPSR_MSEL(IP16_19_16,    RIF3_SYNC_A,            SEL_DRIF3_0),
+
+       PINMUX_IPSR_GPSR(IP16_23_20,    SSI_SDATA7),
+       PINMUX_IPSR_MSEL(IP16_23_20,    HCTS2_N_B,              SEL_HSCIF2_1),
+       PINMUX_IPSR_MSEL(IP16_23_20,    MSIOF1_RXD_C,           SEL_MSIOF1_2),
+       PINMUX_IPSR_MSEL(IP16_23_20,    TS_SDEN1_A,             SEL_TSIF1_0),
+       PINMUX_IPSR_MSEL(IP16_23_20,    STP_ISEN_1_A,           SEL_SSP1_1_0),
+       PINMUX_IPSR_MSEL(IP16_23_20,    RIF1_D0_A,              SEL_DRIF1_0),
+       PINMUX_IPSR_MSEL(IP16_23_20,    RIF3_D0_A,              SEL_DRIF3_0),
+       PINMUX_IPSR_MSEL(IP16_23_20,    TCLK2_A,                SEL_TIMER_TMU2_0),
+
+       PINMUX_IPSR_GPSR(IP16_27_24,    SSI_SDATA8),
+       PINMUX_IPSR_MSEL(IP16_27_24,    HRTS2_N_B,              SEL_HSCIF2_1),
+       PINMUX_IPSR_MSEL(IP16_27_24,    MSIOF1_TXD_C,           SEL_MSIOF1_2),
+       PINMUX_IPSR_MSEL(IP16_27_24,    TS_SPSYNC1_A,           SEL_TSIF1_0),
+       PINMUX_IPSR_MSEL(IP16_27_24,    STP_ISSYNC_1_A,         SEL_SSP1_1_0),
+       PINMUX_IPSR_MSEL(IP16_27_24,    RIF1_D1_A,              SEL_DRIF1_0),
+       PINMUX_IPSR_MSEL(IP16_27_24,    RIF3_D1_A,              SEL_DRIF3_0),
+
+       PINMUX_IPSR_MSEL(IP16_31_28,    SSI_SDATA9_A,           SEL_SSI9_0),
+       PINMUX_IPSR_MSEL(IP16_31_28,    HSCK2_B,                SEL_HSCIF2_1),
+       PINMUX_IPSR_MSEL(IP16_31_28,    MSIOF1_SS1_C,           SEL_MSIOF1_2),
+       PINMUX_IPSR_MSEL(IP16_31_28,    HSCK1_A,                SEL_HSCIF1_0),
+       PINMUX_IPSR_MSEL(IP16_31_28,    SSI_WS1_B,              SEL_SSI1_1),
+       PINMUX_IPSR_GPSR(IP16_31_28,    SCK1),
+       PINMUX_IPSR_MSEL(IP16_31_28,    STP_IVCXO27_1_A,        SEL_SSP1_1_0),
+       PINMUX_IPSR_MSEL(IP16_31_28,    SCK5_A,                 SEL_SCIF5_0),
+
+       /* IPSR17 */
+       PINMUX_IPSR_MSEL(IP17_3_0,      AUDIO_CLKA_A,           SEL_ADG_A_0),
+       PINMUX_IPSR_GPSR(IP17_3_0,      CC5_OSCOUT),
+
+       PINMUX_IPSR_MSEL(IP17_7_4,      AUDIO_CLKB_B,           SEL_ADG_B_1),
+       PINMUX_IPSR_MSEL(IP17_7_4,      SCIF_CLK_A,             SEL_SCIF_0),
+       PINMUX_IPSR_MSEL(IP17_7_4,      STP_IVCXO27_1_D,        SEL_SSP1_1_3),
+       PINMUX_IPSR_MSEL(IP17_7_4,      REMOCON_A,              SEL_REMOCON_0),
+       PINMUX_IPSR_MSEL(IP17_7_4,      TCLK1_A,                SEL_TIMER_TMU_0),
+
+       PINMUX_IPSR_GPSR(IP17_11_8,     USB0_PWEN),
+       PINMUX_IPSR_MSEL(IP17_11_8,     SIM0_RST_C,             SEL_SIMCARD_2),
+       PINMUX_IPSR_MSEL(IP17_11_8,     TS_SCK1_D,              SEL_TSIF1_3),
+       PINMUX_IPSR_MSEL(IP17_11_8,     STP_ISCLK_1_D,          SEL_SSP1_1_3),
+       PINMUX_IPSR_MSEL(IP17_11_8,     BPFCLK_B,               SEL_FM_1),
+       PINMUX_IPSR_MSEL(IP17_11_8,     RIF3_CLK_B,             SEL_DRIF3_1),
+       PINMUX_IPSR_MSEL(IP17_11_8,     HSCK2_C,                SEL_HSCIF2_2),
+
+       PINMUX_IPSR_GPSR(IP17_15_12,    USB0_OVC),
+       PINMUX_IPSR_MSEL(IP17_15_12,    SIM0_D_C,               SEL_SIMCARD_2),
+       PINMUX_IPSR_MSEL(IP17_15_12,    TS_SDAT1_D,             SEL_TSIF1_3),
+       PINMUX_IPSR_MSEL(IP17_15_12,    STP_ISD_1_D,            SEL_SSP1_1_3),
+       PINMUX_IPSR_MSEL(IP17_15_12,    RIF3_SYNC_B,            SEL_DRIF3_1),
+       PINMUX_IPSR_MSEL(IP17_15_12,    HRX2_C,                 SEL_HSCIF2_2),
+
+       PINMUX_IPSR_GPSR(IP17_19_16,    USB1_PWEN),
+       PINMUX_IPSR_MSEL(IP17_19_16,    SIM0_CLK_C,             SEL_SIMCARD_2),
+       PINMUX_IPSR_MSEL(IP17_19_16,    SSI_SCK1_A,             SEL_SSI1_0),
+       PINMUX_IPSR_MSEL(IP17_19_16,    TS_SCK0_E,              SEL_TSIF0_4),
+       PINMUX_IPSR_MSEL(IP17_19_16,    STP_ISCLK_0_E,          SEL_SSP1_0_4),
+       PINMUX_IPSR_MSEL(IP17_19_16,    FMCLK_B,                SEL_FM_1),
+       PINMUX_IPSR_MSEL(IP17_19_16,    RIF2_CLK_B,             SEL_DRIF2_1),
+       PINMUX_IPSR_MSEL(IP17_19_16,    SPEEDIN_A,              SEL_SPEED_PULSE_0),
+       PINMUX_IPSR_MSEL(IP17_19_16,    HTX2_C,                 SEL_HSCIF2_2),
+
+       PINMUX_IPSR_GPSR(IP17_23_20,    USB1_OVC),
+       PINMUX_IPSR_MSEL(IP17_23_20,    MSIOF1_SS2_C,           SEL_MSIOF1_2),
+       PINMUX_IPSR_MSEL(IP17_23_20,    SSI_WS1_A,              SEL_SSI1_0),
+       PINMUX_IPSR_MSEL(IP17_23_20,    TS_SDAT0_E,             SEL_TSIF0_4),
+       PINMUX_IPSR_MSEL(IP17_23_20,    STP_ISD_0_E,            SEL_SSP1_0_4),
+       PINMUX_IPSR_MSEL(IP17_23_20,    FMIN_B,                 SEL_FM_1),
+       PINMUX_IPSR_MSEL(IP17_23_20,    RIF2_SYNC_B,            SEL_DRIF2_1),
+       PINMUX_IPSR_MSEL(IP17_23_20,    REMOCON_B,              SEL_REMOCON_1),
+       PINMUX_IPSR_MSEL(IP17_23_20,    HCTS2_N_C,              SEL_HSCIF2_2),
+
+       PINMUX_IPSR_GPSR(IP17_27_24,    USB30_PWEN),
+       PINMUX_IPSR_GPSR(IP17_27_24,    AUDIO_CLKOUT_B),
+       PINMUX_IPSR_MSEL(IP17_27_24,    SSI_SCK2_B,             SEL_SSI2_1),
+       PINMUX_IPSR_MSEL(IP17_27_24,    TS_SDEN1_D,             SEL_TSIF1_3),
+       PINMUX_IPSR_MSEL(IP17_27_24,    STP_ISEN_1_D,           SEL_SSP1_1_3),
+       PINMUX_IPSR_MSEL(IP17_27_24,    STP_OPWM_0_E,           SEL_SSP1_0_4),
+       PINMUX_IPSR_MSEL(IP17_27_24,    RIF3_D0_B,              SEL_DRIF3_1),
+       PINMUX_IPSR_MSEL(IP17_27_24,    TCLK2_B,                SEL_TIMER_TMU2_1),
+       PINMUX_IPSR_GPSR(IP17_27_24,    TPU0TO0),
+       PINMUX_IPSR_MSEL(IP17_27_24,    BPFCLK_C,               SEL_FM_2),
+       PINMUX_IPSR_MSEL(IP17_27_24,    HRTS2_N_C,              SEL_HSCIF2_2),
+
+       PINMUX_IPSR_GPSR(IP17_31_28,    USB30_OVC),
+       PINMUX_IPSR_GPSR(IP17_31_28,    AUDIO_CLKOUT1_B),
+       PINMUX_IPSR_MSEL(IP17_31_28,    SSI_WS2_B,              SEL_SSI2_1),
+       PINMUX_IPSR_MSEL(IP17_31_28,    TS_SPSYNC1_D,           SEL_TSIF1_3),
+       PINMUX_IPSR_MSEL(IP17_31_28,    STP_ISSYNC_1_D,         SEL_SSP1_1_3),
+       PINMUX_IPSR_MSEL(IP17_31_28,    STP_IVCXO27_0_E,        SEL_SSP1_0_4),
+       PINMUX_IPSR_MSEL(IP17_31_28,    RIF3_D1_B,              SEL_DRIF3_1),
+       PINMUX_IPSR_GPSR(IP17_31_28,    FSO_TOE_N),
+       PINMUX_IPSR_GPSR(IP17_31_28,    TPU0TO1),
+
+       /* IPSR18 */
+       PINMUX_IPSR_GPSR(IP18_3_0,      GP6_30),
+       PINMUX_IPSR_GPSR(IP18_3_0,      AUDIO_CLKOUT2_B),
+       PINMUX_IPSR_MSEL(IP18_3_0,      SSI_SCK9_B,             SEL_SSI9_1),
+       PINMUX_IPSR_MSEL(IP18_3_0,      TS_SDEN0_E,             SEL_TSIF0_4),
+       PINMUX_IPSR_MSEL(IP18_3_0,      STP_ISEN_0_E,           SEL_SSP1_0_4),
+       PINMUX_IPSR_MSEL(IP18_3_0,      RIF2_D0_B,              SEL_DRIF2_1),
+       PINMUX_IPSR_GPSR(IP18_3_0,      TPU0TO2),
+       PINMUX_IPSR_MSEL(IP18_3_0,      FMCLK_C,                SEL_FM_2),
+       PINMUX_IPSR_MSEL(IP18_3_0,      FMCLK_D,                SEL_FM_3),
+
+       PINMUX_IPSR_GPSR(IP18_7_4,      GP6_31),
+       PINMUX_IPSR_GPSR(IP18_7_4,      AUDIO_CLKOUT3_B),
+       PINMUX_IPSR_MSEL(IP18_7_4,      SSI_WS9_B,              SEL_SSI9_1),
+       PINMUX_IPSR_MSEL(IP18_7_4,      TS_SPSYNC0_E,           SEL_TSIF0_4),
+       PINMUX_IPSR_MSEL(IP18_7_4,      STP_ISSYNC_0_E,         SEL_SSP1_0_4),
+       PINMUX_IPSR_MSEL(IP18_7_4,      RIF2_D1_B,              SEL_DRIF2_1),
+       PINMUX_IPSR_GPSR(IP18_7_4,      TPU0TO3),
+       PINMUX_IPSR_MSEL(IP18_7_4,      FMIN_C,                 SEL_FM_2),
+       PINMUX_IPSR_MSEL(IP18_7_4,      FMIN_D,                 SEL_FM_3),
+
+       /* I2C */
+       PINMUX_IPSR_NOGP(0,             I2C_SEL_0_1),
+       PINMUX_IPSR_NOGP(0,             I2C_SEL_3_1),
+       PINMUX_IPSR_NOGP(0,             I2C_SEL_5_1),
+
+/*
+ * Static pins can not be muxed between different functions but
+ * still need mark entries in the pinmux list. Add each static
+ * pin to the list without an associated function. The sh-pfc
+ * core will do the right thing and skip trying to mux the pin
+ * while still applying configuration to it.
+ */
+#define FM(x)   PINMUX_DATA(x##_MARK, 0),
+       PINMUX_STATIC
+#undef FM
+};
+
+/*
+ * R8A77965 has 8 banks with 32 GPIOs in each => 256 GPIOs.
+ * Physical layout rows: A - AW, cols: 1 - 39.
+ */
+#define ROW_GROUP_A(r) ('Z' - 'A' + 1 + (r))
+#define PIN_NUMBER(r, c) (((r) - 'A') * 39 + (c) + 300)
+#define PIN_A_NUMBER(r, c) PIN_NUMBER(ROW_GROUP_A(r), c)
+#define PIN_NONE U16_MAX
+
+static const struct sh_pfc_pin pinmux_pins[] = {
+       PINMUX_GPIO_GP_ALL(),
+
+       /*
+        * Pins not associated with a GPIO port.
+        *
+        * The pin positions are different between different r8a77965
+        * packages, all that is needed for the pfc driver is a unique
+        * number for each pin. To this end use the pin layout from
+        * R-Car M3SiP to calculate a unique number for each pin.
+        */
+       SH_PFC_PIN_NAMED_CFG('A',  8, AVB_TX_CTL, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('A',  9, AVB_MDIO, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('A', 12, AVB_TXCREFCLK, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('A', 13, AVB_RD0, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('A', 14, AVB_RD2, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('A', 16, AVB_RX_CTL, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('A', 17, AVB_TD2, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('A', 18, AVB_TD0, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('A', 19, AVB_TXC, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('B', 13, AVB_RD1, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('B', 14, AVB_RD3, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('B', 17, AVB_TD3, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('B', 18, AVB_TD1, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('B', 19, AVB_RXC, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('C',  1, PRESETOUT#, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('H', 37, MLB_REF, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('V',  3, QSPI1_SPCLK, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('V',  5, QSPI1_SSL, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('V',  6, RPC_WP#, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('V',  7, RPC_RESET#, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('W',  3, QSPI0_SPCLK, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('Y',  3, QSPI0_SSL, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('Y',  6, QSPI0_IO2, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG('Y',  7, RPC_INT#, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('B'),  4, QSPI0_MISO_IO1, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('B'),  6, QSPI0_IO3, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('C'),  3, QSPI1_IO3, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('C'),  5, QSPI0_MOSI_IO0, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('C'),  7, QSPI1_MOSI_IO0, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('D'), 38, FSCLKST, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('D'), 39, EXTALR, SH_PFC_PIN_CFG_PULL_UP | SH_PFC_PIN_CFG_PULL_DOWN),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('E'),  4, QSPI1_IO2, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('E'),  5, QSPI1_MISO_IO1, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('P'),  7, DU_DOTCLKIN0, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('P'),  8, DU_DOTCLKIN1, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('R'),  8, DU_DOTCLKIN3, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('R'), 26, TRST#, SH_PFC_PIN_CFG_PULL_UP | SH_PFC_PIN_CFG_PULL_DOWN),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('R'), 29, TDI, SH_PFC_PIN_CFG_PULL_UP | SH_PFC_PIN_CFG_PULL_DOWN),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('R'), 30, TMS, CFG_FLAGS),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('T'), 27, TCK, SH_PFC_PIN_CFG_PULL_UP | SH_PFC_PIN_CFG_PULL_DOWN),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('T'), 28, TDO, SH_PFC_PIN_CFG_DRIVE_STRENGTH),
+       SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('T'), 30, ASEBRK, CFG_FLAGS),
+};
+
+/* - AUDIO CLOCK ------------------------------------------------------------ */
+static const unsigned int audio_clk_a_a_pins[] = {
+       /* CLK A */
+       RCAR_GP_PIN(6, 22),
+};
+static const unsigned int audio_clk_a_a_mux[] = {
+       AUDIO_CLKA_A_MARK,
+};
+static const unsigned int audio_clk_a_b_pins[] = {
+       /* CLK A */
+       RCAR_GP_PIN(5, 4),
+};
+static const unsigned int audio_clk_a_b_mux[] = {
+       AUDIO_CLKA_B_MARK,
+};
+static const unsigned int audio_clk_a_c_pins[] = {
+       /* CLK A */
+       RCAR_GP_PIN(5, 19),
+};
+static const unsigned int audio_clk_a_c_mux[] = {
+       AUDIO_CLKA_C_MARK,
+};
+static const unsigned int audio_clk_b_a_pins[] = {
+       /* CLK B */
+       RCAR_GP_PIN(5, 12),
+};
+static const unsigned int audio_clk_b_a_mux[] = {
+       AUDIO_CLKB_A_MARK,
+};
+static const unsigned int audio_clk_b_b_pins[] = {
+       /* CLK B */
+       RCAR_GP_PIN(6, 23),
+};
+static const unsigned int audio_clk_b_b_mux[] = {
+       AUDIO_CLKB_B_MARK,
+};
+static const unsigned int audio_clk_c_a_pins[] = {
+       /* CLK C */
+       RCAR_GP_PIN(5, 21),
+};
+static const unsigned int audio_clk_c_a_mux[] = {
+       AUDIO_CLKC_A_MARK,
+};
+static const unsigned int audio_clk_c_b_pins[] = {
+       /* CLK C */
+       RCAR_GP_PIN(5, 0),
+};
+static const unsigned int audio_clk_c_b_mux[] = {
+       AUDIO_CLKC_B_MARK,
+};
+static const unsigned int audio_clkout_a_pins[] = {
+       /* CLKOUT */
+       RCAR_GP_PIN(5, 18),
+};
+static const unsigned int audio_clkout_a_mux[] = {
+       AUDIO_CLKOUT_A_MARK,
+};
+static const unsigned int audio_clkout_b_pins[] = {
+       /* CLKOUT */
+       RCAR_GP_PIN(6, 28),
+};
+static const unsigned int audio_clkout_b_mux[] = {
+       AUDIO_CLKOUT_B_MARK,
+};
+static const unsigned int audio_clkout_c_pins[] = {
+       /* CLKOUT */
+       RCAR_GP_PIN(5, 3),
+};
+static const unsigned int audio_clkout_c_mux[] = {
+       AUDIO_CLKOUT_C_MARK,
+};
+static const unsigned int audio_clkout_d_pins[] = {
+       /* CLKOUT */
+       RCAR_GP_PIN(5, 21),
+};
+static const unsigned int audio_clkout_d_mux[] = {
+       AUDIO_CLKOUT_D_MARK,
+};
+static const unsigned int audio_clkout1_a_pins[] = {
+       /* CLKOUT1 */
+       RCAR_GP_PIN(5, 15),
+};
+static const unsigned int audio_clkout1_a_mux[] = {
+       AUDIO_CLKOUT1_A_MARK,
+};
+static const unsigned int audio_clkout1_b_pins[] = {
+       /* CLKOUT1 */
+       RCAR_GP_PIN(6, 29),
+};
+static const unsigned int audio_clkout1_b_mux[] = {
+       AUDIO_CLKOUT1_B_MARK,
+};
+static const unsigned int audio_clkout2_a_pins[] = {
+       /* CLKOUT2 */
+       RCAR_GP_PIN(5, 16),
+};
+static const unsigned int audio_clkout2_a_mux[] = {
+       AUDIO_CLKOUT2_A_MARK,
+};
+static const unsigned int audio_clkout2_b_pins[] = {
+       /* CLKOUT2 */
+       RCAR_GP_PIN(6, 30),
+};
+static const unsigned int audio_clkout2_b_mux[] = {
+       AUDIO_CLKOUT2_B_MARK,
+};
+
+static const unsigned int audio_clkout3_a_pins[] = {
+       /* CLKOUT3 */
+       RCAR_GP_PIN(5, 19),
+};
+static const unsigned int audio_clkout3_a_mux[] = {
+       AUDIO_CLKOUT3_A_MARK,
+};
+static const unsigned int audio_clkout3_b_pins[] = {
+       /* CLKOUT3 */
+       RCAR_GP_PIN(6, 31),
+};
+static const unsigned int audio_clkout3_b_mux[] = {
+       AUDIO_CLKOUT3_B_MARK,
+};
+
+/* - EtherAVB --------------------------------------------------------------- */
+static const unsigned int avb_link_pins[] = {
+       /* AVB_LINK */
+       RCAR_GP_PIN(2, 12),
+};
+static const unsigned int avb_link_mux[] = {
+       AVB_LINK_MARK,
+};
+static const unsigned int avb_magic_pins[] = {
+       /* AVB_MAGIC_ */
+       RCAR_GP_PIN(2, 10),
+};
+static const unsigned int avb_magic_mux[] = {
+       AVB_MAGIC_MARK,
+};
+static const unsigned int avb_phy_int_pins[] = {
+       /* AVB_PHY_INT */
+       RCAR_GP_PIN(2, 11),
+};
+static const unsigned int avb_phy_int_mux[] = {
+       AVB_PHY_INT_MARK,
+};
+static const unsigned int avb_mdio_pins[] = {
+       /* AVB_MDC, AVB_MDIO */
+       RCAR_GP_PIN(2, 9), PIN_NUMBER('A', 9),
+};
+static const unsigned int avb_mdio_mux[] = {
+       AVB_MDC_MARK, AVB_MDIO_MARK,
+};
+static const unsigned int avb_mii_pins[] = {
+       /*
+        * AVB_TX_CTL, AVB_TXC, AVB_TD0,
+        * AVB_TD1, AVB_TD2, AVB_TD3,
+        * AVB_RX_CTL, AVB_RXC, AVB_RD0,
+        * AVB_RD1, AVB_RD2, AVB_RD3,
+        * AVB_TXCREFCLK
+        */
+       PIN_NUMBER('A', 8), PIN_NUMBER('A', 19), PIN_NUMBER('A', 18),
+       PIN_NUMBER('B', 18), PIN_NUMBER('A', 17), PIN_NUMBER('B', 17),
+       PIN_NUMBER('A', 16), PIN_NUMBER('B', 19), PIN_NUMBER('A', 13),
+       PIN_NUMBER('B', 13), PIN_NUMBER('A', 14), PIN_NUMBER('B', 14),
+       PIN_NUMBER('A', 12),
+
+};
+static const unsigned int avb_mii_mux[] = {
+       AVB_TX_CTL_MARK, AVB_TXC_MARK, AVB_TD0_MARK,
+       AVB_TD1_MARK, AVB_TD2_MARK, AVB_TD3_MARK,
+       AVB_RX_CTL_MARK, AVB_RXC_MARK, AVB_RD0_MARK,
+       AVB_RD1_MARK, AVB_RD2_MARK, AVB_RD3_MARK,
+       AVB_TXCREFCLK_MARK,
+};
+static const unsigned int avb_avtp_pps_pins[] = {
+       /* AVB_AVTP_PPS */
+       RCAR_GP_PIN(2, 6),
+};
+static const unsigned int avb_avtp_pps_mux[] = {
+       AVB_AVTP_PPS_MARK,
+};
+static const unsigned int avb_avtp_match_a_pins[] = {
+       /* AVB_AVTP_MATCH_A */
+       RCAR_GP_PIN(2, 13),
+};
+static const unsigned int avb_avtp_match_a_mux[] = {
+       AVB_AVTP_MATCH_A_MARK,
+};
+static const unsigned int avb_avtp_capture_a_pins[] = {
+       /* AVB_AVTP_CAPTURE_A */
+       RCAR_GP_PIN(2, 14),
+};
+static const unsigned int avb_avtp_capture_a_mux[] = {
+       AVB_AVTP_CAPTURE_A_MARK,
+};
+static const unsigned int avb_avtp_match_b_pins[] = {
+       /*  AVB_AVTP_MATCH_B */
+       RCAR_GP_PIN(1, 8),
+};
+static const unsigned int avb_avtp_match_b_mux[] = {
+       AVB_AVTP_MATCH_B_MARK,
+};
+static const unsigned int avb_avtp_capture_b_pins[] = {
+       /* AVB_AVTP_CAPTURE_B */
+       RCAR_GP_PIN(1, 11),
+};
+static const unsigned int avb_avtp_capture_b_mux[] = {
+       AVB_AVTP_CAPTURE_B_MARK,
+};
+
+/* - CAN ------------------------------------------------------------------ */
+static const unsigned int can0_data_a_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(1, 23),     RCAR_GP_PIN(1, 24),
+};
+
+static const unsigned int can0_data_a_mux[] = {
+       CAN0_TX_A_MARK,         CAN0_RX_A_MARK,
+};
+
+static const unsigned int can0_data_b_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(2, 0),      RCAR_GP_PIN(2, 1),
+};
+
+static const unsigned int can0_data_b_mux[] = {
+       CAN0_TX_B_MARK,         CAN0_RX_B_MARK,
+};
+
+static const unsigned int can1_data_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(1, 22),     RCAR_GP_PIN(1, 26),
+};
+
+static const unsigned int can1_data_mux[] = {
+       CAN1_TX_MARK,           CAN1_RX_MARK,
+};
+
+/* - CAN Clock -------------------------------------------------------------- */
+static const unsigned int can_clk_pins[] = {
+       /* CLK */
+       RCAR_GP_PIN(1, 25),
+};
+
+static const unsigned int can_clk_mux[] = {
+       CAN_CLK_MARK,
+};
+
+/* - CAN FD --------------------------------------------------------------- */
+static const unsigned int canfd0_data_a_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(1, 23),     RCAR_GP_PIN(1, 24),
+};
+
+static const unsigned int canfd0_data_a_mux[] = {
+       CANFD0_TX_A_MARK,       CANFD0_RX_A_MARK,
+};
+
+static const unsigned int canfd0_data_b_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(2, 0),      RCAR_GP_PIN(2, 1),
+};
+
+static const unsigned int canfd0_data_b_mux[] = {
+       CANFD0_TX_B_MARK,       CANFD0_RX_B_MARK,
+};
+
+static const unsigned int canfd1_data_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(1, 22),     RCAR_GP_PIN(1, 26),
+};
+
+static const unsigned int canfd1_data_mux[] = {
+       CANFD1_TX_MARK,         CANFD1_RX_MARK,
+};
+
+/* - DRIF0 --------------------------------------------------------------- */
+static const unsigned int drif0_ctrl_a_pins[] = {
+       /* CLK, SYNC */
+       RCAR_GP_PIN(6, 8), RCAR_GP_PIN(6, 9),
+};
+
+static const unsigned int drif0_ctrl_a_mux[] = {
+       RIF0_CLK_A_MARK, RIF0_SYNC_A_MARK,
+};
+
+static const unsigned int drif0_data0_a_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(6, 10),
+};
+
+static const unsigned int drif0_data0_a_mux[] = {
+       RIF0_D0_A_MARK,
+};
+
+static const unsigned int drif0_data1_a_pins[] = {
+       /* D1 */
+       RCAR_GP_PIN(6, 7),
+};
+
+static const unsigned int drif0_data1_a_mux[] = {
+       RIF0_D1_A_MARK,
+};
+
+static const unsigned int drif0_ctrl_b_pins[] = {
+       /* CLK, SYNC */
+       RCAR_GP_PIN(5, 0), RCAR_GP_PIN(5, 4),
+};
+
+static const unsigned int drif0_ctrl_b_mux[] = {
+       RIF0_CLK_B_MARK, RIF0_SYNC_B_MARK,
+};
+
+static const unsigned int drif0_data0_b_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(5, 1),
+};
+
+static const unsigned int drif0_data0_b_mux[] = {
+       RIF0_D0_B_MARK,
+};
+
+static const unsigned int drif0_data1_b_pins[] = {
+       /* D1 */
+       RCAR_GP_PIN(5, 2),
+};
+
+static const unsigned int drif0_data1_b_mux[] = {
+       RIF0_D1_B_MARK,
+};
+
+static const unsigned int drif0_ctrl_c_pins[] = {
+       /* CLK, SYNC */
+       RCAR_GP_PIN(5, 12), RCAR_GP_PIN(5, 15),
+};
+
+static const unsigned int drif0_ctrl_c_mux[] = {
+       RIF0_CLK_C_MARK, RIF0_SYNC_C_MARK,
+};
+
+static const unsigned int drif0_data0_c_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(5, 13),
+};
+
+static const unsigned int drif0_data0_c_mux[] = {
+       RIF0_D0_C_MARK,
+};
+
+static const unsigned int drif0_data1_c_pins[] = {
+       /* D1 */
+       RCAR_GP_PIN(5, 14),
+};
+
+static const unsigned int drif0_data1_c_mux[] = {
+       RIF0_D1_C_MARK,
+};
+
+/* - DRIF1 --------------------------------------------------------------- */
+static const unsigned int drif1_ctrl_a_pins[] = {
+       /* CLK, SYNC */
+       RCAR_GP_PIN(6, 17), RCAR_GP_PIN(6, 18),
+};
+
+static const unsigned int drif1_ctrl_a_mux[] = {
+       RIF1_CLK_A_MARK, RIF1_SYNC_A_MARK,
+};
+
+static const unsigned int drif1_data0_a_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(6, 19),
+};
+
+static const unsigned int drif1_data0_a_mux[] = {
+       RIF1_D0_A_MARK,
+};
+
+static const unsigned int drif1_data1_a_pins[] = {
+       /* D1 */
+       RCAR_GP_PIN(6, 20),
+};
+
+static const unsigned int drif1_data1_a_mux[] = {
+       RIF1_D1_A_MARK,
+};
+
+static const unsigned int drif1_ctrl_b_pins[] = {
+       /* CLK, SYNC */
+       RCAR_GP_PIN(5, 9), RCAR_GP_PIN(5, 3),
+};
+
+static const unsigned int drif1_ctrl_b_mux[] = {
+       RIF1_CLK_B_MARK, RIF1_SYNC_B_MARK,
+};
+
+static const unsigned int drif1_data0_b_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(5, 7),
+};
+
+static const unsigned int drif1_data0_b_mux[] = {
+       RIF1_D0_B_MARK,
+};
+
+static const unsigned int drif1_data1_b_pins[] = {
+       /* D1 */
+       RCAR_GP_PIN(5, 8),
+};
+
+static const unsigned int drif1_data1_b_mux[] = {
+       RIF1_D1_B_MARK,
+};
+
+static const unsigned int drif1_ctrl_c_pins[] = {
+       /* CLK, SYNC */
+       RCAR_GP_PIN(5, 5), RCAR_GP_PIN(5, 11),
+};
+
+static const unsigned int drif1_ctrl_c_mux[] = {
+       RIF1_CLK_C_MARK, RIF1_SYNC_C_MARK,
+};
+
+static const unsigned int drif1_data0_c_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(5, 6),
+};
+
+static const unsigned int drif1_data0_c_mux[] = {
+       RIF1_D0_C_MARK,
+};
+
+static const unsigned int drif1_data1_c_pins[] = {
+       /* D1 */
+       RCAR_GP_PIN(5, 10),
+};
+
+static const unsigned int drif1_data1_c_mux[] = {
+       RIF1_D1_C_MARK,
+};
+
+/* - DRIF2 --------------------------------------------------------------- */
+static const unsigned int drif2_ctrl_a_pins[] = {
+       /* CLK, SYNC */
+       RCAR_GP_PIN(6, 8), RCAR_GP_PIN(6, 9),
+};
+
+static const unsigned int drif2_ctrl_a_mux[] = {
+       RIF2_CLK_A_MARK, RIF2_SYNC_A_MARK,
+};
+
+static const unsigned int drif2_data0_a_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(6, 7),
+};
+
+static const unsigned int drif2_data0_a_mux[] = {
+       RIF2_D0_A_MARK,
+};
+
+static const unsigned int drif2_data1_a_pins[] = {
+       /* D1 */
+       RCAR_GP_PIN(6, 10),
+};
+
+static const unsigned int drif2_data1_a_mux[] = {
+       RIF2_D1_A_MARK,
+};
+
+static const unsigned int drif2_ctrl_b_pins[] = {
+       /* CLK, SYNC */
+       RCAR_GP_PIN(6, 26), RCAR_GP_PIN(6, 27),
+};
+
+static const unsigned int drif2_ctrl_b_mux[] = {
+       RIF2_CLK_B_MARK, RIF2_SYNC_B_MARK,
+};
+
+static const unsigned int drif2_data0_b_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(6, 30),
+};
+
+static const unsigned int drif2_data0_b_mux[] = {
+       RIF2_D0_B_MARK,
+};
+
+static const unsigned int drif2_data1_b_pins[] = {
+       /* D1 */
+       RCAR_GP_PIN(6, 31),
+};
+
+static const unsigned int drif2_data1_b_mux[] = {
+       RIF2_D1_B_MARK,
+};
+
+/* - DRIF3 --------------------------------------------------------------- */
+static const unsigned int drif3_ctrl_a_pins[] = {
+       /* CLK, SYNC */
+       RCAR_GP_PIN(6, 17), RCAR_GP_PIN(6, 18),
+};
+
+static const unsigned int drif3_ctrl_a_mux[] = {
+       RIF3_CLK_A_MARK, RIF3_SYNC_A_MARK,
+};
+
+static const unsigned int drif3_data0_a_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(6, 19),
+};
+
+static const unsigned int drif3_data0_a_mux[] = {
+       RIF3_D0_A_MARK,
+};
+
+static const unsigned int drif3_data1_a_pins[] = {
+       /* D1 */
+       RCAR_GP_PIN(6, 20),
+};
+
+static const unsigned int drif3_data1_a_mux[] = {
+       RIF3_D1_A_MARK,
+};
+
+static const unsigned int drif3_ctrl_b_pins[] = {
+       /* CLK, SYNC */
+       RCAR_GP_PIN(6, 24), RCAR_GP_PIN(6, 25),
+};
+
+static const unsigned int drif3_ctrl_b_mux[] = {
+       RIF3_CLK_B_MARK, RIF3_SYNC_B_MARK,
+};
+
+static const unsigned int drif3_data0_b_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(6, 28),
+};
+
+static const unsigned int drif3_data0_b_mux[] = {
+       RIF3_D0_B_MARK,
+};
+
+static const unsigned int drif3_data1_b_pins[] = {
+       /* D1 */
+       RCAR_GP_PIN(6, 29),
+};
+
+static const unsigned int drif3_data1_b_mux[] = {
+       RIF3_D1_B_MARK,
+};
+
+/* - DU --------------------------------------------------------------------- */
+static const unsigned int du_rgb666_pins[] = {
+       /* R[7:2], G[7:2], B[7:2] */
+       RCAR_GP_PIN(0, 15), RCAR_GP_PIN(0, 14), RCAR_GP_PIN(0, 13),
+       RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 11), RCAR_GP_PIN(0, 10),
+       RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 13),
+       RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 19), RCAR_GP_PIN(1, 18),
+       RCAR_GP_PIN(1, 7),  RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 5),
+       RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 3),  RCAR_GP_PIN(1, 2),
+};
+
+static const unsigned int du_rgb666_mux[] = {
+       DU_DR7_MARK, DU_DR6_MARK, DU_DR5_MARK, DU_DR4_MARK,
+       DU_DR3_MARK, DU_DR2_MARK,
+       DU_DG7_MARK, DU_DG6_MARK, DU_DG5_MARK, DU_DG4_MARK,
+       DU_DG3_MARK, DU_DG2_MARK,
+       DU_DB7_MARK, DU_DB6_MARK, DU_DB5_MARK, DU_DB4_MARK,
+       DU_DB3_MARK, DU_DB2_MARK,
+};
+
+static const unsigned int du_rgb888_pins[] = {
+       /* R[7:0], G[7:0], B[7:0] */
+       RCAR_GP_PIN(0, 15), RCAR_GP_PIN(0, 14), RCAR_GP_PIN(0, 13),
+       RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 11), RCAR_GP_PIN(0, 10),
+       RCAR_GP_PIN(0, 9),  RCAR_GP_PIN(0, 8),
+       RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 13),
+       RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 19), RCAR_GP_PIN(1, 18),
+       RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 16),
+       RCAR_GP_PIN(1, 7),  RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 5),
+       RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 3),  RCAR_GP_PIN(1, 2),
+       RCAR_GP_PIN(1, 1),  RCAR_GP_PIN(1, 0),
+};
+
+static const unsigned int du_rgb888_mux[] = {
+       DU_DR7_MARK, DU_DR6_MARK, DU_DR5_MARK, DU_DR4_MARK,
+       DU_DR3_MARK, DU_DR2_MARK, DU_DR1_MARK, DU_DR0_MARK,
+       DU_DG7_MARK, DU_DG6_MARK, DU_DG5_MARK, DU_DG4_MARK,
+       DU_DG3_MARK, DU_DG2_MARK, DU_DG1_MARK, DU_DG0_MARK,
+       DU_DB7_MARK, DU_DB6_MARK, DU_DB5_MARK, DU_DB4_MARK,
+       DU_DB3_MARK, DU_DB2_MARK, DU_DB1_MARK, DU_DB0_MARK,
+};
+
+static const unsigned int du_clk_out_0_pins[] = {
+       /* CLKOUT */
+       RCAR_GP_PIN(1, 27),
+};
+
+static const unsigned int du_clk_out_0_mux[] = {
+       DU_DOTCLKOUT0_MARK
+};
+
+static const unsigned int du_clk_out_1_pins[] = {
+       /* CLKOUT */
+       RCAR_GP_PIN(2, 3),
+};
+
+static const unsigned int du_clk_out_1_mux[] = {
+       DU_DOTCLKOUT1_MARK
+};
+
+static const unsigned int du_sync_pins[] = {
+       /* EXVSYNC/VSYNC, EXHSYNC/HSYNC */
+       RCAR_GP_PIN(2, 5), RCAR_GP_PIN(2, 4),
+};
+
+static const unsigned int du_sync_mux[] = {
+       DU_EXVSYNC_DU_VSYNC_MARK, DU_EXHSYNC_DU_HSYNC_MARK
+};
+
+static const unsigned int du_oddf_pins[] = {
+       /* EXDISP/EXODDF/EXCDE */
+       RCAR_GP_PIN(2, 2),
+};
+
+static const unsigned int du_oddf_mux[] = {
+       DU_EXODDF_DU_ODDF_DISP_CDE_MARK,
+};
+
+static const unsigned int du_cde_pins[] = {
+       /* CDE */
+       RCAR_GP_PIN(2, 0),
+};
+
+static const unsigned int du_cde_mux[] = {
+       DU_CDE_MARK,
+};
+
+static const unsigned int du_disp_pins[] = {
+       /* DISP */
+       RCAR_GP_PIN(2, 1),
+};
+
+static const unsigned int du_disp_mux[] = {
+       DU_DISP_MARK,
+};
+
+/* - HSCIF0 ----------------------------------------------------------------- */
+static const unsigned int hscif0_data_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(5, 13), RCAR_GP_PIN(5, 14),
+};
+
+static const unsigned int hscif0_data_mux[] = {
+       HRX0_MARK, HTX0_MARK,
+};
+
+static const unsigned int hscif0_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(5, 12),
+};
+
+static const unsigned int hscif0_clk_mux[] = {
+       HSCK0_MARK,
+};
+
+static const unsigned int hscif0_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(5, 16), RCAR_GP_PIN(5, 15),
+};
+
+static const unsigned int hscif0_ctrl_mux[] = {
+       HRTS0_N_MARK, HCTS0_N_MARK,
+};
+
+/* - HSCIF1 ----------------------------------------------------------------- */
+static const unsigned int hscif1_data_a_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(5, 5), RCAR_GP_PIN(5, 6),
+};
+
+static const unsigned int hscif1_data_a_mux[] = {
+       HRX1_A_MARK, HTX1_A_MARK,
+};
+
+static const unsigned int hscif1_clk_a_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(6, 21),
+};
+
+static const unsigned int hscif1_clk_a_mux[] = {
+       HSCK1_A_MARK,
+};
+
+static const unsigned int hscif1_ctrl_a_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(5, 8), RCAR_GP_PIN(5, 7),
+};
+
+static const unsigned int hscif1_ctrl_a_mux[] = {
+       HRTS1_N_A_MARK, HCTS1_N_A_MARK,
+};
+
+static const unsigned int hscif1_data_b_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(5, 1), RCAR_GP_PIN(5, 2),
+};
+
+static const unsigned int hscif1_data_b_mux[] = {
+       HRX1_B_MARK, HTX1_B_MARK,
+};
+
+static const unsigned int hscif1_clk_b_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(5, 0),
+};
+
+static const unsigned int hscif1_clk_b_mux[] = {
+       HSCK1_B_MARK,
+};
+
+static const unsigned int hscif1_ctrl_b_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(5, 4), RCAR_GP_PIN(5, 3),
+};
+
+static const unsigned int hscif1_ctrl_b_mux[] = {
+       HRTS1_N_B_MARK, HCTS1_N_B_MARK,
+};
+
+/* - HSCIF2 ----------------------------------------------------------------- */
+static const unsigned int hscif2_data_a_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(6, 8), RCAR_GP_PIN(6, 9),
+};
+
+static const unsigned int hscif2_data_a_mux[] = {
+       HRX2_A_MARK, HTX2_A_MARK,
+};
+
+static const unsigned int hscif2_clk_a_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(6, 10),
+};
+
+static const unsigned int hscif2_clk_a_mux[] = {
+       HSCK2_A_MARK,
+};
+
+static const unsigned int hscif2_ctrl_a_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(6, 7), RCAR_GP_PIN(6, 6),
+};
+
+static const unsigned int hscif2_ctrl_a_mux[] = {
+       HRTS2_N_A_MARK, HCTS2_N_A_MARK,
+};
+
+static const unsigned int hscif2_data_b_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(6, 17), RCAR_GP_PIN(6, 18),
+};
+
+static const unsigned int hscif2_data_b_mux[] = {
+       HRX2_B_MARK, HTX2_B_MARK,
+};
+
+static const unsigned int hscif2_clk_b_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(6, 21),
+};
+
+static const unsigned int hscif2_clk_b_mux[] = {
+       HSCK2_B_MARK,
+};
+
+static const unsigned int hscif2_ctrl_b_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(6, 20), RCAR_GP_PIN(6, 19),
+};
+
+static const unsigned int hscif2_ctrl_b_mux[] = {
+       HRTS2_N_B_MARK, HCTS2_N_B_MARK,
+};
+
+static const unsigned int hscif2_data_c_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(6, 25), RCAR_GP_PIN(6, 26),
+};
+
+static const unsigned int hscif2_data_c_mux[] = {
+       HRX2_C_MARK, HTX2_C_MARK,
+};
+
+static const unsigned int hscif2_clk_c_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(6, 24),
+};
+
+static const unsigned int hscif2_clk_c_mux[] = {
+       HSCK2_C_MARK,
+};
+
+static const unsigned int hscif2_ctrl_c_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(6, 28), RCAR_GP_PIN(6, 27),
+};
+
+static const unsigned int hscif2_ctrl_c_mux[] = {
+       HRTS2_N_C_MARK, HCTS2_N_C_MARK,
+};
+
+/* - HSCIF3 ----------------------------------------------------------------- */
+static const unsigned int hscif3_data_a_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(1, 23), RCAR_GP_PIN(1, 24),
+};
+
+static const unsigned int hscif3_data_a_mux[] = {
+       HRX3_A_MARK, HTX3_A_MARK,
+};
+
+static const unsigned int hscif3_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(1, 22),
+};
+
+static const unsigned int hscif3_clk_mux[] = {
+       HSCK3_MARK,
+};
+
+static const unsigned int hscif3_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(1, 26), RCAR_GP_PIN(1, 25),
+};
+
+static const unsigned int hscif3_ctrl_mux[] = {
+       HRTS3_N_MARK, HCTS3_N_MARK,
+};
+
+static const unsigned int hscif3_data_b_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(0, 10), RCAR_GP_PIN(0, 11),
+};
+
+static const unsigned int hscif3_data_b_mux[] = {
+       HRX3_B_MARK, HTX3_B_MARK,
+};
+
+static const unsigned int hscif3_data_c_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(0, 14), RCAR_GP_PIN(0, 15),
+};
+
+static const unsigned int hscif3_data_c_mux[] = {
+       HRX3_C_MARK, HTX3_C_MARK,
+};
+
+static const unsigned int hscif3_data_d_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(2, 7), RCAR_GP_PIN(2, 8),
+};
+
+static const unsigned int hscif3_data_d_mux[] = {
+       HRX3_D_MARK, HTX3_D_MARK,
+};
+
+/* - HSCIF4 ----------------------------------------------------------------- */
+static const unsigned int hscif4_data_a_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 13),
+};
+
+static const unsigned int hscif4_data_a_mux[] = {
+       HRX4_A_MARK, HTX4_A_MARK,
+};
+
+static const unsigned int hscif4_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(1, 11),
+};
+
+static const unsigned int hscif4_clk_mux[] = {
+       HSCK4_MARK,
+};
+
+static const unsigned int hscif4_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 14),
+};
+
+static const unsigned int hscif4_ctrl_mux[] = {
+       HRTS4_N_MARK, HCTS4_N_MARK,
+};
+
+static const unsigned int hscif4_data_b_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(1, 8), RCAR_GP_PIN(1, 11),
+};
+
+static const unsigned int hscif4_data_b_mux[] = {
+       HRX4_B_MARK, HTX4_B_MARK,
+};
+
+/* - I2C -------------------------------------------------------------------- */
+static const unsigned int i2c1_a_pins[] = {
+       /* SDA, SCL */
+       RCAR_GP_PIN(5, 11), RCAR_GP_PIN(5, 10),
+};
+static const unsigned int i2c1_a_mux[] = {
+       SDA1_A_MARK, SCL1_A_MARK,
+};
+static const unsigned int i2c1_b_pins[] = {
+       /* SDA, SCL */
+       RCAR_GP_PIN(5, 24), RCAR_GP_PIN(5, 23),
+};
+static const unsigned int i2c1_b_mux[] = {
+       SDA1_B_MARK, SCL1_B_MARK,
+};
+static const unsigned int i2c2_a_pins[] = {
+       /* SDA, SCL */
+       RCAR_GP_PIN(5, 0), RCAR_GP_PIN(5, 4),
+};
+static const unsigned int i2c2_a_mux[] = {
+       SDA2_A_MARK, SCL2_A_MARK,
+};
+static const unsigned int i2c2_b_pins[] = {
+       /* SDA, SCL */
+       RCAR_GP_PIN(3, 13), RCAR_GP_PIN(3, 12),
+};
+static const unsigned int i2c2_b_mux[] = {
+       SDA2_B_MARK, SCL2_B_MARK,
+};
+static const unsigned int i2c6_a_pins[] = {
+       /* SDA, SCL */
+       RCAR_GP_PIN(1, 8), RCAR_GP_PIN(1, 11),
+};
+static const unsigned int i2c6_a_mux[] = {
+       SDA6_A_MARK, SCL6_A_MARK,
+};
+static const unsigned int i2c6_b_pins[] = {
+       /* SDA, SCL */
+       RCAR_GP_PIN(1, 26), RCAR_GP_PIN(1, 25),
+};
+static const unsigned int i2c6_b_mux[] = {
+       SDA6_B_MARK, SCL6_B_MARK,
+};
+static const unsigned int i2c6_c_pins[] = {
+       /* SDA, SCL */
+       RCAR_GP_PIN(0, 15), RCAR_GP_PIN(0, 14),
+};
+static const unsigned int i2c6_c_mux[] = {
+       SDA6_C_MARK, SCL6_C_MARK,
+};
+
+/* - INTC-EX ---------------------------------------------------------------- */
+static const unsigned int intc_ex_irq0_pins[] = {
+       /* IRQ0 */
+       RCAR_GP_PIN(2, 0),
+};
+static const unsigned int intc_ex_irq0_mux[] = {
+       IRQ0_MARK,
+};
+static const unsigned int intc_ex_irq1_pins[] = {
+       /* IRQ1 */
+       RCAR_GP_PIN(2, 1),
+};
+static const unsigned int intc_ex_irq1_mux[] = {
+       IRQ1_MARK,
+};
+static const unsigned int intc_ex_irq2_pins[] = {
+       /* IRQ2 */
+       RCAR_GP_PIN(2, 2),
+};
+static const unsigned int intc_ex_irq2_mux[] = {
+       IRQ2_MARK,
+};
+static const unsigned int intc_ex_irq3_pins[] = {
+       /* IRQ3 */
+       RCAR_GP_PIN(2, 3),
+};
+static const unsigned int intc_ex_irq3_mux[] = {
+       IRQ3_MARK,
+};
+static const unsigned int intc_ex_irq4_pins[] = {
+       /* IRQ4 */
+       RCAR_GP_PIN(2, 4),
+};
+static const unsigned int intc_ex_irq4_mux[] = {
+       IRQ4_MARK,
+};
+static const unsigned int intc_ex_irq5_pins[] = {
+       /* IRQ5 */
+       RCAR_GP_PIN(2, 5),
+};
+static const unsigned int intc_ex_irq5_mux[] = {
+       IRQ5_MARK,
+};
+
+/* - MSIOF0 ----------------------------------------------------------------- */
+static const unsigned int msiof0_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(5, 17),
+};
+static const unsigned int msiof0_clk_mux[] = {
+       MSIOF0_SCK_MARK,
+};
+static const unsigned int msiof0_sync_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(5, 18),
+};
+static const unsigned int msiof0_sync_mux[] = {
+       MSIOF0_SYNC_MARK,
+};
+static const unsigned int msiof0_ss1_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(5, 19),
+};
+static const unsigned int msiof0_ss1_mux[] = {
+       MSIOF0_SS1_MARK,
+};
+static const unsigned int msiof0_ss2_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(5, 21),
+};
+static const unsigned int msiof0_ss2_mux[] = {
+       MSIOF0_SS2_MARK,
+};
+static const unsigned int msiof0_txd_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(5, 20),
+};
+static const unsigned int msiof0_txd_mux[] = {
+       MSIOF0_TXD_MARK,
+};
+static const unsigned int msiof0_rxd_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(5, 22),
+};
+static const unsigned int msiof0_rxd_mux[] = {
+       MSIOF0_RXD_MARK,
+};
+/* - MSIOF1 ----------------------------------------------------------------- */
+static const unsigned int msiof1_clk_a_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(6, 8),
+};
+static const unsigned int msiof1_clk_a_mux[] = {
+       MSIOF1_SCK_A_MARK,
+};
+static const unsigned int msiof1_sync_a_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(6, 9),
+};
+static const unsigned int msiof1_sync_a_mux[] = {
+       MSIOF1_SYNC_A_MARK,
+};
+static const unsigned int msiof1_ss1_a_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(6, 5),
+};
+static const unsigned int msiof1_ss1_a_mux[] = {
+       MSIOF1_SS1_A_MARK,
+};
+static const unsigned int msiof1_ss2_a_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(6, 6),
+};
+static const unsigned int msiof1_ss2_a_mux[] = {
+       MSIOF1_SS2_A_MARK,
+};
+static const unsigned int msiof1_txd_a_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(6, 7),
+};
+static const unsigned int msiof1_txd_a_mux[] = {
+       MSIOF1_TXD_A_MARK,
+};
+static const unsigned int msiof1_rxd_a_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(6, 10),
+};
+static const unsigned int msiof1_rxd_a_mux[] = {
+       MSIOF1_RXD_A_MARK,
+};
+static const unsigned int msiof1_clk_b_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(5, 9),
+};
+static const unsigned int msiof1_clk_b_mux[] = {
+       MSIOF1_SCK_B_MARK,
+};
+static const unsigned int msiof1_sync_b_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(5, 3),
+};
+static const unsigned int msiof1_sync_b_mux[] = {
+       MSIOF1_SYNC_B_MARK,
+};
+static const unsigned int msiof1_ss1_b_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(5, 4),
+};
+static const unsigned int msiof1_ss1_b_mux[] = {
+       MSIOF1_SS1_B_MARK,
+};
+static const unsigned int msiof1_ss2_b_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(5, 0),
+};
+static const unsigned int msiof1_ss2_b_mux[] = {
+       MSIOF1_SS2_B_MARK,
+};
+static const unsigned int msiof1_txd_b_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(5, 8),
+};
+static const unsigned int msiof1_txd_b_mux[] = {
+       MSIOF1_TXD_B_MARK,
+};
+static const unsigned int msiof1_rxd_b_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(5, 7),
+};
+static const unsigned int msiof1_rxd_b_mux[] = {
+       MSIOF1_RXD_B_MARK,
+};
+static const unsigned int msiof1_clk_c_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(6, 17),
+};
+static const unsigned int msiof1_clk_c_mux[] = {
+       MSIOF1_SCK_C_MARK,
+};
+static const unsigned int msiof1_sync_c_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(6, 18),
+};
+static const unsigned int msiof1_sync_c_mux[] = {
+       MSIOF1_SYNC_C_MARK,
+};
+static const unsigned int msiof1_ss1_c_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(6, 21),
+};
+static const unsigned int msiof1_ss1_c_mux[] = {
+       MSIOF1_SS1_C_MARK,
+};
+static const unsigned int msiof1_ss2_c_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(6, 27),
+};
+static const unsigned int msiof1_ss2_c_mux[] = {
+       MSIOF1_SS2_C_MARK,
+};
+static const unsigned int msiof1_txd_c_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(6, 20),
+};
+static const unsigned int msiof1_txd_c_mux[] = {
+       MSIOF1_TXD_C_MARK,
+};
+static const unsigned int msiof1_rxd_c_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(6, 19),
+};
+static const unsigned int msiof1_rxd_c_mux[] = {
+       MSIOF1_RXD_C_MARK,
+};
+static const unsigned int msiof1_clk_d_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(5, 12),
+};
+static const unsigned int msiof1_clk_d_mux[] = {
+       MSIOF1_SCK_D_MARK,
+};
+static const unsigned int msiof1_sync_d_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(5, 15),
+};
+static const unsigned int msiof1_sync_d_mux[] = {
+       MSIOF1_SYNC_D_MARK,
+};
+static const unsigned int msiof1_ss1_d_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(5, 16),
+};
+static const unsigned int msiof1_ss1_d_mux[] = {
+       MSIOF1_SS1_D_MARK,
+};
+static const unsigned int msiof1_ss2_d_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(5, 21),
+};
+static const unsigned int msiof1_ss2_d_mux[] = {
+       MSIOF1_SS2_D_MARK,
+};
+static const unsigned int msiof1_txd_d_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(5, 14),
+};
+static const unsigned int msiof1_txd_d_mux[] = {
+       MSIOF1_TXD_D_MARK,
+};
+static const unsigned int msiof1_rxd_d_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(5, 13),
+};
+static const unsigned int msiof1_rxd_d_mux[] = {
+       MSIOF1_RXD_D_MARK,
+};
+static const unsigned int msiof1_clk_e_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(3, 0),
+};
+static const unsigned int msiof1_clk_e_mux[] = {
+       MSIOF1_SCK_E_MARK,
+};
+static const unsigned int msiof1_sync_e_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(3, 1),
+};
+static const unsigned int msiof1_sync_e_mux[] = {
+       MSIOF1_SYNC_E_MARK,
+};
+static const unsigned int msiof1_ss1_e_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(3, 4),
+};
+static const unsigned int msiof1_ss1_e_mux[] = {
+       MSIOF1_SS1_E_MARK,
+};
+static const unsigned int msiof1_ss2_e_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(3, 5),
+};
+static const unsigned int msiof1_ss2_e_mux[] = {
+       MSIOF1_SS2_E_MARK,
+};
+static const unsigned int msiof1_txd_e_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(3, 3),
+};
+static const unsigned int msiof1_txd_e_mux[] = {
+       MSIOF1_TXD_E_MARK,
+};
+static const unsigned int msiof1_rxd_e_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(3, 2),
+};
+static const unsigned int msiof1_rxd_e_mux[] = {
+       MSIOF1_RXD_E_MARK,
+};
+static const unsigned int msiof1_clk_f_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(5, 23),
+};
+static const unsigned int msiof1_clk_f_mux[] = {
+       MSIOF1_SCK_F_MARK,
+};
+static const unsigned int msiof1_sync_f_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(5, 24),
+};
+static const unsigned int msiof1_sync_f_mux[] = {
+       MSIOF1_SYNC_F_MARK,
+};
+static const unsigned int msiof1_ss1_f_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(6, 1),
+};
+static const unsigned int msiof1_ss1_f_mux[] = {
+       MSIOF1_SS1_F_MARK,
+};
+static const unsigned int msiof1_ss2_f_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(6, 2),
+};
+static const unsigned int msiof1_ss2_f_mux[] = {
+       MSIOF1_SS2_F_MARK,
+};
+static const unsigned int msiof1_txd_f_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(6, 0),
+};
+static const unsigned int msiof1_txd_f_mux[] = {
+       MSIOF1_TXD_F_MARK,
+};
+static const unsigned int msiof1_rxd_f_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(5, 25),
+};
+static const unsigned int msiof1_rxd_f_mux[] = {
+       MSIOF1_RXD_F_MARK,
+};
+static const unsigned int msiof1_clk_g_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(3, 6),
+};
+static const unsigned int msiof1_clk_g_mux[] = {
+       MSIOF1_SCK_G_MARK,
+};
+static const unsigned int msiof1_sync_g_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(3, 7),
+};
+static const unsigned int msiof1_sync_g_mux[] = {
+       MSIOF1_SYNC_G_MARK,
+};
+static const unsigned int msiof1_ss1_g_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(3, 10),
+};
+static const unsigned int msiof1_ss1_g_mux[] = {
+       MSIOF1_SS1_G_MARK,
+};
+static const unsigned int msiof1_ss2_g_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(3, 11),
+};
+static const unsigned int msiof1_ss2_g_mux[] = {
+       MSIOF1_SS2_G_MARK,
+};
+static const unsigned int msiof1_txd_g_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(3, 9),
+};
+static const unsigned int msiof1_txd_g_mux[] = {
+       MSIOF1_TXD_G_MARK,
+};
+static const unsigned int msiof1_rxd_g_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(3, 8),
+};
+static const unsigned int msiof1_rxd_g_mux[] = {
+       MSIOF1_RXD_G_MARK,
+};
+/* - MSIOF2 ----------------------------------------------------------------- */
+static const unsigned int msiof2_clk_a_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(1, 9),
+};
+static const unsigned int msiof2_clk_a_mux[] = {
+       MSIOF2_SCK_A_MARK,
+};
+static const unsigned int msiof2_sync_a_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(1, 8),
+};
+static const unsigned int msiof2_sync_a_mux[] = {
+       MSIOF2_SYNC_A_MARK,
+};
+static const unsigned int msiof2_ss1_a_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(1, 6),
+};
+static const unsigned int msiof2_ss1_a_mux[] = {
+       MSIOF2_SS1_A_MARK,
+};
+static const unsigned int msiof2_ss2_a_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(1, 7),
+};
+static const unsigned int msiof2_ss2_a_mux[] = {
+       MSIOF2_SS2_A_MARK,
+};
+static const unsigned int msiof2_txd_a_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(1, 11),
+};
+static const unsigned int msiof2_txd_a_mux[] = {
+       MSIOF2_TXD_A_MARK,
+};
+static const unsigned int msiof2_rxd_a_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(1, 10),
+};
+static const unsigned int msiof2_rxd_a_mux[] = {
+       MSIOF2_RXD_A_MARK,
+};
+static const unsigned int msiof2_clk_b_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(0, 4),
+};
+static const unsigned int msiof2_clk_b_mux[] = {
+       MSIOF2_SCK_B_MARK,
+};
+static const unsigned int msiof2_sync_b_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(0, 5),
+};
+static const unsigned int msiof2_sync_b_mux[] = {
+       MSIOF2_SYNC_B_MARK,
+};
+static const unsigned int msiof2_ss1_b_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(0, 0),
+};
+static const unsigned int msiof2_ss1_b_mux[] = {
+       MSIOF2_SS1_B_MARK,
+};
+static const unsigned int msiof2_ss2_b_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(0, 1),
+};
+static const unsigned int msiof2_ss2_b_mux[] = {
+       MSIOF2_SS2_B_MARK,
+};
+static const unsigned int msiof2_txd_b_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(0, 7),
+};
+static const unsigned int msiof2_txd_b_mux[] = {
+       MSIOF2_TXD_B_MARK,
+};
+static const unsigned int msiof2_rxd_b_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(0, 6),
+};
+static const unsigned int msiof2_rxd_b_mux[] = {
+       MSIOF2_RXD_B_MARK,
+};
+static const unsigned int msiof2_clk_c_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(2, 12),
+};
+static const unsigned int msiof2_clk_c_mux[] = {
+       MSIOF2_SCK_C_MARK,
+};
+static const unsigned int msiof2_sync_c_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(2, 11),
+};
+static const unsigned int msiof2_sync_c_mux[] = {
+       MSIOF2_SYNC_C_MARK,
+};
+static const unsigned int msiof2_ss1_c_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(2, 10),
+};
+static const unsigned int msiof2_ss1_c_mux[] = {
+       MSIOF2_SS1_C_MARK,
+};
+static const unsigned int msiof2_ss2_c_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(2, 9),
+};
+static const unsigned int msiof2_ss2_c_mux[] = {
+       MSIOF2_SS2_C_MARK,
+};
+static const unsigned int msiof2_txd_c_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(2, 14),
+};
+static const unsigned int msiof2_txd_c_mux[] = {
+       MSIOF2_TXD_C_MARK,
+};
+static const unsigned int msiof2_rxd_c_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(2, 13),
+};
+static const unsigned int msiof2_rxd_c_mux[] = {
+       MSIOF2_RXD_C_MARK,
+};
+static const unsigned int msiof2_clk_d_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(0, 8),
+};
+static const unsigned int msiof2_clk_d_mux[] = {
+       MSIOF2_SCK_D_MARK,
+};
+static const unsigned int msiof2_sync_d_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(0, 9),
+};
+static const unsigned int msiof2_sync_d_mux[] = {
+       MSIOF2_SYNC_D_MARK,
+};
+static const unsigned int msiof2_ss1_d_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(0, 12),
+};
+static const unsigned int msiof2_ss1_d_mux[] = {
+       MSIOF2_SS1_D_MARK,
+};
+static const unsigned int msiof2_ss2_d_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(0, 13),
+};
+static const unsigned int msiof2_ss2_d_mux[] = {
+       MSIOF2_SS2_D_MARK,
+};
+static const unsigned int msiof2_txd_d_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(0, 11),
+};
+static const unsigned int msiof2_txd_d_mux[] = {
+       MSIOF2_TXD_D_MARK,
+};
+static const unsigned int msiof2_rxd_d_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(0, 10),
+};
+static const unsigned int msiof2_rxd_d_mux[] = {
+       MSIOF2_RXD_D_MARK,
+};
+/* - MSIOF3 ----------------------------------------------------------------- */
+static const unsigned int msiof3_clk_a_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(0, 0),
+};
+static const unsigned int msiof3_clk_a_mux[] = {
+       MSIOF3_SCK_A_MARK,
+};
+static const unsigned int msiof3_sync_a_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(0, 1),
+};
+static const unsigned int msiof3_sync_a_mux[] = {
+       MSIOF3_SYNC_A_MARK,
+};
+static const unsigned int msiof3_ss1_a_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(0, 14),
+};
+static const unsigned int msiof3_ss1_a_mux[] = {
+       MSIOF3_SS1_A_MARK,
+};
+static const unsigned int msiof3_ss2_a_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(0, 15),
+};
+static const unsigned int msiof3_ss2_a_mux[] = {
+       MSIOF3_SS2_A_MARK,
+};
+static const unsigned int msiof3_txd_a_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(0, 3),
+};
+static const unsigned int msiof3_txd_a_mux[] = {
+       MSIOF3_TXD_A_MARK,
+};
+static const unsigned int msiof3_rxd_a_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(0, 2),
+};
+static const unsigned int msiof3_rxd_a_mux[] = {
+       MSIOF3_RXD_A_MARK,
+};
+static const unsigned int msiof3_clk_b_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(1, 2),
+};
+static const unsigned int msiof3_clk_b_mux[] = {
+       MSIOF3_SCK_B_MARK,
+};
+static const unsigned int msiof3_sync_b_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(1, 0),
+};
+static const unsigned int msiof3_sync_b_mux[] = {
+       MSIOF3_SYNC_B_MARK,
+};
+static const unsigned int msiof3_ss1_b_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(1, 4),
+};
+static const unsigned int msiof3_ss1_b_mux[] = {
+       MSIOF3_SS1_B_MARK,
+};
+static const unsigned int msiof3_ss2_b_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(1, 5),
+};
+static const unsigned int msiof3_ss2_b_mux[] = {
+       MSIOF3_SS2_B_MARK,
+};
+static const unsigned int msiof3_txd_b_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(1, 1),
+};
+static const unsigned int msiof3_txd_b_mux[] = {
+       MSIOF3_TXD_B_MARK,
+};
+static const unsigned int msiof3_rxd_b_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(1, 3),
+};
+static const unsigned int msiof3_rxd_b_mux[] = {
+       MSIOF3_RXD_B_MARK,
+};
+static const unsigned int msiof3_clk_c_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(1, 12),
+};
+static const unsigned int msiof3_clk_c_mux[] = {
+       MSIOF3_SCK_C_MARK,
+};
+static const unsigned int msiof3_sync_c_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(1, 13),
+};
+static const unsigned int msiof3_sync_c_mux[] = {
+       MSIOF3_SYNC_C_MARK,
+};
+static const unsigned int msiof3_txd_c_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(1, 15),
+};
+static const unsigned int msiof3_txd_c_mux[] = {
+       MSIOF3_TXD_C_MARK,
+};
+static const unsigned int msiof3_rxd_c_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(1, 14),
+};
+static const unsigned int msiof3_rxd_c_mux[] = {
+       MSIOF3_RXD_C_MARK,
+};
+static const unsigned int msiof3_clk_d_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(1, 22),
+};
+static const unsigned int msiof3_clk_d_mux[] = {
+       MSIOF3_SCK_D_MARK,
+};
+static const unsigned int msiof3_sync_d_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(1, 23),
+};
+static const unsigned int msiof3_sync_d_mux[] = {
+       MSIOF3_SYNC_D_MARK,
+};
+static const unsigned int msiof3_ss1_d_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(1, 26),
+};
+static const unsigned int msiof3_ss1_d_mux[] = {
+       MSIOF3_SS1_D_MARK,
+};
+static const unsigned int msiof3_txd_d_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(1, 25),
+};
+static const unsigned int msiof3_txd_d_mux[] = {
+       MSIOF3_TXD_D_MARK,
+};
+static const unsigned int msiof3_rxd_d_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(1, 24),
+};
+static const unsigned int msiof3_rxd_d_mux[] = {
+       MSIOF3_RXD_D_MARK,
+};
+static const unsigned int msiof3_clk_e_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(2, 3),
+};
+static const unsigned int msiof3_clk_e_mux[] = {
+       MSIOF3_SCK_E_MARK,
+};
+static const unsigned int msiof3_sync_e_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(2, 2),
+};
+static const unsigned int msiof3_sync_e_mux[] = {
+       MSIOF3_SYNC_E_MARK,
+};
+static const unsigned int msiof3_ss1_e_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(2, 1),
+};
+static const unsigned int msiof3_ss1_e_mux[] = {
+       MSIOF3_SS1_E_MARK,
+};
+static const unsigned int msiof3_ss2_e_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(2, 0),
+};
+static const unsigned int msiof3_ss2_e_mux[] = {
+       MSIOF3_SS2_E_MARK,
+};
+static const unsigned int msiof3_txd_e_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(2, 5),
+};
+static const unsigned int msiof3_txd_e_mux[] = {
+       MSIOF3_TXD_E_MARK,
+};
+static const unsigned int msiof3_rxd_e_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(2, 4),
+};
+static const unsigned int msiof3_rxd_e_mux[] = {
+       MSIOF3_RXD_E_MARK,
+};
+
+/* - PWM0 --------------------------------------------------------------------*/
+static const unsigned int pwm0_pins[] = {
+       /* PWM */
+       RCAR_GP_PIN(2, 6),
+};
+static const unsigned int pwm0_mux[] = {
+       PWM0_MARK,
+};
+/* - PWM1 --------------------------------------------------------------------*/
+static const unsigned int pwm1_a_pins[] = {
+       /* PWM */
+       RCAR_GP_PIN(2, 7),
+};
+static const unsigned int pwm1_a_mux[] = {
+       PWM1_A_MARK,
+};
+static const unsigned int pwm1_b_pins[] = {
+       /* PWM */
+       RCAR_GP_PIN(1, 8),
+};
+static const unsigned int pwm1_b_mux[] = {
+       PWM1_B_MARK,
+};
+/* - PWM2 --------------------------------------------------------------------*/
+static const unsigned int pwm2_a_pins[] = {
+       /* PWM */
+       RCAR_GP_PIN(2, 8),
+};
+static const unsigned int pwm2_a_mux[] = {
+       PWM2_A_MARK,
+};
+static const unsigned int pwm2_b_pins[] = {
+       /* PWM */
+       RCAR_GP_PIN(1, 11),
+};
+static const unsigned int pwm2_b_mux[] = {
+       PWM2_B_MARK,
+};
+/* - PWM3 --------------------------------------------------------------------*/
+static const unsigned int pwm3_a_pins[] = {
+       /* PWM */
+       RCAR_GP_PIN(1, 0),
+};
+static const unsigned int pwm3_a_mux[] = {
+       PWM3_A_MARK,
+};
+static const unsigned int pwm3_b_pins[] = {
+       /* PWM */
+       RCAR_GP_PIN(2, 2),
+};
+static const unsigned int pwm3_b_mux[] = {
+       PWM3_B_MARK,
+};
+/* - PWM4 --------------------------------------------------------------------*/
+static const unsigned int pwm4_a_pins[] = {
+       /* PWM */
+       RCAR_GP_PIN(1, 1),
+};
+static const unsigned int pwm4_a_mux[] = {
+       PWM4_A_MARK,
+};
+static const unsigned int pwm4_b_pins[] = {
+       /* PWM */
+       RCAR_GP_PIN(2, 3),
+};
+static const unsigned int pwm4_b_mux[] = {
+       PWM4_B_MARK,
+};
+/* - PWM5 --------------------------------------------------------------------*/
+static const unsigned int pwm5_a_pins[] = {
+       /* PWM */
+       RCAR_GP_PIN(1, 2),
+};
+static const unsigned int pwm5_a_mux[] = {
+       PWM5_A_MARK,
+};
+static const unsigned int pwm5_b_pins[] = {
+       /* PWM */
+       RCAR_GP_PIN(2, 4),
+};
+static const unsigned int pwm5_b_mux[] = {
+       PWM5_B_MARK,
+};
+/* - PWM6 --------------------------------------------------------------------*/
+static const unsigned int pwm6_a_pins[] = {
+       /* PWM */
+       RCAR_GP_PIN(1, 3),
+};
+static const unsigned int pwm6_a_mux[] = {
+       PWM6_A_MARK,
+};
+static const unsigned int pwm6_b_pins[] = {
+       /* PWM */
+       RCAR_GP_PIN(2, 5),
+};
+static const unsigned int pwm6_b_mux[] = {
+       PWM6_B_MARK,
+};
+
+/* - SATA --------------------------------------------------------------------*/
+static const unsigned int sata0_devslp_a_pins[] = {
+       /* DEVSLP */
+       RCAR_GP_PIN(6, 16),
+};
+
+static const unsigned int sata0_devslp_a_mux[] = {
+       SATA_DEVSLP_A_MARK,
+};
+
+static const unsigned int sata0_devslp_b_pins[] = {
+       /* DEVSLP */
+       RCAR_GP_PIN(4, 6),
+};
+
+static const unsigned int sata0_devslp_b_mux[] = {
+       SATA_DEVSLP_B_MARK,
+};
+
+/* - SCIF0 ------------------------------------------------------------------ */
+static const unsigned int scif0_data_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(5, 1), RCAR_GP_PIN(5, 2),
+};
+static const unsigned int scif0_data_mux[] = {
+       RX0_MARK, TX0_MARK,
+};
+static const unsigned int scif0_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(5, 0),
+};
+static const unsigned int scif0_clk_mux[] = {
+       SCK0_MARK,
+};
+static const unsigned int scif0_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(5, 4), RCAR_GP_PIN(5, 3),
+};
+static const unsigned int scif0_ctrl_mux[] = {
+       RTS0_N_MARK, CTS0_N_MARK,
+};
+/* - SCIF1 ------------------------------------------------------------------ */
+static const unsigned int scif1_data_a_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(5, 5), RCAR_GP_PIN(5, 6),
+};
+static const unsigned int scif1_data_a_mux[] = {
+       RX1_A_MARK, TX1_A_MARK,
+};
+static const unsigned int scif1_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(6, 21),
+};
+static const unsigned int scif1_clk_mux[] = {
+       SCK1_MARK,
+};
+static const unsigned int scif1_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(5, 8), RCAR_GP_PIN(5, 7),
+};
+static const unsigned int scif1_ctrl_mux[] = {
+       RTS1_N_MARK, CTS1_N_MARK,
+};
+static const unsigned int scif1_data_b_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(5, 24), RCAR_GP_PIN(5, 25),
+};
+static const unsigned int scif1_data_b_mux[] = {
+       RX1_B_MARK, TX1_B_MARK,
+};
+/* - SCIF2 ------------------------------------------------------------------ */
+static const unsigned int scif2_data_a_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(5, 11), RCAR_GP_PIN(5, 10),
+};
+static const unsigned int scif2_data_a_mux[] = {
+       RX2_A_MARK, TX2_A_MARK,
+};
+static const unsigned int scif2_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(5, 9),
+};
+static const unsigned int scif2_clk_mux[] = {
+       SCK2_MARK,
+};
+static const unsigned int scif2_data_b_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(5, 15), RCAR_GP_PIN(5, 16),
+};
+static const unsigned int scif2_data_b_mux[] = {
+       RX2_B_MARK, TX2_B_MARK,
+};
+/* - SCIF3 ------------------------------------------------------------------ */
+static const unsigned int scif3_data_a_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(1, 23), RCAR_GP_PIN(1, 24),
+};
+static const unsigned int scif3_data_a_mux[] = {
+       RX3_A_MARK, TX3_A_MARK,
+};
+static const unsigned int scif3_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(1, 22),
+};
+static const unsigned int scif3_clk_mux[] = {
+       SCK3_MARK,
+};
+static const unsigned int scif3_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(1, 26), RCAR_GP_PIN(1, 25),
+};
+static const unsigned int scif3_ctrl_mux[] = {
+       RTS3_N_MARK, CTS3_N_MARK,
+};
+static const unsigned int scif3_data_b_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(1, 8), RCAR_GP_PIN(1, 11),
+};
+static const unsigned int scif3_data_b_mux[] = {
+       RX3_B_MARK, TX3_B_MARK,
+};
+/* - SCIF4 ------------------------------------------------------------------ */
+static const unsigned int scif4_data_a_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(2, 11), RCAR_GP_PIN(2, 12),
+};
+static const unsigned int scif4_data_a_mux[] = {
+       RX4_A_MARK, TX4_A_MARK,
+};
+static const unsigned int scif4_clk_a_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(2, 10),
+};
+static const unsigned int scif4_clk_a_mux[] = {
+       SCK4_A_MARK,
+};
+static const unsigned int scif4_ctrl_a_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(2, 14), RCAR_GP_PIN(2, 13),
+};
+static const unsigned int scif4_ctrl_a_mux[] = {
+       RTS4_N_A_MARK, CTS4_N_A_MARK,
+};
+static const unsigned int scif4_data_b_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(1, 6), RCAR_GP_PIN(1, 7),
+};
+static const unsigned int scif4_data_b_mux[] = {
+       RX4_B_MARK, TX4_B_MARK,
+};
+static const unsigned int scif4_clk_b_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(1, 5),
+};
+static const unsigned int scif4_clk_b_mux[] = {
+       SCK4_B_MARK,
+};
+static const unsigned int scif4_ctrl_b_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(1, 10), RCAR_GP_PIN(1, 9),
+};
+static const unsigned int scif4_ctrl_b_mux[] = {
+       RTS4_N_B_MARK, CTS4_N_B_MARK,
+};
+static const unsigned int scif4_data_c_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 13),
+};
+static const unsigned int scif4_data_c_mux[] = {
+       RX4_C_MARK, TX4_C_MARK,
+};
+static const unsigned int scif4_clk_c_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(0, 8),
+};
+static const unsigned int scif4_clk_c_mux[] = {
+       SCK4_C_MARK,
+};
+static const unsigned int scif4_ctrl_c_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(0, 11), RCAR_GP_PIN(0, 10),
+};
+static const unsigned int scif4_ctrl_c_mux[] = {
+       RTS4_N_C_MARK, CTS4_N_C_MARK,
+};
+/* - SCIF5 ------------------------------------------------------------------ */
+static const unsigned int scif5_data_a_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(5, 19), RCAR_GP_PIN(5, 21),
+};
+static const unsigned int scif5_data_a_mux[] = {
+       RX5_A_MARK, TX5_A_MARK,
+};
+static const unsigned int scif5_clk_a_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(6, 21),
+};
+static const unsigned int scif5_clk_a_mux[] = {
+       SCK5_A_MARK,
+};
+static const unsigned int scif5_data_b_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(5, 12), RCAR_GP_PIN(5, 18),
+};
+static const unsigned int scif5_data_b_mux[] = {
+       RX5_B_MARK, TX5_B_MARK,
+};
+static const unsigned int scif5_clk_b_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(5, 0),
+};
+static const unsigned int scif5_clk_b_mux[] = {
+       SCK5_B_MARK,
+};
+/* - SCIF Clock ------------------------------------------------------------- */
+static const unsigned int scif_clk_a_pins[] = {
+       /* SCIF_CLK */
+       RCAR_GP_PIN(6, 23),
+};
+static const unsigned int scif_clk_a_mux[] = {
+       SCIF_CLK_A_MARK,
+};
+static const unsigned int scif_clk_b_pins[] = {
+       /* SCIF_CLK */
+       RCAR_GP_PIN(5, 9),
+};
+static const unsigned int scif_clk_b_mux[] = {
+       SCIF_CLK_B_MARK,
+};
+
+/* - SDHI0 ------------------------------------------------------------------ */
+static const unsigned int sdhi0_data1_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(3, 2),
+};
+
+static const unsigned int sdhi0_data1_mux[] = {
+       SD0_DAT0_MARK,
+};
+
+static const unsigned int sdhi0_data4_pins[] = {
+       /* D[0:3] */
+       RCAR_GP_PIN(3, 2), RCAR_GP_PIN(3, 3),
+       RCAR_GP_PIN(3, 4), RCAR_GP_PIN(3, 5),
+};
+
+static const unsigned int sdhi0_data4_mux[] = {
+       SD0_DAT0_MARK, SD0_DAT1_MARK,
+       SD0_DAT2_MARK, SD0_DAT3_MARK,
+};
+
+static const unsigned int sdhi0_ctrl_pins[] = {
+       /* CLK, CMD */
+       RCAR_GP_PIN(3, 0), RCAR_GP_PIN(3, 1),
+};
+
+static const unsigned int sdhi0_ctrl_mux[] = {
+       SD0_CLK_MARK, SD0_CMD_MARK,
+};
+
+static const unsigned int sdhi0_cd_pins[] = {
+       /* CD */
+       RCAR_GP_PIN(3, 12),
+};
+
+static const unsigned int sdhi0_cd_mux[] = {
+       SD0_CD_MARK,
+};
+
+static const unsigned int sdhi0_wp_pins[] = {
+       /* WP */
+       RCAR_GP_PIN(3, 13),
+};
+
+static const unsigned int sdhi0_wp_mux[] = {
+       SD0_WP_MARK,
+};
+
+/* - SDHI1 ------------------------------------------------------------------ */
+static const unsigned int sdhi1_data1_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(3, 8),
+};
+
+static const unsigned int sdhi1_data1_mux[] = {
+       SD1_DAT0_MARK,
+};
+
+static const unsigned int sdhi1_data4_pins[] = {
+       /* D[0:3] */
+       RCAR_GP_PIN(3, 8),  RCAR_GP_PIN(3, 9),
+       RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11),
+};
+
+static const unsigned int sdhi1_data4_mux[] = {
+       SD1_DAT0_MARK, SD1_DAT1_MARK,
+       SD1_DAT2_MARK, SD1_DAT3_MARK,
+};
+
+static const unsigned int sdhi1_ctrl_pins[] = {
+       /* CLK, CMD */
+       RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 7),
+};
+
+static const unsigned int sdhi1_ctrl_mux[] = {
+       SD1_CLK_MARK, SD1_CMD_MARK,
+};
+
+static const unsigned int sdhi1_cd_pins[] = {
+       /* CD */
+       RCAR_GP_PIN(3, 14),
+};
+
+static const unsigned int sdhi1_cd_mux[] = {
+       SD1_CD_MARK,
+};
+
+static const unsigned int sdhi1_wp_pins[] = {
+       /* WP */
+       RCAR_GP_PIN(3, 15),
+};
+
+static const unsigned int sdhi1_wp_mux[] = {
+       SD1_WP_MARK,
+};
+
+/* - SDHI2 ------------------------------------------------------------------ */
+static const unsigned int sdhi2_data1_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(4, 2),
+};
+
+static const unsigned int sdhi2_data1_mux[] = {
+       SD2_DAT0_MARK,
+};
+
+static const unsigned int sdhi2_data4_pins[] = {
+       /* D[0:3] */
+       RCAR_GP_PIN(4, 2), RCAR_GP_PIN(4, 3),
+       RCAR_GP_PIN(4, 4), RCAR_GP_PIN(4, 5),
+};
+
+static const unsigned int sdhi2_data4_mux[] = {
+       SD2_DAT0_MARK, SD2_DAT1_MARK,
+       SD2_DAT2_MARK, SD2_DAT3_MARK,
+};
+
+static const unsigned int sdhi2_data8_pins[] = {
+       /* D[0:7] */
+       RCAR_GP_PIN(4, 2),  RCAR_GP_PIN(4, 3),
+       RCAR_GP_PIN(4, 4),  RCAR_GP_PIN(4, 5),
+       RCAR_GP_PIN(3, 8),  RCAR_GP_PIN(3, 9),
+       RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11),
+};
+
+static const unsigned int sdhi2_data8_mux[] = {
+       SD2_DAT0_MARK, SD2_DAT1_MARK,
+       SD2_DAT2_MARK, SD2_DAT3_MARK,
+       SD2_DAT4_MARK, SD2_DAT5_MARK,
+       SD2_DAT6_MARK, SD2_DAT7_MARK,
+};
+
+static const unsigned int sdhi2_ctrl_pins[] = {
+       /* CLK, CMD */
+       RCAR_GP_PIN(4, 0), RCAR_GP_PIN(4, 1),
+};
+
+static const unsigned int sdhi2_ctrl_mux[] = {
+       SD2_CLK_MARK, SD2_CMD_MARK,
+};
+
+static const unsigned int sdhi2_cd_a_pins[] = {
+       /* CD */
+       RCAR_GP_PIN(4, 13),
+};
+
+static const unsigned int sdhi2_cd_a_mux[] = {
+       SD2_CD_A_MARK,
+};
+
+static const unsigned int sdhi2_cd_b_pins[] = {
+       /* CD */
+       RCAR_GP_PIN(5, 10),
+};
+
+static const unsigned int sdhi2_cd_b_mux[] = {
+       SD2_CD_B_MARK,
+};
+
+static const unsigned int sdhi2_wp_a_pins[] = {
+       /* WP */
+       RCAR_GP_PIN(4, 14),
+};
+
+static const unsigned int sdhi2_wp_a_mux[] = {
+       SD2_WP_A_MARK,
+};
+
+static const unsigned int sdhi2_wp_b_pins[] = {
+       /* WP */
+       RCAR_GP_PIN(5, 11),
+};
+
+static const unsigned int sdhi2_wp_b_mux[] = {
+       SD2_WP_B_MARK,
+};
+
+static const unsigned int sdhi2_ds_pins[] = {
+       /* DS */
+       RCAR_GP_PIN(4, 6),
+};
+
+static const unsigned int sdhi2_ds_mux[] = {
+       SD2_DS_MARK,
+};
+
+/* - SDHI3 ------------------------------------------------------------------ */
+static const unsigned int sdhi3_data1_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(4, 9),
+};
+
+static const unsigned int sdhi3_data1_mux[] = {
+       SD3_DAT0_MARK,
+};
+
+static const unsigned int sdhi3_data4_pins[] = {
+       /* D[0:3] */
+       RCAR_GP_PIN(4, 9),  RCAR_GP_PIN(4, 10),
+       RCAR_GP_PIN(4, 11), RCAR_GP_PIN(4, 12),
+};
+
+static const unsigned int sdhi3_data4_mux[] = {
+       SD3_DAT0_MARK, SD3_DAT1_MARK,
+       SD3_DAT2_MARK, SD3_DAT3_MARK,
+};
+
+static const unsigned int sdhi3_data8_pins[] = {
+       /* D[0:7] */
+       RCAR_GP_PIN(4, 9),  RCAR_GP_PIN(4, 10),
+       RCAR_GP_PIN(4, 11), RCAR_GP_PIN(4, 12),
+       RCAR_GP_PIN(4, 13), RCAR_GP_PIN(4, 14),
+       RCAR_GP_PIN(4, 15), RCAR_GP_PIN(4, 16),
+};
+
+static const unsigned int sdhi3_data8_mux[] = {
+       SD3_DAT0_MARK, SD3_DAT1_MARK,
+       SD3_DAT2_MARK, SD3_DAT3_MARK,
+       SD3_DAT4_MARK, SD3_DAT5_MARK,
+       SD3_DAT6_MARK, SD3_DAT7_MARK,
+};
+
+static const unsigned int sdhi3_ctrl_pins[] = {
+       /* CLK, CMD */
+       RCAR_GP_PIN(4, 7), RCAR_GP_PIN(4, 8),
+};
+
+static const unsigned int sdhi3_ctrl_mux[] = {
+       SD3_CLK_MARK, SD3_CMD_MARK,
+};
+
+static const unsigned int sdhi3_cd_pins[] = {
+       /* CD */
+       RCAR_GP_PIN(4, 15),
+};
+
+static const unsigned int sdhi3_cd_mux[] = {
+       SD3_CD_MARK,
+};
+
+static const unsigned int sdhi3_wp_pins[] = {
+       /* WP */
+       RCAR_GP_PIN(4, 16),
+};
+
+static const unsigned int sdhi3_wp_mux[] = {
+       SD3_WP_MARK,
+};
+
+static const unsigned int sdhi3_ds_pins[] = {
+       /* DS */
+       RCAR_GP_PIN(4, 17),
+};
+
+static const unsigned int sdhi3_ds_mux[] = {
+       SD3_DS_MARK,
+};
+
+/* - SSI -------------------------------------------------------------------- */
+static const unsigned int ssi0_data_pins[] = {
+       /* SDATA */
+       RCAR_GP_PIN(6, 2),
+};
+static const unsigned int ssi0_data_mux[] = {
+       SSI_SDATA0_MARK,
+};
+static const unsigned int ssi01239_ctrl_pins[] = {
+       /* SCK, WS */
+       RCAR_GP_PIN(6, 0), RCAR_GP_PIN(6, 1),
+};
+static const unsigned int ssi01239_ctrl_mux[] = {
+       SSI_SCK01239_MARK, SSI_WS01239_MARK,
+};
+static const unsigned int ssi1_data_a_pins[] = {
+       /* SDATA */
+       RCAR_GP_PIN(6, 3),
+};
+static const unsigned int ssi1_data_a_mux[] = {
+       SSI_SDATA1_A_MARK,
+};
+static const unsigned int ssi1_data_b_pins[] = {
+       /* SDATA */
+       RCAR_GP_PIN(5, 12),
+};
+static const unsigned int ssi1_data_b_mux[] = {
+       SSI_SDATA1_B_MARK,
+};
+static const unsigned int ssi1_ctrl_a_pins[] = {
+       /* SCK, WS */
+       RCAR_GP_PIN(6, 26), RCAR_GP_PIN(6, 27),
+};
+static const unsigned int ssi1_ctrl_a_mux[] = {
+       SSI_SCK1_A_MARK, SSI_WS1_A_MARK,
+};
+static const unsigned int ssi1_ctrl_b_pins[] = {
+       /* SCK, WS */
+       RCAR_GP_PIN(6, 4), RCAR_GP_PIN(6, 21),
+};
+static const unsigned int ssi1_ctrl_b_mux[] = {
+       SSI_SCK1_B_MARK, SSI_WS1_B_MARK,
+};
+static const unsigned int ssi2_data_a_pins[] = {
+       /* SDATA */
+       RCAR_GP_PIN(6, 4),
+};
+static const unsigned int ssi2_data_a_mux[] = {
+       SSI_SDATA2_A_MARK,
+};
+static const unsigned int ssi2_data_b_pins[] = {
+       /* SDATA */
+       RCAR_GP_PIN(5, 13),
+};
+static const unsigned int ssi2_data_b_mux[] = {
+       SSI_SDATA2_B_MARK,
+};
+static const unsigned int ssi2_ctrl_a_pins[] = {
+       /* SCK, WS */
+       RCAR_GP_PIN(5, 19), RCAR_GP_PIN(5, 21),
+};
+static const unsigned int ssi2_ctrl_a_mux[] = {
+       SSI_SCK2_A_MARK, SSI_WS2_A_MARK,
+};
+static const unsigned int ssi2_ctrl_b_pins[] = {
+       /* SCK, WS */
+       RCAR_GP_PIN(6, 28), RCAR_GP_PIN(6, 29),
+};
+static const unsigned int ssi2_ctrl_b_mux[] = {
+       SSI_SCK2_B_MARK, SSI_WS2_B_MARK,
+};
+static const unsigned int ssi3_data_pins[] = {
+       /* SDATA */
+       RCAR_GP_PIN(6, 7),
+};
+static const unsigned int ssi3_data_mux[] = {
+       SSI_SDATA3_MARK,
+};
+static const unsigned int ssi349_ctrl_pins[] = {
+       /* SCK, WS */
+       RCAR_GP_PIN(6, 5), RCAR_GP_PIN(6, 6),
+};
+static const unsigned int ssi349_ctrl_mux[] = {
+       SSI_SCK349_MARK, SSI_WS349_MARK,
+};
+static const unsigned int ssi4_data_pins[] = {
+       /* SDATA */
+       RCAR_GP_PIN(6, 10),
+};
+static const unsigned int ssi4_data_mux[] = {
+       SSI_SDATA4_MARK,
+};
+static const unsigned int ssi4_ctrl_pins[] = {
+       /* SCK, WS */
+       RCAR_GP_PIN(6, 8), RCAR_GP_PIN(6, 9),
+};
+static const unsigned int ssi4_ctrl_mux[] = {
+       SSI_SCK4_MARK, SSI_WS4_MARK,
+};
+static const unsigned int ssi5_data_pins[] = {
+       /* SDATA */
+       RCAR_GP_PIN(6, 13),
+};
+static const unsigned int ssi5_data_mux[] = {
+       SSI_SDATA5_MARK,
+};
+static const unsigned int ssi5_ctrl_pins[] = {
+       /* SCK, WS */
+       RCAR_GP_PIN(6, 11), RCAR_GP_PIN(6, 12),
+};
+static const unsigned int ssi5_ctrl_mux[] = {
+       SSI_SCK5_MARK, SSI_WS5_MARK,
+};
+static const unsigned int ssi6_data_pins[] = {
+       /* SDATA */
+       RCAR_GP_PIN(6, 16),
+};
+static const unsigned int ssi6_data_mux[] = {
+       SSI_SDATA6_MARK,
+};
+static const unsigned int ssi6_ctrl_pins[] = {
+       /* SCK, WS */
+       RCAR_GP_PIN(6, 14), RCAR_GP_PIN(6, 15),
+};
+static const unsigned int ssi6_ctrl_mux[] = {
+       SSI_SCK6_MARK, SSI_WS6_MARK,
+};
+static const unsigned int ssi7_data_pins[] = {
+       /* SDATA */
+       RCAR_GP_PIN(6, 19),
+};
+static const unsigned int ssi7_data_mux[] = {
+       SSI_SDATA7_MARK,
+};
+static const unsigned int ssi78_ctrl_pins[] = {
+       /* SCK, WS */
+       RCAR_GP_PIN(6, 17), RCAR_GP_PIN(6, 18),
+};
+static const unsigned int ssi78_ctrl_mux[] = {
+       SSI_SCK78_MARK, SSI_WS78_MARK,
+};
+static const unsigned int ssi8_data_pins[] = {
+       /* SDATA */
+       RCAR_GP_PIN(6, 20),
+};
+static const unsigned int ssi8_data_mux[] = {
+       SSI_SDATA8_MARK,
+};
+static const unsigned int ssi9_data_a_pins[] = {
+       /* SDATA */
+       RCAR_GP_PIN(6, 21),
+};
+static const unsigned int ssi9_data_a_mux[] = {
+       SSI_SDATA9_A_MARK,
+};
+static const unsigned int ssi9_data_b_pins[] = {
+       /* SDATA */
+       RCAR_GP_PIN(5, 14),
+};
+static const unsigned int ssi9_data_b_mux[] = {
+       SSI_SDATA9_B_MARK,
+};
+static const unsigned int ssi9_ctrl_a_pins[] = {
+       /* SCK, WS */
+       RCAR_GP_PIN(5, 15), RCAR_GP_PIN(5, 16),
+};
+static const unsigned int ssi9_ctrl_a_mux[] = {
+       SSI_SCK9_A_MARK, SSI_WS9_A_MARK,
+};
+static const unsigned int ssi9_ctrl_b_pins[] = {
+       /* SCK, WS */
+       RCAR_GP_PIN(6, 30), RCAR_GP_PIN(6, 31),
+};
+static const unsigned int ssi9_ctrl_b_mux[] = {
+       SSI_SCK9_B_MARK, SSI_WS9_B_MARK,
+};
+
+/* - TMU -------------------------------------------------------------------- */
+static const unsigned int tmu_tclk1_a_pins[] = {
+       /* TCLK */
+       RCAR_GP_PIN(6, 23),
+};
+
+static const unsigned int tmu_tclk1_a_mux[] = {
+       TCLK1_A_MARK,
+};
+
+static const unsigned int tmu_tclk1_b_pins[] = {
+       /* TCLK */
+       RCAR_GP_PIN(5, 19),
+};
+
+static const unsigned int tmu_tclk1_b_mux[] = {
+       TCLK1_B_MARK,
+};
+
+static const unsigned int tmu_tclk2_a_pins[] = {
+       /* TCLK */
+       RCAR_GP_PIN(6, 19),
+};
+
+static const unsigned int tmu_tclk2_a_mux[] = {
+       TCLK2_A_MARK,
+};
+
+static const unsigned int tmu_tclk2_b_pins[] = {
+       /* TCLK */
+       RCAR_GP_PIN(6, 28),
+};
+
+static const unsigned int tmu_tclk2_b_mux[] = {
+       TCLK2_B_MARK,
+};
+
+/* - USB0 ------------------------------------------------------------------- */
+static const unsigned int usb0_pins[] = {
+       /* PWEN, OVC */
+       RCAR_GP_PIN(6, 24), RCAR_GP_PIN(6, 25),
+};
+
+static const unsigned int usb0_mux[] = {
+       USB0_PWEN_MARK, USB0_OVC_MARK,
+};
+
+/* - USB1 ------------------------------------------------------------------- */
+static const unsigned int usb1_pins[] = {
+       /* PWEN, OVC */
+       RCAR_GP_PIN(6, 26), RCAR_GP_PIN(6, 27),
+};
+
+static const unsigned int usb1_mux[] = {
+       USB1_PWEN_MARK, USB1_OVC_MARK,
+};
+
+/* - USB30 ------------------------------------------------------------------ */
+static const unsigned int usb30_pins[] = {
+       /* PWEN, OVC */
+       RCAR_GP_PIN(6, 28), RCAR_GP_PIN(6, 29),
+};
+
+static const unsigned int usb30_mux[] = {
+       USB30_PWEN_MARK, USB30_OVC_MARK,
+};
+
+/* - VIN4 ------------------------------------------------------------------- */
+static const unsigned int vin4_data18_a_pins[] = {
+       RCAR_GP_PIN(0, 10), RCAR_GP_PIN(0, 11),
+       RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 13),
+       RCAR_GP_PIN(0, 14), RCAR_GP_PIN(0, 15),
+       RCAR_GP_PIN(1, 2),  RCAR_GP_PIN(1, 3),
+       RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 5),
+       RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 7),
+       RCAR_GP_PIN(0, 2),  RCAR_GP_PIN(0, 3),
+       RCAR_GP_PIN(0, 4),  RCAR_GP_PIN(0, 5),
+       RCAR_GP_PIN(0, 6),  RCAR_GP_PIN(0, 7),
+};
+
+static const unsigned int vin4_data18_a_mux[] = {
+       VI4_DATA2_A_MARK, VI4_DATA3_A_MARK,
+       VI4_DATA4_A_MARK, VI4_DATA5_A_MARK,
+       VI4_DATA6_A_MARK, VI4_DATA7_A_MARK,
+       VI4_DATA10_MARK,  VI4_DATA11_MARK,
+       VI4_DATA12_MARK,  VI4_DATA13_MARK,
+       VI4_DATA14_MARK,  VI4_DATA15_MARK,
+       VI4_DATA18_MARK,  VI4_DATA19_MARK,
+       VI4_DATA20_MARK,  VI4_DATA21_MARK,
+       VI4_DATA22_MARK,  VI4_DATA23_MARK,
+};
+
+static const union vin_data vin4_data_a_pins = {
+       .data24 = {
+               RCAR_GP_PIN(0, 8),  RCAR_GP_PIN(0, 9),
+               RCAR_GP_PIN(0, 10), RCAR_GP_PIN(0, 11),
+               RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 13),
+               RCAR_GP_PIN(0, 14), RCAR_GP_PIN(0, 15),
+               RCAR_GP_PIN(1, 0),  RCAR_GP_PIN(1, 1),
+               RCAR_GP_PIN(1, 2),  RCAR_GP_PIN(1, 3),
+               RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 5),
+               RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 7),
+               RCAR_GP_PIN(0, 0),  RCAR_GP_PIN(0, 1),
+               RCAR_GP_PIN(0, 2),  RCAR_GP_PIN(0, 3),
+               RCAR_GP_PIN(0, 4),  RCAR_GP_PIN(0, 5),
+               RCAR_GP_PIN(0, 6),  RCAR_GP_PIN(0, 7),
+       },
+};
+
+static const union vin_data vin4_data_a_mux = {
+       .data24 = {
+               VI4_DATA0_A_MARK, VI4_DATA1_A_MARK,
+               VI4_DATA2_A_MARK, VI4_DATA3_A_MARK,
+               VI4_DATA4_A_MARK, VI4_DATA5_A_MARK,
+               VI4_DATA6_A_MARK, VI4_DATA7_A_MARK,
+               VI4_DATA8_MARK,   VI4_DATA9_MARK,
+               VI4_DATA10_MARK,  VI4_DATA11_MARK,
+               VI4_DATA12_MARK,  VI4_DATA13_MARK,
+               VI4_DATA14_MARK,  VI4_DATA15_MARK,
+               VI4_DATA16_MARK,  VI4_DATA17_MARK,
+               VI4_DATA18_MARK,  VI4_DATA19_MARK,
+               VI4_DATA20_MARK,  VI4_DATA21_MARK,
+               VI4_DATA22_MARK,  VI4_DATA23_MARK,
+       },
+};
+
+static const unsigned int vin4_data18_b_pins[] = {
+       RCAR_GP_PIN(2, 2), RCAR_GP_PIN(2, 3),
+       RCAR_GP_PIN(2, 4), RCAR_GP_PIN(2, 5),
+       RCAR_GP_PIN(2, 6), RCAR_GP_PIN(2, 7),
+       RCAR_GP_PIN(1, 2), RCAR_GP_PIN(1, 3),
+       RCAR_GP_PIN(1, 4), RCAR_GP_PIN(1, 5),
+       RCAR_GP_PIN(1, 6), RCAR_GP_PIN(1, 7),
+       RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3),
+       RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
+       RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7),
+};
+
+static const unsigned int vin4_data18_b_mux[] = {
+       VI4_DATA2_B_MARK, VI4_DATA3_B_MARK,
+       VI4_DATA4_B_MARK, VI4_DATA5_B_MARK,
+       VI4_DATA6_B_MARK, VI4_DATA7_B_MARK,
+       VI4_DATA10_MARK,  VI4_DATA11_MARK,
+       VI4_DATA12_MARK,  VI4_DATA13_MARK,
+       VI4_DATA14_MARK,  VI4_DATA15_MARK,
+       VI4_DATA18_MARK,  VI4_DATA19_MARK,
+       VI4_DATA20_MARK,  VI4_DATA21_MARK,
+       VI4_DATA22_MARK,  VI4_DATA23_MARK,
+};
+
+static const union vin_data vin4_data_b_pins = {
+       .data24 = {
+               RCAR_GP_PIN(2, 0), RCAR_GP_PIN(2, 1),
+               RCAR_GP_PIN(2, 2), RCAR_GP_PIN(2, 3),
+               RCAR_GP_PIN(2, 4), RCAR_GP_PIN(2, 5),
+               RCAR_GP_PIN(2, 6), RCAR_GP_PIN(2, 7),
+               RCAR_GP_PIN(1, 0), RCAR_GP_PIN(1, 1),
+               RCAR_GP_PIN(1, 2), RCAR_GP_PIN(1, 3),
+               RCAR_GP_PIN(1, 4), RCAR_GP_PIN(1, 5),
+               RCAR_GP_PIN(1, 6), RCAR_GP_PIN(1, 7),
+               RCAR_GP_PIN(0, 0), RCAR_GP_PIN(0, 1),
+               RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3),
+               RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
+               RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7),
+       },
+};
+
+static const union vin_data vin4_data_b_mux = {
+       .data24 = {
+               VI4_DATA0_B_MARK, VI4_DATA1_B_MARK,
+               VI4_DATA2_B_MARK, VI4_DATA3_B_MARK,
+               VI4_DATA4_B_MARK, VI4_DATA5_B_MARK,
+               VI4_DATA6_B_MARK, VI4_DATA7_B_MARK,
+               VI4_DATA8_MARK,   VI4_DATA9_MARK,
+               VI4_DATA10_MARK,  VI4_DATA11_MARK,
+               VI4_DATA12_MARK,  VI4_DATA13_MARK,
+               VI4_DATA14_MARK,  VI4_DATA15_MARK,
+               VI4_DATA16_MARK,  VI4_DATA17_MARK,
+               VI4_DATA18_MARK,  VI4_DATA19_MARK,
+               VI4_DATA20_MARK,  VI4_DATA21_MARK,
+               VI4_DATA22_MARK,  VI4_DATA23_MARK,
+       },
+};
+
+static const unsigned int vin4_sync_pins[] = {
+       /* VSYNC_N, HSYNC_N */
+       RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 18),
+};
+
+static const unsigned int vin4_sync_mux[] = {
+       VI4_HSYNC_N_MARK, VI4_VSYNC_N_MARK,
+};
+
+static const unsigned int vin4_field_pins[] = {
+       RCAR_GP_PIN(1, 16),
+};
+
+static const unsigned int vin4_field_mux[] = {
+       VI4_FIELD_MARK,
+};
+
+static const unsigned int vin4_clkenb_pins[] = {
+       RCAR_GP_PIN(1, 19),
+};
+
+static const unsigned int vin4_clkenb_mux[] = {
+       VI4_CLKENB_MARK,
+};
+
+static const unsigned int vin4_clk_pins[] = {
+       RCAR_GP_PIN(1, 27),
+};
+
+static const unsigned int vin4_clk_mux[] = {
+       VI4_CLK_MARK,
+};
+
+/* - VIN5 ------------------------------------------------------------------- */
+static const union vin_data16 vin5_data_pins = {
+       .data16 = {
+               RCAR_GP_PIN(0, 0), RCAR_GP_PIN(0, 1),
+               RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3),
+               RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
+               RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7),
+               RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 13),
+               RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 15),
+               RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 5),
+               RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 7),
+       },
+};
+
+static const union vin_data16 vin5_data_mux = {
+       .data16 = {
+               VI5_DATA0_MARK, VI5_DATA1_MARK,
+               VI5_DATA2_MARK, VI5_DATA3_MARK,
+               VI5_DATA4_MARK, VI5_DATA5_MARK,
+               VI5_DATA6_MARK, VI5_DATA7_MARK,
+               VI5_DATA8_MARK,  VI5_DATA9_MARK,
+               VI5_DATA10_MARK, VI5_DATA11_MARK,
+               VI5_DATA12_MARK, VI5_DATA13_MARK,
+               VI5_DATA14_MARK, VI5_DATA15_MARK,
+       },
+};
+
+static const unsigned int vin5_sync_pins[] = {
+       /* VSYNC_N, HSYNC_N */
+       RCAR_GP_PIN(1, 9), RCAR_GP_PIN(1, 10),
+};
+
+static const unsigned int vin5_sync_mux[] = {
+       VI5_HSYNC_N_MARK, VI5_VSYNC_N_MARK,
+};
+
+static const unsigned int vin5_field_pins[] = {
+       RCAR_GP_PIN(1, 11),
+};
+
+static const unsigned int vin5_field_mux[] = {
+       VI5_FIELD_MARK,
+};
+
+static const unsigned int vin5_clkenb_pins[] = {
+       RCAR_GP_PIN(1, 20),
+};
+
+static const unsigned int vin5_clkenb_mux[] = {
+       VI5_CLKENB_MARK,
+};
+
+static const unsigned int vin5_clk_pins[] = {
+       RCAR_GP_PIN(1, 21),
+};
+
+static const unsigned int vin5_clk_mux[] = {
+       VI5_CLK_MARK,
+};
+
+static const struct sh_pfc_pin_group pinmux_groups[] = {
+       SH_PFC_PIN_GROUP(audio_clk_a_a),
+       SH_PFC_PIN_GROUP(audio_clk_a_b),
+       SH_PFC_PIN_GROUP(audio_clk_a_c),
+       SH_PFC_PIN_GROUP(audio_clk_b_a),
+       SH_PFC_PIN_GROUP(audio_clk_b_b),
+       SH_PFC_PIN_GROUP(audio_clk_c_a),
+       SH_PFC_PIN_GROUP(audio_clk_c_b),
+       SH_PFC_PIN_GROUP(audio_clkout_a),
+       SH_PFC_PIN_GROUP(audio_clkout_b),
+       SH_PFC_PIN_GROUP(audio_clkout_c),
+       SH_PFC_PIN_GROUP(audio_clkout_d),
+       SH_PFC_PIN_GROUP(audio_clkout1_a),
+       SH_PFC_PIN_GROUP(audio_clkout1_b),
+       SH_PFC_PIN_GROUP(audio_clkout2_a),
+       SH_PFC_PIN_GROUP(audio_clkout2_b),
+       SH_PFC_PIN_GROUP(audio_clkout3_a),
+       SH_PFC_PIN_GROUP(audio_clkout3_b),
+       SH_PFC_PIN_GROUP(avb_link),
+       SH_PFC_PIN_GROUP(avb_magic),
+       SH_PFC_PIN_GROUP(avb_phy_int),
+       SH_PFC_PIN_GROUP_ALIAS(avb_mdc, avb_mdio),      /* Deprecated */
+       SH_PFC_PIN_GROUP(avb_mdio),
+       SH_PFC_PIN_GROUP(avb_mii),
+       SH_PFC_PIN_GROUP(avb_avtp_pps),
+       SH_PFC_PIN_GROUP(avb_avtp_match_a),
+       SH_PFC_PIN_GROUP(avb_avtp_capture_a),
+       SH_PFC_PIN_GROUP(avb_avtp_match_b),
+       SH_PFC_PIN_GROUP(avb_avtp_capture_b),
+       SH_PFC_PIN_GROUP(can0_data_a),
+       SH_PFC_PIN_GROUP(can0_data_b),
+       SH_PFC_PIN_GROUP(can1_data),
+       SH_PFC_PIN_GROUP(can_clk),
+       SH_PFC_PIN_GROUP(canfd0_data_a),
+       SH_PFC_PIN_GROUP(canfd0_data_b),
+       SH_PFC_PIN_GROUP(canfd1_data),
+       SH_PFC_PIN_GROUP(drif0_ctrl_a),
+       SH_PFC_PIN_GROUP(drif0_data0_a),
+       SH_PFC_PIN_GROUP(drif0_data1_a),
+       SH_PFC_PIN_GROUP(drif0_ctrl_b),
+       SH_PFC_PIN_GROUP(drif0_data0_b),
+       SH_PFC_PIN_GROUP(drif0_data1_b),
+       SH_PFC_PIN_GROUP(drif0_ctrl_c),
+       SH_PFC_PIN_GROUP(drif0_data0_c),
+       SH_PFC_PIN_GROUP(drif0_data1_c),
+       SH_PFC_PIN_GROUP(drif1_ctrl_a),
+       SH_PFC_PIN_GROUP(drif1_data0_a),
+       SH_PFC_PIN_GROUP(drif1_data1_a),
+       SH_PFC_PIN_GROUP(drif1_ctrl_b),
+       SH_PFC_PIN_GROUP(drif1_data0_b),
+       SH_PFC_PIN_GROUP(drif1_data1_b),
+       SH_PFC_PIN_GROUP(drif1_ctrl_c),
+       SH_PFC_PIN_GROUP(drif1_data0_c),
+       SH_PFC_PIN_GROUP(drif1_data1_c),
+       SH_PFC_PIN_GROUP(drif2_ctrl_a),
+       SH_PFC_PIN_GROUP(drif2_data0_a),
+       SH_PFC_PIN_GROUP(drif2_data1_a),
+       SH_PFC_PIN_GROUP(drif2_ctrl_b),
+       SH_PFC_PIN_GROUP(drif2_data0_b),
+       SH_PFC_PIN_GROUP(drif2_data1_b),
+       SH_PFC_PIN_GROUP(drif3_ctrl_a),
+       SH_PFC_PIN_GROUP(drif3_data0_a),
+       SH_PFC_PIN_GROUP(drif3_data1_a),
+       SH_PFC_PIN_GROUP(drif3_ctrl_b),
+       SH_PFC_PIN_GROUP(drif3_data0_b),
+       SH_PFC_PIN_GROUP(drif3_data1_b),
+       SH_PFC_PIN_GROUP(du_rgb666),
+       SH_PFC_PIN_GROUP(du_rgb888),
+       SH_PFC_PIN_GROUP(du_clk_out_0),
+       SH_PFC_PIN_GROUP(du_clk_out_1),
+       SH_PFC_PIN_GROUP(du_sync),
+       SH_PFC_PIN_GROUP(du_oddf),
+       SH_PFC_PIN_GROUP(du_cde),
+       SH_PFC_PIN_GROUP(du_disp),
+       SH_PFC_PIN_GROUP(hscif0_data),
+       SH_PFC_PIN_GROUP(hscif0_clk),
+       SH_PFC_PIN_GROUP(hscif0_ctrl),
+       SH_PFC_PIN_GROUP(hscif1_data_a),
+       SH_PFC_PIN_GROUP(hscif1_clk_a),
+       SH_PFC_PIN_GROUP(hscif1_ctrl_a),
+       SH_PFC_PIN_GROUP(hscif1_data_b),
+       SH_PFC_PIN_GROUP(hscif1_clk_b),
+       SH_PFC_PIN_GROUP(hscif1_ctrl_b),
+       SH_PFC_PIN_GROUP(hscif2_data_a),
+       SH_PFC_PIN_GROUP(hscif2_clk_a),
+       SH_PFC_PIN_GROUP(hscif2_ctrl_a),
+       SH_PFC_PIN_GROUP(hscif2_data_b),
+       SH_PFC_PIN_GROUP(hscif2_clk_b),
+       SH_PFC_PIN_GROUP(hscif2_ctrl_b),
+       SH_PFC_PIN_GROUP(hscif2_data_c),
+       SH_PFC_PIN_GROUP(hscif2_clk_c),
+       SH_PFC_PIN_GROUP(hscif2_ctrl_c),
+       SH_PFC_PIN_GROUP(hscif3_data_a),
+       SH_PFC_PIN_GROUP(hscif3_clk),
+       SH_PFC_PIN_GROUP(hscif3_ctrl),
+       SH_PFC_PIN_GROUP(hscif3_data_b),
+       SH_PFC_PIN_GROUP(hscif3_data_c),
+       SH_PFC_PIN_GROUP(hscif3_data_d),
+       SH_PFC_PIN_GROUP(hscif4_data_a),
+       SH_PFC_PIN_GROUP(hscif4_clk),
+       SH_PFC_PIN_GROUP(hscif4_ctrl),
+       SH_PFC_PIN_GROUP(hscif4_data_b),
+       SH_PFC_PIN_GROUP(i2c1_a),
+       SH_PFC_PIN_GROUP(i2c1_b),
+       SH_PFC_PIN_GROUP(i2c2_a),
+       SH_PFC_PIN_GROUP(i2c2_b),
+       SH_PFC_PIN_GROUP(i2c6_a),
+       SH_PFC_PIN_GROUP(i2c6_b),
+       SH_PFC_PIN_GROUP(i2c6_c),
+       SH_PFC_PIN_GROUP(intc_ex_irq0),
+       SH_PFC_PIN_GROUP(intc_ex_irq1),
+       SH_PFC_PIN_GROUP(intc_ex_irq2),
+       SH_PFC_PIN_GROUP(intc_ex_irq3),
+       SH_PFC_PIN_GROUP(intc_ex_irq4),
+       SH_PFC_PIN_GROUP(intc_ex_irq5),
+       SH_PFC_PIN_GROUP(msiof0_clk),
+       SH_PFC_PIN_GROUP(msiof0_sync),
+       SH_PFC_PIN_GROUP(msiof0_ss1),
+       SH_PFC_PIN_GROUP(msiof0_ss2),
+       SH_PFC_PIN_GROUP(msiof0_txd),
+       SH_PFC_PIN_GROUP(msiof0_rxd),
+       SH_PFC_PIN_GROUP(msiof1_clk_a),
+       SH_PFC_PIN_GROUP(msiof1_sync_a),
+       SH_PFC_PIN_GROUP(msiof1_ss1_a),
+       SH_PFC_PIN_GROUP(msiof1_ss2_a),
+       SH_PFC_PIN_GROUP(msiof1_txd_a),
+       SH_PFC_PIN_GROUP(msiof1_rxd_a),
+       SH_PFC_PIN_GROUP(msiof1_clk_b),
+       SH_PFC_PIN_GROUP(msiof1_sync_b),
+       SH_PFC_PIN_GROUP(msiof1_ss1_b),
+       SH_PFC_PIN_GROUP(msiof1_ss2_b),
+       SH_PFC_PIN_GROUP(msiof1_txd_b),
+       SH_PFC_PIN_GROUP(msiof1_rxd_b),
+       SH_PFC_PIN_GROUP(msiof1_clk_c),
+       SH_PFC_PIN_GROUP(msiof1_sync_c),
+       SH_PFC_PIN_GROUP(msiof1_ss1_c),
+       SH_PFC_PIN_GROUP(msiof1_ss2_c),
+       SH_PFC_PIN_GROUP(msiof1_txd_c),
+       SH_PFC_PIN_GROUP(msiof1_rxd_c),
+       SH_PFC_PIN_GROUP(msiof1_clk_d),
+       SH_PFC_PIN_GROUP(msiof1_sync_d),
+       SH_PFC_PIN_GROUP(msiof1_ss1_d),
+       SH_PFC_PIN_GROUP(msiof1_ss2_d),
+       SH_PFC_PIN_GROUP(msiof1_txd_d),
+       SH_PFC_PIN_GROUP(msiof1_rxd_d),
+       SH_PFC_PIN_GROUP(msiof1_clk_e),
+       SH_PFC_PIN_GROUP(msiof1_sync_e),
+       SH_PFC_PIN_GROUP(msiof1_ss1_e),
+       SH_PFC_PIN_GROUP(msiof1_ss2_e),
+       SH_PFC_PIN_GROUP(msiof1_txd_e),
+       SH_PFC_PIN_GROUP(msiof1_rxd_e),
+       SH_PFC_PIN_GROUP(msiof1_clk_f),
+       SH_PFC_PIN_GROUP(msiof1_sync_f),
+       SH_PFC_PIN_GROUP(msiof1_ss1_f),
+       SH_PFC_PIN_GROUP(msiof1_ss2_f),
+       SH_PFC_PIN_GROUP(msiof1_txd_f),
+       SH_PFC_PIN_GROUP(msiof1_rxd_f),
+       SH_PFC_PIN_GROUP(msiof1_clk_g),
+       SH_PFC_PIN_GROUP(msiof1_sync_g),
+       SH_PFC_PIN_GROUP(msiof1_ss1_g),
+       SH_PFC_PIN_GROUP(msiof1_ss2_g),
+       SH_PFC_PIN_GROUP(msiof1_txd_g),
+       SH_PFC_PIN_GROUP(msiof1_rxd_g),
+       SH_PFC_PIN_GROUP(msiof2_clk_a),
+       SH_PFC_PIN_GROUP(msiof2_sync_a),
+       SH_PFC_PIN_GROUP(msiof2_ss1_a),
+       SH_PFC_PIN_GROUP(msiof2_ss2_a),
+       SH_PFC_PIN_GROUP(msiof2_txd_a),
+       SH_PFC_PIN_GROUP(msiof2_rxd_a),
+       SH_PFC_PIN_GROUP(msiof2_clk_b),
+       SH_PFC_PIN_GROUP(msiof2_sync_b),
+       SH_PFC_PIN_GROUP(msiof2_ss1_b),
+       SH_PFC_PIN_GROUP(msiof2_ss2_b),
+       SH_PFC_PIN_GROUP(msiof2_txd_b),
+       SH_PFC_PIN_GROUP(msiof2_rxd_b),
+       SH_PFC_PIN_GROUP(msiof2_clk_c),
+       SH_PFC_PIN_GROUP(msiof2_sync_c),
+       SH_PFC_PIN_GROUP(msiof2_ss1_c),
+       SH_PFC_PIN_GROUP(msiof2_ss2_c),
+       SH_PFC_PIN_GROUP(msiof2_txd_c),
+       SH_PFC_PIN_GROUP(msiof2_rxd_c),
+       SH_PFC_PIN_GROUP(msiof2_clk_d),
+       SH_PFC_PIN_GROUP(msiof2_sync_d),
+       SH_PFC_PIN_GROUP(msiof2_ss1_d),
+       SH_PFC_PIN_GROUP(msiof2_ss2_d),
+       SH_PFC_PIN_GROUP(msiof2_txd_d),
+       SH_PFC_PIN_GROUP(msiof2_rxd_d),
+       SH_PFC_PIN_GROUP(msiof3_clk_a),
+       SH_PFC_PIN_GROUP(msiof3_sync_a),
+       SH_PFC_PIN_GROUP(msiof3_ss1_a),
+       SH_PFC_PIN_GROUP(msiof3_ss2_a),
+       SH_PFC_PIN_GROUP(msiof3_txd_a),
+       SH_PFC_PIN_GROUP(msiof3_rxd_a),
+       SH_PFC_PIN_GROUP(msiof3_clk_b),
+       SH_PFC_PIN_GROUP(msiof3_sync_b),
+       SH_PFC_PIN_GROUP(msiof3_ss1_b),
+       SH_PFC_PIN_GROUP(msiof3_ss2_b),
+       SH_PFC_PIN_GROUP(msiof3_txd_b),
+       SH_PFC_PIN_GROUP(msiof3_rxd_b),
+       SH_PFC_PIN_GROUP(msiof3_clk_c),
+       SH_PFC_PIN_GROUP(msiof3_sync_c),
+       SH_PFC_PIN_GROUP(msiof3_txd_c),
+       SH_PFC_PIN_GROUP(msiof3_rxd_c),
+       SH_PFC_PIN_GROUP(msiof3_clk_d),
+       SH_PFC_PIN_GROUP(msiof3_sync_d),
+       SH_PFC_PIN_GROUP(msiof3_ss1_d),
+       SH_PFC_PIN_GROUP(msiof3_txd_d),
+       SH_PFC_PIN_GROUP(msiof3_rxd_d),
+       SH_PFC_PIN_GROUP(msiof3_clk_e),
+       SH_PFC_PIN_GROUP(msiof3_sync_e),
+       SH_PFC_PIN_GROUP(msiof3_ss1_e),
+       SH_PFC_PIN_GROUP(msiof3_ss2_e),
+       SH_PFC_PIN_GROUP(msiof3_txd_e),
+       SH_PFC_PIN_GROUP(msiof3_rxd_e),
+       SH_PFC_PIN_GROUP(pwm0),
+       SH_PFC_PIN_GROUP(pwm1_a),
+       SH_PFC_PIN_GROUP(pwm1_b),
+       SH_PFC_PIN_GROUP(pwm2_a),
+       SH_PFC_PIN_GROUP(pwm2_b),
+       SH_PFC_PIN_GROUP(pwm3_a),
+       SH_PFC_PIN_GROUP(pwm3_b),
+       SH_PFC_PIN_GROUP(pwm4_a),
+       SH_PFC_PIN_GROUP(pwm4_b),
+       SH_PFC_PIN_GROUP(pwm5_a),
+       SH_PFC_PIN_GROUP(pwm5_b),
+       SH_PFC_PIN_GROUP(pwm6_a),
+       SH_PFC_PIN_GROUP(pwm6_b),
+       SH_PFC_PIN_GROUP(sata0_devslp_a),
+       SH_PFC_PIN_GROUP(sata0_devslp_b),
+       SH_PFC_PIN_GROUP(scif0_data),
+       SH_PFC_PIN_GROUP(scif0_clk),
+       SH_PFC_PIN_GROUP(scif0_ctrl),
+       SH_PFC_PIN_GROUP(scif1_data_a),
+       SH_PFC_PIN_GROUP(scif1_clk),
+       SH_PFC_PIN_GROUP(scif1_ctrl),
+       SH_PFC_PIN_GROUP(scif1_data_b),
+       SH_PFC_PIN_GROUP(scif2_data_a),
+       SH_PFC_PIN_GROUP(scif2_clk),
+       SH_PFC_PIN_GROUP(scif2_data_b),
+       SH_PFC_PIN_GROUP(scif3_data_a),
+       SH_PFC_PIN_GROUP(scif3_clk),
+       SH_PFC_PIN_GROUP(scif3_ctrl),
+       SH_PFC_PIN_GROUP(scif3_data_b),
+       SH_PFC_PIN_GROUP(scif4_data_a),
+       SH_PFC_PIN_GROUP(scif4_clk_a),
+       SH_PFC_PIN_GROUP(scif4_ctrl_a),
+       SH_PFC_PIN_GROUP(scif4_data_b),
+       SH_PFC_PIN_GROUP(scif4_clk_b),
+       SH_PFC_PIN_GROUP(scif4_ctrl_b),
+       SH_PFC_PIN_GROUP(scif4_data_c),
+       SH_PFC_PIN_GROUP(scif4_clk_c),
+       SH_PFC_PIN_GROUP(scif4_ctrl_c),
+       SH_PFC_PIN_GROUP(scif5_data_a),
+       SH_PFC_PIN_GROUP(scif5_clk_a),
+       SH_PFC_PIN_GROUP(scif5_data_b),
+       SH_PFC_PIN_GROUP(scif5_clk_b),
+       SH_PFC_PIN_GROUP(scif_clk_a),
+       SH_PFC_PIN_GROUP(scif_clk_b),
+       SH_PFC_PIN_GROUP(sdhi0_data1),
+       SH_PFC_PIN_GROUP(sdhi0_data4),
+       SH_PFC_PIN_GROUP(sdhi0_ctrl),
+       SH_PFC_PIN_GROUP(sdhi0_cd),
+       SH_PFC_PIN_GROUP(sdhi0_wp),
+       SH_PFC_PIN_GROUP(sdhi1_data1),
+       SH_PFC_PIN_GROUP(sdhi1_data4),
+       SH_PFC_PIN_GROUP(sdhi1_ctrl),
+       SH_PFC_PIN_GROUP(sdhi1_cd),
+       SH_PFC_PIN_GROUP(sdhi1_wp),
+       SH_PFC_PIN_GROUP(sdhi2_data1),
+       SH_PFC_PIN_GROUP(sdhi2_data4),
+       SH_PFC_PIN_GROUP(sdhi2_data8),
+       SH_PFC_PIN_GROUP(sdhi2_ctrl),
+       SH_PFC_PIN_GROUP(sdhi2_cd_a),
+       SH_PFC_PIN_GROUP(sdhi2_wp_a),
+       SH_PFC_PIN_GROUP(sdhi2_cd_b),
+       SH_PFC_PIN_GROUP(sdhi2_wp_b),
+       SH_PFC_PIN_GROUP(sdhi2_ds),
+       SH_PFC_PIN_GROUP(sdhi3_data1),
+       SH_PFC_PIN_GROUP(sdhi3_data4),
+       SH_PFC_PIN_GROUP(sdhi3_data8),
+       SH_PFC_PIN_GROUP(sdhi3_ctrl),
+       SH_PFC_PIN_GROUP(sdhi3_cd),
+       SH_PFC_PIN_GROUP(sdhi3_wp),
+       SH_PFC_PIN_GROUP(sdhi3_ds),
+       SH_PFC_PIN_GROUP(ssi0_data),
+       SH_PFC_PIN_GROUP(ssi01239_ctrl),
+       SH_PFC_PIN_GROUP(ssi1_data_a),
+       SH_PFC_PIN_GROUP(ssi1_data_b),
+       SH_PFC_PIN_GROUP(ssi1_ctrl_a),
+       SH_PFC_PIN_GROUP(ssi1_ctrl_b),
+       SH_PFC_PIN_GROUP(ssi2_data_a),
+       SH_PFC_PIN_GROUP(ssi2_data_b),
+       SH_PFC_PIN_GROUP(ssi2_ctrl_a),
+       SH_PFC_PIN_GROUP(ssi2_ctrl_b),
+       SH_PFC_PIN_GROUP(ssi3_data),
+       SH_PFC_PIN_GROUP(ssi349_ctrl),
+       SH_PFC_PIN_GROUP(ssi4_data),
+       SH_PFC_PIN_GROUP(ssi4_ctrl),
+       SH_PFC_PIN_GROUP(ssi5_data),
+       SH_PFC_PIN_GROUP(ssi5_ctrl),
+       SH_PFC_PIN_GROUP(ssi6_data),
+       SH_PFC_PIN_GROUP(ssi6_ctrl),
+       SH_PFC_PIN_GROUP(ssi7_data),
+       SH_PFC_PIN_GROUP(ssi78_ctrl),
+       SH_PFC_PIN_GROUP(ssi8_data),
+       SH_PFC_PIN_GROUP(ssi9_data_a),
+       SH_PFC_PIN_GROUP(ssi9_data_b),
+       SH_PFC_PIN_GROUP(ssi9_ctrl_a),
+       SH_PFC_PIN_GROUP(ssi9_ctrl_b),
+       SH_PFC_PIN_GROUP(tmu_tclk1_a),
+       SH_PFC_PIN_GROUP(tmu_tclk1_b),
+       SH_PFC_PIN_GROUP(tmu_tclk2_a),
+       SH_PFC_PIN_GROUP(tmu_tclk2_b),
+       SH_PFC_PIN_GROUP(usb0),
+       SH_PFC_PIN_GROUP(usb1),
+       SH_PFC_PIN_GROUP(usb30),
+       VIN_DATA_PIN_GROUP(vin4_data, 8, _a),
+       VIN_DATA_PIN_GROUP(vin4_data, 10, _a),
+       VIN_DATA_PIN_GROUP(vin4_data, 12, _a),
+       VIN_DATA_PIN_GROUP(vin4_data, 16, _a),
+       SH_PFC_PIN_GROUP(vin4_data18_a),
+       VIN_DATA_PIN_GROUP(vin4_data, 20, _a),
+       VIN_DATA_PIN_GROUP(vin4_data, 24, _a),
+       VIN_DATA_PIN_GROUP(vin4_data, 8, _b),
+       VIN_DATA_PIN_GROUP(vin4_data, 10, _b),
+       VIN_DATA_PIN_GROUP(vin4_data, 12, _b),
+       VIN_DATA_PIN_GROUP(vin4_data, 16, _b),
+       SH_PFC_PIN_GROUP(vin4_data18_b),
+       VIN_DATA_PIN_GROUP(vin4_data, 20, _b),
+       VIN_DATA_PIN_GROUP(vin4_data, 24, _b),
+       SH_PFC_PIN_GROUP(vin4_sync),
+       SH_PFC_PIN_GROUP(vin4_field),
+       SH_PFC_PIN_GROUP(vin4_clkenb),
+       SH_PFC_PIN_GROUP(vin4_clk),
+       VIN_DATA_PIN_GROUP(vin5_data, 8),
+       VIN_DATA_PIN_GROUP(vin5_data, 10),
+       VIN_DATA_PIN_GROUP(vin5_data, 12),
+       VIN_DATA_PIN_GROUP(vin5_data, 16),
+       SH_PFC_PIN_GROUP(vin5_sync),
+       SH_PFC_PIN_GROUP(vin5_field),
+       SH_PFC_PIN_GROUP(vin5_clkenb),
+       SH_PFC_PIN_GROUP(vin5_clk),
+};
+
+static const char * const audio_clk_groups[] = {
+       "audio_clk_a_a",
+       "audio_clk_a_b",
+       "audio_clk_a_c",
+       "audio_clk_b_a",
+       "audio_clk_b_b",
+       "audio_clk_c_a",
+       "audio_clk_c_b",
+       "audio_clkout_a",
+       "audio_clkout_b",
+       "audio_clkout_c",
+       "audio_clkout_d",
+       "audio_clkout1_a",
+       "audio_clkout1_b",
+       "audio_clkout2_a",
+       "audio_clkout2_b",
+       "audio_clkout3_a",
+       "audio_clkout3_b",
+};
+
+static const char * const avb_groups[] = {
+       "avb_link",
+       "avb_magic",
+       "avb_phy_int",
+       "avb_mdc",      /* Deprecated, please use "avb_mdio" instead */
+       "avb_mdio",
+       "avb_mii",
+       "avb_avtp_pps",
+       "avb_avtp_match_a",
+       "avb_avtp_capture_a",
+       "avb_avtp_match_b",
+       "avb_avtp_capture_b",
+};
+
+static const char * const can0_groups[] = {
+       "can0_data_a",
+       "can0_data_b",
+};
+
+static const char * const can1_groups[] = {
+       "can1_data",
+};
+
+static const char * const can_clk_groups[] = {
+       "can_clk",
+};
+
+static const char * const canfd0_groups[] = {
+       "canfd0_data_a",
+       "canfd0_data_b",
+};
+
+static const char * const canfd1_groups[] = {
+       "canfd1_data",
+};
+
+static const char * const drif0_groups[] = {
+       "drif0_ctrl_a",
+       "drif0_data0_a",
+       "drif0_data1_a",
+       "drif0_ctrl_b",
+       "drif0_data0_b",
+       "drif0_data1_b",
+       "drif0_ctrl_c",
+       "drif0_data0_c",
+       "drif0_data1_c",
+};
+
+static const char * const drif1_groups[] = {
+       "drif1_ctrl_a",
+       "drif1_data0_a",
+       "drif1_data1_a",
+       "drif1_ctrl_b",
+       "drif1_data0_b",
+       "drif1_data1_b",
+       "drif1_ctrl_c",
+       "drif1_data0_c",
+       "drif1_data1_c",
+};
+
+static const char * const drif2_groups[] = {
+       "drif2_ctrl_a",
+       "drif2_data0_a",
+       "drif2_data1_a",
+       "drif2_ctrl_b",
+       "drif2_data0_b",
+       "drif2_data1_b",
+};
+
+static const char * const drif3_groups[] = {
+       "drif3_ctrl_a",
+       "drif3_data0_a",
+       "drif3_data1_a",
+       "drif3_ctrl_b",
+       "drif3_data0_b",
+       "drif3_data1_b",
+};
+
+static const char * const du_groups[] = {
+       "du_rgb666",
+       "du_rgb888",
+       "du_clk_out_0",
+       "du_clk_out_1",
+       "du_sync",
+       "du_oddf",
+       "du_cde",
+       "du_disp",
+};
+
+static const char * const hscif0_groups[] = {
+       "hscif0_data",
+       "hscif0_clk",
+       "hscif0_ctrl",
+};
+
+static const char * const hscif1_groups[] = {
+       "hscif1_data_a",
+       "hscif1_clk_a",
+       "hscif1_ctrl_a",
+       "hscif1_data_b",
+       "hscif1_clk_b",
+       "hscif1_ctrl_b",
+};
+
+static const char * const hscif2_groups[] = {
+       "hscif2_data_a",
+       "hscif2_clk_a",
+       "hscif2_ctrl_a",
+       "hscif2_data_b",
+       "hscif2_clk_b",
+       "hscif2_ctrl_b",
+       "hscif2_data_c",
+       "hscif2_clk_c",
+       "hscif2_ctrl_c",
+};
+
+static const char * const hscif3_groups[] = {
+       "hscif3_data_a",
+       "hscif3_clk",
+       "hscif3_ctrl",
+       "hscif3_data_b",
+       "hscif3_data_c",
+       "hscif3_data_d",
+};
+
+static const char * const hscif4_groups[] = {
+       "hscif4_data_a",
+       "hscif4_clk",
+       "hscif4_ctrl",
+       "hscif4_data_b",
+};
+
+static const char * const i2c1_groups[] = {
+       "i2c1_a",
+       "i2c1_b",
+};
+
+static const char * const i2c2_groups[] = {
+       "i2c2_a",
+       "i2c2_b",
+};
+
+static const char * const i2c6_groups[] = {
+       "i2c6_a",
+       "i2c6_b",
+       "i2c6_c",
+};
+
+static const char * const intc_ex_groups[] = {
+       "intc_ex_irq0",
+       "intc_ex_irq1",
+       "intc_ex_irq2",
+       "intc_ex_irq3",
+       "intc_ex_irq4",
+       "intc_ex_irq5",
+};
+
+static const char * const msiof0_groups[] = {
+       "msiof0_clk",
+       "msiof0_sync",
+       "msiof0_ss1",
+       "msiof0_ss2",
+       "msiof0_txd",
+       "msiof0_rxd",
+};
+
+static const char * const msiof1_groups[] = {
+       "msiof1_clk_a",
+       "msiof1_sync_a",
+       "msiof1_ss1_a",
+       "msiof1_ss2_a",
+       "msiof1_txd_a",
+       "msiof1_rxd_a",
+       "msiof1_clk_b",
+       "msiof1_sync_b",
+       "msiof1_ss1_b",
+       "msiof1_ss2_b",
+       "msiof1_txd_b",
+       "msiof1_rxd_b",
+       "msiof1_clk_c",
+       "msiof1_sync_c",
+       "msiof1_ss1_c",
+       "msiof1_ss2_c",
+       "msiof1_txd_c",
+       "msiof1_rxd_c",
+       "msiof1_clk_d",
+       "msiof1_sync_d",
+       "msiof1_ss1_d",
+       "msiof1_ss2_d",
+       "msiof1_txd_d",
+       "msiof1_rxd_d",
+       "msiof1_clk_e",
+       "msiof1_sync_e",
+       "msiof1_ss1_e",
+       "msiof1_ss2_e",
+       "msiof1_txd_e",
+       "msiof1_rxd_e",
+       "msiof1_clk_f",
+       "msiof1_sync_f",
+       "msiof1_ss1_f",
+       "msiof1_ss2_f",
+       "msiof1_txd_f",
+       "msiof1_rxd_f",
+       "msiof1_clk_g",
+       "msiof1_sync_g",
+       "msiof1_ss1_g",
+       "msiof1_ss2_g",
+       "msiof1_txd_g",
+       "msiof1_rxd_g",
+};
+
+static const char * const msiof2_groups[] = {
+       "msiof2_clk_a",
+       "msiof2_sync_a",
+       "msiof2_ss1_a",
+       "msiof2_ss2_a",
+       "msiof2_txd_a",
+       "msiof2_rxd_a",
+       "msiof2_clk_b",
+       "msiof2_sync_b",
+       "msiof2_ss1_b",
+       "msiof2_ss2_b",
+       "msiof2_txd_b",
+       "msiof2_rxd_b",
+       "msiof2_clk_c",
+       "msiof2_sync_c",
+       "msiof2_ss1_c",
+       "msiof2_ss2_c",
+       "msiof2_txd_c",
+       "msiof2_rxd_c",
+       "msiof2_clk_d",
+       "msiof2_sync_d",
+       "msiof2_ss1_d",
+       "msiof2_ss2_d",
+       "msiof2_txd_d",
+       "msiof2_rxd_d",
+};
+
+static const char * const msiof3_groups[] = {
+       "msiof3_clk_a",
+       "msiof3_sync_a",
+       "msiof3_ss1_a",
+       "msiof3_ss2_a",
+       "msiof3_txd_a",
+       "msiof3_rxd_a",
+       "msiof3_clk_b",
+       "msiof3_sync_b",
+       "msiof3_ss1_b",
+       "msiof3_ss2_b",
+       "msiof3_txd_b",
+       "msiof3_rxd_b",
+       "msiof3_clk_c",
+       "msiof3_sync_c",
+       "msiof3_txd_c",
+       "msiof3_rxd_c",
+       "msiof3_clk_d",
+       "msiof3_sync_d",
+       "msiof3_ss1_d",
+       "msiof3_txd_d",
+       "msiof3_rxd_d",
+       "msiof3_clk_e",
+       "msiof3_sync_e",
+       "msiof3_ss1_e",
+       "msiof3_ss2_e",
+       "msiof3_txd_e",
+       "msiof3_rxd_e",
+};
+
+static const char * const pwm0_groups[] = {
+       "pwm0",
+};
+
+static const char * const pwm1_groups[] = {
+       "pwm1_a",
+       "pwm1_b",
+};
+
+static const char * const pwm2_groups[] = {
+       "pwm2_a",
+       "pwm2_b",
+};
+
+static const char * const pwm3_groups[] = {
+       "pwm3_a",
+       "pwm3_b",
+};
+
+static const char * const pwm4_groups[] = {
+       "pwm4_a",
+       "pwm4_b",
+};
+
+static const char * const pwm5_groups[] = {
+       "pwm5_a",
+       "pwm5_b",
+};
+
+static const char * const pwm6_groups[] = {
+       "pwm6_a",
+       "pwm6_b",
+};
+
+static const char * const sata0_groups[] = {
+       "sata0_devslp_a",
+       "sata0_devslp_b",
+};
+
+static const char * const scif0_groups[] = {
+       "scif0_data",
+       "scif0_clk",
+       "scif0_ctrl",
+};
+
+static const char * const scif1_groups[] = {
+       "scif1_data_a",
+       "scif1_clk",
+       "scif1_ctrl",
+       "scif1_data_b",
+};
+static const char * const scif2_groups[] = {
+       "scif2_data_a",
+       "scif2_clk",
+       "scif2_data_b",
+};
+
+static const char * const scif3_groups[] = {
+       "scif3_data_a",
+       "scif3_clk",
+       "scif3_ctrl",
+       "scif3_data_b",
+};
+
+static const char * const scif4_groups[] = {
+       "scif4_data_a",
+       "scif4_clk_a",
+       "scif4_ctrl_a",
+       "scif4_data_b",
+       "scif4_clk_b",
+       "scif4_ctrl_b",
+       "scif4_data_c",
+       "scif4_clk_c",
+       "scif4_ctrl_c",
+};
+
+static const char * const scif5_groups[] = {
+       "scif5_data_a",
+       "scif5_clk_a",
+       "scif5_data_b",
+       "scif5_clk_b",
+};
+
+static const char * const scif_clk_groups[] = {
+       "scif_clk_a",
+       "scif_clk_b",
+};
+
+static const char * const sdhi0_groups[] = {
+       "sdhi0_data1",
+       "sdhi0_data4",
+       "sdhi0_ctrl",
+       "sdhi0_cd",
+       "sdhi0_wp",
+};
+
+static const char * const sdhi1_groups[] = {
+       "sdhi1_data1",
+       "sdhi1_data4",
+       "sdhi1_ctrl",
+       "sdhi1_cd",
+       "sdhi1_wp",
+};
+
+static const char * const sdhi2_groups[] = {
+       "sdhi2_data1",
+       "sdhi2_data4",
+       "sdhi2_data8",
+       "sdhi2_ctrl",
+       "sdhi2_cd_a",
+       "sdhi2_wp_a",
+       "sdhi2_cd_b",
+       "sdhi2_wp_b",
+       "sdhi2_ds",
+};
+
+static const char * const sdhi3_groups[] = {
+       "sdhi3_data1",
+       "sdhi3_data4",
+       "sdhi3_data8",
+       "sdhi3_ctrl",
+       "sdhi3_cd",
+       "sdhi3_wp",
+       "sdhi3_ds",
+};
+
+static const char * const ssi_groups[] = {
+       "ssi0_data",
+       "ssi01239_ctrl",
+       "ssi1_data_a",
+       "ssi1_data_b",
+       "ssi1_ctrl_a",
+       "ssi1_ctrl_b",
+       "ssi2_data_a",
+       "ssi2_data_b",
+       "ssi2_ctrl_a",
+       "ssi2_ctrl_b",
+       "ssi3_data",
+       "ssi349_ctrl",
+       "ssi4_data",
+       "ssi4_ctrl",
+       "ssi5_data",
+       "ssi5_ctrl",
+       "ssi6_data",
+       "ssi6_ctrl",
+       "ssi7_data",
+       "ssi78_ctrl",
+       "ssi8_data",
+       "ssi9_data_a",
+       "ssi9_data_b",
+       "ssi9_ctrl_a",
+       "ssi9_ctrl_b",
+};
+
+static const char * const tmu_groups[] = {
+       "tmu_tclk1_a",
+       "tmu_tclk1_b",
+       "tmu_tclk2_a",
+       "tmu_tclk2_b",
+};
+
+static const char * const usb0_groups[] = {
+       "usb0",
+};
+
+static const char * const usb1_groups[] = {
+       "usb1",
+};
+
+static const char * const usb30_groups[] = {
+       "usb30",
+};
+
+static const char * const vin4_groups[] = {
+       "vin4_data8_a",
+       "vin4_data10_a",
+       "vin4_data12_a",
+       "vin4_data16_a",
+       "vin4_data18_a",
+       "vin4_data20_a",
+       "vin4_data24_a",
+       "vin4_data8_b",
+       "vin4_data10_b",
+       "vin4_data12_b",
+       "vin4_data16_b",
+       "vin4_data18_b",
+       "vin4_data20_b",
+       "vin4_data24_b",
+       "vin4_sync",
+       "vin4_field",
+       "vin4_clkenb",
+       "vin4_clk",
+};
+
+static const char * const vin5_groups[] = {
+       "vin5_data8",
+       "vin5_data10",
+       "vin5_data12",
+       "vin5_data16",
+       "vin5_sync",
+       "vin5_field",
+       "vin5_clkenb",
+       "vin5_clk",
+};
+
+static const struct sh_pfc_function pinmux_functions[] = {
+       SH_PFC_FUNCTION(audio_clk),
+       SH_PFC_FUNCTION(avb),
+       SH_PFC_FUNCTION(can0),
+       SH_PFC_FUNCTION(can1),
+       SH_PFC_FUNCTION(can_clk),
+       SH_PFC_FUNCTION(canfd0),
+       SH_PFC_FUNCTION(canfd1),
+       SH_PFC_FUNCTION(drif0),
+       SH_PFC_FUNCTION(drif1),
+       SH_PFC_FUNCTION(drif2),
+       SH_PFC_FUNCTION(drif3),
+       SH_PFC_FUNCTION(du),
+       SH_PFC_FUNCTION(hscif0),
+       SH_PFC_FUNCTION(hscif1),
+       SH_PFC_FUNCTION(hscif2),
+       SH_PFC_FUNCTION(hscif3),
+       SH_PFC_FUNCTION(hscif4),
+       SH_PFC_FUNCTION(i2c1),
+       SH_PFC_FUNCTION(i2c2),
+       SH_PFC_FUNCTION(i2c6),
+       SH_PFC_FUNCTION(intc_ex),
+       SH_PFC_FUNCTION(msiof0),
+       SH_PFC_FUNCTION(msiof1),
+       SH_PFC_FUNCTION(msiof2),
+       SH_PFC_FUNCTION(msiof3),
+       SH_PFC_FUNCTION(pwm0),
+       SH_PFC_FUNCTION(pwm1),
+       SH_PFC_FUNCTION(pwm2),
+       SH_PFC_FUNCTION(pwm3),
+       SH_PFC_FUNCTION(pwm4),
+       SH_PFC_FUNCTION(pwm5),
+       SH_PFC_FUNCTION(pwm6),
+       SH_PFC_FUNCTION(sata0),
+       SH_PFC_FUNCTION(scif0),
+       SH_PFC_FUNCTION(scif1),
+       SH_PFC_FUNCTION(scif2),
+       SH_PFC_FUNCTION(scif3),
+       SH_PFC_FUNCTION(scif4),
+       SH_PFC_FUNCTION(scif5),
+       SH_PFC_FUNCTION(scif_clk),
+       SH_PFC_FUNCTION(sdhi0),
+       SH_PFC_FUNCTION(sdhi1),
+       SH_PFC_FUNCTION(sdhi2),
+       SH_PFC_FUNCTION(sdhi3),
+       SH_PFC_FUNCTION(ssi),
+       SH_PFC_FUNCTION(tmu),
+       SH_PFC_FUNCTION(usb0),
+       SH_PFC_FUNCTION(usb1),
+       SH_PFC_FUNCTION(usb30),
+       SH_PFC_FUNCTION(vin4),
+       SH_PFC_FUNCTION(vin5),
+};
+
+static const struct pinmux_cfg_reg pinmux_config_regs[] = {
+#define F_(x, y)       FN_##y
+#define FM(x)          FN_##x
+       { PINMUX_CFG_REG("GPSR0", 0xe6060100, 32, 1) {
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               GP_0_15_FN,     GPSR0_15,
+               GP_0_14_FN,     GPSR0_14,
+               GP_0_13_FN,     GPSR0_13,
+               GP_0_12_FN,     GPSR0_12,
+               GP_0_11_FN,     GPSR0_11,
+               GP_0_10_FN,     GPSR0_10,
+               GP_0_9_FN,      GPSR0_9,
+               GP_0_8_FN,      GPSR0_8,
+               GP_0_7_FN,      GPSR0_7,
+               GP_0_6_FN,      GPSR0_6,
+               GP_0_5_FN,      GPSR0_5,
+               GP_0_4_FN,      GPSR0_4,
+               GP_0_3_FN,      GPSR0_3,
+               GP_0_2_FN,      GPSR0_2,
+               GP_0_1_FN,      GPSR0_1,
+               GP_0_0_FN,      GPSR0_0, }
+       },
+       { PINMUX_CFG_REG("GPSR1", 0xe6060104, 32, 1) {
+               0, 0,
+               0, 0,
+               0, 0,
+               GP_1_28_FN,     GPSR1_28,
+               GP_1_27_FN,     GPSR1_27,
+               GP_1_26_FN,     GPSR1_26,
+               GP_1_25_FN,     GPSR1_25,
+               GP_1_24_FN,     GPSR1_24,
+               GP_1_23_FN,     GPSR1_23,
+               GP_1_22_FN,     GPSR1_22,
+               GP_1_21_FN,     GPSR1_21,
+               GP_1_20_FN,     GPSR1_20,
+               GP_1_19_FN,     GPSR1_19,
+               GP_1_18_FN,     GPSR1_18,
+               GP_1_17_FN,     GPSR1_17,
+               GP_1_16_FN,     GPSR1_16,
+               GP_1_15_FN,     GPSR1_15,
+               GP_1_14_FN,     GPSR1_14,
+               GP_1_13_FN,     GPSR1_13,
+               GP_1_12_FN,     GPSR1_12,
+               GP_1_11_FN,     GPSR1_11,
+               GP_1_10_FN,     GPSR1_10,
+               GP_1_9_FN,      GPSR1_9,
+               GP_1_8_FN,      GPSR1_8,
+               GP_1_7_FN,      GPSR1_7,
+               GP_1_6_FN,      GPSR1_6,
+               GP_1_5_FN,      GPSR1_5,
+               GP_1_4_FN,      GPSR1_4,
+               GP_1_3_FN,      GPSR1_3,
+               GP_1_2_FN,      GPSR1_2,
+               GP_1_1_FN,      GPSR1_1,
+               GP_1_0_FN,      GPSR1_0, }
+       },
+       { PINMUX_CFG_REG("GPSR2", 0xe6060108, 32, 1) {
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               GP_2_14_FN,     GPSR2_14,
+               GP_2_13_FN,     GPSR2_13,
+               GP_2_12_FN,     GPSR2_12,
+               GP_2_11_FN,     GPSR2_11,
+               GP_2_10_FN,     GPSR2_10,
+               GP_2_9_FN,      GPSR2_9,
+               GP_2_8_FN,      GPSR2_8,
+               GP_2_7_FN,      GPSR2_7,
+               GP_2_6_FN,      GPSR2_6,
+               GP_2_5_FN,      GPSR2_5,
+               GP_2_4_FN,      GPSR2_4,
+               GP_2_3_FN,      GPSR2_3,
+               GP_2_2_FN,      GPSR2_2,
+               GP_2_1_FN,      GPSR2_1,
+               GP_2_0_FN,      GPSR2_0, }
+       },
+       { PINMUX_CFG_REG("GPSR3", 0xe606010c, 32, 1) {
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               GP_3_15_FN,     GPSR3_15,
+               GP_3_14_FN,     GPSR3_14,
+               GP_3_13_FN,     GPSR3_13,
+               GP_3_12_FN,     GPSR3_12,
+               GP_3_11_FN,     GPSR3_11,
+               GP_3_10_FN,     GPSR3_10,
+               GP_3_9_FN,      GPSR3_9,
+               GP_3_8_FN,      GPSR3_8,
+               GP_3_7_FN,      GPSR3_7,
+               GP_3_6_FN,      GPSR3_6,
+               GP_3_5_FN,      GPSR3_5,
+               GP_3_4_FN,      GPSR3_4,
+               GP_3_3_FN,      GPSR3_3,
+               GP_3_2_FN,      GPSR3_2,
+               GP_3_1_FN,      GPSR3_1,
+               GP_3_0_FN,      GPSR3_0, }
+       },
+       { PINMUX_CFG_REG("GPSR4", 0xe6060110, 32, 1) {
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               GP_4_17_FN,     GPSR4_17,
+               GP_4_16_FN,     GPSR4_16,
+               GP_4_15_FN,     GPSR4_15,
+               GP_4_14_FN,     GPSR4_14,
+               GP_4_13_FN,     GPSR4_13,
+               GP_4_12_FN,     GPSR4_12,
+               GP_4_11_FN,     GPSR4_11,
+               GP_4_10_FN,     GPSR4_10,
+               GP_4_9_FN,      GPSR4_9,
+               GP_4_8_FN,      GPSR4_8,
+               GP_4_7_FN,      GPSR4_7,
+               GP_4_6_FN,      GPSR4_6,
+               GP_4_5_FN,      GPSR4_5,
+               GP_4_4_FN,      GPSR4_4,
+               GP_4_3_FN,      GPSR4_3,
+               GP_4_2_FN,      GPSR4_2,
+               GP_4_1_FN,      GPSR4_1,
+               GP_4_0_FN,      GPSR4_0, }
+       },
+       { PINMUX_CFG_REG("GPSR5", 0xe6060114, 32, 1) {
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               GP_5_25_FN,     GPSR5_25,
+               GP_5_24_FN,     GPSR5_24,
+               GP_5_23_FN,     GPSR5_23,
+               GP_5_22_FN,     GPSR5_22,
+               GP_5_21_FN,     GPSR5_21,
+               GP_5_20_FN,     GPSR5_20,
+               GP_5_19_FN,     GPSR5_19,
+               GP_5_18_FN,     GPSR5_18,
+               GP_5_17_FN,     GPSR5_17,
+               GP_5_16_FN,     GPSR5_16,
+               GP_5_15_FN,     GPSR5_15,
+               GP_5_14_FN,     GPSR5_14,
+               GP_5_13_FN,     GPSR5_13,
+               GP_5_12_FN,     GPSR5_12,
+               GP_5_11_FN,     GPSR5_11,
+               GP_5_10_FN,     GPSR5_10,
+               GP_5_9_FN,      GPSR5_9,
+               GP_5_8_FN,      GPSR5_8,
+               GP_5_7_FN,      GPSR5_7,
+               GP_5_6_FN,      GPSR5_6,
+               GP_5_5_FN,      GPSR5_5,
+               GP_5_4_FN,      GPSR5_4,
+               GP_5_3_FN,      GPSR5_3,
+               GP_5_2_FN,      GPSR5_2,
+               GP_5_1_FN,      GPSR5_1,
+               GP_5_0_FN,      GPSR5_0, }
+       },
+       { PINMUX_CFG_REG("GPSR6", 0xe6060118, 32, 1) {
+               GP_6_31_FN,     GPSR6_31,
+               GP_6_30_FN,     GPSR6_30,
+               GP_6_29_FN,     GPSR6_29,
+               GP_6_28_FN,     GPSR6_28,
+               GP_6_27_FN,     GPSR6_27,
+               GP_6_26_FN,     GPSR6_26,
+               GP_6_25_FN,     GPSR6_25,
+               GP_6_24_FN,     GPSR6_24,
+               GP_6_23_FN,     GPSR6_23,
+               GP_6_22_FN,     GPSR6_22,
+               GP_6_21_FN,     GPSR6_21,
+               GP_6_20_FN,     GPSR6_20,
+               GP_6_19_FN,     GPSR6_19,
+               GP_6_18_FN,     GPSR6_18,
+               GP_6_17_FN,     GPSR6_17,
+               GP_6_16_FN,     GPSR6_16,
+               GP_6_15_FN,     GPSR6_15,
+               GP_6_14_FN,     GPSR6_14,
+               GP_6_13_FN,     GPSR6_13,
+               GP_6_12_FN,     GPSR6_12,
+               GP_6_11_FN,     GPSR6_11,
+               GP_6_10_FN,     GPSR6_10,
+               GP_6_9_FN,      GPSR6_9,
+               GP_6_8_FN,      GPSR6_8,
+               GP_6_7_FN,      GPSR6_7,
+               GP_6_6_FN,      GPSR6_6,
+               GP_6_5_FN,      GPSR6_5,
+               GP_6_4_FN,      GPSR6_4,
+               GP_6_3_FN,      GPSR6_3,
+               GP_6_2_FN,      GPSR6_2,
+               GP_6_1_FN,      GPSR6_1,
+               GP_6_0_FN,      GPSR6_0, }
+       },
+       { PINMUX_CFG_REG("GPSR7", 0xe606011c, 32, 1) {
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               GP_7_3_FN, GPSR7_3,
+               GP_7_2_FN, GPSR7_2,
+               GP_7_1_FN, GPSR7_1,
+               GP_7_0_FN, GPSR7_0, }
+       },
+#undef F_
+#undef FM
+
+#define F_(x, y)       x,
+#define FM(x)          FN_##x,
+       { PINMUX_CFG_REG("IPSR0", 0xe6060200, 32, 4) {
+               IP0_31_28
+               IP0_27_24
+               IP0_23_20
+               IP0_19_16
+               IP0_15_12
+               IP0_11_8
+               IP0_7_4
+               IP0_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR1", 0xe6060204, 32, 4) {
+               IP1_31_28
+               IP1_27_24
+               IP1_23_20
+               IP1_19_16
+               IP1_15_12
+               IP1_11_8
+               IP1_7_4
+               IP1_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR2", 0xe6060208, 32, 4) {
+               IP2_31_28
+               IP2_27_24
+               IP2_23_20
+               IP2_19_16
+               IP2_15_12
+               IP2_11_8
+               IP2_7_4
+               IP2_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR3", 0xe606020c, 32, 4) {
+               IP3_31_28
+               IP3_27_24
+               IP3_23_20
+               IP3_19_16
+               IP3_15_12
+               IP3_11_8
+               IP3_7_4
+               IP3_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR4", 0xe6060210, 32, 4) {
+               IP4_31_28
+               IP4_27_24
+               IP4_23_20
+               IP4_19_16
+               IP4_15_12
+               IP4_11_8
+               IP4_7_4
+               IP4_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR5", 0xe6060214, 32, 4) {
+               IP5_31_28
+               IP5_27_24
+               IP5_23_20
+               IP5_19_16
+               IP5_15_12
+               IP5_11_8
+               IP5_7_4
+               IP5_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR6", 0xe6060218, 32, 4) {
+               IP6_31_28
+               IP6_27_24
+               IP6_23_20
+               IP6_19_16
+               IP6_15_12
+               IP6_11_8
+               IP6_7_4
+               IP6_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR7", 0xe606021c, 32, 4) {
+               IP7_31_28
+               IP7_27_24
+               IP7_23_20
+               IP7_19_16
+               /* IP7_15_12 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               IP7_11_8
+               IP7_7_4
+               IP7_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR8", 0xe6060220, 32, 4) {
+               IP8_31_28
+               IP8_27_24
+               IP8_23_20
+               IP8_19_16
+               IP8_15_12
+               IP8_11_8
+               IP8_7_4
+               IP8_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR9", 0xe6060224, 32, 4) {
+               IP9_31_28
+               IP9_27_24
+               IP9_23_20
+               IP9_19_16
+               IP9_15_12
+               IP9_11_8
+               IP9_7_4
+               IP9_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR10", 0xe6060228, 32, 4) {
+               IP10_31_28
+               IP10_27_24
+               IP10_23_20
+               IP10_19_16
+               IP10_15_12
+               IP10_11_8
+               IP10_7_4
+               IP10_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR11", 0xe606022c, 32, 4) {
+               IP11_31_28
+               IP11_27_24
+               IP11_23_20
+               IP11_19_16
+               IP11_15_12
+               IP11_11_8
+               IP11_7_4
+               IP11_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR12", 0xe6060230, 32, 4) {
+               IP12_31_28
+               IP12_27_24
+               IP12_23_20
+               IP12_19_16
+               IP12_15_12
+               IP12_11_8
+               IP12_7_4
+               IP12_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR13", 0xe6060234, 32, 4) {
+               IP13_31_28
+               IP13_27_24
+               IP13_23_20
+               IP13_19_16
+               IP13_15_12
+               IP13_11_8
+               IP13_7_4
+               IP13_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR14", 0xe6060238, 32, 4) {
+               IP14_31_28
+               IP14_27_24
+               IP14_23_20
+               IP14_19_16
+               IP14_15_12
+               IP14_11_8
+               IP14_7_4
+               IP14_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR15", 0xe606023c, 32, 4) {
+               IP15_31_28
+               IP15_27_24
+               IP15_23_20
+               IP15_19_16
+               IP15_15_12
+               IP15_11_8
+               IP15_7_4
+               IP15_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR16", 0xe6060240, 32, 4) {
+               IP16_31_28
+               IP16_27_24
+               IP16_23_20
+               IP16_19_16
+               IP16_15_12
+               IP16_11_8
+               IP16_7_4
+               IP16_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR17", 0xe6060244, 32, 4) {
+               IP17_31_28
+               IP17_27_24
+               IP17_23_20
+               IP17_19_16
+               IP17_15_12
+               IP17_11_8
+               IP17_7_4
+               IP17_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR18", 0xe6060248, 32, 4) {
+               /* IP18_31_28 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP18_27_24 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP18_23_20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP18_19_16 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP18_15_12 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP18_11_8  */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               IP18_7_4
+               IP18_3_0 }
+       },
+#undef F_
+#undef FM
+
+#define F_(x, y)       x,
+#define FM(x)          FN_##x,
+       { PINMUX_CFG_REG_VAR("MOD_SEL0", 0xe6060500, 32,
+                            3, 2, 3, 1, 1, 1, 1, 1, 2, 1,
+                            1, 2, 1, 1, 1, 2, 2, 1, 2, 3) {
+               MOD_SEL0_31_30_29
+               MOD_SEL0_28_27
+               MOD_SEL0_26_25_24
+               MOD_SEL0_23
+               MOD_SEL0_22
+               MOD_SEL0_21
+               MOD_SEL0_20
+               MOD_SEL0_19
+               MOD_SEL0_18_17
+               MOD_SEL0_16
+               0, 0, /* RESERVED 15 */
+               MOD_SEL0_14_13
+               MOD_SEL0_12
+               MOD_SEL0_11
+               MOD_SEL0_10
+               MOD_SEL0_9_8
+               MOD_SEL0_7_6
+               MOD_SEL0_5
+               MOD_SEL0_4_3
+               /* RESERVED 2, 1, 0 */
+               0, 0, 0, 0, 0, 0, 0, 0 }
+       },
+       { PINMUX_CFG_REG_VAR("MOD_SEL1", 0xe6060504, 32,
+                            2, 3, 1, 2, 3, 1, 1, 2, 1,
+                            2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1) {
+               MOD_SEL1_31_30
+               MOD_SEL1_29_28_27
+               MOD_SEL1_26
+               MOD_SEL1_25_24
+               MOD_SEL1_23_22_21
+               MOD_SEL1_20
+               MOD_SEL1_19
+               MOD_SEL1_18_17
+               MOD_SEL1_16
+               MOD_SEL1_15_14
+               MOD_SEL1_13
+               MOD_SEL1_12
+               MOD_SEL1_11
+               MOD_SEL1_10
+               MOD_SEL1_9
+               0, 0, 0, 0, /* RESERVED 8, 7 */
+               MOD_SEL1_6
+               MOD_SEL1_5
+               MOD_SEL1_4
+               MOD_SEL1_3
+               MOD_SEL1_2
+               MOD_SEL1_1
+               MOD_SEL1_0 }
+       },
+       { PINMUX_CFG_REG_VAR("MOD_SEL2", 0xe6060508, 32,
+                            1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1,
+                            4, 4, 4, 3, 1) {
+               MOD_SEL2_31
+               MOD_SEL2_30
+               MOD_SEL2_29
+               MOD_SEL2_28_27
+               MOD_SEL2_26
+               MOD_SEL2_25_24_23
+               MOD_SEL2_22
+               MOD_SEL2_21
+               MOD_SEL2_20
+               MOD_SEL2_19
+               MOD_SEL2_18
+               MOD_SEL2_17
+               /* RESERVED 16 */
+               0, 0,
+               /* RESERVED 15, 14, 13, 12 */
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               /* RESERVED 11, 10, 9, 8 */
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               /* RESERVED 7, 6, 5, 4 */
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               /* RESERVED 3, 2, 1 */
+               0, 0, 0, 0, 0, 0, 0, 0,
+               MOD_SEL2_0 }
+       },
+       { },
+};
+
+static const struct pinmux_drive_reg pinmux_drive_regs[] = {
+       { PINMUX_DRIVE_REG("DRVCTRL0", 0xe6060300) {
+               { PIN_NUMBER('W', 3),   28, 2 },        /* QSPI0_SPCLK */
+               { PIN_A_NUMBER('C', 5), 24, 2 },        /* QSPI0_MOSI_IO0 */
+               { PIN_A_NUMBER('B', 4), 20, 2 },        /* QSPI0_MISO_IO1 */
+               { PIN_NUMBER('Y', 6),   16, 2 },        /* QSPI0_IO2 */
+               { PIN_A_NUMBER('B', 6), 12, 2 },        /* QSPI0_IO3 */
+               { PIN_NUMBER('Y', 3),    8, 2 },        /* QSPI0_SSL */
+               { PIN_NUMBER('V', 3),    4, 2 },        /* QSPI1_SPCLK */
+               { PIN_A_NUMBER('C', 7),  0, 2 },        /* QSPI1_MOSI_IO0 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL1", 0xe6060304) {
+               { PIN_A_NUMBER('E', 5), 28, 2 },        /* QSPI1_MISO_IO1 */
+               { PIN_A_NUMBER('E', 4), 24, 2 },        /* QSPI1_IO2 */
+               { PIN_A_NUMBER('C', 3), 20, 2 },        /* QSPI1_IO3 */
+               { PIN_NUMBER('V', 5),   16, 2 },        /* QSPI1_SSL */
+               { PIN_NUMBER('Y', 7),   12, 2 },        /* RPC_INT# */
+               { PIN_NUMBER('V', 6),    8, 2 },        /* RPC_WP# */
+               { PIN_NUMBER('V', 7),    4, 2 },        /* RPC_RESET# */
+               { PIN_NUMBER('A', 16),   0, 3 },        /* AVB_RX_CTL */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL2", 0xe6060308) {
+               { PIN_NUMBER('B', 19),  28, 3 },        /* AVB_RXC */
+               { PIN_NUMBER('A', 13),  24, 3 },        /* AVB_RD0 */
+               { PIN_NUMBER('B', 13),  20, 3 },        /* AVB_RD1 */
+               { PIN_NUMBER('A', 14),  16, 3 },        /* AVB_RD2 */
+               { PIN_NUMBER('B', 14),  12, 3 },        /* AVB_RD3 */
+               { PIN_NUMBER('A', 8),    8, 3 },        /* AVB_TX_CTL */
+               { PIN_NUMBER('A', 19),   4, 3 },        /* AVB_TXC */
+               { PIN_NUMBER('A', 18),   0, 3 },        /* AVB_TD0 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL3", 0xe606030c) {
+               { PIN_NUMBER('B', 18),  28, 3 },        /* AVB_TD1 */
+               { PIN_NUMBER('A', 17),  24, 3 },        /* AVB_TD2 */
+               { PIN_NUMBER('B', 17),  20, 3 },        /* AVB_TD3 */
+               { PIN_NUMBER('A', 12),  16, 3 },        /* AVB_TXCREFCLK */
+               { PIN_NUMBER('A', 9),   12, 3 },        /* AVB_MDIO */
+               { RCAR_GP_PIN(2,  9),    8, 3 },        /* AVB_MDC */
+               { RCAR_GP_PIN(2, 10),    4, 3 },        /* AVB_MAGIC */
+               { RCAR_GP_PIN(2, 11),    0, 3 },        /* AVB_PHY_INT */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL4", 0xe6060310) {
+               { RCAR_GP_PIN(2, 12), 28, 3 },  /* AVB_LINK */
+               { RCAR_GP_PIN(2, 13), 24, 3 },  /* AVB_AVTP_MATCH */
+               { RCAR_GP_PIN(2, 14), 20, 3 },  /* AVB_AVTP_CAPTURE */
+               { RCAR_GP_PIN(2,  0), 16, 3 },  /* IRQ0 */
+               { RCAR_GP_PIN(2,  1), 12, 3 },  /* IRQ1 */
+               { RCAR_GP_PIN(2,  2),  8, 3 },  /* IRQ2 */
+               { RCAR_GP_PIN(2,  3),  4, 3 },  /* IRQ3 */
+               { RCAR_GP_PIN(2,  4),  0, 3 },  /* IRQ4 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL5", 0xe6060314) {
+               { RCAR_GP_PIN(2,  5), 28, 3 },  /* IRQ5 */
+               { RCAR_GP_PIN(2,  6), 24, 3 },  /* PWM0 */
+               { RCAR_GP_PIN(2,  7), 20, 3 },  /* PWM1 */
+               { RCAR_GP_PIN(2,  8), 16, 3 },  /* PWM2 */
+               { RCAR_GP_PIN(1,  0), 12, 3 },  /* A0 */
+               { RCAR_GP_PIN(1,  1),  8, 3 },  /* A1 */
+               { RCAR_GP_PIN(1,  2),  4, 3 },  /* A2 */
+               { RCAR_GP_PIN(1,  3),  0, 3 },  /* A3 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL6", 0xe6060318) {
+               { RCAR_GP_PIN(1,  4), 28, 3 },  /* A4 */
+               { RCAR_GP_PIN(1,  5), 24, 3 },  /* A5 */
+               { RCAR_GP_PIN(1,  6), 20, 3 },  /* A6 */
+               { RCAR_GP_PIN(1,  7), 16, 3 },  /* A7 */
+               { RCAR_GP_PIN(1,  8), 12, 3 },  /* A8 */
+               { RCAR_GP_PIN(1,  9),  8, 3 },  /* A9 */
+               { RCAR_GP_PIN(1, 10),  4, 3 },  /* A10 */
+               { RCAR_GP_PIN(1, 11),  0, 3 },  /* A11 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL7", 0xe606031c) {
+               { RCAR_GP_PIN(1, 12), 28, 3 },  /* A12 */
+               { RCAR_GP_PIN(1, 13), 24, 3 },  /* A13 */
+               { RCAR_GP_PIN(1, 14), 20, 3 },  /* A14 */
+               { RCAR_GP_PIN(1, 15), 16, 3 },  /* A15 */
+               { RCAR_GP_PIN(1, 16), 12, 3 },  /* A16 */
+               { RCAR_GP_PIN(1, 17),  8, 3 },  /* A17 */
+               { RCAR_GP_PIN(1, 18),  4, 3 },  /* A18 */
+               { RCAR_GP_PIN(1, 19),  0, 3 },  /* A19 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL8", 0xe6060320) {
+               { RCAR_GP_PIN(1, 28), 28, 3 },  /* CLKOUT */
+               { RCAR_GP_PIN(1, 20), 24, 3 },  /* CS0 */
+               { RCAR_GP_PIN(1, 21), 20, 3 },  /* CS1_A26 */
+               { RCAR_GP_PIN(1, 22), 16, 3 },  /* BS */
+               { RCAR_GP_PIN(1, 23), 12, 3 },  /* RD */
+               { RCAR_GP_PIN(1, 24),  8, 3 },  /* RD_WR */
+               { RCAR_GP_PIN(1, 25),  4, 3 },  /* WE0 */
+               { RCAR_GP_PIN(1, 26),  0, 3 },  /* WE1 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL9", 0xe6060324) {
+               { RCAR_GP_PIN(1, 27), 28, 3 },  /* EX_WAIT0 */
+               { PIN_NUMBER('C', 1), 24, 3 },  /* PRESETOUT# */
+               { RCAR_GP_PIN(0,  0), 20, 3 },  /* D0 */
+               { RCAR_GP_PIN(0,  1), 16, 3 },  /* D1 */
+               { RCAR_GP_PIN(0,  2), 12, 3 },  /* D2 */
+               { RCAR_GP_PIN(0,  3),  8, 3 },  /* D3 */
+               { RCAR_GP_PIN(0,  4),  4, 3 },  /* D4 */
+               { RCAR_GP_PIN(0,  5),  0, 3 },  /* D5 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL10", 0xe6060328) {
+               { RCAR_GP_PIN(0,  6), 28, 3 },  /* D6 */
+               { RCAR_GP_PIN(0,  7), 24, 3 },  /* D7 */
+               { RCAR_GP_PIN(0,  8), 20, 3 },  /* D8 */
+               { RCAR_GP_PIN(0,  9), 16, 3 },  /* D9 */
+               { RCAR_GP_PIN(0, 10), 12, 3 },  /* D10 */
+               { RCAR_GP_PIN(0, 11),  8, 3 },  /* D11 */
+               { RCAR_GP_PIN(0, 12),  4, 3 },  /* D12 */
+               { RCAR_GP_PIN(0, 13),  0, 3 },  /* D13 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL11", 0xe606032c) {
+               { RCAR_GP_PIN(0, 14),   28, 3 },        /* D14 */
+               { RCAR_GP_PIN(0, 15),   24, 3 },        /* D15 */
+               { RCAR_GP_PIN(7,  0),   20, 3 },        /* AVS1 */
+               { RCAR_GP_PIN(7,  1),   16, 3 },        /* AVS2 */
+               { RCAR_GP_PIN(7,  2),   12, 3 },        /* HDMI0_CEC */
+               { RCAR_GP_PIN(7,  3),    8, 3 },        /* GP7_03 */
+               { PIN_A_NUMBER('P', 7),  4, 2 },        /* DU_DOTCLKIN0 */
+               { PIN_A_NUMBER('P', 8),  0, 2 },        /* DU_DOTCLKIN1 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL12", 0xe6060330) {
+               { PIN_A_NUMBER('R', 8),  28, 2 },       /* DU_DOTCLKIN3 */
+               { PIN_A_NUMBER('D', 38), 20, 2 },       /* FSCLKST */
+               { PIN_A_NUMBER('R', 30),  4, 2 },       /* TMS */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL13", 0xe6060334) {
+               { PIN_A_NUMBER('T', 28), 28, 2 },       /* TDO */
+               { PIN_A_NUMBER('T', 30), 24, 2 },       /* ASEBRK */
+               { RCAR_GP_PIN(3,  0),    20, 3 },       /* SD0_CLK */
+               { RCAR_GP_PIN(3,  1),    16, 3 },       /* SD0_CMD */
+               { RCAR_GP_PIN(3,  2),    12, 3 },       /* SD0_DAT0 */
+               { RCAR_GP_PIN(3,  3),     8, 3 },       /* SD0_DAT1 */
+               { RCAR_GP_PIN(3,  4),     4, 3 },       /* SD0_DAT2 */
+               { RCAR_GP_PIN(3,  5),     0, 3 },       /* SD0_DAT3 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL14", 0xe6060338) {
+               { RCAR_GP_PIN(3,  6), 28, 3 },  /* SD1_CLK */
+               { RCAR_GP_PIN(3,  7), 24, 3 },  /* SD1_CMD */
+               { RCAR_GP_PIN(3,  8), 20, 3 },  /* SD1_DAT0 */
+               { RCAR_GP_PIN(3,  9), 16, 3 },  /* SD1_DAT1 */
+               { RCAR_GP_PIN(3, 10), 12, 3 },  /* SD1_DAT2 */
+               { RCAR_GP_PIN(3, 11),  8, 3 },  /* SD1_DAT3 */
+               { RCAR_GP_PIN(4,  0),  4, 3 },  /* SD2_CLK */
+               { RCAR_GP_PIN(4,  1),  0, 3 },  /* SD2_CMD */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL15", 0xe606033c) {
+               { RCAR_GP_PIN(4,  2), 28, 3 },  /* SD2_DAT0 */
+               { RCAR_GP_PIN(4,  3), 24, 3 },  /* SD2_DAT1 */
+               { RCAR_GP_PIN(4,  4), 20, 3 },  /* SD2_DAT2 */
+               { RCAR_GP_PIN(4,  5), 16, 3 },  /* SD2_DAT3 */
+               { RCAR_GP_PIN(4,  6), 12, 3 },  /* SD2_DS */
+               { RCAR_GP_PIN(4,  7),  8, 3 },  /* SD3_CLK */
+               { RCAR_GP_PIN(4,  8),  4, 3 },  /* SD3_CMD */
+               { RCAR_GP_PIN(4,  9),  0, 3 },  /* SD3_DAT0 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL16", 0xe6060340) {
+               { RCAR_GP_PIN(4, 10), 28, 3 },  /* SD3_DAT1 */
+               { RCAR_GP_PIN(4, 11), 24, 3 },  /* SD3_DAT2 */
+               { RCAR_GP_PIN(4, 12), 20, 3 },  /* SD3_DAT3 */
+               { RCAR_GP_PIN(4, 13), 16, 3 },  /* SD3_DAT4 */
+               { RCAR_GP_PIN(4, 14), 12, 3 },  /* SD3_DAT5 */
+               { RCAR_GP_PIN(4, 15),  8, 3 },  /* SD3_DAT6 */
+               { RCAR_GP_PIN(4, 16),  4, 3 },  /* SD3_DAT7 */
+               { RCAR_GP_PIN(4, 17),  0, 3 },  /* SD3_DS */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL17", 0xe6060344) {
+               { RCAR_GP_PIN(3, 12), 28, 3 },  /* SD0_CD */
+               { RCAR_GP_PIN(3, 13), 24, 3 },  /* SD0_WP */
+               { RCAR_GP_PIN(3, 14), 20, 3 },  /* SD1_CD */
+               { RCAR_GP_PIN(3, 15), 16, 3 },  /* SD1_WP */
+               { RCAR_GP_PIN(5,  0), 12, 3 },  /* SCK0 */
+               { RCAR_GP_PIN(5,  1),  8, 3 },  /* RX0 */
+               { RCAR_GP_PIN(5,  2),  4, 3 },  /* TX0 */
+               { RCAR_GP_PIN(5,  3),  0, 3 },  /* CTS0 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL18", 0xe6060348) {
+               { RCAR_GP_PIN(5,  4), 28, 3 },  /* RTS0 */
+               { RCAR_GP_PIN(5,  5), 24, 3 },  /* RX1 */
+               { RCAR_GP_PIN(5,  6), 20, 3 },  /* TX1 */
+               { RCAR_GP_PIN(5,  7), 16, 3 },  /* CTS1 */
+               { RCAR_GP_PIN(5,  8), 12, 3 },  /* RTS1 */
+               { RCAR_GP_PIN(5,  9),  8, 3 },  /* SCK2 */
+               { RCAR_GP_PIN(5, 10),  4, 3 },  /* TX2 */
+               { RCAR_GP_PIN(5, 11),  0, 3 },  /* RX2 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL19", 0xe606034c) {
+               { RCAR_GP_PIN(5, 12), 28, 3 },  /* HSCK0 */
+               { RCAR_GP_PIN(5, 13), 24, 3 },  /* HRX0 */
+               { RCAR_GP_PIN(5, 14), 20, 3 },  /* HTX0 */
+               { RCAR_GP_PIN(5, 15), 16, 3 },  /* HCTS0 */
+               { RCAR_GP_PIN(5, 16), 12, 3 },  /* HRTS0 */
+               { RCAR_GP_PIN(5, 17),  8, 3 },  /* MSIOF0_SCK */
+               { RCAR_GP_PIN(5, 18),  4, 3 },  /* MSIOF0_SYNC */
+               { RCAR_GP_PIN(5, 19),  0, 3 },  /* MSIOF0_SS1 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL20", 0xe6060350) {
+               { RCAR_GP_PIN(5, 20), 28, 3 },  /* MSIOF0_TXD */
+               { RCAR_GP_PIN(5, 21), 24, 3 },  /* MSIOF0_SS2 */
+               { RCAR_GP_PIN(5, 22), 20, 3 },  /* MSIOF0_RXD */
+               { RCAR_GP_PIN(5, 23), 16, 3 },  /* MLB_CLK */
+               { RCAR_GP_PIN(5, 24), 12, 3 },  /* MLB_SIG */
+               { RCAR_GP_PIN(5, 25),  8, 3 },  /* MLB_DAT */
+               { PIN_NUMBER('H', 37),  4, 3 }, /* MLB_REF */
+               { RCAR_GP_PIN(6,  0),  0, 3 },  /* SSI_SCK01239 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL21", 0xe6060354) {
+               { RCAR_GP_PIN(6,  1), 28, 3 },  /* SSI_WS01239 */
+               { RCAR_GP_PIN(6,  2), 24, 3 },  /* SSI_SDATA0 */
+               { RCAR_GP_PIN(6,  3), 20, 3 },  /* SSI_SDATA1 */
+               { RCAR_GP_PIN(6,  4), 16, 3 },  /* SSI_SDATA2 */
+               { RCAR_GP_PIN(6,  5), 12, 3 },  /* SSI_SCK349 */
+               { RCAR_GP_PIN(6,  6),  8, 3 },  /* SSI_WS349 */
+               { RCAR_GP_PIN(6,  7),  4, 3 },  /* SSI_SDATA3 */
+               { RCAR_GP_PIN(6,  8),  0, 3 },  /* SSI_SCK4 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL22", 0xe6060358) {
+               { RCAR_GP_PIN(6,  9), 28, 3 },  /* SSI_WS4 */
+               { RCAR_GP_PIN(6, 10), 24, 3 },  /* SSI_SDATA4 */
+               { RCAR_GP_PIN(6, 11), 20, 3 },  /* SSI_SCK5 */
+               { RCAR_GP_PIN(6, 12), 16, 3 },  /* SSI_WS5 */
+               { RCAR_GP_PIN(6, 13), 12, 3 },  /* SSI_SDATA5 */
+               { RCAR_GP_PIN(6, 14),  8, 3 },  /* SSI_SCK6 */
+               { RCAR_GP_PIN(6, 15),  4, 3 },  /* SSI_WS6 */
+               { RCAR_GP_PIN(6, 16),  0, 3 },  /* SSI_SDATA6 */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL23", 0xe606035c) {
+               { RCAR_GP_PIN(6, 17), 28, 3 },  /* SSI_SCK78 */
+               { RCAR_GP_PIN(6, 18), 24, 3 },  /* SSI_WS78 */
+               { RCAR_GP_PIN(6, 19), 20, 3 },  /* SSI_SDATA7 */
+               { RCAR_GP_PIN(6, 20), 16, 3 },  /* SSI_SDATA8 */
+               { RCAR_GP_PIN(6, 21), 12, 3 },  /* SSI_SDATA9 */
+               { RCAR_GP_PIN(6, 22),  8, 3 },  /* AUDIO_CLKA */
+               { RCAR_GP_PIN(6, 23),  4, 3 },  /* AUDIO_CLKB */
+               { RCAR_GP_PIN(6, 24),  0, 3 },  /* USB0_PWEN */
+       } },
+       { PINMUX_DRIVE_REG("DRVCTRL24", 0xe6060360) {
+               { RCAR_GP_PIN(6, 25), 28, 3 },  /* USB0_OVC */
+               { RCAR_GP_PIN(6, 26), 24, 3 },  /* USB1_PWEN */
+               { RCAR_GP_PIN(6, 27), 20, 3 },  /* USB1_OVC */
+               { RCAR_GP_PIN(6, 28), 16, 3 },  /* USB30_PWEN */
+               { RCAR_GP_PIN(6, 29), 12, 3 },  /* USB30_OVC */
+               { RCAR_GP_PIN(6, 30),  8, 3 },  /* GP6_30 */
+               { RCAR_GP_PIN(6, 31),  4, 3 },  /* GP6_31 */
+       } },
+       { },
+};
+
+enum ioctrl_regs {
+       POCCTRL,
+};
+
+static const struct pinmux_ioctrl_reg pinmux_ioctrl_regs[] = {
+       [POCCTRL] = { 0xe6060380, },
+       { /* sentinel */ },
+};
+
+static int r8a77965_pin_to_pocctrl(struct sh_pfc *pfc, unsigned int pin, u32 *pocctrl)
+{
+       int bit = -EINVAL;
+
+       *pocctrl = pinmux_ioctrl_regs[POCCTRL].reg;
+
+       if (pin >= RCAR_GP_PIN(3, 0) && pin <= RCAR_GP_PIN(3, 11))
+               bit = pin & 0x1f;
+
+       if (pin >= RCAR_GP_PIN(4, 0) && pin <= RCAR_GP_PIN(4, 17))
+               bit = (pin & 0x1f) + 12;
+
+       return bit;
+}
+
+static const struct pinmux_bias_reg pinmux_bias_regs[] = {
+       { PINMUX_BIAS_REG("PUEN0", 0xe6060400, "PUD0", 0xe6060440) {
+               [ 0] = PIN_NUMBER('W', 3),      /* QSPI0_SPCLK */
+               [ 1] = PIN_A_NUMBER('C', 5),    /* QSPI0_MOSI_IO0 */
+               [ 2] = PIN_A_NUMBER('B', 4),    /* QSPI0_MISO_IO1 */
+               [ 3] = PIN_NUMBER('Y', 6),      /* QSPI0_IO2 */
+               [ 4] = PIN_A_NUMBER('B', 6),    /* QSPI0_IO3 */
+               [ 5] = PIN_NUMBER('Y', 3),      /* QSPI0_SSL */
+               [ 6] = PIN_NUMBER('V', 3),      /* QSPI1_SPCLK */
+               [ 7] = PIN_A_NUMBER('C', 7),    /* QSPI1_MOSI_IO0 */
+               [ 8] = PIN_A_NUMBER('E', 5),    /* QSPI1_MISO_IO1 */
+               [ 9] = PIN_A_NUMBER('E', 4),    /* QSPI1_IO2 */
+               [10] = PIN_A_NUMBER('C', 3),    /* QSPI1_IO3 */
+               [11] = PIN_NUMBER('V', 5),      /* QSPI1_SSL */
+               [12] = PIN_NUMBER('Y', 7),      /* RPC_INT# */
+               [13] = PIN_NUMBER('V', 6),      /* RPC_WP# */
+               [14] = PIN_NUMBER('V', 7),      /* RPC_RESET# */
+               [15] = PIN_NUMBER('A', 16),     /* AVB_RX_CTL */
+               [16] = PIN_NUMBER('B', 19),     /* AVB_RXC */
+               [17] = PIN_NUMBER('A', 13),     /* AVB_RD0 */
+               [18] = PIN_NUMBER('B', 13),     /* AVB_RD1 */
+               [19] = PIN_NUMBER('A', 14),     /* AVB_RD2 */
+               [20] = PIN_NUMBER('B', 14),     /* AVB_RD3 */
+               [21] = PIN_NUMBER('A', 8),      /* AVB_TX_CTL */
+               [22] = PIN_NUMBER('A', 19),     /* AVB_TXC */
+               [23] = PIN_NUMBER('A', 18),     /* AVB_TD0 */
+               [24] = PIN_NUMBER('B', 18),     /* AVB_TD1 */
+               [25] = PIN_NUMBER('A', 17),     /* AVB_TD2 */
+               [26] = PIN_NUMBER('B', 17),     /* AVB_TD3 */
+               [27] = PIN_NUMBER('A', 12),     /* AVB_TXCREFCLK */
+               [28] = PIN_NUMBER('A', 9),      /* AVB_MDIO */
+               [29] = RCAR_GP_PIN(2,  9),      /* AVB_MDC */
+               [30] = RCAR_GP_PIN(2, 10),      /* AVB_MAGIC */
+               [31] = RCAR_GP_PIN(2, 11),      /* AVB_PHY_INT */
+       } },
+       { PINMUX_BIAS_REG("PUEN1", 0xe6060404, "PUD1", 0xe6060444) {
+               [ 0] = RCAR_GP_PIN(2, 12),      /* AVB_LINK */
+               [ 1] = RCAR_GP_PIN(2, 13),      /* AVB_AVTP_MATCH_A */
+               [ 2] = RCAR_GP_PIN(2, 14),      /* AVB_AVTP_CAPTURE_A */
+               [ 3] = RCAR_GP_PIN(2,  0),      /* IRQ0 */
+               [ 4] = RCAR_GP_PIN(2,  1),      /* IRQ1 */
+               [ 5] = RCAR_GP_PIN(2,  2),      /* IRQ2 */
+               [ 6] = RCAR_GP_PIN(2,  3),      /* IRQ3 */
+               [ 7] = RCAR_GP_PIN(2,  4),      /* IRQ4 */
+               [ 8] = RCAR_GP_PIN(2,  5),      /* IRQ5 */
+               [ 9] = RCAR_GP_PIN(2,  6),      /* PWM0 */
+               [10] = RCAR_GP_PIN(2,  7),      /* PWM1_A */
+               [11] = RCAR_GP_PIN(2,  8),      /* PWM2_A */
+               [12] = RCAR_GP_PIN(1,  0),      /* A0 */
+               [13] = RCAR_GP_PIN(1,  1),      /* A1 */
+               [14] = RCAR_GP_PIN(1,  2),      /* A2 */
+               [15] = RCAR_GP_PIN(1,  3),      /* A3 */
+               [16] = RCAR_GP_PIN(1,  4),      /* A4 */
+               [17] = RCAR_GP_PIN(1,  5),      /* A5 */
+               [18] = RCAR_GP_PIN(1,  6),      /* A6 */
+               [19] = RCAR_GP_PIN(1,  7),      /* A7 */
+               [20] = RCAR_GP_PIN(1,  8),      /* A8 */
+               [21] = RCAR_GP_PIN(1,  9),      /* A9 */
+               [22] = RCAR_GP_PIN(1, 10),      /* A10 */
+               [23] = RCAR_GP_PIN(1, 11),      /* A11 */
+               [24] = RCAR_GP_PIN(1, 12),      /* A12 */
+               [25] = RCAR_GP_PIN(1, 13),      /* A13 */
+               [26] = RCAR_GP_PIN(1, 14),      /* A14 */
+               [27] = RCAR_GP_PIN(1, 15),      /* A15 */
+               [28] = RCAR_GP_PIN(1, 16),      /* A16 */
+               [29] = RCAR_GP_PIN(1, 17),      /* A17 */
+               [30] = RCAR_GP_PIN(1, 18),      /* A18 */
+               [31] = RCAR_GP_PIN(1, 19),      /* A19 */
+       } },
+       { PINMUX_BIAS_REG("PUEN2", 0xe6060408, "PUD2", 0xe6060448) {
+               [ 0] = RCAR_GP_PIN(1, 28),      /* CLKOUT */
+               [ 1] = RCAR_GP_PIN(1, 20),      /* CS0_N */
+               [ 2] = RCAR_GP_PIN(1, 21),      /* CS1_N */
+               [ 3] = RCAR_GP_PIN(1, 22),      /* BS_N */
+               [ 4] = RCAR_GP_PIN(1, 23),      /* RD_N */
+               [ 5] = RCAR_GP_PIN(1, 24),      /* RD_WR_N */
+               [ 6] = RCAR_GP_PIN(1, 25),      /* WE0_N */
+               [ 7] = RCAR_GP_PIN(1, 26),      /* WE1_N */
+               [ 8] = RCAR_GP_PIN(1, 27),      /* EX_WAIT0_A */
+               [ 9] = PIN_NUMBER('C', 1),      /* PRESETOUT# */
+               [10] = RCAR_GP_PIN(0,  0),      /* D0 */
+               [11] = RCAR_GP_PIN(0,  1),      /* D1 */
+               [12] = RCAR_GP_PIN(0,  2),      /* D2 */
+               [13] = RCAR_GP_PIN(0,  3),      /* D3 */
+               [14] = RCAR_GP_PIN(0,  4),      /* D4 */
+               [15] = RCAR_GP_PIN(0,  5),      /* D5 */
+               [16] = RCAR_GP_PIN(0,  6),      /* D6 */
+               [17] = RCAR_GP_PIN(0,  7),      /* D7 */
+               [18] = RCAR_GP_PIN(0,  8),      /* D8 */
+               [19] = RCAR_GP_PIN(0,  9),      /* D9 */
+               [20] = RCAR_GP_PIN(0, 10),      /* D10 */
+               [21] = RCAR_GP_PIN(0, 11),      /* D11 */
+               [22] = RCAR_GP_PIN(0, 12),      /* D12 */
+               [23] = RCAR_GP_PIN(0, 13),      /* D13 */
+               [24] = RCAR_GP_PIN(0, 14),      /* D14 */
+               [25] = RCAR_GP_PIN(0, 15),      /* D15 */
+               [26] = RCAR_GP_PIN(7,  0),      /* AVS1 */
+               [27] = RCAR_GP_PIN(7,  1),      /* AVS2 */
+               [28] = RCAR_GP_PIN(7,  2),      /* HDMI0_CEC */
+               [29] = RCAR_GP_PIN(7,  3),      /* GP7_03 */
+               [30] = PIN_A_NUMBER('P', 7),    /* DU_DOTCLKIN0 */
+               [31] = PIN_A_NUMBER('P', 8),    /* DU_DOTCLKIN1 */
+       } },
+       { PINMUX_BIAS_REG("PUEN3", 0xe606040c, "PUD3", 0xe606044c) {
+               [ 0] = PIN_A_NUMBER('R', 8),    /* DU_DOTCLKIN3 */
+               [ 1] = PIN_NONE,
+               [ 2] = PIN_A_NUMBER('D', 38),   /* FSCLKST */
+               [ 3] = PIN_A_NUMBER('D', 39),   /* EXTALR*/
+               [ 4] = PIN_A_NUMBER('R', 26),   /* TRST# */
+               [ 5] = PIN_A_NUMBER('T', 27),   /* TCK */
+               [ 6] = PIN_A_NUMBER('R', 30),   /* TMS */
+               [ 7] = PIN_A_NUMBER('R', 29),   /* TDI */
+               [ 8] = PIN_NONE,
+               [ 9] = PIN_A_NUMBER('T', 30),   /* ASEBRK */
+               [10] = RCAR_GP_PIN(3,  0),      /* SD0_CLK */
+               [11] = RCAR_GP_PIN(3,  1),      /* SD0_CMD */
+               [12] = RCAR_GP_PIN(3,  2),      /* SD0_DAT0 */
+               [13] = RCAR_GP_PIN(3,  3),      /* SD0_DAT1 */
+               [14] = RCAR_GP_PIN(3,  4),      /* SD0_DAT2 */
+               [15] = RCAR_GP_PIN(3,  5),      /* SD0_DAT3 */
+               [16] = RCAR_GP_PIN(3,  6),      /* SD1_CLK */
+               [17] = RCAR_GP_PIN(3,  7),      /* SD1_CMD */
+               [18] = RCAR_GP_PIN(3,  8),      /* SD1_DAT0 */
+               [19] = RCAR_GP_PIN(3,  9),      /* SD1_DAT1 */
+               [20] = RCAR_GP_PIN(3, 10),      /* SD1_DAT2 */
+               [21] = RCAR_GP_PIN(3, 11),      /* SD1_DAT3 */
+               [22] = RCAR_GP_PIN(4,  0),      /* SD2_CLK */
+               [23] = RCAR_GP_PIN(4,  1),      /* SD2_CMD */
+               [24] = RCAR_GP_PIN(4,  2),      /* SD2_DAT0 */
+               [25] = RCAR_GP_PIN(4,  3),      /* SD2_DAT1 */
+               [26] = RCAR_GP_PIN(4,  4),      /* SD2_DAT2 */
+               [27] = RCAR_GP_PIN(4,  5),      /* SD2_DAT3 */
+               [28] = RCAR_GP_PIN(4,  6),      /* SD2_DS */
+               [29] = RCAR_GP_PIN(4,  7),      /* SD3_CLK */
+               [30] = RCAR_GP_PIN(4,  8),      /* SD3_CMD */
+               [31] = RCAR_GP_PIN(4,  9),      /* SD3_DAT0 */
+       } },
+       { PINMUX_BIAS_REG("PUEN4", 0xe6060410, "PUD4", 0xe6060450) {
+               [ 0] = RCAR_GP_PIN(4, 10),      /* SD3_DAT1 */
+               [ 1] = RCAR_GP_PIN(4, 11),      /* SD3_DAT2 */
+               [ 2] = RCAR_GP_PIN(4, 12),      /* SD3_DAT3 */
+               [ 3] = RCAR_GP_PIN(4, 13),      /* SD3_DAT4 */
+               [ 4] = RCAR_GP_PIN(4, 14),      /* SD3_DAT5 */
+               [ 5] = RCAR_GP_PIN(4, 15),      /* SD3_DAT6 */
+               [ 6] = RCAR_GP_PIN(4, 16),      /* SD3_DAT7 */
+               [ 7] = RCAR_GP_PIN(4, 17),      /* SD3_DS */
+               [ 8] = RCAR_GP_PIN(3, 12),      /* SD0_CD */
+               [ 9] = RCAR_GP_PIN(3, 13),      /* SD0_WP */
+               [10] = RCAR_GP_PIN(3, 14),      /* SD1_CD */
+               [11] = RCAR_GP_PIN(3, 15),      /* SD1_WP */
+               [12] = RCAR_GP_PIN(5,  0),      /* SCK0 */
+               [13] = RCAR_GP_PIN(5,  1),      /* RX0 */
+               [14] = RCAR_GP_PIN(5,  2),      /* TX0 */
+               [15] = RCAR_GP_PIN(5,  3),      /* CTS0_N */
+               [16] = RCAR_GP_PIN(5,  4),      /* RTS0_N */
+               [17] = RCAR_GP_PIN(5,  5),      /* RX1_A */
+               [18] = RCAR_GP_PIN(5,  6),      /* TX1_A */
+               [19] = RCAR_GP_PIN(5,  7),      /* CTS1_N */
+               [20] = RCAR_GP_PIN(5,  8),      /* RTS1_N */
+               [21] = RCAR_GP_PIN(5,  9),      /* SCK2 */
+               [22] = RCAR_GP_PIN(5, 10),      /* TX2_A */
+               [23] = RCAR_GP_PIN(5, 11),      /* RX2_A */
+               [24] = RCAR_GP_PIN(5, 12),      /* HSCK0 */
+               [25] = RCAR_GP_PIN(5, 13),      /* HRX0 */
+               [26] = RCAR_GP_PIN(5, 14),      /* HTX0 */
+               [27] = RCAR_GP_PIN(5, 15),      /* HCTS0_N */
+               [28] = RCAR_GP_PIN(5, 16),      /* HRTS0_N */
+               [29] = RCAR_GP_PIN(5, 17),      /* MSIOF0_SCK */
+               [30] = RCAR_GP_PIN(5, 18),      /* MSIOF0_SYNC */
+               [31] = RCAR_GP_PIN(5, 19),      /* MSIOF0_SS1 */
+       } },
+       { PINMUX_BIAS_REG("PUEN5", 0xe6060414, "PUD5", 0xe6060454) {
+               [ 0] = RCAR_GP_PIN(5, 20),      /* MSIOF0_TXD */
+               [ 1] = RCAR_GP_PIN(5, 21),      /* MSIOF0_SS2 */
+               [ 2] = RCAR_GP_PIN(5, 22),      /* MSIOF0_RXD */
+               [ 3] = RCAR_GP_PIN(5, 23),      /* MLB_CLK */
+               [ 4] = RCAR_GP_PIN(5, 24),      /* MLB_SIG */
+               [ 5] = RCAR_GP_PIN(5, 25),      /* MLB_DAT */
+               [ 6] = PIN_NUMBER('H', 37),     /* MLB_REF */
+               [ 7] = RCAR_GP_PIN(6,  0),      /* SSI_SCK01239 */
+               [ 8] = RCAR_GP_PIN(6,  1),      /* SSI_WS01239 */
+               [ 9] = RCAR_GP_PIN(6,  2),      /* SSI_SDATA0 */
+               [10] = RCAR_GP_PIN(6,  3),      /* SSI_SDATA1_A */
+               [11] = RCAR_GP_PIN(6,  4),      /* SSI_SDATA2_A */
+               [12] = RCAR_GP_PIN(6,  5),      /* SSI_SCK349 */
+               [13] = RCAR_GP_PIN(6,  6),      /* SSI_WS349 */
+               [14] = RCAR_GP_PIN(6,  7),      /* SSI_SDATA3 */
+               [15] = RCAR_GP_PIN(6,  8),      /* SSI_SCK4 */
+               [16] = RCAR_GP_PIN(6,  9),      /* SSI_WS4 */
+               [17] = RCAR_GP_PIN(6, 10),      /* SSI_SDATA4 */
+               [18] = RCAR_GP_PIN(6, 11),      /* SSI_SCK5 */
+               [19] = RCAR_GP_PIN(6, 12),      /* SSI_WS5 */
+               [20] = RCAR_GP_PIN(6, 13),      /* SSI_SDATA5 */
+               [21] = RCAR_GP_PIN(6, 14),      /* SSI_SCK6 */
+               [22] = RCAR_GP_PIN(6, 15),      /* SSI_WS6 */
+               [23] = RCAR_GP_PIN(6, 16),      /* SSI_SDATA6 */
+               [24] = RCAR_GP_PIN(6, 17),      /* SSI_SCK78 */
+               [25] = RCAR_GP_PIN(6, 18),      /* SSI_WS78 */
+               [26] = RCAR_GP_PIN(6, 19),      /* SSI_SDATA7 */
+               [27] = RCAR_GP_PIN(6, 20),      /* SSI_SDATA8 */
+               [28] = RCAR_GP_PIN(6, 21),      /* SSI_SDATA9_A */
+               [29] = RCAR_GP_PIN(6, 22),      /* AUDIO_CLKA_A */
+               [30] = RCAR_GP_PIN(6, 23),      /* AUDIO_CLKB_B */
+               [31] = RCAR_GP_PIN(6, 24),      /* USB0_PWEN */
+       } },
+       { PINMUX_BIAS_REG("PUEN6", 0xe6060418, "PUD6", 0xe6060458) {
+               [ 0] = RCAR_GP_PIN(6, 25),      /* USB0_OVC */
+               [ 1] = RCAR_GP_PIN(6, 26),      /* USB1_PWEN */
+               [ 2] = RCAR_GP_PIN(6, 27),      /* USB1_OVC */
+               [ 3] = RCAR_GP_PIN(6, 28),      /* USB30_PWEN */
+               [ 4] = RCAR_GP_PIN(6, 29),      /* USB30_OVC */
+               [ 5] = RCAR_GP_PIN(6, 30),      /* GP6_30 */
+               [ 6] = RCAR_GP_PIN(6, 31),      /* GP6_31 */
+               [ 7] = PIN_NONE,
+               [ 8] = PIN_NONE,
+               [ 9] = PIN_NONE,
+               [10] = PIN_NONE,
+               [11] = PIN_NONE,
+               [12] = PIN_NONE,
+               [13] = PIN_NONE,
+               [14] = PIN_NONE,
+               [15] = PIN_NONE,
+               [16] = PIN_NONE,
+               [17] = PIN_NONE,
+               [18] = PIN_NONE,
+               [19] = PIN_NONE,
+               [20] = PIN_NONE,
+               [21] = PIN_NONE,
+               [22] = PIN_NONE,
+               [23] = PIN_NONE,
+               [24] = PIN_NONE,
+               [25] = PIN_NONE,
+               [26] = PIN_NONE,
+               [27] = PIN_NONE,
+               [28] = PIN_NONE,
+               [29] = PIN_NONE,
+               [30] = PIN_NONE,
+               [31] = PIN_NONE,
+       } },
+       { /* sentinel */ },
+};
+
+static unsigned int r8a77965_pinmux_get_bias(struct sh_pfc *pfc,
+                                           unsigned int pin)
+{
+       const struct pinmux_bias_reg *reg;
+       unsigned int bit;
+
+       reg = sh_pfc_pin_to_bias_reg(pfc, pin, &bit);
+       if (!reg)
+               return PIN_CONFIG_BIAS_DISABLE;
+
+       if (!(sh_pfc_read(pfc, reg->puen) & BIT(bit)))
+               return PIN_CONFIG_BIAS_DISABLE;
+       else if (sh_pfc_read(pfc, reg->pud) & BIT(bit))
+               return PIN_CONFIG_BIAS_PULL_UP;
+       else
+               return PIN_CONFIG_BIAS_PULL_DOWN;
+}
+
+static void r8a77965_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
+                                  unsigned int bias)
+{
+       const struct pinmux_bias_reg *reg;
+       u32 enable, updown;
+       unsigned int bit;
+
+       reg = sh_pfc_pin_to_bias_reg(pfc, pin, &bit);
+       if (!reg)
+               return;
+
+       enable = sh_pfc_read(pfc, reg->puen) & ~BIT(bit);
+       if (bias != PIN_CONFIG_BIAS_DISABLE)
+               enable |= BIT(bit);
+
+       updown = sh_pfc_read(pfc, reg->pud) & ~BIT(bit);
+       if (bias == PIN_CONFIG_BIAS_PULL_UP)
+               updown |= BIT(bit);
+
+       sh_pfc_write(pfc, reg->pud, updown);
+       sh_pfc_write(pfc, reg->puen, enable);
+}
+
+static const struct sh_pfc_soc_operations r8a77965_pinmux_ops = {
+       .pin_to_pocctrl = r8a77965_pin_to_pocctrl,
+       .get_bias = r8a77965_pinmux_get_bias,
+       .set_bias = r8a77965_pinmux_set_bias,
+};
+
+const struct sh_pfc_soc_info r8a77965_pinmux_info = {
+       .name = "r8a77965_pfc",
+       .ops = &r8a77965_pinmux_ops,
+       .unlock_reg = 0xe6060000, /* PMMR */
+
+       .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
+
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .groups = pinmux_groups,
+       .nr_groups = ARRAY_SIZE(pinmux_groups),
+       .functions = pinmux_functions,
+       .nr_functions = ARRAY_SIZE(pinmux_functions),
+
+       .cfg_regs = pinmux_config_regs,
+       .drive_regs = pinmux_drive_regs,
+       .bias_regs = pinmux_bias_regs,
+       .ioctrl_regs = pinmux_ioctrl_regs,
+
+       .pinmux_data = pinmux_data,
+       .pinmux_data_size = ARRAY_SIZE(pinmux_data),
+};
index c44e1bc961c268fbd4fbeac19fbe42d2e6e09972..823edb559d6c9fdc8e3ee16a17f927bca1581d80 100644 (file)
@@ -3,6 +3,7 @@
  * R8A77970 processor support - PFC hardware block.
  *
  * Copyright (C) 2016 Renesas Electronics Corp.
+ * Copyright (C) 2017 Cogent Embedded, Inc. <source@cogentembedded.com>
  *
  * This file is based on the drivers/pinctrl/sh-pfc/pfc-r8a7795.c
  *
 #include "sh_pfc.h"
 
 #define CPU_ALL_PORT(fn, sfx)                                          \
-       PORT_GP_CFG_22(0, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH),      \
-       PORT_GP_CFG_28(1, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH),      \
-       PORT_GP_CFG_17(2, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH),      \
-       PORT_GP_CFG_17(3, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH),      \
-       PORT_GP_CFG_6(4, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH),       \
-       PORT_GP_CFG_15(5, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH)
+       PORT_GP_CFG_22(0, fn, sfx, SH_PFC_PIN_CFG_IO_VOLTAGE),          \
+       PORT_GP_28(1, fn, sfx),                                         \
+       PORT_GP_CFG_17(2, fn, sfx, SH_PFC_PIN_CFG_IO_VOLTAGE),          \
+       PORT_GP_CFG_17(3, fn, sfx, SH_PFC_PIN_CFG_IO_VOLTAGE),          \
+       PORT_GP_6(4,  fn, sfx),                                         \
+       PORT_GP_15(5, fn, sfx)
 /*
  * F_() : just information
  * FM() : macro for FN_xxx / xxx_MARK
@@ -1383,6 +1384,56 @@ static const unsigned int pwm4_b_mux[] = {
        PWM4_B_MARK,
 };
 
+/* - QSPI0 ------------------------------------------------------------------ */
+static const unsigned int qspi0_ctrl_pins[] = {
+       /* SPCLK, SSL */
+       RCAR_GP_PIN(5, 0), RCAR_GP_PIN(5, 5),
+};
+static const unsigned int qspi0_ctrl_mux[] = {
+       QSPI0_SPCLK_MARK, QSPI0_SSL_MARK,
+};
+static const unsigned int qspi0_data2_pins[] = {
+       /* MOSI_IO0, MISO_IO1 */
+       RCAR_GP_PIN(5, 1), RCAR_GP_PIN(5, 2),
+};
+static const unsigned int qspi0_data2_mux[] = {
+       QSPI0_MOSI_IO0_MARK, QSPI0_MISO_IO1_MARK,
+};
+static const unsigned int qspi0_data4_pins[] = {
+       /* MOSI_IO0, MISO_IO1, IO2, IO3 */
+       RCAR_GP_PIN(5, 1), RCAR_GP_PIN(5, 2),
+       RCAR_GP_PIN(5, 3), RCAR_GP_PIN(5, 4),
+};
+static const unsigned int qspi0_data4_mux[] = {
+       QSPI0_MOSI_IO0_MARK, QSPI0_MISO_IO1_MARK,
+       QSPI0_IO2_MARK, QSPI0_IO3_MARK
+};
+
+/* - QSPI1 ------------------------------------------------------------------ */
+static const unsigned int qspi1_ctrl_pins[] = {
+       /* SPCLK, SSL */
+       RCAR_GP_PIN(5, 6), RCAR_GP_PIN(5, 11),
+};
+static const unsigned int qspi1_ctrl_mux[] = {
+       QSPI1_SPCLK_MARK, QSPI1_SSL_MARK,
+};
+static const unsigned int qspi1_data2_pins[] = {
+       /* MOSI_IO0, MISO_IO1 */
+       RCAR_GP_PIN(5, 7), RCAR_GP_PIN(5, 8),
+};
+static const unsigned int qspi1_data2_mux[] = {
+       QSPI1_MOSI_IO0_MARK, QSPI1_MISO_IO1_MARK,
+};
+static const unsigned int qspi1_data4_pins[] = {
+       /* MOSI_IO0, MISO_IO1, IO2, IO3 */
+       RCAR_GP_PIN(5, 7), RCAR_GP_PIN(5, 8),
+       RCAR_GP_PIN(5, 9), RCAR_GP_PIN(5, 10),
+};
+static const unsigned int qspi1_data4_mux[] = {
+       QSPI1_MOSI_IO0_MARK, QSPI1_MISO_IO1_MARK,
+       QSPI1_IO2_MARK, QSPI1_IO3_MARK
+};
+
 /* - SCIF Clock ------------------------------------------------------------- */
 static const unsigned int scif_clk_a_pins[] = {
        /* SCIF_CLK */
@@ -1529,47 +1580,25 @@ static const unsigned int tmu_tclk2_b_mux[] = {
 };
 
 /* - VIN0 ------------------------------------------------------------------- */
-static const unsigned int vin0_data8_pins[] = {
-       RCAR_GP_PIN(2, 4), RCAR_GP_PIN(2, 5),
-       RCAR_GP_PIN(2, 6), RCAR_GP_PIN(2, 7),
-       RCAR_GP_PIN(2, 8), RCAR_GP_PIN(2, 9),
-       RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11),
-};
-static const unsigned int vin0_data8_mux[] = {
-       VI0_DATA0_MARK, VI0_DATA1_MARK,
-       VI0_DATA2_MARK, VI0_DATA3_MARK,
-       VI0_DATA4_MARK, VI0_DATA5_MARK,
-       VI0_DATA6_MARK, VI0_DATA7_MARK,
+static const union vin_data12 vin0_data_pins = {
+       .data12 = {
+               RCAR_GP_PIN(2, 4), RCAR_GP_PIN(2, 5),
+               RCAR_GP_PIN(2, 6), RCAR_GP_PIN(2, 7),
+               RCAR_GP_PIN(2, 8), RCAR_GP_PIN(2, 9),
+               RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11),
+               RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13),
+               RCAR_GP_PIN(2, 14), RCAR_GP_PIN(2, 15),
+       },
 };
-static const unsigned int vin0_data10_pins[] = {
-       RCAR_GP_PIN(2, 4), RCAR_GP_PIN(2, 5),
-       RCAR_GP_PIN(2, 6), RCAR_GP_PIN(2, 7),
-       RCAR_GP_PIN(2, 8), RCAR_GP_PIN(2, 9),
-       RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11),
-       RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13),
-};
-static const unsigned int vin0_data10_mux[] = {
-       VI0_DATA0_MARK, VI0_DATA1_MARK,
-       VI0_DATA2_MARK, VI0_DATA3_MARK,
-       VI0_DATA4_MARK, VI0_DATA5_MARK,
-       VI0_DATA6_MARK, VI0_DATA7_MARK,
-       VI0_DATA8_MARK,  VI0_DATA9_MARK,
-};
-static const unsigned int vin0_data12_pins[] = {
-       RCAR_GP_PIN(2, 4), RCAR_GP_PIN(2, 5),
-       RCAR_GP_PIN(2, 6), RCAR_GP_PIN(2, 7),
-       RCAR_GP_PIN(2, 8), RCAR_GP_PIN(2, 9),
-       RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11),
-       RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13),
-       RCAR_GP_PIN(2, 14), RCAR_GP_PIN(2, 15),
-};
-static const unsigned int vin0_data12_mux[] = {
-       VI0_DATA0_MARK, VI0_DATA1_MARK,
-       VI0_DATA2_MARK, VI0_DATA3_MARK,
-       VI0_DATA4_MARK, VI0_DATA5_MARK,
-       VI0_DATA6_MARK, VI0_DATA7_MARK,
-       VI0_DATA8_MARK,  VI0_DATA9_MARK,
-       VI0_DATA10_MARK, VI0_DATA11_MARK,
+static const union vin_data12 vin0_data_mux = {
+       .data12 = {
+               VI0_DATA0_MARK, VI0_DATA1_MARK,
+               VI0_DATA2_MARK, VI0_DATA3_MARK,
+               VI0_DATA4_MARK, VI0_DATA5_MARK,
+               VI0_DATA6_MARK, VI0_DATA7_MARK,
+               VI0_DATA8_MARK,  VI0_DATA9_MARK,
+               VI0_DATA10_MARK, VI0_DATA11_MARK,
+       },
 };
 static const unsigned int vin0_sync_pins[] = {
        /* HSYNC#, VSYNC# */
@@ -1601,47 +1630,25 @@ static const unsigned int vin0_clk_mux[] = {
 };
 
 /* - VIN1 ------------------------------------------------------------------- */
-static const unsigned int vin1_data8_pins[] = {
-       RCAR_GP_PIN(3, 4), RCAR_GP_PIN(3, 5),
-       RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 7),
-       RCAR_GP_PIN(3, 8), RCAR_GP_PIN(3, 9),
-       RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11),
-};
-static const unsigned int vin1_data8_mux[] = {
-       VI1_DATA0_MARK, VI1_DATA1_MARK,
-       VI1_DATA2_MARK, VI1_DATA3_MARK,
-       VI1_DATA4_MARK, VI1_DATA5_MARK,
-       VI1_DATA6_MARK, VI1_DATA7_MARK,
-};
-static const unsigned int vin1_data10_pins[] = {
-       RCAR_GP_PIN(3, 4), RCAR_GP_PIN(3, 5),
-       RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 7),
-       RCAR_GP_PIN(3, 8), RCAR_GP_PIN(3, 9),
-       RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11),
-       RCAR_GP_PIN(3, 12), RCAR_GP_PIN(3, 13),
-};
-static const unsigned int vin1_data10_mux[] = {
-       VI1_DATA0_MARK, VI1_DATA1_MARK,
-       VI1_DATA2_MARK, VI1_DATA3_MARK,
-       VI1_DATA4_MARK, VI1_DATA5_MARK,
-       VI1_DATA6_MARK, VI1_DATA7_MARK,
-       VI1_DATA8_MARK,  VI1_DATA9_MARK,
-};
-static const unsigned int vin1_data12_pins[] = {
-       RCAR_GP_PIN(3, 4), RCAR_GP_PIN(3, 5),
-       RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 7),
-       RCAR_GP_PIN(3, 8), RCAR_GP_PIN(3, 9),
-       RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11),
-       RCAR_GP_PIN(3, 12), RCAR_GP_PIN(3, 13),
-       RCAR_GP_PIN(3, 14), RCAR_GP_PIN(3, 15),
+static const union vin_data12 vin1_data_pins = {
+       .data12 = {
+               RCAR_GP_PIN(3, 4), RCAR_GP_PIN(3, 5),
+               RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 7),
+               RCAR_GP_PIN(3, 8), RCAR_GP_PIN(3, 9),
+               RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11),
+               RCAR_GP_PIN(3, 12), RCAR_GP_PIN(3, 13),
+               RCAR_GP_PIN(3, 14), RCAR_GP_PIN(3, 15),
+       },
 };
-static const unsigned int vin1_data12_mux[] = {
-       VI1_DATA0_MARK, VI1_DATA1_MARK,
-       VI1_DATA2_MARK, VI1_DATA3_MARK,
-       VI1_DATA4_MARK, VI1_DATA5_MARK,
-       VI1_DATA6_MARK, VI1_DATA7_MARK,
-       VI1_DATA8_MARK,  VI1_DATA9_MARK,
-       VI1_DATA10_MARK, VI1_DATA11_MARK,
+static const union vin_data12 vin1_data_mux = {
+       .data12 = {
+               VI1_DATA0_MARK, VI1_DATA1_MARK,
+               VI1_DATA2_MARK, VI1_DATA3_MARK,
+               VI1_DATA4_MARK, VI1_DATA5_MARK,
+               VI1_DATA6_MARK, VI1_DATA7_MARK,
+               VI1_DATA8_MARK,  VI1_DATA9_MARK,
+               VI1_DATA10_MARK, VI1_DATA11_MARK,
+       },
 };
 static const unsigned int vin1_sync_pins[] = {
        /* HSYNC#, VSYNC# */
@@ -1757,6 +1764,12 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(pwm3_b),
        SH_PFC_PIN_GROUP(pwm4_a),
        SH_PFC_PIN_GROUP(pwm4_b),
+       SH_PFC_PIN_GROUP(qspi0_ctrl),
+       SH_PFC_PIN_GROUP(qspi0_data2),
+       SH_PFC_PIN_GROUP(qspi0_data4),
+       SH_PFC_PIN_GROUP(qspi1_ctrl),
+       SH_PFC_PIN_GROUP(qspi1_data2),
+       SH_PFC_PIN_GROUP(qspi1_data4),
        SH_PFC_PIN_GROUP(scif_clk_a),
        SH_PFC_PIN_GROUP(scif_clk_b),
        SH_PFC_PIN_GROUP(scif0_data),
@@ -1776,16 +1789,16 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(tmu_tclk1_b),
        SH_PFC_PIN_GROUP(tmu_tclk2_a),
        SH_PFC_PIN_GROUP(tmu_tclk2_b),
-       SH_PFC_PIN_GROUP(vin0_data8),
-       SH_PFC_PIN_GROUP(vin0_data10),
-       SH_PFC_PIN_GROUP(vin0_data12),
+       VIN_DATA_PIN_GROUP(vin0_data, 8),
+       VIN_DATA_PIN_GROUP(vin0_data, 10),
+       VIN_DATA_PIN_GROUP(vin0_data, 12),
        SH_PFC_PIN_GROUP(vin0_sync),
        SH_PFC_PIN_GROUP(vin0_field),
        SH_PFC_PIN_GROUP(vin0_clkenb),
        SH_PFC_PIN_GROUP(vin0_clk),
-       SH_PFC_PIN_GROUP(vin1_data8),
-       SH_PFC_PIN_GROUP(vin1_data10),
-       SH_PFC_PIN_GROUP(vin1_data12),
+       VIN_DATA_PIN_GROUP(vin1_data, 8),
+       VIN_DATA_PIN_GROUP(vin1_data, 10),
+       VIN_DATA_PIN_GROUP(vin1_data, 12),
        SH_PFC_PIN_GROUP(vin1_sync),
        SH_PFC_PIN_GROUP(vin1_field),
        SH_PFC_PIN_GROUP(vin1_clkenb),
@@ -1951,6 +1964,18 @@ static const char * const pwm4_groups[] = {
        "pwm4_b",
 };
 
+static const char * const qspi0_groups[] = {
+       "qspi0_ctrl",
+       "qspi0_data2",
+       "qspi0_data4",
+};
+
+static const char * const qspi1_groups[] = {
+       "qspi1_ctrl",
+       "qspi1_data2",
+       "qspi1_data4",
+};
+
 static const char * const scif_clk_groups[] = {
        "scif_clk_a",
        "scif_clk_b",
@@ -2034,6 +2059,8 @@ static const struct sh_pfc_function pinmux_functions[] = {
        SH_PFC_FUNCTION(pwm2),
        SH_PFC_FUNCTION(pwm3),
        SH_PFC_FUNCTION(pwm4),
+       SH_PFC_FUNCTION(qspi0),
+       SH_PFC_FUNCTION(qspi1),
        SH_PFC_FUNCTION(scif_clk),
        SH_PFC_FUNCTION(scif0),
        SH_PFC_FUNCTION(scif1),
@@ -2352,7 +2379,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = {
 #define F_(x, y)       x,
 #define FM(x)          FN_##x,
        { PINMUX_CFG_REG_VAR("MOD_SEL0", 0xe6060500, 32,
-                            4, 4, 4, 4,
+                            4, 4, 4, 4, 4,
                             1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) {
                /* RESERVED 31, 30, 29, 28 */
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -2380,18 +2407,31 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = {
        { },
 };
 
+enum ioctrl_regs {
+       IOCTRL30,
+       IOCTRL31,
+       IOCTRL32,
+};
+
+static const struct pinmux_ioctrl_reg pinmux_ioctrl_regs[] = {
+       [IOCTRL30] = { 0xe6060380 },
+       [IOCTRL31] = { 0xe6060384 },
+       [IOCTRL32] = { 0xe6060388 },
+       { /* sentinel */ },
+};
+
 static int r8a77970_pin_to_pocctrl(struct sh_pfc *pfc, unsigned int pin,
                                   u32 *pocctrl)
 {
        int bit = pin & 0x1f;
 
-       *pocctrl = 0xe6060380;
+       *pocctrl = pinmux_ioctrl_regs[IOCTRL30].reg;
        if (pin >= RCAR_GP_PIN(0, 0) && pin <= RCAR_GP_PIN(0, 21))
                return bit;
        if (pin >= RCAR_GP_PIN(2, 0) && pin <= RCAR_GP_PIN(2, 9))
                return bit + 22;
 
-       *pocctrl += 4;
+       *pocctrl = pinmux_ioctrl_regs[IOCTRL31].reg;
        if (pin >= RCAR_GP_PIN(2, 10) && pin <= RCAR_GP_PIN(2, 16))
                return bit - 10;
        if (pin >= RCAR_GP_PIN(3, 0) && pin <= RCAR_GP_PIN(3, 16))
@@ -2419,6 +2459,7 @@ const struct sh_pfc_soc_info r8a77970_pinmux_info = {
        .nr_functions = ARRAY_SIZE(pinmux_functions),
 
        .cfg_regs = pinmux_config_regs,
+       .ioctrl_regs = pinmux_ioctrl_regs,
 
        .pinmux_data = pinmux_data,
        .pinmux_data_size = ARRAY_SIZE(pinmux_data),
index c708eed686740a790d98a12508f667540d9e7b72..1cf08ae4714c80c9166b745a12e443ef0bb5781f 100644 (file)
@@ -2,13 +2,13 @@
 /*
  * R8A77990 processor support - PFC hardware block.
  *
- * Copyright (C) 2018-2019 Renesas Electronics Corp.
+ * Copyright (C) 2018 Renesas Electronics Corp.
  *
  * This file is based on the drivers/pinctrl/sh-pfc/pfc-r8a7796.c
  *
- * R-Car Gen3 processor support - PFC hardware block.
+ * R8A7796 processor support - PFC hardware block.
  *
- * Copyright (C) 2015  Renesas Electronics Corporation
+ * Copyright (C) 2016-2017 Renesas Electronics Corp.
  */
 
 #include <common.h>
 #define CFG_FLAGS (SH_PFC_PIN_CFG_PULL_UP | \
                   SH_PFC_PIN_CFG_PULL_DOWN)
 
-#define CPU_ALL_PORT(fn, sfx)  \
-       PORT_GP_18(0, fn, sfx), \
-       PORT_GP_23(1, fn, sfx), \
-       PORT_GP_26(2, fn, sfx), \
-       PORT_GP_CFG_12(3, fn, sfx, SH_PFC_PIN_CFG_IO_VOLTAGE),  \
-       PORT_GP_1(3, 12, fn, sfx),      \
-       PORT_GP_1(3, 13, fn, sfx),      \
-       PORT_GP_1(3, 14, fn, sfx),      \
-       PORT_GP_1(3, 15, fn, sfx),      \
-       PORT_GP_CFG_11(4, fn, sfx, SH_PFC_PIN_CFG_IO_VOLTAGE),  \
-       PORT_GP_20(5, fn, sfx), \
-       PORT_GP_18(6, fn, sfx)
+#define CPU_ALL_PORT(fn, sfx) \
+       PORT_GP_CFG_18(0, fn, sfx, CFG_FLAGS), \
+       PORT_GP_CFG_23(1, fn, sfx, CFG_FLAGS), \
+       PORT_GP_CFG_26(2, fn, sfx, CFG_FLAGS), \
+       PORT_GP_CFG_12(3, fn, sfx, CFG_FLAGS | SH_PFC_PIN_CFG_IO_VOLTAGE), \
+       PORT_GP_CFG_1(3, 12, fn, sfx, CFG_FLAGS), \
+       PORT_GP_CFG_1(3, 13, fn, sfx, CFG_FLAGS), \
+       PORT_GP_CFG_1(3, 14, fn, sfx, CFG_FLAGS), \
+       PORT_GP_CFG_1(3, 15, fn, sfx, CFG_FLAGS), \
+       PORT_GP_CFG_11(4, fn, sfx, CFG_FLAGS | SH_PFC_PIN_CFG_IO_VOLTAGE), \
+       PORT_GP_CFG_20(5, fn, sfx, CFG_FLAGS), \
+       PORT_GP_CFG_9(6, fn, sfx, CFG_FLAGS), \
+       PORT_GP_CFG_1(6, 9, fn, sfx, SH_PFC_PIN_CFG_PULL_UP), \
+       PORT_GP_CFG_1(6, 10, fn, sfx, CFG_FLAGS), \
+       PORT_GP_CFG_1(6, 11, fn, sfx, CFG_FLAGS), \
+       PORT_GP_CFG_1(6, 12, fn, sfx, CFG_FLAGS), \
+       PORT_GP_CFG_1(6, 13, fn, sfx, CFG_FLAGS), \
+       PORT_GP_CFG_1(6, 14, fn, sfx, CFG_FLAGS), \
+       PORT_GP_CFG_1(6, 15, fn, sfx, CFG_FLAGS), \
+       PORT_GP_CFG_1(6, 16, fn, sfx, CFG_FLAGS), \
+       PORT_GP_CFG_1(6, 17, fn, sfx, CFG_FLAGS)
 /*
  * F_() : just information
  * FM() : macro for FN_xxx / xxx_MARK
 #define GPSR5_7                F_(SCK2_A,              IP12_7_4)
 #define GPSR5_6                F_(TX1,                 IP12_3_0)
 #define GPSR5_5                F_(RX1,                 IP11_31_28)
-#define GPSR5_4                F_(RTS0_N_A,            IP11_23_20)
+#define GPSR5_4                F_(RTS0_N_TANS_A,       IP11_23_20)
 #define GPSR5_3                F_(CTS0_N_A,            IP11_19_16)
 #define GPSR5_2                F_(TX0_A,               IP11_15_12)
 #define GPSR5_1                F_(RX0_A,               IP11_11_8)
 #define IP3_3_0                FM(A1)                  FM(IRQ1)                FM(PWM3_A)              FM(DU_DOTCLKIN1)        FM(VI5_DATA0_A)         FM(DU_DISP_CDE) FM(SDA6_B)      FM(IETX)        FM(QCPV_QDE)    F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP3_7_4                FM(A2)                  FM(IRQ2)                FM(AVB_AVTP_PPS)        FM(VI4_CLKENB)          FM(VI5_DATA1_A)         FM(DU_DISP)     FM(SCL6_B)      F_(0, 0)        FM(QSTVB_QVE)   F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP3_11_8       FM(A3)                  FM(CTS4_N_A)            FM(PWM4_A)              FM(VI4_DATA12)          F_(0, 0)                FM(DU_DOTCLKOUT0) FM(HTX3_D)    FM(IECLK)       FM(LCDOUT12)    F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP3_15_12      FM(A4)                  FM(RTS4_N_A)            FM(MSIOF3_SYNC_B)       FM(VI4_DATA8)           FM(PWM2_B)              FM(DU_DG4)      FM(RIF2_CLK_B)  F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_15_12      FM(A4)                  FM(RTS4_N_TANS_A)       FM(MSIOF3_SYNC_B)       FM(VI4_DATA8)           FM(PWM2_B)              FM(DU_DG4)      FM(RIF2_CLK_B)  F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP3_19_16      FM(A5)                  FM(SCK4_A)              FM(MSIOF3_SCK_B)        FM(VI4_DATA9)           FM(PWM3_B)              F_(0, 0)        FM(RIF2_SYNC_B) F_(0, 0)        FM(QPOLA)       F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP3_23_20      FM(A6)                  FM(RX4_A)               FM(MSIOF3_RXD_B)        FM(VI4_DATA10)          F_(0, 0)                F_(0, 0)        FM(RIF2_D0_B)   F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP3_27_24      FM(A7)                  FM(TX4_A)               FM(MSIOF3_TXD_B)        FM(VI4_DATA11)          F_(0, 0)                F_(0, 0)        FM(RIF2_D1_B)   F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP5_15_12      FM(CS0_N)               FM(SCL5)                F_(0, 0)                F_(0, 0)                F_(0, 0)                FM(DU_DR0)      FM(VI4_DATA2_B) F_(0, 0)        FM(LCDOUT16)    F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP5_19_16      FM(WE0_N)               FM(SDA5)                F_(0, 0)                F_(0, 0)                F_(0, 0)                FM(DU_DR1)      FM(VI4_DATA3_B) F_(0, 0)        FM(LCDOUT17)    F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP5_23_20      FM(D0)                  FM(MSIOF3_SCK_A)        F_(0, 0)                F_(0, 0)                F_(0, 0)                FM(DU_DR2)      FM(CTS4_N_C)    F_(0, 0)        FM(LCDOUT18)    F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP5_27_24      FM(D1)                  FM(MSIOF3_SYNC_A)       FM(SCK3_A)              FM(VI4_DATA23)          FM(VI5_CLKENB_A)        FM(DU_DB7)      FM(RTS4_N_C)    F_(0, 0)        FM(LCDOUT7)     F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_27_24      FM(D1)                  FM(MSIOF3_SYNC_A)       FM(SCK3_A)              FM(VI4_DATA23)          FM(VI5_CLKENB_A)        FM(DU_DB7)      FM(RTS4_N_TANS_C) F_(0, 0)      FM(LCDOUT7)     F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP5_31_28      FM(D2)                  FM(MSIOF3_RXD_A)        FM(RX5_C)               F_(0, 0)                FM(VI5_DATA14_A)        FM(DU_DR3)      FM(RX4_C)       F_(0, 0)        FM(LCDOUT19)    F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP6_3_0                FM(D3)                  FM(MSIOF3_TXD_A)        FM(TX5_C)               F_(0, 0)                FM(VI5_DATA15_A)        FM(DU_DR4)      FM(TX4_C)       F_(0, 0)        FM(LCDOUT20)    F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP6_7_4                FM(D4)                  FM(CANFD1_TX)           FM(HSCK3_B)             FM(CAN1_TX)             FM(RTS3_N_A)    FM(MSIOF3_SS2_A) F_(0, 0)       FM(VI5_DATA1_B) F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_7_4                FM(D4)                  FM(CANFD1_TX)           FM(HSCK3_B)             FM(CAN1_TX)             FM(RTS3_N_TANS_A)       FM(MSIOF3_SS2_A) F_(0, 0)       FM(VI5_DATA1_B) F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP6_11_8       FM(D5)                  FM(RX3_A)               FM(HRX3_B)              F_(0, 0)                F_(0, 0)                FM(DU_DR5)      FM(VI4_DATA4_B) F_(0, 0)        FM(LCDOUT21)    F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP6_15_12      FM(D6)                  FM(TX3_A)               FM(HTX3_B)              F_(0, 0)                F_(0, 0)                FM(DU_DR6)      FM(VI4_DATA5_B) F_(0, 0)        FM(LCDOUT22)    F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP6_19_16      FM(D7)                  FM(CANFD1_RX)           FM(IRQ5)                FM(CAN1_RX)             FM(CTS3_N_A)            F_(0, 0)        F_(0, 0)        FM(VI5_DATA2_B) F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP11_11_8      FM(RX0_A)               FM(HRX1_A)              FM(SSI_SCK2_A)          FM(RIF1_SYNC)           F_(0, 0)                F_(0, 0)        F_(0, 0)        FM(TS_SCK1)     F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP11_15_12     FM(TX0_A)               FM(HTX1_A)              FM(SSI_WS2_A)           FM(RIF1_D0)             F_(0, 0)                F_(0, 0)        F_(0, 0)        FM(TS_SDAT1)    F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP11_19_16     FM(CTS0_N_A)            FM(NFDATA14_A)          FM(AUDIO_CLKOUT_A)      FM(RIF1_D1)             FM(SCIF_CLK_A)          FM(FMCLK_A)     F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP11_23_20     FM(RTS0_N_A)            FM(NFDATA15_A)          FM(AUDIO_CLKOUT1_A)     FM(RIF1_CLK)            FM(SCL2_A)              FM(FMIN_A)      F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP11_27_24     FM(SCK0_A)              FM(HSCK1_A)             FM(USB3HS0_ID)          FM(RTS1_N)              FM(SDA2_A)              FM(FMCLK_C)     F_(0, 0)        F_(0, 0)        FM(USB0_ID)     F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP11_23_20     FM(RTS0_N_TANS_A)       FM(NFDATA15_A)          FM(AUDIO_CLKOUT1_A)     FM(RIF1_CLK)            FM(SCL2_A)              FM(FMIN_A)      F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP11_27_24     FM(SCK0_A)              FM(HSCK1_A)             FM(USB3HS0_ID)          FM(RTS1_N_TANS)         FM(SDA2_A)              FM(FMCLK_C)     F_(0, 0)        F_(0, 0)        FM(USB0_ID)     F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP11_31_28     FM(RX1)                 FM(HRX2_B)              FM(SSI_SCK9_B)          FM(AUDIO_CLKOUT1_B)     F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 
 /* IPSRx */            /* 0 */                 /* 1 */                 /* 2 */                 /* 3 */                 /* 4 */                 /* 5 */         /* 6 */         /* 7 */         /* 8 */         /* 9 - F */
@@ -394,29 +403,33 @@ FM(IP12_23_20)    IP12_23_20      FM(IP13_23_20)  IP13_23_20      FM(IP14_23_20)  IP14_23_20      FM
 FM(IP12_27_24) IP12_27_24      FM(IP13_27_24)  IP13_27_24      FM(IP14_27_24)  IP14_27_24      FM(IP15_27_24)  IP15_27_24 \
 FM(IP12_31_28) IP12_31_28      FM(IP13_31_28)  IP13_31_28      FM(IP14_31_28)  IP14_31_28      FM(IP15_31_28)  IP15_31_28
 
+/* The bit numbering in MOD_SEL fields is reversed */
+#define REV4(f0, f1, f2, f3)                   f0 f2 f1 f3
+#define REV8(f0, f1, f2, f3, f4, f5, f6, f7)   f0 f4 f2 f6 f1 f5 f3 f7
+
 /* MOD_SEL0 */                 /* 0 */                         /* 1 */                         /* 2 */                         /* 3 */                 /* 4 */                 /* 5 */         /* 6 */         /* 7 */
-#define MOD_SEL0_30_29         FM(SEL_ADGB_0)                  FM(SEL_ADGB_1)                  FM(SEL_ADGB_2)                  F_(0, 0)
+#define MOD_SEL0_30_29    REV4(FM(SEL_ADGB_0),                 FM(SEL_ADGB_1),                 FM(SEL_ADGB_2),                 F_(0, 0))
 #define MOD_SEL0_28            FM(SEL_DRIF0_0)                 FM(SEL_DRIF0_1)
-#define MOD_SEL0_27_26         FM(SEL_FM_0)                    FM(SEL_FM_1)                    FM(SEL_FM_2)                    F_(0, 0)
+#define MOD_SEL0_27_26    REV4(FM(SEL_FM_0),                   FM(SEL_FM_1),                   FM(SEL_FM_2),                   F_(0, 0))
 #define MOD_SEL0_25            FM(SEL_FSO_0)                   FM(SEL_FSO_1)
 #define MOD_SEL0_24            FM(SEL_HSCIF0_0)                FM(SEL_HSCIF0_1)
 #define MOD_SEL0_23            FM(SEL_HSCIF1_0)                FM(SEL_HSCIF1_1)
 #define MOD_SEL0_22            FM(SEL_HSCIF2_0)                FM(SEL_HSCIF2_1)
-#define MOD_SEL0_21_20         FM(SEL_I2C1_0)                  FM(SEL_I2C1_1)                  FM(SEL_I2C1_2)                  FM(SEL_I2C1_3)          FM(SEL_I2C1_4)          F_(0, 0)        F_(0, 0)        F_(0, 0)
-#define MOD_SEL0_19_18_17      FM(SEL_I2C2_0)                  FM(SEL_I2C2_1)                  FM(SEL_I2C2_2)                  FM(SEL_I2C2_3)          FM(SEL_I2C2_4)          F_(0, 0)        F_(0, 0)        F_(0, 0)
+#define MOD_SEL0_21_20    REV4(FM(SEL_I2C1_0),                 FM(SEL_I2C1_1),                 FM(SEL_I2C1_2),                 FM(SEL_I2C1_3))
+#define MOD_SEL0_19_18_17  REV8(FM(SEL_I2C2_0),                        FM(SEL_I2C2_1),                 FM(SEL_I2C2_2),                 FM(SEL_I2C2_3),         FM(SEL_I2C2_4),         F_(0, 0),       F_(0, 0),       F_(0, 0))
 #define MOD_SEL0_16            FM(SEL_NDFC_0)                  FM(SEL_NDFC_1)
 #define MOD_SEL0_15            FM(SEL_PWM0_0)                  FM(SEL_PWM0_1)
 #define MOD_SEL0_14            FM(SEL_PWM1_0)                  FM(SEL_PWM1_1)
-#define MOD_SEL0_13_12         FM(SEL_PWM2_0)                  FM(SEL_PWM2_1)                  FM(SEL_PWM2_2)                  F_(0, 0)
-#define MOD_SEL0_11_10         FM(SEL_PWM3_0)                  FM(SEL_PWM3_1)                  FM(SEL_PWM3_2)                  F_(0, 0)
+#define MOD_SEL0_13_12    REV4(FM(SEL_PWM2_0),                 FM(SEL_PWM2_1),                 FM(SEL_PWM2_2),                 F_(0, 0))
+#define MOD_SEL0_11_10    REV4(FM(SEL_PWM3_0),                 FM(SEL_PWM3_1),                 FM(SEL_PWM3_2),                 F_(0, 0))
 #define MOD_SEL0_9             FM(SEL_PWM4_0)                  FM(SEL_PWM4_1)
 #define MOD_SEL0_8             FM(SEL_PWM5_0)                  FM(SEL_PWM5_1)
 #define MOD_SEL0_7             FM(SEL_PWM6_0)                  FM(SEL_PWM6_1)
-#define MOD_SEL0_6_5           FM(SEL_REMOCON_0)               FM(SEL_REMOCON_1)               FM(SEL_REMOCON_2)               F_(0, 0)
+#define MOD_SEL0_6_5      REV4(FM(SEL_REMOCON_0),              FM(SEL_REMOCON_1),              FM(SEL_REMOCON_2),              F_(0, 0))
 #define MOD_SEL0_4             FM(SEL_SCIF_0)                  FM(SEL_SCIF_1)
 #define MOD_SEL0_3             FM(SEL_SCIF0_0)                 FM(SEL_SCIF0_1)
 #define MOD_SEL0_2             FM(SEL_SCIF2_0)                 FM(SEL_SCIF2_1)
-#define MOD_SEL0_1_0           FM(SEL_SPEED_PULSE_IF_0)        FM(SEL_SPEED_PULSE_IF_1)        FM(SEL_SPEED_PULSE_IF_2)        F_(0, 0)
+#define MOD_SEL0_1_0      REV4(FM(SEL_SPEED_PULSE_IF_0),       FM(SEL_SPEED_PULSE_IF_1),       FM(SEL_SPEED_PULSE_IF_2),       F_(0, 0))
 
 /* MOD_SEL1 */                 /* 0 */                         /* 1 */                         /* 2 */                         /* 3 */                 /* 4 */                 /* 5 */         /* 6 */         /* 7 */
 #define MOD_SEL1_31            FM(SEL_SIMCARD_0)               FM(SEL_SIMCARD_1)
@@ -425,18 +438,18 @@ FM(IP12_31_28)    IP12_31_28      FM(IP13_31_28)  IP13_31_28      FM(IP14_31_28)  IP14_31_28      FM
 #define MOD_SEL1_28            FM(SEL_USB_20_CH0_0)            FM(SEL_USB_20_CH0_1)
 #define MOD_SEL1_26            FM(SEL_DRIF2_0)                 FM(SEL_DRIF2_1)
 #define MOD_SEL1_25            FM(SEL_DRIF3_0)                 FM(SEL_DRIF3_1)
-#define MOD_SEL1_24_23_22      FM(SEL_HSCIF3_0)                FM(SEL_HSCIF3_1)                FM(SEL_HSCIF3_2)                FM(SEL_HSCIF3_3)        FM(SEL_HSCIF3_4)        F_(0, 0)        F_(0, 0)        F_(0, 0)
-#define MOD_SEL1_21_20_19      FM(SEL_HSCIF4_0)                FM(SEL_HSCIF4_1)                FM(SEL_HSCIF4_2)                FM(SEL_HSCIF4_3)        FM(SEL_HSCIF4_4)        F_(0, 0)        F_(0, 0)        F_(0, 0)
+#define MOD_SEL1_24_23_22  REV8(FM(SEL_HSCIF3_0),              FM(SEL_HSCIF3_1),               FM(SEL_HSCIF3_2),               FM(SEL_HSCIF3_3),       FM(SEL_HSCIF3_4),       F_(0, 0),       F_(0, 0),       F_(0, 0))
+#define MOD_SEL1_21_20_19  REV8(FM(SEL_HSCIF4_0),              FM(SEL_HSCIF4_1),               FM(SEL_HSCIF4_2),               FM(SEL_HSCIF4_3),       FM(SEL_HSCIF4_4),       F_(0, 0),       F_(0, 0),       F_(0, 0))
 #define MOD_SEL1_18            FM(SEL_I2C6_0)                  FM(SEL_I2C6_1)
 #define MOD_SEL1_17            FM(SEL_I2C7_0)                  FM(SEL_I2C7_1)
 #define MOD_SEL1_16            FM(SEL_MSIOF2_0)                FM(SEL_MSIOF2_1)
 #define MOD_SEL1_15            FM(SEL_MSIOF3_0)                FM(SEL_MSIOF3_1)
-#define MOD_SEL1_14_13         FM(SEL_SCIF3_0)                 FM(SEL_SCIF3_1)                 FM(SEL_SCIF3_2)                 F_(0, 0)
-#define MOD_SEL1_12_11         FM(SEL_SCIF4_0)                 FM(SEL_SCIF4_1)                 FM(SEL_SCIF4_2)                 F_(0, 0)
-#define MOD_SEL1_10_9          FM(SEL_SCIF5_0)                 FM(SEL_SCIF5_1)                 FM(SEL_SCIF5_2)                 F_(0, 0)
+#define MOD_SEL1_14_13    REV4(FM(SEL_SCIF3_0),                FM(SEL_SCIF3_1),                FM(SEL_SCIF3_2),                F_(0, 0))
+#define MOD_SEL1_12_11    REV4(FM(SEL_SCIF4_0),                FM(SEL_SCIF4_1),                FM(SEL_SCIF4_2),                F_(0, 0))
+#define MOD_SEL1_10_9     REV4(FM(SEL_SCIF5_0),                FM(SEL_SCIF5_1),                FM(SEL_SCIF5_2),                F_(0, 0))
 #define MOD_SEL1_8             FM(SEL_VIN4_0)                  FM(SEL_VIN4_1)
 #define MOD_SEL1_7             FM(SEL_VIN5_0)                  FM(SEL_VIN5_1)
-#define MOD_SEL1_6_5           FM(SEL_ADGC_0)                  FM(SEL_ADGC_1)                  FM(SEL_ADGC_2)                  F_(0, 0)
+#define MOD_SEL1_6_5      REV4(FM(SEL_ADGC_0),                 FM(SEL_ADGC_1),                 FM(SEL_ADGC_2),                 F_(0, 0))
 #define MOD_SEL1_4             FM(SEL_SSI9_0)                  FM(SEL_SSI9_1)
 
 #define PINMUX_MOD_SELS        \
@@ -661,7 +674,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_GPSR(IP3_11_8,              LCDOUT12),
 
        PINMUX_IPSR_GPSR(IP3_15_12,             A4),
-       PINMUX_IPSR_MSEL(IP3_15_12,             RTS4_N_A,       SEL_SCIF4_0),
+       PINMUX_IPSR_MSEL(IP3_15_12,             RTS4_N_TANS_A,  SEL_SCIF4_0),
        PINMUX_IPSR_MSEL(IP3_15_12,             MSIOF3_SYNC_B,  SEL_MSIOF3_1),
        PINMUX_IPSR_GPSR(IP3_15_12,             VI4_DATA8),
        PINMUX_IPSR_MSEL(IP3_15_12,             PWM2_B,         SEL_PWM2_1),
@@ -811,7 +824,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_GPSR(IP5_27_24,             VI4_DATA23),
        PINMUX_IPSR_MSEL(IP5_27_24,             VI5_CLKENB_A,   SEL_VIN5_0),
        PINMUX_IPSR_GPSR(IP5_27_24,             DU_DB7),
-       PINMUX_IPSR_MSEL(IP5_27_24,             RTS4_N_C,       SEL_SCIF4_2),
+       PINMUX_IPSR_MSEL(IP5_27_24,             RTS4_N_TANS_C,  SEL_SCIF4_2),
        PINMUX_IPSR_GPSR(IP5_27_24,             LCDOUT7),
 
        PINMUX_IPSR_GPSR(IP5_31_28,             D2),
@@ -835,7 +848,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_GPSR(IP6_7_4,               CANFD1_TX),
        PINMUX_IPSR_MSEL(IP6_7_4,               HSCK3_B,        SEL_HSCIF3_1),
        PINMUX_IPSR_GPSR(IP6_7_4,               CAN1_TX),
-       PINMUX_IPSR_MSEL(IP6_7_4,               RTS3_N_A,       SEL_SCIF3_0),
+       PINMUX_IPSR_MSEL(IP6_7_4,               RTS3_N_TANS_A,  SEL_SCIF3_0),
        PINMUX_IPSR_GPSR(IP6_7_4,               MSIOF3_SS2_A),
        PINMUX_IPSR_MSEL(IP6_7_4,               VI5_DATA1_B,    SEL_VIN5_1),
 
@@ -1027,7 +1040,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_GPSR(IP10_23_20,            NFCLE),
 
        PINMUX_IPSR_GPSR(IP10_27_24,            SD0_CD),
-       PINMUX_IPSR_MSEL(IP10_27_24,            NFALE_A,        SEL_NDFC_0),
+       PINMUX_IPSR_GPSR(IP10_27_24,            NFALE_A),
        PINMUX_IPSR_GPSR(IP10_27_24,            SD3_CD),
        PINMUX_IPSR_MSEL(IP10_27_24,            RIF0_CLK_B,     SEL_DRIF0_1),
        PINMUX_IPSR_MSEL(IP10_27_24,            SCL2_B,         SEL_I2C2_1),
@@ -1036,7 +1049,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_GPSR(IP10_27_24,            TS_SCK0),
 
        PINMUX_IPSR_GPSR(IP10_31_28,            SD0_WP),
-       PINMUX_IPSR_MSEL(IP10_31_28,            NFRB_N_A,       SEL_NDFC_0),
+       PINMUX_IPSR_GPSR(IP10_31_28,            NFRB_N_A),
        PINMUX_IPSR_GPSR(IP10_31_28,            SD3_WP),
        PINMUX_IPSR_MSEL(IP10_31_28,            RIF0_D0_B,      SEL_DRIF0_1),
        PINMUX_IPSR_MSEL(IP10_31_28,            SDA2_B,         SEL_I2C2_1),
@@ -1076,7 +1089,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_MSEL(IP11_19_16,            SCIF_CLK_A,     SEL_SCIF_0),
        PINMUX_IPSR_MSEL(IP11_19_16,            FMCLK_A,        SEL_FM_0),
 
-       PINMUX_IPSR_MSEL(IP11_23_20,            RTS0_N_A,       SEL_SCIF0_0),
+       PINMUX_IPSR_MSEL(IP11_23_20,            RTS0_N_TANS_A,  SEL_SCIF0_0),
        PINMUX_IPSR_MSEL(IP11_23_20,            NFDATA15_A,     SEL_NDFC_0),
        PINMUX_IPSR_GPSR(IP11_23_20,            AUDIO_CLKOUT1_A),
        PINMUX_IPSR_GPSR(IP11_23_20,            RIF1_CLK),
@@ -1086,7 +1099,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_MSEL(IP11_27_24,            SCK0_A,         SEL_SCIF0_0),
        PINMUX_IPSR_MSEL(IP11_27_24,            HSCK1_A,        SEL_HSCIF1_0),
        PINMUX_IPSR_GPSR(IP11_27_24,            USB3HS0_ID),
-       PINMUX_IPSR_GPSR(IP11_27_24,            RTS1_N),
+       PINMUX_IPSR_GPSR(IP11_27_24,            RTS1_N_TANS),
        PINMUX_IPSR_MSEL(IP11_27_24,            SDA2_A,         SEL_I2C2_0),
        PINMUX_IPSR_MSEL(IP11_27_24,            FMCLK_C,        SEL_FM_2),
        PINMUX_IPSR_GPSR(IP11_27_24,            USB0_ID),
@@ -1173,7 +1186,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_MSEL(IP13_19_16,            SIM0_D_A,       SEL_SIMCARD_0),
 
        PINMUX_IPSR_GPSR(IP13_23_20,            MLB_DAT),
-       PINMUX_IPSR_MSEL(IP13_23_20,            TX0_B,          SEL_SCIF0_0),
+       PINMUX_IPSR_MSEL(IP13_23_20,            TX0_B,          SEL_SCIF0_1),
        PINMUX_IPSR_MSEL(IP13_23_20,            RIF0_SYNC_A,    SEL_DRIF0_0),
        PINMUX_IPSR_GPSR(IP13_23_20,            SIM0_CLK_A),
 
@@ -1258,10 +1271,10 @@ static const u16 pinmux_data[] = {
 
 /*
  * Static pins can not be muxed between different functions but
- * still needs a mark entry in the pinmux list. Add each static
+ * still need mark entries in the pinmux list. Add each static
  * pin to the list without an associated function. The sh-pfc
- * core will do the right thing and skip trying to mux then pin
- * while still applying configuration to it
+ * core will do the right thing and skip trying to mux the pin
+ * while still applying configuration to it.
  */
 #define FM(x)   PINMUX_DATA(x##_MARK, 0),
        PINMUX_STATIC
@@ -1792,7 +1805,6 @@ static const unsigned int du_rgb666_pins[] = {
        RCAR_GP_PIN(0, 1),  RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 16),
        RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 13),
 };
-
 static const unsigned int du_rgb666_mux[] = {
        DU_DR7_MARK, DU_DR6_MARK, DU_DR5_MARK, DU_DR4_MARK,
        DU_DR3_MARK, DU_DR2_MARK,
@@ -1801,7 +1813,6 @@ static const unsigned int du_rgb666_mux[] = {
        DU_DB7_MARK, DU_DB6_MARK, DU_DB5_MARK, DU_DB4_MARK,
        DU_DB3_MARK, DU_DB2_MARK,
 };
-
 static const unsigned int du_rgb888_pins[] = {
        /* R[7:0], G[7:0], B[7:0] */
        RCAR_GP_PIN(0, 8),  RCAR_GP_PIN(0, 6),  RCAR_GP_PIN(0, 5),
@@ -1812,9 +1823,8 @@ static const unsigned int du_rgb888_pins[] = {
        RCAR_GP_PIN(0, 10), RCAR_GP_PIN(0, 9),
        RCAR_GP_PIN(0, 1),  RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 16),
        RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 13),
-       RCAR_GP_PIN(1, 18), RCAR_GP_PIN(1, 19),
+       RCAR_GP_PIN(1, 19), RCAR_GP_PIN(1, 18),
 };
-
 static const unsigned int du_rgb888_mux[] = {
        DU_DR7_MARK, DU_DR6_MARK, DU_DR5_MARK, DU_DR4_MARK,
        DU_DR3_MARK, DU_DR2_MARK, DU_DR1_MARK, DU_DR0_MARK,
@@ -1823,70 +1833,56 @@ static const unsigned int du_rgb888_mux[] = {
        DU_DB7_MARK, DU_DB6_MARK, DU_DB5_MARK, DU_DB4_MARK,
        DU_DB3_MARK, DU_DB2_MARK, DU_DB1_MARK, DU_DB0_MARK,
 };
-
+static const unsigned int du_clk_in_0_pins[] = {
+       /* CLKIN0 */
+       RCAR_GP_PIN(0, 16),
+};
+static const unsigned int du_clk_in_0_mux[] = {
+       DU_DOTCLKIN0_MARK
+};
+static const unsigned int du_clk_in_1_pins[] = {
+       /* CLKIN1 */
+       RCAR_GP_PIN(1, 1),
+};
+static const unsigned int du_clk_in_1_mux[] = {
+       DU_DOTCLKIN1_MARK
+};
 static const unsigned int du_clk_out_0_pins[] = {
        /* CLKOUT */
        RCAR_GP_PIN(1, 3),
 };
-
 static const unsigned int du_clk_out_0_mux[] = {
        DU_DOTCLKOUT0_MARK
 };
-
 static const unsigned int du_sync_pins[] = {
        /* VSYNC, HSYNC */
        RCAR_GP_PIN(1, 11), RCAR_GP_PIN(1, 8),
 };
-
 static const unsigned int du_sync_mux[] = {
        DU_VSYNC_MARK, DU_HSYNC_MARK
 };
-
+static const unsigned int du_disp_cde_pins[] = {
+       /* DISP_CDE */
+       RCAR_GP_PIN(1, 1),
+};
+static const unsigned int du_disp_cde_mux[] = {
+       DU_DISP_CDE_MARK,
+};
 static const unsigned int du_cde_pins[] = {
        /* CDE */
        RCAR_GP_PIN(1, 0),
 };
-
 static const unsigned int du_cde_mux[] = {
        DU_CDE_MARK,
 };
-
 static const unsigned int du_disp_pins[] = {
        /* DISP */
        RCAR_GP_PIN(1, 2),
 };
-
 static const unsigned int du_disp_mux[] = {
        DU_DISP_MARK,
 };
 
-static const unsigned int du_disp_cde_pins[] = {
-       /* DISP/CDE */
-       RCAR_GP_PIN(1, 1),
-};
-
-static const unsigned int du_disp_cde_mux[] = {
-       DU_DISP_CDE_MARK,
-};
-
-static const unsigned int du_clk_in_0_pins[] = {
-       /* DOTCLKIN0 */
-       RCAR_GP_PIN(0, 16),
-};
-
-static const unsigned int du_clk_in_0_mux[] = {
-       DU_DOTCLKIN0_MARK,
-};
-
-static const unsigned int du_clk_in_1_pins[] = {
-       /* DOTCLKIN0 */
-       RCAR_GP_PIN(1, 1),
-};
-
-static const unsigned int du_clk_in_1_mux[] = {
-       DU_DOTCLKIN1_MARK,
-};
-
 /* - HSCIF0 --------------------------------------------------*/
 static const unsigned int hscif0_data_a_pins[] = {
        /* RX, TX */
@@ -2073,7 +2069,7 @@ static const unsigned int hscif3_ctrl_c_mux[] = {
 
 static const unsigned int hscif3_data_d_pins[] = {
        /* RX, TX */
-       RCAR_GP_PIN(1, 3), RCAR_GP_PIN(1, 0),
+       RCAR_GP_PIN(1, 0), RCAR_GP_PIN(1, 3),
 };
 
 static const unsigned int hscif3_data_d_mux[] = {
@@ -2136,7 +2132,7 @@ static const unsigned int hscif4_data_b_mux[] = {
 };
 
 static const unsigned int hscif4_clk_b_pins[] = {
-/* SCK */
+       /* SCK */
        RCAR_GP_PIN(2, 6),
 };
 
@@ -2312,10 +2308,44 @@ static const unsigned int intc_ex_irq0_pins[] = {
        /* IRQ0 */
        RCAR_GP_PIN(1, 0),
 };
-
 static const unsigned int intc_ex_irq0_mux[] = {
        IRQ0_MARK,
 };
+static const unsigned int intc_ex_irq1_pins[] = {
+       /* IRQ1 */
+       RCAR_GP_PIN(1, 1),
+};
+static const unsigned int intc_ex_irq1_mux[] = {
+       IRQ1_MARK,
+};
+static const unsigned int intc_ex_irq2_pins[] = {
+       /* IRQ2 */
+       RCAR_GP_PIN(1, 2),
+};
+static const unsigned int intc_ex_irq2_mux[] = {
+       IRQ2_MARK,
+};
+static const unsigned int intc_ex_irq3_pins[] = {
+       /* IRQ3 */
+       RCAR_GP_PIN(1, 9),
+};
+static const unsigned int intc_ex_irq3_mux[] = {
+       IRQ3_MARK,
+};
+static const unsigned int intc_ex_irq4_pins[] = {
+       /* IRQ4 */
+       RCAR_GP_PIN(1, 10),
+};
+static const unsigned int intc_ex_irq4_mux[] = {
+       IRQ4_MARK,
+};
+static const unsigned int intc_ex_irq5_pins[] = {
+       /* IRQ5 */
+       RCAR_GP_PIN(0, 7),
+};
+static const unsigned int intc_ex_irq5_mux[] = {
+       IRQ5_MARK,
+};
 
 /* - MSIOF0 ----------------------------------------------------------------- */
 static const unsigned int msiof0_clk_pins[] = {
@@ -2812,7 +2842,7 @@ static const unsigned int scif0_ctrl_a_pins[] = {
 };
 
 static const unsigned int scif0_ctrl_a_mux[] = {
-       RTS0_N_A_MARK, CTS0_N_A_MARK,
+       RTS0_N_TANS_A_MARK, CTS0_N_A_MARK,
 };
 
 static const unsigned int scif0_data_b_pins[] = {
@@ -2858,7 +2888,7 @@ static const unsigned int scif1_ctrl_pins[] = {
 };
 
 static const unsigned int scif1_ctrl_mux[] = {
-       RTS1_N_MARK, CTS1_N_MARK,
+       RTS1_N_TANS_MARK, CTS1_N_MARK,
 };
 
 /* - SCIF2 ------------------------------------------------------------------ */
@@ -2914,7 +2944,7 @@ static const unsigned int scif3_ctrl_a_pins[] = {
 };
 
 static const unsigned int scif3_ctrl_a_mux[] = {
-       RTS3_N_A_MARK, CTS3_N_A_MARK,
+       RTS3_N_TANS_A_MARK, CTS3_N_A_MARK,
 };
 
 static const unsigned int scif3_data_b_pins[] = {
@@ -2969,7 +2999,7 @@ static const unsigned int scif4_ctrl_a_pins[] = {
 };
 
 static const unsigned int scif4_ctrl_a_mux[] = {
-       RTS4_N_A_MARK, CTS4_N_A_MARK,
+       RTS4_N_TANS_A_MARK, CTS4_N_A_MARK,
 };
 
 static const unsigned int scif4_data_b_pins[] = {
@@ -3005,7 +3035,7 @@ static const unsigned int scif4_ctrl_c_pins[] = {
 };
 
 static const unsigned int scif4_ctrl_c_mux[] = {
-       RTS4_N_C_MARK, CTS4_N_C_MARK,
+       RTS4_N_TANS_C_MARK, CTS4_N_C_MARK,
 };
 
 /* - SCIF5 ------------------------------------------------------------------ */
@@ -3507,270 +3537,120 @@ static const unsigned int usb30_id_mux[] = {
 };
 
 /* - VIN4 ------------------------------------------------------------------- */
-static const unsigned int vin4_data8_a_pins[] = {
-       RCAR_GP_PIN(2, 6),  RCAR_GP_PIN(2, 7),
+static const unsigned int vin4_data18_a_pins[] = {
        RCAR_GP_PIN(2, 8),  RCAR_GP_PIN(2, 9),
        RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11),
        RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13),
-};
-
-static const unsigned int vin4_data8_a_mux[] = {
-       VI4_DATA0_A_MARK, VI4_DATA1_A_MARK,
-       VI4_DATA2_A_MARK, VI4_DATA3_A_MARK,
-       VI4_DATA4_A_MARK, VI4_DATA5_A_MARK,
-       VI4_DATA6_A_MARK, VI4_DATA7_A_MARK,
-};
-
-static const unsigned int vin4_data10_a_pins[] = {
-       RCAR_GP_PIN(2, 6),  RCAR_GP_PIN(2, 7),
-       RCAR_GP_PIN(2, 8),  RCAR_GP_PIN(2, 9),
-       RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11),
-       RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13),
-       RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 5),
-};
-
-static const unsigned int vin4_data10_a_mux[] = {
-       VI4_DATA0_A_MARK, VI4_DATA1_A_MARK,
-       VI4_DATA2_A_MARK, VI4_DATA3_A_MARK,
-       VI4_DATA4_A_MARK, VI4_DATA5_A_MARK,
-       VI4_DATA6_A_MARK, VI4_DATA7_A_MARK,
-       VI4_DATA8_MARK,   VI4_DATA9_MARK,
-};
-
-static const unsigned int vin4_data12_a_pins[] = {
-       RCAR_GP_PIN(2, 6),  RCAR_GP_PIN(2, 7),
-       RCAR_GP_PIN(2, 8),  RCAR_GP_PIN(2, 9),
-       RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11),
-       RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13),
-       RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 5),
-       RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 7),
-};
-
-static const unsigned int vin4_data12_a_mux[] = {
-       VI4_DATA0_A_MARK, VI4_DATA1_A_MARK,
-       VI4_DATA2_A_MARK, VI4_DATA3_A_MARK,
-       VI4_DATA4_A_MARK, VI4_DATA5_A_MARK,
-       VI4_DATA6_A_MARK, VI4_DATA7_A_MARK,
-       VI4_DATA8_MARK,   VI4_DATA9_MARK,
-       VI4_DATA10_MARK,  VI4_DATA11_MARK,
-};
-
-static const unsigned int vin4_data16_a_pins[] = {
-       RCAR_GP_PIN(2, 6),  RCAR_GP_PIN(2, 7),
-       RCAR_GP_PIN(2, 8),  RCAR_GP_PIN(2, 9),
-       RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11),
-       RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13),
-       RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 5),
-       RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 7),
-       RCAR_GP_PIN(1, 3),  RCAR_GP_PIN(1, 10),
-       RCAR_GP_PIN(1, 13), RCAR_GP_PIN(1, 14),
-};
-
-static const unsigned int vin4_data16_a_mux[] = {
-       VI4_DATA0_A_MARK, VI4_DATA1_A_MARK,
-       VI4_DATA2_A_MARK, VI4_DATA3_A_MARK,
-       VI4_DATA4_A_MARK, VI4_DATA5_A_MARK,
-       VI4_DATA6_A_MARK, VI4_DATA7_A_MARK,
-       VI4_DATA8_MARK,   VI4_DATA9_MARK,
-       VI4_DATA10_MARK,  VI4_DATA11_MARK,
-       VI4_DATA12_MARK,  VI4_DATA13_MARK,
-       VI4_DATA14_MARK,  VI4_DATA15_MARK,
-};
-
-static const unsigned int vin4_data20_a_pins[] = {
-       RCAR_GP_PIN(2, 6),  RCAR_GP_PIN(2, 7),
-       RCAR_GP_PIN(2, 8),  RCAR_GP_PIN(2, 9),
-       RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11),
-       RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13),
-       RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 5),
        RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 7),
        RCAR_GP_PIN(1, 3),  RCAR_GP_PIN(1, 10),
        RCAR_GP_PIN(1, 13), RCAR_GP_PIN(1, 14),
-       RCAR_GP_PIN(1, 9),  RCAR_GP_PIN(1, 12),
-       RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 16),
-};
-
-static const unsigned int vin4_data20_a_mux[] = {
-       VI4_DATA0_A_MARK, VI4_DATA1_A_MARK,
-       VI4_DATA2_A_MARK, VI4_DATA3_A_MARK,
-       VI4_DATA4_A_MARK, VI4_DATA5_A_MARK,
-       VI4_DATA6_A_MARK, VI4_DATA7_A_MARK,
-       VI4_DATA8_MARK,   VI4_DATA9_MARK,
-       VI4_DATA10_MARK,  VI4_DATA11_MARK,
-       VI4_DATA12_MARK,  VI4_DATA13_MARK,
-       VI4_DATA14_MARK,  VI4_DATA15_MARK,
-       VI4_DATA16_MARK,  VI4_DATA17_MARK,
-       VI4_DATA18_MARK,  VI4_DATA19_MARK,
-};
-
-static const unsigned int vin4_data24_a_pins[] = {
-       RCAR_GP_PIN(2, 6),  RCAR_GP_PIN(2, 7),
-       RCAR_GP_PIN(2, 8),  RCAR_GP_PIN(2, 9),
-       RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11),
-       RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13),
-       RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 5),
-       RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 7),
-       RCAR_GP_PIN(1, 3),  RCAR_GP_PIN(1, 10),
-       RCAR_GP_PIN(1, 13), RCAR_GP_PIN(1, 14),
-       RCAR_GP_PIN(1, 9),  RCAR_GP_PIN(1, 12),
        RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 16),
        RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 18),
        RCAR_GP_PIN(1, 19), RCAR_GP_PIN(0, 1),
 };
 
-static const unsigned int vin4_data24_a_mux[] = {
-       VI4_DATA0_A_MARK, VI4_DATA1_A_MARK,
+static const unsigned int vin4_data18_a_mux[] = {
        VI4_DATA2_A_MARK, VI4_DATA3_A_MARK,
        VI4_DATA4_A_MARK, VI4_DATA5_A_MARK,
        VI4_DATA6_A_MARK, VI4_DATA7_A_MARK,
-       VI4_DATA8_MARK,   VI4_DATA9_MARK,
        VI4_DATA10_MARK,  VI4_DATA11_MARK,
        VI4_DATA12_MARK,  VI4_DATA13_MARK,
        VI4_DATA14_MARK,  VI4_DATA15_MARK,
-       VI4_DATA16_MARK,  VI4_DATA17_MARK,
        VI4_DATA18_MARK,  VI4_DATA19_MARK,
        VI4_DATA20_MARK,  VI4_DATA21_MARK,
        VI4_DATA22_MARK,  VI4_DATA23_MARK,
 };
 
-static const unsigned int vin4_data8_b_pins[] = {
-       RCAR_GP_PIN(1, 8),  RCAR_GP_PIN(1, 11),
-       RCAR_GP_PIN(1, 21), RCAR_GP_PIN(1, 22),
-       RCAR_GP_PIN(0, 5),  RCAR_GP_PIN(0, 6),
-       RCAR_GP_PIN(0, 16), RCAR_GP_PIN(0, 17),
-};
-
-static const unsigned int vin4_data8_b_mux[] = {
-       VI4_DATA0_B_MARK, VI4_DATA1_B_MARK,
-       VI4_DATA2_B_MARK, VI4_DATA3_B_MARK,
-       VI4_DATA4_B_MARK, VI4_DATA5_B_MARK,
-       VI4_DATA6_B_MARK, VI4_DATA7_B_MARK,
-};
-
-static const unsigned int vin4_data10_b_pins[] = {
-       RCAR_GP_PIN(1, 8),  RCAR_GP_PIN(1, 11),
-       RCAR_GP_PIN(1, 21), RCAR_GP_PIN(1, 22),
-       RCAR_GP_PIN(0, 5),  RCAR_GP_PIN(0, 6),
-       RCAR_GP_PIN(0, 16), RCAR_GP_PIN(0, 17),
-       RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 5),
-};
-
-static const unsigned int vin4_data10_b_mux[] = {
-       VI4_DATA0_B_MARK, VI4_DATA1_B_MARK,
-       VI4_DATA2_B_MARK, VI4_DATA3_B_MARK,
-       VI4_DATA4_B_MARK, VI4_DATA5_B_MARK,
-       VI4_DATA6_B_MARK, VI4_DATA7_B_MARK,
-       VI4_DATA8_MARK,   VI4_DATA9_MARK,
-};
-
-static const unsigned int vin4_data12_b_pins[] = {
-       RCAR_GP_PIN(1, 8),  RCAR_GP_PIN(1, 11),
-       RCAR_GP_PIN(1, 21), RCAR_GP_PIN(1, 22),
-       RCAR_GP_PIN(0, 5),  RCAR_GP_PIN(0, 6),
-       RCAR_GP_PIN(0, 16), RCAR_GP_PIN(0, 17),
-       RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 5),
-       RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 7),
-};
-
-static const unsigned int vin4_data12_b_mux[] = {
-       VI4_DATA0_B_MARK, VI4_DATA1_B_MARK,
-       VI4_DATA2_B_MARK, VI4_DATA3_B_MARK,
-       VI4_DATA4_B_MARK, VI4_DATA5_B_MARK,
-       VI4_DATA6_B_MARK, VI4_DATA7_B_MARK,
-       VI4_DATA8_MARK,   VI4_DATA9_MARK,
-       VI4_DATA10_MARK,  VI4_DATA11_MARK,
-};
-
-static const unsigned int vin4_data16_b_pins[] = {
-       RCAR_GP_PIN(1, 8),  RCAR_GP_PIN(1, 11),
-       RCAR_GP_PIN(1, 21), RCAR_GP_PIN(1, 22),
-       RCAR_GP_PIN(0, 5),  RCAR_GP_PIN(0, 6),
-       RCAR_GP_PIN(0, 16), RCAR_GP_PIN(0, 17),
-       RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 5),
-       RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 7),
-       RCAR_GP_PIN(1, 3),  RCAR_GP_PIN(1, 10),
-       RCAR_GP_PIN(1, 13), RCAR_GP_PIN(1, 14),
+static const union vin_data vin4_data_a_pins = {
+       .data24 = {
+               RCAR_GP_PIN(2, 6),  RCAR_GP_PIN(2, 7),
+               RCAR_GP_PIN(2, 8),  RCAR_GP_PIN(2, 9),
+               RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11),
+               RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13),
+               RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 5),
+               RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 7),
+               RCAR_GP_PIN(1, 3),  RCAR_GP_PIN(1, 10),
+               RCAR_GP_PIN(1, 13), RCAR_GP_PIN(1, 14),
+               RCAR_GP_PIN(1, 9),  RCAR_GP_PIN(1, 12),
+               RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 16),
+               RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 18),
+               RCAR_GP_PIN(1, 19), RCAR_GP_PIN(0, 1),
+       },
 };
 
-static const unsigned int vin4_data16_b_mux[] = {
-       VI4_DATA0_B_MARK, VI4_DATA1_B_MARK,
-       VI4_DATA2_B_MARK, VI4_DATA3_B_MARK,
-       VI4_DATA4_B_MARK, VI4_DATA5_B_MARK,
-       VI4_DATA6_B_MARK, VI4_DATA7_B_MARK,
-       VI4_DATA8_MARK,   VI4_DATA9_MARK,
-       VI4_DATA10_MARK,  VI4_DATA11_MARK,
-       VI4_DATA12_MARK,  VI4_DATA13_MARK,
-       VI4_DATA14_MARK,  VI4_DATA15_MARK,
+static const union vin_data vin4_data_a_mux = {
+       .data24 = {
+               VI4_DATA0_A_MARK, VI4_DATA1_A_MARK,
+               VI4_DATA2_A_MARK, VI4_DATA3_A_MARK,
+               VI4_DATA4_A_MARK, VI4_DATA5_A_MARK,
+               VI4_DATA6_A_MARK, VI4_DATA7_A_MARK,
+               VI4_DATA8_MARK,   VI4_DATA9_MARK,
+               VI4_DATA10_MARK,  VI4_DATA11_MARK,
+               VI4_DATA12_MARK,  VI4_DATA13_MARK,
+               VI4_DATA14_MARK,  VI4_DATA15_MARK,
+               VI4_DATA16_MARK,  VI4_DATA17_MARK,
+               VI4_DATA18_MARK,  VI4_DATA19_MARK,
+               VI4_DATA20_MARK,  VI4_DATA21_MARK,
+               VI4_DATA22_MARK,  VI4_DATA23_MARK,
+       },
 };
 
-static const unsigned int vin4_data20_b_pins[] = {
-       RCAR_GP_PIN(1, 8),  RCAR_GP_PIN(1, 11),
+static const unsigned int vin4_data18_b_pins[] = {
        RCAR_GP_PIN(1, 21), RCAR_GP_PIN(1, 22),
        RCAR_GP_PIN(0, 5),  RCAR_GP_PIN(0, 6),
        RCAR_GP_PIN(0, 16), RCAR_GP_PIN(0, 17),
-       RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 5),
        RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 7),
        RCAR_GP_PIN(1, 3),  RCAR_GP_PIN(1, 10),
        RCAR_GP_PIN(1, 13), RCAR_GP_PIN(1, 14),
-       RCAR_GP_PIN(1, 9),  RCAR_GP_PIN(1, 12),
        RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 16),
-};
-
-static const unsigned int vin4_data20_b_mux[] = {
-       VI4_DATA0_B_MARK, VI4_DATA1_B_MARK,
-       VI4_DATA2_B_MARK, VI4_DATA3_B_MARK,
-       VI4_DATA4_B_MARK, VI4_DATA5_B_MARK,
-       VI4_DATA6_B_MARK, VI4_DATA7_B_MARK,
-       VI4_DATA8_MARK,   VI4_DATA9_MARK,
-       VI4_DATA10_MARK,  VI4_DATA11_MARK,
-       VI4_DATA12_MARK,  VI4_DATA13_MARK,
-       VI4_DATA14_MARK,  VI4_DATA15_MARK,
-       VI4_DATA16_MARK,  VI4_DATA17_MARK,
-       VI4_DATA18_MARK,  VI4_DATA19_MARK,
-};
-
-static const unsigned int vin4_data24_b_pins[] = {
-       RCAR_GP_PIN(1, 8),  RCAR_GP_PIN(1, 11),
-       RCAR_GP_PIN(1, 21), RCAR_GP_PIN(1, 22),
-       RCAR_GP_PIN(0, 5),  RCAR_GP_PIN(0, 6),
-       RCAR_GP_PIN(0, 16), RCAR_GP_PIN(0, 17),
-       RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 5),
-       RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 7),
-       RCAR_GP_PIN(1, 3),  RCAR_GP_PIN(1, 10),
-       RCAR_GP_PIN(1, 13), RCAR_GP_PIN(1, 14),
-       RCAR_GP_PIN(1, 9),  RCAR_GP_PIN(1, 12),
-       RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 15),
        RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 18),
        RCAR_GP_PIN(1, 19), RCAR_GP_PIN(0, 1),
 };
 
-static const unsigned int vin4_data24_b_mux[] = {
-       VI4_DATA0_B_MARK, VI4_DATA1_B_MARK,
+static const unsigned int vin4_data18_b_mux[] = {
        VI4_DATA2_B_MARK, VI4_DATA3_B_MARK,
        VI4_DATA4_B_MARK, VI4_DATA5_B_MARK,
        VI4_DATA6_B_MARK, VI4_DATA7_B_MARK,
-       VI4_DATA8_MARK,   VI4_DATA9_MARK,
        VI4_DATA10_MARK,  VI4_DATA11_MARK,
        VI4_DATA12_MARK,  VI4_DATA13_MARK,
        VI4_DATA14_MARK,  VI4_DATA15_MARK,
-       VI4_DATA16_MARK,  VI4_DATA17_MARK,
        VI4_DATA18_MARK,  VI4_DATA19_MARK,
        VI4_DATA20_MARK,  VI4_DATA21_MARK,
        VI4_DATA22_MARK,  VI4_DATA23_MARK,
 };
 
-static const unsigned int vin4_data8_sft8_pins[] = {
-       RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 5),
-       RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 7),
-       RCAR_GP_PIN(1, 3),  RCAR_GP_PIN(1, 10),
-       RCAR_GP_PIN(1, 13), RCAR_GP_PIN(1, 14),
+static const union vin_data vin4_data_b_pins = {
+       .data24 = {
+               RCAR_GP_PIN(1, 8),  RCAR_GP_PIN(1, 11),
+               RCAR_GP_PIN(1, 21), RCAR_GP_PIN(1, 22),
+               RCAR_GP_PIN(0, 5),  RCAR_GP_PIN(0, 6),
+               RCAR_GP_PIN(0, 16), RCAR_GP_PIN(0, 17),
+               RCAR_GP_PIN(1, 4),  RCAR_GP_PIN(1, 5),
+               RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 7),
+               RCAR_GP_PIN(1, 3),  RCAR_GP_PIN(1, 10),
+               RCAR_GP_PIN(1, 13), RCAR_GP_PIN(1, 14),
+               RCAR_GP_PIN(1, 9),  RCAR_GP_PIN(1, 12),
+               RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 16),
+               RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 18),
+               RCAR_GP_PIN(1, 19), RCAR_GP_PIN(0, 1),
+       },
 };
 
-static const unsigned int vin4_data8_sft8_mux[] = {
-       VI4_DATA8_MARK,  VI4_DATA9_MARK,
-       VI4_DATA10_MARK, VI4_DATA11_MARK,
-       VI4_DATA12_MARK, VI4_DATA13_MARK,
-       VI4_DATA14_MARK, VI4_DATA15_MARK,
+static const union vin_data vin4_data_b_mux = {
+       .data24 = {
+               VI4_DATA0_B_MARK, VI4_DATA1_B_MARK,
+               VI4_DATA2_B_MARK, VI4_DATA3_B_MARK,
+               VI4_DATA4_B_MARK, VI4_DATA5_B_MARK,
+               VI4_DATA6_B_MARK, VI4_DATA7_B_MARK,
+               VI4_DATA8_MARK,   VI4_DATA9_MARK,
+               VI4_DATA10_MARK,  VI4_DATA11_MARK,
+               VI4_DATA12_MARK,  VI4_DATA13_MARK,
+               VI4_DATA14_MARK,  VI4_DATA15_MARK,
+               VI4_DATA16_MARK,  VI4_DATA17_MARK,
+               VI4_DATA18_MARK,  VI4_DATA19_MARK,
+               VI4_DATA20_MARK,  VI4_DATA21_MARK,
+               VI4_DATA22_MARK,  VI4_DATA23_MARK,
+       },
 };
 
 static const unsigned int vin4_sync_pins[] = {
@@ -3807,88 +3687,30 @@ static const unsigned int vin4_clk_mux[] = {
 };
 
 /* - VIN5 ------------------------------------------------------------------- */
-static const unsigned int vin5_data8_a_pins[] = {
-       RCAR_GP_PIN(1, 1),  RCAR_GP_PIN(1, 2),
-       RCAR_GP_PIN(1, 19), RCAR_GP_PIN(1, 12),
-       RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 16),
-       RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 18),
-};
-
-static const unsigned int vin5_data8_a_mux[] = {
-       VI5_DATA0_A_MARK,  VI5_DATA1_A_MARK,
-       VI5_DATA2_A_MARK,  VI5_DATA3_A_MARK,
-       VI5_DATA4_A_MARK,  VI5_DATA5_A_MARK,
-       VI5_DATA6_A_MARK,  VI5_DATA7_A_MARK,
-};
-
-static const unsigned int vin5_data8_sft8_a_pins[] = {
-       RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 13),
-       RCAR_GP_PIN(0, 9),  RCAR_GP_PIN(0, 11),
-       RCAR_GP_PIN(0, 8),  RCAR_GP_PIN(0, 10),
-       RCAR_GP_PIN(0, 2),  RCAR_GP_PIN(0, 3),
-};
-
-static const unsigned int vin5_data8_sft8_a_mux[] = {
-       VI5_DATA8_A_MARK,  VI5_DATA9_A_MARK,
-       VI5_DATA10_A_MARK, VI5_DATA11_A_MARK,
-       VI5_DATA12_A_MARK, VI5_DATA13_A_MARK,
-       VI5_DATA14_A_MARK, VI5_DATA15_A_MARK,
-};
-
-static const unsigned int vin5_data10_a_pins[] = {
-       RCAR_GP_PIN(1, 1),  RCAR_GP_PIN(1, 2),
-       RCAR_GP_PIN(1, 19), RCAR_GP_PIN(1, 12),
-       RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 16),
-       RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 18),
-       RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 13),
-};
-
-static const unsigned int vin5_data10_a_mux[] = {
-       VI5_DATA0_A_MARK,  VI5_DATA1_A_MARK,
-       VI5_DATA2_A_MARK,  VI5_DATA3_A_MARK,
-       VI5_DATA4_A_MARK,  VI5_DATA5_A_MARK,
-       VI5_DATA6_A_MARK,  VI5_DATA7_A_MARK,
-       VI5_DATA8_A_MARK,  VI5_DATA9_A_MARK,
-};
-
-static const unsigned int vin5_data12_a_pins[] = {
-       RCAR_GP_PIN(1, 1),  RCAR_GP_PIN(1, 2),
-       RCAR_GP_PIN(1, 19), RCAR_GP_PIN(1, 12),
-       RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 16),
-       RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 18),
-       RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 13),
-       RCAR_GP_PIN(0, 9),  RCAR_GP_PIN(0, 11),
-};
-
-static const unsigned int vin5_data12_a_mux[] = {
-       VI5_DATA0_A_MARK,  VI5_DATA1_A_MARK,
-       VI5_DATA2_A_MARK,  VI5_DATA3_A_MARK,
-       VI5_DATA4_A_MARK,  VI5_DATA5_A_MARK,
-       VI5_DATA6_A_MARK,  VI5_DATA7_A_MARK,
-       VI5_DATA8_A_MARK,  VI5_DATA9_A_MARK,
-       VI5_DATA10_A_MARK, VI5_DATA11_A_MARK,
-};
-
-static const unsigned int vin5_data16_a_pins[] = {
-       RCAR_GP_PIN(1, 1),  RCAR_GP_PIN(1, 2),
-       RCAR_GP_PIN(1, 19), RCAR_GP_PIN(1, 12),
-       RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 16),
-       RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 18),
-       RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 13),
-       RCAR_GP_PIN(0, 9),  RCAR_GP_PIN(0, 11),
-       RCAR_GP_PIN(0, 8),  RCAR_GP_PIN(0, 10),
-       RCAR_GP_PIN(0, 2),  RCAR_GP_PIN(0, 3),
+static const union vin_data16 vin5_data_a_pins = {
+       .data16 = {
+               RCAR_GP_PIN(1, 1),  RCAR_GP_PIN(1, 2),
+               RCAR_GP_PIN(1, 19), RCAR_GP_PIN(1, 12),
+               RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 16),
+               RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 18),
+               RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 13),
+               RCAR_GP_PIN(0, 9),  RCAR_GP_PIN(0, 11),
+               RCAR_GP_PIN(0, 8),  RCAR_GP_PIN(0, 10),
+               RCAR_GP_PIN(0, 2),  RCAR_GP_PIN(0, 3),
+       },
 };
 
-static const unsigned int vin5_data16_a_mux[] = {
-       VI5_DATA0_A_MARK,  VI5_DATA1_A_MARK,
-       VI5_DATA2_A_MARK,  VI5_DATA3_A_MARK,
-       VI5_DATA4_A_MARK,  VI5_DATA5_A_MARK,
-       VI5_DATA6_A_MARK,  VI5_DATA7_A_MARK,
-       VI5_DATA8_A_MARK,  VI5_DATA9_A_MARK,
-       VI5_DATA10_A_MARK, VI5_DATA11_A_MARK,
-       VI5_DATA12_A_MARK, VI5_DATA13_A_MARK,
-       VI5_DATA14_A_MARK, VI5_DATA15_A_MARK,
+static const union vin_data16 vin5_data_a_mux = {
+       .data16 = {
+               VI5_DATA0_A_MARK,  VI5_DATA1_A_MARK,
+               VI5_DATA2_A_MARK,  VI5_DATA3_A_MARK,
+               VI5_DATA4_A_MARK,  VI5_DATA5_A_MARK,
+               VI5_DATA6_A_MARK,  VI5_DATA7_A_MARK,
+               VI5_DATA8_A_MARK,  VI5_DATA9_A_MARK,
+               VI5_DATA10_A_MARK, VI5_DATA11_A_MARK,
+               VI5_DATA12_A_MARK, VI5_DATA13_A_MARK,
+               VI5_DATA14_A_MARK, VI5_DATA15_A_MARK,
+       },
 };
 
 static const unsigned int vin5_data8_b_pins[] = {
@@ -3946,270 +3768,282 @@ static const unsigned int vin5_clk_b_mux[] = {
        VI5_CLK_B_MARK,
 };
 
-static const struct sh_pfc_pin_group pinmux_groups[] = {
-       SH_PFC_PIN_GROUP(audio_clk_a),
-       SH_PFC_PIN_GROUP(audio_clk_b_a),
-       SH_PFC_PIN_GROUP(audio_clk_b_b),
-       SH_PFC_PIN_GROUP(audio_clk_b_c),
-       SH_PFC_PIN_GROUP(audio_clk_c_a),
-       SH_PFC_PIN_GROUP(audio_clk_c_b),
-       SH_PFC_PIN_GROUP(audio_clk_c_c),
-       SH_PFC_PIN_GROUP(audio_clkout_a),
-       SH_PFC_PIN_GROUP(audio_clkout_b),
-       SH_PFC_PIN_GROUP(audio_clkout1_a),
-       SH_PFC_PIN_GROUP(audio_clkout1_b),
-       SH_PFC_PIN_GROUP(audio_clkout1_c),
-       SH_PFC_PIN_GROUP(audio_clkout2_a),
-       SH_PFC_PIN_GROUP(audio_clkout2_b),
-       SH_PFC_PIN_GROUP(audio_clkout2_c),
-       SH_PFC_PIN_GROUP(audio_clkout3_a),
-       SH_PFC_PIN_GROUP(audio_clkout3_b),
-       SH_PFC_PIN_GROUP(audio_clkout3_c),
-       SH_PFC_PIN_GROUP(avb_link),
-       SH_PFC_PIN_GROUP(avb_magic),
-       SH_PFC_PIN_GROUP(avb_phy_int),
-       SH_PFC_PIN_GROUP(avb_mii),
-       SH_PFC_PIN_GROUP(avb_avtp_pps),
-       SH_PFC_PIN_GROUP(avb_avtp_match_a),
-       SH_PFC_PIN_GROUP(avb_avtp_capture_a),
-       SH_PFC_PIN_GROUP(can0_data),
-       SH_PFC_PIN_GROUP(can1_data),
-       SH_PFC_PIN_GROUP(can_clk),
-       SH_PFC_PIN_GROUP(canfd0_data),
-       SH_PFC_PIN_GROUP(canfd1_data),
-       SH_PFC_PIN_GROUP(drif0_ctrl_a),
-       SH_PFC_PIN_GROUP(drif0_data0_a),
-       SH_PFC_PIN_GROUP(drif0_data1_a),
-       SH_PFC_PIN_GROUP(drif0_ctrl_b),
-       SH_PFC_PIN_GROUP(drif0_data0_b),
-       SH_PFC_PIN_GROUP(drif0_data1_b),
-       SH_PFC_PIN_GROUP(drif1_ctrl),
-       SH_PFC_PIN_GROUP(drif1_data0),
-       SH_PFC_PIN_GROUP(drif1_data1),
-       SH_PFC_PIN_GROUP(drif2_ctrl_a),
-       SH_PFC_PIN_GROUP(drif2_data0_a),
-       SH_PFC_PIN_GROUP(drif2_data1_a),
-       SH_PFC_PIN_GROUP(drif2_ctrl_b),
-       SH_PFC_PIN_GROUP(drif2_data0_b),
-       SH_PFC_PIN_GROUP(drif2_data1_b),
-       SH_PFC_PIN_GROUP(drif3_ctrl_a),
-       SH_PFC_PIN_GROUP(drif3_data0_a),
-       SH_PFC_PIN_GROUP(drif3_data1_a),
-       SH_PFC_PIN_GROUP(drif3_ctrl_b),
-       SH_PFC_PIN_GROUP(drif3_data0_b),
-       SH_PFC_PIN_GROUP(drif3_data1_b),
-       SH_PFC_PIN_GROUP(du_rgb666),
-       SH_PFC_PIN_GROUP(du_rgb888),
-       SH_PFC_PIN_GROUP(du_clk_out_0),
-       SH_PFC_PIN_GROUP(du_sync),
-       SH_PFC_PIN_GROUP(du_cde),
-       SH_PFC_PIN_GROUP(du_disp),
-       SH_PFC_PIN_GROUP(du_disp_cde),
-       SH_PFC_PIN_GROUP(du_clk_in_0),
-       SH_PFC_PIN_GROUP(du_clk_in_1),
-       SH_PFC_PIN_GROUP(hscif0_data_a),
-       SH_PFC_PIN_GROUP(hscif0_clk_a),
-       SH_PFC_PIN_GROUP(hscif0_ctrl_a),
-       SH_PFC_PIN_GROUP(hscif0_data_b),
-       SH_PFC_PIN_GROUP(hscif0_clk_b),
-       SH_PFC_PIN_GROUP(hscif1_data_a),
-       SH_PFC_PIN_GROUP(hscif1_clk_a),
-       SH_PFC_PIN_GROUP(hscif1_data_b),
-       SH_PFC_PIN_GROUP(hscif1_clk_b),
-       SH_PFC_PIN_GROUP(hscif1_ctrl_b),
-       SH_PFC_PIN_GROUP(hscif2_data_a),
-       SH_PFC_PIN_GROUP(hscif2_clk_a),
-       SH_PFC_PIN_GROUP(hscif2_ctrl_a),
-       SH_PFC_PIN_GROUP(hscif2_data_b),
-       SH_PFC_PIN_GROUP(hscif3_data_a),
-       SH_PFC_PIN_GROUP(hscif3_data_b),
-       SH_PFC_PIN_GROUP(hscif3_clk_b),
-       SH_PFC_PIN_GROUP(hscif3_data_c),
-       SH_PFC_PIN_GROUP(hscif3_clk_c),
-       SH_PFC_PIN_GROUP(hscif3_ctrl_c),
-       SH_PFC_PIN_GROUP(hscif3_data_d),
-       SH_PFC_PIN_GROUP(hscif3_data_e),
-       SH_PFC_PIN_GROUP(hscif3_ctrl_e),
-       SH_PFC_PIN_GROUP(hscif4_data_a),
-       SH_PFC_PIN_GROUP(hscif4_clk_a),
-       SH_PFC_PIN_GROUP(hscif4_ctrl_a),
-       SH_PFC_PIN_GROUP(hscif4_data_b),
-       SH_PFC_PIN_GROUP(hscif4_clk_b),
-       SH_PFC_PIN_GROUP(hscif4_data_c),
-       SH_PFC_PIN_GROUP(hscif4_data_d),
-       SH_PFC_PIN_GROUP(hscif4_data_e),
-       SH_PFC_PIN_GROUP(i2c1_a),
-       SH_PFC_PIN_GROUP(i2c1_b),
-       SH_PFC_PIN_GROUP(i2c1_c),
-       SH_PFC_PIN_GROUP(i2c1_d),
-       SH_PFC_PIN_GROUP(i2c2_a),
-       SH_PFC_PIN_GROUP(i2c2_b),
-       SH_PFC_PIN_GROUP(i2c2_c),
-       SH_PFC_PIN_GROUP(i2c2_d),
-       SH_PFC_PIN_GROUP(i2c2_e),
-       SH_PFC_PIN_GROUP(i2c4),
-       SH_PFC_PIN_GROUP(i2c5),
-       SH_PFC_PIN_GROUP(i2c6_a),
-       SH_PFC_PIN_GROUP(i2c6_b),
-       SH_PFC_PIN_GROUP(i2c7_a),
-       SH_PFC_PIN_GROUP(i2c7_b),
-       SH_PFC_PIN_GROUP(intc_ex_irq0),
-       SH_PFC_PIN_GROUP(msiof0_clk),
-       SH_PFC_PIN_GROUP(msiof0_sync),
-       SH_PFC_PIN_GROUP(msiof0_ss1),
-       SH_PFC_PIN_GROUP(msiof0_ss2),
-       SH_PFC_PIN_GROUP(msiof0_txd),
-       SH_PFC_PIN_GROUP(msiof0_rxd),
-       SH_PFC_PIN_GROUP(msiof1_clk),
-       SH_PFC_PIN_GROUP(msiof1_sync),
-       SH_PFC_PIN_GROUP(msiof1_ss1),
-       SH_PFC_PIN_GROUP(msiof1_ss2),
-       SH_PFC_PIN_GROUP(msiof1_txd),
-       SH_PFC_PIN_GROUP(msiof1_rxd),
-       SH_PFC_PIN_GROUP(msiof2_clk_a),
-       SH_PFC_PIN_GROUP(msiof2_sync_a),
-       SH_PFC_PIN_GROUP(msiof2_ss1_a),
-       SH_PFC_PIN_GROUP(msiof2_ss2_a),
-       SH_PFC_PIN_GROUP(msiof2_txd_a),
-       SH_PFC_PIN_GROUP(msiof2_rxd_a),
-       SH_PFC_PIN_GROUP(msiof2_clk_b),
-       SH_PFC_PIN_GROUP(msiof2_sync_b),
-       SH_PFC_PIN_GROUP(msiof2_ss1_b),
-       SH_PFC_PIN_GROUP(msiof2_ss2_b),
-       SH_PFC_PIN_GROUP(msiof2_txd_b),
-       SH_PFC_PIN_GROUP(msiof2_rxd_b),
-       SH_PFC_PIN_GROUP(msiof3_clk_a),
-       SH_PFC_PIN_GROUP(msiof3_sync_a),
-       SH_PFC_PIN_GROUP(msiof3_ss1_a),
-       SH_PFC_PIN_GROUP(msiof3_ss2_a),
-       SH_PFC_PIN_GROUP(msiof3_txd_a),
-       SH_PFC_PIN_GROUP(msiof3_rxd_a),
-       SH_PFC_PIN_GROUP(msiof3_clk_b),
-       SH_PFC_PIN_GROUP(msiof3_sync_b),
-       SH_PFC_PIN_GROUP(msiof3_ss1_b),
-       SH_PFC_PIN_GROUP(msiof3_txd_b),
-       SH_PFC_PIN_GROUP(msiof3_rxd_b),
-       SH_PFC_PIN_GROUP(pwm0_a),
-       SH_PFC_PIN_GROUP(pwm0_b),
-       SH_PFC_PIN_GROUP(pwm1_a),
-       SH_PFC_PIN_GROUP(pwm1_b),
-       SH_PFC_PIN_GROUP(pwm2_a),
-       SH_PFC_PIN_GROUP(pwm2_b),
-       SH_PFC_PIN_GROUP(pwm2_c),
-       SH_PFC_PIN_GROUP(pwm3_a),
-       SH_PFC_PIN_GROUP(pwm3_b),
-       SH_PFC_PIN_GROUP(pwm3_c),
-       SH_PFC_PIN_GROUP(pwm4_a),
-       SH_PFC_PIN_GROUP(pwm4_b),
-       SH_PFC_PIN_GROUP(pwm5_a),
-       SH_PFC_PIN_GROUP(pwm5_b),
-       SH_PFC_PIN_GROUP(pwm6_a),
-       SH_PFC_PIN_GROUP(pwm6_b),
-       SH_PFC_PIN_GROUP(scif0_data_a),
-       SH_PFC_PIN_GROUP(scif0_clk_a),
-       SH_PFC_PIN_GROUP(scif0_ctrl_a),
-       SH_PFC_PIN_GROUP(scif0_data_b),
-       SH_PFC_PIN_GROUP(scif0_clk_b),
-       SH_PFC_PIN_GROUP(scif1_data),
-       SH_PFC_PIN_GROUP(scif1_clk),
-       SH_PFC_PIN_GROUP(scif1_ctrl),
-       SH_PFC_PIN_GROUP(scif2_data_a),
-       SH_PFC_PIN_GROUP(scif2_clk_a),
-       SH_PFC_PIN_GROUP(scif2_data_b),
-       SH_PFC_PIN_GROUP(scif3_data_a),
-       SH_PFC_PIN_GROUP(scif3_clk_a),
-       SH_PFC_PIN_GROUP(scif3_ctrl_a),
-       SH_PFC_PIN_GROUP(scif3_data_b),
-       SH_PFC_PIN_GROUP(scif3_data_c),
-       SH_PFC_PIN_GROUP(scif3_clk_c),
-       SH_PFC_PIN_GROUP(scif4_data_a),
-       SH_PFC_PIN_GROUP(scif4_clk_a),
-       SH_PFC_PIN_GROUP(scif4_ctrl_a),
-       SH_PFC_PIN_GROUP(scif4_data_b),
-       SH_PFC_PIN_GROUP(scif4_clk_b),
-       SH_PFC_PIN_GROUP(scif4_data_c),
-       SH_PFC_PIN_GROUP(scif4_ctrl_c),
-       SH_PFC_PIN_GROUP(scif5_data_a),
-       SH_PFC_PIN_GROUP(scif5_clk_a),
-       SH_PFC_PIN_GROUP(scif5_data_b),
-       SH_PFC_PIN_GROUP(scif5_data_c),
-       SH_PFC_PIN_GROUP(scif_clk_a),
-       SH_PFC_PIN_GROUP(scif_clk_b),
-       SH_PFC_PIN_GROUP(sdhi0_data1),
-       SH_PFC_PIN_GROUP(sdhi0_data4),
-       SH_PFC_PIN_GROUP(sdhi0_ctrl),
-       SH_PFC_PIN_GROUP(sdhi0_cd),
-       SH_PFC_PIN_GROUP(sdhi0_wp),
-       SH_PFC_PIN_GROUP(sdhi1_data1),
-       SH_PFC_PIN_GROUP(sdhi1_data4),
-       SH_PFC_PIN_GROUP(sdhi1_ctrl),
-       SH_PFC_PIN_GROUP(sdhi1_cd),
-       SH_PFC_PIN_GROUP(sdhi1_wp),
-       SH_PFC_PIN_GROUP(sdhi3_data1),
-       SH_PFC_PIN_GROUP(sdhi3_data4),
-       SH_PFC_PIN_GROUP(sdhi3_data8),
-       SH_PFC_PIN_GROUP(sdhi3_ctrl),
-       SH_PFC_PIN_GROUP(sdhi3_cd),
-       SH_PFC_PIN_GROUP(sdhi3_wp),
-       SH_PFC_PIN_GROUP(sdhi3_ds),
-       SH_PFC_PIN_GROUP(ssi0_data),
-       SH_PFC_PIN_GROUP(ssi01239_ctrl),
-       SH_PFC_PIN_GROUP(ssi1_data),
-       SH_PFC_PIN_GROUP(ssi1_ctrl),
-       SH_PFC_PIN_GROUP(ssi2_data),
-       SH_PFC_PIN_GROUP(ssi2_ctrl_a),
-       SH_PFC_PIN_GROUP(ssi2_ctrl_b),
-       SH_PFC_PIN_GROUP(ssi3_data),
-       SH_PFC_PIN_GROUP(ssi349_ctrl),
-       SH_PFC_PIN_GROUP(ssi4_data),
-       SH_PFC_PIN_GROUP(ssi4_ctrl),
-       SH_PFC_PIN_GROUP(ssi5_data),
-       SH_PFC_PIN_GROUP(ssi5_ctrl),
-       SH_PFC_PIN_GROUP(ssi6_data),
-       SH_PFC_PIN_GROUP(ssi6_ctrl),
-       SH_PFC_PIN_GROUP(ssi7_data),
-       SH_PFC_PIN_GROUP(ssi78_ctrl),
-       SH_PFC_PIN_GROUP(ssi8_data),
-       SH_PFC_PIN_GROUP(ssi9_data),
-       SH_PFC_PIN_GROUP(ssi9_ctrl_a),
-       SH_PFC_PIN_GROUP(ssi9_ctrl_b),
-       SH_PFC_PIN_GROUP(tmu_tclk1_a),
-       SH_PFC_PIN_GROUP(tmu_tclk1_b),
-       SH_PFC_PIN_GROUP(tmu_tclk2_a),
-       SH_PFC_PIN_GROUP(tmu_tclk2_b),
-       SH_PFC_PIN_GROUP(usb0_a),
-       SH_PFC_PIN_GROUP(usb0_b),
-       SH_PFC_PIN_GROUP(usb0_id),
-       SH_PFC_PIN_GROUP(usb30),
-       SH_PFC_PIN_GROUP(usb30_id),
-       SH_PFC_PIN_GROUP(vin4_data8_a),
-       SH_PFC_PIN_GROUP(vin4_data10_a),
-       SH_PFC_PIN_GROUP(vin4_data12_a),
-       SH_PFC_PIN_GROUP(vin4_data16_a),
-       SH_PFC_PIN_GROUP(vin4_data20_a),
-       SH_PFC_PIN_GROUP(vin4_data24_a),
-       SH_PFC_PIN_GROUP(vin4_data8_b),
-       SH_PFC_PIN_GROUP(vin4_data10_b),
-       SH_PFC_PIN_GROUP(vin4_data12_b),
-       SH_PFC_PIN_GROUP(vin4_data16_b),
-       SH_PFC_PIN_GROUP(vin4_data20_b),
-       SH_PFC_PIN_GROUP(vin4_data24_b),
-       SH_PFC_PIN_GROUP(vin4_data8_sft8),
-       SH_PFC_PIN_GROUP(vin4_sync),
-       SH_PFC_PIN_GROUP(vin4_field),
-       SH_PFC_PIN_GROUP(vin4_clkenb),
-       SH_PFC_PIN_GROUP(vin4_clk),
-       SH_PFC_PIN_GROUP(vin5_data8_a),
-       SH_PFC_PIN_GROUP(vin5_data8_sft8_a),
-       SH_PFC_PIN_GROUP(vin5_data10_a),
-       SH_PFC_PIN_GROUP(vin5_data12_a),
-       SH_PFC_PIN_GROUP(vin5_data16_a),
-       SH_PFC_PIN_GROUP(vin5_data8_b),
-       SH_PFC_PIN_GROUP(vin5_sync_a),
-       SH_PFC_PIN_GROUP(vin5_field_a),
-       SH_PFC_PIN_GROUP(vin5_clkenb_a),
-       SH_PFC_PIN_GROUP(vin5_clk_a),
-       SH_PFC_PIN_GROUP(vin5_clk_b),
+static const struct {
+       struct sh_pfc_pin_group common[245];
+       struct sh_pfc_pin_group automotive[23];
+} pinmux_groups = {
+       .common = {
+               SH_PFC_PIN_GROUP(audio_clk_a),
+               SH_PFC_PIN_GROUP(audio_clk_b_a),
+               SH_PFC_PIN_GROUP(audio_clk_b_b),
+               SH_PFC_PIN_GROUP(audio_clk_b_c),
+               SH_PFC_PIN_GROUP(audio_clk_c_a),
+               SH_PFC_PIN_GROUP(audio_clk_c_b),
+               SH_PFC_PIN_GROUP(audio_clk_c_c),
+               SH_PFC_PIN_GROUP(audio_clkout_a),
+               SH_PFC_PIN_GROUP(audio_clkout_b),
+               SH_PFC_PIN_GROUP(audio_clkout1_a),
+               SH_PFC_PIN_GROUP(audio_clkout1_b),
+               SH_PFC_PIN_GROUP(audio_clkout1_c),
+               SH_PFC_PIN_GROUP(audio_clkout2_a),
+               SH_PFC_PIN_GROUP(audio_clkout2_b),
+               SH_PFC_PIN_GROUP(audio_clkout2_c),
+               SH_PFC_PIN_GROUP(audio_clkout3_a),
+               SH_PFC_PIN_GROUP(audio_clkout3_b),
+               SH_PFC_PIN_GROUP(audio_clkout3_c),
+               SH_PFC_PIN_GROUP(avb_link),
+               SH_PFC_PIN_GROUP(avb_magic),
+               SH_PFC_PIN_GROUP(avb_phy_int),
+               SH_PFC_PIN_GROUP(avb_mii),
+               SH_PFC_PIN_GROUP(avb_avtp_pps),
+               SH_PFC_PIN_GROUP(avb_avtp_match_a),
+               SH_PFC_PIN_GROUP(avb_avtp_capture_a),
+               SH_PFC_PIN_GROUP(can0_data),
+               SH_PFC_PIN_GROUP(can1_data),
+               SH_PFC_PIN_GROUP(can_clk),
+               SH_PFC_PIN_GROUP(du_rgb666),
+               SH_PFC_PIN_GROUP(du_rgb888),
+               SH_PFC_PIN_GROUP(du_clk_in_0),
+               SH_PFC_PIN_GROUP(du_clk_in_1),
+               SH_PFC_PIN_GROUP(du_clk_out_0),
+               SH_PFC_PIN_GROUP(du_sync),
+               SH_PFC_PIN_GROUP(du_disp_cde),
+               SH_PFC_PIN_GROUP(du_cde),
+               SH_PFC_PIN_GROUP(du_disp),
+               SH_PFC_PIN_GROUP(hscif0_data_a),
+               SH_PFC_PIN_GROUP(hscif0_clk_a),
+               SH_PFC_PIN_GROUP(hscif0_ctrl_a),
+               SH_PFC_PIN_GROUP(hscif0_data_b),
+               SH_PFC_PIN_GROUP(hscif0_clk_b),
+               SH_PFC_PIN_GROUP(hscif1_data_a),
+               SH_PFC_PIN_GROUP(hscif1_clk_a),
+               SH_PFC_PIN_GROUP(hscif1_data_b),
+               SH_PFC_PIN_GROUP(hscif1_clk_b),
+               SH_PFC_PIN_GROUP(hscif1_ctrl_b),
+               SH_PFC_PIN_GROUP(hscif2_data_a),
+               SH_PFC_PIN_GROUP(hscif2_clk_a),
+               SH_PFC_PIN_GROUP(hscif2_ctrl_a),
+               SH_PFC_PIN_GROUP(hscif2_data_b),
+               SH_PFC_PIN_GROUP(hscif3_data_a),
+               SH_PFC_PIN_GROUP(hscif3_data_b),
+               SH_PFC_PIN_GROUP(hscif3_clk_b),
+               SH_PFC_PIN_GROUP(hscif3_data_c),
+               SH_PFC_PIN_GROUP(hscif3_clk_c),
+               SH_PFC_PIN_GROUP(hscif3_ctrl_c),
+               SH_PFC_PIN_GROUP(hscif3_data_d),
+               SH_PFC_PIN_GROUP(hscif3_data_e),
+               SH_PFC_PIN_GROUP(hscif3_ctrl_e),
+               SH_PFC_PIN_GROUP(hscif4_data_a),
+               SH_PFC_PIN_GROUP(hscif4_clk_a),
+               SH_PFC_PIN_GROUP(hscif4_ctrl_a),
+               SH_PFC_PIN_GROUP(hscif4_data_b),
+               SH_PFC_PIN_GROUP(hscif4_clk_b),
+               SH_PFC_PIN_GROUP(hscif4_data_c),
+               SH_PFC_PIN_GROUP(hscif4_data_d),
+               SH_PFC_PIN_GROUP(hscif4_data_e),
+               SH_PFC_PIN_GROUP(i2c1_a),
+               SH_PFC_PIN_GROUP(i2c1_b),
+               SH_PFC_PIN_GROUP(i2c1_c),
+               SH_PFC_PIN_GROUP(i2c1_d),
+               SH_PFC_PIN_GROUP(i2c2_a),
+               SH_PFC_PIN_GROUP(i2c2_b),
+               SH_PFC_PIN_GROUP(i2c2_c),
+               SH_PFC_PIN_GROUP(i2c2_d),
+               SH_PFC_PIN_GROUP(i2c2_e),
+               SH_PFC_PIN_GROUP(i2c4),
+               SH_PFC_PIN_GROUP(i2c5),
+               SH_PFC_PIN_GROUP(i2c6_a),
+               SH_PFC_PIN_GROUP(i2c6_b),
+               SH_PFC_PIN_GROUP(i2c7_a),
+               SH_PFC_PIN_GROUP(i2c7_b),
+               SH_PFC_PIN_GROUP(intc_ex_irq0),
+               SH_PFC_PIN_GROUP(intc_ex_irq1),
+               SH_PFC_PIN_GROUP(intc_ex_irq2),
+               SH_PFC_PIN_GROUP(intc_ex_irq3),
+               SH_PFC_PIN_GROUP(intc_ex_irq4),
+               SH_PFC_PIN_GROUP(intc_ex_irq5),
+               SH_PFC_PIN_GROUP(msiof0_clk),
+               SH_PFC_PIN_GROUP(msiof0_sync),
+               SH_PFC_PIN_GROUP(msiof0_ss1),
+               SH_PFC_PIN_GROUP(msiof0_ss2),
+               SH_PFC_PIN_GROUP(msiof0_txd),
+               SH_PFC_PIN_GROUP(msiof0_rxd),
+               SH_PFC_PIN_GROUP(msiof1_clk),
+               SH_PFC_PIN_GROUP(msiof1_sync),
+               SH_PFC_PIN_GROUP(msiof1_ss1),
+               SH_PFC_PIN_GROUP(msiof1_ss2),
+               SH_PFC_PIN_GROUP(msiof1_txd),
+               SH_PFC_PIN_GROUP(msiof1_rxd),
+               SH_PFC_PIN_GROUP(msiof2_clk_a),
+               SH_PFC_PIN_GROUP(msiof2_sync_a),
+               SH_PFC_PIN_GROUP(msiof2_ss1_a),
+               SH_PFC_PIN_GROUP(msiof2_ss2_a),
+               SH_PFC_PIN_GROUP(msiof2_txd_a),
+               SH_PFC_PIN_GROUP(msiof2_rxd_a),
+               SH_PFC_PIN_GROUP(msiof2_clk_b),
+               SH_PFC_PIN_GROUP(msiof2_sync_b),
+               SH_PFC_PIN_GROUP(msiof2_ss1_b),
+               SH_PFC_PIN_GROUP(msiof2_ss2_b),
+               SH_PFC_PIN_GROUP(msiof2_txd_b),
+               SH_PFC_PIN_GROUP(msiof2_rxd_b),
+               SH_PFC_PIN_GROUP(msiof3_clk_a),
+               SH_PFC_PIN_GROUP(msiof3_sync_a),
+               SH_PFC_PIN_GROUP(msiof3_ss1_a),
+               SH_PFC_PIN_GROUP(msiof3_ss2_a),
+               SH_PFC_PIN_GROUP(msiof3_txd_a),
+               SH_PFC_PIN_GROUP(msiof3_rxd_a),
+               SH_PFC_PIN_GROUP(msiof3_clk_b),
+               SH_PFC_PIN_GROUP(msiof3_sync_b),
+               SH_PFC_PIN_GROUP(msiof3_ss1_b),
+               SH_PFC_PIN_GROUP(msiof3_txd_b),
+               SH_PFC_PIN_GROUP(msiof3_rxd_b),
+               SH_PFC_PIN_GROUP(pwm0_a),
+               SH_PFC_PIN_GROUP(pwm0_b),
+               SH_PFC_PIN_GROUP(pwm1_a),
+               SH_PFC_PIN_GROUP(pwm1_b),
+               SH_PFC_PIN_GROUP(pwm2_a),
+               SH_PFC_PIN_GROUP(pwm2_b),
+               SH_PFC_PIN_GROUP(pwm2_c),
+               SH_PFC_PIN_GROUP(pwm3_a),
+               SH_PFC_PIN_GROUP(pwm3_b),
+               SH_PFC_PIN_GROUP(pwm3_c),
+               SH_PFC_PIN_GROUP(pwm4_a),
+               SH_PFC_PIN_GROUP(pwm4_b),
+               SH_PFC_PIN_GROUP(pwm5_a),
+               SH_PFC_PIN_GROUP(pwm5_b),
+               SH_PFC_PIN_GROUP(pwm6_a),
+               SH_PFC_PIN_GROUP(pwm6_b),
+               SH_PFC_PIN_GROUP(scif0_data_a),
+               SH_PFC_PIN_GROUP(scif0_clk_a),
+               SH_PFC_PIN_GROUP(scif0_ctrl_a),
+               SH_PFC_PIN_GROUP(scif0_data_b),
+               SH_PFC_PIN_GROUP(scif0_clk_b),
+               SH_PFC_PIN_GROUP(scif1_data),
+               SH_PFC_PIN_GROUP(scif1_clk),
+               SH_PFC_PIN_GROUP(scif1_ctrl),
+               SH_PFC_PIN_GROUP(scif2_data_a),
+               SH_PFC_PIN_GROUP(scif2_clk_a),
+               SH_PFC_PIN_GROUP(scif2_data_b),
+               SH_PFC_PIN_GROUP(scif3_data_a),
+               SH_PFC_PIN_GROUP(scif3_clk_a),
+               SH_PFC_PIN_GROUP(scif3_ctrl_a),
+               SH_PFC_PIN_GROUP(scif3_data_b),
+               SH_PFC_PIN_GROUP(scif3_data_c),
+               SH_PFC_PIN_GROUP(scif3_clk_c),
+               SH_PFC_PIN_GROUP(scif4_data_a),
+               SH_PFC_PIN_GROUP(scif4_clk_a),
+               SH_PFC_PIN_GROUP(scif4_ctrl_a),
+               SH_PFC_PIN_GROUP(scif4_data_b),
+               SH_PFC_PIN_GROUP(scif4_clk_b),
+               SH_PFC_PIN_GROUP(scif4_data_c),
+               SH_PFC_PIN_GROUP(scif4_ctrl_c),
+               SH_PFC_PIN_GROUP(scif5_data_a),
+               SH_PFC_PIN_GROUP(scif5_clk_a),
+               SH_PFC_PIN_GROUP(scif5_data_b),
+               SH_PFC_PIN_GROUP(scif5_data_c),
+               SH_PFC_PIN_GROUP(scif_clk_a),
+               SH_PFC_PIN_GROUP(scif_clk_b),
+               SH_PFC_PIN_GROUP(sdhi0_data1),
+               SH_PFC_PIN_GROUP(sdhi0_data4),
+               SH_PFC_PIN_GROUP(sdhi0_ctrl),
+               SH_PFC_PIN_GROUP(sdhi0_cd),
+               SH_PFC_PIN_GROUP(sdhi0_wp),
+               SH_PFC_PIN_GROUP(sdhi1_data1),
+               SH_PFC_PIN_GROUP(sdhi1_data4),
+               SH_PFC_PIN_GROUP(sdhi1_ctrl),
+               SH_PFC_PIN_GROUP(sdhi1_cd),
+               SH_PFC_PIN_GROUP(sdhi1_wp),
+               SH_PFC_PIN_GROUP(sdhi3_data1),
+               SH_PFC_PIN_GROUP(sdhi3_data4),
+               SH_PFC_PIN_GROUP(sdhi3_data8),
+               SH_PFC_PIN_GROUP(sdhi3_ctrl),
+               SH_PFC_PIN_GROUP(sdhi3_cd),
+               SH_PFC_PIN_GROUP(sdhi3_wp),
+               SH_PFC_PIN_GROUP(sdhi3_ds),
+               SH_PFC_PIN_GROUP(ssi0_data),
+               SH_PFC_PIN_GROUP(ssi01239_ctrl),
+               SH_PFC_PIN_GROUP(ssi1_data),
+               SH_PFC_PIN_GROUP(ssi1_ctrl),
+               SH_PFC_PIN_GROUP(ssi2_data),
+               SH_PFC_PIN_GROUP(ssi2_ctrl_a),
+               SH_PFC_PIN_GROUP(ssi2_ctrl_b),
+               SH_PFC_PIN_GROUP(ssi3_data),
+               SH_PFC_PIN_GROUP(ssi349_ctrl),
+               SH_PFC_PIN_GROUP(ssi4_data),
+               SH_PFC_PIN_GROUP(ssi4_ctrl),
+               SH_PFC_PIN_GROUP(ssi5_data),
+               SH_PFC_PIN_GROUP(ssi5_ctrl),
+               SH_PFC_PIN_GROUP(ssi6_data),
+               SH_PFC_PIN_GROUP(ssi6_ctrl),
+               SH_PFC_PIN_GROUP(ssi7_data),
+               SH_PFC_PIN_GROUP(ssi78_ctrl),
+               SH_PFC_PIN_GROUP(ssi8_data),
+               SH_PFC_PIN_GROUP(ssi9_data),
+               SH_PFC_PIN_GROUP(ssi9_ctrl_a),
+               SH_PFC_PIN_GROUP(ssi9_ctrl_b),
+               SH_PFC_PIN_GROUP(tmu_tclk1_a),
+               SH_PFC_PIN_GROUP(tmu_tclk1_b),
+               SH_PFC_PIN_GROUP(tmu_tclk2_a),
+               SH_PFC_PIN_GROUP(tmu_tclk2_b),
+               SH_PFC_PIN_GROUP(usb0_a),
+               SH_PFC_PIN_GROUP(usb0_b),
+               SH_PFC_PIN_GROUP(usb0_id),
+               SH_PFC_PIN_GROUP(usb30),
+               SH_PFC_PIN_GROUP(usb30_id),
+               VIN_DATA_PIN_GROUP(vin4_data, 8, _a),
+               VIN_DATA_PIN_GROUP(vin4_data, 10, _a),
+               VIN_DATA_PIN_GROUP(vin4_data, 12, _a),
+               VIN_DATA_PIN_GROUP(vin4_data, 16, _a),
+               SH_PFC_PIN_GROUP(vin4_data18_a),
+               VIN_DATA_PIN_GROUP(vin4_data, 20, _a),
+               VIN_DATA_PIN_GROUP(vin4_data, 24, _a),
+               VIN_DATA_PIN_GROUP(vin4_data, 8, _b),
+               VIN_DATA_PIN_GROUP(vin4_data, 10, _b),
+               VIN_DATA_PIN_GROUP(vin4_data, 12, _b),
+               VIN_DATA_PIN_GROUP(vin4_data, 16, _b),
+               SH_PFC_PIN_GROUP(vin4_data18_b),
+               VIN_DATA_PIN_GROUP(vin4_data, 20, _b),
+               VIN_DATA_PIN_GROUP(vin4_data, 24, _b),
+               SH_PFC_PIN_GROUP(vin4_sync),
+               SH_PFC_PIN_GROUP(vin4_field),
+               SH_PFC_PIN_GROUP(vin4_clkenb),
+               SH_PFC_PIN_GROUP(vin4_clk),
+               VIN_DATA_PIN_GROUP(vin5_data, 8, _a),
+               VIN_DATA_PIN_GROUP(vin5_data, 10, _a),
+               VIN_DATA_PIN_GROUP(vin5_data, 12, _a),
+               VIN_DATA_PIN_GROUP(vin5_data, 16, _a),
+               SH_PFC_PIN_GROUP(vin5_data8_b),
+               SH_PFC_PIN_GROUP(vin5_sync_a),
+               SH_PFC_PIN_GROUP(vin5_field_a),
+               SH_PFC_PIN_GROUP(vin5_clkenb_a),
+               SH_PFC_PIN_GROUP(vin5_clk_a),
+               SH_PFC_PIN_GROUP(vin5_clk_b),
+       },
+       .automotive = {
+               SH_PFC_PIN_GROUP(canfd0_data),
+               SH_PFC_PIN_GROUP(canfd1_data),
+               SH_PFC_PIN_GROUP(drif0_ctrl_a),
+               SH_PFC_PIN_GROUP(drif0_data0_a),
+               SH_PFC_PIN_GROUP(drif0_data1_a),
+               SH_PFC_PIN_GROUP(drif0_ctrl_b),
+               SH_PFC_PIN_GROUP(drif0_data0_b),
+               SH_PFC_PIN_GROUP(drif0_data1_b),
+               SH_PFC_PIN_GROUP(drif1_ctrl),
+               SH_PFC_PIN_GROUP(drif1_data0),
+               SH_PFC_PIN_GROUP(drif1_data1),
+               SH_PFC_PIN_GROUP(drif2_ctrl_a),
+               SH_PFC_PIN_GROUP(drif2_data0_a),
+               SH_PFC_PIN_GROUP(drif2_data1_a),
+               SH_PFC_PIN_GROUP(drif2_ctrl_b),
+               SH_PFC_PIN_GROUP(drif2_data0_b),
+               SH_PFC_PIN_GROUP(drif2_data1_b),
+               SH_PFC_PIN_GROUP(drif3_ctrl_a),
+               SH_PFC_PIN_GROUP(drif3_data0_a),
+               SH_PFC_PIN_GROUP(drif3_data1_a),
+               SH_PFC_PIN_GROUP(drif3_ctrl_b),
+               SH_PFC_PIN_GROUP(drif3_data0_b),
+               SH_PFC_PIN_GROUP(drif3_data1_b),
+       }
 };
 
 static const char * const audio_clk_groups[] = {
@@ -4299,13 +4133,13 @@ static const char * const drif3_groups[] = {
 static const char * const du_groups[] = {
        "du_rgb666",
        "du_rgb888",
+       "du_clk_in_0",
+       "du_clk_in_1",
        "du_clk_out_0",
        "du_sync",
+       "du_disp_cde",
        "du_cde",
        "du_disp",
-       "du_disp_cde",
-       "du_clk_in_0",
-       "du_clk_in_1",
 };
 
 static const char * const hscif0_groups[] = {
@@ -4389,6 +4223,11 @@ static const char * const i2c7_groups[] = {
 
 static const char * const intc_ex_groups[] = {
        "intc_ex_irq0",
+       "intc_ex_irq1",
+       "intc_ex_irq2",
+       "intc_ex_irq3",
+       "intc_ex_irq4",
+       "intc_ex_irq5",
 };
 
 static const char * const msiof0_groups[] = {
@@ -4599,15 +4438,16 @@ static const char * const vin4_groups[] = {
        "vin4_data10_a",
        "vin4_data12_a",
        "vin4_data16_a",
+       "vin4_data18_a",
        "vin4_data20_a",
        "vin4_data24_a",
        "vin4_data8_b",
        "vin4_data10_b",
        "vin4_data12_b",
        "vin4_data16_b",
+       "vin4_data18_b",
        "vin4_data20_b",
        "vin4_data24_b",
-       "vin4_data8_sft8",
        "vin4_sync",
        "vin4_field",
        "vin4_clkenb",
@@ -4616,7 +4456,6 @@ static const char * const vin4_groups[] = {
 
 static const char * const vin5_groups[] = {
        "vin5_data8_a",
-       "vin5_data8_sft8_a",
        "vin5_data10_a",
        "vin5_data12_a",
        "vin5_data16_a",
@@ -4628,58 +4467,65 @@ static const char * const vin5_groups[] = {
        "vin5_clk_b",
 };
 
-static const struct sh_pfc_function pinmux_functions[] = {
-       SH_PFC_FUNCTION(audio_clk),
-       SH_PFC_FUNCTION(avb),
-       SH_PFC_FUNCTION(can0),
-       SH_PFC_FUNCTION(can1),
-       SH_PFC_FUNCTION(can_clk),
-       SH_PFC_FUNCTION(canfd0),
-       SH_PFC_FUNCTION(canfd1),
-       SH_PFC_FUNCTION(drif0),
-       SH_PFC_FUNCTION(drif1),
-       SH_PFC_FUNCTION(drif2),
-       SH_PFC_FUNCTION(drif3),
-       SH_PFC_FUNCTION(du),
-       SH_PFC_FUNCTION(hscif0),
-       SH_PFC_FUNCTION(hscif1),
-       SH_PFC_FUNCTION(hscif2),
-       SH_PFC_FUNCTION(hscif3),
-       SH_PFC_FUNCTION(hscif4),
-       SH_PFC_FUNCTION(i2c1),
-       SH_PFC_FUNCTION(i2c2),
-       SH_PFC_FUNCTION(i2c4),
-       SH_PFC_FUNCTION(i2c5),
-       SH_PFC_FUNCTION(i2c6),
-       SH_PFC_FUNCTION(i2c7),
-       SH_PFC_FUNCTION(intc_ex),
-       SH_PFC_FUNCTION(msiof0),
-       SH_PFC_FUNCTION(msiof1),
-       SH_PFC_FUNCTION(msiof2),
-       SH_PFC_FUNCTION(msiof3),
-       SH_PFC_FUNCTION(pwm0),
-       SH_PFC_FUNCTION(pwm1),
-       SH_PFC_FUNCTION(pwm2),
-       SH_PFC_FUNCTION(pwm3),
-       SH_PFC_FUNCTION(pwm4),
-       SH_PFC_FUNCTION(pwm5),
-       SH_PFC_FUNCTION(pwm6),
-       SH_PFC_FUNCTION(scif0),
-       SH_PFC_FUNCTION(scif1),
-       SH_PFC_FUNCTION(scif2),
-       SH_PFC_FUNCTION(scif3),
-       SH_PFC_FUNCTION(scif4),
-       SH_PFC_FUNCTION(scif5),
-       SH_PFC_FUNCTION(scif_clk),
-       SH_PFC_FUNCTION(sdhi0),
-       SH_PFC_FUNCTION(sdhi1),
-       SH_PFC_FUNCTION(sdhi3),
-       SH_PFC_FUNCTION(ssi),
-       SH_PFC_FUNCTION(tmu),
-       SH_PFC_FUNCTION(usb0),
-       SH_PFC_FUNCTION(usb30),
-       SH_PFC_FUNCTION(vin4),
-       SH_PFC_FUNCTION(vin5),
+static const struct {
+       struct sh_pfc_function common[45];
+       struct sh_pfc_function automotive[6];
+} pinmux_functions = {
+       .common = {
+               SH_PFC_FUNCTION(audio_clk),
+               SH_PFC_FUNCTION(avb),
+               SH_PFC_FUNCTION(can0),
+               SH_PFC_FUNCTION(can1),
+               SH_PFC_FUNCTION(can_clk),
+               SH_PFC_FUNCTION(du),
+               SH_PFC_FUNCTION(hscif0),
+               SH_PFC_FUNCTION(hscif1),
+               SH_PFC_FUNCTION(hscif2),
+               SH_PFC_FUNCTION(hscif3),
+               SH_PFC_FUNCTION(hscif4),
+               SH_PFC_FUNCTION(i2c1),
+               SH_PFC_FUNCTION(i2c2),
+               SH_PFC_FUNCTION(i2c4),
+               SH_PFC_FUNCTION(i2c5),
+               SH_PFC_FUNCTION(i2c6),
+               SH_PFC_FUNCTION(i2c7),
+               SH_PFC_FUNCTION(intc_ex),
+               SH_PFC_FUNCTION(msiof0),
+               SH_PFC_FUNCTION(msiof1),
+               SH_PFC_FUNCTION(msiof2),
+               SH_PFC_FUNCTION(msiof3),
+               SH_PFC_FUNCTION(pwm0),
+               SH_PFC_FUNCTION(pwm1),
+               SH_PFC_FUNCTION(pwm2),
+               SH_PFC_FUNCTION(pwm3),
+               SH_PFC_FUNCTION(pwm4),
+               SH_PFC_FUNCTION(pwm5),
+               SH_PFC_FUNCTION(pwm6),
+               SH_PFC_FUNCTION(scif0),
+               SH_PFC_FUNCTION(scif1),
+               SH_PFC_FUNCTION(scif2),
+               SH_PFC_FUNCTION(scif3),
+               SH_PFC_FUNCTION(scif4),
+               SH_PFC_FUNCTION(scif5),
+               SH_PFC_FUNCTION(scif_clk),
+               SH_PFC_FUNCTION(sdhi0),
+               SH_PFC_FUNCTION(sdhi1),
+               SH_PFC_FUNCTION(sdhi3),
+               SH_PFC_FUNCTION(ssi),
+               SH_PFC_FUNCTION(tmu),
+               SH_PFC_FUNCTION(usb0),
+               SH_PFC_FUNCTION(usb30),
+               SH_PFC_FUNCTION(vin4),
+               SH_PFC_FUNCTION(vin5),
+       },
+       .automotive = {
+               SH_PFC_FUNCTION(canfd0),
+               SH_PFC_FUNCTION(canfd1),
+               SH_PFC_FUNCTION(drif0),
+               SH_PFC_FUNCTION(drif1),
+               SH_PFC_FUNCTION(drif2),
+               SH_PFC_FUNCTION(drif3),
+       }
 };
 
 static const struct pinmux_cfg_reg pinmux_config_regs[] = {
@@ -5152,19 +4998,20 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = {
 };
 
 enum ioctrl_regs {
-       POCCTRL,
+       IOCTRL30,
 };
 
 static const struct pinmux_ioctrl_reg pinmux_ioctrl_regs[] = {
-       [POCCTRL] = { 0xe6060380, },
+       [IOCTRL30] = { 0xe6060380, },
        { /* sentinel */ },
 };
 
-static int r8a77990_pin_to_pocctrl(struct sh_pfc *pfc, unsigned int pin, u32 *pocctrl)
+static int r8a77990_pin_to_pocctrl(struct sh_pfc *pfc, unsigned int pin,
+                                  u32 *pocctrl)
 {
        int bit = -EINVAL;
 
-       *pocctrl = pinmux_ioctrl_regs[POCCTRL].reg;
+       *pocctrl = pinmux_ioctrl_regs[IOCTRL30].reg;
 
        if (pin >= RCAR_GP_PIN(3, 0) && pin <= RCAR_GP_PIN(3, 11))
                bit = pin & 0x1f;
@@ -5175,10 +5022,286 @@ static int r8a77990_pin_to_pocctrl(struct sh_pfc *pfc, unsigned int pin, u32 *po
        return bit;
 }
 
+static const struct pinmux_bias_reg pinmux_bias_regs[] = {
+       { PINMUX_BIAS_REG("PUEN0", 0xe6060400, "PUD0", 0xe6060440) {
+                [0] = RCAR_GP_PIN(2, 23),      /* RD# */
+                [1] = RCAR_GP_PIN(2, 22),      /* BS# */
+                [2] = RCAR_GP_PIN(2, 21),      /* AVB_PHY_INT */
+                [3] = PIN_NUMBER('P', 5),      /* AVB_MDC */
+                [4] = PIN_NUMBER('P', 4),      /* AVB_MDIO */
+                [5] = RCAR_GP_PIN(2, 20),      /* AVB_TXCREFCLK */
+                [6] = PIN_NUMBER('N', 6),      /* AVB_TD3 */
+                [7] = PIN_NUMBER('N', 5),      /* AVB_TD2 */
+                [8] = PIN_NUMBER('N', 3),      /* AVB_TD1 */
+                [9] = PIN_NUMBER('N', 2),      /* AVB_TD0 */
+               [10] = PIN_NUMBER('N', 1),      /* AVB_TXC */
+               [11] = PIN_NUMBER('P', 3),      /* AVB_TX_CTL */
+               [12] = RCAR_GP_PIN(2, 19),      /* AVB_RD3 */
+               [13] = RCAR_GP_PIN(2, 18),      /* AVB_RD2 */
+               [14] = RCAR_GP_PIN(2, 17),      /* AVB_RD1 */
+               [15] = RCAR_GP_PIN(2, 16),      /* AVB_RD0 */
+               [16] = RCAR_GP_PIN(2, 15),      /* AVB_RXC */
+               [17] = RCAR_GP_PIN(2, 14),      /* AVB_RX_CTL */
+               [18] = RCAR_GP_PIN(2, 13),      /* RPC_RESET# */
+               [19] = RCAR_GP_PIN(2, 12),      /* RPC_INT# */
+               [20] = RCAR_GP_PIN(2, 11),      /* QSPI1_SSL */
+               [21] = RCAR_GP_PIN(2, 10),      /* QSPI1_IO3 */
+               [22] = RCAR_GP_PIN(2,  9),      /* QSPI1_IO2 */
+               [23] = RCAR_GP_PIN(2,  8),      /* QSPI1_MISO/IO1 */
+               [24] = RCAR_GP_PIN(2,  7),      /* QSPI1_MOSI/IO0 */
+               [25] = RCAR_GP_PIN(2,  6),      /* QSPI1_SPCLK */
+               [26] = RCAR_GP_PIN(2,  5),      /* QSPI0_SSL */
+               [27] = RCAR_GP_PIN(2,  4),      /* QSPI0_IO3 */
+               [28] = RCAR_GP_PIN(2,  3),      /* QSPI0_IO2 */
+               [29] = RCAR_GP_PIN(2,  2),      /* QSPI0_MISO/IO1 */
+               [30] = RCAR_GP_PIN(2,  1),      /* QSPI0_MOSI/IO0 */
+               [31] = RCAR_GP_PIN(2,  0),      /* QSPI0_SPCLK */
+       } },
+       { PINMUX_BIAS_REG("PUEN1", 0xe6060404, "PUD1", 0xe6060444) {
+                [0] = RCAR_GP_PIN(0,  4),      /* D4 */
+                [1] = RCAR_GP_PIN(0,  3),      /* D3 */
+                [2] = RCAR_GP_PIN(0,  2),      /* D2 */
+                [3] = RCAR_GP_PIN(0,  1),      /* D1 */
+                [4] = RCAR_GP_PIN(0,  0),      /* D0 */
+                [5] = RCAR_GP_PIN(1, 22),      /* WE0# */
+                [6] = RCAR_GP_PIN(1, 21),      /* CS0# */
+                [7] = RCAR_GP_PIN(1, 20),      /* CLKOUT */
+                [8] = RCAR_GP_PIN(1, 19),      /* A19 */
+                [9] = RCAR_GP_PIN(1, 18),      /* A18 */
+               [10] = RCAR_GP_PIN(1, 17),      /* A17 */
+               [11] = RCAR_GP_PIN(1, 16),      /* A16 */
+               [12] = RCAR_GP_PIN(1, 15),      /* A15 */
+               [13] = RCAR_GP_PIN(1, 14),      /* A14 */
+               [14] = RCAR_GP_PIN(1, 13),      /* A13 */
+               [15] = RCAR_GP_PIN(1, 12),      /* A12 */
+               [16] = RCAR_GP_PIN(1, 11),      /* A11 */
+               [17] = RCAR_GP_PIN(1, 10),      /* A10 */
+               [18] = RCAR_GP_PIN(1,  9),      /* A9 */
+               [19] = RCAR_GP_PIN(1,  8),      /* A8 */
+               [20] = RCAR_GP_PIN(1,  7),      /* A7 */
+               [21] = RCAR_GP_PIN(1,  6),      /* A6 */
+               [22] = RCAR_GP_PIN(1,  5),      /* A5 */
+               [23] = RCAR_GP_PIN(1,  4),      /* A4 */
+               [24] = RCAR_GP_PIN(1,  3),      /* A3 */
+               [25] = RCAR_GP_PIN(1,  2),      /* A2 */
+               [26] = RCAR_GP_PIN(1,  1),      /* A1 */
+               [27] = RCAR_GP_PIN(1,  0),      /* A0 */
+               [28] = PIN_NONE,
+               [29] = PIN_NONE,
+               [30] = RCAR_GP_PIN(2, 25),      /* PUEN_EX_WAIT0 */
+               [31] = RCAR_GP_PIN(2, 24),      /* PUEN_RD/WR# */
+       } },
+       { PINMUX_BIAS_REG("PUEN2", 0xe6060408, "PUD2", 0xe6060448) {
+                [0] = RCAR_GP_PIN(3,  1),      /* SD0_CMD */
+                [1] = RCAR_GP_PIN(3,  0),      /* SD0_CLK */
+                [2] = PIN_NUMBER('H', 1),      /* ASEBRK */
+                [3] = PIN_NONE,
+                [4] = PIN_NUMBER('G', 2),      /* TDI */
+                [5] = PIN_NUMBER('F', 3),      /* TMS */
+                [6] = PIN_NUMBER('F', 4),      /* TCK */
+                [7] = PIN_NUMBER('F', 1),      /* TRST# */
+                [8] = PIN_NONE,
+                [9] = PIN_NONE,
+               [10] = PIN_NONE,
+               [11] = PIN_NONE,
+               [12] = PIN_NONE,
+               [13] = PIN_NONE,
+               [14] = PIN_NONE,
+               [15] = PIN_NUMBER('G', 3),      /* FSCLKST# */
+               [16] = RCAR_GP_PIN(0, 17),      /* SDA4 */
+               [17] = RCAR_GP_PIN(0, 16),      /* SCL4 */
+               [18] = PIN_NONE,
+               [19] = PIN_NONE,
+               [20] = PIN_A_NUMBER('D', 3),    /* PRESETOUT# */
+               [21] = RCAR_GP_PIN(0, 15),      /* D15 */
+               [22] = RCAR_GP_PIN(0, 14),      /* D14 */
+               [23] = RCAR_GP_PIN(0, 13),      /* D13 */
+               [24] = RCAR_GP_PIN(0, 12),      /* D12 */
+               [25] = RCAR_GP_PIN(0, 11),      /* D11 */
+               [26] = RCAR_GP_PIN(0, 10),      /* D10 */
+               [27] = RCAR_GP_PIN(0,  9),      /* D9 */
+               [28] = RCAR_GP_PIN(0,  8),      /* D8 */
+               [29] = RCAR_GP_PIN(0,  7),      /* D7 */
+               [30] = RCAR_GP_PIN(0,  6),      /* D6 */
+               [31] = RCAR_GP_PIN(0,  5),      /* D5 */
+       } },
+       { PINMUX_BIAS_REG("PUEN3", 0xe606040c, "PUD3", 0xe606044c) {
+                [0] = RCAR_GP_PIN(5,  0),      /* SCK0_A */
+                [1] = RCAR_GP_PIN(5,  4),      /* RTS0#/TANS_A */
+                [2] = RCAR_GP_PIN(5,  3),      /* CTS0#_A */
+                [3] = RCAR_GP_PIN(5,  2),      /* TX0_A */
+                [4] = RCAR_GP_PIN(5,  1),      /* RX0_A */
+                [5] = PIN_NONE,
+                [6] = PIN_NONE,
+                [7] = RCAR_GP_PIN(3, 15),      /* SD1_WP */
+                [8] = RCAR_GP_PIN(3, 14),      /* SD1_CD */
+                [9] = RCAR_GP_PIN(3, 13),      /* SD0_WP */
+               [10] = RCAR_GP_PIN(3, 12),      /* SD0_CD */
+               [11] = RCAR_GP_PIN(4, 10),      /* SD3_DS */
+               [12] = RCAR_GP_PIN(4,  9),      /* SD3_DAT7 */
+               [13] = RCAR_GP_PIN(4,  8),      /* SD3_DAT6 */
+               [14] = RCAR_GP_PIN(4,  7),      /* SD3_DAT5 */
+               [15] = RCAR_GP_PIN(4,  6),      /* SD3_DAT4 */
+               [16] = RCAR_GP_PIN(4,  5),      /* SD3_DAT3 */
+               [17] = RCAR_GP_PIN(4,  4),      /* SD3_DAT2 */
+               [18] = RCAR_GP_PIN(4,  3),      /* SD3_DAT1 */
+               [19] = RCAR_GP_PIN(4,  2),      /* SD3_DAT0 */
+               [20] = RCAR_GP_PIN(4,  1),      /* SD3_CMD */
+               [21] = RCAR_GP_PIN(4,  0),      /* SD3_CLK */
+               [22] = RCAR_GP_PIN(3, 11),      /* SD1_DAT3 */
+               [23] = RCAR_GP_PIN(3, 10),      /* SD1_DAT2 */
+               [24] = RCAR_GP_PIN(3,  9),      /* SD1_DAT1 */
+               [25] = RCAR_GP_PIN(3,  8),      /* SD1_DAT0 */
+               [26] = RCAR_GP_PIN(3,  7),      /* SD1_CMD */
+               [27] = RCAR_GP_PIN(3,  6),      /* SD1_CLK */
+               [28] = RCAR_GP_PIN(3,  5),      /* SD0_DAT3 */
+               [29] = RCAR_GP_PIN(3,  4),      /* SD0_DAT2 */
+               [30] = RCAR_GP_PIN(3,  3),      /* SD0_DAT1 */
+               [31] = RCAR_GP_PIN(3,  2),      /* SD0_DAT0 */
+       } },
+       { PINMUX_BIAS_REG("PUEN4", 0xe6060410, "PUD4", 0xe6060450) {
+                [0] = RCAR_GP_PIN(6,  8),      /* AUDIO_CLKA */
+                [1] = RCAR_GP_PIN(6, 16),      /* SSI_SDATA6 */
+                [2] = RCAR_GP_PIN(6, 15),      /* SSI_WS6 */
+                [3] = RCAR_GP_PIN(6, 14),      /* SSI_SCK6 */
+                [4] = RCAR_GP_PIN(6, 13),      /* SSI_SDATA5 */
+                [5] = RCAR_GP_PIN(6, 12),      /* SSI_WS5 */
+                [6] = RCAR_GP_PIN(6, 11),      /* SSI_SCK5 */
+                [7] = RCAR_GP_PIN(6, 10),      /* SSI_SDATA4 */
+                [8] = RCAR_GP_PIN(6,  7),      /* SSI_SDATA3 */
+                [9] = RCAR_GP_PIN(6,  6),      /* SSI_WS349 */
+               [10] = RCAR_GP_PIN(6,  5),      /* SSI_SCK349 */
+               [11] = RCAR_GP_PIN(6,  4),      /* SSI_SDATA2 */
+               [12] = RCAR_GP_PIN(6,  3),      /* SSI_SDATA1 */
+               [13] = RCAR_GP_PIN(6,  2),      /* SSI_SDATA0 */
+               [14] = RCAR_GP_PIN(6,  1),      /* SSI_WS01239 */
+               [15] = RCAR_GP_PIN(6,  0),      /* SSI_SCK01239 */
+               [16] = PIN_NUMBER('T', 21),     /* MLB_REF */
+               [17] = RCAR_GP_PIN(5, 19),      /* MLB_DAT */
+               [18] = RCAR_GP_PIN(5, 18),      /* MLB_SIG */
+               [19] = RCAR_GP_PIN(5, 17),      /* MLB_CLK */
+               [20] = RCAR_GP_PIN(5, 16),      /* SSI_SDATA9 */
+               [21] = RCAR_GP_PIN(5, 15),      /* MSIOF0_SS2 */
+               [22] = RCAR_GP_PIN(5, 14),      /* MSIOF0_SS1 */
+               [23] = RCAR_GP_PIN(5, 13),      /* MSIOF0_SYNC */
+               [24] = RCAR_GP_PIN(5, 12),      /* MSIOF0_TXD */
+               [25] = RCAR_GP_PIN(5, 11),      /* MSIOF0_RXD */
+               [26] = RCAR_GP_PIN(5, 10),      /* MSIOF0_SCK */
+               [27] = RCAR_GP_PIN(5,  9),      /* RX2_A */
+               [28] = RCAR_GP_PIN(5,  8),      /* TX2_A */
+               [29] = RCAR_GP_PIN(5,  7),      /* SCK2_A */
+               [30] = RCAR_GP_PIN(5,  6),      /* TX1 */
+               [31] = RCAR_GP_PIN(5,  5),      /* RX1 */
+       } },
+       { PINMUX_BIAS_REG("PUEN5", 0xe6060414, "PUD5", 0xe6060454) {
+                [0] = PIN_NONE,
+                [1] = PIN_NONE,
+                [2] = PIN_NONE,
+                [3] = PIN_NONE,
+                [4] = PIN_NONE,
+                [5] = PIN_NONE,
+                [6] = PIN_NONE,
+                [7] = PIN_NONE,
+                [8] = PIN_NONE,
+                [9] = PIN_NONE,
+               [10] = PIN_NONE,
+               [11] = PIN_NONE,
+               [12] = PIN_NONE,
+               [13] = PIN_NONE,
+               [14] = PIN_NONE,
+               [15] = PIN_NONE,
+               [16] = PIN_NONE,
+               [17] = PIN_NONE,
+               [18] = PIN_NONE,
+               [19] = PIN_NONE,
+               [20] = PIN_NONE,
+               [21] = PIN_NONE,
+               [22] = PIN_NONE,
+               [23] = PIN_NONE,
+               [24] = PIN_NONE,
+               [25] = PIN_NONE,
+               [26] = PIN_NONE,
+               [27] = PIN_NONE,
+               [28] = PIN_NONE,
+               [29] = PIN_NONE,
+               [30] = RCAR_GP_PIN(6,  9),      /* PUEN_USB30_OVC */
+               [31] = RCAR_GP_PIN(6, 17),      /* PUEN_USB30_PWEN */
+       } },
+       { /* sentinel */ },
+};
+
+static unsigned int r8a77990_pinmux_get_bias(struct sh_pfc *pfc,
+                                            unsigned int pin)
+{
+       const struct pinmux_bias_reg *reg;
+       unsigned int bit;
+
+       reg = sh_pfc_pin_to_bias_reg(pfc, pin, &bit);
+       if (!reg)
+               return PIN_CONFIG_BIAS_DISABLE;
+
+       if (!(sh_pfc_read(pfc, reg->puen) & BIT(bit)))
+               return PIN_CONFIG_BIAS_DISABLE;
+       else if (sh_pfc_read(pfc, reg->pud) & BIT(bit))
+               return PIN_CONFIG_BIAS_PULL_UP;
+       else
+               return PIN_CONFIG_BIAS_PULL_DOWN;
+}
+
+static void r8a77990_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
+                                    unsigned int bias)
+{
+       const struct pinmux_bias_reg *reg;
+       u32 enable, updown;
+       unsigned int bit;
+
+       reg = sh_pfc_pin_to_bias_reg(pfc, pin, &bit);
+       if (!reg)
+               return;
+
+       enable = sh_pfc_read(pfc, reg->puen) & ~BIT(bit);
+       if (bias != PIN_CONFIG_BIAS_DISABLE)
+               enable |= BIT(bit);
+
+       updown = sh_pfc_read(pfc, reg->pud) & ~BIT(bit);
+       if (bias == PIN_CONFIG_BIAS_PULL_UP)
+               updown |= BIT(bit);
+
+       sh_pfc_write(pfc, reg->pud, updown);
+       sh_pfc_write(pfc, reg->puen, enable);
+}
+
 static const struct sh_pfc_soc_operations r8a77990_pinmux_ops = {
        .pin_to_pocctrl = r8a77990_pin_to_pocctrl,
+       .get_bias = r8a77990_pinmux_get_bias,
+       .set_bias = r8a77990_pinmux_set_bias,
+};
+
+#ifdef CONFIG_PINCTRL_PFC_R8A774C0
+const struct sh_pfc_soc_info r8a774c0_pinmux_info = {
+       .name = "r8a774c0_pfc",
+       .ops = &r8a77990_pinmux_ops,
+       .unlock_reg = 0xe6060000, /* PMMR */
+
+       .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
+
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .groups = pinmux_groups.common,
+       .nr_groups = ARRAY_SIZE(pinmux_groups.common),
+       .functions = pinmux_functions.common,
+       .nr_functions = ARRAY_SIZE(pinmux_functions.common),
+
+       .cfg_regs = pinmux_config_regs,
+       .bias_regs = pinmux_bias_regs,
+       .ioctrl_regs = pinmux_ioctrl_regs,
+
+       .pinmux_data = pinmux_data,
+       .pinmux_data_size = ARRAY_SIZE(pinmux_data),
 };
+#endif
 
+#ifdef CONFIG_PINCTRL_PFC_R8A77990
 const struct sh_pfc_soc_info r8a77990_pinmux_info = {
        .name = "r8a77990_pfc",
        .ops = &r8a77990_pinmux_ops,
@@ -5188,14 +5311,18 @@ const struct sh_pfc_soc_info r8a77990_pinmux_info = {
 
        .pins = pinmux_pins,
        .nr_pins = ARRAY_SIZE(pinmux_pins),
-       .groups = pinmux_groups,
-       .nr_groups = ARRAY_SIZE(pinmux_groups),
-       .functions = pinmux_functions,
-       .nr_functions = ARRAY_SIZE(pinmux_functions),
+       .groups = pinmux_groups.common,
+       .nr_groups = ARRAY_SIZE(pinmux_groups.common) +
+               ARRAY_SIZE(pinmux_groups.automotive),
+       .functions = pinmux_functions.common,
+       .nr_functions = ARRAY_SIZE(pinmux_functions.common) +
+               ARRAY_SIZE(pinmux_functions.automotive),
 
        .cfg_regs = pinmux_config_regs,
+       .bias_regs = pinmux_bias_regs,
        .ioctrl_regs = pinmux_ioctrl_regs,
 
        .pinmux_data = pinmux_data,
        .pinmux_data_size = ARRAY_SIZE(pinmux_data),
 };
+#endif
index 97f75a184e442eb58a6b4e8d6e24d88c38e9d8ff..ed678584cb86112133316bab92f4698ff33838b0 100644 (file)
@@ -384,6 +384,9 @@ FM(IP12_23_20)      IP12_23_20 \
 FM(IP12_27_24) IP12_27_24 \
 FM(IP12_31_28) IP12_31_28 \
 
+/* The bit numbering in MOD_SEL fields is reversed */
+#define REV4(f0, f1, f2, f3)                   f0 f2 f1 f3
+
 /* MOD_SEL0 */                 /* 0 */                 /* 1 */                 /* 2 */                 /* 3 */
 #define MOD_SEL0_30            FM(SEL_MSIOF2_0)        FM(SEL_MSIOF2_1)
 #define MOD_SEL0_29            FM(SEL_I2C3_0)          FM(SEL_I2C3_1)
@@ -391,10 +394,10 @@ FM(IP12_31_28)    IP12_31_28 \
 #define MOD_SEL0_27            FM(SEL_MSIOF3_0)        FM(SEL_MSIOF3_1)
 #define MOD_SEL0_26            FM(SEL_HSCIF3_0)        FM(SEL_HSCIF3_1)
 #define MOD_SEL0_25            FM(SEL_SCIF4_0)         FM(SEL_SCIF4_1)
-#define MOD_SEL0_24_23         FM(SEL_PWM0_0)          FM(SEL_PWM0_1)          FM(SEL_PWM0_2)          FM(SEL_PWM0_3)
-#define MOD_SEL0_22_21         FM(SEL_PWM1_0)          FM(SEL_PWM1_1)          FM(SEL_PWM1_2)          FM(SEL_PWM1_3)
-#define MOD_SEL0_20_19         FM(SEL_PWM2_0)          FM(SEL_PWM2_1)          FM(SEL_PWM2_2)          FM(SEL_PWM2_3)
-#define MOD_SEL0_18_17         FM(SEL_PWM3_0)          FM(SEL_PWM3_1)          FM(SEL_PWM3_2)          FM(SEL_PWM3_3)
+#define MOD_SEL0_24_23    REV4(FM(SEL_PWM0_0),         FM(SEL_PWM0_1),         FM(SEL_PWM0_2),         F_(0, 0))
+#define MOD_SEL0_22_21    REV4(FM(SEL_PWM1_0),         FM(SEL_PWM1_1),         FM(SEL_PWM1_2),         F_(0, 0))
+#define MOD_SEL0_20_19    REV4(FM(SEL_PWM2_0),         FM(SEL_PWM2_1),         FM(SEL_PWM2_2),         F_(0, 0))
+#define MOD_SEL0_18_17    REV4(FM(SEL_PWM3_0),         FM(SEL_PWM3_1),         FM(SEL_PWM3_2),         F_(0, 0))
 #define MOD_SEL0_15            FM(SEL_IRQ_0_0)         FM(SEL_IRQ_0_1)
 #define MOD_SEL0_14            FM(SEL_IRQ_1_0)         FM(SEL_IRQ_1_1)
 #define MOD_SEL0_13            FM(SEL_IRQ_2_0)         FM(SEL_IRQ_2_1)
@@ -471,12 +474,6 @@ enum {
 #undef FM
 };
 
-#define PINMUX_IPSR_MSEL2(ipsr, fn, msel1, msel2) \
-       PINMUX_DATA(fn##_MARK, FN_##msel1, FN_##msel2, FN_##fn, FN_##ipsr)
-
-#define PINMUX_IPSR_PHYS(ipsr, fn, msel) \
-       PINMUX_DATA(fn##_MARK, FN_##msel)
-
 static const u16 pinmux_data[] = {
        PINMUX_DATA_GP_ALL(),
 
@@ -520,6 +517,10 @@ static const u16 pinmux_data[] = {
        PINMUX_SINGLE(QSPI0_SPCLK),
        PINMUX_SINGLE(SCL0),
        PINMUX_SINGLE(SDA0),
+       PINMUX_SINGLE(MSIOF0_RXD),
+       PINMUX_SINGLE(MSIOF0_TXD),
+       PINMUX_SINGLE(MSIOF0_SYNC),
+       PINMUX_SINGLE(MSIOF0_SCK),
 
        /* IPSR0 */
        PINMUX_IPSR_MSEL(IP0_3_0,       IRQ0_A, SEL_IRQ_0_0),
@@ -1277,6 +1278,289 @@ static const unsigned int mmc_ctrl_mux[] = {
        MMC_CLK_MARK, MMC_CMD_MARK,
 };
 
+/* - MSIOF0 ----------------------------------------------------------------- */
+static const unsigned int msiof0_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(4, 12),
+};
+
+static const unsigned int msiof0_clk_mux[] = {
+       MSIOF0_SCK_MARK,
+};
+
+static const unsigned int msiof0_sync_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(4, 13),
+};
+
+static const unsigned int msiof0_sync_mux[] = {
+       MSIOF0_SYNC_MARK,
+};
+
+static const unsigned int msiof0_ss1_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(4, 20),
+};
+
+static const unsigned int msiof0_ss1_mux[] = {
+       MSIOF0_SS1_MARK,
+};
+
+static const unsigned int msiof0_ss2_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(4, 21),
+};
+
+static const unsigned int msiof0_ss2_mux[] = {
+       MSIOF0_SS2_MARK,
+};
+
+static const unsigned int msiof0_txd_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(4, 14),
+};
+
+static const unsigned int msiof0_txd_mux[] = {
+       MSIOF0_TXD_MARK,
+};
+
+static const unsigned int msiof0_rxd_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(4, 15),
+};
+
+static const unsigned int msiof0_rxd_mux[] = {
+       MSIOF0_RXD_MARK,
+};
+
+/* - MSIOF1 ----------------------------------------------------------------- */
+static const unsigned int msiof1_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(4, 16),
+};
+
+static const unsigned int msiof1_clk_mux[] = {
+       MSIOF1_SCK_MARK,
+};
+
+static const unsigned int msiof1_sync_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(4, 19),
+};
+
+static const unsigned int msiof1_sync_mux[] = {
+       MSIOF1_SYNC_MARK,
+};
+
+static const unsigned int msiof1_ss1_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(4, 25),
+};
+
+static const unsigned int msiof1_ss1_mux[] = {
+       MSIOF1_SS1_MARK,
+};
+
+static const unsigned int msiof1_ss2_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(4, 22),
+};
+
+static const unsigned int msiof1_ss2_mux[] = {
+       MSIOF1_SS2_MARK,
+};
+
+static const unsigned int msiof1_txd_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(4, 17),
+};
+
+static const unsigned int msiof1_txd_mux[] = {
+       MSIOF1_TXD_MARK,
+};
+
+static const unsigned int msiof1_rxd_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(4, 18),
+};
+
+static const unsigned int msiof1_rxd_mux[] = {
+       MSIOF1_RXD_MARK,
+};
+
+/* - MSIOF2 ----------------------------------------------------------------- */
+static const unsigned int msiof2_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(0, 3),
+};
+
+static const unsigned int msiof2_clk_mux[] = {
+       MSIOF2_SCK_MARK,
+};
+
+static const unsigned int msiof2_sync_a_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(0, 6),
+};
+
+static const unsigned int msiof2_sync_a_mux[] = {
+       MSIOF2_SYNC_A_MARK,
+};
+
+static const unsigned int msiof2_sync_b_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(0, 2),
+};
+
+static const unsigned int msiof2_sync_b_mux[] = {
+       MSIOF2_SYNC_B_MARK,
+};
+
+static const unsigned int msiof2_ss1_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(0, 7),
+};
+
+static const unsigned int msiof2_ss1_mux[] = {
+       MSIOF2_SS1_MARK,
+};
+
+static const unsigned int msiof2_ss2_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(0, 8),
+};
+
+static const unsigned int msiof2_ss2_mux[] = {
+       MSIOF2_SS2_MARK,
+};
+
+static const unsigned int msiof2_txd_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(0, 4),
+};
+
+static const unsigned int msiof2_txd_mux[] = {
+       MSIOF2_TXD_MARK,
+};
+
+static const unsigned int msiof2_rxd_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(0, 5),
+};
+
+static const unsigned int msiof2_rxd_mux[] = {
+       MSIOF2_RXD_MARK,
+};
+
+/* - MSIOF3 ----------------------------------------------------------------- */
+static const unsigned int msiof3_clk_a_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(2, 24),
+};
+
+static const unsigned int msiof3_clk_a_mux[] = {
+       MSIOF3_SCK_A_MARK,
+};
+
+static const unsigned int msiof3_sync_a_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(2, 21),
+};
+
+static const unsigned int msiof3_sync_a_mux[] = {
+       MSIOF3_SYNC_A_MARK,
+};
+
+static const unsigned int msiof3_ss1_a_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(2, 14),
+};
+
+static const unsigned int msiof3_ss1_a_mux[] = {
+       MSIOF3_SS1_A_MARK,
+};
+
+static const unsigned int msiof3_ss2_a_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(2, 10),
+};
+
+static const unsigned int msiof3_ss2_a_mux[] = {
+       MSIOF3_SS2_A_MARK,
+};
+
+static const unsigned int msiof3_txd_a_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(2, 22),
+};
+
+static const unsigned int msiof3_txd_a_mux[] = {
+       MSIOF3_TXD_A_MARK,
+};
+
+static const unsigned int msiof3_rxd_a_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(2, 23),
+};
+
+static const unsigned int msiof3_rxd_a_mux[] = {
+       MSIOF3_RXD_A_MARK,
+};
+
+static const unsigned int msiof3_clk_b_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(1, 8),
+};
+
+static const unsigned int msiof3_clk_b_mux[] = {
+       MSIOF3_SCK_B_MARK,
+};
+
+static const unsigned int msiof3_sync_b_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(1, 9),
+};
+
+static const unsigned int msiof3_sync_b_mux[] = {
+       MSIOF3_SYNC_B_MARK,
+};
+
+static const unsigned int msiof3_ss1_b_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(1, 6),
+};
+
+static const unsigned int msiof3_ss1_b_mux[] = {
+       MSIOF3_SS1_B_MARK,
+};
+
+static const unsigned int msiof3_ss2_b_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(1, 7),
+};
+
+static const unsigned int msiof3_ss2_b_mux[] = {
+       MSIOF3_SS2_B_MARK,
+};
+
+static const unsigned int msiof3_txd_b_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(1, 0),
+};
+
+static const unsigned int msiof3_txd_b_mux[] = {
+       MSIOF3_TXD_B_MARK,
+};
+
+static const unsigned int msiof3_rxd_b_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(1, 1),
+};
+
+static const unsigned int msiof3_rxd_b_mux[] = {
+       MSIOF3_RXD_B_MARK,
+};
+
 /* - PWM0 ------------------------------------------------------------------ */
 static const unsigned int pwm0_a_pins[] = {
        /* PWM */
@@ -1752,6 +2036,37 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(mmc_data4),
        SH_PFC_PIN_GROUP(mmc_data8),
        SH_PFC_PIN_GROUP(mmc_ctrl),
+       SH_PFC_PIN_GROUP(msiof0_clk),
+       SH_PFC_PIN_GROUP(msiof0_sync),
+       SH_PFC_PIN_GROUP(msiof0_ss1),
+       SH_PFC_PIN_GROUP(msiof0_ss2),
+       SH_PFC_PIN_GROUP(msiof0_txd),
+       SH_PFC_PIN_GROUP(msiof0_rxd),
+       SH_PFC_PIN_GROUP(msiof1_clk),
+       SH_PFC_PIN_GROUP(msiof1_sync),
+       SH_PFC_PIN_GROUP(msiof1_ss1),
+       SH_PFC_PIN_GROUP(msiof1_ss2),
+       SH_PFC_PIN_GROUP(msiof1_txd),
+       SH_PFC_PIN_GROUP(msiof1_rxd),
+       SH_PFC_PIN_GROUP(msiof2_clk),
+       SH_PFC_PIN_GROUP(msiof2_sync_a),
+       SH_PFC_PIN_GROUP(msiof2_sync_b),
+       SH_PFC_PIN_GROUP(msiof2_ss1),
+       SH_PFC_PIN_GROUP(msiof2_ss2),
+       SH_PFC_PIN_GROUP(msiof2_txd),
+       SH_PFC_PIN_GROUP(msiof2_rxd),
+       SH_PFC_PIN_GROUP(msiof3_clk_a),
+       SH_PFC_PIN_GROUP(msiof3_sync_a),
+       SH_PFC_PIN_GROUP(msiof3_ss1_a),
+       SH_PFC_PIN_GROUP(msiof3_ss2_a),
+       SH_PFC_PIN_GROUP(msiof3_txd_a),
+       SH_PFC_PIN_GROUP(msiof3_rxd_a),
+       SH_PFC_PIN_GROUP(msiof3_clk_b),
+       SH_PFC_PIN_GROUP(msiof3_sync_b),
+       SH_PFC_PIN_GROUP(msiof3_ss1_b),
+       SH_PFC_PIN_GROUP(msiof3_ss2_b),
+       SH_PFC_PIN_GROUP(msiof3_txd_b),
+       SH_PFC_PIN_GROUP(msiof3_rxd_b),
        SH_PFC_PIN_GROUP(pwm0_a),
        SH_PFC_PIN_GROUP(pwm0_b),
        SH_PFC_PIN_GROUP(pwm0_c),
@@ -1982,6 +2297,49 @@ static const char * const vin4_groups[] = {
        "vin4_clk",
 };
 
+static const char * const msiof0_groups[] = {
+       "msiof0_clk",
+       "msiof0_sync",
+       "msiof0_ss1",
+       "msiof0_ss2",
+       "msiof0_txd",
+       "msiof0_rxd",
+};
+
+static const char * const msiof1_groups[] = {
+       "msiof1_clk",
+       "msiof1_sync",
+       "msiof1_ss1",
+       "msiof1_ss2",
+       "msiof1_txd",
+       "msiof1_rxd",
+};
+
+static const char * const msiof2_groups[] = {
+       "msiof2_clk",
+       "msiof2_sync_a",
+       "msiof2_sync_b",
+       "msiof2_ss1",
+       "msiof2_ss2",
+       "msiof2_txd",
+       "msiof2_rxd",
+};
+
+static const char * const msiof3_groups[] = {
+       "msiof3_clk_a",
+       "msiof3_sync_a",
+       "msiof3_ss1_a",
+       "msiof3_ss2_a",
+       "msiof3_txd_a",
+       "msiof3_rxd_a",
+       "msiof3_clk_b",
+       "msiof3_sync_b",
+       "msiof3_ss1_b",
+       "msiof3_ss2_b",
+       "msiof3_txd_b",
+       "msiof3_rxd_b",
+};
+
 static const struct sh_pfc_function pinmux_functions[] = {
        SH_PFC_FUNCTION(audio_clk),
        SH_PFC_FUNCTION(avb0),
@@ -1996,6 +2354,10 @@ static const struct sh_pfc_function pinmux_functions[] = {
        SH_PFC_FUNCTION(i2c2),
        SH_PFC_FUNCTION(i2c3),
        SH_PFC_FUNCTION(mmc),
+       SH_PFC_FUNCTION(msiof0),
+       SH_PFC_FUNCTION(msiof1),
+       SH_PFC_FUNCTION(msiof2),
+       SH_PFC_FUNCTION(msiof3),
        SH_PFC_FUNCTION(pwm0),
        SH_PFC_FUNCTION(pwm1),
        SH_PFC_FUNCTION(pwm2),
index b3a4ff9049d093d00fdf67819700c2ec73c8c587..06359501b7d21a4d31ee906d805383a4eefb4a3e 100644 (file)
@@ -28,6 +28,7 @@ enum sh_pfc_model {
        SH_PFC_R8A7794,
        SH_PFC_R8A7795,
        SH_PFC_R8A7796,
+       SH_PFC_R8A77965,
        SH_PFC_R8A77970,
        SH_PFC_R8A77990,
        SH_PFC_R8A77995,
@@ -808,6 +809,10 @@ static int sh_pfc_pinctrl_probe(struct udevice *dev)
        if (model == SH_PFC_R8A7796)
                priv->pfc.info = &r8a7796_pinmux_info;
 #endif
+#ifdef CONFIG_PINCTRL_PFC_R8A77965
+       if (model == SH_PFC_R8A77965)
+               priv->pfc.info = &r8a77965_pinmux_info;
+#endif
 #ifdef CONFIG_PINCTRL_PFC_R8A77970
        if (model == SH_PFC_R8A77970)
                priv->pfc.info = &r8a77970_pinmux_info;
@@ -869,9 +874,12 @@ static const struct udevice_id sh_pfc_pinctrl_ids[] = {
        {
                .compatible = "renesas,pfc-r8a7796",
                .data = SH_PFC_R8A7796,
-       }, {
+       },
+#endif
+#ifdef CONFIG_PINCTRL_PFC_R8A77965
+       {
                .compatible = "renesas,pfc-r8a77965",
-               .data = SH_PFC_R8A7796,
+               .data = SH_PFC_R8A77965,
        },
 #endif
 #ifdef CONFIG_PINCTRL_PFC_R8A77970
index b98c2f185d26d7e6bf804e560d7512d89e1e3d37..09e11d31b30f81b9a11f10b48bef398cd03cd11b 100644 (file)
@@ -53,18 +53,32 @@ struct sh_pfc_pin_group {
 };
 
 /*
- * Using union vin_data saves memory occupied by the VIN data pins.
- * VIN_DATA_PIN_GROUP() is  a macro  used  to describe the VIN pin groups
- * in this case.
+ * Using union vin_data{,12,16} saves memory occupied by the VIN data pins.
+ * VIN_DATA_PIN_GROUP() is a macro used to describe the VIN pin groups
+ * in this case. It accepts an optional 'version' argument used when the
+ * same group can appear on a different set of pins.
  */
-#define VIN_DATA_PIN_GROUP(n, s)                               \
-       {                                                       \
-               .name = #n#s,                                   \
-               .pins = n##_pins.data##s,                       \
-               .mux = n##_mux.data##s,                         \
-               .nr_pins = ARRAY_SIZE(n##_pins.data##s),        \
+#define VIN_DATA_PIN_GROUP(n, s, ...)                                  \
+       {                                                               \
+               .name = #n#s#__VA_ARGS__,                               \
+               .pins = n##__VA_ARGS__##_pins.data##s,                  \
+               .mux = n##__VA_ARGS__##_mux.data##s,                    \
+               .nr_pins = ARRAY_SIZE(n##__VA_ARGS__##_pins.data##s),   \
        }
 
+union vin_data12 {
+       unsigned int data12[12];
+       unsigned int data10[10];
+       unsigned int data8[8];
+};
+
+union vin_data16 {
+       unsigned int data16[16];
+       unsigned int data12[12];
+       unsigned int data10[10];
+       unsigned int data8[8];
+};
+
 union vin_data {
        unsigned int data24[24];
        unsigned int data20[20];
@@ -270,9 +284,11 @@ extern const struct sh_pfc_soc_info r8a7793_pinmux_info;
 extern const struct sh_pfc_soc_info r8a7794_pinmux_info;
 extern const struct sh_pfc_soc_info r8a7795_pinmux_info;
 extern const struct sh_pfc_soc_info r8a7796_pinmux_info;
+extern const struct sh_pfc_soc_info r8a77965_pinmux_info;
 extern const struct sh_pfc_soc_info r8a77970_pinmux_info;
 extern const struct sh_pfc_soc_info r8a77990_pinmux_info;
 extern const struct sh_pfc_soc_info r8a77995_pinmux_info;
+
 /* -----------------------------------------------------------------------------
  * Helper macros to create pin and port lists
  */
@@ -341,6 +357,28 @@ extern const struct sh_pfc_soc_info r8a77995_pinmux_info;
 #define PINMUX_IPSR_MSEL(ipsr, fn, msel)                               \
        PINMUX_DATA(fn##_MARK, FN_##msel, FN_##fn, FN_##ipsr)
 
+/*
+ * Describe a pinmux configuration similar to PINMUX_IPSR_MSEL, but with
+ * an additional select register that controls physical multiplexing
+ * with another pin.
+ *   - ipsr: IPSR field
+ *   - fn: Function name, also referring to the IPSR field
+ *   - psel: Physical multiplexing selector
+ *   - msel: Module selector
+ */
+#define PINMUX_IPSR_PHYS_MSEL(ipsr, fn, psel, msel) \
+       PINMUX_DATA(fn##_MARK, FN_##psel, FN_##msel, FN_##fn, FN_##ipsr)
+
+/*
+ * Describe a pinmux configuration in which a pin is physically multiplexed
+ * with other pins.
+ *   - ipsr: IPSR field
+ *   - fn: Function name, also referring to the IPSR field
+ *   - psel: Physical multiplexing selector
+ */
+#define PINMUX_IPSR_PHYS(ipsr, fn, psel) \
+       PINMUX_DATA(fn##_MARK, FN_##psel)
+
 /*
  * Describe a pinmux configuration for a single-function pin with GPIO
  * capability.
@@ -388,12 +426,11 @@ extern const struct sh_pfc_soc_info r8a77995_pinmux_info;
 
 #define PORT_GP_CFG_11(bank, fn, sfx, cfg)                             \
        PORT_GP_CFG_10(bank, fn, sfx, cfg),                             \
-       PORT_GP_CFG_1(bank, 10,  fn, sfx, cfg)
+       PORT_GP_CFG_1(bank, 10, fn, sfx, cfg)
 #define PORT_GP_11(bank, fn, sfx)      PORT_GP_CFG_11(bank, fn, sfx, 0)
 
 #define PORT_GP_CFG_12(bank, fn, sfx, cfg)                             \
-       PORT_GP_CFG_10(bank, fn, sfx, cfg),                             \
-       PORT_GP_CFG_1(bank, 10, fn, sfx, cfg),                          \
+       PORT_GP_CFG_11(bank, fn, sfx, cfg),                             \
        PORT_GP_CFG_1(bank, 11, fn, sfx, cfg)
 #define PORT_GP_12(bank, fn, sfx)      PORT_GP_CFG_12(bank, fn, sfx, 0)
 
index 8cf60ebcf3d71a253ec003301bf7e4aea544096e..b0cd26035432c7d9ef69d96d5efe182a2f21f9ef 100644 (file)
@@ -231,10 +231,10 @@ config DM_PMIC_TPS65910
        DC-DC converter, 8 LDOs and a RTC. This driver binds the SMPS and LDO
        pmic children.
 
-config PMIC_STPMU1
-       bool "Enable support for STMicroelectronics STPMU1 PMIC"
+config PMIC_STPMIC1
+       bool "Enable support for STMicroelectronics STPMIC1 PMIC"
        depends on DM_PMIC && DM_I2C
        ---help---
-       The STPMU1 PMIC provides 4 BUCKs, 6 LDOs, 1 VREF and 2 power switches.
+       The STPMIC1 PMIC provides 4 BUCKs, 6 LDOs, 1 VREF and 2 power switches.
        It is accessed via an I2C interface. The device is used with STM32MP1
        SoCs. This driver implements register read/write operations.
index 637352ab2b7297dab91c9137d8ecfecdff031125..ce250cb1555afd724bf4377c10cc897ddc5aa1a7 100644 (file)
@@ -23,7 +23,7 @@ obj-$(CONFIG_DM_PMIC_TPS65910) += pmic_tps65910_dm.o
 obj-$(CONFIG_$(SPL_)PMIC_PALMAS) += palmas.o
 obj-$(CONFIG_$(SPL_)PMIC_LP873X) += lp873x.o
 obj-$(CONFIG_$(SPL_)PMIC_LP87565) += lp87565.o
-obj-$(CONFIG_PMIC_STPMU1) += stpmu1.o
+obj-$(CONFIG_PMIC_STPMIC1) += stpmic1.o
 
 obj-$(CONFIG_POWER_LTC3676) += pmic_ltc3676.o
 obj-$(CONFIG_POWER_MAX77696) += pmic_max77696.o
diff --git a/drivers/power/pmic/stpmic1.c b/drivers/power/pmic/stpmic1.c
new file mode 100644 (file)
index 0000000..65296c5
--- /dev/null
@@ -0,0 +1,255 @@
+// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
+/*
+ * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <i2c.h>
+#include <sysreset.h>
+#include <dm/device.h>
+#include <dm/lists.h>
+#include <power/pmic.h>
+#include <power/stpmic1.h>
+
+#define STPMIC1_NUM_OF_REGS 0x100
+
+#define STPMIC1_NVM_SIZE 8
+#define STPMIC1_NVM_POLL_TIMEOUT 100000
+#define STPMIC1_NVM_START_ADDRESS 0xf8
+
+enum pmic_nvm_op {
+       SHADOW_READ,
+       SHADOW_WRITE,
+       NVM_READ,
+       NVM_WRITE,
+};
+
+#if CONFIG_IS_ENABLED(DM_REGULATOR)
+static const struct pmic_child_info stpmic1_children_info[] = {
+       { .prefix = "ldo", .driver = "stpmic1_ldo" },
+       { .prefix = "buck", .driver = "stpmic1_buck" },
+       { .prefix = "vref_ddr", .driver = "stpmic1_vref_ddr" },
+       { .prefix = "pwr_sw", .driver = "stpmic1_pwr_sw" },
+       { .prefix = "boost", .driver = "stpmic1_boost" },
+       { },
+};
+#endif /* DM_REGULATOR */
+
+static int stpmic1_reg_count(struct udevice *dev)
+{
+       return STPMIC1_NUM_OF_REGS;
+}
+
+static int stpmic1_write(struct udevice *dev, uint reg, const uint8_t *buff,
+                        int len)
+{
+       int ret;
+
+       ret = dm_i2c_write(dev, reg, buff, len);
+       if (ret)
+               dev_err(dev, "%s: failed to write register %#x :%d",
+                       __func__, reg, ret);
+
+       return ret;
+}
+
+static int stpmic1_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
+{
+       int ret;
+
+       ret = dm_i2c_read(dev, reg, buff, len);
+       if (ret)
+               dev_err(dev, "%s: failed to read register %#x : %d",
+                       __func__, reg, ret);
+
+       return ret;
+}
+
+static int stpmic1_bind(struct udevice *dev)
+{
+#if CONFIG_IS_ENABLED(DM_REGULATOR)
+       ofnode regulators_node;
+       int children;
+
+       regulators_node = dev_read_subnode(dev, "regulators");
+       if (!ofnode_valid(regulators_node)) {
+               dev_dbg(dev, "regulators subnode not found!");
+               return -ENXIO;
+       }
+       dev_dbg(dev, "found regulators subnode\n");
+
+       children = pmic_bind_children(dev, regulators_node,
+                                     stpmic1_children_info);
+       if (!children)
+               dev_dbg(dev, "no child found\n");
+#endif /* DM_REGULATOR */
+
+       if (CONFIG_IS_ENABLED(SYSRESET))
+               return device_bind_driver(dev, "stpmic1-sysreset",
+                                         "stpmic1-sysreset", NULL);
+
+       return 0;
+}
+
+static struct dm_pmic_ops stpmic1_ops = {
+       .reg_count = stpmic1_reg_count,
+       .read = stpmic1_read,
+       .write = stpmic1_write,
+};
+
+static const struct udevice_id stpmic1_ids[] = {
+       { .compatible = "st,stpmic1" },
+       { }
+};
+
+U_BOOT_DRIVER(pmic_stpmic1) = {
+       .name = "stpmic1_pmic",
+       .id = UCLASS_PMIC,
+       .of_match = stpmic1_ids,
+       .bind = stpmic1_bind,
+       .ops = &stpmic1_ops,
+};
+
+#ifndef CONFIG_SPL_BUILD
+static int stpmic1_nvm_rw(u8 addr, u8 *buf, int buf_len, enum pmic_nvm_op op)
+{
+       struct udevice *dev;
+       unsigned long timeout;
+       u8 cmd = STPMIC1_NVM_CMD_READ;
+       int ret;
+
+       ret = uclass_get_device_by_driver(UCLASS_PMIC,
+                                         DM_GET_DRIVER(pmic_stpmic1), &dev);
+       if (ret)
+               /* No PMIC on power discrete board */
+               return -EOPNOTSUPP;
+
+       if (addr < STPMIC1_NVM_START_ADDRESS)
+               return -EACCES;
+
+       if (op == SHADOW_READ)
+               return pmic_read(dev, addr, buf, buf_len);
+
+       if (op == SHADOW_WRITE)
+               return pmic_write(dev, addr, buf, buf_len);
+
+       if (op == NVM_WRITE) {
+               cmd = STPMIC1_NVM_CMD_PROGRAM;
+
+               ret = pmic_write(dev, addr, buf, buf_len);
+               if (ret < 0)
+                       return ret;
+       }
+
+       ret = pmic_reg_read(dev, STPMIC1_NVM_CR);
+       if (ret < 0)
+               return ret;
+
+       ret = pmic_reg_write(dev, STPMIC1_NVM_CR, ret | cmd);
+       if (ret < 0)
+               return ret;
+
+       timeout = timer_get_us() + STPMIC1_NVM_POLL_TIMEOUT;
+       for (;;) {
+               ret = pmic_reg_read(dev, STPMIC1_NVM_SR);
+               if (ret < 0)
+                       return ret;
+
+               if (!(ret & STPMIC1_NVM_BUSY))
+                       break;
+
+               if (time_after(timer_get_us(), timeout))
+                       break;
+       }
+
+       if (ret & STPMIC1_NVM_BUSY)
+               return -ETIMEDOUT;
+
+       if (op == NVM_READ) {
+               ret = pmic_read(dev, addr, buf, buf_len);
+               if (ret < 0)
+                       return ret;
+       }
+
+       return 0;
+}
+
+int stpmic1_shadow_read_byte(u8 addr, u8 *buf)
+{
+       return stpmic1_nvm_rw(addr, buf, 1, SHADOW_READ);
+}
+
+int stpmic1_shadow_write_byte(u8 addr, u8 *buf)
+{
+       return stpmic1_nvm_rw(addr, buf, 1, SHADOW_WRITE);
+}
+
+int stpmic1_nvm_read_byte(u8 addr, u8 *buf)
+{
+       return stpmic1_nvm_rw(addr, buf, 1, NVM_READ);
+}
+
+int stpmic1_nvm_write_byte(u8 addr, u8 *buf)
+{
+       return stpmic1_nvm_rw(addr, buf, 1, NVM_WRITE);
+}
+
+int stpmic1_nvm_read_all(u8 *buf, int buf_len)
+{
+       if (buf_len != STPMIC1_NVM_SIZE)
+               return -EINVAL;
+
+       return stpmic1_nvm_rw(STPMIC1_NVM_START_ADDRESS,
+                            buf, buf_len, NVM_READ);
+}
+
+int stpmic1_nvm_write_all(u8 *buf, int buf_len)
+{
+       if (buf_len != STPMIC1_NVM_SIZE)
+               return -EINVAL;
+
+       return stpmic1_nvm_rw(STPMIC1_NVM_START_ADDRESS,
+                            buf, buf_len, NVM_WRITE);
+}
+#endif /* CONFIG_SPL_BUILD */
+
+#ifdef CONFIG_SYSRESET
+static int stpmic1_sysreset_request(struct udevice *dev, enum sysreset_t type)
+{
+       struct udevice *pmic_dev;
+       int ret;
+
+       if (type != SYSRESET_POWER)
+               return -EPROTONOSUPPORT;
+
+       ret = uclass_get_device_by_driver(UCLASS_PMIC,
+                                         DM_GET_DRIVER(pmic_stpmic1),
+                                         &pmic_dev);
+
+       if (ret)
+               return -EOPNOTSUPP;
+
+       ret = pmic_reg_read(pmic_dev, STPMIC1_MAIN_CR);
+       if (ret < 0)
+               return ret;
+
+       ret = pmic_reg_write(pmic_dev, STPMIC1_MAIN_CR,
+                            ret | STPMIC1_SWOFF | STPMIC1_RREQ_EN);
+       if (ret < 0)
+               return ret;
+
+       return -EINPROGRESS;
+}
+
+static struct sysreset_ops stpmic1_sysreset_ops = {
+       .request = stpmic1_sysreset_request,
+};
+
+U_BOOT_DRIVER(stpmic1_sysreset) = {
+       .name = "stpmic1-sysreset",
+       .id = UCLASS_SYSRESET,
+       .ops = &stpmic1_sysreset_ops,
+};
+#endif
diff --git a/drivers/power/pmic/stpmu1.c b/drivers/power/pmic/stpmu1.c
deleted file mode 100644 (file)
index 47af012..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
-/*
- * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
- */
-
-#include <common.h>
-#include <dm.h>
-#include <errno.h>
-#include <i2c.h>
-#include <power/pmic.h>
-#include <power/stpmu1.h>
-
-#define STMPU1_NUM_OF_REGS 0x100
-
-#ifndef CONFIG_SPL_BUILD
-static const struct pmic_child_info stpmu1_children_info[] = {
-       { .prefix = "ldo", .driver = "stpmu1_ldo" },
-       { .prefix = "buck", .driver = "stpmu1_buck" },
-       { .prefix = "vref_ddr", .driver = "stpmu1_vref_ddr" },
-       { .prefix = "pwr_sw", .driver = "stpmu1_pwr_sw" },
-       { .prefix = "boost", .driver = "stpmu1_boost" },
-       { },
-};
-#endif /* CONFIG_SPL_BUILD */
-
-static int stpmu1_reg_count(struct udevice *dev)
-{
-       return STMPU1_NUM_OF_REGS;
-}
-
-static int stpmu1_write(struct udevice *dev, uint reg, const uint8_t *buff,
-                       int len)
-{
-       int ret;
-
-       ret = dm_i2c_write(dev, reg, buff, len);
-       if (ret)
-               dev_err(dev, "%s: failed to write register %#x :%d",
-                       __func__, reg, ret);
-
-       return ret;
-}
-
-static int stpmu1_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
-{
-       int ret;
-
-       ret = dm_i2c_read(dev, reg, buff, len);
-       if (ret)
-               dev_err(dev, "%s: failed to read register %#x : %d",
-                       __func__, reg, ret);
-
-       return ret;
-}
-
-static int stpmu1_bind(struct udevice *dev)
-{
-#ifndef CONFIG_SPL_BUILD
-       ofnode regulators_node;
-       int children;
-
-       regulators_node = dev_read_subnode(dev, "regulators");
-       if (!ofnode_valid(regulators_node)) {
-               dev_dbg(dev, "regulators subnode not found!\n");
-               return -ENXIO;
-       }
-       dev_dbg(dev, "found regulators subnode\n");
-
-       children = pmic_bind_children(dev, regulators_node,
-                                     stpmu1_children_info);
-       if (!children)
-               dev_dbg(dev, "no child found\n");
-#endif /* CONFIG_SPL_BUILD */
-
-       return 0;
-}
-
-static struct dm_pmic_ops stpmu1_ops = {
-       .reg_count = stpmu1_reg_count,
-       .read = stpmu1_read,
-       .write = stpmu1_write,
-};
-
-static const struct udevice_id stpmu1_ids[] = {
-       { .compatible = "st,stpmu1" },
-       { }
-};
-
-U_BOOT_DRIVER(pmic_stpmu1) = {
-       .name = "stpmu1_pmic",
-       .id = UCLASS_PMIC,
-       .of_match = stpmu1_ids,
-       .bind = stpmu1_bind,
-       .ops = &stpmu1_ops,
-};
index 3ed0dd2264a9b5372886746e5bda1d9f1de9ff51..72dfc48981a281e327582fc03a33715c76f8b91a 100644 (file)
@@ -244,11 +244,17 @@ config DM_REGULATOR_TPS65910
        regulator types of the TPS65910 (BUCK, BOOST and LDO). It implements
        the get/set api for value and enable.
 
-config DM_REGULATOR_STPMU1
-       bool "Enable driver for STPMU1 regulators"
-       depends on DM_REGULATOR && PMIC_STPMU1
+config DM_REGULATOR_STPMIC1
+       bool "Enable driver for STPMIC1 regulators"
+       depends on DM_REGULATOR && PMIC_STPMIC1
        ---help---
-       Enable support for the regulator functions of the STPMU1 PMIC. The
+       Enable support for the regulator functions of the STPMIC1 PMIC. The
        driver implements get/set api for the various BUCKS and LDOs supported
        by the PMIC device. This driver is controlled by a device tree node
        which includes voltage limits.
+
+config SPL_DM_REGULATOR_STPMIC1
+       bool "Enable driver for STPMIC1 regulators in SPL"
+       depends on SPL_DM_REGULATOR && PMIC_STPMIC1
+       help
+         Enable support for the regulator functions of the STPMIC1 PMIC in SPL.
index f617ce723a96a16a40db35cb88185981ce57b206..8c1506c88edb8e8a5c66fefa8d4daffb47046200 100644 (file)
@@ -24,4 +24,4 @@ obj-$(CONFIG_$(SPL_)DM_REGULATOR_LP873X) += lp873x_regulator.o
 obj-$(CONFIG_$(SPL_)DM_REGULATOR_LP87565) += lp87565_regulator.o
 obj-$(CONFIG_$(SPL_)DM_REGULATOR_STM32_VREFBUF) += stm32-vrefbuf.o
 obj-$(CONFIG_DM_REGULATOR_TPS65910) += tps65910_regulator.o
-obj-$(CONFIG_$(SPL_)DM_REGULATOR_STPMU1) += stpmu1.o
+obj-$(CONFIG_$(SPL_)DM_REGULATOR_STPMIC1) += stpmic1.o
index 4ed3c94e03115e06286a1bb7f41186bdebfba605..88dc9f273aebed4db07729cc4a082d46c7d1bfe8 100644 (file)
@@ -238,7 +238,7 @@ static int pbias_regulator_set_value(struct udevice *dev, int uV)
        if (rc)
                return rc;
 
-       if (uV == 3000000)
+       if (uV == 3300000)
                reg |= p->vmode;
        else if (uV == 1800000)
                reg &= ~p->vmode;
diff --git a/drivers/power/regulator/stpmic1.c b/drivers/power/regulator/stpmic1.c
new file mode 100644 (file)
index 0000000..50ef2a2
--- /dev/null
@@ -0,0 +1,672 @@
+// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
+/*
+ * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
+ * Author: Christophe Kerello <christophe.kerello@st.com>
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <power/pmic.h>
+#include <power/regulator.h>
+#include <power/stpmic1.h>
+
+struct stpmic1_range {
+       int min_uv;
+       int min_sel;
+       int max_sel;
+       int step;
+};
+
+struct stpmic1_output {
+       const struct stpmic1_range *ranges;
+       int nbranges;
+};
+
+#define STPMIC1_MODE(_id, _val, _name) { \
+       .id = _id,                      \
+       .register_value = _val,         \
+       .name = _name,                  \
+}
+
+#define STPMIC1_RANGE(_min_uv, _min_sel, _max_sel, _step) { \
+       .min_uv = _min_uv,              \
+       .min_sel = _min_sel,            \
+       .max_sel = _max_sel,            \
+       .step = _step,                  \
+}
+
+#define STPMIC1_OUTPUT(_ranges, _nbranges) { \
+       .ranges = _ranges,              \
+       .nbranges = _nbranges,          \
+}
+
+static int stpmic1_output_find_uv(int sel,
+                                 const struct stpmic1_output *output)
+{
+       const struct stpmic1_range *range;
+       int i;
+
+       for (i = 0, range = output->ranges;
+            i < output->nbranges; i++, range++) {
+               if (sel >= range->min_sel && sel <= range->max_sel)
+                       return range->min_uv +
+                              (sel - range->min_sel) * range->step;
+       }
+
+       return -EINVAL;
+}
+
+static int stpmic1_output_find_sel(int uv,
+                                  const struct stpmic1_output *output)
+{
+       const struct stpmic1_range *range;
+       int i;
+
+       for (i = 0, range = output->ranges;
+            i < output->nbranges; i++, range++) {
+               if (uv == range->min_uv && !range->step)
+                       return range->min_sel;
+
+               if (uv >= range->min_uv &&
+                   uv <= range->min_uv +
+                         (range->max_sel - range->min_sel) * range->step)
+                       return range->min_sel +
+                              (uv - range->min_uv) / range->step;
+       }
+
+       return -EINVAL;
+}
+
+/*
+ * BUCK regulators
+ */
+
+static const struct stpmic1_range buck1_ranges[] = {
+       STPMIC1_RANGE(725000, 0, 4, 0),
+       STPMIC1_RANGE(725000, 5, 36, 25000),
+       STPMIC1_RANGE(1500000, 37, 63, 0),
+};
+
+static const struct stpmic1_range buck2_ranges[] = {
+       STPMIC1_RANGE(1000000, 0, 17, 0),
+       STPMIC1_RANGE(1050000, 18, 19, 0),
+       STPMIC1_RANGE(1100000, 20, 21, 0),
+       STPMIC1_RANGE(1150000, 22, 23, 0),
+       STPMIC1_RANGE(1200000, 24, 25, 0),
+       STPMIC1_RANGE(1250000, 26, 27, 0),
+       STPMIC1_RANGE(1300000, 28, 29, 0),
+       STPMIC1_RANGE(1350000, 30, 31, 0),
+       STPMIC1_RANGE(1400000, 32, 33, 0),
+       STPMIC1_RANGE(1450000, 34, 35, 0),
+       STPMIC1_RANGE(1500000, 36, 63, 0),
+};
+
+static const struct stpmic1_range buck3_ranges[] = {
+       STPMIC1_RANGE(1000000, 0, 19, 0),
+       STPMIC1_RANGE(1100000, 20, 23, 0),
+       STPMIC1_RANGE(1200000, 24, 27, 0),
+       STPMIC1_RANGE(1300000, 28, 31, 0),
+       STPMIC1_RANGE(1400000, 32, 35, 0),
+       STPMIC1_RANGE(1500000, 36, 55, 100000),
+       STPMIC1_RANGE(3400000, 56, 63, 0),
+};
+
+static const struct stpmic1_range buck4_ranges[] = {
+       STPMIC1_RANGE(600000, 0, 27, 25000),
+       STPMIC1_RANGE(1300000, 28, 29, 0),
+       STPMIC1_RANGE(1350000, 30, 31, 0),
+       STPMIC1_RANGE(1400000, 32, 33, 0),
+       STPMIC1_RANGE(1450000, 34, 35, 0),
+       STPMIC1_RANGE(1500000, 36, 60, 100000),
+       STPMIC1_RANGE(3900000, 61, 63, 0),
+};
+
+/* BUCK: 1,2,3,4 - voltage ranges */
+static const struct stpmic1_output buck_voltage_range[] = {
+       STPMIC1_OUTPUT(buck1_ranges, ARRAY_SIZE(buck1_ranges)),
+       STPMIC1_OUTPUT(buck2_ranges, ARRAY_SIZE(buck2_ranges)),
+       STPMIC1_OUTPUT(buck3_ranges, ARRAY_SIZE(buck3_ranges)),
+       STPMIC1_OUTPUT(buck4_ranges, ARRAY_SIZE(buck4_ranges)),
+};
+
+/* BUCK modes */
+static const struct dm_regulator_mode buck_modes[] = {
+       STPMIC1_MODE(STPMIC1_PREG_MODE_HP, STPMIC1_PREG_MODE_HP, "HP"),
+       STPMIC1_MODE(STPMIC1_PREG_MODE_LP, STPMIC1_PREG_MODE_LP, "LP"),
+};
+
+static int stpmic1_buck_get_uv(struct udevice *dev, int buck)
+{
+       int sel;
+
+       sel = pmic_reg_read(dev, STPMIC1_BUCKX_MAIN_CR(buck));
+       if (sel < 0)
+               return sel;
+
+       sel &= STPMIC1_BUCK_VOUT_MASK;
+       sel >>= STPMIC1_BUCK_VOUT_SHIFT;
+
+       return stpmic1_output_find_uv(sel, &buck_voltage_range[buck]);
+}
+
+static int stpmic1_buck_get_value(struct udevice *dev)
+{
+       return stpmic1_buck_get_uv(dev->parent, dev->driver_data - 1);
+}
+
+static int stpmic1_buck_set_value(struct udevice *dev, int uv)
+{
+       int sel, buck = dev->driver_data - 1;
+
+       sel = stpmic1_output_find_sel(uv, &buck_voltage_range[buck]);
+       if (sel < 0)
+               return sel;
+
+       return pmic_clrsetbits(dev->parent,
+                              STPMIC1_BUCKX_MAIN_CR(buck),
+                              STPMIC1_BUCK_VOUT_MASK,
+                              sel << STPMIC1_BUCK_VOUT_SHIFT);
+}
+
+static int stpmic1_buck_get_enable(struct udevice *dev)
+{
+       int ret;
+
+       ret = pmic_reg_read(dev->parent,
+                           STPMIC1_BUCKX_MAIN_CR(dev->driver_data - 1));
+       if (ret < 0)
+               return false;
+
+       return ret & STPMIC1_BUCK_ENA ? true : false;
+}
+
+static int stpmic1_buck_set_enable(struct udevice *dev, bool enable)
+{
+       struct dm_regulator_uclass_platdata *uc_pdata;
+       int delay = enable ? STPMIC1_DEFAULT_START_UP_DELAY_MS :
+                            STPMIC1_DEFAULT_STOP_DELAY_MS;
+       int ret, uv;
+
+       /* if regulator is already in the wanted state, nothing to do */
+       if (stpmic1_buck_get_enable(dev) == enable)
+               return 0;
+
+       if (enable) {
+               uc_pdata = dev_get_uclass_platdata(dev);
+               uv = stpmic1_buck_get_value(dev);
+               if (uv < uc_pdata->min_uV || uv > uc_pdata->max_uV)
+                       stpmic1_buck_set_value(dev, uc_pdata->min_uV);
+       }
+
+       ret = pmic_clrsetbits(dev->parent,
+                             STPMIC1_BUCKX_MAIN_CR(dev->driver_data - 1),
+                             STPMIC1_BUCK_ENA, enable ? STPMIC1_BUCK_ENA : 0);
+       mdelay(delay);
+
+       return ret;
+}
+
+static int stpmic1_buck_get_mode(struct udevice *dev)
+{
+       int ret;
+
+       ret = pmic_reg_read(dev->parent,
+                           STPMIC1_BUCKX_MAIN_CR(dev->driver_data - 1));
+       if (ret < 0)
+               return ret;
+
+       return ret & STPMIC1_BUCK_PREG_MODE ? STPMIC1_PREG_MODE_LP :
+                                             STPMIC1_PREG_MODE_HP;
+}
+
+static int stpmic1_buck_set_mode(struct udevice *dev, int mode)
+{
+       return pmic_clrsetbits(dev->parent,
+                              STPMIC1_BUCKX_MAIN_CR(dev->driver_data - 1),
+                              STPMIC1_BUCK_PREG_MODE,
+                              mode ? STPMIC1_BUCK_PREG_MODE : 0);
+}
+
+static int stpmic1_buck_probe(struct udevice *dev)
+{
+       struct dm_regulator_uclass_platdata *uc_pdata;
+
+       if (!dev->driver_data || dev->driver_data > STPMIC1_MAX_BUCK)
+               return -EINVAL;
+
+       uc_pdata = dev_get_uclass_platdata(dev);
+
+       uc_pdata->type = REGULATOR_TYPE_BUCK;
+       uc_pdata->mode = (struct dm_regulator_mode *)buck_modes;
+       uc_pdata->mode_count = ARRAY_SIZE(buck_modes);
+
+       return 0;
+}
+
+static const struct dm_regulator_ops stpmic1_buck_ops = {
+       .get_value  = stpmic1_buck_get_value,
+       .set_value  = stpmic1_buck_set_value,
+       .get_enable = stpmic1_buck_get_enable,
+       .set_enable = stpmic1_buck_set_enable,
+       .get_mode   = stpmic1_buck_get_mode,
+       .set_mode   = stpmic1_buck_set_mode,
+};
+
+U_BOOT_DRIVER(stpmic1_buck) = {
+       .name = "stpmic1_buck",
+       .id = UCLASS_REGULATOR,
+       .ops = &stpmic1_buck_ops,
+       .probe = stpmic1_buck_probe,
+};
+
+/*
+ * LDO regulators
+ */
+
+static const struct stpmic1_range ldo12_ranges[] = {
+       STPMIC1_RANGE(1700000, 0, 7, 0),
+       STPMIC1_RANGE(1700000, 8, 24, 100000),
+       STPMIC1_RANGE(3300000, 25, 31, 0),
+};
+
+static const struct stpmic1_range ldo3_ranges[] = {
+       STPMIC1_RANGE(1700000, 0, 7, 0),
+       STPMIC1_RANGE(1700000, 8, 24, 100000),
+       STPMIC1_RANGE(3300000, 25, 30, 0),
+       /* Sel 31 is special case when LDO3 is in mode sync_source (BUCK2/2) */
+};
+
+static const struct stpmic1_range ldo5_ranges[] = {
+       STPMIC1_RANGE(1700000, 0, 7, 0),
+       STPMIC1_RANGE(1700000, 8, 30, 100000),
+       STPMIC1_RANGE(3900000, 31, 31, 0),
+};
+
+static const struct stpmic1_range ldo6_ranges[] = {
+       STPMIC1_RANGE(900000, 0, 24, 100000),
+       STPMIC1_RANGE(3300000, 25, 31, 0),
+};
+
+/* LDO: 1,2,3,4,5,6 - voltage ranges */
+static const struct stpmic1_output ldo_voltage_range[] = {
+       STPMIC1_OUTPUT(ldo12_ranges, ARRAY_SIZE(ldo12_ranges)),
+       STPMIC1_OUTPUT(ldo12_ranges, ARRAY_SIZE(ldo12_ranges)),
+       STPMIC1_OUTPUT(ldo3_ranges, ARRAY_SIZE(ldo3_ranges)),
+       STPMIC1_OUTPUT(NULL, 0),
+       STPMIC1_OUTPUT(ldo5_ranges, ARRAY_SIZE(ldo5_ranges)),
+       STPMIC1_OUTPUT(ldo6_ranges, ARRAY_SIZE(ldo6_ranges)),
+};
+
+/* LDO modes */
+static const struct dm_regulator_mode ldo_modes[] = {
+       STPMIC1_MODE(STPMIC1_LDO_MODE_NORMAL,
+                    STPMIC1_LDO_MODE_NORMAL, "NORMAL"),
+       STPMIC1_MODE(STPMIC1_LDO_MODE_BYPASS,
+                    STPMIC1_LDO_MODE_BYPASS, "BYPASS"),
+       STPMIC1_MODE(STPMIC1_LDO_MODE_SINK_SOURCE,
+                    STPMIC1_LDO_MODE_SINK_SOURCE, "SINK SOURCE"),
+};
+
+static int stpmic1_ldo_get_value(struct udevice *dev)
+{
+       int sel, ldo = dev->driver_data - 1;
+
+       sel = pmic_reg_read(dev->parent, STPMIC1_LDOX_MAIN_CR(ldo));
+       if (sel < 0)
+               return sel;
+
+       /* ldo4 => 3,3V */
+       if (ldo == STPMIC1_LDO4)
+               return STPMIC1_LDO4_UV;
+
+       sel &= STPMIC1_LDO12356_VOUT_MASK;
+       sel >>= STPMIC1_LDO12356_VOUT_SHIFT;
+
+       /* ldo3, sel = 31 => BUCK2/2 */
+       if (ldo == STPMIC1_LDO3 && sel == STPMIC1_LDO3_DDR_SEL)
+               return stpmic1_buck_get_uv(dev->parent, STPMIC1_BUCK2) / 2;
+
+       return stpmic1_output_find_uv(sel, &ldo_voltage_range[ldo]);
+}
+
+static int stpmic1_ldo_set_value(struct udevice *dev, int uv)
+{
+       int sel, ldo = dev->driver_data - 1;
+
+       /* ldo4 => not possible */
+       if (ldo == STPMIC1_LDO4)
+               return -EINVAL;
+
+       sel = stpmic1_output_find_sel(uv, &ldo_voltage_range[ldo]);
+       if (sel < 0)
+               return sel;
+
+       return pmic_clrsetbits(dev->parent,
+                              STPMIC1_LDOX_MAIN_CR(ldo),
+                              STPMIC1_LDO12356_VOUT_MASK,
+                              sel << STPMIC1_LDO12356_VOUT_SHIFT);
+}
+
+static int stpmic1_ldo_get_enable(struct udevice *dev)
+{
+       int ret;
+
+       ret = pmic_reg_read(dev->parent,
+                           STPMIC1_LDOX_MAIN_CR(dev->driver_data - 1));
+       if (ret < 0)
+               return false;
+
+       return ret & STPMIC1_LDO_ENA ? true : false;
+}
+
+static int stpmic1_ldo_set_enable(struct udevice *dev, bool enable)
+{
+       struct dm_regulator_uclass_platdata *uc_pdata;
+       int delay = enable ? STPMIC1_DEFAULT_START_UP_DELAY_MS :
+                            STPMIC1_DEFAULT_STOP_DELAY_MS;
+       int ret, uv;
+
+       /* if regulator is already in the wanted state, nothing to do */
+       if (stpmic1_ldo_get_enable(dev) == enable)
+               return 0;
+
+       if (enable) {
+               uc_pdata = dev_get_uclass_platdata(dev);
+               uv = stpmic1_ldo_get_value(dev);
+               if (uv < uc_pdata->min_uV || uv > uc_pdata->max_uV)
+                       stpmic1_ldo_set_value(dev, uc_pdata->min_uV);
+       }
+
+       ret = pmic_clrsetbits(dev->parent,
+                             STPMIC1_LDOX_MAIN_CR(dev->driver_data - 1),
+                             STPMIC1_LDO_ENA, enable ? STPMIC1_LDO_ENA : 0);
+       mdelay(delay);
+
+       return ret;
+}
+
+static int stpmic1_ldo_get_mode(struct udevice *dev)
+{
+       int ret, ldo = dev->driver_data - 1;
+
+       if (ldo != STPMIC1_LDO3)
+               return -EINVAL;
+
+       ret = pmic_reg_read(dev->parent, STPMIC1_LDOX_MAIN_CR(ldo));
+       if (ret < 0)
+               return ret;
+
+       if (ret & STPMIC1_LDO3_MODE)
+               return STPMIC1_LDO_MODE_BYPASS;
+
+       ret &= STPMIC1_LDO12356_VOUT_MASK;
+       ret >>= STPMIC1_LDO12356_VOUT_SHIFT;
+
+       return ret == STPMIC1_LDO3_DDR_SEL ? STPMIC1_LDO_MODE_SINK_SOURCE :
+                                            STPMIC1_LDO_MODE_NORMAL;
+}
+
+static int stpmic1_ldo_set_mode(struct udevice *dev, int mode)
+{
+       int ret, ldo = dev->driver_data - 1;
+
+       if (ldo != STPMIC1_LDO3)
+               return -EINVAL;
+
+       ret = pmic_reg_read(dev->parent, STPMIC1_LDOX_MAIN_CR(ldo));
+       if (ret < 0)
+               return ret;
+
+       switch (mode) {
+       case STPMIC1_LDO_MODE_SINK_SOURCE:
+               ret &= ~STPMIC1_LDO12356_VOUT_MASK;
+               ret |= STPMIC1_LDO3_DDR_SEL << STPMIC1_LDO12356_VOUT_SHIFT;
+       case STPMIC1_LDO_MODE_NORMAL:
+               ret &= ~STPMIC1_LDO3_MODE;
+               break;
+       case STPMIC1_LDO_MODE_BYPASS:
+               ret |= STPMIC1_LDO3_MODE;
+               break;
+       }
+
+       return pmic_reg_write(dev->parent, STPMIC1_LDOX_MAIN_CR(ldo), ret);
+}
+
+static int stpmic1_ldo_probe(struct udevice *dev)
+{
+       struct dm_regulator_uclass_platdata *uc_pdata;
+
+       if (!dev->driver_data || dev->driver_data > STPMIC1_MAX_LDO)
+               return -EINVAL;
+
+       uc_pdata = dev_get_uclass_platdata(dev);
+
+       uc_pdata->type = REGULATOR_TYPE_LDO;
+       if (dev->driver_data - 1 == STPMIC1_LDO3) {
+               uc_pdata->mode = (struct dm_regulator_mode *)ldo_modes;
+               uc_pdata->mode_count = ARRAY_SIZE(ldo_modes);
+       } else {
+               uc_pdata->mode_count = 0;
+       }
+
+       return 0;
+}
+
+static const struct dm_regulator_ops stpmic1_ldo_ops = {
+       .get_value  = stpmic1_ldo_get_value,
+       .set_value  = stpmic1_ldo_set_value,
+       .get_enable = stpmic1_ldo_get_enable,
+       .set_enable = stpmic1_ldo_set_enable,
+       .get_mode   = stpmic1_ldo_get_mode,
+       .set_mode   = stpmic1_ldo_set_mode,
+};
+
+U_BOOT_DRIVER(stpmic1_ldo) = {
+       .name = "stpmic1_ldo",
+       .id = UCLASS_REGULATOR,
+       .ops = &stpmic1_ldo_ops,
+       .probe = stpmic1_ldo_probe,
+};
+
+/*
+ * VREF DDR regulator
+ */
+
+static int stpmic1_vref_ddr_get_value(struct udevice *dev)
+{
+       /* BUCK2/2 */
+       return stpmic1_buck_get_uv(dev->parent, STPMIC1_BUCK2) / 2;
+}
+
+static int stpmic1_vref_ddr_get_enable(struct udevice *dev)
+{
+       int ret;
+
+       ret = pmic_reg_read(dev->parent, STPMIC1_REFDDR_MAIN_CR);
+       if (ret < 0)
+               return false;
+
+       return ret & STPMIC1_VREF_ENA ? true : false;
+}
+
+static int stpmic1_vref_ddr_set_enable(struct udevice *dev, bool enable)
+{
+       int delay = enable ? STPMIC1_DEFAULT_START_UP_DELAY_MS :
+                            STPMIC1_DEFAULT_STOP_DELAY_MS;
+       int ret;
+
+       /* if regulator is already in the wanted state, nothing to do */
+       if (stpmic1_vref_ddr_get_enable(dev) == enable)
+               return 0;
+
+       ret = pmic_clrsetbits(dev->parent, STPMIC1_REFDDR_MAIN_CR,
+                             STPMIC1_VREF_ENA, enable ? STPMIC1_VREF_ENA : 0);
+       mdelay(delay);
+
+       return ret;
+}
+
+static int stpmic1_vref_ddr_probe(struct udevice *dev)
+{
+       struct dm_regulator_uclass_platdata *uc_pdata;
+
+       uc_pdata = dev_get_uclass_platdata(dev);
+
+       uc_pdata->type = REGULATOR_TYPE_FIXED;
+       uc_pdata->mode_count = 0;
+
+       return 0;
+}
+
+static const struct dm_regulator_ops stpmic1_vref_ddr_ops = {
+       .get_value  = stpmic1_vref_ddr_get_value,
+       .get_enable = stpmic1_vref_ddr_get_enable,
+       .set_enable = stpmic1_vref_ddr_set_enable,
+};
+
+U_BOOT_DRIVER(stpmic1_vref_ddr) = {
+       .name = "stpmic1_vref_ddr",
+       .id = UCLASS_REGULATOR,
+       .ops = &stpmic1_vref_ddr_ops,
+       .probe = stpmic1_vref_ddr_probe,
+};
+
+/*
+ * BOOST regulator
+ */
+
+static int stpmic1_boost_get_enable(struct udevice *dev)
+{
+       int ret;
+
+       ret = pmic_reg_read(dev->parent, STPMIC1_BST_SW_CR);
+       if (ret < 0)
+               return false;
+
+       return ret & STPMIC1_BST_ON ? true : false;
+}
+
+static int stpmic1_boost_set_enable(struct udevice *dev, bool enable)
+{
+       int ret;
+
+       ret = pmic_reg_read(dev->parent, STPMIC1_BST_SW_CR);
+       if (ret < 0)
+               return ret;
+
+       if (!enable && ret & STPMIC1_PWR_SW_ON)
+               return -EINVAL;
+
+       /* if regulator is already in the wanted state, nothing to do */
+       if (!!(ret & STPMIC1_BST_ON) == enable)
+               return 0;
+
+       ret = pmic_clrsetbits(dev->parent, STPMIC1_BST_SW_CR,
+                             STPMIC1_BST_ON,
+                             enable ? STPMIC1_BST_ON : 0);
+       if (enable)
+               mdelay(STPMIC1_USB_BOOST_START_UP_DELAY_MS);
+
+       return ret;
+}
+
+static int stpmic1_boost_probe(struct udevice *dev)
+{
+       struct dm_regulator_uclass_platdata *uc_pdata;
+
+       uc_pdata = dev_get_uclass_platdata(dev);
+
+       uc_pdata->type = REGULATOR_TYPE_FIXED;
+       uc_pdata->mode_count = 0;
+
+       return 0;
+}
+
+static const struct dm_regulator_ops stpmic1_boost_ops = {
+       .get_enable = stpmic1_boost_get_enable,
+       .set_enable = stpmic1_boost_set_enable,
+};
+
+U_BOOT_DRIVER(stpmic1_boost) = {
+       .name = "stpmic1_boost",
+       .id = UCLASS_REGULATOR,
+       .ops = &stpmic1_boost_ops,
+       .probe = stpmic1_boost_probe,
+};
+
+/*
+ * USB power switch
+ */
+
+static int stpmic1_pwr_sw_get_enable(struct udevice *dev)
+{
+       uint mask = 1 << dev->driver_data;
+       int ret;
+
+       ret = pmic_reg_read(dev->parent, STPMIC1_BST_SW_CR);
+       if (ret < 0)
+               return false;
+
+       return ret & mask ? true : false;
+}
+
+static int stpmic1_pwr_sw_set_enable(struct udevice *dev, bool enable)
+{
+       uint mask = 1 << dev->driver_data;
+       int delay = enable ? STPMIC1_DEFAULT_START_UP_DELAY_MS :
+                            STPMIC1_DEFAULT_STOP_DELAY_MS;
+       int ret;
+
+       ret = pmic_reg_read(dev->parent, STPMIC1_BST_SW_CR);
+       if (ret < 0)
+               return ret;
+
+       /* if regulator is already in the wanted state, nothing to do */
+       if (!!(ret & mask) == enable)
+               return 0;
+
+       /* Boost management */
+       if (enable && !(ret & STPMIC1_BST_ON)) {
+               pmic_clrsetbits(dev->parent, STPMIC1_BST_SW_CR,
+                               STPMIC1_BST_ON, STPMIC1_BST_ON);
+               mdelay(STPMIC1_USB_BOOST_START_UP_DELAY_MS);
+       } else if (!enable && ret & STPMIC1_BST_ON &&
+                  (ret & STPMIC1_PWR_SW_ON) != STPMIC1_PWR_SW_ON) {
+               pmic_clrsetbits(dev->parent, STPMIC1_BST_SW_CR,
+                               STPMIC1_BST_ON, 0);
+       }
+
+       ret = pmic_clrsetbits(dev->parent, STPMIC1_BST_SW_CR,
+                             mask, enable ? mask : 0);
+       mdelay(delay);
+
+       return ret;
+}
+
+static int stpmic1_pwr_sw_probe(struct udevice *dev)
+{
+       struct dm_regulator_uclass_platdata *uc_pdata;
+
+       if (!dev->driver_data || dev->driver_data > STPMIC1_MAX_PWR_SW)
+               return -EINVAL;
+
+       uc_pdata = dev_get_uclass_platdata(dev);
+
+       uc_pdata->type = REGULATOR_TYPE_FIXED;
+       uc_pdata->mode_count = 0;
+
+       return 0;
+}
+
+static const struct dm_regulator_ops stpmic1_pwr_sw_ops = {
+       .get_enable = stpmic1_pwr_sw_get_enable,
+       .set_enable = stpmic1_pwr_sw_set_enable,
+};
+
+U_BOOT_DRIVER(stpmic1_pwr_sw) = {
+       .name = "stpmic1_pwr_sw",
+       .id = UCLASS_REGULATOR,
+       .ops = &stpmic1_pwr_sw_ops,
+       .probe = stpmic1_pwr_sw_probe,
+};
diff --git a/drivers/power/regulator/stpmu1.c b/drivers/power/regulator/stpmu1.c
deleted file mode 100644 (file)
index 6eb2420..0000000
+++ /dev/null
@@ -1,671 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
-/*
- * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
- * Author: Christophe Kerello <christophe.kerello@st.com>
- */
-
-#include <common.h>
-#include <dm.h>
-#include <errno.h>
-#include <power/pmic.h>
-#include <power/regulator.h>
-#include <power/stpmu1.h>
-
-struct stpmu1_range {
-       int min_uv;
-       int min_sel;
-       int max_sel;
-       int step;
-};
-
-struct stpmu1_output_range {
-       const struct stpmu1_range *ranges;
-       int nbranges;
-};
-
-#define STPMU1_MODE(_id, _val, _name) { \
-       .id = _id,                      \
-       .register_value = _val,         \
-       .name = _name,                  \
-}
-
-#define STPMU1_RANGE(_min_uv, _min_sel, _max_sel, _step) { \
-       .min_uv = _min_uv,              \
-       .min_sel = _min_sel,            \
-       .max_sel = _max_sel,            \
-       .step = _step,                  \
-}
-
-#define STPMU1_OUTPUT_RANGE(_ranges, _nbranges) { \
-       .ranges = _ranges,              \
-       .nbranges = _nbranges,          \
-}
-
-static int stpmu1_output_find_uv(int sel,
-                                const struct stpmu1_output_range *output_range)
-{
-       const struct stpmu1_range *range;
-       int i;
-
-       for (i = 0, range = output_range->ranges;
-            i < output_range->nbranges; i++, range++) {
-               if (sel >= range->min_sel && sel <= range->max_sel)
-                       return range->min_uv +
-                              (sel - range->min_sel) * range->step;
-       }
-
-       return -EINVAL;
-}
-
-static int stpmu1_output_find_sel(int uv,
-                                 const struct stpmu1_output_range *output_range)
-{
-       const struct stpmu1_range *range;
-       int i;
-
-       for (i = 0, range = output_range->ranges;
-            i < output_range->nbranges; i++, range++) {
-               if (uv == range->min_uv && !range->step)
-                       return range->min_sel;
-
-               if (uv >= range->min_uv &&
-                   uv <= range->min_uv +
-                         (range->max_sel - range->min_sel) * range->step)
-                       return range->min_sel +
-                              (uv - range->min_uv) / range->step;
-       }
-
-       return -EINVAL;
-}
-
-/*
- * BUCK regulators
- */
-
-static const struct stpmu1_range buck1_ranges[] = {
-       STPMU1_RANGE(600000, 0, 30, 25000),
-       STPMU1_RANGE(1350000, 31, 63, 0),
-};
-
-static const struct stpmu1_range buck2_ranges[] = {
-       STPMU1_RANGE(1000000, 0, 17, 0),
-       STPMU1_RANGE(1050000, 18, 19, 0),
-       STPMU1_RANGE(1100000, 20, 21, 0),
-       STPMU1_RANGE(1150000, 22, 23, 0),
-       STPMU1_RANGE(1200000, 24, 25, 0),
-       STPMU1_RANGE(1250000, 26, 27, 0),
-       STPMU1_RANGE(1300000, 28, 29, 0),
-       STPMU1_RANGE(1350000, 30, 31, 0),
-       STPMU1_RANGE(1400000, 32, 33, 0),
-       STPMU1_RANGE(1450000, 34, 35, 0),
-       STPMU1_RANGE(1500000, 36, 63, 0),
-};
-
-static const struct stpmu1_range buck3_ranges[] = {
-       STPMU1_RANGE(1000000, 0, 19, 0),
-       STPMU1_RANGE(1100000, 20, 23, 0),
-       STPMU1_RANGE(1200000, 24, 27, 0),
-       STPMU1_RANGE(1300000, 28, 31, 0),
-       STPMU1_RANGE(1400000, 32, 35, 0),
-       STPMU1_RANGE(1500000, 36, 55, 100000),
-       STPMU1_RANGE(3400000, 56, 63, 0),
-};
-
-static const struct stpmu1_range buck4_ranges[] = {
-       STPMU1_RANGE(600000, 0, 27, 25000),
-       STPMU1_RANGE(1300000, 28, 29, 0),
-       STPMU1_RANGE(1350000, 30, 31, 0),
-       STPMU1_RANGE(1400000, 32, 33, 0),
-       STPMU1_RANGE(1450000, 34, 35, 0),
-       STPMU1_RANGE(1500000, 36, 60, 100000),
-       STPMU1_RANGE(3900000, 61, 63, 0),
-};
-
-/* BUCK: 1,2,3,4 - voltage ranges */
-static const struct stpmu1_output_range buck_voltage_range[] = {
-       STPMU1_OUTPUT_RANGE(buck1_ranges, ARRAY_SIZE(buck1_ranges)),
-       STPMU1_OUTPUT_RANGE(buck2_ranges, ARRAY_SIZE(buck2_ranges)),
-       STPMU1_OUTPUT_RANGE(buck3_ranges, ARRAY_SIZE(buck3_ranges)),
-       STPMU1_OUTPUT_RANGE(buck4_ranges, ARRAY_SIZE(buck4_ranges)),
-};
-
-/* BUCK modes */
-static const struct dm_regulator_mode buck_modes[] = {
-       STPMU1_MODE(STPMU1_BUCK_MODE_HP, STPMU1_BUCK_MODE_HP, "HP"),
-       STPMU1_MODE(STPMU1_BUCK_MODE_LP, STPMU1_BUCK_MODE_LP, "LP"),
-};
-
-static int stpmu1_buck_get_uv(struct udevice *dev, int buck)
-{
-       int sel;
-
-       sel = pmic_reg_read(dev, STPMU1_BUCKX_CTRL_REG(buck));
-       if (sel < 0)
-               return sel;
-
-       sel &= STPMU1_BUCK_OUTPUT_MASK;
-       sel >>= STPMU1_BUCK_OUTPUT_SHIFT;
-
-       return stpmu1_output_find_uv(sel, &buck_voltage_range[buck]);
-}
-
-static int stpmu1_buck_get_value(struct udevice *dev)
-{
-       return stpmu1_buck_get_uv(dev->parent, dev->driver_data - 1);
-}
-
-static int stpmu1_buck_set_value(struct udevice *dev, int uv)
-{
-       int sel, buck = dev->driver_data - 1;
-
-       sel = stpmu1_output_find_sel(uv, &buck_voltage_range[buck]);
-       if (sel < 0)
-               return sel;
-
-       return pmic_clrsetbits(dev->parent,
-                              STPMU1_BUCKX_CTRL_REG(buck),
-                              STPMU1_BUCK_OUTPUT_MASK,
-                              sel << STPMU1_BUCK_OUTPUT_SHIFT);
-}
-
-static int stpmu1_buck_get_enable(struct udevice *dev)
-{
-       int ret;
-
-       ret = pmic_reg_read(dev->parent,
-                           STPMU1_BUCKX_CTRL_REG(dev->driver_data - 1));
-       if (ret < 0)
-               return false;
-
-       return ret & STPMU1_BUCK_EN ? true : false;
-}
-
-static int stpmu1_buck_set_enable(struct udevice *dev, bool enable)
-{
-       struct dm_regulator_uclass_platdata *uc_pdata;
-       int delay = enable ? STPMU1_DEFAULT_START_UP_DELAY_MS :
-                            STPMU1_DEFAULT_STOP_DELAY_MS;
-       int ret, uv;
-
-       /* if regulator is already in the wanted state, nothing to do */
-       if (stpmu1_buck_get_enable(dev) == enable)
-               return 0;
-
-       if (enable) {
-               uc_pdata = dev_get_uclass_platdata(dev);
-               uv = stpmu1_buck_get_value(dev);
-               if ((uv < uc_pdata->min_uV) || (uv > uc_pdata->max_uV))
-                       stpmu1_buck_set_value(dev, uc_pdata->min_uV);
-       }
-
-       ret = pmic_clrsetbits(dev->parent,
-                             STPMU1_BUCKX_CTRL_REG(dev->driver_data - 1),
-                             STPMU1_BUCK_EN, enable ? STPMU1_BUCK_EN : 0);
-       mdelay(delay);
-
-       return ret;
-}
-
-static int stpmu1_buck_get_mode(struct udevice *dev)
-{
-       int ret;
-
-       ret = pmic_reg_read(dev->parent,
-                           STPMU1_BUCKX_CTRL_REG(dev->driver_data - 1));
-       if (ret < 0)
-               return ret;
-
-       return ret & STPMU1_BUCK_MODE ? STPMU1_BUCK_MODE_LP :
-                                        STPMU1_BUCK_MODE_HP;
-}
-
-static int stpmu1_buck_set_mode(struct udevice *dev, int mode)
-{
-       return pmic_clrsetbits(dev->parent,
-                              STPMU1_BUCKX_CTRL_REG(dev->driver_data - 1),
-                              STPMU1_BUCK_MODE,
-                              mode ? STPMU1_BUCK_MODE : 0);
-}
-
-static int stpmu1_buck_probe(struct udevice *dev)
-{
-       struct dm_regulator_uclass_platdata *uc_pdata;
-
-       if (!dev->driver_data || dev->driver_data > STPMU1_MAX_BUCK)
-               return -EINVAL;
-
-       uc_pdata = dev_get_uclass_platdata(dev);
-
-       uc_pdata->type = REGULATOR_TYPE_BUCK;
-       uc_pdata->mode = (struct dm_regulator_mode *)buck_modes;
-       uc_pdata->mode_count = ARRAY_SIZE(buck_modes);
-
-       return 0;
-}
-
-static const struct dm_regulator_ops stpmu1_buck_ops = {
-       .get_value  = stpmu1_buck_get_value,
-       .set_value  = stpmu1_buck_set_value,
-       .get_enable = stpmu1_buck_get_enable,
-       .set_enable = stpmu1_buck_set_enable,
-       .get_mode   = stpmu1_buck_get_mode,
-       .set_mode   = stpmu1_buck_set_mode,
-};
-
-U_BOOT_DRIVER(stpmu1_buck) = {
-       .name = "stpmu1_buck",
-       .id = UCLASS_REGULATOR,
-       .ops = &stpmu1_buck_ops,
-       .probe = stpmu1_buck_probe,
-};
-
-/*
- * LDO regulators
- */
-
-static const struct stpmu1_range ldo12_ranges[] = {
-       STPMU1_RANGE(1700000, 0, 7, 0),
-       STPMU1_RANGE(1700000, 8, 24, 100000),
-       STPMU1_RANGE(3300000, 25, 31, 0),
-};
-
-static const struct stpmu1_range ldo3_ranges[] = {
-       STPMU1_RANGE(1700000, 0, 7, 0),
-       STPMU1_RANGE(1700000, 8, 24, 100000),
-       STPMU1_RANGE(3300000, 25, 30, 0),
-       /* Sel 31 is special case when LDO3 is in mode sync_source (BUCK2/2) */
-};
-
-static const struct stpmu1_range ldo5_ranges[] = {
-       STPMU1_RANGE(1700000, 0, 7, 0),
-       STPMU1_RANGE(1700000, 8, 30, 100000),
-       STPMU1_RANGE(3900000, 31, 31, 0),
-};
-
-static const struct stpmu1_range ldo6_ranges[] = {
-       STPMU1_RANGE(900000, 0, 24, 100000),
-       STPMU1_RANGE(3300000, 25, 31, 0),
-};
-
-/* LDO: 1,2,3,4,5,6 - voltage ranges */
-static const struct stpmu1_output_range ldo_voltage_range[] = {
-       STPMU1_OUTPUT_RANGE(ldo12_ranges, ARRAY_SIZE(ldo12_ranges)),
-       STPMU1_OUTPUT_RANGE(ldo12_ranges, ARRAY_SIZE(ldo12_ranges)),
-       STPMU1_OUTPUT_RANGE(ldo3_ranges, ARRAY_SIZE(ldo3_ranges)),
-       STPMU1_OUTPUT_RANGE(NULL, 0),
-       STPMU1_OUTPUT_RANGE(ldo5_ranges, ARRAY_SIZE(ldo5_ranges)),
-       STPMU1_OUTPUT_RANGE(ldo6_ranges, ARRAY_SIZE(ldo6_ranges)),
-};
-
-/* LDO modes */
-static const struct dm_regulator_mode ldo_modes[] = {
-       STPMU1_MODE(STPMU1_LDO_MODE_NORMAL,
-                   STPMU1_LDO_MODE_NORMAL, "NORMAL"),
-       STPMU1_MODE(STPMU1_LDO_MODE_BYPASS,
-                   STPMU1_LDO_MODE_BYPASS, "BYPASS"),
-       STPMU1_MODE(STPMU1_LDO_MODE_SINK_SOURCE,
-                   STPMU1_LDO_MODE_SINK_SOURCE, "SINK SOURCE"),
-};
-
-static int stpmu1_ldo_get_value(struct udevice *dev)
-{
-       int sel, ldo = dev->driver_data - 1;
-
-       sel = pmic_reg_read(dev->parent, STPMU1_LDOX_CTRL_REG(ldo));
-       if (sel < 0)
-               return sel;
-
-       /* ldo4 => 3,3V */
-       if (ldo == STPMU1_LDO4)
-               return STPMU1_LDO4_UV;
-
-       sel &= STPMU1_LDO12356_OUTPUT_MASK;
-       sel >>= STPMU1_LDO12356_OUTPUT_SHIFT;
-
-       /* ldo3, sel = 31 => BUCK2/2 */
-       if (ldo == STPMU1_LDO3 && sel == STPMU1_LDO3_DDR_SEL)
-               return stpmu1_buck_get_uv(dev->parent, STPMU1_BUCK2) / 2;
-
-       return stpmu1_output_find_uv(sel, &ldo_voltage_range[ldo]);
-}
-
-static int stpmu1_ldo_set_value(struct udevice *dev, int uv)
-{
-       int sel, ldo = dev->driver_data - 1;
-
-       /* ldo4 => not possible */
-       if (ldo == STPMU1_LDO4)
-               return -EINVAL;
-
-       sel = stpmu1_output_find_sel(uv, &ldo_voltage_range[ldo]);
-       if (sel < 0)
-               return sel;
-
-       return pmic_clrsetbits(dev->parent,
-                              STPMU1_LDOX_CTRL_REG(ldo),
-                              STPMU1_LDO12356_OUTPUT_MASK,
-                              sel << STPMU1_LDO12356_OUTPUT_SHIFT);
-}
-
-static int stpmu1_ldo_get_enable(struct udevice *dev)
-{
-       int ret;
-
-       ret = pmic_reg_read(dev->parent,
-                           STPMU1_LDOX_CTRL_REG(dev->driver_data - 1));
-       if (ret < 0)
-               return false;
-
-       return ret & STPMU1_LDO_EN ? true : false;
-}
-
-static int stpmu1_ldo_set_enable(struct udevice *dev, bool enable)
-{
-       struct dm_regulator_uclass_platdata *uc_pdata;
-       int delay = enable ? STPMU1_DEFAULT_START_UP_DELAY_MS :
-                            STPMU1_DEFAULT_STOP_DELAY_MS;
-       int ret, uv;
-
-       /* if regulator is already in the wanted state, nothing to do */
-       if (stpmu1_ldo_get_enable(dev) == enable)
-               return 0;
-
-       if (enable) {
-               uc_pdata = dev_get_uclass_platdata(dev);
-               uv = stpmu1_ldo_get_value(dev);
-               if ((uv < uc_pdata->min_uV) || (uv > uc_pdata->max_uV))
-                       stpmu1_ldo_set_value(dev, uc_pdata->min_uV);
-       }
-
-       ret = pmic_clrsetbits(dev->parent,
-                             STPMU1_LDOX_CTRL_REG(dev->driver_data - 1),
-                             STPMU1_LDO_EN, enable ? STPMU1_LDO_EN : 0);
-       mdelay(delay);
-
-       return ret;
-}
-
-static int stpmu1_ldo_get_mode(struct udevice *dev)
-{
-       int ret, ldo = dev->driver_data - 1;
-
-       if (ldo != STPMU1_LDO3)
-               return -EINVAL;
-
-       ret = pmic_reg_read(dev->parent, STPMU1_LDOX_CTRL_REG(ldo));
-       if (ret < 0)
-               return ret;
-
-       if (ret & STPMU1_LDO3_MODE)
-               return STPMU1_LDO_MODE_BYPASS;
-
-       ret &= STPMU1_LDO12356_OUTPUT_MASK;
-       ret >>= STPMU1_LDO12356_OUTPUT_SHIFT;
-
-       return ret == STPMU1_LDO3_DDR_SEL ? STPMU1_LDO_MODE_SINK_SOURCE :
-                                            STPMU1_LDO_MODE_NORMAL;
-}
-
-static int stpmu1_ldo_set_mode(struct udevice *dev, int mode)
-{
-       int ret, ldo = dev->driver_data - 1;
-
-       if (ldo != STPMU1_LDO3)
-               return -EINVAL;
-
-       ret = pmic_reg_read(dev->parent, STPMU1_LDOX_CTRL_REG(ldo));
-       if (ret < 0)
-               return ret;
-
-       switch (mode) {
-       case STPMU1_LDO_MODE_SINK_SOURCE:
-               ret &= ~STPMU1_LDO12356_OUTPUT_MASK;
-               ret |= STPMU1_LDO3_DDR_SEL << STPMU1_LDO12356_OUTPUT_SHIFT;
-       case STPMU1_LDO_MODE_NORMAL:
-               ret &= ~STPMU1_LDO3_MODE;
-               break;
-       case STPMU1_LDO_MODE_BYPASS:
-               ret |= STPMU1_LDO3_MODE;
-               break;
-       }
-
-       return pmic_reg_write(dev->parent, STPMU1_LDOX_CTRL_REG(ldo), ret);
-}
-
-static int stpmu1_ldo_probe(struct udevice *dev)
-{
-       struct dm_regulator_uclass_platdata *uc_pdata;
-
-       if (!dev->driver_data || dev->driver_data > STPMU1_MAX_LDO)
-               return -EINVAL;
-
-       uc_pdata = dev_get_uclass_platdata(dev);
-
-       uc_pdata->type = REGULATOR_TYPE_LDO;
-       if (dev->driver_data - 1 == STPMU1_LDO3) {
-               uc_pdata->mode = (struct dm_regulator_mode *)ldo_modes;
-               uc_pdata->mode_count = ARRAY_SIZE(ldo_modes);
-       } else {
-               uc_pdata->mode_count = 0;
-       }
-
-       return 0;
-}
-
-static const struct dm_regulator_ops stpmu1_ldo_ops = {
-       .get_value  = stpmu1_ldo_get_value,
-       .set_value  = stpmu1_ldo_set_value,
-       .get_enable = stpmu1_ldo_get_enable,
-       .set_enable = stpmu1_ldo_set_enable,
-       .get_mode   = stpmu1_ldo_get_mode,
-       .set_mode   = stpmu1_ldo_set_mode,
-};
-
-U_BOOT_DRIVER(stpmu1_ldo) = {
-       .name = "stpmu1_ldo",
-       .id = UCLASS_REGULATOR,
-       .ops = &stpmu1_ldo_ops,
-       .probe = stpmu1_ldo_probe,
-};
-
-/*
- * VREF DDR regulator
- */
-
-static int stpmu1_vref_ddr_get_value(struct udevice *dev)
-{
-       /* BUCK2/2 */
-       return stpmu1_buck_get_uv(dev->parent, STPMU1_BUCK2) / 2;
-}
-
-static int stpmu1_vref_ddr_get_enable(struct udevice *dev)
-{
-       int ret;
-
-       ret = pmic_reg_read(dev->parent, STPMU1_VREF_CTRL_REG);
-       if (ret < 0)
-               return false;
-
-       return ret & STPMU1_VREF_EN ? true : false;
-}
-
-static int stpmu1_vref_ddr_set_enable(struct udevice *dev, bool enable)
-{
-       int delay = enable ? STPMU1_DEFAULT_START_UP_DELAY_MS :
-                            STPMU1_DEFAULT_STOP_DELAY_MS;
-       int ret;
-
-       /* if regulator is already in the wanted state, nothing to do */
-       if (stpmu1_vref_ddr_get_enable(dev) == enable)
-               return 0;
-
-       ret = pmic_clrsetbits(dev->parent, STPMU1_VREF_CTRL_REG,
-                             STPMU1_VREF_EN, enable ? STPMU1_VREF_EN : 0);
-       mdelay(delay);
-
-       return ret;
-}
-
-static int stpmu1_vref_ddr_probe(struct udevice *dev)
-{
-       struct dm_regulator_uclass_platdata *uc_pdata;
-
-       uc_pdata = dev_get_uclass_platdata(dev);
-
-       uc_pdata->type = REGULATOR_TYPE_FIXED;
-       uc_pdata->mode_count = 0;
-
-       return 0;
-}
-
-static const struct dm_regulator_ops stpmu1_vref_ddr_ops = {
-       .get_value  = stpmu1_vref_ddr_get_value,
-       .get_enable = stpmu1_vref_ddr_get_enable,
-       .set_enable = stpmu1_vref_ddr_set_enable,
-};
-
-U_BOOT_DRIVER(stpmu1_vref_ddr) = {
-       .name = "stpmu1_vref_ddr",
-       .id = UCLASS_REGULATOR,
-       .ops = &stpmu1_vref_ddr_ops,
-       .probe = stpmu1_vref_ddr_probe,
-};
-
-/*
- * BOOST regulator
- */
-
-static int stpmu1_boost_get_enable(struct udevice *dev)
-{
-       int ret;
-
-       ret = pmic_reg_read(dev->parent, STPMU1_USB_CTRL_REG);
-       if (ret < 0)
-               return false;
-
-       return ret & STPMU1_USB_BOOST_EN ? true : false;
-}
-
-static int stpmu1_boost_set_enable(struct udevice *dev, bool enable)
-{
-       int ret;
-
-       ret = pmic_reg_read(dev->parent, STPMU1_USB_CTRL_REG);
-       if (ret < 0)
-               return ret;
-
-       if (!enable && ret & STPMU1_USB_PWR_SW_EN)
-               return -EINVAL;
-
-       /* if regulator is already in the wanted state, nothing to do */
-       if (!!(ret & STPMU1_USB_BOOST_EN) == enable)
-               return 0;
-
-       ret = pmic_clrsetbits(dev->parent, STPMU1_USB_CTRL_REG,
-                             STPMU1_USB_BOOST_EN,
-                             enable ? STPMU1_USB_BOOST_EN : 0);
-       if (enable)
-               mdelay(STPMU1_USB_BOOST_START_UP_DELAY_MS);
-
-       return ret;
-}
-
-static int stpmu1_boost_probe(struct udevice *dev)
-{
-       struct dm_regulator_uclass_platdata *uc_pdata;
-
-       uc_pdata = dev_get_uclass_platdata(dev);
-
-       uc_pdata->type = REGULATOR_TYPE_FIXED;
-       uc_pdata->mode_count = 0;
-
-       return 0;
-}
-
-static const struct dm_regulator_ops stpmu1_boost_ops = {
-       .get_enable = stpmu1_boost_get_enable,
-       .set_enable = stpmu1_boost_set_enable,
-};
-
-U_BOOT_DRIVER(stpmu1_boost) = {
-       .name = "stpmu1_boost",
-       .id = UCLASS_REGULATOR,
-       .ops = &stpmu1_boost_ops,
-       .probe = stpmu1_boost_probe,
-};
-
-/*
- * USB power switch
- */
-
-static int stpmu1_pwr_sw_get_enable(struct udevice *dev)
-{
-       uint mask = 1 << dev->driver_data;
-       int ret;
-
-       ret = pmic_reg_read(dev->parent, STPMU1_USB_CTRL_REG);
-       if (ret < 0)
-               return false;
-
-       return ret & mask ? true : false;
-}
-
-static int stpmu1_pwr_sw_set_enable(struct udevice *dev, bool enable)
-{
-       uint mask = 1 << dev->driver_data;
-       int delay = enable ? STPMU1_DEFAULT_START_UP_DELAY_MS :
-                            STPMU1_DEFAULT_STOP_DELAY_MS;
-       int ret;
-
-       ret = pmic_reg_read(dev->parent, STPMU1_USB_CTRL_REG);
-       if (ret < 0)
-               return ret;
-
-       /* if regulator is already in the wanted state, nothing to do */
-       if (!!(ret & mask) == enable)
-               return 0;
-
-       /* Boost management */
-       if (enable && !(ret & STPMU1_USB_BOOST_EN)) {
-               pmic_clrsetbits(dev->parent, STPMU1_USB_CTRL_REG,
-                               STPMU1_USB_BOOST_EN, STPMU1_USB_BOOST_EN);
-               mdelay(STPMU1_USB_BOOST_START_UP_DELAY_MS);
-       } else if (!enable && ret & STPMU1_USB_BOOST_EN &&
-                  (ret & STPMU1_USB_PWR_SW_EN) != STPMU1_USB_PWR_SW_EN) {
-               pmic_clrsetbits(dev->parent, STPMU1_USB_CTRL_REG,
-                               STPMU1_USB_BOOST_EN, 0);
-       }
-
-       ret = pmic_clrsetbits(dev->parent, STPMU1_USB_CTRL_REG,
-                             mask, enable ? mask : 0);
-       mdelay(delay);
-
-       return ret;
-}
-
-static int stpmu1_pwr_sw_probe(struct udevice *dev)
-{
-       struct dm_regulator_uclass_platdata *uc_pdata;
-
-       if (!dev->driver_data || dev->driver_data > STPMU1_MAX_PWR_SW)
-               return -EINVAL;
-
-       uc_pdata = dev_get_uclass_platdata(dev);
-
-       uc_pdata->type = REGULATOR_TYPE_FIXED;
-       uc_pdata->mode_count = 0;
-
-       return 0;
-}
-
-static const struct dm_regulator_ops stpmu1_pwr_sw_ops = {
-       .get_enable = stpmu1_pwr_sw_get_enable,
-       .set_enable = stpmu1_pwr_sw_set_enable,
-};
-
-U_BOOT_DRIVER(stpmu1_pwr_sw) = {
-       .name = "stpmu1_pwr_sw",
-       .id = UCLASS_REGULATOR,
-       .ops = &stpmu1_pwr_sw_ops,
-       .probe = stpmu1_pwr_sw_probe,
-};
index bd497a3021d825a85ac493164107a2e1c9486c91..e45a3b2658a31dce190c436fb659b7db278244fb 100644 (file)
@@ -157,7 +157,8 @@ static int stm32mp1_ddr_probe(struct udevice *dev)
 
        priv->info.base = STM32_DDR_BASE;
 
-#if !defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD)
+#if !defined(CONFIG_STM32MP1_TRUSTED) && \
+       (!defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD))
        priv->info.size = 0;
        return stm32mp1_ddr_setup(dev);
 #else
index a81e767696047de0ff47ee6eb9784f13a0592ed8..6ec6f39c85f0d3ba91ff3c8eabf8235792a2e191 100644 (file)
@@ -121,4 +121,10 @@ config RESET_SUNXI
          This enables support for common reset driver for
          Allwinner SoCs.
 
+config RESET_HISILICON
+       bool "Reset controller driver for HiSilicon SoCs"
+       depends on DM_RESET
+       help
+         Support for reset controller on HiSilicon SoCs.
+
 endmenu
index 4fad7d412985efa7945ec1511d71c59bb29b58cf..7fec75bb4923563880963b7631be7ba363f1e4cf 100644 (file)
@@ -19,3 +19,4 @@ obj-$(CONFIG_RESET_MESON) += reset-meson.o
 obj-$(CONFIG_RESET_SOCFPGA) += reset-socfpga.o
 obj-$(CONFIG_RESET_MEDIATEK) += reset-mediatek.o
 obj-$(CONFIG_RESET_SUNXI) += reset-sunxi.o
+obj-$(CONFIG_RESET_HISILICON) += reset-hisilicon.o
diff --git a/drivers/reset/reset-hisilicon.c b/drivers/reset/reset-hisilicon.c
new file mode 100644 (file)
index 0000000..a9f052a
--- /dev/null
@@ -0,0 +1,103 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019, Linaro Limited
+ */
+
+#include <asm/io.h>
+#include <common.h>
+#include <dm.h>
+#include <dt-bindings/reset/ti-syscon.h>
+#include <reset-uclass.h>
+
+struct hisi_reset_priv {
+       void __iomem *base;
+};
+
+static int hisi_reset_deassert(struct reset_ctl *rst)
+{
+       struct hisi_reset_priv *priv = dev_get_priv(rst->dev);
+       u32 val;
+
+       val = readl(priv->base + rst->data);
+       if (rst->polarity & DEASSERT_SET)
+               val |= BIT(rst->id);
+       else
+               val &= ~BIT(rst->id);
+       writel(val, priv->base + rst->data);
+
+       return 0;
+}
+
+static int hisi_reset_assert(struct reset_ctl *rst)
+{
+       struct hisi_reset_priv *priv = dev_get_priv(rst->dev);
+       u32 val;
+
+       val = readl(priv->base + rst->data);
+       if (rst->polarity & ASSERT_SET)
+               val |= BIT(rst->id);
+       else
+               val &= ~BIT(rst->id);
+       writel(val, priv->base + rst->data);
+
+       return 0;
+}
+
+static int hisi_reset_free(struct reset_ctl *rst)
+{
+       return 0;
+}
+
+static int hisi_reset_request(struct reset_ctl *rst)
+{
+       return 0;
+}
+
+static int hisi_reset_of_xlate(struct reset_ctl *rst,
+                              struct ofnode_phandle_args *args)
+{
+       if (args->args_count != 3) {
+               debug("Invalid args_count: %d\n", args->args_count);
+               return -EINVAL;
+       }
+
+       /* Use .data field as register offset and .id field as bit shift */
+       rst->data = args->args[0];
+       rst->id = args->args[1];
+       rst->polarity = args->args[2];
+
+       return 0;
+}
+
+static const struct reset_ops hisi_reset_reset_ops = {
+       .of_xlate = hisi_reset_of_xlate,
+       .request = hisi_reset_request,
+       .free = hisi_reset_free,
+       .rst_assert = hisi_reset_assert,
+       .rst_deassert = hisi_reset_deassert,
+};
+
+static const struct udevice_id hisi_reset_ids[] = {
+       { .compatible = "hisilicon,hi3798cv200-reset" },
+       { }
+};
+
+static int hisi_reset_probe(struct udevice *dev)
+{
+       struct hisi_reset_priv *priv = dev_get_priv(dev);
+
+       priv->base = dev_remap_addr(dev);
+       if (!priv->base)
+               return -ENOMEM;
+
+       return 0;
+}
+
+U_BOOT_DRIVER(hisi_reset) = {
+       .name = "hisilicon_reset",
+       .id = UCLASS_RESET,
+       .of_match = hisi_reset_ids,
+       .ops = &hisi_reset_reset_ops,
+       .probe = hisi_reset_probe,
+       .priv_auto_alloc_size = sizeof(struct hisi_reset_priv),
+};
index b2acfcd2ecba05ee3f28260922bcea824cb4ab80..cb8312619fa076799e38fc5b7596df80687e8e1e 100644 (file)
 #define NR_BANKS               8
 
 struct socfpga_reset_data {
-       void __iomem *membase;
+       void __iomem *modrst_base;
 };
 
+/*
+ * For compatibility with Kernels that don't support peripheral reset, this
+ * driver can keep the old behaviour of not asserting peripheral reset before
+ * starting the OS and deasserting all peripheral resets (enabling all
+ * peripherals).
+ *
+ * For that, the reset driver checks the environment variable
+ * "socfpga_legacy_reset_compat". If this variable is '1', perihperals are not
+ * reset again once taken out of reset and all peripherals in 'permodrst' are
+ * taken out of reset before booting into the OS.
+ * Note that this should be required for gen5 systems only that are running
+ * Linux kernels without proper peripheral reset support for all drivers used.
+ */
+static bool socfpga_reset_keep_enabled(void)
+{
+#if !defined(CONFIG_SPL_BUILD) || CONFIG_IS_ENABLED(ENV_SUPPORT)
+       const char *env_str;
+       long val;
+
+       env_str = env_get("socfpga_legacy_reset_compat");
+       if (env_str) {
+               val = simple_strtol(env_str, NULL, 0);
+               if (val == 1)
+                       return true;
+       }
+#endif
+
+       return false;
+}
+
 static int socfpga_reset_assert(struct reset_ctl *reset_ctl)
 {
        struct socfpga_reset_data *data = dev_get_priv(reset_ctl->dev);
@@ -35,7 +65,7 @@ static int socfpga_reset_assert(struct reset_ctl *reset_ctl)
        int bank = id / (reg_width * BITS_PER_BYTE);
        int offset = id % (reg_width * BITS_PER_BYTE);
 
-       setbits_le32(data->membase + (bank * BANK_INCREMENT), BIT(offset));
+       setbits_le32(data->modrst_base + (bank * BANK_INCREMENT), BIT(offset));
        return 0;
 }
 
@@ -47,7 +77,7 @@ static int socfpga_reset_deassert(struct reset_ctl *reset_ctl)
        int bank = id / (reg_width * BITS_PER_BYTE);
        int offset = id % (reg_width * BITS_PER_BYTE);
 
-       clrbits_le32(data->membase + (bank * BANK_INCREMENT), BIT(offset));
+       clrbits_le32(data->modrst_base + (bank * BANK_INCREMENT), BIT(offset));
        return 0;
 }
 
@@ -80,11 +110,24 @@ static int socfpga_reset_probe(struct udevice *dev)
        const void *blob = gd->fdt_blob;
        int node = dev_of_offset(dev);
        u32 modrst_offset;
+       void __iomem *membase;
 
-       data->membase = devfdt_get_addr_ptr(dev);
+       membase = devfdt_get_addr_ptr(dev);
 
        modrst_offset = fdtdec_get_int(blob, node, "altr,modrst-offset", 0x10);
-       data->membase += modrst_offset;
+       data->modrst_base = membase + modrst_offset;
+
+       return 0;
+}
+
+static int socfpga_reset_remove(struct udevice *dev)
+{
+       struct socfpga_reset_data *data = dev_get_priv(dev);
+
+       if (socfpga_reset_keep_enabled()) {
+               puts("Deasserting all peripheral resets\n");
+               writel(0, data->modrst_base + 4);
+       }
 
        return 0;
 }
@@ -101,4 +144,6 @@ U_BOOT_DRIVER(socfpga_reset) = {
        .probe = socfpga_reset_probe,
        .priv_auto_alloc_size = sizeof(struct socfpga_reset_data),
        .ops = &socfpga_reset_ops,
+       .remove = socfpga_reset_remove,
+       .flags  = DM_FLAG_OS_PREPARE,
 };
diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
new file mode 100644 (file)
index 0000000..7b4e4d6
--- /dev/null
@@ -0,0 +1,5 @@
+menu "SOC (System On Chip) specific Drivers"
+
+source "drivers/soc/ti/Kconfig"
+
+endmenu
index 42037f99d587bbd99f293226e0b6f40d3fca9796..ce253b7aa88612f2425dd0fbe5d8c003693ac365 100644 (file)
@@ -2,4 +2,4 @@
 #
 # Makefile for the U-Boot SOC specific device drivers.
 
-obj-$(CONFIG_ARCH_KEYSTONE)    += keystone/
+obj-$(CONFIG_SOC_TI) += ti/
diff --git a/drivers/soc/keystone/Makefile b/drivers/soc/keystone/Makefile
deleted file mode 100644 (file)
index dfebb14..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0+
-
-obj-$(CONFIG_TI_KEYSTONE_SERDES) += keystone_serdes.o
diff --git a/drivers/soc/ti/Kconfig b/drivers/soc/ti/Kconfig
new file mode 100644 (file)
index 0000000..e4f8834
--- /dev/null
@@ -0,0 +1,26 @@
+# SPDX-License-Identifier: GPL-2.0+
+
+menuconfig SOC_TI
+       bool "TI SOC drivers support"
+
+if SOC_TI
+
+config TI_K3_NAVSS_RINGACC
+       bool "K3 Ring accelerator Sub System"
+       depends on ARCH_K3
+       select MISC
+       help
+         Say y here to support the K3 AM65x Ring accelerator module.
+         The Ring Accelerator (RINGACC or RA)  provides hardware acceleration
+         to enable straightforward passing of work between a producer
+         and a consumer. There is one RINGACC module per NAVSS on TI AM65x SoCs
+         If unsure, say N.
+
+config TI_KEYSTONE_SERDES
+       bool "Keystone SerDes driver for ethernet"
+       depends on ARCH_KEYSTONE
+       help
+        SerDes driver for Keystone SoC used for ethernet support on TI
+        K2 platforms.
+
+endif # SOC_TI
diff --git a/drivers/soc/ti/Makefile b/drivers/soc/ti/Makefile
new file mode 100644 (file)
index 0000000..4ec04ee
--- /dev/null
@@ -0,0 +1,4 @@
+# SPDX-License-Identifier: GPL-2.0+
+
+obj-$(CONFIG_TI_K3_NAVSS_RINGACC)      += k3-navss-ringacc.o
+obj-$(CONFIG_TI_KEYSTONE_SERDES)       += keystone_serdes.o
diff --git a/drivers/soc/ti/k3-navss-ringacc.c b/drivers/soc/ti/k3-navss-ringacc.c
new file mode 100644 (file)
index 0000000..fcb84f7
--- /dev/null
@@ -0,0 +1,1057 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * TI K3 AM65x NAVSS Ring accelerator Manager (RA) subsystem driver
+ *
+ * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <malloc.h>
+#include <asm/dma-mapping.h>
+#include <asm/bitops.h>
+#include <dm.h>
+#include <dm/read.h>
+#include <dm/uclass.h>
+#include <linux/compat.h>
+#include <linux/soc/ti/k3-navss-ringacc.h>
+#include <linux/soc/ti/ti_sci_protocol.h>
+
+#define set_bit(bit, bitmap)   __set_bit(bit, bitmap)
+#define clear_bit(bit, bitmap) __clear_bit(bit, bitmap)
+#define dma_free_coherent(dev, size, cpu_addr, dma_handle) \
+       dma_free_coherent(cpu_addr)
+#define dma_zalloc_coherent(dev, size, dma_handle, flag) \
+({ \
+       void    *ring_mem_virt; \
+       ring_mem_virt = dma_alloc_coherent((size), \
+                                          (unsigned long *)(dma_handle)); \
+       if (ring_mem_virt) \
+               memset(ring_mem_virt, 0, (size)); \
+       ring_mem_virt; \
+})
+
+static LIST_HEAD(k3_nav_ringacc_list);
+
+static void ringacc_writel(u32 v, void __iomem *reg)
+{
+       pr_debug("WRITEL(32): v(%08X)-->reg(%p)\n", v, reg);
+       writel(v, reg);
+}
+
+static u32 ringacc_readl(void __iomem *reg)
+{
+       u32 v;
+
+       v = readl(reg);
+       pr_debug("READL(32): v(%08X)<--reg(%p)\n", v, reg);
+       return v;
+}
+
+#define KNAV_RINGACC_CFG_RING_SIZE_ELCNT_MASK          GENMASK(19, 0)
+
+/**
+ * struct k3_nav_ring_rt_regs -  The RA Control/Status Registers region
+ */
+struct k3_nav_ring_rt_regs {
+       u32     resv_16[4];
+       u32     db;             /* RT Ring N Doorbell Register */
+       u32     resv_4[1];
+       u32     occ;            /* RT Ring N Occupancy Register */
+       u32     indx;           /* RT Ring N Current Index Register */
+       u32     hwocc;          /* RT Ring N Hardware Occupancy Register */
+       u32     hwindx;         /* RT Ring N Current Index Register */
+};
+
+#define KNAV_RINGACC_RT_REGS_STEP      0x1000
+
+/**
+ * struct k3_nav_ring_fifo_regs -  The Ring Accelerator Queues Registers region
+ */
+struct k3_nav_ring_fifo_regs {
+       u32     head_data[128];         /* Ring Head Entry Data Registers */
+       u32     tail_data[128];         /* Ring Tail Entry Data Registers */
+       u32     peek_head_data[128];    /* Ring Peek Head Entry Data Regs */
+       u32     peek_tail_data[128];    /* Ring Peek Tail Entry Data Regs */
+};
+
+/**
+ * struct k3_ringacc_proxy_gcfg_regs - RA Proxy Global Config MMIO Region
+ */
+struct k3_ringacc_proxy_gcfg_regs {
+       u32     revision;       /* Revision Register */
+       u32     config;         /* Config Register */
+};
+
+#define K3_RINGACC_PROXY_CFG_THREADS_MASK              GENMASK(15, 0)
+
+/**
+ * struct k3_ringacc_proxy_target_regs -  RA Proxy Datapath MMIO Region
+ */
+struct k3_ringacc_proxy_target_regs {
+       u32     control;        /* Proxy Control Register */
+       u32     status;         /* Proxy Status Register */
+       u8      resv_512[504];
+       u32     data[128];      /* Proxy Data Register */
+};
+
+#define K3_RINGACC_PROXY_TARGET_STEP   0x1000
+#define K3_RINGACC_PROXY_NOT_USED      (-1)
+
+enum k3_ringacc_proxy_access_mode {
+       PROXY_ACCESS_MODE_HEAD = 0,
+       PROXY_ACCESS_MODE_TAIL = 1,
+       PROXY_ACCESS_MODE_PEEK_HEAD = 2,
+       PROXY_ACCESS_MODE_PEEK_TAIL = 3,
+};
+
+#define KNAV_RINGACC_FIFO_WINDOW_SIZE_BYTES  (512U)
+#define KNAV_RINGACC_FIFO_REGS_STEP    0x1000
+#define KNAV_RINGACC_MAX_DB_RING_CNT    (127U)
+
+/**
+ * struct k3_nav_ring_ops -  Ring operations
+ */
+struct k3_nav_ring_ops {
+       int (*push_tail)(struct k3_nav_ring *ring, void *elm);
+       int (*push_head)(struct k3_nav_ring *ring, void *elm);
+       int (*pop_tail)(struct k3_nav_ring *ring, void *elm);
+       int (*pop_head)(struct k3_nav_ring *ring, void *elm);
+};
+
+/**
+ * struct k3_nav_ring - RA Ring descriptor
+ *
+ * @rt - Ring control/status registers
+ * @fifos - Ring queues registers
+ * @proxy - Ring Proxy Datapath registers
+ * @ring_mem_dma - Ring buffer dma address
+ * @ring_mem_virt - Ring buffer virt address
+ * @ops - Ring operations
+ * @size - Ring size in elements
+ * @elm_size - Size of the ring element
+ * @mode - Ring mode
+ * @flags - flags
+ * @free - Number of free elements
+ * @occ - Ring occupancy
+ * @windex - Write index (only for @K3_NAV_RINGACC_RING_MODE_RING)
+ * @rindex - Read index (only for @K3_NAV_RINGACC_RING_MODE_RING)
+ * @ring_id - Ring Id
+ * @parent - Pointer on struct @k3_nav_ringacc
+ * @use_count - Use count for shared rings
+ * @proxy_id - RA Ring Proxy Id (only if @K3_NAV_RINGACC_RING_USE_PROXY)
+ */
+struct k3_nav_ring {
+       struct k3_nav_ring_rt_regs __iomem *rt;
+       struct k3_nav_ring_fifo_regs __iomem *fifos;
+       struct k3_ringacc_proxy_target_regs  __iomem *proxy;
+       dma_addr_t      ring_mem_dma;
+       void            *ring_mem_virt;
+       struct k3_nav_ring_ops *ops;
+       u32             size;
+       enum k3_nav_ring_size elm_size;
+       enum k3_nav_ring_mode mode;
+       u32             flags;
+#define KNAV_RING_FLAG_BUSY    BIT(1)
+#define K3_NAV_RING_FLAG_SHARED        BIT(2)
+       u32             free;
+       u32             occ;
+       u32             windex;
+       u32             rindex;
+       u32             ring_id;
+       struct k3_nav_ringacc   *parent;
+       u32             use_count;
+       int             proxy_id;
+};
+
+/**
+ * struct k3_nav_ringacc - Rings accelerator descriptor
+ *
+ * @dev - pointer on RA device
+ * @proxy_gcfg - RA proxy global config registers
+ * @proxy_target_base - RA proxy datapath region
+ * @num_rings - number of ring in RA
+ * @rm_gp_range - general purpose rings range from tisci
+ * @dma_ring_reset_quirk - DMA reset w/a enable
+ * @num_proxies - number of RA proxies
+ * @rings - array of rings descriptors (struct @k3_nav_ring)
+ * @list - list of RAs in the system
+ * @tisci - pointer ti-sci handle
+ * @tisci_ring_ops - ti-sci rings ops
+ * @tisci_dev_id - ti-sci device id
+ */
+struct k3_nav_ringacc {
+       struct udevice *dev;
+       struct k3_ringacc_proxy_gcfg_regs __iomem *proxy_gcfg;
+       void __iomem *proxy_target_base;
+       u32 num_rings; /* number of rings in Ringacc module */
+       unsigned long *rings_inuse;
+       struct ti_sci_resource *rm_gp_range;
+       bool dma_ring_reset_quirk;
+       u32 num_proxies;
+       unsigned long *proxy_inuse;
+
+       struct k3_nav_ring *rings;
+       struct list_head list;
+
+       const struct ti_sci_handle *tisci;
+       const struct ti_sci_rm_ringacc_ops *tisci_ring_ops;
+       u32  tisci_dev_id;
+};
+
+static long k3_nav_ringacc_ring_get_fifo_pos(struct k3_nav_ring *ring)
+{
+       return KNAV_RINGACC_FIFO_WINDOW_SIZE_BYTES -
+              (4 << ring->elm_size);
+}
+
+static void *k3_nav_ringacc_get_elm_addr(struct k3_nav_ring *ring, u32 idx)
+{
+       return (idx * (4 << ring->elm_size) + ring->ring_mem_virt);
+}
+
+static int k3_nav_ringacc_ring_push_mem(struct k3_nav_ring *ring, void *elem);
+static int k3_nav_ringacc_ring_pop_mem(struct k3_nav_ring *ring, void *elem);
+
+static struct k3_nav_ring_ops k3_nav_mode_ring_ops = {
+               .push_tail = k3_nav_ringacc_ring_push_mem,
+               .pop_head = k3_nav_ringacc_ring_pop_mem,
+};
+
+static int k3_nav_ringacc_ring_push_io(struct k3_nav_ring *ring, void *elem);
+static int k3_nav_ringacc_ring_pop_io(struct k3_nav_ring *ring, void *elem);
+static int k3_nav_ringacc_ring_push_head_io(struct k3_nav_ring *ring,
+                                           void *elem);
+static int k3_nav_ringacc_ring_pop_tail_io(struct k3_nav_ring *ring,
+                                          void *elem);
+
+static struct k3_nav_ring_ops k3_nav_mode_msg_ops = {
+               .push_tail = k3_nav_ringacc_ring_push_io,
+               .push_head = k3_nav_ringacc_ring_push_head_io,
+               .pop_tail = k3_nav_ringacc_ring_pop_tail_io,
+               .pop_head = k3_nav_ringacc_ring_pop_io,
+};
+
+static int k3_ringacc_ring_push_head_proxy(struct k3_nav_ring *ring,
+                                          void *elem);
+static int k3_ringacc_ring_push_tail_proxy(struct k3_nav_ring *ring,
+                                          void *elem);
+static int k3_ringacc_ring_pop_head_proxy(struct k3_nav_ring *ring, void *elem);
+static int k3_ringacc_ring_pop_tail_proxy(struct k3_nav_ring *ring, void *elem);
+
+static struct k3_nav_ring_ops k3_nav_mode_proxy_ops = {
+               .push_tail = k3_ringacc_ring_push_tail_proxy,
+               .push_head = k3_ringacc_ring_push_head_proxy,
+               .pop_tail = k3_ringacc_ring_pop_tail_proxy,
+               .pop_head = k3_ringacc_ring_pop_head_proxy,
+};
+
+struct udevice *k3_nav_ringacc_get_dev(struct k3_nav_ringacc *ringacc)
+{
+       return ringacc->dev;
+}
+
+struct k3_nav_ring *k3_nav_ringacc_request_ring(struct k3_nav_ringacc *ringacc,
+                                               int id, u32 flags)
+{
+       int proxy_id = K3_RINGACC_PROXY_NOT_USED;
+
+       if (id == K3_NAV_RINGACC_RING_ID_ANY) {
+               /* Request for any general purpose ring */
+               struct ti_sci_resource_desc *gp_rings =
+                                       &ringacc->rm_gp_range->desc[0];
+               unsigned long size;
+
+               size = gp_rings->start + gp_rings->num;
+               id = find_next_zero_bit(ringacc->rings_inuse,
+                                       size, gp_rings->start);
+               if (id == size)
+                       goto error;
+       } else if (id < 0) {
+               goto error;
+       }
+
+       if (test_bit(id, ringacc->rings_inuse) &&
+           !(ringacc->rings[id].flags & K3_NAV_RING_FLAG_SHARED))
+               goto error;
+       else if (ringacc->rings[id].flags & K3_NAV_RING_FLAG_SHARED)
+               goto out;
+
+       if (flags & K3_NAV_RINGACC_RING_USE_PROXY) {
+               proxy_id = find_next_zero_bit(ringacc->proxy_inuse,
+                                             ringacc->num_proxies, 0);
+               if (proxy_id == ringacc->num_proxies)
+                       goto error;
+       }
+
+       if (!try_module_get(ringacc->dev->driver->owner))
+               goto error;
+
+       if (proxy_id != K3_RINGACC_PROXY_NOT_USED) {
+               set_bit(proxy_id, ringacc->proxy_inuse);
+               ringacc->rings[id].proxy_id = proxy_id;
+               pr_debug("Giving ring#%d proxy#%d\n",
+                        id, proxy_id);
+       } else {
+               pr_debug("Giving ring#%d\n", id);
+       }
+
+       set_bit(id, ringacc->rings_inuse);
+out:
+       ringacc->rings[id].use_count++;
+       return &ringacc->rings[id];
+
+error:
+       return NULL;
+}
+
+static void k3_ringacc_ring_reset_sci(struct k3_nav_ring *ring)
+{
+       struct k3_nav_ringacc *ringacc = ring->parent;
+       int ret;
+
+       ret = ringacc->tisci_ring_ops->config(
+                       ringacc->tisci,
+                       TI_SCI_MSG_VALUE_RM_RING_COUNT_VALID,
+                       ringacc->tisci_dev_id,
+                       ring->ring_id,
+                       0,
+                       0,
+                       ring->size,
+                       0,
+                       0,
+                       0);
+       if (ret)
+               dev_err(ringacc->dev, "TISCI reset ring fail (%d) ring_idx %d\n",
+                       ret, ring->ring_id);
+}
+
+void k3_nav_ringacc_ring_reset(struct k3_nav_ring *ring)
+{
+       if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
+               return;
+
+       ring->occ = 0;
+       ring->free = 0;
+       ring->rindex = 0;
+       ring->windex = 0;
+
+       k3_ringacc_ring_reset_sci(ring);
+}
+
+static void k3_ringacc_ring_reconfig_qmode_sci(struct k3_nav_ring *ring,
+                                              enum k3_nav_ring_mode mode)
+{
+       struct k3_nav_ringacc *ringacc = ring->parent;
+       int ret;
+
+       ret = ringacc->tisci_ring_ops->config(
+                       ringacc->tisci,
+                       TI_SCI_MSG_VALUE_RM_RING_MODE_VALID,
+                       ringacc->tisci_dev_id,
+                       ring->ring_id,
+                       0,
+                       0,
+                       0,
+                       mode,
+                       0,
+                       0);
+       if (ret)
+               dev_err(ringacc->dev, "TISCI reconf qmode fail (%d) ring_idx %d\n",
+                       ret, ring->ring_id);
+}
+
+void k3_nav_ringacc_ring_reset_dma(struct k3_nav_ring *ring, u32 occ)
+{
+       if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
+               return;
+
+       if (!ring->parent->dma_ring_reset_quirk)
+               return;
+
+       if (!occ)
+               occ = ringacc_readl(&ring->rt->occ);
+
+       if (occ) {
+               u32 db_ring_cnt, db_ring_cnt_cur;
+
+               pr_debug("%s %u occ: %u\n", __func__,
+                        ring->ring_id, occ);
+               /* 2. Reset the ring */
+               k3_ringacc_ring_reset_sci(ring);
+
+               /*
+                * 3. Setup the ring in ring/doorbell mode
+                * (if not already in this mode)
+                */
+               if (ring->mode != K3_NAV_RINGACC_RING_MODE_RING)
+                       k3_ringacc_ring_reconfig_qmode_sci(
+                                       ring, K3_NAV_RINGACC_RING_MODE_RING);
+               /*
+                * 4. Ring the doorbell 2**22 â€“ ringOcc times.
+                * This will wrap the internal UDMAP ring state occupancy
+                * counter (which is 21-bits wide) to 0.
+                */
+               db_ring_cnt = (1U << 22) - occ;
+
+               while (db_ring_cnt != 0) {
+                       /*
+                        * Ring the doorbell with the maximum count each
+                        * iteration if possible to minimize the total
+                        * of writes
+                        */
+                       if (db_ring_cnt > KNAV_RINGACC_MAX_DB_RING_CNT)
+                               db_ring_cnt_cur = KNAV_RINGACC_MAX_DB_RING_CNT;
+                       else
+                               db_ring_cnt_cur = db_ring_cnt;
+
+                       writel(db_ring_cnt_cur, &ring->rt->db);
+                       db_ring_cnt -= db_ring_cnt_cur;
+               }
+
+               /* 5. Restore the original ring mode (if not ring mode) */
+               if (ring->mode != K3_NAV_RINGACC_RING_MODE_RING)
+                       k3_ringacc_ring_reconfig_qmode_sci(ring, ring->mode);
+       }
+
+       /* 2. Reset the ring */
+       k3_nav_ringacc_ring_reset(ring);
+}
+
+static void k3_ringacc_ring_free_sci(struct k3_nav_ring *ring)
+{
+       struct k3_nav_ringacc *ringacc = ring->parent;
+       int ret;
+
+       ret = ringacc->tisci_ring_ops->config(
+                       ringacc->tisci,
+                       TI_SCI_MSG_VALUE_RM_ALL_NO_ORDER,
+                       ringacc->tisci_dev_id,
+                       ring->ring_id,
+                       0,
+                       0,
+                       0,
+                       0,
+                       0,
+                       0);
+       if (ret)
+               dev_err(ringacc->dev, "TISCI ring free fail (%d) ring_idx %d\n",
+                       ret, ring->ring_id);
+}
+
+int k3_nav_ringacc_ring_free(struct k3_nav_ring *ring)
+{
+       struct k3_nav_ringacc *ringacc;
+
+       if (!ring)
+               return -EINVAL;
+
+       ringacc = ring->parent;
+
+       pr_debug("%s flags: 0x%08x\n", __func__, ring->flags);
+
+       if (!test_bit(ring->ring_id, ringacc->rings_inuse))
+               return -EINVAL;
+
+       if (--ring->use_count)
+               goto out;
+
+       if (!(ring->flags & KNAV_RING_FLAG_BUSY))
+               goto no_init;
+
+       k3_ringacc_ring_free_sci(ring);
+
+       dma_free_coherent(ringacc->dev,
+                         ring->size * (4 << ring->elm_size),
+                         ring->ring_mem_virt, ring->ring_mem_dma);
+       ring->flags &= ~KNAV_RING_FLAG_BUSY;
+       ring->ops = NULL;
+       if (ring->proxy_id != K3_RINGACC_PROXY_NOT_USED) {
+               clear_bit(ring->proxy_id, ringacc->proxy_inuse);
+               ring->proxy = NULL;
+               ring->proxy_id = K3_RINGACC_PROXY_NOT_USED;
+       }
+
+no_init:
+       clear_bit(ring->ring_id, ringacc->rings_inuse);
+
+       module_put(ringacc->dev->driver->owner);
+
+out:
+       return 0;
+}
+
+u32 k3_nav_ringacc_get_ring_id(struct k3_nav_ring *ring)
+{
+       if (!ring)
+               return -EINVAL;
+
+       return ring->ring_id;
+}
+
+static int k3_nav_ringacc_ring_cfg_sci(struct k3_nav_ring *ring)
+{
+       struct k3_nav_ringacc *ringacc = ring->parent;
+       u32 ring_idx;
+       int ret;
+
+       if (!ringacc->tisci)
+               return -EINVAL;
+
+       ring_idx = ring->ring_id;
+       ret = ringacc->tisci_ring_ops->config(
+                       ringacc->tisci,
+                       TI_SCI_MSG_VALUE_RM_ALL_NO_ORDER,
+                       ringacc->tisci_dev_id,
+                       ring_idx,
+                       lower_32_bits(ring->ring_mem_dma),
+                       upper_32_bits(ring->ring_mem_dma),
+                       ring->size,
+                       ring->mode,
+                       ring->elm_size,
+                       0);
+       if (ret)
+               dev_err(ringacc->dev, "TISCI config ring fail (%d) ring_idx %d\n",
+                       ret, ring_idx);
+
+       return ret;
+}
+
+int k3_nav_ringacc_ring_cfg(struct k3_nav_ring *ring,
+                           struct k3_nav_ring_cfg *cfg)
+{
+       struct k3_nav_ringacc *ringacc = ring->parent;
+       int ret = 0;
+
+       if (!ring || !cfg)
+               return -EINVAL;
+       if (cfg->elm_size > K3_NAV_RINGACC_RING_ELSIZE_256 ||
+           cfg->mode > K3_NAV_RINGACC_RING_MODE_QM ||
+           cfg->size & ~KNAV_RINGACC_CFG_RING_SIZE_ELCNT_MASK ||
+           !test_bit(ring->ring_id, ringacc->rings_inuse))
+               return -EINVAL;
+
+       if (ring->use_count != 1)
+               return 0;
+
+       ring->size = cfg->size;
+       ring->elm_size = cfg->elm_size;
+       ring->mode = cfg->mode;
+       ring->occ = 0;
+       ring->free = 0;
+       ring->rindex = 0;
+       ring->windex = 0;
+
+       if (ring->proxy_id != K3_RINGACC_PROXY_NOT_USED)
+               ring->proxy = ringacc->proxy_target_base +
+                             ring->proxy_id * K3_RINGACC_PROXY_TARGET_STEP;
+
+       switch (ring->mode) {
+       case K3_NAV_RINGACC_RING_MODE_RING:
+               ring->ops = &k3_nav_mode_ring_ops;
+               break;
+       case K3_NAV_RINGACC_RING_MODE_QM:
+               /*
+                * In Queue mode elm_size can be 8 only and each operation
+                * uses 2 element slots
+                */
+               if (cfg->elm_size != K3_NAV_RINGACC_RING_ELSIZE_8 ||
+                   cfg->size % 2)
+                       goto err_free_proxy;
+       case K3_NAV_RINGACC_RING_MODE_MESSAGE:
+               if (ring->proxy)
+                       ring->ops = &k3_nav_mode_proxy_ops;
+               else
+                       ring->ops = &k3_nav_mode_msg_ops;
+               break;
+       default:
+               ring->ops = NULL;
+               ret = -EINVAL;
+               goto err_free_proxy;
+       };
+
+       ring->ring_mem_virt =
+                       dma_zalloc_coherent(ringacc->dev,
+                                           ring->size * (4 << ring->elm_size),
+                                           &ring->ring_mem_dma, GFP_KERNEL);
+       if (!ring->ring_mem_virt) {
+               dev_err(ringacc->dev, "Failed to alloc ring mem\n");
+               ret = -ENOMEM;
+               goto err_free_ops;
+       }
+
+       ret = k3_nav_ringacc_ring_cfg_sci(ring);
+
+       if (ret)
+               goto err_free_mem;
+
+       ring->flags |= KNAV_RING_FLAG_BUSY;
+       ring->flags |= (cfg->flags & K3_NAV_RINGACC_RING_SHARED) ?
+                       K3_NAV_RING_FLAG_SHARED : 0;
+
+       return 0;
+
+err_free_mem:
+       dma_free_coherent(ringacc->dev,
+                         ring->size * (4 << ring->elm_size),
+                         ring->ring_mem_virt,
+                         ring->ring_mem_dma);
+err_free_ops:
+       ring->ops = NULL;
+err_free_proxy:
+       ring->proxy = NULL;
+       return ret;
+}
+
+u32 k3_nav_ringacc_ring_get_size(struct k3_nav_ring *ring)
+{
+       if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
+               return -EINVAL;
+
+       return ring->size;
+}
+
+u32 k3_nav_ringacc_ring_get_free(struct k3_nav_ring *ring)
+{
+       if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
+               return -EINVAL;
+
+       if (!ring->free)
+               ring->free = ring->size - ringacc_readl(&ring->rt->occ);
+
+       return ring->free;
+}
+
+u32 k3_nav_ringacc_ring_get_occ(struct k3_nav_ring *ring)
+{
+       if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
+               return -EINVAL;
+
+       return ringacc_readl(&ring->rt->occ);
+}
+
+u32 k3_nav_ringacc_ring_is_full(struct k3_nav_ring *ring)
+{
+       return !k3_nav_ringacc_ring_get_free(ring);
+}
+
+enum k3_ringacc_access_mode {
+       K3_RINGACC_ACCESS_MODE_PUSH_HEAD,
+       K3_RINGACC_ACCESS_MODE_POP_HEAD,
+       K3_RINGACC_ACCESS_MODE_PUSH_TAIL,
+       K3_RINGACC_ACCESS_MODE_POP_TAIL,
+       K3_RINGACC_ACCESS_MODE_PEEK_HEAD,
+       K3_RINGACC_ACCESS_MODE_PEEK_TAIL,
+};
+
+static int k3_ringacc_ring_cfg_proxy(struct k3_nav_ring *ring,
+                                    enum k3_ringacc_proxy_access_mode mode)
+{
+       u32 val;
+
+       val = ring->ring_id;
+       val |= mode << 16;
+       val |= ring->elm_size << 24;
+       ringacc_writel(val, &ring->proxy->control);
+       return 0;
+}
+
+static int k3_nav_ringacc_ring_access_proxy(
+                       struct k3_nav_ring *ring, void *elem,
+                       enum k3_ringacc_access_mode access_mode)
+{
+       void __iomem *ptr;
+
+       ptr = (void __iomem *)&ring->proxy->data;
+
+       switch (access_mode) {
+       case K3_RINGACC_ACCESS_MODE_PUSH_HEAD:
+       case K3_RINGACC_ACCESS_MODE_POP_HEAD:
+               k3_ringacc_ring_cfg_proxy(ring, PROXY_ACCESS_MODE_HEAD);
+               break;
+       case K3_RINGACC_ACCESS_MODE_PUSH_TAIL:
+       case K3_RINGACC_ACCESS_MODE_POP_TAIL:
+               k3_ringacc_ring_cfg_proxy(ring, PROXY_ACCESS_MODE_TAIL);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       ptr += k3_nav_ringacc_ring_get_fifo_pos(ring);
+
+       switch (access_mode) {
+       case K3_RINGACC_ACCESS_MODE_POP_HEAD:
+       case K3_RINGACC_ACCESS_MODE_POP_TAIL:
+               pr_debug("proxy:memcpy_fromio(x): --> ptr(%p), mode:%d\n",
+                        ptr, access_mode);
+               memcpy_fromio(elem, ptr, (4 << ring->elm_size));
+               ring->occ--;
+               break;
+       case K3_RINGACC_ACCESS_MODE_PUSH_TAIL:
+       case K3_RINGACC_ACCESS_MODE_PUSH_HEAD:
+               pr_debug("proxy:memcpy_toio(x): --> ptr(%p), mode:%d\n",
+                        ptr, access_mode);
+               memcpy_toio(ptr, elem, (4 << ring->elm_size));
+               ring->free--;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       pr_debug("proxy: free%d occ%d\n",
+                ring->free, ring->occ);
+       return 0;
+}
+
+static int k3_ringacc_ring_push_head_proxy(struct k3_nav_ring *ring, void *elem)
+{
+       return k3_nav_ringacc_ring_access_proxy(
+                       ring, elem, K3_RINGACC_ACCESS_MODE_PUSH_HEAD);
+}
+
+static int k3_ringacc_ring_push_tail_proxy(struct k3_nav_ring *ring, void *elem)
+{
+       return k3_nav_ringacc_ring_access_proxy(
+                       ring, elem, K3_RINGACC_ACCESS_MODE_PUSH_TAIL);
+}
+
+static int k3_ringacc_ring_pop_head_proxy(struct k3_nav_ring *ring, void *elem)
+{
+       return k3_nav_ringacc_ring_access_proxy(
+                       ring, elem, K3_RINGACC_ACCESS_MODE_POP_HEAD);
+}
+
+static int k3_ringacc_ring_pop_tail_proxy(struct k3_nav_ring *ring, void *elem)
+{
+       return k3_nav_ringacc_ring_access_proxy(
+                       ring, elem, K3_RINGACC_ACCESS_MODE_POP_HEAD);
+}
+
+static int k3_nav_ringacc_ring_access_io(
+               struct k3_nav_ring *ring, void *elem,
+               enum k3_ringacc_access_mode access_mode)
+{
+       void __iomem *ptr;
+
+       switch (access_mode) {
+       case K3_RINGACC_ACCESS_MODE_PUSH_HEAD:
+       case K3_RINGACC_ACCESS_MODE_POP_HEAD:
+               ptr = (void __iomem *)&ring->fifos->head_data;
+               break;
+       case K3_RINGACC_ACCESS_MODE_PUSH_TAIL:
+       case K3_RINGACC_ACCESS_MODE_POP_TAIL:
+               ptr = (void __iomem *)&ring->fifos->tail_data;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       ptr += k3_nav_ringacc_ring_get_fifo_pos(ring);
+
+       switch (access_mode) {
+       case K3_RINGACC_ACCESS_MODE_POP_HEAD:
+       case K3_RINGACC_ACCESS_MODE_POP_TAIL:
+               pr_debug("memcpy_fromio(x): --> ptr(%p), mode:%d\n",
+                        ptr, access_mode);
+               memcpy_fromio(elem, ptr, (4 << ring->elm_size));
+               ring->occ--;
+               break;
+       case K3_RINGACC_ACCESS_MODE_PUSH_TAIL:
+       case K3_RINGACC_ACCESS_MODE_PUSH_HEAD:
+               pr_debug("memcpy_toio(x): --> ptr(%p), mode:%d\n",
+                        ptr, access_mode);
+               memcpy_toio(ptr, elem, (4 << ring->elm_size));
+               ring->free--;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       pr_debug("free%d index%d occ%d index%d\n",
+                ring->free, ring->windex, ring->occ, ring->rindex);
+       return 0;
+}
+
+static int k3_nav_ringacc_ring_push_head_io(struct k3_nav_ring *ring,
+                                           void *elem)
+{
+       return k3_nav_ringacc_ring_access_io(
+                       ring, elem, K3_RINGACC_ACCESS_MODE_PUSH_HEAD);
+}
+
+static int k3_nav_ringacc_ring_push_io(struct k3_nav_ring *ring, void *elem)
+{
+       return k3_nav_ringacc_ring_access_io(
+                       ring, elem, K3_RINGACC_ACCESS_MODE_PUSH_TAIL);
+}
+
+static int k3_nav_ringacc_ring_pop_io(struct k3_nav_ring *ring, void *elem)
+{
+       return k3_nav_ringacc_ring_access_io(
+                       ring, elem, K3_RINGACC_ACCESS_MODE_POP_HEAD);
+}
+
+static int k3_nav_ringacc_ring_pop_tail_io(struct k3_nav_ring *ring, void *elem)
+{
+       return k3_nav_ringacc_ring_access_io(
+                       ring, elem, K3_RINGACC_ACCESS_MODE_POP_HEAD);
+}
+
+static int k3_nav_ringacc_ring_push_mem(struct k3_nav_ring *ring, void *elem)
+{
+       void *elem_ptr;
+
+       elem_ptr = k3_nav_ringacc_get_elm_addr(ring, ring->windex);
+
+       memcpy(elem_ptr, elem, (4 << ring->elm_size));
+
+       ring->windex = (ring->windex + 1) % ring->size;
+       ring->free--;
+       ringacc_writel(1, &ring->rt->db);
+
+       pr_debug("ring_push_mem: free%d index%d\n",
+                ring->free, ring->windex);
+
+       return 0;
+}
+
+static int k3_nav_ringacc_ring_pop_mem(struct k3_nav_ring *ring, void *elem)
+{
+       void *elem_ptr;
+
+       elem_ptr = k3_nav_ringacc_get_elm_addr(ring, ring->rindex);
+
+       memcpy(elem, elem_ptr, (4 << ring->elm_size));
+
+       ring->rindex = (ring->rindex + 1) % ring->size;
+       ring->occ--;
+       ringacc_writel(-1, &ring->rt->db);
+
+       pr_debug("ring_pop_mem: occ%d index%d pos_ptr%p\n",
+                ring->occ, ring->rindex, elem_ptr);
+       return 0;
+}
+
+int k3_nav_ringacc_ring_push(struct k3_nav_ring *ring, void *elem)
+{
+       int ret = -EOPNOTSUPP;
+
+       if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
+               return -EINVAL;
+
+       pr_debug("ring_push%d: free%d index%d\n",
+                ring->ring_id, ring->free, ring->windex);
+
+       if (k3_nav_ringacc_ring_is_full(ring))
+               return -ENOMEM;
+
+       if (ring->ops && ring->ops->push_tail)
+               ret = ring->ops->push_tail(ring, elem);
+
+       return ret;
+}
+
+int k3_nav_ringacc_ring_push_head(struct k3_nav_ring *ring, void *elem)
+{
+       int ret = -EOPNOTSUPP;
+
+       if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
+               return -EINVAL;
+
+       pr_debug("ring_push_head: free%d index%d\n",
+                ring->free, ring->windex);
+
+       if (k3_nav_ringacc_ring_is_full(ring))
+               return -ENOMEM;
+
+       if (ring->ops && ring->ops->push_head)
+               ret = ring->ops->push_head(ring, elem);
+
+       return ret;
+}
+
+int k3_nav_ringacc_ring_pop(struct k3_nav_ring *ring, void *elem)
+{
+       int ret = -EOPNOTSUPP;
+
+       if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
+               return -EINVAL;
+
+       if (!ring->occ)
+               ring->occ = k3_nav_ringacc_ring_get_occ(ring);
+
+       pr_debug("ring_pop%d: occ%d index%d\n",
+                ring->ring_id, ring->occ, ring->rindex);
+
+       if (!ring->occ)
+               return -ENODATA;
+
+       if (ring->ops && ring->ops->pop_head)
+               ret = ring->ops->pop_head(ring, elem);
+
+       return ret;
+}
+
+int k3_nav_ringacc_ring_pop_tail(struct k3_nav_ring *ring, void *elem)
+{
+       int ret = -EOPNOTSUPP;
+
+       if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
+               return -EINVAL;
+
+       if (!ring->occ)
+               ring->occ = k3_nav_ringacc_ring_get_occ(ring);
+
+       pr_debug("ring_pop_tail: occ%d index%d\n",
+                ring->occ, ring->rindex);
+
+       if (!ring->occ)
+               return -ENODATA;
+
+       if (ring->ops && ring->ops->pop_tail)
+               ret = ring->ops->pop_tail(ring, elem);
+
+       return ret;
+}
+
+static int k3_nav_ringacc_probe_dt(struct k3_nav_ringacc *ringacc)
+{
+       struct udevice *dev = ringacc->dev;
+       struct udevice *tisci_dev = NULL;
+       int ret;
+
+       ringacc->num_rings = dev_read_u32_default(dev, "ti,num-rings", 0);
+       if (!ringacc->num_rings) {
+               dev_err(dev, "ti,num-rings read failure %d\n", ret);
+               return -EINVAL;
+       }
+
+       ringacc->dma_ring_reset_quirk =
+                       dev_read_bool(dev, "ti,dma-ring-reset-quirk");
+
+       ret = uclass_get_device_by_name(UCLASS_FIRMWARE, "dmsc", &tisci_dev);
+       if (ret) {
+               pr_debug("TISCI RA RM get failed (%d)\n", ret);
+               ringacc->tisci = NULL;
+               return -ENODEV;
+       }
+       ringacc->tisci = (struct ti_sci_handle *)
+                        (ti_sci_get_handle_from_sysfw(tisci_dev));
+
+       ret = dev_read_u32_default(dev, "ti,sci", 0);
+       if (!ret) {
+               dev_err(dev, "TISCI RA RM disabled\n");
+               ringacc->tisci = NULL;
+               return ret;
+       }
+
+       ret = dev_read_u32(dev, "ti,sci-dev-id", &ringacc->tisci_dev_id);
+       if (ret) {
+               dev_err(dev, "ti,sci-dev-id read failure %d\n", ret);
+               ringacc->tisci = NULL;
+               return ret;
+       }
+
+       ringacc->rm_gp_range = devm_ti_sci_get_of_resource(
+                                       ringacc->tisci, dev,
+                                       ringacc->tisci_dev_id,
+                                       "ti,sci-rm-range-gp-rings");
+       if (IS_ERR(ringacc->rm_gp_range))
+               ret = PTR_ERR(ringacc->rm_gp_range);
+
+       return 0;
+}
+
+static int k3_nav_ringacc_probe(struct udevice *dev)
+{
+       struct k3_nav_ringacc *ringacc;
+       void __iomem *base_fifo, *base_rt;
+       int ret, i;
+
+       ringacc = dev_get_priv(dev);
+       if (!ringacc)
+               return -ENOMEM;
+
+       ringacc->dev = dev;
+
+       ret = k3_nav_ringacc_probe_dt(ringacc);
+       if (ret)
+               return ret;
+
+       base_rt = (uint32_t *)devfdt_get_addr_name(dev, "rt");
+       pr_debug("rt %p\n", base_rt);
+       if (IS_ERR(base_rt))
+               return PTR_ERR(base_rt);
+
+       base_fifo = (uint32_t *)devfdt_get_addr_name(dev, "fifos");
+       pr_debug("fifos %p\n", base_fifo);
+       if (IS_ERR(base_fifo))
+               return PTR_ERR(base_fifo);
+
+       ringacc->proxy_gcfg = (struct k3_ringacc_proxy_gcfg_regs __iomem *)
+               devfdt_get_addr_name(dev, "proxy_gcfg");
+       if (IS_ERR(ringacc->proxy_gcfg))
+               return PTR_ERR(ringacc->proxy_gcfg);
+       ringacc->proxy_target_base =
+               (struct k3_ringacc_proxy_gcfg_regs __iomem *)
+               devfdt_get_addr_name(dev, "proxy_target");
+       if (IS_ERR(ringacc->proxy_target_base))
+               return PTR_ERR(ringacc->proxy_target_base);
+
+       ringacc->num_proxies = ringacc_readl(&ringacc->proxy_gcfg->config) &
+                                        K3_RINGACC_PROXY_CFG_THREADS_MASK;
+
+       ringacc->rings = devm_kzalloc(dev,
+                                     sizeof(*ringacc->rings) *
+                                     ringacc->num_rings,
+                                     GFP_KERNEL);
+       ringacc->rings_inuse = devm_kcalloc(dev,
+                                           BITS_TO_LONGS(ringacc->num_rings),
+                                           sizeof(unsigned long), GFP_KERNEL);
+       ringacc->proxy_inuse = devm_kcalloc(dev,
+                                           BITS_TO_LONGS(ringacc->num_proxies),
+                                           sizeof(unsigned long), GFP_KERNEL);
+
+       if (!ringacc->rings || !ringacc->rings_inuse || !ringacc->proxy_inuse)
+               return -ENOMEM;
+
+       for (i = 0; i < ringacc->num_rings; i++) {
+               ringacc->rings[i].rt = base_rt +
+                                      KNAV_RINGACC_RT_REGS_STEP * i;
+               ringacc->rings[i].fifos = base_fifo +
+                                         KNAV_RINGACC_FIFO_REGS_STEP * i;
+               ringacc->rings[i].parent = ringacc;
+               ringacc->rings[i].ring_id = i;
+               ringacc->rings[i].proxy_id = K3_RINGACC_PROXY_NOT_USED;
+       }
+       dev_set_drvdata(dev, ringacc);
+
+       ringacc->tisci_ring_ops = &ringacc->tisci->ops.rm_ring_ops;
+
+       list_add_tail(&ringacc->list, &k3_nav_ringacc_list);
+
+       dev_info(dev, "Ring Accelerator probed rings:%u, gp-rings[%u,%u] sci-dev-id:%u\n",
+                ringacc->num_rings,
+                ringacc->rm_gp_range->desc[0].start,
+                ringacc->rm_gp_range->desc[0].num,
+                ringacc->tisci_dev_id);
+       dev_info(dev, "dma-ring-reset-quirk: %s\n",
+                ringacc->dma_ring_reset_quirk ? "enabled" : "disabled");
+       dev_info(dev, "RA Proxy rev. %08x, num_proxies:%u\n",
+                ringacc_readl(&ringacc->proxy_gcfg->revision),
+                ringacc->num_proxies);
+       return 0;
+}
+
+static const struct udevice_id knav_ringacc_ids[] = {
+       { .compatible = "ti,am654-navss-ringacc" },
+       {},
+};
+
+U_BOOT_DRIVER(k3_navss_ringacc) = {
+       .name   = "k3-navss-ringacc",
+       .id     = UCLASS_MISC,
+       .of_match = knav_ringacc_ids,
+       .probe = k3_nav_ringacc_probe,
+       .priv_auto_alloc_size = sizeof(struct k3_nav_ringacc),
+};
index 098372e0932408779194a10addb1553d2abe6545..fb794adae725d8e1736dedd2ed5c35d31a39b610 100644 (file)
@@ -222,8 +222,7 @@ config SPI_SUNXI
 
 config STM32_QSPI
        bool "STM32F7 QSPI driver"
-       depends on STM32F7
-       imply SPI_FLASH_BAR
+       depends on STM32F7 || ARCH_STM32MP
        help
          Enable the STM32F7 Quad-SPI (QSPI) driver. This driver can be
          used to access the SPI NOR flash chips on platforms embedding
@@ -260,6 +259,13 @@ config TEGRA210_QSPI
          be used to access SPI chips on platforms embedding this
          NVIDIA Tegra210 IP core.
 
+config TI_QSPI
+       bool "TI QSPI driver"
+       imply TI_EDMA3
+       help
+         Enable the TI Quad-SPI (QSPI) driver for DRA7xx and AM43xx evms.
+         This driver support spi flash single, quad and memory reads.
+
 config XILINX_SPI
        bool "Xilinx SPI driver"
        help
@@ -347,12 +353,6 @@ config SH_QSPI
          Enable the Renesas Quad SPI controller driver. This driver can be
          used on Renesas SoCs.
 
-config TI_QSPI
-       bool "TI QSPI driver"
-       help
-         Enable the TI Quad-SPI (QSPI) driver for DRA7xx and AM43xx evms.
-         This driver support spi flash single, quad and memory reads.
-
 config KIRKWOOD_SPI
        bool "Marvell Kirkwood SPI Driver"
        help
index 01907bef795007f3d26070e95b91a5178aca4f88..8be9a4baa2446fc28cd393785f7f767806bf0ace 100644 (file)
@@ -9,6 +9,7 @@ obj-y += spi-uclass.o
 obj-$(CONFIG_SANDBOX) += spi-emul-uclass.o
 obj-$(CONFIG_SOFT_SPI) += soft_spi.o
 obj-$(CONFIG_SPI_MEM) += spi-mem.o
+obj-$(CONFIG_TI_QSPI) += ti_qspi.o
 else
 obj-y += spi.o
 obj-$(CONFIG_SPI_MEM) += spi-mem-nodm.o
@@ -56,7 +57,6 @@ obj-$(CONFIG_TEGRA114_SPI) += tegra114_spi.o
 obj-$(CONFIG_TEGRA20_SFLASH) += tegra20_sflash.o
 obj-$(CONFIG_TEGRA20_SLINK) += tegra20_slink.o
 obj-$(CONFIG_TEGRA210_QSPI) += tegra210_qspi.o
-obj-$(CONFIG_TI_QSPI) += ti_qspi.o
 obj-$(CONFIG_XILINX_SPI) += xilinx_spi.o
 obj-$(CONFIG_ZYNQ_SPI) += zynq_spi.o
 obj-$(CONFIG_ZYNQ_QSPI) += zynq_qspi.o
index 11fce9c4fe5c73d22b68b884195a6dbe3b1f016a..41c87004d8cb8050e4907b11b0c37e9949bafda1 100644 (file)
@@ -8,6 +8,7 @@
 #include <dm.h>
 #include <fdtdec.h>
 #include <malloc.h>
+#include <reset.h>
 #include <spi.h>
 #include <linux/errno.h>
 #include "cadence_qspi.h"
@@ -154,10 +155,17 @@ static int cadence_spi_probe(struct udevice *bus)
 {
        struct cadence_spi_platdata *plat = bus->platdata;
        struct cadence_spi_priv *priv = dev_get_priv(bus);
+       int ret;
 
        priv->regbase = plat->regbase;
        priv->ahbbase = plat->ahbbase;
 
+       ret = reset_get_bulk(bus, &priv->resets);
+       if (ret)
+               dev_warn(bus, "Can't get reset: %d\n", ret);
+       else
+               reset_deassert_bulk(&priv->resets);
+
        if (!priv->qspi_is_init) {
                cadence_qspi_apb_controller_init(plat);
                priv->qspi_is_init = 1;
@@ -166,6 +174,13 @@ static int cadence_spi_probe(struct udevice *bus)
        return 0;
 }
 
+static int cadence_spi_remove(struct udevice *dev)
+{
+       struct cadence_spi_priv *priv = dev_get_priv(dev);
+
+       return reset_release_bulk(&priv->resets);
+}
+
 static int cadence_spi_set_mode(struct udevice *bus, uint mode)
 {
        struct cadence_spi_priv *priv = dev_get_priv(bus);
@@ -256,7 +271,7 @@ static int cadence_spi_xfer(struct udevice *dev, unsigned int bitlen,
                break;
                case CQSPI_INDIRECT_WRITE:
                        err = cadence_qspi_apb_indirect_write_setup
-                               (plat, priv->cmd_len, cmd_buf);
+                               (plat, priv->cmd_len, dm_plat->mode, cmd_buf);
                        if (!err) {
                                err = cadence_qspi_apb_indirect_write_execute
                                (plat, data_bytes, dout);
@@ -342,4 +357,6 @@ U_BOOT_DRIVER(cadence_spi) = {
        .platdata_auto_alloc_size = sizeof(struct cadence_spi_platdata),
        .priv_auto_alloc_size = sizeof(struct cadence_spi_priv),
        .probe = cadence_spi_probe,
+       .remove = cadence_spi_remove,
+       .flags = DM_FLAG_OS_PREPARE,
 };
index 055900def001ffe2e6a1d76cfdbb5534b31fc5c3..20cceca239f8e59a95bac5620dda781c6d6003c9 100644 (file)
@@ -7,6 +7,8 @@
 #ifndef __CADENCE_QSPI_H__
 #define __CADENCE_QSPI_H__
 
+#include <reset.h>
+
 #define CQSPI_IS_ADDR(cmd_len)         (cmd_len > 1 ? 1 : 0)
 
 #define CQSPI_NO_DECODER_MAX_CS                4
@@ -42,6 +44,8 @@ struct cadence_spi_priv {
        unsigned int    qspi_calibrated_hz;
        unsigned int    qspi_calibrated_cs;
        unsigned int    previous_hz;
+
+       struct reset_ctl_bulk resets;
 };
 
 /* Functions call declaration */
@@ -60,7 +64,7 @@ int cadence_qspi_apb_indirect_read_setup(struct cadence_spi_platdata *plat,
 int cadence_qspi_apb_indirect_read_execute(struct cadence_spi_platdata *plat,
        unsigned int rxlen, u8 *rxbuf);
 int cadence_qspi_apb_indirect_write_setup(struct cadence_spi_platdata *plat,
-       unsigned int cmdlen, const u8 *cmdbuf);
+       unsigned int cmdlen, unsigned int tx_width, const u8 *cmdbuf);
 int cadence_qspi_apb_indirect_write_execute(struct cadence_spi_platdata *plat,
        unsigned int txlen, const u8 *txbuf);
 
index a8af3520303537e734405f23f633019e70a7fc0e..55a7501913a8e4e22bc98001051477f611d161a6 100644 (file)
@@ -77,6 +77,7 @@
 
 #define        CQSPI_REG_WR_INSTR                      0x08
 #define        CQSPI_REG_WR_INSTR_OPCODE_LSB           0
+#define        CQSPI_REG_WR_INSTR_TYPE_DATA_LSB        16
 
 #define        CQSPI_REG_DELAY                         0x0C
 #define        CQSPI_REG_DELAY_TSLCH_LSB               0
@@ -686,7 +687,7 @@ failrd:
 
 /* Opcode + Address (3/4 bytes) */
 int cadence_qspi_apb_indirect_write_setup(struct cadence_spi_platdata *plat,
-       unsigned int cmdlen, const u8 *cmdbuf)
+       unsigned int cmdlen, unsigned int tx_width, const u8 *cmdbuf)
 {
        unsigned int reg;
        unsigned int addr_bytes = cmdlen > 4 ? 4 : 3;
@@ -702,6 +703,10 @@ int cadence_qspi_apb_indirect_write_setup(struct cadence_spi_platdata *plat,
 
        /* Configure the opcode */
        reg = cmdbuf[0] << CQSPI_REG_WR_INSTR_OPCODE_LSB;
+
+       if (tx_width & SPI_TX_QUAD)
+               reg |= CQSPI_INST_TYPE_QUAD << CQSPI_REG_WR_INSTR_TYPE_DATA_LSB;
+
        writel(reg, plat->regbase + CQSPI_REG_WR_INSTR);
 
        /* Setup write address. */
index 764c94215e7cebc8766f44974807e5081fe5ea79..a68a51945e4e474ae0e131032cbdc85fd765a160 100644 (file)
@@ -273,7 +273,18 @@ static int dspi_xfer(struct fsl_dspi_priv *priv, uint cs, unsigned int bitlen,
        if (len > 1) {
                int tmp_len = len - 1;
                while (tmp_len--) {
-                       if (dout != NULL) {
+                       if ((dout != NULL) && (din != NULL)) {
+                               if (priv->charbit == 16) {
+                                       dspi_tx(priv, ctrl, *spi_wr16++);
+                                       *spi_rd16++ = dspi_rx(priv);
+                               }
+                               else {
+                                       dspi_tx(priv, ctrl, *spi_wr++);
+                                       *spi_rd++ = dspi_rx(priv);
+                               }
+                       }
+
+                       else if (dout != NULL) {
                                if (priv->charbit == 16)
                                        dspi_tx(priv, ctrl, *spi_wr16++);
                                else
@@ -281,7 +292,7 @@ static int dspi_xfer(struct fsl_dspi_priv *priv, uint cs, unsigned int bitlen,
                                dspi_rx(priv);
                        }
 
-                       if (din != NULL) {
+                       else if (din != NULL) {
                                dspi_tx(priv, ctrl, DSPI_IDLE_VAL);
                                if (priv->charbit == 16)
                                        *spi_rd16++ = dspi_rx(priv);
@@ -297,7 +308,18 @@ static int dspi_xfer(struct fsl_dspi_priv *priv, uint cs, unsigned int bitlen,
                ctrl &= ~DSPI_TFR_CONT;
 
        if (len) {
-               if (dout != NULL) {
+               if ((dout != NULL) && (din != NULL)) {
+                       if (priv->charbit == 16) {
+                               dspi_tx(priv, ctrl, *spi_wr16++);
+                               *spi_rd16++ = dspi_rx(priv);
+                       }
+                       else {
+                               dspi_tx(priv, ctrl, *spi_wr++);
+                               *spi_rd++ = dspi_rx(priv);
+                       }
+               }
+
+               else if (dout != NULL) {
                        if (priv->charbit == 16)
                                dspi_tx(priv, ctrl, *spi_wr16);
                        else
@@ -305,7 +327,7 @@ static int dspi_xfer(struct fsl_dspi_priv *priv, uint cs, unsigned int bitlen,
                        dspi_rx(priv);
                }
 
-               if (din != NULL) {
+               else if (din != NULL) {
                        dspi_tx(priv, ctrl, DSPI_IDLE_VAL);
                        if (priv->charbit == 16)
                                *spi_rd16 = dspi_rx(priv);
index 1bb0987edb728fb35a37695c756a58586000d9e3..b86eee75bcb9b75f4ec6f9ec69eb2b71dca0f879 100644 (file)
@@ -214,7 +214,7 @@ int spi_mem_exec_op(struct spi_slave *slave, const struct spi_mem_op *op)
        if (ret < 0)
                return ret;
 
-       if (ops->mem_ops) {
+       if (ops->mem_ops && ops->mem_ops->exec_op) {
 #ifndef __UBOOT__
                /*
                 * Flush the message queue before executing our SPI memory
index 2bc289a74ccb57a28e4e27c22689bca85fdb1a4f..88cb2a126227156d18342796d4022f25c3aefbba 100644 (file)
@@ -328,7 +328,9 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int mode,
        }
 
        plat = dev_get_parent_platdata(dev);
-       if (!speed) {
+
+       /* get speed and mode from platdata when available */
+       if (plat->max_hz) {
                speed = plat->max_hz;
                mode = plat->mode;
        }
index 8b60d7c3b2245f79b8f95c868a952956804627cc..bb1067ff4a9fc2cce0d1f6a8191a9780f77c5b8e 100644 (file)
@@ -9,15 +9,11 @@
 
 #include <common.h>
 #include <clk.h>
-#include <dm.h>
-#include <errno.h>
-#include <malloc.h>
 #include <reset.h>
-#include <spi.h>
-#include <spi_flash.h>
-#include <asm/io.h>
-#include <asm/arch/stm32.h>
+#include <spi-mem.h>
+#include <linux/iopoll.h>
 #include <linux/ioport.h>
+#include <linux/sizes.h>
 
 struct stm32_qspi_regs {
        u32 cr;         /* 0x00 */
@@ -45,8 +41,7 @@ struct stm32_qspi_regs {
 #define STM32_QSPI_CR_SSHIFT           BIT(4)
 #define STM32_QSPI_CR_DFM              BIT(6)
 #define STM32_QSPI_CR_FSEL             BIT(7)
-#define STM32_QSPI_CR_FTHRES_MASK      GENMASK(4, 0)
-#define STM32_QSPI_CR_FTHRES_SHIFT     (8)
+#define STM32_QSPI_CR_FTHRES_SHIFT     8
 #define STM32_QSPI_CR_TEIE             BIT(16)
 #define STM32_QSPI_CR_TCIE             BIT(17)
 #define STM32_QSPI_CR_FTIE             BIT(18)
@@ -55,16 +50,16 @@ struct stm32_qspi_regs {
 #define STM32_QSPI_CR_APMS             BIT(22)
 #define STM32_QSPI_CR_PMM              BIT(23)
 #define STM32_QSPI_CR_PRESCALER_MASK   GENMASK(7, 0)
-#define STM32_QSPI_CR_PRESCALER_SHIFT  (24)
+#define STM32_QSPI_CR_PRESCALER_SHIFT  24
 
 /*
  * QUADSPI device configuration register
  */
 #define STM32_QSPI_DCR_CKMODE          BIT(0)
 #define STM32_QSPI_DCR_CSHT_MASK       GENMASK(2, 0)
-#define STM32_QSPI_DCR_CSHT_SHIFT      (8)
+#define STM32_QSPI_DCR_CSHT_SHIFT      8
 #define STM32_QSPI_DCR_FSIZE_MASK      GENMASK(4, 0)
-#define STM32_QSPI_DCR_FSIZE_SHIFT     (16)
+#define STM32_QSPI_DCR_FSIZE_SHIFT     16
 
 /*
  * QUADSPI status register
@@ -75,8 +70,6 @@ struct stm32_qspi_regs {
 #define STM32_QSPI_SR_SMF              BIT(3)
 #define STM32_QSPI_SR_TOF              BIT(4)
 #define STM32_QSPI_SR_BUSY             BIT(5)
-#define STM32_QSPI_SR_FLEVEL_MASK      GENMASK(5, 0)
-#define STM32_QSPI_SR_FLEVEL_SHIFT     (8)
 
 /*
  * QUADSPI flag clear register
@@ -92,388 +85,276 @@ struct stm32_qspi_regs {
 #define STM32_QSPI_CCR_DDRM            BIT(31)
 #define STM32_QSPI_CCR_DHHC            BIT(30)
 #define STM32_QSPI_CCR_SIOO            BIT(28)
-#define STM32_QSPI_CCR_FMODE_SHIFT     (26)
-#define STM32_QSPI_CCR_DMODE_SHIFT     (24)
-#define STM32_QSPI_CCR_DCYC_SHIFT      (18)
-#define STM32_QSPI_CCR_DCYC_MASK       GENMASK(4, 0)
-#define STM32_QSPI_CCR_ABSIZE_SHIFT    (16)
-#define STM32_QSPI_CCR_ABMODE_SHIFT    (14)
-#define STM32_QSPI_CCR_ADSIZE_SHIFT    (12)
-#define STM32_QSPI_CCR_ADMODE_SHIFT    (10)
-#define STM32_QSPI_CCR_IMODE_SHIFT     (8)
-#define STM32_QSPI_CCR_INSTRUCTION_MASK        GENMASK(7, 0)
-
-enum STM32_QSPI_CCR_IMODE {
-       STM32_QSPI_CCR_IMODE_NONE = 0,
-       STM32_QSPI_CCR_IMODE_ONE_LINE = 1,
-       STM32_QSPI_CCR_IMODE_TWO_LINE = 2,
-       STM32_QSPI_CCR_IMODE_FOUR_LINE = 3,
-};
-
-enum STM32_QSPI_CCR_ADMODE {
-       STM32_QSPI_CCR_ADMODE_NONE = 0,
-       STM32_QSPI_CCR_ADMODE_ONE_LINE = 1,
-       STM32_QSPI_CCR_ADMODE_TWO_LINE = 2,
-       STM32_QSPI_CCR_ADMODE_FOUR_LINE = 3,
-};
-
-enum STM32_QSPI_CCR_ADSIZE {
-       STM32_QSPI_CCR_ADSIZE_8BIT = 0,
-       STM32_QSPI_CCR_ADSIZE_16BIT = 1,
-       STM32_QSPI_CCR_ADSIZE_24BIT = 2,
-       STM32_QSPI_CCR_ADSIZE_32BIT = 3,
-};
-
-enum STM32_QSPI_CCR_ABMODE {
-       STM32_QSPI_CCR_ABMODE_NONE = 0,
-       STM32_QSPI_CCR_ABMODE_ONE_LINE = 1,
-       STM32_QSPI_CCR_ABMODE_TWO_LINE = 2,
-       STM32_QSPI_CCR_ABMODE_FOUR_LINE = 3,
-};
-
-enum STM32_QSPI_CCR_ABSIZE {
-       STM32_QSPI_CCR_ABSIZE_8BIT = 0,
-       STM32_QSPI_CCR_ABSIZE_16BIT = 1,
-       STM32_QSPI_CCR_ABSIZE_24BIT = 2,
-       STM32_QSPI_CCR_ABSIZE_32BIT = 3,
-};
-
-enum STM32_QSPI_CCR_DMODE {
-       STM32_QSPI_CCR_DMODE_NONE = 0,
-       STM32_QSPI_CCR_DMODE_ONE_LINE = 1,
-       STM32_QSPI_CCR_DMODE_TWO_LINE = 2,
-       STM32_QSPI_CCR_DMODE_FOUR_LINE = 3,
-};
-
-enum STM32_QSPI_CCR_FMODE {
-       STM32_QSPI_CCR_IND_WRITE = 0,
-       STM32_QSPI_CCR_IND_READ = 1,
-       STM32_QSPI_CCR_AUTO_POLL = 2,
-       STM32_QSPI_CCR_MEM_MAP = 3,
-};
-
-/* default SCK frequency, unit: HZ */
-#define STM32_QSPI_DEFAULT_SCK_FREQ 108000000
-
-#define STM32_MAX_NORCHIP 2
-
-struct stm32_qspi_platdata {
-       u32 base;
-       u32 memory_map;
-       u32 max_hz;
+#define STM32_QSPI_CCR_FMODE_SHIFT     26
+#define STM32_QSPI_CCR_DMODE_SHIFT     24
+#define STM32_QSPI_CCR_DCYC_SHIFT      18
+#define STM32_QSPI_CCR_ABSIZE_SHIFT    16
+#define STM32_QSPI_CCR_ABMODE_SHIFT    14
+#define STM32_QSPI_CCR_ADSIZE_SHIFT    12
+#define STM32_QSPI_CCR_ADMODE_SHIFT    10
+#define STM32_QSPI_CCR_IMODE_SHIFT     8
+
+#define STM32_QSPI_CCR_IND_WRITE       0
+#define STM32_QSPI_CCR_IND_READ                1
+#define STM32_QSPI_CCR_MEM_MAP         3
+
+#define STM32_QSPI_MAX_MMAP_SZ         SZ_256M
+#define STM32_QSPI_MAX_CHIP            2
+
+#define STM32_QSPI_FIFO_TIMEOUT_US     30000
+#define STM32_QSPI_CMD_TIMEOUT_US      1000000
+#define STM32_BUSY_TIMEOUT_US          100000
+#define STM32_ABT_TIMEOUT_US           100000
+
+struct stm32_qspi_flash {
+       u32 cr;
+       u32 dcr;
+       bool initialized;
 };
 
 struct stm32_qspi_priv {
        struct stm32_qspi_regs *regs;
+       struct stm32_qspi_flash flash[STM32_QSPI_MAX_CHIP];
+       void __iomem *mm_base;
+       resource_size_t mm_size;
        ulong clock_rate;
-       u32 max_hz;
-       u32 mode;
-
-       u32 command;
-       u32 address;
-       u32 dummycycles;
-#define CMD_HAS_ADR    BIT(24)
-#define CMD_HAS_DUMMY  BIT(25)
-#define CMD_HAS_DATA   BIT(26)
+       int cs_used;
 };
 
-static void _stm32_qspi_disable(struct stm32_qspi_priv *priv)
+static int _stm32_qspi_wait_for_not_busy(struct stm32_qspi_priv *priv)
 {
-       clrbits_le32(&priv->regs->cr, STM32_QSPI_CR_EN);
-}
+       u32 sr;
+       int ret;
 
-static void _stm32_qspi_enable(struct stm32_qspi_priv *priv)
-{
-       setbits_le32(&priv->regs->cr, STM32_QSPI_CR_EN);
-}
+       ret = readl_poll_timeout(&priv->regs->sr, sr,
+                                !(sr & STM32_QSPI_SR_BUSY),
+                                STM32_BUSY_TIMEOUT_US);
+       if (ret)
+               pr_err("busy timeout (stat:%#x)\n", sr);
 
-static void _stm32_qspi_wait_for_not_busy(struct stm32_qspi_priv *priv)
-{
-       while (readl(&priv->regs->sr) & STM32_QSPI_SR_BUSY)
-               ;
+       return ret;
 }
 
-static void _stm32_qspi_wait_for_complete(struct stm32_qspi_priv *priv)
+static int _stm32_qspi_wait_cmd(struct stm32_qspi_priv *priv,
+                               const struct spi_mem_op *op)
 {
-       while (!(readl(&priv->regs->sr) & STM32_QSPI_SR_TCF))
-               ;
-}
+       u32 sr;
+       int ret;
 
-static void _stm32_qspi_wait_for_ftf(struct stm32_qspi_priv *priv)
-{
-       while (!(readl(&priv->regs->sr) & STM32_QSPI_SR_FTF))
-               ;
-}
+       if (!op->data.nbytes)
+               return _stm32_qspi_wait_for_not_busy(priv);
 
-static void _stm32_qspi_set_flash_size(struct stm32_qspi_priv *priv, u32 size)
-{
-       u32 fsize = fls(size) - 1;
+       ret = readl_poll_timeout(&priv->regs->sr, sr,
+                                sr & STM32_QSPI_SR_TCF,
+                                STM32_QSPI_CMD_TIMEOUT_US);
+       if (ret) {
+               pr_err("cmd timeout (stat:%#x)\n", sr);
+       } else if (readl(&priv->regs->sr) & STM32_QSPI_SR_TEF) {
+               pr_err("transfer error (stat:%#x)\n", sr);
+               ret = -EIO;
+       }
 
-       clrsetbits_le32(&priv->regs->dcr,
-                       STM32_QSPI_DCR_FSIZE_MASK << STM32_QSPI_DCR_FSIZE_SHIFT,
-                       fsize << STM32_QSPI_DCR_FSIZE_SHIFT);
+       /* clear flags */
+       writel(STM32_QSPI_FCR_CTCF | STM32_QSPI_FCR_CTEF, &priv->regs->fcr);
+
+       return ret;
 }
 
-static void _stm32_qspi_set_cs(struct stm32_qspi_priv *priv, unsigned int cs)
+static void _stm32_qspi_read_fifo(u8 *val, void __iomem *addr)
 {
-       clrsetbits_le32(&priv->regs->cr, STM32_QSPI_CR_FSEL,
-                       cs ? STM32_QSPI_CR_FSEL : 0);
+       *val = readb(addr);
 }
 
-static unsigned int _stm32_qspi_gen_ccr(struct stm32_qspi_priv *priv, u8 fmode)
+static void _stm32_qspi_write_fifo(u8 *val, void __iomem *addr)
 {
-       unsigned int ccr_reg = 0;
-       u8 imode, admode, dmode;
-       u32 mode = priv->mode;
-       u32 cmd = (priv->command & STM32_QSPI_CCR_INSTRUCTION_MASK);
-
-       imode = STM32_QSPI_CCR_IMODE_ONE_LINE;
-       admode = STM32_QSPI_CCR_ADMODE_ONE_LINE;
-       dmode = STM32_QSPI_CCR_DMODE_ONE_LINE;
-
-       if ((priv->command & CMD_HAS_ADR) && (priv->command & CMD_HAS_DATA)) {
-               if (fmode == STM32_QSPI_CCR_IND_WRITE) {
-                       if (mode & SPI_TX_QUAD)
-                               dmode = STM32_QSPI_CCR_DMODE_FOUR_LINE;
-                       else if (mode & SPI_TX_DUAL)
-                               dmode = STM32_QSPI_CCR_DMODE_TWO_LINE;
-               } else if ((fmode == STM32_QSPI_CCR_MEM_MAP) ||
-                        (fmode == STM32_QSPI_CCR_IND_READ)) {
-                       if (mode & SPI_RX_QUAD)
-                               dmode = STM32_QSPI_CCR_DMODE_FOUR_LINE;
-                       else if (mode & SPI_RX_DUAL)
-                               dmode = STM32_QSPI_CCR_DMODE_TWO_LINE;
-               }
-       }
-
-       if (priv->command & CMD_HAS_DATA)
-               ccr_reg |= (dmode << STM32_QSPI_CCR_DMODE_SHIFT);
-
-       if (priv->command & CMD_HAS_DUMMY)
-               ccr_reg |= ((priv->dummycycles & STM32_QSPI_CCR_DCYC_MASK)
-                               << STM32_QSPI_CCR_DCYC_SHIFT);
-
-       if (priv->command & CMD_HAS_ADR) {
-               ccr_reg |= (STM32_QSPI_CCR_ADSIZE_24BIT
-                               << STM32_QSPI_CCR_ADSIZE_SHIFT);
-               ccr_reg |= (admode << STM32_QSPI_CCR_ADMODE_SHIFT);
-       }
-
-       ccr_reg |= (fmode << STM32_QSPI_CCR_FMODE_SHIFT);
-       ccr_reg |= (imode << STM32_QSPI_CCR_IMODE_SHIFT);
-       ccr_reg |= cmd;
-
-       return ccr_reg;
+       writeb(*val, addr);
 }
 
-static void _stm32_qspi_enable_mmap(struct stm32_qspi_priv *priv,
-                                   struct spi_flash *flash)
+static int _stm32_qspi_poll(struct stm32_qspi_priv *priv,
+                           const struct spi_mem_op *op)
 {
-       unsigned int ccr_reg;
+       void (*fifo)(u8 *val, void __iomem *addr);
+       u32 len = op->data.nbytes, sr;
+       u8 *buf;
+       int ret;
 
-       priv->command = flash->read_opcode | CMD_HAS_ADR | CMD_HAS_DATA
-                       | CMD_HAS_DUMMY;
-       priv->dummycycles = flash->read_dummy;
+       if (op->data.dir == SPI_MEM_DATA_IN) {
+               fifo = _stm32_qspi_read_fifo;
+               buf = op->data.buf.in;
 
-       ccr_reg = _stm32_qspi_gen_ccr(priv, STM32_QSPI_CCR_MEM_MAP);
+       } else {
+               fifo = _stm32_qspi_write_fifo;
+               buf = (u8 *)op->data.buf.out;
+       }
 
-       _stm32_qspi_wait_for_not_busy(priv);
+       while (len--) {
+               ret = readl_poll_timeout(&priv->regs->sr, sr,
+                                        sr & STM32_QSPI_SR_FTF,
+                                        STM32_QSPI_FIFO_TIMEOUT_US);
+               if (ret) {
+                       pr_err("fifo timeout (len:%d stat:%#x)\n", len, sr);
+                       return ret;
+               }
 
-       writel(ccr_reg, &priv->regs->ccr);
+               fifo(buf++, &priv->regs->dr);
+       }
 
-       priv->dummycycles = 0;
+       return 0;
 }
 
-static void _stm32_qspi_disable_mmap(struct stm32_qspi_priv *priv)
+static int stm32_qspi_mm(struct stm32_qspi_priv *priv,
+                        const struct spi_mem_op *op)
 {
-       setbits_le32(&priv->regs->cr, STM32_QSPI_CR_ABORT);
-}
+       memcpy_fromio(op->data.buf.in, priv->mm_base + op->addr.val,
+                     op->data.nbytes);
 
-static void _stm32_qspi_set_xfer_length(struct stm32_qspi_priv *priv,
-                                       u32 length)
-{
-       writel(length - 1, &priv->regs->dlr);
+       return 0;
 }
 
-static void _stm32_qspi_start_xfer(struct stm32_qspi_priv *priv, u32 cr_reg)
+static int _stm32_qspi_tx(struct stm32_qspi_priv *priv,
+                         const struct spi_mem_op *op,
+                         u8 mode)
 {
-       writel(cr_reg, &priv->regs->ccr);
+       if (!op->data.nbytes)
+               return 0;
+
+       if (mode == STM32_QSPI_CCR_MEM_MAP)
+               return stm32_qspi_mm(priv, op);
 
-       if (priv->command & CMD_HAS_ADR)
-               writel(priv->address, &priv->regs->ar);
+       return _stm32_qspi_poll(priv, op);
 }
 
-static int _stm32_qspi_xfer(struct stm32_qspi_priv *priv,
-                           struct spi_flash *flash, unsigned int bitlen,
-                           const u8 *dout, u8 *din, unsigned long flags)
+static int _stm32_qspi_get_mode(u8 buswidth)
 {
-       unsigned int words = bitlen / 8;
-       u32 ccr_reg;
-       int i;
+       if (buswidth == 4)
+               return 3;
 
-       if (flags & SPI_XFER_MMAP) {
-               _stm32_qspi_enable_mmap(priv, flash);
-               return 0;
-       } else if (flags & SPI_XFER_MMAP_END) {
-               _stm32_qspi_disable_mmap(priv);
-               return 0;
-       }
-
-       if (bitlen == 0)
-               return -1;
+       return buswidth;
+}
 
-       if (bitlen % 8) {
-               debug("spi_xfer: Non byte aligned SPI transfer\n");
-               return -1;
-       }
+static int stm32_qspi_exec_op(struct spi_slave *slave,
+                             const struct spi_mem_op *op)
+{
+       struct stm32_qspi_priv *priv = dev_get_priv(slave->dev->parent);
+       u32 cr, ccr, addr_max;
+       u8 mode = STM32_QSPI_CCR_IND_WRITE;
+       int timeout, ret;
+
+       debug("%s: cmd:%#x mode:%d.%d.%d.%d addr:%#llx len:%#x\n",
+             __func__, op->cmd.opcode, op->cmd.buswidth, op->addr.buswidth,
+             op->dummy.buswidth, op->data.buswidth,
+             op->addr.val, op->data.nbytes);
+
+       ret = _stm32_qspi_wait_for_not_busy(priv);
+       if (ret)
+               return ret;
 
-       if (dout && din) {
-               debug("spi_xfer: QSPI cannot have data in and data out set\n");
-               return -1;
-       }
+       addr_max = op->addr.val + op->data.nbytes + 1;
 
-       if (!dout && (flags & SPI_XFER_BEGIN)) {
-               debug("spi_xfer: QSPI transfer must begin with command\n");
-               return -1;
+       if (op->data.dir == SPI_MEM_DATA_IN && op->data.nbytes) {
+               if (addr_max < priv->mm_size && op->addr.buswidth)
+                       mode = STM32_QSPI_CCR_MEM_MAP;
+               else
+                       mode = STM32_QSPI_CCR_IND_READ;
        }
 
-       if (dout) {
-               if (flags & SPI_XFER_BEGIN) {
-                       /* data is command */
-                       priv->command = dout[0] | CMD_HAS_DATA;
-                       if (words >= 4) {
-                               /* address is here too */
-                               priv->address = (dout[1] << 16) |
-                                               (dout[2] << 8) | dout[3];
-                               priv->command |= CMD_HAS_ADR;
-                       }
-
-                       if (words > 4) {
-                               /* rest is dummy bytes */
-                               priv->dummycycles = (words - 4) * 8;
-                               priv->command |= CMD_HAS_DUMMY;
-                       }
-
-                       if (flags & SPI_XFER_END) {
-                               /* command without data */
-                               priv->command &= ~(CMD_HAS_DATA);
-                       }
-               }
-
-               if (flags & SPI_XFER_END) {
-                       ccr_reg = _stm32_qspi_gen_ccr(priv,
-                                                     STM32_QSPI_CCR_IND_WRITE);
-
-                       _stm32_qspi_wait_for_not_busy(priv);
-
-                       if (priv->command & CMD_HAS_DATA)
-                               _stm32_qspi_set_xfer_length(priv, words);
-
-                       _stm32_qspi_start_xfer(priv, ccr_reg);
-
-                       debug("%s: write: ccr:0x%08x adr:0x%08x\n",
-                             __func__, priv->regs->ccr, priv->regs->ar);
-
-                       if (priv->command & CMD_HAS_DATA) {
-                               _stm32_qspi_wait_for_ftf(priv);
-
-                               debug("%s: words:%d data:", __func__, words);
+       if (op->data.nbytes)
+               writel(op->data.nbytes - 1, &priv->regs->dlr);
 
-                               i = 0;
-                               while (words > i) {
-                                       writeb(dout[i], &priv->regs->dr);
-                                       debug("%02x ", dout[i]);
-                                       i++;
-                               }
-                               debug("\n");
+       ccr = (mode << STM32_QSPI_CCR_FMODE_SHIFT);
+       ccr |= op->cmd.opcode;
+       ccr |= (_stm32_qspi_get_mode(op->cmd.buswidth)
+               << STM32_QSPI_CCR_IMODE_SHIFT);
 
-                               _stm32_qspi_wait_for_complete(priv);
-                       } else {
-                               _stm32_qspi_wait_for_not_busy(priv);
-                       }
-               }
-       } else if (din) {
-               ccr_reg = _stm32_qspi_gen_ccr(priv, STM32_QSPI_CCR_IND_READ);
+       if (op->addr.nbytes) {
+               ccr |= ((op->addr.nbytes - 1) << STM32_QSPI_CCR_ADSIZE_SHIFT);
+               ccr |= (_stm32_qspi_get_mode(op->addr.buswidth)
+                       << STM32_QSPI_CCR_ADMODE_SHIFT);
+       }
 
-               _stm32_qspi_wait_for_not_busy(priv);
+       if (op->dummy.buswidth && op->dummy.nbytes)
+               ccr |= (op->dummy.nbytes * 8 / op->dummy.buswidth
+                       << STM32_QSPI_CCR_DCYC_SHIFT);
 
-               _stm32_qspi_set_xfer_length(priv, words);
+       if (op->data.nbytes)
+               ccr |= (_stm32_qspi_get_mode(op->data.buswidth)
+                       << STM32_QSPI_CCR_DMODE_SHIFT);
 
-               _stm32_qspi_start_xfer(priv, ccr_reg);
+       writel(ccr, &priv->regs->ccr);
 
-               debug("%s: read: ccr:0x%08x adr:0x%08x len:%d\n", __func__,
-                     priv->regs->ccr, priv->regs->ar, priv->regs->dlr);
+       if (op->addr.nbytes && mode != STM32_QSPI_CCR_MEM_MAP)
+               writel(op->addr.val, &priv->regs->ar);
 
-               debug("%s: data:", __func__);
+       ret = _stm32_qspi_tx(priv, op, mode);
+       /*
+        * Abort in:
+        * -error case
+        * -read memory map: prefetching must be stopped if we read the last
+        *  byte of device (device size - fifo size). like device size is not
+        *  knows, the prefetching is always stop.
+        */
+       if (ret || mode == STM32_QSPI_CCR_MEM_MAP)
+               goto abort;
 
-               i = 0;
-               while (words > i) {
-                       din[i] = readb(&priv->regs->dr);
-                       debug("%02x ", din[i]);
-                       i++;
-               }
-               debug("\n");
-       }
+       /* Wait end of tx in indirect mode */
+       ret = _stm32_qspi_wait_cmd(priv, op);
+       if (ret)
+               goto abort;
 
        return 0;
-}
-
-static int stm32_qspi_ofdata_to_platdata(struct udevice *bus)
-{
-       struct resource res_regs, res_mem;
-       struct stm32_qspi_platdata *plat = bus->platdata;
-       int ret;
 
-       ret = dev_read_resource_byname(bus, "qspi", &res_regs);
-       if (ret) {
-               debug("Error: can't get regs base addresses(ret = %d)!\n", ret);
-               return -ENOMEM;
-       }
-       ret = dev_read_resource_byname(bus, "qspi_mm", &res_mem);
-       if (ret) {
-               debug("Error: can't get mmap base address(ret = %d)!\n", ret);
-               return -ENOMEM;
-       }
+abort:
+       setbits_le32(&priv->regs->cr, STM32_QSPI_CR_ABORT);
 
-       plat->max_hz = dev_read_u32_default(bus, "spi-max-frequency",
-                                           STM32_QSPI_DEFAULT_SCK_FREQ);
+       /* Wait clear of abort bit by hw */
+       timeout = readl_poll_timeout(&priv->regs->cr, cr,
+                                    !(cr & STM32_QSPI_CR_ABORT),
+                                    STM32_ABT_TIMEOUT_US);
 
-       plat->base = res_regs.start;
-       plat->memory_map = res_mem.start;
+       writel(STM32_QSPI_FCR_CTCF, &priv->regs->fcr);
 
-       debug("%s: regs=<0x%x> mapped=<0x%x>, max-frequency=%d\n",
-             __func__,
-             plat->base,
-             plat->memory_map,
-             plat->max_hz
-             );
+       if (ret || timeout)
+               pr_err("%s ret:%d abort timeout:%d\n", __func__, ret, timeout);
 
-       return 0;
+       return ret;
 }
 
 static int stm32_qspi_probe(struct udevice *bus)
 {
-       struct stm32_qspi_platdata *plat = dev_get_platdata(bus);
        struct stm32_qspi_priv *priv = dev_get_priv(bus);
-       struct dm_spi_bus *dm_spi_bus;
+       struct resource res;
        struct clk clk;
        struct reset_ctl reset_ctl;
        int ret;
 
-       dm_spi_bus = bus->uclass_priv;
+       ret = dev_read_resource_byname(bus, "qspi", &res);
+       if (ret) {
+               dev_err(bus, "can't get regs base addresses(ret = %d)!\n", ret);
+               return ret;
+       }
 
-       dm_spi_bus->max_hz = plat->max_hz;
+       priv->regs = (struct stm32_qspi_regs *)res.start;
 
-       priv->regs = (struct stm32_qspi_regs *)(uintptr_t)plat->base;
+       ret = dev_read_resource_byname(bus, "qspi_mm", &res);
+       if (ret) {
+               dev_err(bus, "can't get mmap base address(ret = %d)!\n", ret);
+               return ret;
+       }
 
-       priv->max_hz = plat->max_hz;
+       priv->mm_base = (void __iomem *)res.start;
+
+       priv->mm_size = resource_size(&res);
+       if (priv->mm_size > STM32_QSPI_MAX_MMAP_SZ)
+               return -EINVAL;
+
+       debug("%s: regs=<0x%p> mapped=<0x%p> mapped_size=<0x%lx>\n",
+             __func__, priv->regs, priv->mm_base, priv->mm_size);
 
        ret = clk_get_by_index(bus, 0, &clk);
        if (ret < 0)
                return ret;
 
        ret = clk_enable(&clk);
-
        if (ret) {
                dev_err(bus, "failed to enable clock\n");
                return ret;
@@ -499,78 +380,68 @@ static int stm32_qspi_probe(struct udevice *bus)
                reset_deassert(&reset_ctl);
        }
 
+       priv->cs_used = -1;
+
        setbits_le32(&priv->regs->cr, STM32_QSPI_CR_SSHIFT);
 
-       return 0;
-}
+       /* Set dcr fsize to max address */
+       setbits_le32(&priv->regs->dcr,
+                    STM32_QSPI_DCR_FSIZE_MASK << STM32_QSPI_DCR_FSIZE_SHIFT);
 
-static int stm32_qspi_remove(struct udevice *bus)
-{
        return 0;
 }
 
 static int stm32_qspi_claim_bus(struct udevice *dev)
 {
-       struct stm32_qspi_priv *priv;
-       struct udevice *bus;
-       struct spi_flash *flash;
-       struct dm_spi_slave_platdata *slave_plat;
+       struct stm32_qspi_priv *priv = dev_get_priv(dev->parent);
+       struct dm_spi_slave_platdata *slave_plat = dev_get_parent_platdata(dev);
 
-       bus = dev->parent;
-       priv = dev_get_priv(bus);
-       flash = dev_get_uclass_priv(dev);
-       slave_plat = dev_get_parent_platdata(dev);
-
-       if (slave_plat->cs >= STM32_MAX_NORCHIP)
+       if (slave_plat->cs >= STM32_QSPI_MAX_CHIP)
                return -ENODEV;
 
-       _stm32_qspi_set_cs(priv, slave_plat->cs);
-
-       _stm32_qspi_set_flash_size(priv, flash->size);
+       if (priv->cs_used != slave_plat->cs) {
+               struct stm32_qspi_flash *flash = &priv->flash[slave_plat->cs];
 
-       _stm32_qspi_enable(priv);
+               priv->cs_used = slave_plat->cs;
 
-       return 0;
-}
+               if (flash->initialized) {
+                       /* Set the configuration: speed + cs */
+                       writel(flash->cr, &priv->regs->cr);
+                       writel(flash->dcr, &priv->regs->dcr);
+               } else {
+                       /* Set chip select */
+                       clrsetbits_le32(&priv->regs->cr, STM32_QSPI_CR_FSEL,
+                                       priv->cs_used ? STM32_QSPI_CR_FSEL : 0);
 
-static int stm32_qspi_release_bus(struct udevice *dev)
-{
-       struct stm32_qspi_priv *priv;
-       struct udevice *bus;
+                       /* Save the configuration: speed + cs */
+                       flash->cr = readl(&priv->regs->cr);
+                       flash->dcr = readl(&priv->regs->dcr);
 
-       bus = dev->parent;
-       priv = dev_get_priv(bus);
+                       flash->initialized = true;
+               }
+       }
 
-       _stm32_qspi_disable(priv);
+       setbits_le32(&priv->regs->cr, STM32_QSPI_CR_EN);
 
        return 0;
 }
 
-static int stm32_qspi_xfer(struct udevice *dev, unsigned int bitlen,
-                          const void *dout, void *din, unsigned long flags)
+static int stm32_qspi_release_bus(struct udevice *dev)
 {
-       struct stm32_qspi_priv *priv;
-       struct udevice *bus;
-       struct spi_flash *flash;
+       struct stm32_qspi_priv *priv = dev_get_priv(dev->parent);
 
-       bus = dev->parent;
-       priv = dev_get_priv(bus);
-       flash = dev_get_uclass_priv(dev);
+       clrbits_le32(&priv->regs->cr, STM32_QSPI_CR_EN);
 
-       return _stm32_qspi_xfer(priv, flash, bitlen, (const u8 *)dout,
-                               (u8 *)din, flags);
+       return 0;
 }
 
 static int stm32_qspi_set_speed(struct udevice *bus, uint speed)
 {
-       struct stm32_qspi_platdata *plat = bus->platdata;
        struct stm32_qspi_priv *priv = dev_get_priv(bus);
        u32 qspi_clk = priv->clock_rate;
        u32 prescaler = 255;
        u32 csht;
-
-       if (speed > plat->max_hz)
-               speed = plat->max_hz;
+       int ret;
 
        if (speed > 0) {
                prescaler = DIV_ROUND_UP(qspi_clk, speed) - 1;
@@ -583,7 +454,9 @@ static int stm32_qspi_set_speed(struct udevice *bus, uint speed)
        csht = DIV_ROUND_UP((5 * qspi_clk) / (prescaler + 1), 100000000);
        csht = (csht - 1) & STM32_QSPI_DCR_CSHT_MASK;
 
-       _stm32_qspi_wait_for_not_busy(priv);
+       ret = _stm32_qspi_wait_for_not_busy(priv);
+       if (ret)
+               return ret;
 
        clrsetbits_le32(&priv->regs->cr,
                        STM32_QSPI_CR_PRESCALER_MASK <<
@@ -603,8 +476,11 @@ static int stm32_qspi_set_speed(struct udevice *bus, uint speed)
 static int stm32_qspi_set_mode(struct udevice *bus, uint mode)
 {
        struct stm32_qspi_priv *priv = dev_get_priv(bus);
+       int ret;
 
-       _stm32_qspi_wait_for_not_busy(priv);
+       ret = _stm32_qspi_wait_for_not_busy(priv);
+       if (ret)
+               return ret;
 
        if ((mode & SPI_CPHA) && (mode & SPI_CPOL))
                setbits_le32(&priv->regs->dcr, STM32_QSPI_DCR_CKMODE);
@@ -616,20 +492,6 @@ static int stm32_qspi_set_mode(struct udevice *bus, uint mode)
        if (mode & SPI_CS_HIGH)
                return -ENODEV;
 
-       if (mode & SPI_RX_QUAD)
-               priv->mode |= SPI_RX_QUAD;
-       else if (mode & SPI_RX_DUAL)
-               priv->mode |= SPI_RX_DUAL;
-       else
-               priv->mode &= ~(SPI_RX_QUAD | SPI_RX_DUAL);
-
-       if (mode & SPI_TX_QUAD)
-               priv->mode |= SPI_TX_QUAD;
-       else if (mode & SPI_TX_DUAL)
-               priv->mode |= SPI_TX_DUAL;
-       else
-               priv->mode &= ~(SPI_TX_QUAD | SPI_TX_DUAL);
-
        debug("%s: regs=%p, mode=%d rx: ", __func__, priv->regs, mode);
 
        if (mode & SPI_RX_QUAD)
@@ -649,12 +511,16 @@ static int stm32_qspi_set_mode(struct udevice *bus, uint mode)
        return 0;
 }
 
+static const struct spi_controller_mem_ops stm32_qspi_mem_ops = {
+       .exec_op = stm32_qspi_exec_op,
+};
+
 static const struct dm_spi_ops stm32_qspi_ops = {
        .claim_bus      = stm32_qspi_claim_bus,
        .release_bus    = stm32_qspi_release_bus,
-       .xfer           = stm32_qspi_xfer,
        .set_speed      = stm32_qspi_set_speed,
        .set_mode       = stm32_qspi_set_mode,
+       .mem_ops        = &stm32_qspi_mem_ops,
 };
 
 static const struct udevice_id stm32_qspi_ids[] = {
@@ -664,13 +530,10 @@ static const struct udevice_id stm32_qspi_ids[] = {
 };
 
 U_BOOT_DRIVER(stm32_qspi) = {
-       .name   = "stm32_qspi",
-       .id     = UCLASS_SPI,
+       .name = "stm32_qspi",
+       .id = UCLASS_SPI,
        .of_match = stm32_qspi_ids,
-       .ops    = &stm32_qspi_ops,
-       .ofdata_to_platdata = stm32_qspi_ofdata_to_platdata,
-       .platdata_auto_alloc_size = sizeof(struct stm32_qspi_platdata),
+       .ops = &stm32_qspi_ops,
        .priv_auto_alloc_size = sizeof(struct stm32_qspi_priv),
-       .probe  = stm32_qspi_probe,
-       .remove = stm32_qspi_remove,
+       .probe = stm32_qspi_probe,
 };
index 2dcce66de0482fac825f44dd5b3fcf29ef85af38..77fa17ee8ab1466c0ffd4e962611821b98295a54 100644 (file)
@@ -10,6 +10,7 @@
 #include <asm/arch/omap.h>
 #include <malloc.h>
 #include <spi.h>
+#include <spi-mem.h>
 #include <dm.h>
 #include <asm/gpio.h>
 #include <asm/omap_gpio.h>
@@ -40,7 +41,6 @@ DECLARE_GLOBAL_DATA_PTR;
 #define QSPI_INVAL                      (4 << 16)
 #define QSPI_RD_QUAD                    (7 << 16)
 /* device control */
-#define QSPI_DD(m, n)                   (m << (3 + n*8))
 #define QSPI_CKPHA(n)                   (1 << (2 + n*8))
 #define QSPI_CSPOL(n)                   (1 << (1 + n*8))
 #define QSPI_CKPOL(n)                   (1 << (n*8))
@@ -52,22 +52,12 @@ DECLARE_GLOBAL_DATA_PTR;
 #define MM_SWITCH                       0x01
 #define MEM_CS(cs)                      ((cs + 1) << 8)
 #define MEM_CS_UNSELECT                 0xfffff8ff
-#define MMAP_START_ADDR_DRA            0x5c000000
-#define MMAP_START_ADDR_AM43x          0x30000000
-#define CORE_CTRL_IO                    0x4a002558
-
-#define QSPI_CMD_READ                   (0x3 << 0)
-#define QSPI_CMD_READ_DUAL             (0x6b << 0)
-#define QSPI_CMD_READ_QUAD              (0x6c << 0)
-#define QSPI_CMD_READ_FAST              (0x0b << 0)
-#define QSPI_SETUP0_NUM_A_BYTES         (0x3 << 8)
-#define QSPI_SETUP0_NUM_D_BYTES_NO_BITS (0x0 << 10)
-#define QSPI_SETUP0_NUM_D_BYTES_8_BITS  (0x1 << 10)
+
 #define QSPI_SETUP0_READ_NORMAL         (0x0 << 12)
 #define QSPI_SETUP0_READ_DUAL           (0x1 << 12)
 #define QSPI_SETUP0_READ_QUAD           (0x3 << 12)
-#define QSPI_CMD_WRITE                  (0x12 << 16)
-#define QSPI_NUM_DUMMY_BITS             (0x0 << 24)
+#define QSPI_SETUP0_ADDR_SHIFT         (8)
+#define QSPI_SETUP0_DBITS_SHIFT                (10)
 
 /* ti qspi register set */
 struct ti_qspi_regs {
@@ -98,13 +88,10 @@ struct ti_qspi_regs {
 
 /* ti qspi priv */
 struct ti_qspi_priv {
-#ifndef CONFIG_DM_SPI
-       struct spi_slave slave;
-#else
        void *memory_map;
+       size_t mmap_size;
        uint max_hz;
        u32 num_cs;
-#endif
        struct ti_qspi_regs *base;
        void *ctrl_mod_mmap;
        ulong fclk;
@@ -113,8 +100,9 @@ struct ti_qspi_priv {
        u32 dc;
 };
 
-static void ti_spi_set_speed(struct ti_qspi_priv *priv, uint hz)
+static int ti_qspi_set_speed(struct udevice *bus, uint hz)
 {
+       struct ti_qspi_priv *priv = dev_get_priv(bus);
        uint clk_div;
 
        if (!hz)
@@ -133,6 +121,8 @@ static void ti_spi_set_speed(struct ti_qspi_priv *priv, uint hz)
               &priv->base->clk_ctrl);
        /* enable SCLK and program the clk divider */
        writel(QSPI_CLK_EN | clk_div, &priv->base->clk_ctrl);
+
+       return 0;
 }
 
 static void ti_qspi_cs_deactivate(struct ti_qspi_priv *priv)
@@ -142,38 +132,6 @@ static void ti_qspi_cs_deactivate(struct ti_qspi_priv *priv)
        readl(&priv->base->cmd);
 }
 
-static int __ti_qspi_set_mode(struct ti_qspi_priv *priv, unsigned int mode)
-{
-       priv->dc = 0;
-       if (mode & SPI_CPHA)
-               priv->dc |= QSPI_CKPHA(0);
-       if (mode & SPI_CPOL)
-               priv->dc |= QSPI_CKPOL(0);
-       if (mode & SPI_CS_HIGH)
-               priv->dc |= QSPI_CSPOL(0);
-
-       return 0;
-}
-
-static int __ti_qspi_claim_bus(struct ti_qspi_priv *priv, int cs)
-{
-       writel(priv->dc, &priv->base->dc);
-       writel(0, &priv->base->cmd);
-       writel(0, &priv->base->data);
-
-       priv->dc <<= cs * 8;
-       writel(priv->dc, &priv->base->dc);
-
-       return 0;
-}
-
-static void __ti_qspi_release_bus(struct ti_qspi_priv *priv)
-{
-       writel(0, &priv->base->dc);
-       writel(0, &priv->base->cmd);
-       writel(0, &priv->base->data);
-}
-
 static void ti_qspi_ctrl_mode_mmap(void *ctrl_mod_mmap, int cs, bool enable)
 {
        u32 val;
@@ -186,27 +144,25 @@ static void ti_qspi_ctrl_mode_mmap(void *ctrl_mod_mmap, int cs, bool enable)
        writel(val, ctrl_mod_mmap);
 }
 
-static int __ti_qspi_xfer(struct ti_qspi_priv *priv, unsigned int bitlen,
-                       const void *dout, void *din, unsigned long flags,
-                       u32 cs)
+static int ti_qspi_xfer(struct udevice *dev, unsigned int bitlen,
+                       const void *dout, void *din, unsigned long flags)
 {
+       struct dm_spi_slave_platdata *slave = dev_get_parent_platdata(dev);
+       struct ti_qspi_priv *priv;
+       struct udevice *bus;
        uint words = bitlen >> 3; /* fixed 8-bit word length */
        const uchar *txp = dout;
        uchar *rxp = din;
        uint status;
        int timeout;
+       unsigned int cs = slave->cs;
 
-       /* Setup mmap flags */
-       if (flags & SPI_XFER_MMAP) {
-               writel(MM_SWITCH, &priv->base->memswitch);
-               if (priv->ctrl_mod_mmap)
-                       ti_qspi_ctrl_mode_mmap(priv->ctrl_mod_mmap, cs, true);
-               return 0;
-       } else if (flags & SPI_XFER_MMAP_END) {
-               writel(~MM_SWITCH, &priv->base->memswitch);
-               if (priv->ctrl_mod_mmap)
-                       ti_qspi_ctrl_mode_mmap(priv->ctrl_mod_mmap, cs, false);
-               return 0;
+       bus = dev->parent;
+       priv = dev_get_priv(bus);
+
+       if (cs > priv->num_cs) {
+               debug("invalid qspi chip select\n");
+               return -EINVAL;
        }
 
        if (bitlen == 0)
@@ -294,9 +250,9 @@ static int __ti_qspi_xfer(struct ti_qspi_priv *priv, unsigned int bitlen,
 }
 
 /* TODO: control from sf layer to here through dm-spi */
-#if defined(CONFIG_TI_EDMA3) && !defined(CONFIG_DMA)
-void spi_flash_copy_mmap(void *data, void *offset, size_t len)
+static void ti_qspi_copy_mmap(void *data, void *offset, size_t len)
 {
+#if defined(CONFIG_TI_EDMA3) && !defined(CONFIG_DMA)
        unsigned int                    addr = (unsigned int) (data);
        unsigned int                    edma_slot_num = 1;
 
@@ -311,187 +267,85 @@ void spi_flash_copy_mmap(void *data, void *offset, size_t len)
 
        /* disable edma3 clocks */
        disable_edma3_clocks();
-
-       *((unsigned int *)offset) += len;
-}
-#endif
-
-#ifndef CONFIG_DM_SPI
-
-static inline struct ti_qspi_priv *to_ti_qspi_priv(struct spi_slave *slave)
-{
-       return container_of(slave, struct ti_qspi_priv, slave);
-}
-
-int spi_cs_is_valid(unsigned int bus, unsigned int cs)
-{
-       return 1;
-}
-
-void spi_cs_activate(struct spi_slave *slave)
-{
-       /* CS handled in xfer */
-       return;
-}
-
-void spi_cs_deactivate(struct spi_slave *slave)
-{
-       struct ti_qspi_priv *priv = to_ti_qspi_priv(slave);
-       ti_qspi_cs_deactivate(priv);
-}
-
-void spi_init(void)
-{
-       /* nothing to do */
-}
-
-static void ti_spi_setup_spi_register(struct ti_qspi_priv *priv)
-{
-       u32 memval = 0;
-
-#ifdef CONFIG_QSPI_QUAD_SUPPORT
-       struct spi_slave *slave = &priv->slave;
-       memval |= (QSPI_CMD_READ_QUAD | QSPI_SETUP0_NUM_A_BYTES |
-                       QSPI_SETUP0_NUM_D_BYTES_8_BITS |
-                       QSPI_SETUP0_READ_QUAD | QSPI_CMD_WRITE |
-                       QSPI_NUM_DUMMY_BITS);
-       slave->mode |= SPI_RX_QUAD;
 #else
-       memval |= QSPI_CMD_READ | QSPI_SETUP0_NUM_A_BYTES |
-                       QSPI_SETUP0_NUM_D_BYTES_NO_BITS |
-                       QSPI_SETUP0_READ_NORMAL | QSPI_CMD_WRITE |
-                       QSPI_NUM_DUMMY_BITS;
+       memcpy_fromio(data, offset, len);
 #endif
 
-       writel(memval, &priv->base->setup0);
-}
-
-struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
-                                 unsigned int max_hz, unsigned int mode)
-{
-       struct ti_qspi_priv *priv;
-
-#ifdef CONFIG_AM43XX
-       gpio_request(CONFIG_QSPI_SEL_GPIO, "qspi_gpio");
-       gpio_direction_output(CONFIG_QSPI_SEL_GPIO, 1);
-#endif
-
-       priv = spi_alloc_slave(struct ti_qspi_priv, bus, cs);
-       if (!priv) {
-               printf("SPI_error: Fail to allocate ti_qspi_priv\n");
-               return NULL;
-       }
-
-       priv->base = (struct ti_qspi_regs *)QSPI_BASE;
-       priv->mode = mode;
-#if defined(CONFIG_DRA7XX)
-       priv->ctrl_mod_mmap = (void *)CORE_CTRL_IO;
-       priv->slave.memory_map = (void *)MMAP_START_ADDR_DRA;
-       priv->fclk = QSPI_DRA7XX_FCLK;
-#else
-       priv->slave.memory_map = (void *)MMAP_START_ADDR_AM43x;
-       priv->fclk = QSPI_FCLK;
-#endif
-
-       ti_spi_set_speed(priv, max_hz);
-
-#ifdef CONFIG_TI_SPI_MMAP
-       ti_spi_setup_spi_register(priv);
-#endif
-
-       return &priv->slave;
-}
-
-void spi_free_slave(struct spi_slave *slave)
-{
-       struct ti_qspi_priv *priv = to_ti_qspi_priv(slave);
-       free(priv);
-}
-
-int spi_claim_bus(struct spi_slave *slave)
-{
-       struct ti_qspi_priv *priv = to_ti_qspi_priv(slave);
-
-       debug("%s: bus:%i cs:%i\n", __func__, priv->slave.bus, priv->slave.cs);
-       __ti_qspi_set_mode(priv, priv->mode);
-       return __ti_qspi_claim_bus(priv, priv->slave.cs);
-}
-void spi_release_bus(struct spi_slave *slave)
-{
-       struct ti_qspi_priv *priv = to_ti_qspi_priv(slave);
-
-       debug("%s: bus:%i cs:%i\n", __func__, priv->slave.bus, priv->slave.cs);
-       __ti_qspi_release_bus(priv);
-}
-
-int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
-            void *din, unsigned long flags)
-{
-       struct ti_qspi_priv *priv = to_ti_qspi_priv(slave);
-
-       debug("spi_xfer: bus:%i cs:%i bitlen:%i flags:%lx\n",
-             priv->slave.bus, priv->slave.cs, bitlen, flags);
-       return __ti_qspi_xfer(priv, bitlen, dout, din, flags, priv->slave.cs);
+       *((unsigned int *)offset) += len;
 }
 
-#else /* CONFIG_DM_SPI */
-
-static void __ti_qspi_setup_memorymap(struct ti_qspi_priv *priv,
-                                     struct spi_slave *slave,
-                                     bool enable)
+static void ti_qspi_setup_mmap_read(struct ti_qspi_priv *priv, u8 opcode,
+                                   u8 data_nbits, u8 addr_width,
+                                   u8 dummy_bytes)
 {
-       u32 memval;
-       u32 mode = slave->mode & (SPI_RX_QUAD | SPI_RX_DUAL);
-
-       if (!enable) {
-               writel(0, &priv->base->setup0);
-               return;
-       }
-
-       memval = QSPI_SETUP0_NUM_A_BYTES | QSPI_CMD_WRITE | QSPI_NUM_DUMMY_BITS;
+       u32 memval = opcode;
 
-       switch (mode) {
-       case SPI_RX_QUAD:
-               memval |= QSPI_CMD_READ_QUAD;
-               memval |= QSPI_SETUP0_NUM_D_BYTES_8_BITS;
+       switch (data_nbits) {
+       case 4:
                memval |= QSPI_SETUP0_READ_QUAD;
-               slave->mode |= SPI_RX_QUAD;
                break;
-       case SPI_RX_DUAL:
-               memval |= QSPI_CMD_READ_DUAL;
-               memval |= QSPI_SETUP0_NUM_D_BYTES_8_BITS;
+       case 2:
                memval |= QSPI_SETUP0_READ_DUAL;
                break;
        default:
-               memval |= QSPI_CMD_READ;
-               memval |= QSPI_SETUP0_NUM_D_BYTES_NO_BITS;
                memval |= QSPI_SETUP0_READ_NORMAL;
                break;
        }
 
+       memval |= ((addr_width - 1) << QSPI_SETUP0_ADDR_SHIFT |
+                  dummy_bytes << QSPI_SETUP0_DBITS_SHIFT);
+
        writel(memval, &priv->base->setup0);
 }
 
-
-static int ti_qspi_set_speed(struct udevice *bus, uint max_hz)
+static int ti_qspi_set_mode(struct udevice *bus, uint mode)
 {
        struct ti_qspi_priv *priv = dev_get_priv(bus);
 
-       ti_spi_set_speed(priv, max_hz);
+       priv->dc = 0;
+       if (mode & SPI_CPHA)
+               priv->dc |= QSPI_CKPHA(0);
+       if (mode & SPI_CPOL)
+               priv->dc |= QSPI_CKPOL(0);
+       if (mode & SPI_CS_HIGH)
+               priv->dc |= QSPI_CSPOL(0);
 
        return 0;
 }
 
-static int ti_qspi_set_mode(struct udevice *bus, uint mode)
+static int ti_qspi_exec_mem_op(struct spi_slave *slave,
+                              const struct spi_mem_op *op)
 {
-       struct ti_qspi_priv *priv = dev_get_priv(bus);
-       return __ti_qspi_set_mode(priv, mode);
+       struct ti_qspi_priv *priv;
+       struct udevice *bus;
+
+       bus = slave->dev->parent;
+       priv = dev_get_priv(bus);
+       u32 from = 0;
+       int ret = 0;
+
+       /* Only optimize read path. */
+       if (!op->data.nbytes || op->data.dir != SPI_MEM_DATA_IN ||
+           !op->addr.nbytes || op->addr.nbytes > 4)
+               return -ENOTSUPP;
+
+       /* Address exceeds MMIO window size, fall back to regular mode. */
+       from = op->addr.val;
+       if (from + op->data.nbytes > priv->mmap_size)
+               return -ENOTSUPP;
+
+       ti_qspi_setup_mmap_read(priv, op->cmd.opcode, op->data.buswidth,
+                               op->addr.nbytes, op->dummy.nbytes);
+
+       ti_qspi_copy_mmap((void *)op->data.buf.in,
+                         (void *)priv->memory_map + from, op->data.nbytes);
+
+       return ret;
 }
 
 static int ti_qspi_claim_bus(struct udevice *dev)
 {
        struct dm_spi_slave_platdata *slave_plat = dev_get_parent_platdata(dev);
-       struct spi_slave *slave = dev_get_parent_priv(dev);
        struct ti_qspi_priv *priv;
        struct udevice *bus;
 
@@ -503,42 +357,41 @@ static int ti_qspi_claim_bus(struct udevice *dev)
                return -EINVAL;
        }
 
-       __ti_qspi_setup_memorymap(priv, slave, true);
-
-       return __ti_qspi_claim_bus(priv, slave_plat->cs);
-}
-
-static int ti_qspi_release_bus(struct udevice *dev)
-{
-       struct spi_slave *slave = dev_get_parent_priv(dev);
-       struct ti_qspi_priv *priv;
-       struct udevice *bus;
+       writel(MM_SWITCH, &priv->base->memswitch);
+       if (priv->ctrl_mod_mmap)
+               ti_qspi_ctrl_mode_mmap(priv->ctrl_mod_mmap,
+                                      slave_plat->cs, true);
 
-       bus = dev->parent;
-       priv = dev_get_priv(bus);
+       writel(priv->dc, &priv->base->dc);
+       writel(0, &priv->base->cmd);
+       writel(0, &priv->base->data);
 
-       __ti_qspi_setup_memorymap(priv, slave, false);
-       __ti_qspi_release_bus(priv);
+       priv->dc <<= slave_plat->cs * 8;
+       writel(priv->dc, &priv->base->dc);
 
        return 0;
 }
 
-static int ti_qspi_xfer(struct udevice *dev, unsigned int bitlen,
-                       const void *dout, void *din, unsigned long flags)
+static int ti_qspi_release_bus(struct udevice *dev)
 {
-       struct dm_spi_slave_platdata *slave = dev_get_parent_platdata(dev);
+       struct dm_spi_slave_platdata *slave_plat = dev_get_parent_platdata(dev);
        struct ti_qspi_priv *priv;
        struct udevice *bus;
 
        bus = dev->parent;
        priv = dev_get_priv(bus);
 
-       if (slave->cs > priv->num_cs) {
-               debug("invalid qspi chip select\n");
-               return -EINVAL;
-       }
+       writel(~MM_SWITCH, &priv->base->memswitch);
+       if (priv->ctrl_mod_mmap)
+               ti_qspi_ctrl_mode_mmap(priv->ctrl_mod_mmap,
+                                      slave_plat->cs, false);
 
-       return __ti_qspi_xfer(priv, bitlen, dout, din, flags, slave->cs);
+       writel(0, &priv->base->dc);
+       writel(0, &priv->base->cmd);
+       writel(0, &priv->base->data);
+       writel(0, &priv->base->setup0);
+
+       return 0;
 }
 
 static int ti_qspi_probe(struct udevice *bus)
@@ -594,12 +447,15 @@ static int ti_qspi_ofdata_to_platdata(struct udevice *bus)
        struct ti_qspi_priv *priv = dev_get_priv(bus);
        const void *blob = gd->fdt_blob;
        int node = dev_of_offset(bus);
+       fdt_addr_t mmap_addr;
+       fdt_addr_t mmap_size;
 
        priv->ctrl_mod_mmap = map_syscon_chipselects(bus);
        priv->base = map_physmem(devfdt_get_addr(bus),
                                 sizeof(struct ti_qspi_regs), MAP_NOCACHE);
-       priv->memory_map = map_physmem(devfdt_get_addr_index(bus, 1), 0,
-                                      MAP_NOCACHE);
+       mmap_addr = devfdt_get_addr_size_index(bus, 1, &mmap_size);
+       priv->memory_map = map_physmem(mmap_addr, mmap_size, MAP_NOCACHE);
+       priv->mmap_size = mmap_size;
 
        priv->max_hz = fdtdec_get_int(blob, node, "spi-max-frequency", -1);
        if (priv->max_hz < 0) {
@@ -614,15 +470,9 @@ static int ti_qspi_ofdata_to_platdata(struct udevice *bus)
        return 0;
 }
 
-static int ti_qspi_child_pre_probe(struct udevice *dev)
-{
-       struct spi_slave *slave = dev_get_parent_priv(dev);
-       struct udevice *bus = dev_get_parent(dev);
-       struct ti_qspi_priv *priv = dev_get_priv(bus);
-
-       slave->memory_map = priv->memory_map;
-       return 0;
-}
+static const struct spi_controller_mem_ops ti_qspi_mem_ops = {
+       .exec_op = ti_qspi_exec_mem_op,
+};
 
 static const struct dm_spi_ops ti_qspi_ops = {
        .claim_bus      = ti_qspi_claim_bus,
@@ -630,6 +480,7 @@ static const struct dm_spi_ops ti_qspi_ops = {
        .xfer           = ti_qspi_xfer,
        .set_speed      = ti_qspi_set_speed,
        .set_mode       = ti_qspi_set_mode,
+       .mem_ops        = &ti_qspi_mem_ops,
 };
 
 static const struct udevice_id ti_qspi_ids[] = {
@@ -646,6 +497,4 @@ U_BOOT_DRIVER(ti_qspi) = {
        .ofdata_to_platdata = ti_qspi_ofdata_to_platdata,
        .priv_auto_alloc_size = sizeof(struct ti_qspi_priv),
        .probe  = ti_qspi_probe,
-       .child_pre_probe = ti_qspi_child_pre_probe,
 };
-#endif /* CONFIG_DM_SPI */
index da9413c066159763f82d0312c7542bdca74c5cd5..04ea42cbccc40f96df2782cc29c594fcf6485894 100644 (file)
@@ -267,7 +267,7 @@ void zynqmp_qspi_set_tapdelay(struct udevice *bus, u32 baudrateval)
                zynqmp_mmio_read(IOU_TAPDLY_BYPASS_OFST, &tapdlybypass);
                tapdlybypass |= (TAP_DLY_BYPASS_LQSPI_RX_VALUE <<
                                TAP_DLY_BYPASS_LQSPI_RX_SHIFT);
-       } else if (reqhz < GQSPI_FREQ_100MHZ) {
+       } else if (reqhz <= GQSPI_FREQ_100MHZ) {
                zynqmp_mmio_read(IOU_TAPDLY_BYPASS_OFST, &tapdlybypass);
                tapdlybypass |= (TAP_DLY_BYPASS_LQSPI_RX_VALUE <<
                                TAP_DLY_BYPASS_LQSPI_RX_SHIFT);
@@ -277,7 +277,7 @@ void zynqmp_qspi_set_tapdelay(struct udevice *bus, u32 baudrateval)
                datadlyadj |= ((GQSPI_USE_DATA_DLY << GQSPI_USE_DATA_DLY_SHIFT)
                                | (GQSPI_DATA_DLY_ADJ_VALUE <<
                                        GQSPI_DATA_DLY_ADJ_SHIFT));
-       } else if (reqhz < GQSPI_FREQ_150MHZ) {
+       } else if (reqhz <= GQSPI_FREQ_150MHZ) {
                lpbkdlyadj = readl(&regs->lpbkdly);
                lpbkdlyadj |= ((GQSPI_LPBK_DLY_ADJ_LPBK_MASK) |
                                GQSPI_LPBK_DLY_ADJ_DLY_0);
index 34506402ac3a1c59f9f94c2b0b210df7d83faa61..3fb39b9952e313c721340fd81eb4f639bad427a7 100644 (file)
@@ -36,20 +36,9 @@ static struct sysreset_ops syscon_reboot_ops = {
 int syscon_reboot_probe(struct udevice *dev)
 {
        struct syscon_reboot_priv *priv = dev_get_priv(dev);
-       int err;
-       u32 phandle;
-       ofnode node;
 
-       err = ofnode_read_u32(dev_ofnode(dev), "regmap", &phandle);
-       if (err)
-               return err;
-
-       node = ofnode_get_by_phandle(phandle);
-       if (!ofnode_valid(node))
-               return -EINVAL;
-
-       priv->regmap = syscon_node_to_regmap(node);
-       if (!priv->regmap) {
+       priv->regmap = syscon_regmap_lookup_by_phandle(dev, "regmap");
+       if (IS_ERR(priv->regmap)) {
                pr_err("unable to find regmap\n");
                return -ENODEV;
        }
index 085bfb02c531ede8c9f6c8e364a3ae4bf80c1b65..cb48801af1611e795aae2abf073106dc2f0a5104 100644 (file)
@@ -32,7 +32,7 @@ static int dw_apb_timer_get_count(struct udevice *dev, u64 *count)
         * requires the count to be incrementing. Invert the
         * result.
         */
-       *count = ~readl(priv->regs + DW_APB_CURR_VAL);
+       *count = timer_conv_64(~readl(priv->regs + DW_APB_CURR_VAL));
 
        return 0;
 }
index 3c7ad033e3f799ae1a085c7bb7e15f60cef355f6..494ab533cca31a3c19b530ed44d2545625e4168d 100644 (file)
  */
 #undef DEBUG
 #include <common.h>
+#include <clk.h>
+#include <dm.h>
+#include <generic-phy.h>
+#include <malloc.h>
+#include <reset.h>
+
 #include <linux/errno.h>
 #include <linux/list.h>
-#include <malloc.h>
 
 #include <linux/usb/ch9.h>
+#include <linux/usb/otg.h>
 #include <linux/usb/gadget.h>
 
 #include <asm/byteorder.h>
@@ -31,6 +37,8 @@
 
 #include <asm/mach-types.h>
 
+#include <power/regulator.h>
+
 #include "dwc2_udc_otg_regs.h"
 #include "dwc2_udc_otg_priv.h"
 
@@ -140,7 +148,6 @@ static struct usb_ep_ops dwc2_ep_ops = {
 
 /***********************************************************/
 
-void __iomem           *regs_otg;
 struct dwc2_usbotg_reg *reg;
 
 bool dfu_usb_get_reset(void)
@@ -223,6 +230,7 @@ static int udc_enable(struct dwc2_udc *dev)
        return 0;
 }
 
+#if !CONFIG_IS_ENABLED(DM_USB_GADGET)
 /*
   Register entry point for the peripheral controller driver.
 */
@@ -297,6 +305,54 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
        udc_disable(dev);
        return 0;
 }
+#else /* !CONFIG_IS_ENABLED(DM_USB_GADGET) */
+
+static int dwc2_gadget_start(struct usb_gadget *g,
+                            struct usb_gadget_driver *driver)
+{
+       struct dwc2_udc *dev = the_controller;
+
+       debug_cond(DEBUG_SETUP != 0, "%s: %s\n", __func__, "no name");
+
+       if (!driver ||
+           (driver->speed != USB_SPEED_FULL &&
+            driver->speed != USB_SPEED_HIGH) ||
+           !driver->bind || !driver->disconnect || !driver->setup)
+               return -EINVAL;
+
+       if (!dev)
+               return -ENODEV;
+
+       if (dev->driver)
+               return -EBUSY;
+
+       /* first hook up the driver ... */
+       dev->driver = driver;
+
+       debug_cond(DEBUG_SETUP != 0,
+                  "Registered gadget driver %s\n", dev->gadget.name);
+       return udc_enable(dev);
+}
+
+static int dwc2_gadget_stop(struct usb_gadget *g)
+{
+       struct dwc2_udc *dev = the_controller;
+
+       if (!dev)
+               return -ENODEV;
+
+       if (!dev->driver)
+               return -EINVAL;
+
+       dev->driver = 0;
+       stop_activity(dev, dev->driver);
+
+       udc_disable(dev);
+
+       return 0;
+}
+
+#endif /* !CONFIG_IS_ENABLED(DM_USB_GADGET) */
 
 /*
  *     done - retire a request; caller blocked irqs
@@ -400,6 +456,8 @@ static void reconfig_usbd(struct dwc2_udc *dev)
        unsigned int uTemp = writel(CORE_SOFT_RESET, &reg->grstctl);
        uint32_t dflt_gusbcfg;
        uint32_t rx_fifo_sz, tx_fifo_sz, np_tx_fifo_sz;
+       u32 max_hw_ep;
+       int pdata_hw_ep;
 
        debug("Reseting OTG controller\n");
 
@@ -482,10 +540,23 @@ static void reconfig_usbd(struct dwc2_udc *dev)
        writel((np_tx_fifo_sz << 16) | rx_fifo_sz,
               &reg->gnptxfsiz);
 
-       for (i = 1; i < DWC2_MAX_HW_ENDPOINTS; i++)
-               writel((rx_fifo_sz + np_tx_fifo_sz + tx_fifo_sz*(i-1)) |
-                       tx_fifo_sz << 16, &reg->dieptxf[i-1]);
+       /* retrieve the number of IN Endpoints (excluding ep0) */
+       max_hw_ep = (readl(&reg->ghwcfg4) & GHWCFG4_NUM_IN_EPS_MASK) >>
+                   GHWCFG4_NUM_IN_EPS_SHIFT;
+       pdata_hw_ep = dev->pdata->tx_fifo_sz_nb;
+
+       /* tx_fifo_sz_nb should equal to number of IN Endpoint */
+       if (pdata_hw_ep && max_hw_ep != pdata_hw_ep)
+               pr_warn("Got %d hw endpoint but %d tx-fifo-size in array !!\n",
+                       max_hw_ep, pdata_hw_ep);
+
+       for (i = 0; i < max_hw_ep; i++) {
+               if (pdata_hw_ep)
+                       tx_fifo_sz = dev->pdata->tx_fifo_sz_array[i];
 
+               writel((rx_fifo_sz + np_tx_fifo_sz + (tx_fifo_sz * i)) |
+                       tx_fifo_sz << 16, &reg->dieptxf[i]);
+       }
        /* Flush the RX FIFO */
        writel(RX_FIFO_FLUSH, &reg->grstctl);
        while (readl(&reg->grstctl) & RX_FIFO_FLUSH)
@@ -731,6 +802,10 @@ static void dwc2_fifo_flush(struct usb_ep *_ep)
 
 static const struct usb_gadget_ops dwc2_udc_ops = {
        /* current versions must always be self-powered */
+#if CONFIG_IS_ENABLED(DM_USB_GADGET)
+       .udc_start              = dwc2_gadget_start,
+       .udc_stop               = dwc2_gadget_stop,
+#endif
 };
 
 static struct dwc2_udc memory = {
@@ -818,8 +893,6 @@ int dwc2_udc_probe(struct dwc2_plat_otg_data *pdata)
 
        reg = (struct dwc2_usbotg_reg *)pdata->regs_otg;
 
-       /* regs_otg = (void *)pdata->regs_otg; */
-
        dev->gadget.is_dualspeed = 1;   /* Hack only*/
        dev->gadget.is_otg = 0;
        dev->gadget.is_a_peripheral = 0;
@@ -844,12 +917,311 @@ int dwc2_udc_probe(struct dwc2_plat_otg_data *pdata)
        return retval;
 }
 
-int usb_gadget_handle_interrupts(int index)
+int dwc2_udc_handle_interrupt(void)
 {
        u32 intr_status = readl(&reg->gintsts);
        u32 gintmsk = readl(&reg->gintmsk);
 
        if (intr_status & gintmsk)
                return dwc2_udc_irq(1, (void *)the_controller);
+
+       return 0;
+}
+
+#if !CONFIG_IS_ENABLED(DM_USB_GADGET)
+
+int usb_gadget_handle_interrupts(int index)
+{
+       return dwc2_udc_handle_interrupt();
+}
+
+#else /* CONFIG_IS_ENABLED(DM_USB_GADGET) */
+
+struct dwc2_priv_data {
+       struct clk_bulk         clks;
+       struct reset_ctl_bulk   resets;
+       struct phy *phys;
+       int num_phys;
+       struct udevice *usb33d_supply;
+};
+
+int dm_usb_gadget_handle_interrupts(struct udevice *dev)
+{
+       return dwc2_udc_handle_interrupt();
+}
+
+int dwc2_phy_setup(struct udevice *dev, struct phy **array, int *num_phys)
+{
+       int i, ret, count;
+       struct phy *usb_phys;
+
+       /* Return if no phy declared */
+       if (!dev_read_prop(dev, "phys", NULL))
+               return 0;
+
+       count = dev_count_phandle_with_args(dev, "phys", "#phy-cells");
+       if (count <= 0)
+               return count;
+
+       usb_phys = devm_kcalloc(dev, count, sizeof(struct phy),
+                               GFP_KERNEL);
+       if (!usb_phys)
+               return -ENOMEM;
+
+       for (i = 0; i < count; i++) {
+               ret = generic_phy_get_by_index(dev, i, &usb_phys[i]);
+               if (ret && ret != -ENOENT) {
+                       dev_err(dev, "Failed to get USB PHY%d for %s\n",
+                               i, dev->name);
+                       return ret;
+               }
+       }
+
+       for (i = 0; i < count; i++) {
+               ret = generic_phy_init(&usb_phys[i]);
+               if (ret) {
+                       dev_err(dev, "Can't init USB PHY%d for %s\n",
+                               i, dev->name);
+                       goto phys_init_err;
+               }
+       }
+
+       for (i = 0; i < count; i++) {
+               ret = generic_phy_power_on(&usb_phys[i]);
+               if (ret) {
+                       dev_err(dev, "Can't power USB PHY%d for %s\n",
+                               i, dev->name);
+                       goto phys_poweron_err;
+               }
+       }
+
+       *array = usb_phys;
+       *num_phys =  count;
+
        return 0;
+
+phys_poweron_err:
+       for (i = count - 1; i >= 0; i--)
+               generic_phy_power_off(&usb_phys[i]);
+
+       for (i = 0; i < count; i++)
+               generic_phy_exit(&usb_phys[i]);
+
+       return ret;
+
+phys_init_err:
+       for (; i >= 0; i--)
+               generic_phy_exit(&usb_phys[i]);
+
+       return ret;
+}
+
+void dwc2_phy_shutdown(struct udevice *dev, struct phy *usb_phys, int num_phys)
+{
+       int i, ret;
+
+       for (i = 0; i < num_phys; i++) {
+               if (!generic_phy_valid(&usb_phys[i]))
+                       continue;
+
+               ret = generic_phy_power_off(&usb_phys[i]);
+               ret |= generic_phy_exit(&usb_phys[i]);
+               if (ret) {
+                       dev_err(dev, "Can't shutdown USB PHY%d for %s\n",
+                               i, dev->name);
+               }
+       }
+}
+
+static int dwc2_udc_otg_ofdata_to_platdata(struct udevice *dev)
+{
+       struct dwc2_plat_otg_data *platdata = dev_get_platdata(dev);
+       int node = dev_of_offset(dev);
+       ulong drvdata;
+       void (*set_params)(struct dwc2_plat_otg_data *data);
+
+       if (usb_get_dr_mode(node) != USB_DR_MODE_PERIPHERAL) {
+               dev_dbg(dev, "Invalid mode\n");
+               return -ENODEV;
+       }
+
+       platdata->regs_otg = dev_read_addr(dev);
+
+       platdata->rx_fifo_sz = dev_read_u32_default(dev, "g-rx-fifo-size", 0);
+       platdata->np_tx_fifo_sz = dev_read_u32_default(dev,
+                                                      "g-np-tx-fifo-size", 0);
+       platdata->tx_fifo_sz = dev_read_u32_default(dev, "g-tx-fifo-size", 0);
+
+       platdata->force_b_session_valid =
+               dev_read_bool(dev, "u-boot,force-b-session-valid");
+
+       /* force platdata according compatible */
+       drvdata = dev_get_driver_data(dev);
+       if (drvdata) {
+               set_params = (void *)drvdata;
+               set_params(platdata);
+       }
+
+       return 0;
+}
+
+static void dwc2_set_stm32mp1_hsotg_params(struct dwc2_plat_otg_data *p)
+{
+       p->activate_stm_id_vb_detection = true;
+       p->usb_gusbcfg =
+               0 << 15         /* PHY Low Power Clock sel*/
+               | 0x9 << 10     /* USB Turnaround time (0x9 for HS phy) */
+               | 0 << 9        /* [0:HNP disable,1:HNP enable]*/
+               | 0 << 8        /* [0:SRP disable 1:SRP enable]*/
+               | 0 << 6        /* 0: high speed utmi+, 1: full speed serial*/
+               | 0x7 << 0;     /* FS timeout calibration**/
+
+       if (p->force_b_session_valid)
+               p->usb_gusbcfg |= 1 << 30; /* FDMOD: Force device mode */
+}
+
+static int dwc2_udc_otg_reset_init(struct udevice *dev,
+                                  struct reset_ctl_bulk *resets)
+{
+       int ret;
+
+       ret = reset_get_bulk(dev, resets);
+       if (ret == -ENOTSUPP)
+               return 0;
+
+       if (ret)
+               return ret;
+
+       ret = reset_assert_bulk(resets);
+
+       if (!ret) {
+               udelay(2);
+               ret = reset_deassert_bulk(resets);
+       }
+       if (ret) {
+               reset_release_bulk(resets);
+               return ret;
+       }
+
+       return 0;
+}
+
+static int dwc2_udc_otg_clk_init(struct udevice *dev,
+                                struct clk_bulk *clks)
+{
+       int ret;
+
+       ret = clk_get_bulk(dev, clks);
+       if (ret == -ENOSYS)
+               return 0;
+
+       if (ret)
+               return ret;
+
+       ret = clk_enable_bulk(clks);
+       if (ret) {
+               clk_release_bulk(clks);
+               return ret;
+       }
+
+       return 0;
+}
+
+static int dwc2_udc_otg_probe(struct udevice *dev)
+{
+       struct dwc2_plat_otg_data *platdata = dev_get_platdata(dev);
+       struct dwc2_priv_data *priv = dev_get_priv(dev);
+       struct dwc2_usbotg_reg *usbotg_reg =
+               (struct dwc2_usbotg_reg *)platdata->regs_otg;
+       int ret;
+
+       ret = dwc2_udc_otg_clk_init(dev, &priv->clks);
+       if (ret)
+               return ret;
+
+       ret = dwc2_udc_otg_reset_init(dev, &priv->resets);
+       if (ret)
+               return ret;
+
+       ret = dwc2_phy_setup(dev, &priv->phys, &priv->num_phys);
+       if (ret)
+               return ret;
+
+       if (CONFIG_IS_ENABLED(DM_REGULATOR) &&
+           platdata->activate_stm_id_vb_detection &&
+           !platdata->force_b_session_valid) {
+               ret = device_get_supply_regulator(dev, "usb33d-supply",
+                                                 &priv->usb33d_supply);
+               if (ret) {
+                       dev_err(dev, "can't get voltage level detector supply\n");
+                       return ret;
+               }
+               ret = regulator_set_enable(priv->usb33d_supply, true);
+               if (ret) {
+                       dev_err(dev, "can't enable voltage level detector supply\n");
+                       return ret;
+               }
+               /* Enable vbus sensing */
+               setbits_le32(&usbotg_reg->ggpio,
+                            GGPIO_STM32_OTG_GCCFG_VBDEN |
+                            GGPIO_STM32_OTG_GCCFG_IDEN);
+       }
+
+       if (platdata->force_b_session_valid)
+               /* Override B session bits : value and enable */
+               setbits_le32(&usbotg_reg->gotgctl,
+                            A_VALOEN | A_VALOVAL | B_VALOEN | B_VALOVAL);
+
+       ret = dwc2_udc_probe(platdata);
+       if (ret)
+               return ret;
+
+       the_controller->driver = 0;
+
+       ret = usb_add_gadget_udc((struct device *)dev, &the_controller->gadget);
+
+       return ret;
+}
+
+static int dwc2_udc_otg_remove(struct udevice *dev)
+{
+       struct dwc2_priv_data *priv = dev_get_priv(dev);
+
+       usb_del_gadget_udc(&the_controller->gadget);
+
+       reset_release_bulk(&priv->resets);
+
+       clk_release_bulk(&priv->clks);
+
+       dwc2_phy_shutdown(dev, priv->phys, priv->num_phys);
+
+       return dm_scan_fdt_dev(dev);
+}
+
+static const struct udevice_id dwc2_udc_otg_ids[] = {
+       { .compatible = "snps,dwc2" },
+       { .compatible = "st,stm32mp1-hsotg",
+         .data = (ulong)dwc2_set_stm32mp1_hsotg_params },
+       {},
+};
+
+U_BOOT_DRIVER(dwc2_udc_otg) = {
+       .name   = "dwc2-udc-otg",
+       .id     = UCLASS_USB_GADGET_GENERIC,
+       .of_match = dwc2_udc_otg_ids,
+       .ofdata_to_platdata = dwc2_udc_otg_ofdata_to_platdata,
+       .probe = dwc2_udc_otg_probe,
+       .remove = dwc2_udc_otg_remove,
+       .platdata_auto_alloc_size = sizeof(struct dwc2_plat_otg_data),
+       .priv_auto_alloc_size = sizeof(struct dwc2_priv_data),
+};
+
+int dwc2_udc_B_session_valid(struct udevice *dev)
+{
+       struct dwc2_plat_otg_data *platdata = dev_get_platdata(dev);
+       struct dwc2_usbotg_reg *usbotg_reg =
+               (struct dwc2_usbotg_reg *)platdata->regs_otg;
+
+       return readl(&usbotg_reg->gotgctl) & B_SESSION_VALID;
 }
+#endif /* CONFIG_IS_ENABLED(DM_USB_GADGET) */
index aaa90187fb765b49061ea2764589bdeda8415cd6..e72b22ac61e1a9e9c70e64ba7baca549b5e407c9 100644 (file)
@@ -23,7 +23,6 @@
 #define EP_FIFO_SIZE2          1024
 /* ep0-control, ep1in-bulk, ep2out-bulk, ep3in-int */
 #define DWC2_MAX_ENDPOINTS     4
-#define DWC2_MAX_HW_ENDPOINTS  16
 
 #define WAIT_FOR_SETUP          0
 #define DATA_STATE_XMIT         1
index a1829b3fd1219db975b0e95e85120ad311200122..434db5ba39ad4b1d12b6ebf8776fcdd7fb7f69fa 100644 (file)
@@ -60,22 +60,26 @@ struct dwc2_usbotg_reg {
        u32 grxstsp; /* Receive Status Debug Pop/Status Pop */
        u32 grxfsiz; /* Receive FIFO Size */
        u32 gnptxfsiz; /* Non-Periodic Transmit FIFO Size */
-       u8  res1[216];
+       u8  res0[12];
+       u32 ggpio;     /* 0x038 */
+       u8  res1[20];
+       u32 ghwcfg4; /* User HW Config4 */
+       u8  res2[176];
        u32 dieptxf[15]; /* Device Periodic Transmit FIFO size register */
-       u8  res2[1728];
+       u8  res3[1728];
        /* Device Configuration */
        u32 dcfg; /* Device Configuration Register */
        u32 dctl; /* Device Control */
        u32 dsts; /* Device Status */
-       u8  res3[4];
+       u8  res4[4];
        u32 diepmsk; /* Device IN Endpoint Common Interrupt Mask */
        u32 doepmsk; /* Device OUT Endpoint Common Interrupt Mask */
        u32 daint; /* Device All Endpoints Interrupt */
        u32 daintmsk; /* Device All Endpoints Interrupt Mask */
-       u8  res4[224];
+       u8  res5[224];
        struct dwc2_dev_in_endp in_endp[16];
        struct dwc2_dev_out_endp out_endp[16];
-       u8  res5[768];
+       u8  res6[768];
        struct ep_fifo ep[16];
 };
 
@@ -83,8 +87,15 @@ struct dwc2_usbotg_reg {
 /*definitions related to CSR setting */
 
 /* DWC2_UDC_OTG_GOTGCTL */
-#define B_SESSION_VALID                (0x1<<19)
-#define A_SESSION_VALID                (0x1<<18)
+#define B_SESSION_VALID                        BIT(19)
+#define A_SESSION_VALID                        BIT(18)
+#define B_VALOVAL                      BIT(7)
+#define B_VALOEN                       BIT(6)
+#define A_VALOVAL                      BIT(5)
+#define A_VALOEN                       BIT(4)
+
+/* DWC2_UDC_OTG_GOTINT */
+#define GOTGINT_SES_END_DET            (1<<2)
 
 /* DWC2_UDC_OTG_GAHBCFG */
 #define PTXFE_HALF                     (0<<8)
@@ -118,6 +129,7 @@ struct dwc2_usbotg_reg {
 #define INT_NP_TX_FIFO_EMPTY           (0x1<<5)
 #define INT_RX_FIFO_NOT_EMPTY          (0x1<<4)
 #define INT_SOF                        (0x1<<3)
+#define INT_OTG                        (0x1<<2)
 #define INT_DEV_MODE                   (0x0<<0)
 #define INT_HOST_MODE                  (0x1<<1)
 #define INT_GOUTNakEff                 (0x01<<7)
@@ -246,7 +258,7 @@ struct dwc2_usbotg_reg {
 
 /* Masks definitions */
 #define GINTMSK_INIT   (INT_OUT_EP | INT_IN_EP | INT_RESUME | INT_ENUMDONE\
-                       | INT_RESET | INT_SUSPEND)
+                       | INT_RESET | INT_SUSPEND | INT_OTG)
 #define DOEPMSK_INIT   (CTRL_OUT_EP_SETUP_PHASE_DONE | AHB_ERROR|TRANSFER_DONE)
 #define DIEPMSK_INIT   (NON_ISO_IN_EP_TIMEOUT|AHB_ERROR|TRANSFER_DONE)
 #define GAHBCFG_INIT   (PTXFE_HALF | NPTXFE_HALF | MODE_DMA | BURST_INCR4\
@@ -269,4 +281,13 @@ struct dwc2_usbotg_reg {
 /* Device ALL Endpoints Interrupt Register (DAINT) */
 #define DAINT_IN_EP_INT(x)                        (x << 0)
 #define DAINT_OUT_EP_INT(x)                       (x << 16)
+
+/* User HW Config4 */
+#define GHWCFG4_NUM_IN_EPS_MASK                (0xf << 26)
+#define GHWCFG4_NUM_IN_EPS_SHIFT       26
+
+/* OTG general core configuration register (OTG_GCCFG:0x38) for STM32MP1 */
+#define GGPIO_STM32_OTG_GCCFG_VBDEN               BIT(21)
+#define GGPIO_STM32_OTG_GCCFG_IDEN                BIT(22)
+
 #endif
index a75af4987f8f91d1fc1a928f4159068b8850a68b..7eb632d3b1417ba76e8a45d72df9bf21a2d5b243 100644 (file)
@@ -467,7 +467,7 @@ static void process_ep_out_intr(struct dwc2_udc *dev)
 static int dwc2_udc_irq(int irq, void *_dev)
 {
        struct dwc2_udc *dev = _dev;
-       u32 intr_status;
+       u32 intr_status, gotgint;
        u32 usb_status, gintmsk;
        unsigned long flags = 0;
 
@@ -521,14 +521,24 @@ static int dwc2_udc_irq(int irq, void *_dev)
                    && dev->driver) {
                        if (dev->driver->suspend)
                                dev->driver->suspend(&dev->gadget);
+               }
+       }
+
+       if (intr_status & INT_OTG) {
+               gotgint = readl(&reg->gotgint);
+               debug_cond(DEBUG_ISR,
+                          "\tOTG interrupt: (GOTGINT):0x%x\n", gotgint);
 
-                       /* HACK to let gadget detect disconnected state */
+               if (gotgint & GOTGINT_SES_END_DET) {
+                       debug_cond(DEBUG_ISR, "\t\tSession End Detected\n");
+                       /* Let gadget detect disconnected state */
                        if (dev->driver->disconnect) {
                                spin_unlock_irqrestore(&dev->lock, flags);
                                dev->driver->disconnect(&dev->gadget);
                                spin_lock_irqsave(&dev->lock, flags);
                        }
                }
+               writel(gotgint, &reg->gotgint);
        }
 
        if (intr_status & INT_RESUME) {
index ba1e6bfa43b5b9f2977c2db9bedded3a1fb5b0aa..0fbc11580111af5cd403f5ada34d89af1cb42fa4 100644 (file)
@@ -154,6 +154,13 @@ config USB_EHCI_OMAP
          Enables support for the on-chip EHCI controller on OMAP3 and later
          SoCs.
 
+config USB_EHCI_VF
+       bool "Support for Vybrid on-chip EHCI USB controller"
+       depends on ARCH_VF610
+       default y
+       help
+         Enables support for the on-chip EHCI controller on Vybrid SoCs.
+
 if USB_EHCI_MX7
 
 config MXC_USB_OTG_HACTIVE
index 948394709f7d3d848838b1aeaa4fa6ffde8f28d5..33abfeada07971198bd38e7677e975046a32422e 100644 (file)
@@ -18,6 +18,7 @@
 #include <dm.h>
 #include <asm/mach-types.h>
 #include <power/regulator.h>
+#include <linux/usb/otg.h>
 
 #include "ehci.h"
 
@@ -483,23 +484,23 @@ static int ehci_usb_phy_mode(struct udevice *dev)
 static int ehci_usb_ofdata_to_platdata(struct udevice *dev)
 {
        struct usb_platdata *plat = dev_get_platdata(dev);
-       const char *mode;
+       enum usb_dr_mode dr_mode;
 
-       mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "dr_mode", NULL);
-       if (mode) {
-               if (strcmp(mode, "peripheral") == 0)
-                       plat->init_type = USB_INIT_DEVICE;
-               else if (strcmp(mode, "host") == 0)
-                       plat->init_type = USB_INIT_HOST;
-               else if (strcmp(mode, "otg") == 0)
-                       return ehci_usb_phy_mode(dev);
-               else
-                       return -EINVAL;
+       dr_mode = usb_get_dr_mode(dev_of_offset(dev));
 
-               return 0;
-       }
+       switch (dr_mode) {
+       case USB_DR_MODE_HOST:
+               plat->init_type = USB_INIT_HOST;
+               break;
+       case USB_DR_MODE_PERIPHERAL:
+               plat->init_type = USB_INIT_DEVICE;
+               break;
+       case USB_DR_MODE_OTG:
+       case USB_DR_MODE_UNKNOWN:
+               return ehci_usb_phy_mode(dev);
+       };
 
-       return ehci_usb_phy_mode(dev);
+       return 0;
 }
 
 static int ehci_usb_probe(struct udevice *dev)
index 611ea97a724929903d3ba028b53a42f894c223be..6e118b5a8ffa408fd8b9c7f5595e0ae47b200b58 100644 (file)
@@ -210,7 +210,7 @@ static void usb_scan_bus(struct udevice *bus, bool recurse)
 
        assert(recurse);        /* TODO: Support non-recusive */
 
-       printf("scanning bus %d for devices... ", bus->seq);
+       printf("scanning bus %s for devices... ", bus->name);
        debug("\n");
        ret = usb_scan_device(bus, 0, USB_SPEED_FULL, &dev);
        if (ret)
@@ -242,7 +242,6 @@ int usb_init(void)
        struct usb_bus_priv *priv;
        struct udevice *bus;
        struct uclass *uc;
-       int count = 0;
        int ret;
 
        asynch_allowed = 1;
@@ -255,8 +254,7 @@ int usb_init(void)
 
        uclass_foreach_dev(bus, uc) {
                /* init low_level USB */
-               printf("USB%d:   ", count);
-               count++;
+               printf("Bus %s: ", bus->name);
 
 #ifdef CONFIG_SANDBOX
                /*
@@ -327,10 +325,8 @@ int usb_init(void)
        remove_inactive_children(uc, bus);
 
        /* if we were not able to find at least one working bus, bail out */
-       if (!count)
-               printf("No controllers found\n");
-       else if (controllers_initialized == 0)
-               printf("USB error: all controllers failed lowlevel init\n");
+       if (controllers_initialized == 0)
+               printf("No working controllers found\n");
 
        return usb_started ? 0 : -1;
 }
index f8f2205a62d317b63b0bc771a6bf6a1945b5e801..75005ccdd1b406c99abdec9b0edead4477ef5b73 100644 (file)
@@ -21,6 +21,7 @@ config USB_MUSB_GADGET
 config USB_MUSB_TI
        bool "Enable TI OTG USB controller"
        depends on DM_USB
+       select USB_MUSB_DSPS
        default n
        help
          Say y here to enable support for the dual role high
@@ -54,6 +55,15 @@ config USB_MUSB_SUNXI
        Say y here to enable support for the sunxi OTG / DRC USB controller
        used on almost all sunxi boards.
 
+config USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
+       bool "Disable MUSB bulk split/combine"
+       default y
+       help
+         On TI AM335x devices, MUSB has bulk split/combine feature enabled
+         in the ConfigData register, but the current MUSB driver does not
+         support it yet. Select this option to disable the feature until the
+         driver adds the support.
+
 endif
 
 config USB_MUSB_PIO_ONLY
index 2eac4b63813d20376ed23256ec01691b5cd74477..c3781b160d9ffcd502ec34b539f62813796e1579 100644 (file)
@@ -120,7 +120,7 @@ config CONSOLE_TRUETYPE_SIZE
 
 config SYS_WHITE_ON_BLACK
        bool "Display console as white on a black background"
-       default y if ARCH_AT91 || ARCH_EXYNOS || ARCH_ROCKCHIP || TEGRA || X86
+       default y if ARCH_AT91 || ARCH_EXYNOS || ARCH_ROCKCHIP || TEGRA || X86 || ARCH_SUNXI
        help
         Normally the display is black on a white background, Enable this
         option to invert this, i.e. white on a black background. This can be
@@ -538,6 +538,8 @@ config VIDEO_TEGRA124
 
 source "drivers/video/bridge/Kconfig"
 
+source "drivers/video/imx/Kconfig"
+
 config VIDEO
        bool "Enable legacy video support"
        depends on !DM_VIDEO
@@ -547,13 +549,6 @@ config VIDEO
          model. Video drivers typically provide a colour text console and
          cursor.
 
-config VIDEO_IPUV3
-       bool "i.MX IPUv3 Core video support"
-       depends on VIDEO && MX6
-       help
-         This enables framebuffer driver for i.MX processors working
-         on the IPUv3(Image Processing Unit) internal graphic processor.
-
 config CFB_CONSOLE
        bool "Enable colour frame buffer console"
        depends on VIDEO
index 671f037c350ab0f1850d269f4b2a0ad6a8c80989..349a207035bd9b825ef579f3797fc720d6ebc1cf 100644 (file)
@@ -46,7 +46,7 @@ obj-$(CONFIG_VIDEO_DA8XX) += da8xx-fb.o videomodes.o
 obj-$(CONFIG_VIDEO_DW_HDMI) += dw_hdmi.o
 obj-$(CONFIG_VIDEO_EFI) += efi.o
 obj-$(CONFIG_VIDEO_FSL_DCU_FB) += fsl_dcu_fb.o videomodes.o
-obj-$(CONFIG_VIDEO_IPUV3) += mxc_ipuv3_fb.o ipu_common.o ipu_disp.o
+obj-$(CONFIG_VIDEO_IPUV3) += imx/
 obj-$(CONFIG_VIDEO_IVYBRIDGE_IGD) += ivybridge_igd.o
 obj-$(CONFIG_VIDEO_LCD_ANX9804) += anx9804.o
 obj-$(CONFIG_VIDEO_LCD_HITACHI_TX18D42VM) += hitachi_tx18d42vm_lcd.o
index 2cfa510d5f7d7a0c2830986a21df1dc84d9eeab8..7f01ee94242049e48563c238ba438e580e8e5a93 100644 (file)
@@ -84,7 +84,8 @@ static int console_normal_putc_xy(struct udevice *dev, uint x_frac, uint y,
                return -EAGAIN;
 
        for (row = 0; row < VIDEO_FONT_HEIGHT; row++) {
-               uchar bits = video_fontdata[ch * VIDEO_FONT_HEIGHT + row];
+               unsigned int idx = (u8)ch * VIDEO_FONT_HEIGHT + row;
+               uchar bits = video_fontdata[idx];
 
                switch (vid_priv->bpix) {
 #ifdef CONFIG_VIDEO_BPP8
index f076570335b0f89d85ac755d04c93c47943916f5..71a5c5efba3c0011a772ac6bcf8a769a306d1267 100644 (file)
@@ -90,7 +90,7 @@ static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, char ch)
        int i, col;
        int mask = 0x80;
        void *line;
-       uchar *pfont = video_fontdata + ch * VIDEO_FONT_HEIGHT;
+       uchar *pfont = video_fontdata + (u8)ch * VIDEO_FONT_HEIGHT;
 
        line = vid_priv->fb + (VID_TO_PIXEL(x_frac) + 1) *
                        vid_priv->line_length - (y + 1) * pbytes;
@@ -222,7 +222,8 @@ static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, char ch)
                        VIDEO_FONT_WIDTH - 1) * VNBYTES(vid_priv->bpix);
 
        for (row = 0; row < VIDEO_FONT_HEIGHT; row++) {
-               uchar bits = video_fontdata[ch * VIDEO_FONT_HEIGHT + row];
+               unsigned int idx = (u8)ch * VIDEO_FONT_HEIGHT + row;
+               uchar bits = video_fontdata[idx];
 
                switch (vid_priv->bpix) {
 #ifdef CONFIG_VIDEO_BPP8
@@ -348,7 +349,7 @@ static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, char ch)
        void *line = vid_priv->fb +
                (vid_priv->ysize - VID_TO_PIXEL(x_frac) - 1) *
                vid_priv->line_length + y * pbytes;
-       uchar *pfont = video_fontdata + ch * VIDEO_FONT_HEIGHT;
+       uchar *pfont = video_fontdata + (u8)ch * VIDEO_FONT_HEIGHT;
 
        if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac)
                return -EAGAIN;
diff --git a/drivers/video/imx/Kconfig b/drivers/video/imx/Kconfig
new file mode 100644 (file)
index 0000000..c33620e
--- /dev/null
@@ -0,0 +1,8 @@
+
+config VIDEO_IPUV3
+       bool "i.MX IPUv3 Core video support"
+       depends on (VIDEO || DM_VIDEO) && (MX5 || MX6)
+       help
+         This enables framebuffer driver for i.MX processors working
+         on the IPUv3(Image Processing Unit) internal graphic processor.
+
diff --git a/drivers/video/imx/Makefile b/drivers/video/imx/Makefile
new file mode 100644 (file)
index 0000000..179ea65
--- /dev/null
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# (C) Copyright 2000-2007
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+
+obj-y += mxc_ipuv3_fb.o ipu_common.o ipu_disp.o
similarity index 100%
rename from drivers/video/ipu.h
rename to drivers/video/imx/ipu.h
similarity index 88%
rename from drivers/video/mxc_ipuv3_fb.c
rename to drivers/video/imx/mxc_ipuv3_fb.c
index 23cd55de47967a487e76383cf2c3f3faf3eabac4..3e38d4bdcc35a427f31353142d302ee17063b051 100644 (file)
 #include <linux/list.h>
 #include <linux/fb.h>
 #include <asm/io.h>
+#include <asm/mach-imx/video.h>
 #include <malloc.h>
 #include <video_fb.h>
-#include "videomodes.h"
+#include "../videomodes.h"
 #include "ipu.h"
 #include "mxcfb.h"
 #include "ipu_regs.h"
 
+#include <dm.h>
+#include <video.h>
+
 DECLARE_GLOBAL_DATA_PTR;
 
 static int mxcfb_map_video_memory(struct fb_info *fbi);
@@ -401,8 +405,14 @@ static int mxcfb_map_video_memory(struct fb_info *fbi)
                                    fbi->fix.line_length;
        }
        fbi->fix.smem_len = roundup(fbi->fix.smem_len, ARCH_DMA_MINALIGN);
+
+#if CONFIG_IS_ENABLED(DM_VIDEO)
+       fbi->screen_base = (char *)gd->video_bottom;
+#else
        fbi->screen_base = (char *)memalign(ARCH_DMA_MINALIGN,
                                            fbi->fix.smem_len);
+#endif
+
        fbi->fix.smem_start = (unsigned long)fbi->screen_base;
        if (fbi->screen_base == 0) {
                puts("Unable to allocate framebuffer memory\n");
@@ -416,7 +426,9 @@ static int mxcfb_map_video_memory(struct fb_info *fbi)
 
        fbi->screen_size = fbi->fix.smem_len;
 
+#if CONFIG_IS_ENABLED(VIDEO)
        gd->fb_base = fbi->fix.smem_start;
+#endif
 
        /* Clear the screen */
        memset((char *)fbi->screen_base, 0, fbi->fix.smem_len);
@@ -611,3 +623,78 @@ int ipuv3_fb_init(struct fb_videomode const *mode,
 
        return 0;
 }
+
+#if CONFIG_IS_ENABLED(DM_VIDEO)
+enum {
+       /* Maximum display size we support */
+       LCD_MAX_WIDTH           = 1920,
+       LCD_MAX_HEIGHT          = 1080,
+       LCD_MAX_LOG2_BPP        = VIDEO_BPP16,
+};
+
+static int ipuv3_video_probe(struct udevice *dev)
+{
+       struct video_uc_platdata *plat = dev_get_uclass_platdata(dev);
+       struct video_priv *uc_priv = dev_get_uclass_priv(dev);
+       u32 fb_start, fb_end;
+       int ret;
+
+       debug("%s() plat: base 0x%lx, size 0x%x\n",
+             __func__, plat->base, plat->size);
+
+       ret = ipu_probe();
+       if (ret)
+               return ret;
+
+       ret = ipu_displays_init();
+       if (ret < 0)
+               return ret;
+
+       ret = mxcfb_probe(gpixfmt, gdisp, gmode);
+       if (ret < 0)
+               return ret;
+
+       uc_priv->xsize = gmode->xres;
+       uc_priv->ysize = gmode->yres;
+       uc_priv->bpix = LCD_MAX_LOG2_BPP;
+
+       /* Enable dcache for the frame buffer */
+       fb_start = plat->base & ~(MMU_SECTION_SIZE - 1);
+       fb_end = plat->base + plat->size;
+       fb_end = ALIGN(fb_end, 1 << MMU_SECTION_SHIFT);
+       mmu_set_region_dcache_behaviour(fb_start, fb_end - fb_start,
+                                       DCACHE_WRITEBACK);
+       video_set_flush_dcache(dev, true);
+
+       return 0;
+}
+
+struct ipuv3_video_priv {
+       ulong regs;
+};
+
+static int ipuv3_video_bind(struct udevice *dev)
+{
+       struct video_uc_platdata *plat = dev_get_uclass_platdata(dev);
+
+       plat->size = LCD_MAX_WIDTH * LCD_MAX_HEIGHT *
+                    (1 << LCD_MAX_LOG2_BPP) / 8;
+
+       return 0;
+}
+
+static const struct udevice_id ipuv3_video_ids[] = {
+       { .compatible = "fsl,imx6q-ipu" },
+       { }
+};
+
+U_BOOT_DRIVER(ipuv3_video) = {
+       .name   = "ipuv3_video",
+       .id     = UCLASS_VIDEO,
+       .of_match = ipuv3_video_ids,
+       .bind   = ipuv3_video_bind,
+       .probe  = ipuv3_video_probe,
+       .priv_auto_alloc_size = sizeof(struct ipuv3_video_priv),
+       .flags  = DM_FLAG_PRE_RELOC,
+};
+#endif /* CONFIG_DM_VIDEO */
index bd733f5f1ca5a221ed3844d53e816ceaac08c547..a587977c225045599aafe6b5c0b782ae3495041d 100644 (file)
@@ -39,6 +39,12 @@ struct pwm_backlight_priv {
        struct udevice *pwm;
        uint channel;
        uint period_ns;
+       /*
+        * the polarity of one PWM
+        * 0: normal polarity
+        * 1: inverted polarity
+        */
+       bool polarity;
        u32 *levels;
        int num_levels;
        uint default_level;
@@ -57,7 +63,10 @@ static int set_pwm(struct pwm_backlight_priv *priv)
                (priv->max_level - priv->min_level + 1);
        ret = pwm_set_config(priv->pwm, priv->channel, priv->period_ns,
                             duty_cycle);
+       if (ret)
+               return log_ret(ret);
 
+       ret = pwm_set_invert(priv->pwm, priv->channel, priv->polarity);
        return log_ret(ret);
 }
 
@@ -202,6 +211,8 @@ static int pwm_backlight_ofdata_to_platdata(struct udevice *dev)
                return log_msg_ret("Not enough arguments to pwm\n", -EINVAL);
        priv->channel = args.args[0];
        priv->period_ns = args.args[1];
+       if (args.args_count > 2)
+               priv->polarity = args.args[2];
 
        index = dev_read_u32_default(dev, "default-brightness-level", 255);
        cell = dev_read_prop(dev, "brightness-levels", &len);
index 2ca19d40491cedffec50f76e908a1f4905214eba..c31303b56edc3fe2f824f20c14f9fea4ae7c2b5d 100644 (file)
@@ -259,6 +259,43 @@ static void vidconsole_escape_char(struct udevice *dev, char ch)
        priv->escape = 0;
 
        switch (ch) {
+       case 'A':
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F': {
+               int row, col, num;
+               char *s = priv->escape_buf;
+
+               /*
+                * Cursor up/down: [%dA, [%dB, [%dE, [%dF
+                * Cursor left/right: [%dD, [%dC
+                */
+               s++;    /* [ */
+               s = parsenum(s, &num);
+               if (num == 0)                   /* No digit in sequence ... */
+                       num = 1;                /* ... means "move by 1". */
+
+               get_cursor_position(priv, &row, &col);
+               if (ch == 'A' || ch == 'F')
+                       row -= num;
+               if (ch == 'C')
+                       col += num;
+               if (ch == 'D')
+                       col -= num;
+               if (ch == 'B' || ch == 'E')
+                       row += num;
+               if (ch == 'E' || ch == 'F')
+                       col = 0;
+               if (col < 0)
+                       col = 0;
+               if (row < 0)
+                       row = 0;
+               /* Right and bottom overflows are handled in the callee. */
+               set_cursor_position(priv, row, col);
+               break;
+       }
        case 'H':
        case 'f': {
                int row, col;
@@ -309,6 +346,25 @@ static void vidconsole_escape_char(struct udevice *dev, char ch)
                }
                break;
        }
+       case 'K': {
+               struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
+               int mode;
+
+               /*
+                * Clear (parts of) current line
+                *   [0K       - clear line to end
+                *   [2K       - clear entire line
+                */
+               parsenum(priv->escape_buf + 1, &mode);
+
+               if (mode == 2) {
+                       int row, col;
+
+                       get_cursor_position(priv, &row, &col);
+                       vidconsole_set_row(dev, row, vid_priv->colour_bg);
+               }
+               break;
+       }
        case 'm': {
                struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
                char *s = priv->escape_buf;
@@ -360,6 +416,13 @@ static void vidconsole_escape_char(struct udevice *dev, char ch)
                                vid_priv->colour_fg = vid_console_color(
                                                vid_priv, vid_priv->fg_col_idx);
                                break;
+                       case 7:
+                               /* reverse video */
+                               vid_priv->colour_fg = vid_console_color(
+                                               vid_priv, vid_priv->bg_col_idx);
+                               vid_priv->colour_bg = vid_console_color(
+                                               vid_priv, vid_priv->fg_col_idx);
+                               break;
                        case 30 ... 37:
                                /* foreground color */
                                vid_priv->fg_col_idx &= ~7;
@@ -368,9 +431,11 @@ static void vidconsole_escape_char(struct udevice *dev, char ch)
                                                vid_priv, vid_priv->fg_col_idx);
                                break;
                        case 40 ... 47:
-                               /* background color */
+                               /* background color, also mask the bold bit */
+                               vid_priv->bg_col_idx &= ~0xf;
+                               vid_priv->bg_col_idx |= val - 40;
                                vid_priv->colour_bg = vid_console_color(
-                                                       vid_priv, val - 40);
+                                               vid_priv, vid_priv->bg_col_idx);
                                break;
                        default:
                                /* ignore unsupported SGR parameter */
@@ -392,6 +457,32 @@ error:
        priv->escape = 0;
 }
 
+/* Put that actual character on the screen (using the CP437 code page). */
+static int vidconsole_output_glyph(struct udevice *dev, char ch)
+{
+       struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
+       int ret;
+
+       /*
+        * Failure of this function normally indicates an unsupported
+        * colour depth. Check this and return an error to help with
+        * diagnosis.
+        */
+       ret = vidconsole_putc_xy(dev, priv->xcur_frac, priv->ycur, ch);
+       if (ret == -EAGAIN) {
+               vidconsole_newline(dev);
+               ret = vidconsole_putc_xy(dev, priv->xcur_frac, priv->ycur, ch);
+       }
+       if (ret < 0)
+               return ret;
+       priv->xcur_frac += ret;
+       priv->last_ch = ch;
+       if (priv->xcur_frac >= priv->xsize_frac)
+               vidconsole_newline(dev);
+
+       return 0;
+}
+
 int vidconsole_put_char(struct udevice *dev, char ch)
 {
        struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
@@ -429,23 +520,9 @@ int vidconsole_put_char(struct udevice *dev, char ch)
                priv->last_ch = 0;
                break;
        default:
-               /*
-                * Failure of this function normally indicates an unsupported
-                * colour depth. Check this and return an error to help with
-                * diagnosis.
-                */
-               ret = vidconsole_putc_xy(dev, priv->xcur_frac, priv->ycur, ch);
-               if (ret == -EAGAIN) {
-                       vidconsole_newline(dev);
-                       ret = vidconsole_putc_xy(dev, priv->xcur_frac,
-                                                priv->ycur, ch);
-               }
+               ret = vidconsole_output_glyph(dev, ch);
                if (ret < 0)
                        return ret;
-               priv->xcur_frac += ret;
-               priv->last_ch = ch;
-               if (priv->xcur_frac >= priv->xsize_frac)
-                       vidconsole_newline(dev);
                break;
        }
 
index f307cf243bdcb876b355b2e9c30990fbaf1bd318..14aac88d6d277576758ee3369bb4e76a179b8635 100644 (file)
@@ -136,6 +136,7 @@ void video_set_default_colors(struct udevice *dev, bool invert)
                back = temp;
        }
        priv->fg_col_idx = fore;
+       priv->bg_col_idx = back;
        priv->colour_fg = vid_console_color(priv, fore);
        priv->colour_bg = vid_console_color(priv, back);
 }
index 1cfeaa980fa52fc894bc3e2e38582aadaaef96e0..d7614329ffe75e5746fb068b9b18cb9f3a3b5484 100644 (file)
@@ -397,7 +397,7 @@ int video_edid_dtd_to_ctfb_res_modes(struct edid_detailed_timing *t,
            EDID_DETAILED_TIMING_VERTICAL_BLANKING(*t) == 0 ||
            EDID_DETAILED_TIMING_HSYNC_OFFSET(*t) == 0 ||
            EDID_DETAILED_TIMING_VSYNC_OFFSET(*t) == 0 ||
-           /* 3d formats are not supported*/
+           /* 3d formats are not supported */
            EDID_DETAILED_TIMING_FLAG_STEREO(*t) != 0)
                return -EINVAL;
 
index 34e78beb2a66f8f6d7afd54409e718f6902f08ba..9d7f503b698dc560eb67fd8958b16b1f8f21a0a7 100644 (file)
@@ -97,6 +97,7 @@ config WDT_BCM6345
 config WDT_ORION
        bool "Orion watchdog timer support"
        depends on WDT
+       select CLK
        help
           Select this to enable Orion watchdog timer, which can be found on some
           Marvell Armada chips.
index a0df02d10382bb369415ecbd1f3335dfce7ee4e6..885821d562ea1ae49eec315a33a6b22144648081 100644 (file)
@@ -14,7 +14,9 @@
 
 #include <common.h>
 #include <dm.h>
+#include <clk.h>
 #include <wdt.h>
+#include <linux/kernel.h>
 #include <asm/io.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/soc.h>
@@ -27,6 +29,8 @@ struct orion_wdt_priv {
        void __iomem *rstout;
        void __iomem *rstout_mask;
        u32 timeout;
+       unsigned long clk_rate;
+       struct clk clk;
 };
 
 #define RSTOUT_ENABLE_BIT              BIT(8)
@@ -44,17 +48,18 @@ static int orion_wdt_reset(struct udevice *dev)
        struct orion_wdt_priv *priv = dev_get_priv(dev);
 
        /* Reload watchdog duration */
-       writel(priv->timeout, priv->reg + priv->wdt_counter_offset);
+       writel(priv->clk_rate * priv->timeout,
+              priv->reg + priv->wdt_counter_offset);
 
        return 0;
 }
 
-static int orion_wdt_start(struct udevice *dev, u64 timeout, ulong flags)
+static int orion_wdt_start(struct udevice *dev, u64 timeout_ms, ulong flags)
 {
        struct orion_wdt_priv *priv = dev_get_priv(dev);
        u32 reg;
 
-       priv->timeout = (u32) timeout;
+       priv->timeout = DIV_ROUND_UP(timeout_ms, 1000);
 
        /* Enable the fixed watchdog clock input */
        reg = readl(priv->reg + TIMER_CTRL);
@@ -62,7 +67,8 @@ static int orion_wdt_start(struct udevice *dev, u64 timeout, ulong flags)
        writel(reg, priv->reg + TIMER_CTRL);
 
        /* Set watchdog duration */
-       writel(priv->timeout, priv->reg + priv->wdt_counter_offset);
+       writel(priv->clk_rate * priv->timeout,
+              priv->reg + priv->wdt_counter_offset);
 
        /* Clear the watchdog expiration bit */
        reg = readl(priv->reg + TIMER_A370_STATUS);
@@ -114,9 +120,7 @@ static inline bool save_reg_from_ofdata(struct udevice *dev, int index,
        fdt_addr_t addr;
        fdt_size_t off;
 
-       addr = fdtdec_get_addr_size_auto_noparent(
-               gd->fdt_blob, dev_of_offset(dev), "reg", index, &off, true);
-
+       addr = devfdt_get_addr_size_index(dev, index, &off);
        if (addr == FDT_ADDR_T_NONE)
                return false;
 
@@ -149,9 +153,18 @@ err:
 
 static int orion_wdt_probe(struct udevice *dev)
 {
+       struct orion_wdt_priv *priv = dev_get_priv(dev);
+       int ret;
+
        debug("%s: Probing wdt%u\n", __func__, dev->seq);
        orion_wdt_stop(dev);
 
+       ret = clk_get_by_name(dev, "fixed", &priv->clk);
+       if (!ret)
+               priv->clk_rate = clk_get_rate(&priv->clk);
+       else
+               priv->clk_rate = 25000000;
+
        return 0;
 }
 
index 3e85914d115399927379abd1ee4fd579a1c6f302..c9ab66cccc817910979f35699a8f8ffa6b5e1987 100644 (file)
@@ -130,6 +130,63 @@ config OF_LIST
          device tree files (without the directory or .dtb suffix)
          separated by <space>.
 
+choice
+       prompt "SPL OF LIST compression"
+       depends on MULTI_DTB_FIT
+       default MULTI_DTB_FIT_NO_COMPRESSION
+
+config MULTI_DTB_FIT_LZO
+       bool "LZO"
+       depends on SYS_MALLOC_F
+       select LZO
+       help
+         Compress the FIT image containing the DTBs available for the SPL
+         using LZO compression. (requires lzop on host).
+
+config MULTI_DTB_FIT_GZIP
+       bool "GZIP"
+       depends on SYS_MALLOC_F
+       select GZIP
+       help
+         Compress the FIT image containing the DTBs available for the SPL
+         using GZIP compression. (requires gzip on host)
+
+config MULTI_DTB_FIT_NO_COMPRESSION
+       bool "No compression"
+       help
+         Do not compress the FIT image containing the DTBs available for the SPL.
+         Use this options only if LZO is not available and the DTBs are very small.
+endchoice
+
+choice
+       prompt "Location of uncompressed DTBs"
+       depends on (MULTI_DTB_FIT_GZIP || MULTI_DTB_FIT_LZO)
+       default MULTI_DTB_FIT_DYN_ALLOC if SYS_MALLOC_F
+
+config MULTI_DTB_FIT_DYN_ALLOC
+       bool "Dynamically allocate the memory"
+       depends on SYS_MALLOC_F
+
+config MULTI_DTB_FIT_USER_DEFINED_AREA
+       bool "User-defined location"
+endchoice
+
+config MULTI_DTB_FIT_UNCOMPRESS_SZ
+       hex "Size of memory reserved to uncompress the DTBs"
+       depends on (MULTI_DTB_FIT_GZIP || MULTI_DTB_FIT_LZO)
+       default 0x8000
+       help
+          This is the size of this area where the DTBs are uncompressed.
+          If this area is dynamically allocated, make sure that
+          SYS_MALLOC_F_LEN is big enough to contain it.
+
+config MULTI_DTB_FIT_USER_DEF_ADDR
+       hex "Address of memory where dtbs are uncompressed"
+       depends on MULTI_DTB_FIT_USER_DEFINED_AREA
+       help
+          the FIT image containing the DTBs is uncompressed in an area defined
+          at compilation time. This is the address of this area. It must be
+          aligned on 2-byte boundary.
 
 config DTB_RESELECT
        bool "Support swapping dtbs at a later point in boot"
@@ -234,10 +291,10 @@ config SPL_MULTI_DTB_FIT_USER_DEF_ADDR
 config OF_SPL_REMOVE_PROPS
        string "List of device tree properties to drop for SPL"
        depends on SPL_OF_CONTROL
-       default "interrupt-parent" if SPL_PINCTRL && SPL_CLK
-       default "clocks clock-names interrupt-parent" if SPL_PINCTRL
-       default "pinctrl-0 pinctrl-names interrupt-parent" if SPL_CLK
-       default "pinctrl-0 pinctrl-names clocks clock-names interrupt-parent"
+       default "interrupt-parent interrupts" if SPL_PINCTRL && SPL_CLK
+       default "clocks clock-names interrupt-parent interrupts" if SPL_PINCTRL
+       default "pinctrl-0 pinctrl-names interrupt-parent interrupts" if SPL_CLK
+       default "pinctrl-0 pinctrl-names clocks clock-names interrupt-parent interrupts"
        help
          Since SPL normally runs in a reduced memory space, the device tree
          is cut down to only what is needed to load and start U-Boot. Only
index 29eda66fad846eadcd9a412b578f0800449fef19..d0b95f483d34cc4649c39f53355587f3a277fd0c 100644 (file)
@@ -26,7 +26,7 @@
 #if defined(CONFIG_CMD_SAVEENV) && defined(CONFIG_CMD_NAND) && \
                !defined(CONFIG_SPL_BUILD)
 #define CMD_SAVEENV
-#elif defined(CONFIG_ENV_OFFSET_REDUND)
+#elif defined(CONFIG_ENV_OFFSET_REDUND) && !defined(CONFIG_SPL_BUILD)
 #error CONFIG_ENV_OFFSET_REDUND must have CONFIG_CMD_SAVEENV & CONFIG_CMD_NAND
 #endif
 
index 7ef928bbe14ae07b8e474e317ae9aa4616bc0199..4ed09683b650a08468600dfc3dae3659dd22e100 100644 (file)
@@ -16,7 +16,4 @@
 #define CONFIG_BOOTM_RTEMS 1
 #define CONFIG_BOOTM_VXWORKS 1
 
-#define CONFIG_GZIP 1
-#define CONFIG_ZLIB 1
-
 #endif
index e2c70605b21fb18d811e8dad6e4c8082d16c6154..57edeee941e7e15fe241fa5d6562d8662f5c6e14 100644 (file)
@@ -34,8 +34,6 @@
 
 #define CONFIG_MXC_UART
 
-#define CONFIG_MXC_OCOTP
-
 /* SATA Configs */
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_DWC_AHSATA_PORT_ID      0
 
 /* Framebuffer */
 #ifdef CONFIG_VIDEO
-#define CONFIG_VIDEO_IPUV3
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_SPLASH_SCREEN
 #define CONFIG_SPLASH_SCREEN_ALIGN
index 3f7f379e06c4ff6d87652f9f6ec8f42d10f10910..3a515eef00e03b1a4f308386df755f4b91651e18 100644 (file)
@@ -39,7 +39,8 @@
 #define CONFIG_SYS_CLK_FREQ    RMOBILE_XTAL_CLK
 
 #define CONFIG_EXTRA_ENV_SETTINGS      \
-       "bootm_size=0x10000000\0"
+       "bootm_size=0x10000000\0"       \
+       "usb_pgood_delay=2000\0"
 
 /* SPL support */
 #define CONFIG_SPL_TEXT_BASE           0xe6300000
index 0834ff502193cf2e8dd26fe4b2abfc5e3cc8aa42..7721907d8f0db2ca3df5de7a2fe669548f36651a 100644 (file)
  * add mass storage support and for gadget we add both RNDIS ethernet
  * and DFU.
  */
-#define CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
 #define CONFIG_AM335X_USB0
 #define CONFIG_AM335X_USB0_MODE        MUSB_PERIPHERAL
 #define CONFIG_AM335X_USB1
diff --git a/include/configs/am335x_guardian.h b/include/configs/am335x_guardian.h
new file mode 100644 (file)
index 0000000..8bde198
--- /dev/null
@@ -0,0 +1,111 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * am335x_guardian_.h
+ *
+ * Copyright (C) 2018 Robert Bosch Power Tools GmbH
+ * Copyright (C) 2018 sjoerd Simons <sjoerd.simons@collabora.co.uk>
+ *
+ */
+
+#ifndef __CONFIG_AM335X_GUARDIAN_H
+#define __CONFIG_AM335X_GUARDIAN_H
+
+#include <configs/ti_am335x_common.h>
+
+#ifndef CONFIG_SPL_BUILD
+#define CONFIG_TIMESTAMP
+#endif
+
+/* Clock Defines */
+#define V_OSCK                         24000000  /* Clock output from T2 */
+#define V_SCLK                         (V_OSCK)
+
+#ifndef CONFIG_SPL_BUILD
+
+#define MEM_LAYOUT_ENV_SETTINGS \
+       "scriptaddr=0x80000000\0" \
+       "pxefile_addr_r=0x80100000\0" \
+       "kernel_addr_r=0x82000000\0" \
+       "fdt_addr_r=0x88000000\0" \
+       "ramdisk_addr_r=0x88080000\0" \
+
+#define BOOT_TARGET_DEVICES(func) \
+       func(MMC, mmc, 0) \
+       func(UBIFS, ubifs, 0) \
+       func(PXE, pxe, na) \
+       func(DHCP, dhcp, na)
+
+#define AM335XX_BOARD_FDTFILE "fdtfile=" CONFIG_DEFAULT_DEVICE_TREE ".dtb\0"
+
+#include <config_distro_bootcmd.h>
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       AM335XX_BOARD_FDTFILE \
+       MEM_LAYOUT_ENV_SETTINGS \
+       BOOTENV \
+       "bootlimit=3\0" \
+       "altbootcmd=" \
+               "setenv boot_config \"extlinux-rollback.conf\"; " \
+               "run distro_bootcmd\0"
+
+#endif /* CONFIG_SPL_BUILD */
+
+/* NS16550 Configuration */
+#define CONFIG_SYS_NS16550_COM1                0x44e09000      /* UART0 */
+#define CONFIG_SYS_NS16550_COM2                0x48022000      /* UART1 */
+#define CONFIG_SYS_NS16550_COM3                0x48024000      /* UART2 */
+#define CONFIG_SYS_NS16550_COM4                0x481a6000      /* UART3 */
+#define CONFIG_SYS_NS16550_COM5                0x481a8000      /* UART4 */
+#define CONFIG_SYS_NS16550_COM6                0x481aa000      /* UART5 */
+
+/* PMIC support */
+#define CONFIG_POWER_TPS65217
+
+/* Bootcount using the RTC block */
+#define CONFIG_SYS_BOOTCOUNT_LE
+
+#ifdef CONFIG_NAND
+#define CONFIG_ENV_OFFSET              0x300000
+#define CONFIG_ENV_OFFSET_REDUND       0x340000
+#define CONFIG_ENV_SIZE                        0x040000
+
+#define CONFIG_SYS_NAND_5_ADDR_CYCLE
+#define CONFIG_SYS_NAND_PAGE_COUNT      (CONFIG_SYS_NAND_BLOCK_SIZE / \
+                                       CONFIG_SYS_NAND_PAGE_SIZE)
+#define CONFIG_SYS_NAND_PAGE_SIZE       4096
+#define CONFIG_SYS_NAND_OOBSIZE         256
+#define CONFIG_SYS_NAND_BLOCK_SIZE      (256 * 1024)
+
+#define CONFIG_SYS_NAND_ECCPOS  {   2,   3,   4,   5,   6,   7,   8,   9, \
+                        10,  11,  12,  13,  14,  15,  16,  17,  18,  19, \
+                        20,  21,  22,  23,  24,  25,  26,  27,  28,  29, \
+                        30,  31,  32,  33,  34,  35,  36,  37,  38,  39, \
+                        40,  41,  42,  43,  44,  45,  46,  47,  48,  49, \
+                        50,  51,  52,  53,  54,  55,  56,  57,  58,  59, \
+                        60,  61,  62,  63,  64,  65,  66,  67,  68,  69, \
+                        70,  71,  72,  73,  74,  75,  76,  77,  78,  79, \
+                        80,  81,  82,  83,  84,  85,  86,  87,  88,  89, \
+                        90,  91,  92,  93,  94,  95,  96,  97,  98,  99, \
+                       100, 101, 102, 103, 104, 105, 106, 107, 108, 109, \
+                       110, 111, 112, 113, 114, 115, 116, 117, 118, 119, \
+                       120, 121, 122, 123, 124, 125, 126, 127, 128, 129, \
+                       130, 131, 132, 133, 134, 135, 136, 137, 138, 139, \
+                       140, 141, 142, 143, 144, 145, 146, 147, 148, 149, \
+                       150, 151, 152, 153, 154, 155, 156, 157, 158, 159, \
+                       160, 161, 162, 163, 164, 165, 166, 167, 168, 169, \
+                       170, 171, 172, 173, 174, 175, 176, 177, 178, 179, \
+                       180, 181, 182, 183, 184, 185, 186, 187, 188, 189, \
+                       190, 191, 192, 193, 194, 195, 196, 197, 198, 199, \
+                       200, 201, 202, 203, 204, 205, 206, 207, 208, 209, \
+                       }
+#define CONFIG_SYS_NAND_ECCSIZE         512
+#define CONFIG_SYS_NAND_ECCBYTES        26
+#define CONFIG_SYS_NAND_ONFI_DETECTION
+#define CONFIG_NAND_OMAP_ECCSCHEME      OMAP_ECC_BCH16_CODE_HW
+#define MTDIDS_DEFAULT                  "nand0=nand.0"
+
+#define CONFIG_SYS_NAND_BAD_BLOCK_POS   NAND_LARGE_BADBLOCK_POS
+
+#endif /* CONFIG_NAND */
+
+#endif /* ! __CONFIG_AM335X_GUARDIAN_H */
index 5a6080645a85b0d6e9e5aca46e890f2f0aa01e6f..37d058ebbc209200fcd049636847424c3e1893ab 100644 (file)
 #define CONFIG_ENV_OFFSET_REDUND       0x120000
 #endif
 
-/* SPI */
-#define CONFIG_TI_SPI_MMAP
-#define CONFIG_QSPI_SEL_GPIO                   48
-#define CONFIG_QSPI_QUAD_SUPPORT
-#define CONFIG_TI_EDMA3
-
 #ifndef CONFIG_SPL_BUILD
 #include <environment/ti/dfu.h>
 #include <environment/ti/mmc.h>
index 48999847ee9146ab13ed01112abf5616e20fbb6e..c14b010550fe0c11642ae54ebf6a8371e61fe472 100644 (file)
 #define CONFIG_SYS_SPI_ARGS_SIZE        0x80000
 
 /* SPI SPL */
-#define CONFIG_TI_EDMA3
 #define CONFIG_SYS_SPI_U_BOOT_OFFS     0x40000
 
-/* SPI */
-#define CONFIG_TI_SPI_MMAP
-#define CONFIG_QSPI_QUAD_SUPPORT
-
 #endif /* __CONFIG_AM57XX_EVM_H */
diff --git a/include/configs/ap152.h b/include/configs/ap152.h
new file mode 100644 (file)
index 0000000..c948a44
--- /dev/null
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2018 Rosy Song <rosysong@rosinson.com>
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define CONFIG_SYS_HZ                   1000
+#define CONFIG_SYS_MHZ                  375
+#define CONFIG_SYS_MIPS_TIMER_FREQ      (CONFIG_SYS_MHZ * 1000000)
+
+#define CONFIG_SYS_MONITOR_BASE         CONFIG_SYS_TEXT_BASE
+
+#define CONFIG_SYS_MALLOC_LEN           0x40000
+#define CONFIG_SYS_BOOTPARAMS_LEN       0x20000
+
+#define CONFIG_SYS_SDRAM_BASE           0x80000000
+#define CONFIG_SYS_LOAD_ADDR            0x81000000
+
+#define CONFIG_SYS_INIT_RAM_ADDR        0xbd000000
+#define CONFIG_SYS_INIT_RAM_SIZE        0x2000
+#define CONFIG_SYS_INIT_SP_ADDR \
+       (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE - 1)
+
+/*
+ * Serial Port
+ */
+#define CONFIG_SYS_NS16550_CLK          25000000
+#define CONFIG_SYS_BAUDRATE_TABLE \
+       {9600, 19200, 38400, 57600, 115200}
+
+#define CONFIG_BOOTCOMMAND              "sf probe;" \
+                                       "mtdparts default;" \
+                                       "bootm 0x9f060000"
+
+#define CONFIG_ENV_SPI_MAX_HZ           25000000
+#define CONFIG_ENV_OFFSET               0x40000
+#define CONFIG_ENV_SECT_SIZE            0x10000
+#define CONFIG_ENV_SIZE                 0x10000
+
+/* Miscellaneous configurable options */
+
+/*
+ * Diagnostics
+ */
+#define CONFIG_SYS_MEMTEST_START        0x80100000
+#define CONFIG_SYS_MEMTEST_END          0x83f00000
+
+#endif  /* __CONFIG_H */
index ba4e96da505f7885bcc28b20401de3652f3fc1ca..96169f55f08c6f7d87f69a5c98a26fd5e8c4bc96 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0+ */
 /*
- * Copyright 2013-2015 Toradex, Inc.
+ * Copyright 2013-2019 Toradex, Inc.
  *
  * Configuration settings for the Toradex Apalis iMX6
  */
 #define CONFIG_MXC_UART_BASE           UART1_BASE
 
 /* I2C Configs */
-#define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
-#define CONFIG_SYS_I2C_MXC_I2C1         /* enable I2C bus 1 */
-#define CONFIG_SYS_I2C_MXC_I2C2         /* enable I2C bus 2 */
-#define CONFIG_SYS_I2C_MXC_I2C3         /* enable I2C bus 3 */
+#define CONFIG_SYS_I2C_MXC_I2C1                /* enable I2C bus 1 */
+#define CONFIG_SYS_I2C_MXC_I2C2                /* enable I2C bus 2 */
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED           100000
-
-/* OCOTP Configs */
-#ifdef CONFIG_CMD_FUSE
-#define CONFIG_MXC_OCOTP
-#endif
+#define CONFIG_SYS_MXC_I2C3_SPEED      400000
 
 /* MMC Configs */
 #define CONFIG_FSL_USDHC
@@ -57,9 +52,6 @@
  * SATA Configs
  */
 #ifdef CONFIG_CMD_SATA
-#define CONFIG_SYS_SATA_MAX_DEVICE     1
-#define CONFIG_DWC_AHSATA_PORT_ID      0
-#define CONFIG_DWC_AHSATA_BASE_ADDR    SATA_ARB_BASE_ADDR
 #define CONFIG_LBA48
 #endif
 
 /* Client */
 #define CONFIG_USBD_HS
 
-#define CONFIG_USB_GADGET_MASS_STORAGE
-
 /* Framebuffer and LCD */
-#define CONFIG_VIDEO_IPUV3
-#define CONFIG_SYS_CONSOLE_IS_IN_ENV
 #define CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_SPLASH_SCREEN
 
 #define CONFIG_LOADADDR                        0x12000000
 
-#ifdef CONFIG_CMD_SATA
-#define CONFIG_DRIVE_SATA "sata "
-#else
-#define CONFIG_DRIVE_SATA
-#endif
-
-#ifdef CONFIG_CMD_MMC
-#define CONFIG_DRIVE_MMC "mmc "
-#else
-#define CONFIG_DRIVE_MMC
-#endif
-
-#define CONFIG_DRIVE_TYPES CONFIG_DRIVE_SATA CONFIG_DRIVE_MMC
+#ifndef CONFIG_SPL_BUILD
+#define BOOT_TARGET_DEVICES(func) \
+       func(MMC, mmc, 1) \
+       func(MMC, mmc, 2) \
+       func(USB, usb, 0) \
+       func(DHCP, dhcp, na)
+#include <config_distro_bootcmd.h>
+#undef BOOTENV_RUN_NET_USB_START
+#define BOOTENV_RUN_NET_USB_START ""
+#else /* CONFIG_SPL_BUILD */
+#define BOOTENV
+#endif /* CONFIG_SPL_BUILD */
 
 #define DFU_ALT_EMMC_INFO \
        "u-boot.imx raw 0x2 0x3ff mmcpart 0;" \
        "boot part 0 1;" \
        "rootfs part 0 2;" \
-       "uImage fat 0 1;" \
-       "imx6q-colibri-eval-v3.dtb fat 0 1;" \
-       "imx6q-colibri-cam-eval-v3.dtb fat 0 1"
+       "zImage fat 0 1;" \
+       "imx6q-apalis-eval.dtb fat 0 1;" \
+       "imx6q-apalis-cam-eval.dtb fat 0 1"
 
 #define EMMC_BOOTCMD \
-       "emmcargs=ip=off root=/dev/mmcblk0p2 rw,noatime rootfstype=ext3 " \
+       "emmcargs=ip=off root=/dev/mmcblk0p2 rw,noatime rootfstype=ext4 " \
                "rootwait\0" \
        "emmcboot=run setup; " \
                "setenv bootargs ${defargs} ${emmcargs} ${setupargs} " \
                "${vidargs}; echo Booting from internal eMMC chip...; " \
                "run emmcdtbload; load mmc 0:1 ${kernel_addr_r} " \
                "${boot_file} && run fdt_fixup && " \
-               "bootm ${kernel_addr_r} ${dtbparam}\0" \
+               "bootz ${kernel_addr_r} ${dtbparam}\0" \
        "emmcdtbload=setenv dtbparam; load mmc 0:1 ${fdt_addr_r} " \
                "${fdt_file} && setenv dtbparam \" - ${fdt_addr_r}\" && true\0"
 
        "fdt_high=0xffffffff\0" \
        "initrd_high=0xffffffff\0" \
        "kernel_addr_r=0x11000000\0" \
-       "ramdisk_addr_r=0x12100000\0"
+       "pxefile_addr_r=0x17100000\0" \
+       "ramdisk_addr_r=0x12100000\0" \
+       "scriptaddr=0x17000000\0"
 
 #define NFS_BOOTCMD \
        "nfsargs=ip=:::::eth0:on root=/dev/nfs rw\0" \
                "setenv bootargs ${defargs} ${nfsargs} ${setupargs} " \
                "${vidargs}; echo Booting via DHCP/TFTP/NFS...; " \
                "run nfsdtbload; dhcp ${kernel_addr_r} " \
-               "&& run fdt_fixup && bootm ${kernel_addr_r} ${dtbparam}\0" \
+               "&& run fdt_fixup && bootz ${kernel_addr_r} ${dtbparam}\0" \
        "nfsdtbload=setenv dtbparam; tftp ${fdt_addr_r} ${fdt_file} " \
                "&& setenv dtbparam \" - ${fdt_addr_r}\" && true\0"
 
-#define SD_BOOTCMD                                             \
-       "sdargs=ip=off root=/dev/mmcblk1p2 rw,noatime rootfstype=ext3 " \
+#define SD_BOOTCMD \
+       "sdargs=ip=off root=/dev/mmcblk1p2 rw,noatime rootfstype=ext4 " \
                "rootwait\0" \
        "sdboot=run setup; " \
                "setenv bootargs ${defargs} ${sdargs} ${setupargs} " \
                "${vidargs}; echo Booting from SD card; " \
                "run sddtbload; load mmc 1:1 ${kernel_addr_r} " \
                "${boot_file} && run fdt_fixup && " \
-               "bootm ${kernel_addr_r} ${dtbparam}\0" \
+               "bootz ${kernel_addr_r} ${dtbparam}\0" \
        "sddtbload=setenv dtbparam; load mmc 1:1 ${fdt_addr_r} " \
                "${fdt_file} && setenv dtbparam \" - ${fdt_addr_r}\" && true\0"
 
 #define USB_BOOTCMD \
-       "usbargs=ip=off root=/dev/sda2 rw,noatime rootfstype=ext3 " \
+       "usbargs=ip=off root=/dev/sda2 rw,noatime rootfstype=ext4 " \
                "rootwait\0" \
        "usbboot=run setup; setenv bootargs ${defargs} ${setupargs} " \
                "${usbargs} ${vidargs}; echo Booting from USB stick...; " \
                "usb start && run usbdtbload; load usb 0:1 ${kernel_addr_r} " \
                "${boot_file} && run fdt_fixup && " \
-               "bootm ${kernel_addr_r} ${dtbparam}\0" \
+               "bootz ${kernel_addr_r} ${dtbparam}\0" \
        "usbdtbload=setenv dtbparam; load usb 0:1 ${fdt_addr_r} " \
                "${fdt_file} && setenv dtbparam \" - ${fdt_addr_r}\" && true\0"
 
 #define FDT_FILE "imx6q-apalis_v1_0-eval.dtb"
 #endif
 #define CONFIG_EXTRA_ENV_SETTINGS \
+       BOOTENV \
        "bootcmd=run emmcboot ; echo ; echo emmcboot failed ; " \
-               "run nfsboot ; echo ; echo nfsboot failed ; " \
-               "usb start ;" \
+               "run distro_bootcmd ; " \
+               "usb start ; " \
                "setenv stdout serial,vga ; setenv stdin serial,usbkbd\0" \
-       "boot_file=uImage\0" \
+       "boot_file=zImage\0" \
        "console=ttymxc0\0" \
        "defargs=enable_wait_mode=off vmalloc=400M\0" \
        "dfu_alt_info=" DFU_ALT_EMMC_INFO "\0" \
        "setethupdate=if env exists ethaddr; then; else setenv ethaddr " \
                "00:14:2d:00:00:00; fi; tftpboot ${loadaddr} " \
                "flash_eth.img && source ${loadaddr}\0" \
-       "setsdupdate=setenv interface mmc; setenv drive 1; mmc rescan; load " \
-               "${interface} ${drive}:1 ${loadaddr} flash_blk.img && " \
+       "setsdupdate=setenv interface mmc; setenv drive 1; mmc rescan; " \
+               "load ${interface} ${drive}:1 ${loadaddr} flash_blk.img " \
+               "|| setenv drive 2; mmc rescan; load ${interface} ${drive}:1" \
+               " ${loadaddr} flash_blk.img && " \
                "source ${loadaddr}\0" \
        "setup=setenv setupargs fec_mac=${ethaddr} " \
                "consoleblank=0 no_console_suspend=1 console=tty1 " \
        (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
 
 /* environment organization */
-
 #define CONFIG_ENV_SIZE                        (8 * 1024)
 
 #if defined(CONFIG_ENV_IS_IN_MMC)
 #define CONFIG_SYS_MMC_ENV_PART                1
 #endif
 
-#define CONFIG_OF_SYSTEM_SETUP
-
 #define CONFIG_CMD_TIME
 
 #endif /* __CONFIG_H */
index 4f28f524020ebfb85f7bcbcb3671fde9470436ef..a24814673c5fba64c64973366b890e359f11e9b2 100644 (file)
 /* UBI support */
 
 /* Framebuffer */
-#define CONFIG_VIDEO_IPUV3
 /* check this console not needed, after test remove it */
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_SPLASH_SCREEN
index ccbdc0a335664787fdccbbae10fec1d7d2b679b3..98ec0d626ea873fdabe099a9cc8e7798dd4b2019 100644 (file)
  * add mass storage support and for gadget we add both RNDIS ethernet
  * and DFU.
  */
-#define CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
 #define CONFIG_AM335X_USB0
 #define CONFIG_AM335X_USB0_MODE        MUSB_HOST
 #define CONFIG_AM335X_USB1
index fb9c2a6d04d0e143238eed355f4ffe0cec4f9b3d..3d4d08aa70e10645fde27682a703e2f03ab7344c 100644 (file)
@@ -387,7 +387,6 @@ DEFAULT_LINUX_BOOT_ENV \
  * add mass storage support and for gadget we add both RNDIS ethernet
  * and DFU.
  */
-#define CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
 #define CONFIG_AM335X_USB0
 #define CONFIG_AM335X_USB0_MODE        MUSB_PERIPHERAL
 #define CONFIG_AM335X_USB1
index a012705870f782446fd4cb5b06bab705714b9b27..05ebb7d9c5cf44a9bcc52275ca5221de6c42a6eb 100644 (file)
 /* SPDX-License-Identifier: GPL-2.0+ */
 /*
+ * Copyright (C) 2018
+ * Lukasz Majewski, DENX Software Engineering, lukma@denx.de
+ *
  * Copyright 2016 3ADEV <http://3adev.com>
  * Written-by: Albert ARIBAUD <albert.aribaud@3adev.fr>
  *
- * Configuration settings for the phytec PCM-052 SoM-based BK4R1.
+ * Configuration settings for BK4R1.
  */
 
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
 /* Define the BK4r1-specific env commands */
-#define PCM052_EXTRA_ENV_SETTINGS \
+#define BK4_EXTRA_ENV_SETTINGS \
+       "bootlimit=3\0" \
+       "eraseuserdata=false\0" \
+       "altbootcmd=led 5 on; " \
+               "boot\0" \
        "set_gpio103=mw 0x400ff0c4 0x0080; mw 0x4004819C 0x000011bf\0" \
-       "set_gpio122=mw 0x400481e8 0x0282; mw 0x400ff0c4 0x04000000\0"
+       "set_gpio102=mw 0x400ff0c4 0x40; mw 0x40048198 0x000011bf\0" \
+       "set_gpio96=mw 0x40048180 0x282; mw 0x400ff0c4 0x1\0"\
+       "set_gpio122=mw 0x400481e8 0x0282; mw 0x400ff0c4 0x04000000\0"\
+       "set_gpio6=mw 0x40048018 0x282; mw 0x400ff008 0x40\0"\
+       "manage_userdata=" MANAGE_USERDATA "\0"\
+       "ncenable=true\0"\
+       "ncserverip=192.168.0.77\0"\
+       "if_netconsole=ping $ncserverip\0"\
+       "start_netconsole=setenv ncip $serverip; setenv bootdelay 10;" \
+            "setenv stdin nc; setenv stdout nc; setenv stderr nc; version;\0" \
+       "preboot=" BK4_NET_INIT \
+               "if ${ncenable}; then run if_netconsole start_netconsole; fi\0"
 
 /* BK4r1 boot command sets GPIO103/PTC30 to force USB hub out of reset*/
-#define PCM052_BOOTCOMMAND "run set_gpio103; sf probe; "
+#define BK4_BOOTCOMMAND "run set_gpio122; run set_gpio96; sf probe; " \
+                       "run manage_userdata; "
+
+/* Enable PREBOOT variable */
+#define CONFIG_PREBOOT
+
+/* Set ARP_TIMEOUT to 500ms */
+#define CONFIG_ARP_TIMEOUT 500UL
+
+/* Set ARP_TIMEOUT_COUNT to 3 repetitions */
+#define CONFIG_NET_RETRY_COUNT 5
 
 /* BK4r1 net init sets GPIO122/PTE17 to enable Ethernet */
-#define PCM052_NET_INIT "run set_gpio122; "
+#define BK4_NET_INIT "run set_gpio122;"
+
+/* Check if userdata volume shall be erased */
+#define MANAGE_USERDATA "if ${eraseuserdata}; " \
+                                               "then ubi part system; " \
+                                               "ubi remove userdata; " \
+                                               "ubi create userdata; " \
+                                               "ubi detach; " \
+                                               "setenv eraseuserdata false; " \
+                                               "saveenv; " \
+                                               "fi; "
+
+/* Autoboot options */
+#define CONFIG_AUTOBOOT_KEYED
+#define CONFIG_AUTOBOOT_PROMPT \
+       "Enter passphrase to stop autoboot, booting in %d seconds\n"
+#define CONFIG_AUTOBOOT_STOP_STR "123"
+
+#include <asm/arch/imx-regs.h>
+#include <linux/sizes.h>
+
+#define CONFIG_SKIP_LOWLEVEL_INIT
+
+/* Enable passing of ATAGs */
+#define CONFIG_CMDLINE_TAG
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 4 * SZ_1M)
+
+/* Allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+
+/* NAND support */
+#define CONFIG_SYS_NAND_ONFI_DETECTION
+#define CONFIG_SYS_MAX_NAND_DEVICE 1
+
+#define IMX_FEC1_BASE                  ENET1_BASE_ADDR
+
+/* QSPI Configs*/
+#ifdef CONFIG_FSL_QSPI
+#define FSL_QSPI_FLASH_SIZE            (SZ_16M)
+#define FSL_QSPI_FLASH_NUM             2
+#define CONFIG_SYS_FSL_QSPI_LE
+#endif
+
+#define CONFIG_LOADADDR        0x82000000
+
+/* We boot from the gfxRAM area of the OCRAM. */
+#define CONFIG_BOARD_SIZE_LIMIT                520192
+
+/* boot command, including the target-defined one if any */
+#define CONFIG_BOOTCOMMAND     BK4_BOOTCOMMAND "run bootcmd_nand"
+
+/* Extra env settings (including the target-defined ones if any) */
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       BK4_EXTRA_ENV_SETTINGS \
+       "autoload=no\0" \
+       "fdt_high=0xffffffff\0" \
+       "initrd_high=0xffffffff\0" \
+       "blimg_file=u-boot.vyb\0" \
+       "blimg_addr=0x81000000\0" \
+       "dtbkernel_file=fitImage\0" \
+       "dtbkernel_addr=0x82000000\0" \
+       "ram_file=uRamdisk\0" \
+       "ram_addr=0x83000000\0" \
+       "filesys=rootfs.ubifs\0" \
+       "sys_addr=0x81000000\0" \
+       "nfs_root=/path/to/nfs/root\0" \
+       "tftptimeout=1000\0" \
+       "tftptimeoutcountmax=1000000\0" \
+       "mtdparts=" CONFIG_MTDPARTS_DEFAULT "\0" \
+       "ipaddr=192.168.0.60\0" \
+       "serverip=192.168.0.1\0" \
+       "bootargs_base=setenv bootargs rw " \
+       "console=ttyLP1,115200n8\0" \
+       "bootargs_sd=setenv bootargs ${bootargs} " \
+               "root=/dev/mmcblk0p2 rootwait\0" \
+       "bootargs_nand=setenv bootargs ${bootargs} " \
+               "ubi.mtd=5 rootfstype=" \
+                               "ubifs root=ubi0:rootfs${active_workset}\0" \
+       "bootargs_ram=setenv bootargs ${bootargs} " \
+               "root=/dev/ram rw initrd=${ram_addr}\0" \
+       "bootargs_mtd=setenv bootargs ${bootargs} ${mtdparts}\0" \
+       "bootcmd_sd=run bootargs_base bootargs_sd bootargs_mtd; " \
+               "fatload mmc 0:2 ${dtbkernel_addr} ${dtbkernel_file}; " \
+               "bootm ${dtbkernel_addr}\0" \
+       "bootcmd_nand=sf probe;run bootargs_base bootargs_nand bootargs_mtd; " \
+               "ubi part dtbkernel; " \
+               "ubi readvol ${dtbkernel_addr} dtbkernel${active_workset}; " \
+               "led 0 on; " \
+               "bootm ${dtbkernel_addr}\0" \
+       "bootcmd_ram=run bootargs_base bootargs_ram bootargs_mtd; " \
+               "nand read ${fdt_addr} dtb; " \
+               "nand read ${kernel_addr} kernel; " \
+               "nand read ${ram_addr} root; " \
+               "bootz ${kernel_addr} ${ram_addr} ${fdt_addr}\0" \
+       "update_bootloader_from_sd=if fatload mmc 0:2 ${blimg_addr} " \
+               "${blimg_file}; " \
+               "then sf probe; " \
+               "mtdparts default; " \
+               "nand erase.part bootloader; " \
+               "nand write ${blimg_addr} bootloader ${filesize}; fi\0" \
+       "update_bootloader_from_tftp=if tftp ${blimg_addr} "\
+               "${tftpdir}${blimg_file}; "\
+               "then sf probe; " \
+               "mtdparts default; " \
+               "nand erase.part bootloader; " \
+               "nand write ${blimg_addr} bootloader ${filesize}; fi\0" \
+       "update_dtbkernel_from_sd=if fatload mmc 0:2 ${dtbkernel_addr} " \
+               "${dtbkernel_file}; " \
+               "then sf probe; " \
+               "ubi part dtbkernel; " \
+               "ubi write ${dtbkernel_addr} dtbkernel${active_workset} " \
+               "${filesize}; " \
+               "ubi detach; fi\0" \
+       "update_dtbkernel_from_tftp=if tftp ${dtbkernel_addr} " \
+               "${tftpdir}${dtbkernel_file}; " \
+               "then sf probe; " \
+               "ubi part dtbkernel; " \
+               "ubi write ${dtbkernel_addr} dtbkernel${active_workset} " \
+               "${filesize}; " \
+               "ubi detach; fi\0" \
+       "update_ramdisk_from_sd=if fatload mmc 0:2 ${ram_addr} " \
+               "${ram_file}; " \
+               "then sf probe; " \
+               "mtdparts default; " \
+               "nand erase.part initrd; " \
+               "nand write ${ram_addr} initrd ${filesize}; fi\0" \
+       "update_ramdisk_from_tftp=if tftp ${ram_addr} ${tftpdir}${ram_file}; " \
+               "then sf probe; " \
+               "nand erase.part initrd; " \
+               "nand write ${ram_addr} initrd ${filesize}; fi\0" \
+       "update_rootfs_from_sd=if fatload mmc 0:2 ${sys_addr} " \
+               "${filesys}; " \
+               "then sf probe; " \
+               "ubi part system; " \
+               "ubi write ${sys_addr} rootfs${active_workset} ${filesize}; " \
+               "ubi detach; fi\0" \
+       "update_rootfs_from_tftp=if tftp ${sys_addr} ${tftpdir}${filesys}; " \
+               "then sf probe; " \
+               "ubi part system; " \
+               "ubi write ${sys_addr} rootfs${active_workset} ${filesize}; " \
+               "ubi detach; fi\0" \
+       "setup_dtbkernel=nand erase.part dtbkernel; " \
+               "ubi part dtbkernel; " \
+               "ubi create dtbkernel1 972000 s; " \
+               "ubi create dtbkernel2 972000 s; " \
+               "ubi detach\0" \
+       "setup_system=nand erase.part system; " \
+               "ubi part system; " \
+               "ubi create rootfs1 15E15000 d; " \
+               "ubi create rootfs2 15E15000 d; " \
+               "ubi create userdata; " \
+               "ubi detach\0" \
+       "setup_nor1=" BK4_NET_INIT \
+               "if tftp ${sys_addr} ${tftpdir}ubinor1.img; " \
+               "then sf probe 0:0; " \
+               "sf erase 0 01000000; " \
+               "mtdparts default; " \
+               "ubi part nor; " \
+               "ubi create nor1fs; " \
+               "ubi write ${sys_addr} nor1fs ${filesize}; " \
+               "ubi detach; fi\0" \
+       "setup_nor2=" BK4_NET_INIT \
+               "if tftp ${sys_addr} ${tftpdir}ubinor2.img; " \
+               "then sf probe 0:1; " \
+               "sf erase 0 01000000; " \
+               "mtdparts default; " \
+               "ubi part nor; " \
+               "ubi create nor2fs; " \
+               "ubi write ${sys_addr} nor2fs ${filesize}; " \
+               "ubi detach; fi\0" \
+       "prepare_install_bk4r1_envs=" \
+               "echo 'Preparing envs for SD card recovery!';" \
+               "setenv ipaddr 192.168.0.99;" \
+               "setenv serverip 192.168.0.50;" \
+               "\0" \
+       "install_bk4r1rs="\
+               "led 0 on; " \
+               "nand erase.chip; mtdparts default; "\
+               "led 1 on; "\
+               "run setup_dtbkernel; " \
+               "run setup_system; " \
+               "led 2 on;" \
+               "run update_bootloader_from_sd; "\
+               "run update_dtbkernel_from_sd; "\
+               "run update_rootfs_from_sd; "\
+               "setenv bootcmd 'run bootcmd_nand'; "\
+               "saveenv; " \
+               "led 3 on; " \
+               "echo Finished - Please Power off, REMOVE SDCARD and set boot" \
+                       "source to NAND\0" \
+       "active_workset=1\0"
+
+/* Miscellaneous configurable options */
+
+#define CONFIG_SYS_MEMTEST_START       0x80010000
+#define CONFIG_SYS_MEMTEST_END         0x87C00000
+
+#define CONFIG_SYS_LOAD_ADDR           CONFIG_LOADADDR
+
+/* Physical memory map */
+#define PHYS_SDRAM                     (0x80000000)
+#define PHYS_SDRAM_SIZE                (SZ_512M)
+
+#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM
+#define CONFIG_SYS_INIT_RAM_ADDR       IRAM_BASE_ADDR
+#define CONFIG_SYS_INIT_RAM_SIZE       IRAM_SIZE
 
-/* add NOR to MTD env */
+#define CONFIG_SYS_INIT_SP_OFFSET \
+       (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
+#define CONFIG_SYS_INIT_SP_ADDR \
+       (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
 
-/* now include standard PCM052 config */
+#ifdef CONFIG_ENV_IS_IN_NAND
+#define CONFIG_ENV_SECT_SIZE   (SZ_128K)
+#define CONFIG_ENV_SIZE                (SZ_8K)
+#define CONFIG_ENV_OFFSET      0x200000
+#define CONFIG_ENV_SIZE_REDUND (SZ_8K)
+#define CONFIG_ENV_OFFSET_REDUND       0x220000
+#endif
 
-#include "configs/pcm052.h"
+#endif /* __CONFIG_H */
index 5834e1e2a2df4dd6a330e535015bcaae75684936..2de6f2186170c0839d29c6905b71c385c7209e97 100644 (file)
 
 #define CONFIG_SKIP_LOWLEVEL_INIT
 
+#ifdef CONFIG_NAND
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+#define CONFIG_SYS_NAND_SELF_INIT
+#define CONFIG_SYS_NAND_ONFI_DETECTION
+#define CONFIG_SYS_NAND_DRIVER_ECC_LAYOUT
+#endif /* CONFIG_NAND */
+
 /*
  * bcm963158
  */
index 6126a8879eeca4bcd013184146b0e245df3b8fa2..355f3ef5be5e8fa30a068ec6c8d7520faebff971 100644 (file)
@@ -7,3 +7,10 @@
 #include <configs/bmips_bcm6838.h>
 
 #define CONFIG_ENV_SIZE                        (8 * 1024)
+
+#ifdef CONFIG_NAND
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+#define CONFIG_SYS_NAND_SELF_INIT
+#define CONFIG_SYS_NAND_ONFI_DETECTION
+#define CONFIG_SYS_NAND_DRIVER_ECC_LAYOUT
+#endif /* CONFIG_NAND */
index 1c0945e140f3f79e43e270c731d052c1c4408015..52b4f55f7c5fe2ef40f16356a2c192f49bf8c420 100644 (file)
 
 #define CONFIG_SKIP_LOWLEVEL_INIT
 
+#ifdef CONFIG_NAND
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+#define CONFIG_SYS_NAND_SELF_INIT
+#define CONFIG_SYS_NAND_ONFI_DETECTION
+#define CONFIG_SYS_NAND_DRIVER_ECC_LAYOUT
+#endif /* CONFIG_NAND */
+
 /*
  * 968580xref
  */
index ae9b75bb87ad0c65a101b1efe60f444d9bd14570..84c801d10a992faa20a623f511a3a2692e27c47a 100644 (file)
@@ -182,9 +182,6 @@ NANDTGTS \
 #define CONFIG_NAND_OMAP_GPMC_WSCFG    1
 #endif /* CONFIG_NAND */
 
-/* USB configuration */
-#define CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
-
 #if defined(CONFIG_SPI)
 /* SPI Flash */
 #define CONFIG_SYS_SPI_U_BOOT_OFFS             0x40000
index 601b30dffd5fa9661920bf684e4fb4cd52a95ee4..7309e7d4831d2401467b73d60fe781733a7b4764 100644 (file)
@@ -68,9 +68,6 @@ BUR_COMMON_ENV \
 #define CONFIG_SETUP_MEMORY_TAGS
 #define CONFIG_INITRD_TAG
 
-/* USB configuration */
-#define CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
-
 /* Environment */
 #define CONFIG_SYS_MMC_ENV_DEV         1
 #define CONFIG_SYS_MMC_ENV_PART                2
index ad0a64a93686fd6d650c88907e4355474349859b..07c6409e8fb364811f4236dc4c708d1db2bbd5ca 100644 (file)
@@ -60,7 +60,6 @@
 #define CONFIG_USBD_HS
 
 /* Framebuffer */
-#define CONFIG_VIDEO_IPUV3
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_SPLASH_SCREEN
 #define CONFIG_SPLASH_SCREEN_ALIGN
index 4372280d2bbe7ae63f36be47c71485e919c99b20..db990fcb2b474df294bfc7f1f93fb1ed9be3c8af 100644 (file)
 
 /* USB configuration */
 #define CONFIG_ARCH_MISC_INIT
-#define CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
 #define CONFIG_AM335X_USB1
 #define CONFIG_AM335X_USB1_MODE MUSB_HOST
 
diff --git a/include/configs/cl-som-am57x.h b/include/configs/cl-som-am57x.h
deleted file mode 100644 (file)
index bf2bb44..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Configuration settings for CompuLab CL-SOM-AM57x board
- *
- * (C) Copyright 2016 CompuLab, Ltd. http://compulab.co.il/
- *
- * Author: Dmitry Lifshitz <lifshitz@compulab.co.il>
- */
-
-#ifndef __CONFIG_CL_SOM_AM57X_H
-#define __CONFIG_CL_SOM_AM57X_H
-
-#define CONSOLEDEV                     "ttyO2"
-#define CONFIG_SYS_NS16550_COM3                UART3_BASE      /* UART3 */
-
-#define CONFIG_SYS_OMAP_ABE_SYSCK
-
-#define PARTS_DEFAULT
-
-#include <configs/ti_omap5_common.h>
-
-/* misc */
-#define CONFIG_REVISION_TAG
-
-/* PMIC I2C bus number */
-#define CONFIG_SYS_SPD_BUS_NUM 3
-
-/* SPI Flash support */
-#define CONFIG_TI_SPI_MMAP
-
-/* SPI SPL defines */
-/* Offsets: 0K - SPL1, 64K - SPL2, 128K - SPL3, 192K - SPL4, 256K - U-Boot */
-#define CONFIG_SYS_SPI_U_BOOT_OFFS     (256 * 1024)
-#define CONFIG_SPL_SPI_SUPPORT
-
-/* SD/MMC RAW/FS boot */
-#define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME "u-boot.img"
-#define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION 1
-
-/* Environment */
-#define CONFIG_ENV_SIZE                        (16 << 10) /* 16 KiB env size */
-
-#define CONFIG_ENV_SECT_SIZE           (64 * 1024)
-#define CONFIG_ENV_OFFSET              (768 * 1024)
-
-/* EEPROM */
-#define CONFIG_SYS_I2C_EEPROM_ADDR      0x50
-#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN  1
-#define CONFIG_SYS_I2C_EEPROM_BUS       3
-
-#define CONFIG_ENV_EEPROM_IS_ON_I2C
-#define CONFIG_SYS_EEPROM_SIZE         256
-
-#ifndef CONFIG_SPL_BUILD
-/* SATA */
-#define CONFIG_SCSI_AHCI_PLAT
-#define CONFIG_SYS_SCSI_MAX_SCSI_ID    1
-#define CONFIG_SYS_SCSI_MAX_LUN                1
-#define CONFIG_SYS_SCSI_MAX_DEVICE     (CONFIG_SYS_SCSI_MAX_SCSI_ID * \
-                                               CONFIG_SYS_SCSI_MAX_LUN)
-/* PCA9555 GPIO expander support */
-#define CONFIG_PCA953X
-#define CONFIG_SYS_I2C_PCA953X_ADDR     0x20
-#define CONFIG_SYS_I2C_PCA953X_WIDTH    { {0x20, 16} }
-
-#endif /* !CONFIG_SPL_BUILD */
-
-/* USB xHCI HOST */
-#define CONFIG_USB_XHCI_OMAP
-
-#define CONFIG_OMAP_USB3PHY1_HOST
-
-/* USB Networking options */
-
-/* CPSW Ethernet */
-#define CONFIG_BOOTP_DEFAULT
-#define CONFIG_BOOTP_SEND_HOSTNAME
-#define CONFIG_PHY_ATHEROS
-#define CONFIG_SYS_RX_ETH_BUFFER       64
-#define PHY_ANEG_TIMEOUT               8000
-
-#define CONFIG_BOOTP_DNS2
-#define CONFIG_NET_RETRY_COUNT         10
-
-/* Default environment */
-#undef CONFIG_EXTRA_ENV_SETTINGS
-#define CONFIG_EXTRA_ENV_SETTINGS \
-       DEFAULT_LINUX_BOOT_ENV \
-       "autoload=no\0" \
-       "baudrate=115200\0" \
-       "console=ttyO2,115200n8\0" \
-       "bootdelay=3\0" \
-       "fdtfile=am57xx-sbc-am57x.dtb\0" \
-       "kernel=zImage-cl-som-am57x\0" \
-       "bootscr=bootscr.img\0" \
-       "displaytype=hdmi\0" \
-       "bootkernel=bootz ${loadaddr} - ${fdtaddr}\0" \
-       "mmcloadfdt=load mmc ${mmcdev} ${fdtaddr} ${fdtfile}\0" \
-       "mmcloadkernel=load mmc ${mmcdev} ${loadaddr} ${kernel}\0" \
-       "emmcloadfdt=load mmc ${mmcdev} ${fdtaddr} ${fdtfile}\0" \
-       "emmcloadkernel=load mmc ${mmcdev} ${loadaddr} ${kernel}\0" \
-       "load_mmc=mmc dev ${mmcdev} && mmc rescan && " \
-               "run mmcloadkernel && run mmcloadfdt\0" \
-       "mmcroot=/dev/mmcblk1p2\0" \
-       "mmcrootfstype=ext4 rw rootwait\0" \
-       "mmcargs=setenv bootargs console=${console} root=${mmcroot} " \
-               "rootfstype=${mmcrootfstype}\0" \
-       "mmcbootscript=setenv mmcdev 0; mmc dev ${mmcdev} && mmc rescan && " \
-               "load mmc ${mmcdev} ${loadaddr} ${bootscr} && " \
-               "echo Running bootscript from MMC/SD Card ... && " \
-               "source ${loadaddr}\0" \
-       "mmcboot=setenv mmcdev 0 && run load_mmc && " \
-               "run mmcargs && echo Booting from MMC/SD Card ... && " \
-               "run bootkernel\0" \
-       "emmcroot=/dev/mmcblk0p2\0" \
-       "emmcrootfstype=ext4 rw rootwait\0" \
-       "emmcargs=setenv bootargs console=${console} " \
-               "root=${emmcroot} " \
-               "rootfstype=${emmcrootfstype}\0" \
-       "emmcbootscript=setenv mmcdev 1; mmc dev ${mmcdev} && mmc rescan && " \
-               "load mmc ${mmcdev} ${loadaddr} ${bootscr} && " \
-               "echo Running bootscript from eMMC ... && " \
-               "source ${loadaddr}\0" \
-       "emmcboot=setenv mmcdev 1 && run load_mmc && " \
-               "run emmcargs && echo Booting from eMMC ... && " \
-               "run bootkernel\0" \
-       "sataroot=/dev/sda2\0" \
-       "satarootfstype=ext4 rw rootwait\0" \
-       "load_sata=load scsi 0 ${loadaddr} ${kernel} && " \
-               "load scsi 0 ${fdtaddr} ${fdtfile}\0" \
-       "sataargs=setenv bootargs console=${console} " \
-               "root=${sataroot} " \
-               "rootfstype=${satarootfstype}\0" \
-       "satabootscript=load scsi 0 ${loadaddr} ${bootscr} && " \
-               "echo Running bootscript from SATA ... && " \
-               "source ${loadaddr}\0" \
-       "sataboot=run load_sata && run sataargs && " \
-               "echo Booting from SATA ... && " \
-               "run bootkernel\0"
-
-#undef CONFIG_BOOTCOMMAND
-#define CONFIG_BOOTCOMMAND \
-       "run mmcbootscript || run mmcboot || " \
-       "run satabootscript || run sataboot || " \
-       "run emmcbootscript || run emmcboot"
-
-
-#endif /* __CONFIG_CL_SOM_AM57X_H */
index c51cf284502b922961538ffd04554d1a60818c46..9f8d3cc9e5e8cd9f0b49fd2e7389d55c0f84c8d2 100644 (file)
@@ -21,8 +21,6 @@
  * Commands configuration
  */
 
-/* SPI NOR flash default params, used by sf commands */
-
 /*
  * SDIO/MMC Card Configuration
  */
index dfd96ff8d59a60530f29e2c3e108baaf7bab99ef..2e8dda8ab855761b05ba0cc6f5f85672fc881987 100644 (file)
 #define CONFIG_SYS_SPI_U_BOOT_OFFS     (64 * 1024)
 
 /* Display */
-#define CONFIG_VIDEO_IPUV3
 #define CONFIG_IMX_HDMI
 
 #define CONFIG_SPLASH_SCREEN
index ffe4a44c869adb77b35bdc36227b760dd17f8194..e4e37e5bbbf3f7844b705ee6c00a15d1965f68f6 100644 (file)
@@ -53,9 +53,6 @@
 #define CONFIG_USB_XHCI_OMAP
 #define CONFIG_AM437X_USB2PHY2_HOST
 
-/* SPI Flash support */
-#define CONFIG_TI_SPI_MMAP
-
 /* Power */
 #define CONFIG_POWER
 #define CONFIG_POWER_I2C
index 2d40ceb24e96db2c29319b3ea23343e0236b2bfc..803c9be0646b5854c40cfd9e26e605982cb25efe 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0+ */
 /*
- * Copyright 2013-2015 Toradex, Inc.
+ * Copyright 2013-2019 Toradex, Inc.
  *
  * Configuration settings for the Toradex Colibri iMX6
  */
 #define CONFIG_MXC_UART_BASE           UART1_BASE
 
 /* I2C Configs */
-#define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
-#define CONFIG_SYS_I2C_MXC_I2C1         /* enable I2C bus 1 */
-#define CONFIG_SYS_I2C_MXC_I2C2         /* enable I2C bus 2 */
-#define CONFIG_SYS_I2C_MXC_I2C3         /* enable I2C bus 3 */
+#define CONFIG_SYS_I2C_MXC_I2C1                /* enable I2C bus 1 */
+#define CONFIG_SYS_I2C_MXC_I2C2                /* enable I2C bus 2 */
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED           100000
-
-/* OCOTP Configs */
-#ifdef CONFIG_CMD_FUSE
-#define CONFIG_MXC_OCOTP
-#endif
+#define CONFIG_SYS_MXC_I2C3_SPEED      400000
 
 /* MMC Configs */
 #define CONFIG_FSL_USDHC
 /* Client */
 #define CONFIG_USBD_HS
 
-#define CONFIG_USB_GADGET_MASS_STORAGE
-
 /* Framebuffer and LCD */
-#define CONFIG_VIDEO_IPUV3
-#define CONFIG_SYS_CONSOLE_IS_IN_ENV
 #define CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_SPLASH_SCREEN
 
 #define CONFIG_LOADADDR                        0x12000000
 
-#ifdef CONFIG_CMD_MMC
-#define CONFIG_DRIVE_MMC "mmc "
-#else
-#define CONFIG_DRIVE_MMC
-#endif
-
-#define CONFIG_DRIVE_TYPES CONFIG_DRIVE_MMC
+#ifndef CONFIG_SPL_BUILD
+#define BOOT_TARGET_DEVICES(func) \
+       func(MMC, mmc, 1) \
+       func(USB, usb, 0) \
+       func(DHCP, dhcp, na)
+#include <config_distro_bootcmd.h>
+#undef BOOTENV_RUN_NET_USB_START
+#define BOOTENV_RUN_NET_USB_START ""
+#else /* CONFIG_SPL_BUILD */
+#define BOOTENV
+#endif /* CONFIG_SPL_BUILD */
 
 #define DFU_ALT_EMMC_INFO \
        "u-boot.imx raw 0x2 0x3ff mmcpart 0;" \
        "boot part 0 1;" \
        "rootfs part 0 2;" \
-       "uImage fat 0 1;" \
-       "imx6q-colibri-eval-v3.dtb fat 0 1;" \
-       "imx6q-colibri-cam-eval-v3.dtb fat 0 1"
+       "zImage fat 0 1;" \
+       "imx6dl-colibri-eval-v3.dtb fat 0 1;" \
+       "imx6dl-colibri-cam-eval-v3.dtb fat 0 1"
 
 #define EMMC_BOOTCMD \
-       "emmcargs=ip=off root=/dev/mmcblk0p2 rw,noatime rootfstype=ext3 " \
+       "emmcargs=ip=off root=/dev/mmcblk0p2 rw,noatime rootfstype=ext4 " \
                "rootwait\0" \
        "emmcboot=run setup; " \
                "setenv bootargs ${defargs} ${emmcargs} ${setupargs} " \
                "${vidargs}; echo Booting from internal eMMC chip...; " \
                "run emmcdtbload; load mmc 0:1 ${kernel_addr_r} " \
                "${boot_file} && run fdt_fixup && " \
-               "bootm ${kernel_addr_r} ${dtbparam}\0" \
+               "bootz ${kernel_addr_r} ${dtbparam}\0" \
        "emmcdtbload=setenv dtbparam; load mmc 0:1 ${fdt_addr_r} " \
                "${fdt_file} && setenv dtbparam \" - ${fdt_addr_r}\" && true\0"
 
        "fdt_high=0xffffffff\0" \
        "initrd_high=0xffffffff\0" \
        "kernel_addr_r=0x11000000\0" \
-       "ramdisk_addr_r=0x12100000\0"
+       "pxefile_addr_r=0x17100000\0" \
+       "ramdisk_addr_r=0x12100000\0" \
+       "scriptaddr=0x17000000\0"
 
 #define NFS_BOOTCMD \
        "nfsargs=ip=:::::eth0:on root=/dev/nfs rw\0" \
                "setenv bootargs ${defargs} ${nfsargs} ${setupargs} " \
                "${vidargs}; echo Booting via DHCP/TFTP/NFS...; " \
                "run nfsdtbload; dhcp ${kernel_addr_r} " \
-               "&& run fdt_fixup && bootm ${kernel_addr_r} ${dtbparam}\0" \
+               "&& run fdt_fixup && bootz ${kernel_addr_r} ${dtbparam}\0" \
        "nfsdtbload=setenv dtbparam; tftp ${fdt_addr_r} ${fdt_file} " \
                "&& setenv dtbparam \" - ${fdt_addr_r}\" && true\0"
 
-#define SD_BOOTCMD                                             \
-       "sdargs=ip=off root=/dev/mmcblk1p2 rw,noatime rootfstype=ext3 " \
+#define SD_BOOTCMD \
+       "sdargs=ip=off root=/dev/mmcblk1p2 rw,noatime rootfstype=ext4 " \
                "rootwait\0" \
        "sdboot=run setup; " \
                "setenv bootargs ${defargs} ${sdargs} ${setupargs} " \
                "${vidargs}; echo Booting from SD card; " \
                "run sddtbload; load mmc 1:1 ${kernel_addr_r} " \
                "${boot_file} && run fdt_fixup && " \
-               "bootm ${kernel_addr_r} ${dtbparam}\0" \
+               "bootz ${kernel_addr_r} ${dtbparam}\0" \
        "sddtbload=setenv dtbparam; load mmc 1:1 ${fdt_addr_r} " \
                "${fdt_file} && setenv dtbparam \" - ${fdt_addr_r}\" && true\0"
 
 #define USB_BOOTCMD \
-       "usbargs=ip=off root=/dev/sda2 rw,noatime rootfstype=ext3 " \
+       "usbargs=ip=off root=/dev/sda2 rw,noatime rootfstype=ext4 " \
                "rootwait\0" \
        "usbboot=run setup; setenv bootargs ${defargs} ${setupargs} " \
                "${usbargs} ${vidargs}; echo Booting from USB stick...; " \
                "usb start && run usbdtbload; load usb 0:1 ${kernel_addr_r} " \
                "${boot_file} && run fdt_fixup && " \
-               "bootm ${kernel_addr_r} ${dtbparam}\0" \
+               "bootz ${kernel_addr_r} ${dtbparam}\0" \
        "usbdtbload=setenv dtbparam; load usb 0:1 ${fdt_addr_r} " \
                "${fdt_file} && setenv dtbparam \" - ${fdt_addr_r}\" && true\0"
 
 #define FDT_FILE "imx6dl-colibri-eval-v3.dtb"
 #define CONFIG_EXTRA_ENV_SETTINGS \
+       BOOTENV \
        "bootcmd=run emmcboot ; echo ; echo emmcboot failed ; " \
-               "run nfsboot ; echo ; echo nfsboot failed ; " \
-               "usb start ;" \
+               "run distro_bootcmd ; " \
+               "usb start ; " \
                "setenv stdout serial,vga ; setenv stdin serial,usbkbd\0" \
-       "boot_file=uImage\0" \
+       "boot_file=zImage\0" \
        "console=ttymxc0\0" \
        "defargs=enable_wait_mode=off galcore.contiguousSize=50331648\0" \
        "dfu_alt_info=" DFU_ALT_EMMC_INFO "\0" \
 #define CONFIG_SYS_MMC_ENV_PART                1
 #endif
 
-#define CONFIG_OF_SYSTEM_SETUP
-
 #define CONFIG_CMD_TIME
 
 #endif /* __CONFIG_H */
index 31ff8a00a698e045d737b5d89f5498fb51ba51ad..0d57e303a1bdfca6aa6f5fca6f51e9ee894d1e2f 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0+ */
 /*
- * Copyright 2015-2016 Toradex, Inc.
+ * Copyright 2015-2019 Toradex, Inc.
  *
  * Configuration settings for the Toradex VF50/VF61 modules.
  *
 #define __CONFIG_H
 
 #include <asm/arch/imx-regs.h>
+#include <linux/sizes.h>
 
 #define CONFIG_SYS_FSL_CLK
 
 #define CONFIG_SKIP_LOWLEVEL_INIT
 
-#ifdef CONFIG_CMD_FUSE
-#define CONFIG_MXC_OCOTP
-#endif
-
 #ifdef CONFIG_VIDEO_FSL_DCU_FB
 #define CONFIG_SPLASH_SCREEN_ALIGN
 #define CONFIG_VIDEO_LOGO
@@ -32,7 +29,7 @@
 #endif
 
 /* Size of malloc() pool */
-#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 2 * 1024 * 1024)
+#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 2 * SZ_1M)
 
 /* Allow to overwrite serial and ethaddr */
 #define CONFIG_ENV_OVERWRITE
 /* NAND support */
 #define CONFIG_SYS_NAND_ONFI_DETECTION
 #define CONFIG_SYS_MAX_NAND_DEVICE     1
-#define CONFIG_SYS_NAND_BASE           NFC_BASE_ADDR
-
-/* Dynamic MTD partition support */
-
-#define CONFIG_SYS_FSL_ESDHC_ADDR      0
-#define CONFIG_SYS_FSL_ESDHC_NUM       1
-
-#define CONFIG_FEC_MXC
-#define IMX_FEC_BASE                   ENET1_BASE_ADDR
-#define CONFIG_FEC_XCV_TYPE            RMII
-#define CONFIG_FEC_MXC_PHYADDR          0
 
 #define CONFIG_IPADDR          192.168.10.2
 #define CONFIG_NETMASK         255.255.255.0
 /* We boot from the gfxRAM area of the OCRAM. */
 #define CONFIG_BOARD_SIZE_LIMIT                520192
 
-#define SD_BOOTCMD \
-       "sdargs=root=/dev/mmcblk0p2 rw rootwait\0"      \
-       "sdboot=run setup; setenv bootargs ${defargs} ${sdargs} ${mtdparts} " \
-       "${setupargs} ${vidargs}; echo Booting from MMC/SD card...; " \
-       "load mmc 0:2 ${kernel_addr_r} /boot/${kernel_file} && " \
-       "load mmc 0:2 ${fdt_addr_r} /boot/${soc}-colibri-${fdt_board}.dtb && " \
-       "run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \
+#define MEM_LAYOUT_ENV_SETTINGS \
+       "bootm_size=0x10000000\0" \
+       "fdt_addr_r=0x82000000\0" \
+       "fdt_high=0xffffffff\0" \
+       "initrd_high=0xffffffff\0" \
+       "kernel_addr_r=0x81000000\0" \
+       "pxefile_addr_r=0x87100000\0" \
+       "ramdisk_addr_r=0x82100000\0" \
+       "scriptaddr=0x87000000\0"
 
 #define NFS_BOOTCMD \
        "nfsargs=ip=:::::eth0: root=/dev/nfs\0" \
        "tftp ${fdt_addr_r} ${soc}-colibri-${fdt_board}.dtb && " \
        "run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \
 
-#define UBI_BOOTCMD    \
+#define SD_BOOTCMD \
+       "sdargs=root=/dev/mmcblk0p2 ro rootwait\0"      \
+       "sdboot=run setup; setenv bootargs ${defargs} ${sdargs} ${mtdparts} " \
+       "${setupargs} ${vidargs}; echo Booting from MMC/SD card...; " \
+       "load mmc 0:1 ${kernel_addr_r} ${kernel_file} && " \
+       "load mmc 0:1 ${fdt_addr_r} ${soc}-colibri-${fdt_board}.dtb && " \
+       "run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \
+
+#define UBI_BOOTCMD \
        "ubiargs=ubi.mtd=ubi root=ubi0:rootfs rootfstype=ubifs " \
        "ubi.fm_autoconvert=1\0" \
        "ubiboot=run setup; " \
        "ubi read ${fdt_addr_r} dtb && " \
        "run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \
 
-#define CONFIG_BOOTCOMMAND "run ubiboot; run sdboot; run nfsboot"
+#define CONFIG_BOOTCOMMAND "run ubiboot; " \
+       "setenv fdtfile ${soc}-colibri-${fdt_board}.dtb && run distro_bootcmd;"
+
+#define BOOT_TARGET_DEVICES(func) \
+       func(MMC, mmc, 0) \
+       func(USB, usb, 0) \
+       func(DHCP, dhcp, na)
+#include <config_distro_bootcmd.h>
+#undef BOOTENV_RUN_NET_USB_START
+#define BOOTENV_RUN_NET_USB_START ""
 
 #define DFU_ALT_NAND_INFO "vf-bcb part 0,1;u-boot part 0,2;ubi part 0,4"
 
 #define CONFIG_EXTRA_ENV_SETTINGS \
-       "kernel_addr_r=0x82000000\0" \
-       "fdt_addr_r=0x84000000\0" \
-       "kernel_file=zImage\0" \
-       "fdt_file=${soc}-colibri-${fdt_board}.dtb\0" \
+       BOOTENV \
+       MEM_LAYOUT_ENV_SETTINGS \
+       NFS_BOOTCMD \
+       SD_BOOTCMD \
+       UBI_BOOTCMD \
+       "console=ttyLP0\0" \
+       "defargs=user_debug=30\0" \
+       "dfu_alt_info=" DFU_ALT_NAND_INFO "\0" \
        "fdt_board=eval-v3\0" \
        "fdt_fixup=;\0" \
-       "defargs=\0" \
-       "console=ttyLP0\0" \
-       "setup=setenv setupargs " \
-       "console=tty1 console=${console}" \
-       ",${baudrate}n8 ${memargs}\0" \
+       "kernel_file=zImage\0" \
+       "mtdparts=" CONFIG_MTDPARTS_DEFAULT "\0" \
        "setsdupdate=mmc rescan && set interface mmc && " \
-       "fatload ${interface} 0:1 ${loadaddr} flash_blk.img && " \
-       "source ${loadaddr}\0" \
-       "setusbupdate=usb start && set interface usb && " \
-       "fatload ${interface} 0:1 ${loadaddr} flash_blk.img && " \
-       "source ${loadaddr}\0" \
+               "fatload ${interface} 0:1 ${loadaddr} flash_blk.img && " \
+               "source ${loadaddr}\0" \
+       "setup=setenv setupargs console=tty1 console=${console}" \
+               ",${baudrate}n8 ${memargs}\0" \
        "setupdate=run setsdupdate || run setusbupdate\0" \
-       "mtdparts=" CONFIG_MTDPARTS_DEFAULT "\0" \
-       "dfu_alt_info=" DFU_ALT_NAND_INFO "\0" \
-       "video-mode=dcufb:640x480-16@60,monitor=lcd\0" \
+       "setusbupdate=usb start && set interface usb && " \
+               "fatload ${interface} 0:1 ${loadaddr} flash_blk.img && " \
+               "source ${loadaddr}\0" \
        "splashpos=m,m\0" \
-       SD_BOOTCMD \
-       NFS_BOOTCMD \
-       UBI_BOOTCMD
+       "video-mode=dcufb:640x480-16@60,monitor=lcd\0"
 
 /* Miscellaneous configurable options */
 #define CONFIG_SYS_CBSIZE              1024    /* Console I/O Buffer Size */
 
 /* Physical memory map */
 #define PHYS_SDRAM                     (0x80000000)
-#define PHYS_SDRAM_SIZE                        (256 * 1024 * 1024)
+#define PHYS_SDRAM_SIZE                        (256 * SZ_1M)
 
 #define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM
 #define CONFIG_SYS_INIT_RAM_ADDR       IRAM_BASE_ADDR
        (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
 
 /* Environment organization */
-
-#ifdef CONFIG_ENV_IS_IN_MMC
-#define CONFIG_SYS_MMC_ENV_DEV         0
-#define CONFIG_ENV_OFFSET              (12 * 64 * 1024)
-#define CONFIG_ENV_SIZE                        (8 * 1024)
-#endif
-
 #ifdef CONFIG_ENV_IS_IN_NAND
 #define CONFIG_ENV_SIZE                        (64 * 2048)
 #define CONFIG_ENV_RANGE               (4 * 64 * 2048)
 #endif
 
 /* USB Host Support */
-#define CONFIG_USB_EHCI_VF
 #define CONFIG_USB_MAX_CONTROLLER_COUNT 2
 #define CONFIG_EHCI_HCD_INIT_AFTER_RESET
 
 /* USB DFU */
-#define CONFIG_SYS_DFU_DATA_BUF_SIZE (1024 * 1024)
-
-/* USB Storage */
+#define CONFIG_SYS_DFU_DATA_BUF_SIZE (SZ_1M)
 
 #endif /* __CONFIG_H */
index 749a67d4b0852c2036933259b451fe3148f9fe8c..e85f684e32b02afcb6db10070ed3f113cb9765ba 100644 (file)
@@ -72,6 +72,7 @@
 #define CONFIG_SYS_NAND_MASK_CLE               (1 << 22)
 #define CONFIG_SYS_NAND_ENABLE_PIN             AT91_PIN_PC14
 #define CONFIG_SYS_NAND_READY_PIN              AT91_PIN_PC8
+#define CONFIG_SYS_NAND_DRIVER_ECC_LAYOUT
 #endif
 
 /* Ethernet */
index 583f9948072830b81e49d1ae6cb08362c4a8664e..94848f5128b05c6a58c48f45e4fef8ed564bc7e1 100644 (file)
@@ -48,7 +48,8 @@
 #define PHYS_SDRAM_1           DAVINCI_DDR_EMIF_DATA_BASE /* DDR Start */
 #define PHYS_SDRAM_1_SIZE      (64 << 20) /* SDRAM size 64MB */
 #define CONFIG_MAX_RAM_BANK_SIZE (512 << 20) /* max size from SPRS586*/
-
+#define CONFIG_SPL_BSS_START_ADDR DAVINCI_DDR_EMIF_DATA_BASE
+#define CONFIG_SPL_BSS_MAX_SIZE 0x1080000
 /* memtest start addr */
 #define CONFIG_SYS_MEMTEST_START       (PHYS_SDRAM_1 + 0x2000000)
 
index 55968c2749efeb86be72042d65392fc5a811df4a..63194d58a29bcf5d0968c031e3984d42d5c03436 100644 (file)
@@ -32,8 +32,6 @@
 #define CONFIG_EHCI_IS_TDI
 #define CONFIG_USB_MAX_CONTROLLER_COUNT 3
 
-/* SPI NOR flash default params, used by sf commands */
-
 /* Environment in SPI NOR flash */
 #define CONFIG_ENV_OFFSET              (1 << 20) /* 1MiB in */
 #define CONFIG_ENV_SIZE                        (64 << 10) /* 64KiB */
index f1bdc2d3e74ffb9a3cd783e4e39e7082f3ed6210..2fdc845029214dc3a2da0d6e606bc26efe07210f 100644 (file)
@@ -16,8 +16,6 @@
  * Commands configuration
  */
 
-/* SPI NOR flash default params, used by sf commands */
-
 /* USB/EHCI configuration */
 #define CONFIG_EHCI_IS_TDI
 
index d378052a8f7caf0925ead9aded12df677b2ff853..ec2405bbb456115d4b6f5c68433ab0f9ce700371 100644 (file)
 #define CONFIG_SYS_I2C_SLAVE           0x0
 #define CONFIG_SYS_I2C_SPEED           100000
 
-/*
- * SPI Flash configuration for the environemnt access
- */
-
-/* SPI NOR flash default params, used by sf commands */
-
 /*
  * SDIO/MMC Card Configuration
  */
index b78dbcb6b946610b172d2e76ee94429c9748af78..1f9d24b19b980a87118371d4269d6b58fd22920f 100644 (file)
@@ -29,8 +29,6 @@
 #define CONFIG_EHCI_IS_TDI
 #define CONFIG_USB_MAX_CONTROLLER_COUNT 3
 
-/* SPI NOR flash default params, used by sf commands */
-
 /* Environment in SPI NOR flash */
 #define CONFIG_ENV_OFFSET              (1 << 20) /* 1MiB in */
 #define CONFIG_ENV_SIZE                        (64 << 10) /* 64KiB */
diff --git a/include/configs/db-xc3-24g4xg.h b/include/configs/db-xc3-24g4xg.h
new file mode 100644 (file)
index 0000000..0f75ad7
--- /dev/null
@@ -0,0 +1,41 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2014 Stefan Roese <sr@denx.de>
+ */
+
+#ifndef _CONFIG_DB_XC3_24G4G_H
+#define _CONFIG_DB_XC3_24G4G_H
+
+/*
+ * High Level Configuration Options (easy to change)
+ */
+
+#define CONFIG_SYS_KWD_CONFIG  $(CONFIG_BOARDDIR)/kwbimage.cfg
+#define CONFIG_SYS_TCLK                200000000       /* 200MHz */
+
+/* USB/EHCI configuration */
+#define CONFIG_EHCI_IS_TDI
+
+/* Environment in SPI NOR flash */
+#define CONFIG_ENV_OFFSET              (1 << 20) /* 1MiB in */
+#define CONFIG_ENV_SIZE                        (64 << 10) /* 64KiB */
+#define CONFIG_ENV_SECT_SIZE           (256 << 10) /* 256KiB sectors */
+
+/* NAND */
+#define CONFIG_SYS_NAND_USE_FLASH_BBT
+#define CONFIG_SYS_NAND_ONFI_DETECTION
+
+/* Keep device tree and initrd in lower memory so the kernel can access them */
+#define CONFIG_EXTRA_ENV_SETTINGS      \
+       "fdt_high=0x10000000\0"         \
+       "initrd_high=0x10000000\0"
+
+/*
+ * mv-common.h should be defined after CMD configs since it used them
+ * to enable certain macros
+ */
+#include "mv-common.h"
+#undef CONFIG_SYS_MAXARGS
+#define CONFIG_SYS_MAXARGS 96
+
+#endif /* _CONFIG_DB_XC3_24G4G_H */
index 48514ff076b37ce4d18946b206afbc170ff3802b..3eee382a6431cf8bab1df2aa2e99281a66def93a 100644 (file)
 #define CONFIG_FEC_MXC_PHYADDR         0
 #define CONFIG_ARP_TIMEOUT             200UL
 
-/* Fuses */
-#ifdef CONFIG_CMD_FUSE
-#define CONFIG_MXC_OCOTP
-#endif
-
 /* I2C Configs */
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
index 10eac20aa0c8fca754550a74c23f3853b2171451..f6be6595fe3c1ae781b955921157c90517d0192d 100644 (file)
 #define CONFIG_NET_RETRY_COUNT         10
 #define CONFIG_PHY_TI
 
-/* SPI */
-#define CONFIG_TI_SPI_MMAP
-#define CONFIG_QSPI_QUAD_SUPPORT
-
 /*
  * Default to using SPI for environment, etc.
  * 0x000000 - 0x040000 : QSPI.SPL (256KiB)
@@ -98,7 +94,6 @@
 #endif
 
 /* SPI SPL */
-#define CONFIG_TI_EDMA3
 #define CONFIG_SYS_SPI_U_BOOT_OFFS     0x40000
 
 #define CONFIG_SUPPORT_EMMC_BOOT
                                         50, 51, 52, 53, 54, 55, 56, 57, }
 #define CONFIG_SYS_NAND_ECCSIZE                512
 #define CONFIG_SYS_NAND_ECCBYTES       14
-#define CONFIG_SYS_NAND_U_BOOT_OFFS    0x000c0000
+#define CONFIG_SYS_NAND_U_BOOT_OFFS    0x00140000
 /* NAND: SPL related configs */
 /* NAND: SPL falcon mode configs */
 #ifdef CONFIG_SPL_OS_BOOT
index 275a2b4788052f5808ad587430b2b6636e013cbe..192c055c5cc45c1801ada6973650e4f21c6358d5 100644 (file)
@@ -28,8 +28,6 @@
 #define CONFIG_SYS_I2C_SLAVE           0x0
 #define CONFIG_SYS_I2C_SPEED           100000
 
-/* SPI NOR flash default params, used by sf commands */
-
 /* Environment in SPI NOR flash */
 #define CONFIG_ENV_OFFSET              0x7E0000   /* RedBoot config partition in DTS */
 #define CONFIG_ENV_SIZE                        (64 << 10) /* 64KiB */
index 5142680e7d6f520d59240c295b36e28765b51414..858bed012c6312918a511fbba172ee06e5a0c66a 100644 (file)
@@ -86,7 +86,6 @@
 #endif
 
 /* Framebuffer */
-#define CONFIG_VIDEO_IPUV3
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_SPLASH_SCREEN
 #define CONFIG_SPLASH_SCREEN_ALIGN
index 333657807177c97636506c9222d865df0839aa46..196f114c60e874a6cdca93e5ec03e6f797ab4e0b 100644 (file)
@@ -35,8 +35,6 @@
 
 #define CONFIG_MXC_UART
 
-#define CONFIG_MXC_OCOTP
-
 /* SATA Configs */
 #ifdef CONFIG_CMD_SATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_LBA48
 #endif
 
-/* MMC Configs */
-#define CONFIG_FSL_USDHC
-#define CONFIG_SYS_FSL_ESDHC_ADDR      0
-
 /* USB Configs */
 #ifdef CONFIG_USB
 #define CONFIG_USB_MAX_CONTROLLER_COUNT 2
 
 #define CONFIG_LOADADDR        0x12000000
 
+#ifdef CONFIG_NFS_CMD
+#define NETWORKBOOT \
+        "setnetworkboot=" \
+                "setenv ipaddr 172.16.2.10; setenv serverip 172.16.2.20; " \
+                "setenv gatewayip 172.16.2.20; setenv nfsserver 172.16.2.20; " \
+                "setenv netmask 255.255.255.0; setenv ethaddr ca:fe:de:ca:f0:11; " \
+                "setenv bootargs root=/dev/nfs nfsroot=${nfsserver}:/srv/nfs/,v3,tcp rw rootwait" \
+                "setenv bootargs $bootargs ip=${ipaddr}:${nfsserver}:${gatewayip}:${netmask}::eth0:off " \
+                "setenv bootargs $bootargs cma=128M bootcause=POR console=${console} ${videoargs} " \
+                "setenv bootargs $bootargs systemd.mask=helix-network-defaults.service " \
+                "setenv bootargs $bootargs watchdog.handle_boot_enabled=1\0" \
+        "networkboot=" \
+                "run setnetworkboot; " \
+                "nfs ${loadaddr} /srv/nfs/fitImage; " \
+                "bootm ${loadaddr}#conf@${confidx}\0" \
+
+#define CONFIG_NETWORKBOOTCOMMAND \
+       "run networkboot; " \
+
+#else
+#define NETWORKBOOT \
+
+#endif
+
 #define CONFIG_EXTRA_ENV_SETTINGS \
+       NETWORKBOOT \
        "bootcause=POR\0" \
        "image=/boot/fitImage\0" \
        "fdt_high=0xffffffff\0" \
        "dev=mmc\0" \
-       "devnum=1\0" \
+       "devnum=2\0" \
        "rootdev=mmcblk0p\0" \
        "quiet=quiet loglevel=0\0" \
        "console=" CONSOLE_DEV "\0" \
 #define CONFIG_USBBOOTCOMMAND \
        "echo Unsupported; " \
 
-#ifdef CONFIG_CMD_USB
+#ifdef CONFIG_NFS_CMD
+#define CONFIG_BOOTCOMMAND CONFIG_NETWORKBOOTCOMMAND
+#elif CONFIG_CMD_USB
 #define CONFIG_BOOTCOMMAND CONFIG_USBBOOTCOMMAND
 #else
 #define CONFIG_BOOTCOMMAND CONFIG_MMCBOOTCOMMAND
 #endif
 
-#define CONFIG_ARP_TIMEOUT     200UL
 
 /* Miscellaneous configurable options */
 
 #define CONFIG_SYS_FSL_USDHC_NUM       3
 
 /* Framebuffer */
-#define CONFIG_VIDEO
-#ifdef CONFIG_VIDEO
-#define CONFIG_VIDEO_IPUV3
-#define CONFIG_CFB_CONSOLE
-#define CONFIG_VGA_AS_SINGLE_DEVICE
-#define CONFIG_SYS_CONSOLE_FG_COL 0xFF
-#define CONFIG_SYS_CONSOLE_BG_COL 0x00
 #define CONFIG_HIDE_LOGO_VERSION
 #define CONFIG_IMX_HDMI
 #define CONFIG_IMX_VIDEO_SKIP
 #define CONFIG_CMD_BMP
-#endif
 
 #define CONFIG_PWM_IMX
 #define CONFIG_IMX6_PWM_PER_CLK        66000000
index 84ee44e87205a48e302e35ab7208fe44b7c19dfd..93608e5aec4d15d7b4773b6608c225fd34690334 100644 (file)
 #define CONFIG_NETCONSOLE
 
 /* Framebuffer and LCD */
-#define CONFIG_VIDEO_IPUV3
 #define CONFIG_VIDEO_LOGO
 #define CONFIG_IMX_HDMI
 #define CONFIG_IMX_VIDEO_SKIP
index df4d8bcb3bbf869c830a8b0138e6d1b446c144a9..b2badab15eab25f82ca14057125d23e4a6bd8960 100644 (file)
@@ -23,8 +23,6 @@
  * Commands configuration
  */
 
-/* SPI NOR flash default params, used by sf commands */
-
 /*
  * SDIO/MMC Card Configuration
  */
index a9e38a70e60fbbeb4ad7bce8d8df12c7d4724143..6094d1bf1800c7c78bd27285e1af416e8ca468db 100644 (file)
 
 #define CONFIG_MXC_GPIO
 
-#define CONFIG_MXC_OCOTP
 #define CONFIG_CMD_FUSE
 
 /* I2C Configs */
index 2c0e4cbe92fd2244ce759fd2fac0b8f09c613ce0..547127490c9258e3301f5d5986fbb7a1912ae7ad 100644 (file)
 
 #include <configs/ti_armv7_keystone2.h>
 
-/* SPL SPI Loader Configuration */
-#define CONFIG_SPL_TEXT_BASE           0x0c100000
-
-
 #define SPI_MTD_PARTS KEYSTONE_SPI0_MTD_PARTS
 
 /* NAND Configuration */
index b1aec98a37225345cc20059c41265bd76b2eaba7..3ec5a5acf5f9780c744e44c68c0ba2a2aa8b662e 100644 (file)
@@ -72,9 +72,6 @@
        "bootm ${fit_loadaddr}#${name_fdt}"
 #endif
 
-/* SPL SPI Loader Configuration */
-#define CONFIG_SPL_TEXT_BASE           0x0c0a0000
-
 /* NAND Configuration */
 #define CONFIG_SYS_NAND_PAGE_2K
 
index 0b909a1bf6fabbbe82c8c67eefbfcc4dc6160734..d4f2e96bab087bf6355cf1138ac963c88de1097b 100644 (file)
@@ -40,9 +40,6 @@
 
 #include <configs/ti_armv7_keystone2.h>
 
-/* SPL SPI Loader Configuration */
-#define CONFIG_SPL_TEXT_BASE           0x0c200000
-
 #define SPI_MTD_PARTS KEYSTONE_SPI0_MTD_PARTS
 
 /* NAND Configuration */
index 59e6b096733a47c37a713a9a45de4c53e6a18f39..cfdb36e2d7ff72100bc996ace2239db88306583e 100644 (file)
@@ -40,9 +40,6 @@
 
 #include <configs/ti_armv7_keystone2.h>
 
-/* SPL SPI Loader Configuration */
-#define CONFIG_SPL_TEXT_BASE           0x0c100000
-
 #define SPI_MTD_PARTS KEYSTONE_SPI0_MTD_PARTS
 
 /* NAND Configuration */
index b6b27ee1d5eba0da11703efd8f0d952da07827ff..d2ebf9295361bad5ccf3bf18e0e33b78550dc7dd 100644 (file)
 #define CONFIG_FEC_MXC_PHYADDR         0
 #define CONFIG_ARP_TIMEOUT             200UL
 
-/* Fuses */
-#ifdef CONFIG_CMD_FUSE
-#define CONFIG_MXC_OCOTP
-#endif
-
 /* I2C Configs */
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
index 72e62658d0ccc7a201e134111706a148b3160b23..55c4e633254755d54f21998ac4e6eedbd9e2207e 100644 (file)
@@ -76,9 +76,9 @@
        "kernel_addr=0x00800000\0"                                      \
        "ramdisk_addr=0x01000000\0"                                     \
        "fdt_addr=0x00ff0000\0"                                         \
-       "bootcmd_legacy=ide reset "                                     \
-               "&& load ide ${hdpart} ${kernel_addr} /uImage.buffalo " \
-               "&& load ide ${hdpart} ${ramdisk_addr} /initrd.buffalo "\
+       "bootcmd_legacy=sata init "                                     \
+               "&& load sata ${hdpart} ${kernel_addr} /uImage.buffalo "\
+               "&& load sata ${hdpart} ${ramdisk_addr} /initrd.buffalo "\
                "&& bootm ${kernel_addr} ${ramdisk_addr}\0"             \
        "bootcmd_net=bootp ${kernel_addr} vmlinuz "                     \
                "&& tftpboot ${ramdisk_addr} initrd.img "               \
                "&& tftpboot ${fdt_addr} " CONFIG_FDTFILE " "           \
                "&& bootz ${kernel_addr} "                              \
                        "${ramdisk_addr}:${ramdisk_len} ${fdt_addr}\0"  \
-       "bootcmd_hdd=ide reset "                                        \
-               "&& load ide ${hdpart} ${kernel_addr} /vmlinuz "        \
-               "&& load ide ${hdpart} ${ramdisk_addr} /initrd.img "    \
+       "bootcmd_hdd=sata init "                                        \
+               "&& load sata ${hdpart} ${kernel_addr} /vmlinuz "       \
+               "&& load sata ${hdpart} ${ramdisk_addr} /initrd.img "   \
                "&& setenv ramdisk_len ${filesize} "                    \
-               "&& load ide ${hdpart} ${fdt_addr} /dtb "               \
+               "&& load sata ${hdpart} ${fdt_addr} /dtb "              \
                "&& bootz ${kernel_addr} "                              \
                        "${ramdisk_addr}:${ramdisk_len} ${fdt_addr}\0"  \
        "bootcmd_usb=usb start "                                        \
 #undef CONFIG_RESET_PHY_R
 #endif /* CONFIG_CMD_NET */
 
-#ifdef CONFIG_IDE
-#undef CONFIG_SYS_IDE_MAXBUS
-#define CONFIG_SYS_IDE_MAXBUS          1
-#undef CONFIG_SYS_IDE_MAXDEVICE
-#define CONFIG_SYS_IDE_MAXDEVICE       1
-#define CONFIG_SYS_ATA_IDE0_OFFSET     MV_SATA_PORT0_OFFSET
+#ifdef CONFIG_SATA
+#define CONFIG_SYS_SATA_MAX_DEVICE 1
 #define CONFIG_SYS_64BIT_LBA
+#define CONFIG_LBA48
 #endif
 
 #endif /* _CONFIG_LSXL_H */
index 51456fbe556330f41ac3cbaf4b19ea6e183cdd42..84d061339eca0741341e2646b8ee995c8cd1f559 100644 (file)
  * LCD
  */
 #ifdef CONFIG_VIDEO
-#define CONFIG_VIDEO_IPUV3
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_VIDEO_BMP_GZIP
 #define CONFIG_SPLASH_SCREEN
index f4972b64dcb158cf6ff8463cb56197957c8a5801..b28f3b94085ab695413d98759c062de11696a74c 100644 (file)
 /* End of 16M scrubbed by training in bootrom */
 #define CONFIG_SYS_INIT_SP_ADDR         (CONFIG_SYS_TEXT_BASE + 0xFF0000)
 
-/*
- * SPI Flash configuration
- */
-
 #define CONFIG_ENV_OFFSET              0x180000 /* as Marvell U-Boot version */
 #define CONFIG_ENV_SIZE                        (64 << 10) /* 64KiB */
 #define CONFIG_ENV_SECT_SIZE           (64 << 10) /* 64KiB sectors */
index eb172c97b35ed8ff7af40a47c6fef6291fd7c262..9bf9773c69d4218cd3d1b59471b009a80ef5688f 100644 (file)
@@ -68,7 +68,6 @@
 
 /* Framebuffer and LCD */
 #define CONFIG_PREBOOT
-#define CONFIG_VIDEO_IPUV3
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_SPLASH_SCREEN
 #define CONFIG_BMP_16BPP
index 3ed5ee3c57e272784a08a98222df6f0a97c947d2..1e3ea88b77ac8069b15b0c03e134226b1adf44db 100644 (file)
 
 /* Framebuffer and LCD */
 #define CONFIG_PREBOOT
-#define CONFIG_VIDEO_IPUV3
 #define CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_SPLASH_SCREEN
index 816164e87eed4daf5a6a7b6766bfec309addb56f..2d18f05423b98d0cd7683bd4bee319fec094e4b9 100644 (file)
 
 /* Framebuffer and LCD */
 #define CONFIG_PREBOOT
-#define CONFIG_VIDEO_IPUV3
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_SPLASH_SCREEN
 #define CONFIG_BMP_16BPP
index d2a8e6571af6ffea6cbe294ffc5e1268c4b9dd75..f002324fddcd640a60398da9a80bc049943403e6 100644 (file)
 #define CONFIG_MXC_UART
 #define CONFIG_MXC_UART_BASE   UART1_BASE
 
-/* MMC Configs */
-#define CONFIG_SYS_FSL_ESDHC_ADDR      0
-#define CONFIG_SYS_FSL_ESDHC_NUM       2
-
 /* Eth Configs */
 
 #define CONFIG_FEC_MXC
        "nfsroot=/opt/springdale/rd\0" \
        "bootargs_nfs=setenv bootargs ${bootargs} root=/dev/nfs " \
                "${kern_ipconf} nfsroot=${nfsserver}:${nfsroot},v3,tcp rw\0" \
-       "choose_ip=if test $use_dhcp = 1; then set kern_ipconf ip=dhcp; " \
-               "set getcmd dhcp; else set kern_ipconf " \
+       "choose_ip=if test $use_dhcp = 1; then setenv kern_ipconf ip=dhcp; " \
+               "setenv getcmd dhcp; else setenv kern_ipconf " \
                "ip=${ipaddr}:${nfsserver}:${gatewayip}:${netmask}::eth0:off; " \
-               "set getcmd tftp; fi\0" \
+               "setenv getcmd tftp; fi\0" \
        "nfs=run choose_ip setargs bootargs_nfs; ${getcmd} ${loadaddr} " \
                "${nfsserver}:${image}; bootm ${loadaddr}\0" \
 
        "image=/boot/fitImage\0" \
        "fdt_high=0xffffffff\0" \
        "dev=mmc\0" \
-       "devnum=0\0" \
+       "devnum=2\0" \
        "rootdev=mmcblk0p\0" \
        "quiet=quiet loglevel=0\0" \
        "console=" CONSOLE_DEV "\0" \
 #define CONFIG_PWM_IMX
 #define CONFIG_IMX6_PWM_PER_CLK 66666000
 
-/* Framebuffer and LCD */
-#ifdef CONFIG_VIDEO
-       #define CONFIG_VIDEO_IPUV3
-#endif
-
 #endif                         /* __CONFIG_H */
index cdc88337780a6489f18939c9967e6980d005e41c..6b20c6db5803ab350dc3ee8b6b1281ba9aceb9ef 100644 (file)
@@ -57,9 +57,6 @@
 /* MMC */
 #define CONFIG_FSL_USDHC
 
-/* Fuses */
-#define CONFIG_MXC_OCOTP
-
 /* Secure boot (HAB) support */
 #ifdef CONFIG_SECURE_BOOT
 #define CONFIG_CSF_SIZE                        0x2000
index a62e14f7c61efd02f970c05283786b95247738b0..7b4ae2102eb2d686727f2a1e5a67a62b2bf062cf 100644 (file)
@@ -35,7 +35,6 @@
 #define CONFIG_PHY_ATHEROS
 
 /* Framebuffer */
-#define CONFIG_VIDEO_IPUV3
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_SPLASH_SCREEN
 #define CONFIG_SPLASH_SCREEN_ALIGN
index 6fe0467229f19ad6387e6c6ddb3feac6419d3439..c137612b01c3aab550e5f4f06e453a395083888a 100644 (file)
 #endif
 
 /* Framebuffer */
-#define CONFIG_VIDEO_IPUV3
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_SPLASH_SCREEN
 #define CONFIG_SPLASH_SCREEN_ALIGN
index a895c936aa2c9aa5ba331b31a98afadbb3bcbf32..cc7e87269ee8d4bf5a90f5e3fef4907646505ebd 100644 (file)
@@ -42,9 +42,6 @@
 /* MMC */
 #define CONFIG_FSL_USDHC
 
-/* Fuses */
-#define CONFIG_MXC_OCOTP
-
 #define CONFIG_ARMV7_SECURE_BASE       0x00900000
 
 #define CONFIG_ARMV7_PSCI_1_0
index d941caa905e78fe3e8eeb3cfb0275ff1860673a3..afaa90840629002369f8fab51856528de6326738 100644 (file)
@@ -58,7 +58,6 @@
 #define CONFIG_MXC_USB_FLAGS   0
 
 /* Framebuffer and LCD */
-#define CONFIG_VIDEO_IPUV3
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_SPLASH_SCREEN
 #define CONFIG_SPLASH_SCREEN_ALIGN
index 25736f3c03e7d88d035418cb27b95e87c5c06063..bb5bf808c2b013752114ba0516cf16905fd3bed1 100644 (file)
 
 /* Video output */
 #ifdef CONFIG_VIDEO
-#define CONFIG_VIDEO_IPUV3
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_SPLASH_SCREEN
 #define CONFIG_BMP_16BPP
index 1786e099ad4f7f7bff87b56ddd789f8ed85b3e5a..6680c3e5037507ace510cd9499a2762671d53987 100644 (file)
@@ -43,6 +43,9 @@
 #define PHYS_SDRAM_1_SIZE      (128 << 20) /* SDRAM size 128MB */
 #define CONFIG_MAX_RAM_BANK_SIZE (512 << 20) /* max size from SPRS586*/
 
+#define CONFIG_SPL_BSS_START_ADDR DAVINCI_DDR_EMIF_DATA_BASE
+#define CONFIG_SPL_BSS_MAX_SIZE 0x1080000
+
 /* memtest start addr */
 #define CONFIG_SYS_MEMTEST_START       (PHYS_SDRAM_1 + 0x2000000)
 
index e125a38e7d416bc29ead8b48143f1d4004e5ce59..fb8f3c8609c0187840a69ab0260328dd23dc1b04 100644 (file)
@@ -9,6 +9,7 @@
 #define __CONFIG_H
 
 #include <asm/arch/imx-regs.h>
+#include <linux/sizes.h>
 
 #define CONFIG_SKIP_LOWLEVEL_INIT
 
@@ -16,7 +17,7 @@
 #define CONFIG_CMDLINE_TAG
 
 /* Size of malloc() pool */
-#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 2 * 1024 * 1024)
+#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 2 * SZ_1M)
 
 /* Allow to overwrite serial and ethaddr */
 #define CONFIG_ENV_OVERWRITE
 /* NAND support */
 #define CONFIG_SYS_NAND_ONFI_DETECTION
 
-#ifdef CONFIG_CMD_NAND
 #define CONFIG_SYS_MAX_NAND_DEVICE     1
-#define CONFIG_SYS_NAND_BASE           NFC_BASE_ADDR
-
-#define CONFIG_JFFS2_NAND
-
-/* Dynamic MTD partition support */
-
-#endif
-
-#define CONFIG_SYS_FSL_ESDHC_ADDR      0
-#define CONFIG_SYS_FSL_ESDHC_NUM       1
-
-/*#define CONFIG_ESDHC_DETECT_USE_EXTERN_IRQ1*/
-
-#define CONFIG_FEC_MXC
-#define IMX_FEC_BASE                   ENET_BASE_ADDR
-#define CONFIG_FEC_XCV_TYPE            RMII
-#define CONFIG_FEC_MXC_PHYADDR          0
-
 /* QSPI Configs*/
-
 #ifdef CONFIG_FSL_QSPI
-#define FSL_QSPI_FLASH_SIZE            (1 << 24)
+#define FSL_QSPI_FLASH_SIZE            (SZ_16M)
 #define FSL_QSPI_FLASH_NUM             2
 #define CONFIG_SYS_FSL_QSPI_LE
 #endif
 
-/* I2C Configs */
-#define CONFIG_SYS_I2C
-#define CONFIG_SYS_I2C_MXC_I2C3
-#define CONFIG_SYS_I2C_MXC
-
-/* RTC (actually an RV-4162 but M41T62-compatible) */
-#define CONFIG_SYS_I2C_RTC_ADDR 0x68
-#define CONFIG_SYS_RTC_BUS_NUM 2
-
-/* EEPROM (24FC256) */
-#define CONFIG_SYS_I2C_EEPROM_ADDR 0x50
-#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
-#define CONFIG_SYS_I2C_EEPROM_BUS 2
-
 
 #define CONFIG_LOADADDR                        0x82000000
 
 
 /* Physical memory map */
 #define PHYS_SDRAM                     (0x80000000)
-#define PHYS_SDRAM_SIZE                        (CONFIG_PCM052_DDR_SIZE * 1024 * 1024)
+#define PHYS_SDRAM_SIZE                        (CONFIG_PCM052_DDR_SIZE * SZ_1M)
 
 #define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM
 #define CONFIG_SYS_INIT_RAM_ADDR       IRAM_BASE_ADDR
 
 /* environment organization */
 #ifdef CONFIG_ENV_IS_IN_MMC
-#define CONFIG_ENV_SIZE                        (8 * 1024)
+#define CONFIG_ENV_SIZE                        (SZ_8K)
 
-#define CONFIG_ENV_OFFSET              (12 * 64 * 1024)
+#define CONFIG_ENV_OFFSET              (12 * SZ_64K)
 #define CONFIG_SYS_MMC_ENV_DEV         0
 #endif
 
 #ifdef CONFIG_ENV_IS_IN_NAND
-#define CONFIG_ENV_SECT_SIZE           (128 * 1024)
-#define CONFIG_ENV_SIZE                        (8 * 1024)
+#define CONFIG_ENV_SECT_SIZE           (SZ_128K)
+#define CONFIG_ENV_SIZE                        (SZ_8K)
 #define CONFIG_ENV_OFFSET              0xA0000
-#define CONFIG_ENV_SIZE_REDUND         (8 * 1024)
+#define CONFIG_ENV_SIZE_REDUND         (SZ_8K)
 #define CONFIG_ENV_OFFSET_REDUND       0xC0000
 #endif
 
index 48f1f7baccba1616885a4185204e251675e2ccb5..a535d0c2f2d02a4558fcb234dd7961941c4ce64f 100644 (file)
  * board schematic and physical port wired to each.  Then for host we
  * add mass storage support.
  */
-#define CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
 #define CONFIG_AM335X_USB0
 #define CONFIG_AM335X_USB0_MODE        MUSB_PERIPHERAL
 #define CONFIG_AM335X_USB1
diff --git a/include/configs/sama5d2_icp.h b/include/configs/sama5d2_icp.h
new file mode 100644 (file)
index 0000000..afcd22b
--- /dev/null
@@ -0,0 +1,69 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Configuration file for the SAMA5D2 ICP Board.
+ *
+ * Copyright (C) 2018 Microchip Corporation
+ *                   Eugen Hristev <eugen.hristev@microchip.com>
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#include "at91-sama5_common.h"
+
+#undef CONFIG_SYS_AT91_MAIN_CLOCK
+#define CONFIG_SYS_AT91_MAIN_CLOCK      12000000 /* from 12 MHz crystal */
+
+#define CONFIG_MISC_INIT_R
+
+/* SDRAM */
+#define CONFIG_SYS_SDRAM_BASE          0x20000000
+#define CONFIG_SYS_SDRAM_SIZE          0x20000000
+
+#ifdef CONFIG_SPL_BUILD
+#define CONFIG_SYS_INIT_SP_ADDR                0x218000
+#else
+#define CONFIG_SYS_INIT_SP_ADDR \
+       (CONFIG_SYS_SDRAM_BASE + 16 * 1024 - GENERATED_GBL_DATA_SIZE)
+#endif
+
+#define CONFIG_SYS_LOAD_ADDR           0x22000000 /* load address */
+
+/* NAND flash */
+#undef CONFIG_CMD_NAND
+
+/* SPI flash */
+#define CONFIG_SF_DEFAULT_SPEED                66000000
+
+#undef CONFIG_BOOTCOMMAND
+#ifdef CONFIG_SD_BOOT
+/* u-boot env in sd/mmc card */
+#define FAT_ENV_INTERFACE      "mmc"
+#define FAT_ENV_DEVICE_AND_PART        "0"
+#define FAT_ENV_FILE           "uboot.env"
+#define CONFIG_ENV_SIZE                0x4000
+/* bootstrap + u-boot + env in sd card */
+#define CONFIG_BOOTCOMMAND     "fatload mmc 0:1 0x21000000 at91-sama5d2_icp.dtb; " \
+                               "fatload mmc 0:1 0x22000000 zImage; " \
+                               "bootz 0x22000000 - 0x21000000"
+#undef CONFIG_BOOTARGS
+#define CONFIG_BOOTARGS \
+       "console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait"
+#endif
+
+/* SPL */
+#define CONFIG_SPL_TEXT_BASE           0x200000
+#define CONFIG_SPL_MAX_SIZE            0x10000
+#define CONFIG_SPL_BSS_START_ADDR      0x20000000
+#define CONFIG_SPL_BSS_MAX_SIZE                0x80000
+#define CONFIG_SYS_SPL_MALLOC_START    0x20080000
+#define CONFIG_SYS_SPL_MALLOC_SIZE     0x80000
+
+#define CONFIG_SYS_MONITOR_LEN         (512 << 10)
+
+#ifdef CONFIG_SD_BOOT
+#define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
+#define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME                "u-boot.img"
+#endif
+
+#endif
index f44a4280f435bb02e6831e118291fe1eb83c2108..1170f24748d9d6d718362adcae1b19eee189b200 100644 (file)
 /*
  * USB configuration
  */
-#define CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
-
 #define CONFIG_AM335X_USB0
 #define CONFIG_AM335X_USB0_MODE        MUSB_PERIPHERAL
 #define CONFIG_AM335X_USB1
index 09c9b7ca9efa4cc4ad8a7cbf17d476a30fc787ee..f9e2cdc1b3053402e5342cd426f7177ec1ffdec4 100644 (file)
@@ -338,6 +338,7 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
        "scriptaddr=0x02100000\0" \
        "pxefile_addr_r=0x02200000\0" \
        "ramdisk_addr_r=0x02300000\0" \
+       "socfpga_legacy_reset_compat=1\0" \
        BOOTENV
 
 #endif
index 701298cab88b8f588f641ccf40a6cf0130b6f802..737dfd6a5c2ae2af6e26a477c02bf883d0e56236 100644 (file)
 #include <linux/sizes.h>
 #include <asm/arch/stm32.h>
 
-#define CONFIG_PREBOOT
-
 /*
  * Number of clock ticks in 1 sec
  */
 #define CONFIG_SYS_HZ                          1000
 
+#ifndef CONFIG_STM32MP1_TRUSTED
 /* PSCI support */
 #define CONFIG_ARMV7_PSCI_1_0
 #define CONFIG_ARMV7_SECURE_BASE               STM32_SYSRAM_BASE
 #define CONFIG_ARMV7_SECURE_MAX_SIZE           STM32_SYSRAM_SIZE
+#endif
 
 /*
  * malloc() pool size
@@ -53,6 +53,9 @@
 #define CONFIG_SETUP_MEMORY_TAGS
 #define CONFIG_INITRD_TAG
 
+/* Extend size of kernel image for uncompression */
+#define CONFIG_SYS_BOOTM_LEN                   SZ_32M
+
 /* SPL support */
 #ifdef CONFIG_SPL
 /* BOOTROM load address */
                                         STM32_SYSRAM_SIZE)
 #endif /* #ifdef CONFIG_SPL */
 
+#define CONFIG_SYS_MEMTEST_START       STM32_DDR_BASE
+#define CONFIG_SYS_MEMTEST_END         (CONFIG_SYS_MEMTEST_START + SZ_64M)
+#define CONFIG_SYS_MEMTEST_SCRATCH     (CONFIG_SYS_MEMTEST_END + 4)
+
 /*MMC SD*/
 #define CONFIG_SYS_MMC_MAX_DEVICE      3
 #define CONFIG_SUPPORT_EMMC_BOOT
 
-#if !defined(CONFIG_SPL) || !defined(CONFIG_SPL_BUILD)
+/*****************************************************************************/
+#ifdef CONFIG_DISTRO_DEFAULTS
+/*****************************************************************************/
+
+#if !defined(CONFIG_SPL_BUILD)
 
 #define BOOT_TARGET_DEVICES(func) \
        func(MMC, mmc, 1) \
        func(MMC, mmc, 0) \
        func(MMC, mmc, 2)
+/*
+ * bootcmd for stm32mp1:
+ * for serial/usb: execute the stm32prog command
+ * for mmc boot (eMMC, SD card), boot only on the same device
+ * for nand boot, boot with on ubifs partition on nand
+ * for nor boot, use the default order
+ */
+#define CONFIG_PREBOOT
 
-#include <config_distro_bootcmd.h>
+#define STM32MP_BOOTCMD "bootcmd_stm32mp=" \
+       "echo \"Boot over ${boot_device}${boot_instance}!\";" \
+       "if test ${boot_device} = serial || test ${boot_device} = usb;" \
+       "then stm32prog ${boot_device} ${boot_instance}; " \
+       "else " \
+               "if test ${boot_device} = mmc;" \
+               "then env set boot_targets \"mmc${boot_instance}\"; fi;" \
+               "if test ${boot_device} = nand;" \
+               "then env set boot_targets ubifs0; fi;" \
+               "run distro_bootcmd;" \
+       "fi;\0"
 
-#define STM32MP_PREBOOT        \
-       "echo \"Boot over ${boot_device}${boot_instance}!\"; " \
-       "if test \"${boot_device}\" = \"mmc\"; then " \
-               "env set boot_targets \"mmc${boot_instance}\"; "\
-       "fi;"
+#include <config_distro_bootcmd.h>
 
+/*
+ * memory layout for 32M uncompressed/compressed kernel,
+ * 1M fdt, 1M script, 1M pxe and 1M for splashimage
+ * and the ramdisk at the end.
+ */
 #define CONFIG_EXTRA_ENV_SETTINGS \
-       "scriptaddr=0xC0000000\0" \
-       "pxefile_addr_r=0xC0000000\0" \
-       "kernel_addr_r=0xC1000000\0" \
-       "fdt_addr_r=0xC4000000\0" \
-       "ramdisk_addr_r=0xC4100000\0" \
+       "kernel_addr_r=0xc2000000\0" \
+       "fdt_addr_r=0xc4000000\0" \
+       "scriptaddr=0xc4100000\0" \
+       "pxefile_addr_r=0xc4200000\0" \
+       "splashimage=0xc4300000\0"  \
+       "ramdisk_addr_r=0xc4400000\0" \
        "fdt_high=0xffffffff\0" \
        "initrd_high=0xffffffff\0" \
-       "preboot=" STM32MP_PREBOOT "\0" \
+       STM32MP_BOOTCMD \
        BOOTENV
 
 #endif /* ifndef CONFIG_SPL_BUILD */
+#endif /* ifdef CONFIG_DISTRO_DEFAULTS*/
 
 #endif /* __CONFIG_H */
index b01d1c3c843516733a9895866032d1e3958cd14b..a498393472b8a4512210894a7235d6813aa25670 100644 (file)
 #define PHYS_SDRAM_0_SIZE              0x80000000 /* 2 GiB */
 
 #ifdef CONFIG_AHCI
-#define CONFIG_SCSI_AHCI_PLAT
-#define CONFIG_SUNXI_AHCI
 #define CONFIG_SYS_64BIT_LBA
-#define CONFIG_SYS_SCSI_MAX_SCSI_ID    1
-#define CONFIG_SYS_SCSI_MAX_LUN                1
-#define CONFIG_SYS_SCSI_MAX_DEVICE     (CONFIG_SYS_SCSI_MAX_SCSI_ID * \
-                                        CONFIG_SYS_SCSI_MAX_LUN)
 #endif
 
 #define CONFIG_SETUP_MEMORY_TAGS
@@ -449,7 +443,6 @@ extern int soft_i2c_gpio_scl;
        "stdout=serial,vga\0" \
        "stderr=serial,vga\0"
 #elif CONFIG_DM_VIDEO
-#define CONFIG_SYS_WHITE_ON_BLACK
 #define CONSOLE_STDOUT_SETTINGS \
        "stdout=serial,vidconsole\0" \
        "stderr=serial,vidconsole\0"
index b06c90939cc9a59883e53bdd8bfe3b578039812c..a753d41835485e3ffa9749163d3d2fc9460c4b38 100644 (file)
 #define CONFIG_MXC_UART
 #define CONFIG_MXC_UART_BASE           UART1_BASE /* select UART1/UART2 */
 
-/* Filesystems / image support */
-
-/* MMC */
-#define CONFIG_SYS_FSL_USDHC_NUM       3
-#define CONFIG_SYS_FSL_ESDHC_ADDR      USDHC4_BASE_ADDR
-#define CONFIG_SUPPORT_EMMC_BOOT
-
 /* Ethernet */
 #define CONFIG_FEC_MXC
 #define CONFIG_FEC_MXC
@@ -58,7 +51,6 @@
 
 /* Framebuffer */
 #ifdef CONFIG_VIDEO
-#define CONFIG_VIDEO_IPUV3
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_IMX_HDMI
 #define CONFIG_IMX_VIDEO_SKIP
 #define CONFIG_DWC_AHSATA_PORT_ID      0
 #define CONFIG_DWC_AHSATA_BASE_ADDR    SATA_ARB_BASE_ADDR
 #define CONFIG_LBA48
+#define CONFIG_SYS_64BIT_LBA
 #endif
 
 /* USB */
 #ifdef CONFIG_CMD_USB
-#define CONFIG_USB_MAX_CONTROLLER_COUNT 2
 #define CONFIG_EHCI_HCD_INIT_AFTER_RESET
 #define CONFIG_MXC_USB_PORTSC          (PORT_PTS_UTMI | PORT_PTS_PTW)
 #ifdef CONFIG_CMD_USB_MASS_STORAGE
 #endif /* CONFIG_USB_KEYBOARD */
 #endif /* CONFIG_CMD_USB      */
 
-/* RTC */
-#ifdef CONFIG_CMD_DATE
-#define CONFIG_RTC_DS1307
-#define CONFIG_SYS_RTC_BUS_NUM         2
-#endif
-
-/* I2C */
-#ifdef CONFIG_CMD_I2C
-#define CONFIG_SYS_I2C
-#define CONFIG_SYS_I2C_MXC
-#define CONFIG_SYS_I2C_MXC_I2C1                /* enable I2C bus 1 */
-#define CONFIG_SYS_I2C_MXC_I2C2                /* enable I2C bus 2 */
-#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
-#define CONFIG_SYS_I2C_SPEED           100000
-#define CONFIG_I2C_EDID
-#endif
-
 /* Environment organization */
 #define CONFIG_SYS_MMC_ENV_DEV         2 /* overwritten on SD boot */
 #define CONFIG_SYS_MMC_ENV_PART                1 /* overwritten on SD boot */
index 59b2546f0b4caab351c6a59e40edc6687dd687cd..cd92835112dd56b44bef5f78e39862f75e2a9de5 100644 (file)
@@ -39,8 +39,6 @@
 #define CONFIG_EHCI_IS_TDI
 #define CONFIG_USB_MAX_CONTROLLER_COUNT 3
 
-/* SPI NOR flash default params, used by sf commands */
-
 /* Environment in SPI NOR flash */
 #define CONFIG_ENV_OFFSET              (1 << 20) /* 1MiB in */
 #define CONFIG_ENV_SIZE                        (64 << 10) /* 64KiB */
index fb8c082c1dcdaf706d07d5af791ec628ac75c748..eeca085f9fc2cb9f57e788ce695df95322ff3fec 100644 (file)
@@ -22,7 +22,7 @@
 /* Memory Configuration */
 #define CONFIG_SYS_LPAE_SDRAM_BASE     0x800000000
 #define CONFIG_MAX_RAM_BANK_SIZE       (2 << 30)       /* 2GB */
-#define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SPL_TEXT_BASE - \
+#define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_ISW_ENTRY_ADDR - \
                                        GENERATED_GBL_DATA_SIZE)
 
 #ifdef CONFIG_SYS_MALLOC_F_LEN
 #endif
 
 /* SPL SPI Loader Configuration */
+#define CONFIG_SPL_TEXT_BASE           CONFIG_ISW_ENTRY_ADDR
 #define CONFIG_SPL_PAD_TO              65536
 #define CONFIG_SPL_MAX_SIZE            (CONFIG_SPL_PAD_TO - 8)
-#define CONFIG_SPL_BSS_START_ADDR      (CONFIG_SPL_TEXT_BASE + \
+#define CONFIG_SPL_BSS_START_ADDR      (CONFIG_ISW_ENTRY_ADDR + \
                                        CONFIG_SPL_MAX_SIZE)
 #define CONFIG_SPL_BSS_MAX_SIZE                (32 * 1024)
 #define CONFIG_SYS_SPL_MALLOC_START    (CONFIG_SPL_BSS_START_ADDR + \
 #define CONFIG_KSNET_SERDES_SGMII2_BASE                KS2_SGMII_SERDES2_BASE
 #define CONFIG_KSNET_SERDES_LANES_PER_SGMII    KS2_LANES_PER_SGMII_SERDES
 
-/* SerDes */
-#define CONFIG_TI_KEYSTONE_SERDES
-
 #define CONFIG_AEMIF_CNTRL_BASE                KS2_AEMIF_CNTRL_BASE
 
 /* I2C Configuration */
index ba57c40182cca7aa3739d1d84e9753dc9c3c565e..7c08e47d3d19ada432466d47908f08ff9b566451 100644 (file)
@@ -56,6 +56,7 @@
 
 #include <environment/ti/boot.h>
 #include <environment/ti/mmc.h>
+#include <environment/ti/nand.h>
 
 #define CONFIG_EXTRA_ENV_SETTINGS \
        DEFAULT_LINUX_BOOT_ENV \
@@ -65,6 +66,7 @@
        DEFAULT_FDT_TI_ARGS \
        DFUARGS \
        NETARGS \
+       NANDARGS \
 
 /*
  * SPL related defines.  The Public RAM memory map the ROM defines the
 
 #define CONFIG_SYS_SPL_ARGS_ADDR       (CONFIG_SYS_SDRAM_BASE + \
                                         (128 << 20))
-
 #ifdef CONFIG_SPL_BUILD
 #undef CONFIG_TIMER
 #endif
index 5d5394e3e53b9fed10733a267ab05d1084b4a066..0de40eddcb5b1ec6545a06fff373c99874addd24 100644 (file)
 #define CONFIG_I2C_MV
 #define CONFIG_SYS_I2C_SLAVE           0x0
 
-/*
- * SPI Flash configuration
- */
-
 /* Environment in SPI NOR flash */
 #define CONFIG_ENV_OFFSET              0x180000 /* as Marvell U-Boot version */
 #define CONFIG_ENV_SIZE                        (64 << 10) /* 64KiB */
index 038f6398eb6c690dd165a358f03882ec79ac8907..c7805cf36bf2c142cb974853dcd3cd1bd5b51ca1 100644 (file)
@@ -34,9 +34,6 @@
 # define CONFIG_WATCHDOG
 #endif
 
-/* SPI NOR flash default params, used by sf commands */
-#define CONFIG_SPI_FLASH_SPANSION
-
 /*
  * SDIO/MMC Card Configuration
  */
index 2840c7b815b53275afeea6392fca53fda683e7e4..8c68372026e9f089df5062bb9430ab5fc1751105 100644 (file)
@@ -10,7 +10,7 @@
 
 /* Onboard devices */
 
-#define CONFIG_SYS_MALLOC_LEN          0x100000
+#define CONFIG_SYS_MALLOC_LEN          0x1F0000
 #define CONFIG_SYS_LOAD_ADDR           0x00100000
 #define CONFIG_SYS_INIT_SP_OFFSET       0x400000
 
@@ -27,7 +27,7 @@
 
 #if defined(CONFIG_ENV_IS_IN_SPI_FLASH) && !defined(CONFIG_ENV_OFFSET)
 #define CONFIG_ENV_OFFSET              (1024 * 1024)
-#define CONFIG_ENV_SIZE                        (256 * 1024)
+#define CONFIG_ENV_SIZE                        (8 * 1024)
 #define CONFIG_ENV_SECT_SIZE           (256 * 1024)
 
 #define CONFIG_SYS_REDUNDAND_ENVIRONMENT
index 686a3837393f773d754a7581bdf1fc86bb7e0ad9..ba85bc91e74df860dd1f3d97002cd57d41dca652 100644 (file)
 /* Enable passing of ATAGs */
 #define CONFIG_CMDLINE_TAG
 
-#ifdef CONFIG_CMD_FUSE
-#define CONFIG_MXC_OCOTP
-#endif
-
 /* Size of malloc() pool */
 #define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 2 * 1024 * 1024)
 
index b03a1c550cdd4bd26cc81f85f9db529d8f41eaa6..2e6262f0f4c6e038215c082ef63e30160490a141 100644 (file)
 #define CONFIG_SYS_MEMTEST_START       0x10000000
 #define CONFIG_SYS_MEMTEST_END         (CONFIG_SYS_MEMTEST_START + 500 * SZ_1M)
 
-/* I2C Configs */
-#define CONFIG_SYS_I2C
-#define CONFIG_SYS_I2C_MXC
-#define CONFIG_SYS_I2C_MXC_I2C1                /* enable I2C bus 1 */
-#define CONFIG_SYS_I2C_MXC_I2C2                /* enable I2C bus 2 */
-#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
-#define CONFIG_SYS_I2C_SPEED           100000
-
-/* PMIC */
-#define CONFIG_POWER
-#define CONFIG_POWER_I2C
-#define CONFIG_POWER_PFUZE100
-#define CONFIG_POWER_PFUZE100_I2C_ADDR 0x08
-
 /* MMC Configuration */
 #define CONFIG_SYS_FSL_USDHC_NUM       2
 #define CONFIG_SYS_FSL_ESDHC_ADDR      0
 
 /* USB Configs */
-#define CONFIG_USB_MAX_CONTROLLER_COUNT        2
 #define CONFIG_MXC_USB_PORTSC          (PORT_PTS_UTMI | PORT_PTS_PTW)
 #define CONFIG_MXC_USB_FLAGS           0
 
@@ -64,8 +49,6 @@
 #define CONFIG_PHY_ATHEROS
 
 /* Framebuffer */
-#ifdef CONFIG_VIDEO
-#define CONFIG_VIDEO_IPUV3
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_SPLASH_SCREEN
 #define CONFIG_SPLASH_SCREEN_ALIGN
@@ -74,7 +57,6 @@
 #define CONFIG_VIDEO_BMP_LOGO
 #define CONFIG_IMX_HDMI
 #define CONFIG_IMX_VIDEO_SKIP
-#endif
 
 #define CONFIG_EXTRA_ENV_SETTINGS \
        "console=ttymxc0\0" \
index 27a8e4d4906d0c22685a942b1f1dca61c283eafb..91ae7088a50ae499e13ea3de54627c919f8f14bb 100644 (file)
 # define PHY_ANEG_TIMEOUT       20000
 #endif
 
-/* EEPROM */
-#ifdef CONFIG_ZYNQMP_EEPROM
-# define CONFIG_SYS_I2C_EEPROM_ADDR_LEN                2
-# define CONFIG_SYS_I2C_EEPROM_ADDR            0x54
-# define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS     4
-# define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS 5
-# define CONFIG_SYS_EEPROM_SIZE                        (64 * 1024)
-#endif
-
 #define CONFIG_SYS_BOOTM_LEN   (60 * 1024 * 1024)
 
 #define CONFIG_CLOCKS
index 94177c6fcb5cb9829657962e19d09c4e05d00825..3ab783e3a8ebe10010afd97ba8b0e7483efc6e04 100644 (file)
@@ -69,7 +69,7 @@
 # define CONFIG_THOR_RESET_OFF
 # define DFU_ALT_INFO_RAM \
        "dfu_ram_info=" \
-       "set dfu_alt_info " \
+       "setenv dfu_alt_info " \
        "${kernel_image} ram 0x3000000 0x500000\\\\;" \
        "${devicetree_image} ram 0x2A00000 0x20000\\\\;" \
        "${ramdisk_image} ram 0x2000000 0x600000\0" \
@@ -79,7 +79,7 @@
 # if defined(CONFIG_MMC_SDHCI_ZYNQ)
 #  define DFU_ALT_INFO_MMC \
        "dfu_mmc_info=" \
-       "set dfu_alt_info " \
+       "setenv dfu_alt_info " \
        "${kernel_image} fat 0 1\\\\;" \
        "${devicetree_image} fat 0 1\\\\;" \
        "${ramdisk_image} fat 0 1\0" \
                                "env run importbootenv; " \
                        "fi; " \
                "fi; \0" \
-       "sd_loadbootenv=set bootenv_dev mmc && " \
+       "sd_loadbootenv=setenv bootenv_dev mmc && " \
                        "run setbootenv \0" \
-       "usb_loadbootenv=set bootenv_dev usb && usb start && run setbootenv \0" \
+       "usb_loadbootenv=setenv bootenv_dev usb && usb start && run setbootenv \0" \
        "preboot=if test $modeboot = sdboot; then " \
                        "run sd_loadbootenv; " \
                        "echo Checking if uenvcmd is set ...; " \
index 9f8ce8850f51d1958596a76edf5f2c1c06fb3def..96ff254f981254900123b9117471646da6931997 100644 (file)
 #ifndef _CPSW_H_
 #define _CPSW_H_
 
+/* reg offset */
+#define CPSW_HOST_PORT_OFFSET  0x108
+#define CPSW_SLAVE0_OFFSET     0x208
+#define CPSW_SLAVE1_OFFSET     0x308
+#define CPSW_SLAVE_SIZE                0x100
+#define CPSW_CPDMA_OFFSET      0x800
+#define CPSW_HW_STATS          0x900
+#define CPSW_STATERAM_OFFSET   0xa00
+#define CPSW_CPTS_OFFSET       0xc00
+#define CPSW_ALE_OFFSET                0xd00
+#define CPSW_SLIVER0_OFFSET    0xd80
+#define CPSW_SLIVER1_OFFSET    0xdc0
+#define CPSW_BD_OFFSET         0x2000
+#define CPSW_MDIO_DIV          0xff
+
+#define AM335X_GMII_SEL_OFFSET 0x630
+
 struct cpsw_slave_data {
        u32             slave_reg_ofs;
        u32             sliver_reg_ofs;
@@ -50,10 +67,16 @@ struct cpsw_platform_data {
        u32     active_slave;
        bool    rmii_clock_external;
        u8      version;
+       const char *phy_sel_compat;
+       u32     syscon_addr;
+       const char *macid_sel_compat;
 };
 
 int cpsw_register(struct cpsw_platform_data *data);
-int ti_cm_get_macid(struct udevice *dev, int slave, u8 *mac_addr);
+int ti_cm_get_macid_addr(struct udevice *dev, int slave,
+                        struct cpsw_platform_data *data);
+void ti_cm_get_macid(struct udevice *dev, struct cpsw_platform_data *data,
+                    u8 *mac_addr);
 int cpsw_get_slave_phy_addr(struct udevice *dev, int slave);
 
 #endif /* _CPSW_H_  */
index ff2b82e7c25d23896c9803bf82fc1d376bfdb85d..63a7d55b88808c428c71ff243f5850262af30121 100644 (file)
@@ -354,18 +354,6 @@ int pinctrl_get_periph_id(struct udevice *dev, struct udevice *periph);
  */
 int pinctrl_decode_pin_config(const void *blob, int node);
 
-/**
- * pinctrl_decode_pin_config_dm() - decode pin configuration flags
- *
- * This decodes some of the PIN_CONFIG values into flags, with each value
- * being (1 << pin_cfg). This does not support things with values like the
- * slew rate.
- *
- * @pinconfig: Pinconfig udevice
- * @return decoded flag value, or -ve on error
- */
-int pinctrl_decode_pin_config_dm(struct udevice *dev);
-
 /**
  * pinctrl_get_gpio_mux() - get the mux value for a particular GPIO
  *
index 9ff6531d1b25f3380ed35bdb9c21ec620086f027..60d3b93decdb321e7bb2476cda4ef75918ca0418 100644 (file)
@@ -39,32 +39,6 @@ static inline void dm_dump_devres(void)
 }
 #endif
 
-/**
- * Check if a dt node should be or was bound before relocation.
- *
- * Devicetree nodes can be marked as needed to be bound
- * in the loader stages via special devicetree properties.
- *
- * Before relocation this function can be used to check if nodes
- * are required in either SPL or TPL stages.
- *
- * After relocation and jumping into the real U-Boot binary
- * it is possible to determine if a node was bound in one of
- * SPL/TPL stages.
- *
- * There are 3 settings currently in use
- * -
- * - u-boot,dm-pre-reloc: legacy and indicates any of TPL or SPL
- *   Existing platforms only use it to indicate nodes needed in
- *   SPL. Should probably be replaced by u-boot,dm-spl for
- *   existing platforms.
- * @blob: devicetree
- * @offset: node offset
- *
- * Returns true if node is needed in SPL/TL, false otherwise.
- */
-bool dm_fdt_pre_reloc(const void *blob, int offset);
-
 /**
  * Check if an of node should be or was bound before relocation.
  *
diff --git a/include/dt-bindings/clock/mt8516-clk.h b/include/dt-bindings/clock/mt8516-clk.h
new file mode 100644 (file)
index 0000000..745b87f
--- /dev/null
@@ -0,0 +1,251 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2018 BayLibre, SAS
+ * Copyright (c) 2018 MediaTek Inc.
+ * Author: Fabien Parent <fparent@baylibre.com>
+ */
+
+#ifndef _DT_BINDINGS_CLK_MT8516_H
+#define _DT_BINDINGS_CLK_MT8516_H
+
+
+/* APMIXEDSYS */
+
+#define CLK_APMIXED_ARMPLL     0
+#define CLK_APMIXED_MAINPLL    1
+#define CLK_APMIXED_UNIVPLL    2
+#define CLK_APMIXED_MMPLL      3
+#define CLK_APMIXED_APLL1      4
+#define CLK_APMIXED_APLL2      5
+#define CLK_APMIXED_NR_CLK     6
+
+/* TOPCKGEN */
+
+#define CLK_TOP_CLK_NULL       0
+#define CLK_TOP_I2S_INFRA_BCK  1
+#define CLK_TOP_MEMPLL         2
+#define CLK_TOP_DMPLL          3
+#define CLK_TOP_MAINPLL_D2     4
+#define CLK_TOP_MAINPLL_D4     5
+#define CLK_TOP_MAINPLL_D8     6
+#define CLK_TOP_MAINPLL_D16    7
+#define CLK_TOP_MAINPLL_D11    8
+#define CLK_TOP_MAINPLL_D22    9
+#define CLK_TOP_MAINPLL_D3     10
+#define CLK_TOP_MAINPLL_D6     11
+#define CLK_TOP_MAINPLL_D12    12
+#define CLK_TOP_MAINPLL_D5     13
+#define CLK_TOP_MAINPLL_D10    14
+#define CLK_TOP_MAINPLL_D20    15
+#define CLK_TOP_MAINPLL_D40    16
+#define CLK_TOP_MAINPLL_D7     17
+#define CLK_TOP_MAINPLL_D14    18
+#define CLK_TOP_UNIVPLL_D2     19
+#define CLK_TOP_UNIVPLL_D4     20
+#define CLK_TOP_UNIVPLL_D8     21
+#define CLK_TOP_UNIVPLL_D16    22
+#define CLK_TOP_UNIVPLL_D3     23
+#define CLK_TOP_UNIVPLL_D6     24
+#define CLK_TOP_UNIVPLL_D12    25
+#define CLK_TOP_UNIVPLL_D24    26
+#define CLK_TOP_UNIVPLL_D5     27
+#define CLK_TOP_UNIVPLL_D20    28
+#define CLK_TOP_MMPLL380M      29
+#define CLK_TOP_MMPLL_D2       30
+#define CLK_TOP_MMPLL_200M     31
+#define CLK_TOP_USB_PHY48M     32
+#define CLK_TOP_APLL1          33
+#define CLK_TOP_APLL1_D2       34
+#define CLK_TOP_APLL1_D4       35
+#define CLK_TOP_APLL1_D8       36
+#define CLK_TOP_APLL2          37
+#define CLK_TOP_APLL2_D2       38
+#define CLK_TOP_APLL2_D4       39
+#define CLK_TOP_APLL2_D8       40
+#define CLK_TOP_CLK26M         41
+#define CLK_TOP_CLK26M_D2      42
+#define CLK_TOP_AHB_INFRA_D2   43
+#define CLK_TOP_NFI1X          44
+#define CLK_TOP_ETH_D2         45
+#define CLK_TOP_UART0_SEL      46
+#define CLK_TOP_GFMUX_EMI1X_SEL        47
+#define CLK_TOP_EMI_DDRPHY_SEL 48
+#define CLK_TOP_AHB_INFRA_SEL  49
+#define CLK_TOP_CSW_MUX_MFG_SEL        50
+#define CLK_TOP_MSDC0_SEL      51
+#define CLK_TOP_PWM_MM_SEL     52
+#define CLK_TOP_UART1_SEL      53
+#define CLK_TOP_MSDC1_SEL      54
+#define CLK_TOP_SPM_52M_SEL    55
+#define CLK_TOP_PMICSPI_SEL    56
+#define CLK_TOP_QAXI_AUD26M_SEL        57
+#define CLK_TOP_AUD_INTBUS_SEL 58
+#define CLK_TOP_NFI2X_PAD_SEL  59
+#define CLK_TOP_NFI1X_PAD_SEL  60
+#define CLK_TOP_MFG_MM_SEL     61
+#define CLK_TOP_DDRPHYCFG_SEL  62
+#define CLK_TOP_USB_78M_SEL    63
+#define CLK_TOP_SPINOR_SEL     64
+#define CLK_TOP_MSDC2_SEL      65
+#define CLK_TOP_ETH_SEL                66
+#define CLK_TOP_AXI_MFG_IN_SEL 67
+#define CLK_TOP_SLOW_MFG_SEL   68
+#define CLK_TOP_AUD1_SEL       69
+#define CLK_TOP_AUD2_SEL       70
+#define CLK_TOP_AUD_ENGEN1_SEL 71
+#define CLK_TOP_AUD_ENGEN2_SEL 72
+#define CLK_TOP_I2C_SEL                73
+#define CLK_TOP_AUD_I2S0_M_SEL 74
+#define CLK_TOP_AUD_I2S1_M_SEL 75
+#define CLK_TOP_AUD_I2S2_M_SEL 76
+#define CLK_TOP_AUD_I2S3_M_SEL 77
+#define CLK_TOP_AUD_I2S4_M_SEL 78
+#define CLK_TOP_AUD_I2S5_M_SEL 79
+#define CLK_TOP_AUD_SPDIF_B_SEL        80
+#define CLK_TOP_PWM_SEL                81
+#define CLK_TOP_SPI_SEL                82
+#define CLK_TOP_AUD_SPDIFIN_SEL        83
+#define CLK_TOP_UART2_SEL      84
+#define CLK_TOP_BSI_SEL                85
+#define CLK_TOP_DBG_ATCLK_SEL  86
+#define CLK_TOP_CSW_NFIECC_SEL 87
+#define CLK_TOP_NFIECC_SEL     88
+#define CLK_TOP_APLL12_CK_DIV0 89
+#define CLK_TOP_APLL12_CK_DIV1 90
+#define CLK_TOP_APLL12_CK_DIV2 91
+#define CLK_TOP_APLL12_CK_DIV3 92
+#define CLK_TOP_APLL12_CK_DIV4 93
+#define CLK_TOP_APLL12_CK_DIV4B        94
+#define CLK_TOP_APLL12_CK_DIV5 95
+#define CLK_TOP_APLL12_CK_DIV5B        96
+#define CLK_TOP_APLL12_CK_DIV6 97
+#define CLK_TOP_NR_CLK         98
+
+/* TOPCKGEN Gates */
+#define CLK_TOP_PWM_MM         0
+#define CLK_TOP_MFG_MM         1
+#define CLK_TOP_SPM_52M                2
+#define CLK_TOP_THEM           3
+#define CLK_TOP_APDMA          4
+#define CLK_TOP_I2C0           5
+#define CLK_TOP_I2C1           6
+#define CLK_TOP_AUXADC1                7
+#define CLK_TOP_NFI            8
+#define CLK_TOP_NFIECC         9
+#define CLK_TOP_DEBUGSYS       10
+#define CLK_TOP_PWM            11
+#define CLK_TOP_UART0          12
+#define CLK_TOP_UART1          13
+#define CLK_TOP_BTIF           14
+#define CLK_TOP_USB            15
+#define CLK_TOP_FLASHIF_26M    16
+#define CLK_TOP_AUXADC2                17
+#define CLK_TOP_I2C2           18
+#define CLK_TOP_MSDC0          19
+#define CLK_TOP_MSDC1          20
+#define CLK_TOP_NFI2X          21
+#define CLK_TOP_PMICWRAP_AP    22
+#define CLK_TOP_SEJ            23
+#define CLK_TOP_MEMSLP_DLYER   24
+#define CLK_TOP_SPI            25
+#define CLK_TOP_APXGPT         26
+#define CLK_TOP_AUDIO          27
+#define CLK_TOP_PMICWRAP_MD    28
+#define CLK_TOP_PMICWRAP_CONN  29
+#define CLK_TOP_PMICWRAP_26M   30
+#define CLK_TOP_AUX_ADC                31
+#define CLK_TOP_AUX_TP         32
+#define CLK_TOP_MSDC2          33
+#define CLK_TOP_RBIST          34
+#define CLK_TOP_NFI_BUS                35
+#define CLK_TOP_GCE            36
+#define CLK_TOP_TRNG           37
+#define CLK_TOP_SEJ_13M                38
+#define CLK_TOP_AES            39
+#define CLK_TOP_PWM_B          40
+#define CLK_TOP_PWM1_FB                41
+#define CLK_TOP_PWM2_FB                42
+#define CLK_TOP_PWM3_FB                43
+#define CLK_TOP_PWM4_FB                44
+#define CLK_TOP_PWM5_FB                45
+#define CLK_TOP_USB_1P         46
+#define CLK_TOP_FLASHIF_FREERUN        47
+#define CLK_TOP_66M_ETH                48
+#define CLK_TOP_133M_ETH       49
+#define CLK_TOP_FETH_25M       50
+#define CLK_TOP_FETH_50M       51
+#define CLK_TOP_FLASHIF_AXI    52
+#define CLK_TOP_USBIF          53
+#define CLK_TOP_UART2          54
+#define CLK_TOP_BSI            55
+#define CLK_TOP_MSDC0_INFRA    56
+#define CLK_TOP_MSDC1_INFRA    57
+#define CLK_TOP_MSDC2_INFRA    58
+#define CLK_TOP_USB_78M                59
+#define CLK_TOP_RG_SPINOR      60
+#define CLK_TOP_RG_MSDC2       61
+#define CLK_TOP_RG_ETH         62
+#define CLK_TOP_RG_AXI_MFG     63
+#define CLK_TOP_RG_SLOW_MFG    64
+#define CLK_TOP_RG_AUD1                65
+#define CLK_TOP_RG_AUD2                66
+#define CLK_TOP_RG_AUD_ENGEN1  67
+#define CLK_TOP_RG_AUD_ENGEN2  68
+#define CLK_TOP_RG_I2C         69
+#define CLK_TOP_RG_PWM_INFRA   70
+#define CLK_TOP_RG_AUD_SPDIF_IN        71
+#define CLK_TOP_RG_UART2       72
+#define CLK_TOP_RG_BSI         73
+#define CLK_TOP_RG_DBG_ATCLK   74
+#define CLK_TOP_RG_NFIECC      75
+#define CLK_TOP_RG_APLL1_D2_EN 76
+#define CLK_TOP_RG_APLL1_D4_EN 77
+#define CLK_TOP_RG_APLL1_D8_EN 78
+#define CLK_TOP_RG_APLL2_D2_EN 79
+#define CLK_TOP_RG_APLL2_D4_EN 80
+#define CLK_TOP_RG_APLL2_D8_EN 81
+#define CLK_TOP_APLL12_DIV0    82
+#define CLK_TOP_APLL12_DIV1    83
+#define CLK_TOP_APLL12_DIV2    84
+#define CLK_TOP_APLL12_DIV3    85
+#define CLK_TOP_APLL12_DIV4    86
+#define CLK_TOP_APLL12_DIV4B   87
+#define CLK_TOP_APLL12_DIV5    88
+#define CLK_TOP_APLL12_DIV5B   89
+#define CLK_TOP_APLL12_DIV6    90
+
+/* INFRACFG */
+
+#define CLK_IFR_MUX1_SEL       0
+#define CLK_IFR_ETH_25M_SEL    1
+#define CLK_IFR_I2C0_SEL       2
+#define CLK_IFR_I2C1_SEL       3
+#define CLK_IFR_I2C2_SEL       4
+#define CLK_IFR_NR_CLK         5
+
+/* AUDIOTOP */
+
+#define CLK_AUD_AFE            0
+#define CLK_AUD_I2S            1
+#define CLK_AUD_22M            2
+#define CLK_AUD_24M            3
+#define CLK_AUD_INTDIR         4
+#define CLK_AUD_APLL2_TUNER    5
+#define CLK_AUD_APLL_TUNER     6
+#define CLK_AUD_HDMI           7
+#define CLK_AUD_SPDF           8
+#define CLK_AUD_ADC            9
+#define CLK_AUD_DAC            10
+#define CLK_AUD_DAC_PREDIS     11
+#define CLK_AUD_TML            12
+#define CLK_AUD_NR_CLK         13
+
+/* MFGCFG */
+
+#define CLK_MFG_BAXI           0
+#define CLK_MFG_BMEM           1
+#define CLK_MFG_BG3D           2
+#define CLK_MFG_B26M           3
+#define CLK_MFG_NR_CLK         4
+
+#endif /* _DT_BINDINGS_CLK_MT8516_H */
index 1625b8bf34822b6e8f41f1dbdead56c8ce13bff6..c5955b56b36d80876e7cf6cd037a3d018909f1ef 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2015 Renesas Electronics Corp.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 
 #ifndef __DT_BINDINGS_CLOCK_R8A7790_CPG_MSSR_H__
index e8823410c01c5a09d0676ddf547c1821b42cf619..aadd06c566c043e7e1909a3dc23fa70514022de1 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2015 Renesas Electronics Corp.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 
 #ifndef __DT_BINDINGS_CLOCK_R8A7791_CPG_MSSR_H__
index 72ce85cb2f94b0abb206145d9332dc14a47f738c..829c44db0271c27a95b788a740bd728a733bb41b 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2015 Renesas Electronics Corp.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 
 #ifndef __DT_BINDINGS_CLOCK_R8A7792_CPG_MSSR_H__
index 7318d45d4e7e9888c41aa1fb66def087b4cb6ff4..49c66d8ed1782fc06d06000f6af96c8a2b464262 100644 (file)
@@ -1,16 +1,8 @@
-/*
+/* SPDX-License-Identifier: GPL-2.0
+ *
  * r8a7793 clock definition
  *
  * Copyright (C) 2014  Renesas Electronics Corporation
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * 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.
  */
 
 #ifndef __DT_BINDINGS_CLOCK_R8A7793_H__
index 8809b0f62d615457f07a463a3c4699d0276a0250..d1ff646c31f2355bf0e67d28c563a827a9df94a6 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2015 Renesas Electronics Corp.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 
 #ifndef __DT_BINDINGS_CLOCK_R8A7793_CPG_MSSR_H__
index 93e99c3ffc8dafebef94d0644cb15532c86ab1b4..649f005782d05213ae3760124e67e4913c5b419c 100644 (file)
@@ -1,11 +1,7 @@
-/*
+/* SPDX-License-Identifier: GPL-2.0+
+ *
  * Copyright (C) 2014 Renesas Electronics Corporation
  * Copyright 2013 Ideas On Board SPRL
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
  */
 
 #ifndef __DT_BINDINGS_CLOCK_R8A7794_H__
index 9d720311ae3a229a324febbeeaf698f0ec977c5c..6314e23b51af5be9a019a89ac2791c03bf69c57a 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2015 Renesas Electronics Corp.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 
 #ifndef __DT_BINDINGS_CLOCK_R8A7794_CPG_MSSR_H__
index f047eaf261f34ac783b2187997894daffe552572..92b3e2a95179d25cb67367b5208d7989fdd28795 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2015 Renesas Electronics Corp.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 #ifndef __DT_BINDINGS_CLOCK_R8A7795_CPG_MSSR_H__
 #define __DT_BINDINGS_CLOCK_R8A7795_CPG_MSSR_H__
@@ -54,7 +50,7 @@
 #define R8A7795_CLK_CANFD              39
 #define R8A7795_CLK_HDMI               40
 #define R8A7795_CLK_CSI0               41
-#define R8A7795_CLK_CSIREF             42
+/* CLK_CSIREF was removed */
 #define R8A7795_CLK_CP                 43
 #define R8A7795_CLK_CPEX               44
 #define R8A7795_CLK_R                  45
index 1e5942695f0dd057e0e3976824e0205b357eb6b9..c0957cf458403bfba85699904085dafd072d07d2 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2016 Renesas Electronics Corp.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2016 Renesas Electronics Corp.
  */
 #ifndef __DT_BINDINGS_CLOCK_R8A7796_CPG_MSSR_H__
 #define __DT_BINDINGS_CLOCK_R8A7796_CPG_MSSR_H__
@@ -60,7 +56,7 @@
 #define R8A7796_CLK_CANFD              45
 #define R8A7796_CLK_HDMI               46
 #define R8A7796_CLK_CSI0               47
-#define R8A7796_CLK_CSIREF             48
+/* CLK_CSIREF was removed */
 #define R8A7796_CLK_CP                 49
 #define R8A7796_CLK_CPEX               50
 #define R8A7796_CLK_R                  51
index 4e8ae3dee5901b01374e6fd609e7e988d4107676..fd701c4e87cf0e22ba08fce5c9a2027307466644 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2017 Glider bvba
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2017 Glider bvba
  */
 #ifndef __DT_BINDINGS_CLOCK_R8A77995_CPG_MSSR_H__
 #define __DT_BINDINGS_CLOCK_R8A77995_CPG_MSSR_H__
@@ -39,8 +35,8 @@
 #define R8A77995_CLK_CRD2              24
 #define R8A77995_CLK_SD0H              25
 #define R8A77995_CLK_SD0               26
-#define R8A77995_CLK_SSP2              27
-#define R8A77995_CLK_SSP1              28
+/* CLK_SSP2 was removed */
+/* CLK_SSP1 was removed */
 #define R8A77995_CLK_RPC               29
 #define R8A77995_CLK_RPCD2             30
 #define R8A77995_CLK_ZA2               31
@@ -53,5 +49,6 @@
 #define R8A77995_CLK_LV0               38
 #define R8A77995_CLK_LV1               39
 #define R8A77995_CLK_CP                        40
+#define R8A77995_CLK_CPEX              41
 
 #endif /* __DT_BINDINGS_CLOCK_R8A77995_CPG_MSSR_H__ */
diff --git a/include/dt-bindings/clock/sun8i-tcon-top.h b/include/dt-bindings/clock/sun8i-tcon-top.h
new file mode 100644 (file)
index 0000000..25164d7
--- /dev/null
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+/* Copyright (C) 2018 Jernej Skrabec <jernej.skrabec@siol.net> */
+
+#ifndef _DT_BINDINGS_CLOCK_SUN8I_TCON_TOP_H_
+#define _DT_BINDINGS_CLOCK_SUN8I_TCON_TOP_H_
+
+#define CLK_TCON_TOP_TV0       0
+#define CLK_TCON_TOP_TV1       1
+#define CLK_TCON_TOP_DSI       2
+
+#endif /* _DT_BINDINGS_CLOCK_SUN8I_TCON_TOP_H_ */
diff --git a/include/dt-bindings/dma/k3-udma.h b/include/dt-bindings/dma/k3-udma.h
new file mode 100644 (file)
index 0000000..670e123
--- /dev/null
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *  Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com
+ */
+
+#ifndef __DT_TI_UDMA_H
+#define __DT_TI_UDMA_H
+
+#define UDMA_TR_MODE           0
+#define UDMA_PKT_MODE          1
+
+#define UDMA_DIR_TX            0
+#define UDMA_DIR_RX            1
+
+#define PSIL_STATIC_TR_NONE    0
+#define PSIL_STATIC_TR_XY      1
+#define PSIL_STATIC_TR_MCAN    2
+
+#define UDMA_PDMA_TR_XY(id)                            \
+       ti,psil-config##id {                            \
+               linux,udma-mode = <UDMA_TR_MODE>;       \
+               statictr-type = <PSIL_STATIC_TR_XY>;    \
+       }
+
+#define UDMA_PDMA_PKT_XY(id)                           \
+       ti,psil-config##id {                            \
+               linux,udma-mode = <UDMA_PKT_MODE>;      \
+               statictr-type = <PSIL_STATIC_TR_XY>;    \
+       }
+
+#endif /* __DT_TI_UDMA_H */
diff --git a/include/dt-bindings/mfd/st,stpmic1.h b/include/dt-bindings/mfd/st,stpmic1.h
new file mode 100644 (file)
index 0000000..b2d6c83
--- /dev/null
@@ -0,0 +1,46 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) STMicroelectronics 2018 - All Rights Reserved
+ * Author: Philippe Peurichard <philippe.peurichard@st.com>,
+ * Pascal Paillet <p.paillet@st.com> for STMicroelectronics.
+ */
+
+#ifndef __DT_BINDINGS_STPMIC1_H__
+#define __DT_BINDINGS_STPMIC1_H__
+
+/* IRQ definitions */
+#define IT_PONKEY_F    0
+#define IT_PONKEY_R    1
+#define IT_WAKEUP_F    2
+#define IT_WAKEUP_R    3
+#define IT_VBUS_OTG_F  4
+#define IT_VBUS_OTG_R  5
+#define IT_SWOUT_F     6
+#define IT_SWOUT_R     7
+
+#define IT_CURLIM_BUCK1        8
+#define IT_CURLIM_BUCK2        9
+#define IT_CURLIM_BUCK3        10
+#define IT_CURLIM_BUCK4        11
+#define IT_OCP_OTG     12
+#define IT_OCP_SWOUT   13
+#define IT_OCP_BOOST   14
+#define IT_OVP_BOOST   15
+
+#define IT_CURLIM_LDO1 16
+#define IT_CURLIM_LDO2 17
+#define IT_CURLIM_LDO3 18
+#define IT_CURLIM_LDO4 19
+#define IT_CURLIM_LDO5 20
+#define IT_CURLIM_LDO6 21
+#define IT_SHORT_SWOTG 22
+#define IT_SHORT_SWOUT 23
+
+#define IT_TWARN_F     24
+#define IT_TWARN_R     25
+#define IT_VINLOW_F    26
+#define IT_VINLOW_R    27
+#define IT_SWIN_F      30
+#define IT_SWIN_R      31
+
+#endif /* __DT_BINDINGS_STPMIC1_H__ */
diff --git a/include/dt-bindings/mfd/st,stpmu1.h b/include/dt-bindings/mfd/st,stpmu1.h
deleted file mode 100644 (file)
index 81982eb..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * This file is part of stpmu1 pmic driver
- *
- * Copyright (C) 2017, STMicroelectronics - All Rights Reserved
- * Author: Pascal Paillet <p.paillet@st.com> for STMicroelectronics.
- *
- * License type: GPLv2
- *
- * 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.
- *
- * 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/>.
- */
-
-#ifndef __DT_BINDINGS_STPMU1_H__
-#define __DT_BINDINGS_STPMU1_H__
-
-/* IRQ definitions */
-#define IT_PONKEY_F 0
-#define IT_PONKEY_R 1
-#define IT_WAKEUP_F 2
-#define IT_WAKEUP_R 3
-#define IT_VBUS_OTG_F 4
-#define IT_VBUS_OTG_R 5
-#define IT_SWOUT_F 6
-#define IT_SWOUT_R 7
-
-#define IT_CURLIM_BUCK1 8
-#define IT_CURLIM_BUCK2 9
-#define IT_CURLIM_BUCK3 10
-#define IT_CURLIM_BUCK4 11
-#define IT_OCP_OTG 12
-#define IT_OCP_SWOUT 13
-#define IT_OCP_BOOST 14
-#define IT_OVP_BOOST 15
-
-#define IT_CURLIM_LDO1 16
-#define IT_CURLIM_LDO2 17
-#define IT_CURLIM_LDO3 18
-#define IT_CURLIM_LDO4 19
-#define IT_CURLIM_LDO5 20
-#define IT_CURLIM_LDO6 21
-#define IT_SHORT_SWOTG 22
-#define IT_SHORT_SWOUT 23
-
-#define IT_TWARN_F 24
-#define IT_TWARN_R 25
-#define IT_VINLOW_F 26
-#define IT_VINLOW_R 27
-#define IT_SWIN_F 30
-#define IT_SWIN_R 31
-
-#endif /* __DT_BINDINGS_STPMU1_H__ */
diff --git a/include/dt-bindings/mscc/jr2_data.h b/include/dt-bindings/mscc/jr2_data.h
new file mode 100644 (file)
index 0000000..2f06fc5
--- /dev/null
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+/*
+ * Copyright (c) 2018 Microsemi Corporation
+ */
+
+#ifndef _JR2_DATA_H_
+#define _JR2_DATA_H_
+
+#define SERDES1G(x)     (x)
+#define SERDES1G_MAX    SERDES1G(10)
+#define SERDES6G(x)     (SERDES1G_MAX + 1 + (x))
+#define SERDES6G_MAX    SERDES6G(17)
+#define SERDES_MAX      (SERDES6G_MAX + 1)
+
+/* similar with phy_interface_t */
+#define PHY_MODE_SGMII  2
+#define PHY_MODE_QSGMII 4
+
+#endif
index d98441ab19de1f16a34fe35df8c861ba980d0933..3c9d20f8c0b6b518e4bb3ab20e0871729e59b280 100644 (file)
@@ -190,7 +190,7 @@ enum efi_mem_type {
 #define EFI_MEM_DESC_VERSION   1
 
 #define EFI_PAGE_SHIFT         12
-#define EFI_PAGE_SIZE          (1UL << EFI_PAGE_SHIFT)
+#define EFI_PAGE_SIZE          (1ULL << EFI_PAGE_SHIFT)
 #define EFI_PAGE_MASK          (EFI_PAGE_SIZE - 1)
 
 struct efi_mem_desc {
index 00b81c6010ff7ee3b4f82469f9997800cc821241..f7bf7328271a9f4dd27444f44953d04b01b7dab6 100644 (file)
@@ -344,6 +344,9 @@ efi_status_t efi_remove_protocol(const efi_handle_t handle,
                                 void *protocol_interface);
 /* Delete all protocols from a handle */
 efi_status_t efi_remove_all_protocols(const efi_handle_t handle);
+/* Install multiple protocol interfaces */
+efi_status_t EFIAPI efi_install_multiple_protocol_interfaces
+                               (efi_handle_t *handle, ...);
 /* Call this to create an event */
 efi_status_t efi_create_event(uint32_t type, efi_uintn_t notify_tpl,
                              void (EFIAPI *notify_function) (
diff --git a/include/environment/ti/nand.h b/include/environment/ti/nand.h
new file mode 100644 (file)
index 0000000..f838cb3
--- /dev/null
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com
+ *
+ * Environment variable definitions for NAND on TI boards.
+ */
+
+#ifdef CONFIG_NAND
+#define NANDARGS \
+       "mtdids=" CONFIG_MTDIDS_DEFAULT "\0" \
+       "mtdparts=" CONFIG_MTDPARTS_DEFAULT "\0" \
+       "nandargs=setenv bootargs console=${console} " \
+               "${optargs} " \
+               "root=${nandroot} " \
+               "rootfstype=${nandrootfstype}\0" \
+       "nandroot=ubi0:rootfs rw ubi.mtd=NAND.file-system,2048\0" \
+       "nandrootfstype=ubifs rootwait=1\0" \
+       "nandboot=echo Booting from nand ...; " \
+               "run nandargs; " \
+               "nand read ${fdtaddr} NAND.u-boot-spl-os; " \
+               "nand read ${loadaddr} NAND.kernel; " \
+               "bootz ${loadaddr} - ${fdtaddr}\0"
+#else
+#define NANDARGS ""
+#endif
+
diff --git a/include/exception.h b/include/exception.h
new file mode 100644 (file)
index 0000000..fc02490
--- /dev/null
@@ -0,0 +1,58 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * The 'exception' command can be used for testing exception handling.
+ *
+ * Copyright (c) 2018, Heinrich Schuchardt <xypron.glpk@gmx.de>
+ */
+
+static int do_exception(cmd_tbl_t *cmdtp, int flag, int argc,
+                       char * const argv[])
+{
+       cmd_tbl_t *cp;
+
+       if (argc != 2)
+               return CMD_RET_USAGE;
+
+       /* drop sub-command parameter */
+       argc--;
+       argv++;
+
+       cp = find_cmd_tbl(argv[0], cmd_sub, ARRAY_SIZE(cmd_sub));
+
+       if (cp)
+               return cp->cmd(cmdtp, flag, argc, argv);
+
+       return CMD_RET_USAGE;
+}
+
+static int exception_complete(int argc, char * const argv[], char last_char,
+                             int maxv, char *cmdv[])
+{
+       int len = 0;
+       int i = 0;
+       cmd_tbl_t *cmdtp;
+
+       switch (argc) {
+       case 1:
+               break;
+       case 2:
+               len = strlen(argv[1]);
+               break;
+       default:
+               return 0;
+       }
+       for (cmdtp = cmd_sub; cmdtp != cmd_sub + ARRAY_SIZE(cmd_sub); cmdtp++) {
+               if (i >= maxv - 1)
+                       return i;
+               if (!strncmp(argv[1], cmdtp->name, len))
+                       cmdv[i++] = cmdtp->name;
+       }
+       cmdv[i] = NULL;
+       return i;
+}
+
+U_BOOT_CMD_COMPLETE(
+       exception, 2, 0, do_exception,
+       "Forces an exception to occur",
+       exception_help_text, exception_complete
+);
index b7e35cd87c55170d089cd960a6817a11764e0f76..266c58271f0bb627b8c69b4de6dd8e3d6bd9c90c 100644 (file)
  */
 typedef phys_addr_t fdt_addr_t;
 typedef phys_size_t fdt_size_t;
+
+static inline fdt32_t fdt_addr_unpack(fdt_addr_t addr, fdt32_t *upper)
+{
+       if (upper)
+#ifdef CONFIG_PHYS_64BIT
+               *upper = addr >> 32;
+#else
+               *upper = 0;
+#endif
+
+       return addr;
+}
+
+static inline fdt32_t fdt_size_unpack(fdt_size_t size, fdt32_t *upper)
+{
+       if (upper)
+#ifdef CONFIG_PHYS_64BIT
+               *upper = size >> 32;
+#else
+               *upper = 0;
+#endif
+
+       return size;
+}
+
 #ifdef CONFIG_PHYS_64BIT
 #define FDT_ADDR_T_NONE (-1U)
 #define fdt_addr_to_cpu(reg) be64_to_cpu(reg)
 #define fdt_size_to_cpu(reg) be64_to_cpu(reg)
+#define cpu_to_fdt_addr(reg) cpu_to_be64(reg)
+#define cpu_to_fdt_size(reg) cpu_to_be64(reg)
 typedef fdt64_t fdt_val_t;
 #else
 #define FDT_ADDR_T_NONE (-1U)
 #define fdt_addr_to_cpu(reg) be32_to_cpu(reg)
 #define fdt_size_to_cpu(reg) be32_to_cpu(reg)
+#define cpu_to_fdt_addr(reg) cpu_to_be32(reg)
+#define cpu_to_fdt_size(reg) cpu_to_be32(reg)
 typedef fdt32_t fdt_val_t;
 #endif
 
@@ -917,6 +946,26 @@ struct display_timing {
 int fdtdec_decode_display_timing(const void *blob, int node, int index,
                                 struct display_timing *config);
 
+/**
+ * fdtdec_setup_mem_size_base_fdt() - decode and setup gd->ram_size and
+ * gd->ram_start
+ *
+ * Decode the /memory 'reg' property to determine the size and start of the
+ * first memory bank, populate the global data with the size and start of the
+ * first bank of memory.
+ *
+ * This function should be called from a boards dram_init(). This helper
+ * function allows for boards to query the device tree for DRAM size and start
+ * address instead of hard coding the value in the case where the memory size
+ * and start address cannot be detected automatically.
+ *
+ * @param blob         FDT blob
+ *
+ * @return 0 if OK, -EINVAL if the /memory node or reg property is missing or
+ * invalid
+ */
+int fdtdec_setup_mem_size_base_fdt(const void *blob);
+
 /**
  * fdtdec_setup_mem_size_base() - decode and setup gd->ram_size and
  * gd->ram_start
@@ -935,6 +984,25 @@ int fdtdec_decode_display_timing(const void *blob, int node, int index,
  */
 int fdtdec_setup_mem_size_base(void);
 
+/**
+ * fdtdec_setup_memory_banksize_fdt() - decode and populate gd->bd->bi_dram
+ *
+ * Decode the /memory 'reg' property to determine the address and size of the
+ * memory banks. Use this data to populate the global data board info with the
+ * phys address and size of memory banks.
+ *
+ * This function should be called from a boards dram_init_banksize(). This
+ * helper function allows for boards to query the device tree for memory bank
+ * information instead of hard coding the information in cases where it cannot
+ * be detected automatically.
+ *
+ * @param blob         FDT blob
+ *
+ * @return 0 if OK, -EINVAL if the /memory node or reg property is missing or
+ * invalid
+ */
+int fdtdec_setup_memory_banksize_fdt(const void *blob);
+
 /**
  * fdtdec_setup_memory_banksize() - decode and populate gd->bd->bi_dram
  *
@@ -952,6 +1020,146 @@ int fdtdec_setup_mem_size_base(void);
  */
 int fdtdec_setup_memory_banksize(void);
 
+/**
+ * fdtdec_set_phandle() - sets the phandle of a given node
+ *
+ * @param blob         FDT blob
+ * @param node         offset in the FDT blob of the node whose phandle is to
+ *                     be set
+ * @param phandle      phandle to set for the given node
+ * @return 0 on success or a negative error code on failure
+ */
+int fdtdec_set_phandle(void *blob, int node, uint32_t phandle);
+
+/**
+ * fdtdec_add_reserved_memory() - add or find a reserved-memory node
+ *
+ * If a reserved-memory node already exists for the given carveout, a phandle
+ * for that node will be returned. Otherwise a new node will be created and a
+ * phandle corresponding to it will be returned.
+ *
+ * See Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt
+ * for details on how to use reserved memory regions.
+ *
+ * As an example, consider the following code snippet:
+ *
+ *     struct fdt_memory fb = {
+ *         .start = 0x92cb3000,
+ *         .end = 0x934b2fff,
+ *     };
+ *     uint32_t phandle;
+ *
+ *     fdtdec_add_reserved_memory(fdt, "framebuffer", &fb, &phandle);
+ *
+ * This results in the following subnode being added to the top-level
+ * /reserved-memory node:
+ *
+ *     reserved-memory {
+ *         #address-cells = <0x00000002>;
+ *         #size-cells = <0x00000002>;
+ *         ranges;
+ *
+ *         framebuffer@92cb3000 {
+ *             reg = <0x00000000 0x92cb3000 0x00000000 0x00800000>;
+ *             phandle = <0x0000004d>;
+ *         };
+ *     };
+ *
+ * If the top-level /reserved-memory node does not exist, it will be created.
+ * The phandle returned from the function call can be used to reference this
+ * reserved memory region from other nodes.
+ *
+ * See fdtdec_set_carveout() for a more elaborate example.
+ *
+ * @param blob         FDT blob
+ * @param basename     base name of the node to create
+ * @param carveout     information about the carveout region
+ * @param phandlep     return location for the phandle of the carveout region
+ * @return 0 on success or a negative error code on failure
+ */
+int fdtdec_add_reserved_memory(void *blob, const char *basename,
+                              const struct fdt_memory *carveout,
+                              uint32_t *phandlep);
+
+/**
+ * fdtdec_get_carveout() - reads a carveout from an FDT
+ *
+ * Reads information about a carveout region from an FDT. The carveout is a
+ * referenced by its phandle that is read from a given property in a given
+ * node.
+ *
+ * @param blob         FDT blob
+ * @param node         name of a node
+ * @param name         name of the property in the given node that contains
+ *                     the phandle for the carveout
+ * @param index                index of the phandle for which to read the carveout
+ * @param carveout     return location for the carveout information
+ * @return 0 on success or a negative error code on failure
+ */
+int fdtdec_get_carveout(const void *blob, const char *node, const char *name,
+                       unsigned int index, struct fdt_memory *carveout);
+
+/**
+ * fdtdec_set_carveout() - sets a carveout region for a given node
+ *
+ * Sets a carveout region for a given node. If a reserved-memory node already
+ * exists for the carveout, the phandle for that node will be reused. If no
+ * such node exists, a new one will be created and a phandle to it stored in
+ * a specified property of the given node.
+ *
+ * As an example, consider the following code snippet:
+ *
+ *     const char *node = "/host1x@50000000/dc@54240000";
+ *     struct fdt_memory fb = {
+ *         .start = 0x92cb3000,
+ *         .end = 0x934b2fff,
+ *     };
+ *
+ *     fdtdec_set_carveout(fdt, node, "memory-region", 0, "framebuffer", &fb);
+ *
+ * dc@54200000 is a display controller and was set up by the bootloader to
+ * scan out the framebuffer specified by "fb". This would cause the following
+ * reserved memory region to be added:
+ *
+ *     reserved-memory {
+ *         #address-cells = <0x00000002>;
+ *         #size-cells = <0x00000002>;
+ *         ranges;
+ *
+ *         framebuffer@92cb3000 {
+ *             reg = <0x00000000 0x92cb3000 0x00000000 0x00800000>;
+ *             phandle = <0x0000004d>;
+ *         };
+ *     };
+ *
+ * A "memory-region" property will also be added to the node referenced by the
+ * offset parameter.
+ *
+ *     host1x@50000000 {
+ *         ...
+ *
+ *         dc@54240000 {
+ *             ...
+ *             memory-region = <0x0000004d>;
+ *             ...
+ *         };
+ *
+ *         ...
+ *     };
+ *
+ * @param blob         FDT blob
+ * @param node         name of the node to add the carveout to
+ * @param prop_name    name of the property in which to store the phandle of
+ *                     the carveout
+ * @param index                index of the phandle to store
+ * @param name         base name of the reserved-memory node to create
+ * @param carveout     information about the carveout to add
+ * @return 0 on success or a negative error code on failure
+ */
+int fdtdec_set_carveout(void *blob, const char *node, const char *prop_name,
+                       unsigned int index, const char *name,
+                       const struct fdt_memory *carveout);
+
 /**
  * Set up the device tree ready for use
  */
index 195f0bdd57a98b1c3404b7d33b31bc53f986969a..51de5c55f830e86f1fc30d2271b9100de058e600 100644 (file)
@@ -41,7 +41,7 @@ typedef struct {                /* typedef fpga_desc */
        unsigned int blocksize;
        char *interface;
        char *dev_part;
-       char *filename;
+       const char *filename;
        int fstype;
 } fpga_fs_info;
 
index ccffc195527547c7d46ae8809b373212eb75f181..a5c760c711edcca9e278e478cd0c4babbef80b80 100644 (file)
@@ -68,9 +68,11 @@ struct dm_i2c_chip {
  * I2C bus udevice.
  *
  * @speed_hz: Bus speed in hertz (typically 100000)
+ * @max_transaction_bytes: Maximal size of single I2C transfer
  */
 struct dm_i2c_bus {
        int speed_hz;
+       int max_transaction_bytes;
 };
 
 /*
index 765ffecee0a756c5f87edcd2c8732b7e6da063f2..889305cbefdb932c994a290174f51fa850aa0832 100644 (file)
@@ -306,6 +306,7 @@ enum {
        IH_COMP_COUNT,
 };
 
+#define LZ4F_MAGIC     0x184D2204      /* LZ4 Magic Number             */
 #define IH_MAGIC       0x27051956      /* Image Magic Number           */
 #define IH_NMLEN               32      /* Image Name Length            */
 
@@ -1312,6 +1313,7 @@ int android_image_get_second(const struct andr_img_hdr *hdr,
                              ulong *second_data, ulong *second_len);
 ulong android_image_get_end(const struct andr_img_hdr *hdr);
 ulong android_image_get_kload(const struct andr_img_hdr *hdr);
+ulong android_image_get_kcomp(const struct andr_img_hdr *hdr);
 void android_print_contents(const struct andr_img_hdr *hdr);
 
 #endif /* CONFIG_ANDROID_BOOT_IMAGE */
diff --git a/include/linux/completion.h b/include/linux/completion.h
new file mode 100644 (file)
index 0000000..9835826
--- /dev/null
@@ -0,0 +1,173 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __LINUX_COMPLETION_H
+#define __LINUX_COMPLETION_H
+
+/*
+ * (C) Copyright 2001 Linus Torvalds
+ *
+ * Atomic wait-for-completion handler data structures.
+ * See kernel/sched/completion.c for details.
+ */
+#ifndef __UBOOT__
+#include <linux/wait.h>
+#endif /* __UBOOT__ */
+
+/*
+ * struct completion - structure used to maintain state for a "completion"
+ *
+ * This is the opaque structure used to maintain the state for a "completion".
+ * Completions currently use a FIFO to queue threads that have to wait for
+ * the "completion" event.
+ *
+ * See also:  complete(), wait_for_completion() (and friends _timeout,
+ * _interruptible, _interruptible_timeout, and _killable), init_completion(),
+ * reinit_completion(), and macros DECLARE_COMPLETION(),
+ * DECLARE_COMPLETION_ONSTACK().
+ */
+struct completion {
+       unsigned int done;
+#ifndef __UBOOT__
+       wait_queue_head_t wait;
+#endif /* __UBOOT__ */
+};
+
+#define init_completion_map(x, m) __init_completion(x)
+#define init_completion(x) __init_completion(x)
+static inline void complete_acquire(struct completion *x) {}
+static inline void complete_release(struct completion *x) {}
+
+#define COMPLETION_INITIALIZER(work) \
+       { 0, __WAIT_QUEUE_HEAD_INITIALIZER((work).wait) }
+
+#define COMPLETION_INITIALIZER_ONSTACK_MAP(work, map) \
+       (*({ init_completion_map(&(work), &(map)); &(work); }))
+
+#define COMPLETION_INITIALIZER_ONSTACK(work) \
+       (*({ init_completion(&work); &work; }))
+
+/**
+ * DECLARE_COMPLETION - declare and initialize a completion structure
+ * @work:  identifier for the completion structure
+ *
+ * This macro declares and initializes a completion structure. Generally used
+ * for static declarations. You should use the _ONSTACK variant for automatic
+ * variables.
+ */
+#define DECLARE_COMPLETION(work) \
+       struct completion work = COMPLETION_INITIALIZER(work)
+
+/*
+ * Lockdep needs to run a non-constant initializer for on-stack
+ * completions - so we use the _ONSTACK() variant for those that
+ * are on the kernel stack:
+ */
+/**
+ * DECLARE_COMPLETION_ONSTACK - declare and initialize a completion structure
+ * @work:  identifier for the completion structure
+ *
+ * This macro declares and initializes a completion structure on the kernel
+ * stack.
+ */
+#ifdef CONFIG_LOCKDEP
+# define DECLARE_COMPLETION_ONSTACK(work) \
+       struct completion work = COMPLETION_INITIALIZER_ONSTACK(work)
+# define DECLARE_COMPLETION_ONSTACK_MAP(work, map) \
+       struct completion work = COMPLETION_INITIALIZER_ONSTACK_MAP(work, map)
+#else
+# define DECLARE_COMPLETION_ONSTACK(work) DECLARE_COMPLETION(work)
+# define DECLARE_COMPLETION_ONSTACK_MAP(work, map) DECLARE_COMPLETION(work)
+#endif
+
+/**
+ * init_completion - Initialize a dynamically allocated completion
+ * @x:  pointer to completion structure that is to be initialized
+ *
+ * This inline function will initialize a dynamically created completion
+ * structure.
+ */
+static inline void __init_completion(struct completion *x)
+{
+       x->done = 0;
+#ifndef __UBOOT__
+       init_waitqueue_head(&x->wait);
+#endif /* __UBOOT__ */
+}
+
+/**
+ * reinit_completion - reinitialize a completion structure
+ * @x:  pointer to completion structure that is to be reinitialized
+ *
+ * This inline function should be used to reinitialize a completion structure so it can
+ * be reused. This is especially important after complete_all() is used.
+ */
+static inline void reinit_completion(struct completion *x)
+{
+       x->done = 0;
+}
+
+#ifndef __UBOOT__
+extern void wait_for_completion(struct completion *);
+extern void wait_for_completion_io(struct completion *);
+extern int wait_for_completion_interruptible(struct completion *x);
+extern int wait_for_completion_killable(struct completion *x);
+extern unsigned long wait_for_completion_timeout(struct completion *x,
+                                                  unsigned long timeout);
+extern unsigned long wait_for_completion_io_timeout(struct completion *x,
+                                                   unsigned long timeout);
+extern long wait_for_completion_interruptible_timeout(
+       struct completion *x, unsigned long timeout);
+extern long wait_for_completion_killable_timeout(
+       struct completion *x, unsigned long timeout);
+extern bool try_wait_for_completion(struct completion *x);
+extern bool completion_done(struct completion *x);
+
+extern void complete(struct completion *);
+extern void complete_all(struct completion *);
+
+#else /* __UBOOT __ */
+
+#define wait_for_completion(x)         do {} while (0)
+#define wait_for_completion_io(x)      do {} while (0)
+
+inline int wait_for_completion_interruptible(struct completion *x)
+{
+       return 1;
+}
+inline int wait_for_completion_killable(struct completion *x)
+{
+       return 1;
+}
+inline unsigned long wait_for_completion_timeout(struct completion *x,
+                                                unsigned long timeout)
+{
+       return 1;
+}
+inline unsigned long wait_for_completion_io_timeout(struct completion *x,
+                                                   unsigned long timeout)
+{
+       return 1;
+}
+inline long wait_for_completion_interruptible_timeout(struct completion *x,
+                                                     unsigned long timeout)
+{
+       return 1;
+}
+inline long wait_for_completion_killable_timeout(struct completion *x,
+                                                unsigned long timeout)
+{
+       return 1;
+}
+inline bool try_wait_for_completion(struct completion *x)
+{
+       return 1;
+}
+inline bool completion_done(struct completion *x)
+{
+       return 1;
+}
+
+#define complete(x)            do {} while (0)
+#define complete_all(x)                do {} while (0)
+#endif /* __UBOOT__ */
+
+#endif
index 9badab49b0bdb25fca8ce038b1beba9d3b9af1d8..79847886be95ddef9cc4cd309b00225a36ba77df 100644 (file)
@@ -65,8 +65,8 @@ static inline void __iomem *ioremap(resource_size_t offset,
 static inline void iounmap(void __iomem *addr)
 {
 }
+#endif
 
 #define devm_ioremap(dev, offset, size)                ioremap(offset, size)
-#endif
 
 #endif /* _LINUX_IO_H */
index cd1f557a2f3151834f8a8211804c0623402cc78e..e3549f0a46117cef281f841c4c4e90a99d384731 100644 (file)
@@ -392,7 +392,7 @@ static inline void mtd_set_ooblayout(struct mtd_info *mtd,
        mtd->ooblayout = ooblayout;
 }
 
-static inline int mtd_oobavail(struct mtd_info *mtd, struct mtd_oob_ops *ops)
+static inline u32 mtd_oobavail(struct mtd_info *mtd, struct mtd_oob_ops *ops)
 {
        return ops->mode == MTD_OPS_AUTO_OOB ? mtd->oobavail : mtd->oobsize;
 }
index 9f5dc81aca6f7a4567726505737c94882c8057a8..bd373b96172ba24ef2a72b9c54fb2cdadf19319d 100644 (file)
@@ -15,6 +15,7 @@
 
 #include <config.h>
 
+#include <dm/device.h>
 #include <linux/compat.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/flashchip.h>
@@ -498,6 +499,13 @@ struct nand_hw_control {
        struct nand_chip *active;
 };
 
+static inline void nand_hw_control_init(struct nand_hw_control *nfc)
+{
+       nfc->active = NULL;
+       spin_lock_init(&nfc->lock);
+       init_waitqueue_head(&nfc->wq);
+}
+
 /**
  * struct nand_ecc_step_info - ECC step information of ECC engine
  * @stepsize: data bytes per ECC step
@@ -961,6 +969,17 @@ struct nand_chip {
        void *priv;
 };
 
+static inline void nand_set_flash_node(struct nand_chip *chip,
+                                      ofnode node)
+{
+       chip->flash_node = ofnode_to_offset(node);
+}
+
+static inline ofnode nand_get_flash_node(struct nand_chip *chip)
+{
+       return offset_to_ofnode(chip->flash_node);
+}
+
 static inline struct nand_chip *mtd_to_nand(struct mtd_info *mtd)
 {
        return container_of(mtd, struct nand_chip, mtd);
@@ -1280,4 +1299,34 @@ int nand_maximize_ecc(struct nand_chip *chip,
 
 /* Reset and initialize a NAND device */
 int nand_reset(struct nand_chip *chip, int chipnr);
+
+/* NAND operation helpers */
+int nand_reset_op(struct nand_chip *chip);
+int nand_readid_op(struct nand_chip *chip, u8 addr, void *buf,
+                  unsigned int len);
+int nand_status_op(struct nand_chip *chip, u8 *status);
+int nand_exit_status_op(struct nand_chip *chip);
+int nand_erase_op(struct nand_chip *chip, unsigned int eraseblock);
+int nand_read_page_op(struct nand_chip *chip, unsigned int page,
+                     unsigned int offset_in_page, void *buf, unsigned int len);
+int nand_change_read_column_op(struct nand_chip *chip,
+                              unsigned int offset_in_page, void *buf,
+                              unsigned int len, bool force_8bit);
+int nand_read_oob_op(struct nand_chip *chip, unsigned int page,
+                    unsigned int offset_in_page, void *buf, unsigned int len);
+int nand_prog_page_begin_op(struct nand_chip *chip, unsigned int page,
+                           unsigned int offset_in_page, const void *buf,
+                           unsigned int len);
+int nand_prog_page_end_op(struct nand_chip *chip);
+int nand_prog_page_op(struct nand_chip *chip, unsigned int page,
+                     unsigned int offset_in_page, const void *buf,
+                     unsigned int len);
+int nand_change_write_column_op(struct nand_chip *chip,
+                               unsigned int offset_in_page, const void *buf,
+                               unsigned int len, bool force_8bit);
+int nand_read_data_op(struct nand_chip *chip, void *buf, unsigned int len,
+                     bool force_8bit);
+int nand_write_data_op(struct nand_chip *chip, const void *buf,
+                      unsigned int len, bool force_8bit);
+
 #endif /* __LINUX_MTD_RAWNAND_H */
diff --git a/include/linux/soc/ti/cppi5.h b/include/linux/soc/ti/cppi5.h
new file mode 100644 (file)
index 0000000..34038b3
--- /dev/null
@@ -0,0 +1,995 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * CPPI5 descriptors interface
+ *
+ * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com
+ */
+
+#ifndef __TI_CPPI5_H__
+#define __TI_CPPI5_H__
+
+#include <hexdump.h>
+#include <linux/bitops.h>
+
+/**
+ * Descriptor header, present in all types of descriptors
+ */
+struct cppi5_desc_hdr_t {
+       u32 pkt_info0;  /* Packet info word 0 (n/a in Buffer desc) */
+       u32 pkt_info1;  /* Packet info word 1 (n/a in Buffer desc) */
+       u32 pkt_info2;  /* Packet info word 2 Buffer reclamation info */
+       u32 src_dst_tag; /* Packet info word 3 (n/a in Buffer desc) */
+} __packed;
+
+/**
+ * Host-mode packet and buffer descriptor definition
+ */
+struct cppi5_host_desc_t {
+       struct cppi5_desc_hdr_t hdr;
+       u64 next_desc;  /* w4/5: Linking word */
+       u64 buf_ptr;    /* w6/7: Buffer pointer */
+       u32 buf_info1;  /* w8: Buffer valid data length */
+       u32 org_buf_len; /* w9: Original buffer length */
+       u64 org_buf_ptr; /* w10/11: Original buffer pointer */
+       u32 epib[0];    /* Extended Packet Info Data (optional, 4 words) */
+       /*
+        * Protocol Specific Data (optional, 0-128 bytes in multiples of 4),
+        * and/or Other Software Data (0-N bytes, optional)
+        */
+} __packed;
+
+#define CPPI5_DESC_MIN_ALIGN                   (16U)
+
+#define CPPI5_INFO0_HDESC_EPIB_SIZE            (16U)
+#define CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE      (128U)
+
+#define CPPI5_INFO0_HDESC_TYPE_SHIFT           (30U)
+#define CPPI5_INFO0_HDESC_TYPE_MASK            GENMASK(31, 30)
+#define   CPPI5_INFO0_DESC_TYPE_VAL_HOST       (1U)
+#define   CPPI5_INFO0_DESC_TYPE_VAL_MONO       (2U)
+#define   CPPI5_INFO0_DESC_TYPE_VAL_TR         (3U)
+#define CPPI5_INFO0_HDESC_EPIB_PRESENT         BIT(29)
+/*
+ * Protocol Specific Words location:
+ * 0 - located in the descriptor,
+ * 1 = located in the SOP Buffer immediately prior to the data.
+ */
+#define CPPI5_INFO0_HDESC_PSINFO_LOCATION      BIT(28)
+#define CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT    (22U)
+#define CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK     GENMASK(27, 22)
+#define CPPI5_INFO0_HDESC_PKTLEN_SHIFT         (0)
+#define CPPI5_INFO0_HDESC_PKTLEN_MASK          GENMASK(21, 0)
+
+#define CPPI5_INFO1_DESC_PKTERROR_SHIFT                (28U)
+#define CPPI5_INFO1_DESC_PKTERROR_MASK         GENMASK(31, 28)
+#define CPPI5_INFO1_HDESC_PSFLGS_SHIFT         (24U)
+#define CPPI5_INFO1_HDESC_PSFLGS_MASK          GENMASK(27, 24)
+#define CPPI5_INFO1_DESC_PKTID_SHIFT           (14U)
+#define CPPI5_INFO1_DESC_PKTID_MASK            GENMASK(23, 14)
+#define CPPI5_INFO1_DESC_FLOWID_SHIFT          (0)
+#define CPPI5_INFO1_DESC_FLOWID_MASK           GENMASK(13, 0)
+
+#define CPPI5_INFO2_HDESC_PKTTYPE_SHIFT                (27U)
+#define CPPI5_INFO2_HDESC_PKTTYPE_MASK         GENMASK(31, 27)
+/* Return Policy: 0 - Entire packet 1 - Each buffer */
+#define CPPI5_INFO2_HDESC_RETPOLICY            BIT(18)
+/*
+ * Early Return:
+ * 0 = desc pointers should be returned after all reads have been completed
+ * 1 = desc pointers should be returned immediately upon fetching
+ * the descriptor and beginning to transfer data.
+ */
+#define CPPI5_INFO2_HDESC_EARLYRET             BIT(17)
+/*
+ * Return Push Policy:
+ * 0 = Descriptor must be returned to tail of queue
+ * 1 = Descriptor must be returned to head of queue
+ */
+#define CPPI5_INFO2_DESC_RETPUSHPOLICY         BIT(16)
+#define CPPI5_INFO2_DESC_RETQ_SHIFT            (0)
+#define CPPI5_INFO2_DESC_RETQ_MASK             GENMASK(15, 0)
+
+#define CPPI5_INFO3_DESC_SRCTAG_SHIFT          (16U)
+#define CPPI5_INFO3_DESC_SRCTAG_MASK           GENMASK(31, 16)
+#define CPPI5_INFO3_DESC_DSTTAG_SHIFT          (0)
+#define CPPI5_INFO3_DESC_DSTTAG_MASK           GENMASK(15, 0)
+
+#define CPPI5_BUFINFO1_HDESC_DATA_LEN_SHIFT    (0)
+#define CPPI5_BUFINFO1_HDESC_DATA_LEN_MASK     GENMASK(27, 0)
+
+#define CPPI5_OBUFINFO0_HDESC_BUF_LEN_SHIFT    (0)
+#define CPPI5_OBUFINFO0_HDESC_BUF_LEN_MASK     GENMASK(27, 0)
+
+/*
+ * Host Packet Descriptor Extended Packet Info Block
+ */
+struct cppi5_desc_epib_t {
+       u32 timestamp;  /* w0: application specific timestamp */
+       u32 sw_info0;   /* w1: Software Info 0 */
+       u32 sw_info1;   /* w2: Software Info 1 */
+       u32 sw_info2;   /* w3: Software Info 2 */
+};
+
+/**
+ * Monolithic-mode packet descriptor
+ */
+struct cppi5_monolithic_desc_t {
+       struct cppi5_desc_hdr_t hdr;
+       u32 epib[0];    /* Extended Packet Info Data (optional, 4 words) */
+       /*
+        * Protocol Specific Data (optional, 0-128 bytes in multiples of 4),
+        *  and/or Other Software Data (0-N bytes, optional)
+        */
+};
+
+#define CPPI5_INFO2_MDESC_DATA_OFFSET_SHIFT    (18U)
+#define CPPI5_INFO2_MDESC_DATA_OFFSET_MASK     GENMASK(26, 18)
+
+/*
+ * Reload Enable:
+ * 0 = Finish the packet and place the descriptor back on the return queue
+ * 1 = Vector to the Reload Index and resume processing
+ */
+#define CPPI5_INFO0_TRDESC_RLDCNT_SHIFT                (20U)
+#define CPPI5_INFO0_TRDESC_RLDCNT_MASK         GENMASK(28, 20)
+#define CPPI5_INFO0_TRDESC_RLDCNT_MAX          (0x1ff)
+#define CPPI5_INFO0_TRDESC_RLDCNT_INFINITE     CPPI5_INFO0_TRDESC_RLDCNT_MAX
+#define CPPI5_INFO0_TRDESC_RLDIDX_SHIFT                (14U)
+#define CPPI5_INFO0_TRDESC_RLDIDX_MASK         GENMASK(19, 14)
+#define CPPI5_INFO0_TRDESC_RLDIDX_MAX          (0x3f)
+#define CPPI5_INFO0_TRDESC_LASTIDX_SHIFT       (0)
+#define CPPI5_INFO0_TRDESC_LASTIDX_MASK                GENMASK(13, 0)
+
+#define CPPI5_INFO1_TRDESC_RECSIZE_SHIFT       (24U)
+#define CPPI5_INFO1_TRDESC_RECSIZE_MASK                GENMASK(26, 24)
+#define   CPPI5_INFO1_TRDESC_RECSIZE_VAL_16B   (0)
+#define   CPPI5_INFO1_TRDESC_RECSIZE_VAL_32B   (1U)
+#define   CPPI5_INFO1_TRDESC_RECSIZE_VAL_64B   (2U)
+#define   CPPI5_INFO1_TRDESC_RECSIZE_VAL_128B  (3U)
+
+static inline void cppi5_desc_dump(void *desc, u32 size)
+{
+       print_hex_dump(KERN_ERR "dump udmap_desc: ", DUMP_PREFIX_NONE,
+                      32, 4, desc, size, false);
+}
+
+/**
+ * cppi5_desc_get_type - get descriptor type
+ * @desc_hdr: packet descriptor/TR header
+ *
+ * Returns descriptor type:
+ * CPPI5_INFO0_DESC_TYPE_VAL_HOST
+ * CPPI5_INFO0_DESC_TYPE_VAL_MONO
+ * CPPI5_INFO0_DESC_TYPE_VAL_TR
+ */
+static inline u32 cppi5_desc_get_type(struct cppi5_desc_hdr_t *desc_hdr)
+{
+       WARN_ON(!desc_hdr);
+
+       return (desc_hdr->pkt_info0 & CPPI5_INFO0_HDESC_TYPE_MASK) >>
+               CPPI5_INFO0_HDESC_TYPE_SHIFT;
+}
+
+/**
+ * cppi5_desc_get_errflags - get Error Flags from Desc
+ * @desc_hdr: packet/TR descriptor header
+ *
+ * Returns Error Flags from Packet/TR Descriptor
+ */
+static inline u32 cppi5_desc_get_errflags(struct cppi5_desc_hdr_t *desc_hdr)
+{
+       WARN_ON(!desc_hdr);
+
+       return (desc_hdr->pkt_info1 & CPPI5_INFO1_DESC_PKTERROR_MASK) >>
+               CPPI5_INFO1_DESC_PKTERROR_SHIFT;
+}
+
+/**
+ * cppi5_desc_get_pktids - get Packet and Flow ids from Desc
+ * @desc_hdr: packet/TR descriptor header
+ * @pkt_id: Packet ID
+ * @flow_id: Flow ID
+ *
+ * Returns Packet and Flow ids from packet/TR descriptor
+ */
+static inline void cppi5_desc_get_pktids(struct cppi5_desc_hdr_t *desc_hdr,
+                                        u32 *pkt_id, u32 *flow_id)
+{
+       WARN_ON(!desc_hdr);
+
+       *pkt_id = (desc_hdr->pkt_info1 & CPPI5_INFO1_DESC_PKTID_MASK) >>
+                  CPPI5_INFO1_DESC_PKTID_SHIFT;
+       *flow_id = (desc_hdr->pkt_info1 & CPPI5_INFO1_DESC_FLOWID_MASK) >>
+                   CPPI5_INFO1_DESC_FLOWID_SHIFT;
+}
+
+/**
+ * cppi5_desc_set_pktids - set Packet and Flow ids in Desc
+ * @desc_hdr: packet/TR descriptor header
+ * @pkt_id: Packet ID
+ * @flow_id: Flow ID
+ */
+static inline void cppi5_desc_set_pktids(struct cppi5_desc_hdr_t *desc_hdr,
+                                        u32 pkt_id, u32 flow_id)
+{
+       WARN_ON(!desc_hdr);
+
+       desc_hdr->pkt_info1 |= (pkt_id << CPPI5_INFO1_DESC_PKTID_SHIFT) &
+                               CPPI5_INFO1_DESC_PKTID_MASK;
+       desc_hdr->pkt_info1 |= (flow_id << CPPI5_INFO1_DESC_FLOWID_SHIFT) &
+                               CPPI5_INFO1_DESC_FLOWID_MASK;
+}
+
+/**
+ * cppi5_desc_set_retpolicy - set Packet Return Policy in Desc
+ * @desc_hdr: packet/TR descriptor header
+ * @flags: fags, supported values
+ *  CPPI5_INFO2_HDESC_RETPOLICY
+ *  CPPI5_INFO2_HDESC_EARLYRET
+ *  CPPI5_INFO2_DESC_RETPUSHPOLICY
+ * @return_ring_id: Packet Return Queue/Ring id, value 0xFFFF reserved
+ */
+static inline void cppi5_desc_set_retpolicy(struct cppi5_desc_hdr_t *desc_hdr,
+                                           u32 flags, u32 return_ring_id)
+{
+       WARN_ON(!desc_hdr);
+
+       desc_hdr->pkt_info2 |= flags;
+       desc_hdr->pkt_info2 |= return_ring_id & CPPI5_INFO2_DESC_RETQ_MASK;
+}
+
+/**
+ * cppi5_desc_get_tags_ids - get Packet Src/Dst Tags from Desc
+ * @desc_hdr: packet/TR descriptor header
+ * @src_tag_id: Source Tag
+ * @dst_tag_id: Dest Tag
+ *
+ * Returns Packet Src/Dst Tags from packet/TR descriptor
+ */
+static inline void cppi5_desc_get_tags_ids(struct cppi5_desc_hdr_t *desc_hdr,
+                                          u32 *src_tag_id, u32 *dst_tag_id)
+{
+       WARN_ON(!desc_hdr);
+
+       if (src_tag_id)
+               *src_tag_id = (desc_hdr->src_dst_tag &
+                             CPPI5_INFO3_DESC_SRCTAG_MASK) >>
+                             CPPI5_INFO3_DESC_SRCTAG_SHIFT;
+       if (dst_tag_id)
+               *dst_tag_id = desc_hdr->src_dst_tag &
+                             CPPI5_INFO3_DESC_DSTTAG_MASK;
+}
+
+/**
+ * cppi5_desc_set_tags_ids - set Packet Src/Dst Tags in HDesc
+ * @desc_hdr: packet/TR descriptor header
+ * @src_tag_id: Source Tag
+ * @dst_tag_id: Dest Tag
+ *
+ * Returns Packet Src/Dst Tags from packet/TR descriptor
+ */
+static inline void cppi5_desc_set_tags_ids(struct cppi5_desc_hdr_t *desc_hdr,
+                                          u32 src_tag_id, u32 dst_tag_id)
+{
+       WARN_ON(!desc_hdr);
+
+       desc_hdr->src_dst_tag = (src_tag_id << CPPI5_INFO3_DESC_SRCTAG_SHIFT) &
+                               CPPI5_INFO3_DESC_SRCTAG_MASK;
+       desc_hdr->src_dst_tag |= dst_tag_id & CPPI5_INFO3_DESC_DSTTAG_MASK;
+}
+
+/**
+ * cppi5_hdesc_calc_size - Calculate Host Packet Descriptor size
+ * @epib: is EPIB present
+ * @psdata_size: PSDATA size
+ * @sw_data_size: SWDATA size
+ *
+ * Returns required Host Packet Descriptor size
+ * 0 - if PSDATA > CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE
+ */
+static inline u32 cppi5_hdesc_calc_size(bool epib, u32 psdata_size,
+                                       u32 sw_data_size)
+{
+       u32 desc_size;
+
+       if (psdata_size > CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE)
+               return 0;
+       //TODO_GS: align
+       desc_size = sizeof(struct cppi5_host_desc_t) + psdata_size +
+                   sw_data_size;
+
+       if (epib)
+               desc_size += CPPI5_INFO0_HDESC_EPIB_SIZE;
+
+       return ALIGN(desc_size, CPPI5_DESC_MIN_ALIGN);
+}
+
+/**
+ * cppi5_hdesc_init - Init Host Packet Descriptor size
+ * @desc: Host packet descriptor
+ * @flags: supported values
+ *     CPPI5_INFO0_HDESC_EPIB_PRESENT
+ *     CPPI5_INFO0_HDESC_PSINFO_LOCATION
+ * @psdata_size: PSDATA size
+ *
+ * Returns required Host Packet Descriptor size
+ * 0 - if PSDATA > CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE
+ */
+static inline void cppi5_hdesc_init(struct cppi5_host_desc_t *desc, u32 flags,
+                                   u32 psdata_size)
+{
+       WARN_ON(!desc);
+       WARN_ON(psdata_size > CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE);
+       WARN_ON(flags & ~(CPPI5_INFO0_HDESC_EPIB_PRESENT |
+                         CPPI5_INFO0_HDESC_PSINFO_LOCATION));
+
+       desc->hdr.pkt_info0 = (CPPI5_INFO0_DESC_TYPE_VAL_HOST <<
+                              CPPI5_INFO0_HDESC_TYPE_SHIFT) | (flags);
+       desc->hdr.pkt_info0 |= ((psdata_size >> 2) <<
+                               CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT) &
+                               CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK;
+       desc->next_desc = 0;
+}
+
+/**
+ * cppi5_hdesc_update_flags - Replace descriptor flags
+ * @desc: Host packet descriptor
+ * @flags: supported values
+ *     CPPI5_INFO0_HDESC_EPIB_PRESENT
+ *     CPPI5_INFO0_HDESC_PSINFO_LOCATION
+ */
+static inline void cppi5_hdesc_update_flags(struct cppi5_host_desc_t *desc,
+                                           u32 flags)
+{
+       WARN_ON(!desc);
+       WARN_ON(flags & ~(CPPI5_INFO0_HDESC_EPIB_PRESENT |
+                         CPPI5_INFO0_HDESC_PSINFO_LOCATION));
+
+       desc->hdr.pkt_info0 &= ~(CPPI5_INFO0_HDESC_EPIB_PRESENT |
+                                CPPI5_INFO0_HDESC_PSINFO_LOCATION);
+       desc->hdr.pkt_info0 |= flags;
+}
+
+/**
+ * cppi5_hdesc_update_psdata_size - Replace PSdata size
+ * @desc: Host packet descriptor
+ * @psdata_size: PSDATA size
+ */
+static inline void cppi5_hdesc_update_psdata_size(
+                               struct cppi5_host_desc_t *desc, u32 psdata_size)
+{
+       WARN_ON(!desc);
+       WARN_ON(psdata_size > CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE);
+
+       desc->hdr.pkt_info0 &= ~CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK;
+       desc->hdr.pkt_info0 |= ((psdata_size >> 2) <<
+                               CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT) &
+                               CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK;
+}
+
+/**
+ * cppi5_hdesc_get_psdata_size - get PSdata size in bytes
+ * @desc: Host packet descriptor
+ */
+static inline u32 cppi5_hdesc_get_psdata_size(struct cppi5_host_desc_t *desc)
+{
+       u32 psdata_size = 0;
+
+       WARN_ON(!desc);
+
+       if (!(desc->hdr.pkt_info0 & CPPI5_INFO0_HDESC_PSINFO_LOCATION))
+               psdata_size = (desc->hdr.pkt_info0 &
+                              CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK) >>
+                              CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT;
+
+       return (psdata_size << 2);
+}
+
+/**
+ * cppi5_hdesc_get_pktlen - get Packet Length from HDesc
+ * @desc: Host packet descriptor
+ *
+ * Returns Packet Length from Host Packet Descriptor
+ */
+static inline u32 cppi5_hdesc_get_pktlen(struct cppi5_host_desc_t *desc)
+{
+       WARN_ON(!desc);
+
+       return (desc->hdr.pkt_info0 & CPPI5_INFO0_HDESC_PKTLEN_MASK);
+}
+
+/**
+ * cppi5_hdesc_set_pktlen - set Packet Length in HDesc
+ * @desc: Host packet descriptor
+ */
+static inline void cppi5_hdesc_set_pktlen(struct cppi5_host_desc_t *desc,
+                                         u32 pkt_len)
+{
+       WARN_ON(!desc);
+
+       desc->hdr.pkt_info0 |= (pkt_len & CPPI5_INFO0_HDESC_PKTLEN_MASK);
+}
+
+/**
+ * cppi5_hdesc_get_psflags - get Protocol Specific Flags from HDesc
+ * @desc: Host packet descriptor
+ *
+ * Returns Protocol Specific Flags from Host Packet Descriptor
+ */
+static inline u32 cppi5_hdesc_get_psflags(struct cppi5_host_desc_t *desc)
+{
+       WARN_ON(!desc);
+
+       return (desc->hdr.pkt_info1 & CPPI5_INFO1_HDESC_PSFLGS_MASK) >>
+               CPPI5_INFO1_HDESC_PSFLGS_SHIFT;
+}
+
+/**
+ * cppi5_hdesc_set_psflags - set Protocol Specific Flags in HDesc
+ * @desc: Host packet descriptor
+ */
+static inline void cppi5_hdesc_set_psflags(struct cppi5_host_desc_t *desc,
+                                          u32 ps_flags)
+{
+       WARN_ON(!desc);
+
+       desc->hdr.pkt_info1 |= (ps_flags <<
+                               CPPI5_INFO1_HDESC_PSFLGS_SHIFT) &
+                               CPPI5_INFO1_HDESC_PSFLGS_MASK;
+}
+
+/**
+ * cppi5_hdesc_get_errflags - get Packet Type from HDesc
+ * @desc: Host packet descriptor
+ */
+static inline u32 cppi5_hdesc_get_pkttype(struct cppi5_host_desc_t *desc)
+{
+       WARN_ON(!desc);
+
+       return (desc->hdr.pkt_info2 & CPPI5_INFO2_HDESC_PKTTYPE_MASK) >>
+               CPPI5_INFO2_HDESC_PKTTYPE_SHIFT;
+}
+
+/**
+ * cppi5_hdesc_get_errflags - set Packet Type in HDesc
+ * @desc: Host packet descriptor
+ * @pkt_type: Packet Type
+ */
+static inline void cppi5_hdesc_set_pkttype(struct cppi5_host_desc_t *desc,
+                                          u32 pkt_type)
+{
+       WARN_ON(!desc);
+       desc->hdr.pkt_info2 |=
+                       (pkt_type << CPPI5_INFO2_HDESC_PKTTYPE_SHIFT) &
+                        CPPI5_INFO2_HDESC_PKTTYPE_MASK;
+}
+
+/**
+ * cppi5_hdesc_attach_buf - attach buffer to HDesc
+ * @desc: Host packet descriptor
+ * @buf: Buffer physical address
+ * @buf_data_len: Buffer length
+ * @obuf: Original Buffer physical address
+ * @obuf_len: Original Buffer length
+ *
+ * Attaches buffer to Host Packet Descriptor
+ */
+static inline void cppi5_hdesc_attach_buf(struct cppi5_host_desc_t *desc,
+                                         dma_addr_t buf, u32 buf_data_len,
+                                         dma_addr_t obuf, u32 obuf_len)
+{
+       WARN_ON(!desc);
+       WARN_ON(!buf && !obuf);
+
+       desc->buf_ptr = buf;
+       desc->buf_info1 = buf_data_len & CPPI5_BUFINFO1_HDESC_DATA_LEN_MASK;
+       desc->org_buf_ptr = obuf;
+       desc->org_buf_len = obuf_len & CPPI5_OBUFINFO0_HDESC_BUF_LEN_MASK;
+}
+
+static inline void cppi5_hdesc_get_obuf(struct cppi5_host_desc_t *desc,
+                                       dma_addr_t *obuf, u32 *obuf_len)
+{
+       WARN_ON(!desc);
+       WARN_ON(!obuf);
+       WARN_ON(!obuf_len);
+
+       *obuf = desc->org_buf_ptr;
+       *obuf_len = desc->org_buf_len & CPPI5_OBUFINFO0_HDESC_BUF_LEN_MASK;
+}
+
+static inline void cppi5_hdesc_reset_to_original(struct cppi5_host_desc_t *desc)
+{
+       WARN_ON(!desc);
+
+       desc->buf_ptr = desc->org_buf_ptr;
+       desc->buf_info1 = desc->org_buf_len;
+}
+
+/**
+ * cppi5_hdesc_link_hbdesc - link Host Buffer Descriptor to HDesc
+ * @desc: Host Packet Descriptor
+ * @buf_desc: Host Buffer Descriptor physical address
+ *
+ * add and link Host Buffer Descriptor to HDesc
+ */
+static inline void cppi5_hdesc_link_hbdesc(struct cppi5_host_desc_t *desc,
+                                          dma_addr_t hbuf_desc)
+{
+       WARN_ON(!desc);
+       WARN_ON(!hbuf_desc);
+
+       desc->next_desc = hbuf_desc;
+}
+
+static inline dma_addr_t cppi5_hdesc_get_next_hbdesc(
+                               struct cppi5_host_desc_t *desc)
+{
+       WARN_ON(!desc);
+
+       return (dma_addr_t)desc->next_desc;
+}
+
+static inline void cppi5_hdesc_reset_hbdesc(struct cppi5_host_desc_t *desc)
+{
+       WARN_ON(!desc);
+
+       desc->hdr = (struct cppi5_desc_hdr_t) { 0 };
+       desc->next_desc = 0;
+}
+
+/**
+ * cppi5_hdesc_epib_present -  check if EPIB present
+ * @desc_hdr: packet descriptor/TR header
+ *
+ * Returns true if EPIB present in the packet
+ */
+static inline bool cppi5_hdesc_epib_present(struct cppi5_desc_hdr_t *desc_hdr)
+{
+       WARN_ON(!desc_hdr);
+       return !!(desc_hdr->pkt_info0 & CPPI5_INFO0_HDESC_EPIB_PRESENT);
+}
+
+/**
+ * cppi5_hdesc_get_psdata -  Get pointer on PSDATA
+ * @desc: Host packet descriptor
+ *
+ * Returns pointer on PSDATA in HDesc.
+ * NULL - if ps_data placed at the start of data buffer.
+ */
+static inline void *cppi5_hdesc_get_psdata(struct cppi5_host_desc_t *desc)
+{
+       u32 psdata_size;
+       void *psdata;
+
+       WARN_ON(!desc);
+
+       if (desc->hdr.pkt_info0 & CPPI5_INFO0_HDESC_PSINFO_LOCATION)
+               return NULL;
+
+       psdata_size = (desc->hdr.pkt_info0 &
+                      CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK) >>
+                      CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT;
+
+       if (!psdata_size)
+               return NULL;
+
+       psdata = &desc->epib;
+
+       if (cppi5_hdesc_epib_present(&desc->hdr))
+               psdata += CPPI5_INFO0_HDESC_EPIB_SIZE;
+
+       return psdata;
+}
+
+static inline u32 *cppi5_hdesc_get_psdata32(struct cppi5_host_desc_t *desc)
+{
+       return (u32 *)cppi5_hdesc_get_psdata(desc);
+}
+
+/**
+ * cppi5_hdesc_get_swdata -  Get pointer on swdata
+ * @desc: Host packet descriptor
+ *
+ * Returns pointer on SWDATA in HDesc.
+ * NOTE. It's caller responsibility to be sure hdesc actually has swdata.
+ */
+static inline void *cppi5_hdesc_get_swdata(struct cppi5_host_desc_t *desc)
+{
+       u32 psdata_size = 0;
+       void *swdata;
+
+       WARN_ON(!desc);
+
+       if (!(desc->hdr.pkt_info0 & CPPI5_INFO0_HDESC_PSINFO_LOCATION))
+               psdata_size = (desc->hdr.pkt_info0 &
+                              CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK) >>
+                              CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT;
+
+       swdata = &desc->epib;
+
+       if (cppi5_hdesc_epib_present(&desc->hdr))
+               swdata += CPPI5_INFO0_HDESC_EPIB_SIZE;
+
+       swdata += (psdata_size << 2);
+
+       return swdata;
+}
+
+/* ================================== TR ================================== */
+
+#define CPPI5_TR_TYPE_SHIFT                    (0U)
+#define CPPI5_TR_TYPE_MASK                     GENMASK(3, 0)
+#define CPPI5_TR_STATIC                                BIT(4)
+#define CPPI5_TR_WAIT                          BIT(5)
+#define CPPI5_TR_EVENT_SIZE_SHIFT              (6U)
+#define CPPI5_TR_EVENT_SIZE_MASK               GENMASK(7, 6)
+#define CPPI5_TR_TRIGGER0_SHIFT                        (8U)
+#define CPPI5_TR_TRIGGER0_MASK                 GENMASK(9, 8)
+#define CPPI5_TR_TRIGGER0_TYPE_SHIFT           (10U)
+#define CPPI5_TR_TRIGGER0_TYPE_MASK            GENMASK(11, 10)
+#define CPPI5_TR_TRIGGER1_SHIFT                        (12U)
+#define CPPI5_TR_TRIGGER1_MASK                 GENMASK(13, 12)
+#define CPPI5_TR_TRIGGER1_TYPE_SHIFT           (14U)
+#define CPPI5_TR_TRIGGER1_TYPE_MASK            GENMASK(15, 14)
+#define CPPI5_TR_CMD_ID_SHIFT                  (16U)
+#define CPPI5_TR_CMD_ID_MASK                   GENMASK(23, 16)
+#define CPPI5_TR_CSF_FLAGS_SHIFT               (24U)
+#define CPPI5_TR_CSF_FLAGS_MASK                        GENMASK(31, 24)
+#define   CPPI5_TR_CSF_SA_INDIRECT             BIT(0)
+#define   CPPI5_TR_CSF_DA_INDIRECT             BIT(1)
+#define   CPPI5_TR_CSF_SUPR_EVT                        BIT(2)
+#define   CPPI5_TR_CSF_EOL_ADV_SHIFT           (4U)
+#define   CPPI5_TR_CSF_EOL_ADV_MASK            GENMASK(6, 4)
+#define   CPPI5_TR_CSF_EOP                     BIT(7)
+
+/* Udmap TR flags Type field specifies the type of TR. */
+enum cppi5_tr_types {
+       /* type0: One dimensional data move */
+       CPPI5_TR_TYPE0 = 0,
+       /* type1: Two dimensional data move */
+       CPPI5_TR_TYPE1,
+       /* type2: Three dimensional data move */
+       CPPI5_TR_TYPE2,
+       /* type3: Four dimensional data move */
+       CPPI5_TR_TYPE3,
+       /* type4: Four dimensional data move with data formatting */
+       CPPI5_TR_TYPE4,
+       /* type5: Four dimensional Cache Warm */
+       CPPI5_TR_TYPE5,
+       /* type6-7: Reserved */
+       /* type8: Four Dimensional Block Move */
+       CPPI5_TR_TYPE8 = 8,
+       /* type9: Four Dimensional Block Move with Repacking */
+       CPPI5_TR_TYPE9,
+       /* type10: Two Dimensional Block Move */
+       CPPI5_TR_TYPE10,
+       /* type11: Two Dimensional Block Move with Repacking */
+       CPPI5_TR_TYPE11,
+       /* type12-14: Reserved */
+       /* type15 Four Dimensional Block Move with Repacking and Indirection */
+       CPPI5_TR_TYPE15 = 15,
+       CPPI5_TR_TYPE_MAX
+};
+
+/*
+ * Udmap TR Flags EVENT_SIZE field specifies when an event is generated
+ * for each TR.
+ */
+enum cppi5_tr_event_size {
+       /* When TR is complete and all status for the TR has been received */
+       CPPI5_TR_EVENT_SIZE_COMPLETION,
+       /*
+        * Type 0: when the last data transaction is sent for the TR;
+        * Type 1-11: when ICNT1 is decremented
+        */
+       CPPI5_TR_EVENT_SIZE_ICNT1_DEC,
+       /*
+        * Type 0-1,10-11: when the last data transaction is sent for the TR;
+        * All other types: when ICNT2 is decremented
+        */
+       CPPI5_TR_EVENT_SIZE_ICNT2_DEC,
+       /*
+        * Type 0-2,10-11: when the last data transaction is sent for the TR;
+        * All other types: when ICNT3 is decremented
+        */
+       CPPI5_TR_EVENT_SIZE_ICNT3_DEC,
+       CPPI5_TR_EVENT_SIZE_MAX
+};
+
+/*
+ * Udmap TR Flags TRIGGERx field specifies the type of trigger used to
+ * enable the TR to transfer data as specified by TRIGGERx_TYPE field.
+ */
+enum cppi5_tr_trigger {
+       CPPI5_TR_TRIGGER_NONE,          /* No Trigger */
+       CPPI5_TR_TRIGGER_GLOBAL0,               /* Global Trigger 0 */
+       CPPI5_TR_TRIGGER_GLOBAL1,               /* Global Trigger 1 */
+       CPPI5_TR_TRIGGER_LOCAL_EVENT,   /* Local Event */
+       CPPI5_TR_TRIGGER_MAX
+};
+
+/*
+ * Udmap TR Flags TRIGGERx_TYPE field specifies the type of data transfer
+ * that will be enabled by receiving a trigger as specified by TRIGGERx.
+ */
+enum cppi5_tr_trigger_type {
+       /* The second inner most loop (ICNT1) will be decremented by 1 */
+       CPPI5_TR_TRIGGER_TYPE_ICNT1_DEC,
+       /* The third inner most loop (ICNT2) will be decremented by 1 */
+       CPPI5_TR_TRIGGER_TYPE_ICNT2_DEC,
+       /* The outer most loop (ICNT3) will be decremented by 1 */
+       CPPI5_TR_TRIGGER_TYPE_ICNT3_DEC,
+       /* The entire TR will be allowed to complete */
+       CPPI5_TR_TRIGGER_TYPE_ALL,
+       CPPI5_TR_TRIGGER_TYPE_MAX
+};
+
+typedef u32 cppi5_tr_flags_t;
+
+/* Type 0 (One dimensional data move) TR (16 byte) */
+struct cppi5_tr_type0_t {
+       cppi5_tr_flags_t flags;
+       u16 icnt0;
+       u16 unused;
+       u64 addr;
+} __aligned(16) __packed;
+
+/* Type 1 (Two dimensional data move) TR (32 byte) */
+struct cppi5_tr_type1_t {
+       cppi5_tr_flags_t flags;
+       u16 icnt0;
+       u16 icnt1;
+       u64 addr;
+       s32 dim1;
+} __aligned(32) __packed;
+
+/* Type 2 (Three dimensional data move) TR (32 byte) */
+struct cppi5_tr_type2_t {
+       cppi5_tr_flags_t flags;
+       u16 icnt0;
+       u16 icnt1;
+       u64 addr;
+       s32 dim1;
+       u16 icnt2;
+       u16 unused;
+       s32 dim2;
+} __aligned(32) __packed;
+
+/* Type 3 (Four dimensional data move) TR (32 byte) */
+struct cppi5_tr_type3_t {
+       cppi5_tr_flags_t flags;
+       u16 icnt0;
+       u16 icnt1;
+       u64 addr;
+       s32 dim1;
+       u16 icnt2;
+       u16 icnt3;
+       s32 dim2;
+       s32 dim3;
+} __aligned(32) __packed;
+
+/*
+ * Type 15 (Four Dimensional Block Copy with Repacking and
+ * Indirection Support) TR (64 byte).
+ */
+struct cppi5_tr_type15_t {
+       cppi5_tr_flags_t flags;
+       u16 icnt0;
+       u16 icnt1;
+       u64 addr;
+       s32 dim1;
+       u16 icnt2;
+       u16 icnt3;
+       s32 dim2;
+       s32 dim3;
+       u32 _reserved;
+       s32 ddim1;
+       u64 daddr;
+       s32 ddim2;
+       s32 ddim3;
+       u16 dicnt0;
+       u16 dicnt1;
+       u16 dicnt2;
+       u16 dicnt3;
+} __aligned(64) __packed;
+
+struct cppi5_tr_resp_t {
+       u8 status;
+       u8 reserved;
+       u8 cmd_id;
+       u8 flags;
+} __packed;
+
+#define CPPI5_TR_RESPONSE_STATUS_TYPE_SHIFT    (0U)
+#define CPPI5_TR_RESPONSE_STATUS_TYPE_MASK     GENMASK(3, 0)
+#define CPPI5_TR_RESPONSE_STATUS_INFO_SHIFT    (4U)
+#define CPPI5_TR_RESPONSE_STATUS_INFO_MASK     GENMASK(7, 4)
+#define CPPI5_TR_RESPONSE_CMDID_SHIFT          (16U)
+#define CPPI5_TR_RESPONSE_CMDID_MASK           GENMASK(23, 16)
+#define CPPI5_TR_RESPONSE_CFG_SPECIFIC_SHIFT   (24U)
+#define CPPI5_TR_RESPONSE_CFG_SPECIFIC_MASK    GENMASK(31, 24)
+
+/*
+ * Udmap TR Response Status Type field is used to determine
+ * what type of status is being returned.
+ */
+enum cppi5_tr_resp_status_type {
+       CPPI5_TR_RESPONSE_STATUS_COMPLETE,              /* None */
+       CPPI5_TR_RESPONSE_STATUS_TRANSFER_ERR,          /* Transfer Error */
+       CPPI5_TR_RESPONSE_STATUS_ABORTED_ERR,           /* Aborted Error */
+       CPPI5_TR_RESPONSE_STATUS_SUBMISSION_ERR,        /* Submission Error */
+       CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_ERR,       /* Unsup. Feature */
+       CPPI5_TR_RESPONSE_STATUS_MAX
+};
+
+/*
+ * Udmap TR Response Status field values which corresponds
+ * CPPI5_TR_RESPONSE_STATUS_SUBMISSION_ERR
+ */
+enum cppi5_tr_resp_status_submission {
+       /* ICNT0 was 0 */
+       CPPI5_TR_RESPONSE_STATUS_SUBMISSION_ICNT0,
+       /* Channel FIFO was full when TR received */
+       CPPI5_TR_RESPONSE_STATUS_SUBMISSION_FIFO_FULL,
+       /* Channel is not owned by the submitter */
+       CPPI5_TR_RESPONSE_STATUS_SUBMISSION_OWN,
+       CPPI5_TR_RESPONSE_STATUS_SUBMISSION_MAX
+};
+
+/*
+ * Udmap TR Response Status field values which corresponds
+ * CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_ERR
+ */
+enum cppi5_tr_resp_status_unsupported {
+       /* TR Type not supported */
+       CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_TR_TYPE,
+       /* STATIC not supported */
+       CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_STATIC,
+       /* EOL not supported */
+       CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_EOL,
+       /* CONFIGURATION SPECIFIC not supported */
+       CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_CFG_SPECIFIC,
+       /* AMODE not supported */
+       CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_AMODE,
+       /* ELTYPE not supported */
+       CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_ELTYPE,
+       /* DFMT not supported */
+       CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_DFMT,
+       /* SECTR not supported */
+       CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_SECTR,
+       /* AMODE SPECIFIC field not supported */
+       CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_AMODE_SPECIFIC,
+       CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_MAX
+};
+
+/**
+ * cppi5_trdesc_calc_size - Calculate TR Descriptor size
+ * @tr_count: number of TR records
+ * @tr_size: Nominal size of TR record (max) [16, 32, 64, 128]
+ *
+ * Returns required TR Descriptor size
+ */
+static inline size_t cppi5_trdesc_calc_size(u32 tr_count, u32 tr_size)
+{
+       /*
+        * The Size of a TR descriptor is:
+        * 1 x tr_size : the first 16 bytes is used by the packet info block +
+        * tr_count x tr_size : Transfer Request Records +
+        * tr_count x sizeof(struct cppi5_tr_resp_t) : Transfer Response Records
+        */
+       return tr_size * (tr_count + 1) +
+               sizeof(struct cppi5_tr_resp_t) * tr_count;
+}
+
+/**
+ * cppi5_trdesc_init - Init TR Descriptor
+ * @desc: TR Descriptor
+ * @tr_count: number of TR records
+ * @tr_size: Nominal size of TR record (max) [16, 32, 64, 128]
+ * @reload_idx: Absolute index to jump to on the 2nd and following passes
+ *             through the TR packet.
+ * @reload_count: Number of times to jump from last entry to reload_idx. 0x1ff
+ *               indicates infinite looping.
+ *
+ * Init TR Descriptor
+ */
+static inline void cppi5_trdesc_init(struct cppi5_desc_hdr_t *desc_hdr,
+                                    u32 tr_count, u32 tr_size, u32 reload_idx,
+                                    u32 reload_count)
+{
+       WARN_ON(!desc_hdr);
+       WARN_ON(tr_count & ~CPPI5_INFO0_TRDESC_LASTIDX_MASK);
+       WARN_ON(reload_idx > CPPI5_INFO0_TRDESC_RLDIDX_MAX);
+       WARN_ON(reload_count > CPPI5_INFO0_TRDESC_RLDCNT_MAX);
+
+       desc_hdr->pkt_info0 = CPPI5_INFO0_DESC_TYPE_VAL_TR <<
+                             CPPI5_INFO0_HDESC_TYPE_SHIFT;
+       desc_hdr->pkt_info0 |= (reload_count << CPPI5_INFO0_TRDESC_RLDCNT_SHIFT) &
+                              CPPI5_INFO0_TRDESC_RLDCNT_MASK;
+       desc_hdr->pkt_info0 |= (reload_idx << CPPI5_INFO0_TRDESC_RLDIDX_SHIFT) &
+                              CPPI5_INFO0_TRDESC_RLDIDX_MASK;
+       desc_hdr->pkt_info0 |= (tr_count - 1) & CPPI5_INFO0_TRDESC_LASTIDX_MASK;
+
+       desc_hdr->pkt_info1 |= ((ffs(tr_size >> 4) - 1) <<
+                               CPPI5_INFO1_TRDESC_RECSIZE_SHIFT) &
+                               CPPI5_INFO1_TRDESC_RECSIZE_MASK;
+}
+
+/**
+ * cppi5_tr_init - Init TR record
+ * @flags: Pointer to the TR's flags
+ * @type: TR type
+ * @static_tr: TR is static
+ * @wait: Wait for TR completion before allow the next TR to start
+ * @event_size: output event generation cfg
+ * @cmd_id: TR identifier (application specifics)
+ *
+ * Init TR record
+ */
+static inline void cppi5_tr_init(cppi5_tr_flags_t *flags,
+                                enum cppi5_tr_types type, bool static_tr,
+                                bool wait, enum cppi5_tr_event_size event_size,
+                                u32 cmd_id)
+{
+       WARN_ON(!flags);
+
+       *flags = type;
+       *flags |= (event_size << CPPI5_TR_EVENT_SIZE_SHIFT) &
+                 CPPI5_TR_EVENT_SIZE_MASK;
+
+       *flags |= (cmd_id << CPPI5_TR_CMD_ID_SHIFT) &
+                 CPPI5_TR_CMD_ID_MASK;
+
+       if (static_tr && (type == CPPI5_TR_TYPE8 || type == CPPI5_TR_TYPE9))
+               *flags |= CPPI5_TR_STATIC;
+
+       if (wait)
+               *flags |= CPPI5_TR_WAIT;
+}
+
+/**
+ * cppi5_tr_set_trigger - Configure trigger0/1 and trigger0/1_type
+ * @flags: Pointer to the TR's flags
+ * @trigger0: trigger0 selection
+ * @trigger0_type: type of data transfer that will be enabled by trigger0
+ * @trigger1: trigger1 selection
+ * @trigger1_type: type of data transfer that will be enabled by trigger1
+ *
+ * Configure the triggers for the TR
+ */
+static inline void cppi5_tr_set_trigger(cppi5_tr_flags_t *flags,
+                               enum cppi5_tr_trigger trigger0,
+                               enum cppi5_tr_trigger_type trigger0_type,
+                               enum cppi5_tr_trigger trigger1,
+                               enum cppi5_tr_trigger_type trigger1_type)
+{
+       WARN_ON(!flags);
+
+       *flags |= (trigger0 << CPPI5_TR_TRIGGER0_SHIFT) &
+                 CPPI5_TR_TRIGGER0_MASK;
+       *flags |= (trigger0_type << CPPI5_TR_TRIGGER0_TYPE_SHIFT) &
+                 CPPI5_TR_TRIGGER0_TYPE_MASK;
+
+       *flags |= (trigger1 << CPPI5_TR_TRIGGER1_SHIFT) &
+                 CPPI5_TR_TRIGGER1_MASK;
+       *flags |= (trigger1_type << CPPI5_TR_TRIGGER1_TYPE_SHIFT) &
+                 CPPI5_TR_TRIGGER1_TYPE_MASK;
+}
+
+/**
+ * cppi5_tr_cflag_set - Update the Configuration specific flags
+ * @flags: Pointer to the TR's flags
+ * @csf: Configuration specific flags
+ *
+ * Set a bit in Configuration Specific Flags section of the TR flags.
+ */
+static inline void cppi5_tr_csf_set(cppi5_tr_flags_t *flags, u32 csf)
+{
+       WARN_ON(!flags);
+
+       *flags |= (csf << CPPI5_TR_CSF_FLAGS_SHIFT) &
+                 CPPI5_TR_CSF_FLAGS_MASK;
+}
+
+#endif /* __TI_CPPI5_H__ */
diff --git a/include/linux/soc/ti/k3-navss-ringacc.h b/include/linux/soc/ti/k3-navss-ringacc.h
new file mode 100644 (file)
index 0000000..487dfe9
--- /dev/null
@@ -0,0 +1,236 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * TI K3 AM65x NAVSS Ring accelerator Manager (RA) subsystem driver
+ *
+ * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com
+ */
+
+#ifndef __SOC_TI_K3_NAVSS_RINGACC_API_H_
+#define __SOC_TI_K3_NAVSS_RINGACC_API_H_
+
+#include <dm/ofnode.h>
+
+/**
+ * enum k3_nav_ring_mode - &struct k3_nav_ring_cfg mode
+ *
+ * RA ring operational modes
+ *
+ * @K3_NAV_RINGACC_RING_MODE_RING: Exposed Ring mode for SW direct access
+ * @K3_NAV_RINGACC_RING_MODE_MESSAGE: Messaging mode. Messaging mode requires
+ *     that all accesses to the queue must go through this IP so that all
+ *     accesses to the memory are controlled and ordered. This IP then
+ *     controls the entire state of the queue, and SW has no directly control,
+ *     such as through doorbells and cannot access the storage memory directly.
+ *     This is particularly useful when more than one SW or HW entity can be
+ *     the producer and/or consumer at the same time
+ * @K3_NAV_RINGACC_RING_MODE_CREDENTIALS: Credentials mode is message mode plus
+ *     stores credentials with each message, requiring the element size to be
+ *     doubled to fit the credentials. Any exposed memory should be protected
+ *     by a firewall from unwanted access
+ * @K3_NAV_RINGACC_RING_MODE_QM:  Queue manager mode. This takes the credentials
+ *     mode and adds packet length per element, along with additional read only
+ *     fields for element count and accumulated queue length. The QM mode only
+ *     operates with an 8 byte element size (any other element size is
+ *     illegal), and like in credentials mode each operation uses 2 element
+ *     slots to store the credentials and length fields
+ */
+enum k3_nav_ring_mode {
+       K3_NAV_RINGACC_RING_MODE_RING = 0,
+       K3_NAV_RINGACC_RING_MODE_MESSAGE,
+       K3_NAV_RINGACC_RING_MODE_CREDENTIALS,
+       K3_NAV_RINGACC_RING_MODE_QM,
+       k3_NAV_RINGACC_RING_MODE_INVALID
+};
+
+/**
+ * enum k3_nav_ring_size - &struct k3_nav_ring_cfg elm_size
+ *
+ * RA ring element's sizes in bytes.
+ */
+enum k3_nav_ring_size {
+       K3_NAV_RINGACC_RING_ELSIZE_4 = 0,
+       K3_NAV_RINGACC_RING_ELSIZE_8,
+       K3_NAV_RINGACC_RING_ELSIZE_16,
+       K3_NAV_RINGACC_RING_ELSIZE_32,
+       K3_NAV_RINGACC_RING_ELSIZE_64,
+       K3_NAV_RINGACC_RING_ELSIZE_128,
+       K3_NAV_RINGACC_RING_ELSIZE_256,
+       K3_NAV_RINGACC_RING_ELSIZE_INVALID
+};
+
+struct k3_nav_ringacc;
+struct k3_nav_ring;
+
+/**
+ * enum k3_nav_ring_cfg - RA ring configuration structure
+ *
+ * @size: Ring size, number of elements
+ * @elm_size: Ring element size
+ * @mode: Ring operational mode
+ * @flags: Ring configuration flags. Possible values:
+ *      @K3_NAV_RINGACC_RING_SHARED: when set allows to request the same ring
+ *      few times. It's usable when the same ring is used as Free Host PD ring
+ *      for different flows, for example.
+ *      Note: Locking should be done by consumer if required
+ */
+struct k3_nav_ring_cfg {
+       u32 size;
+       enum k3_nav_ring_size elm_size;
+       enum k3_nav_ring_mode mode;
+#define K3_NAV_RINGACC_RING_SHARED BIT(1)
+       u32 flags;
+};
+
+#define K3_NAV_RINGACC_RING_ID_ANY (-1)
+#define K3_NAV_RINGACC_RING_USE_PROXY BIT(1)
+
+/**
+ * k3_nav_ringacc_request_ring - request ring from ringacc
+ * @ringacc: pointer on ringacc
+ * @id: ring id or K3_NAV_RINGACC_RING_ID_ANY for any general purpose ring
+ * @flags:
+ *     @K3_NAV_RINGACC_RING_USE_PROXY: if set - proxy will be allocated and
+ *             used to access ring memory. Sopported only for rings in
+ *             Message/Credentials/Queue mode.
+ *
+ * Returns pointer on the Ring - struct k3_nav_ring
+ * or NULL in case of failure.
+ */
+struct k3_nav_ring *k3_nav_ringacc_request_ring(struct k3_nav_ringacc *ringacc,
+                                               int id, u32 flags);
+
+/**
+ * k3_nav_ringacc_get_dev - get pointer on RA device
+ * @ringacc: pointer on RA
+ *
+ * Returns device pointer
+ */
+struct udevice *k3_nav_ringacc_get_dev(struct k3_nav_ringacc *ringacc);
+
+/**
+ * k3_nav_ringacc_ring_reset - ring reset
+ * @ring: pointer on Ring
+ *
+ * Resets ring internal state ((hw)occ, (hw)idx).
+ * TODO_GS: ? Ring can be reused without reconfiguration
+ */
+void k3_nav_ringacc_ring_reset(struct k3_nav_ring *ring);
+/**
+ * k3_nav_ringacc_ring_reset - ring reset for DMA rings
+ * @ring: pointer on Ring
+ *
+ * Resets ring internal state ((hw)occ, (hw)idx). Should be used for rings
+ * which are read by K3 UDMA, like TX or Free Host PD rings.
+ */
+void k3_nav_ringacc_ring_reset_dma(struct k3_nav_ring *ring, u32 occ);
+
+/**
+ * k3_nav_ringacc_ring_free - ring free
+ * @ring: pointer on Ring
+ *
+ * Resets ring and free all alocated resources.
+ */
+int k3_nav_ringacc_ring_free(struct k3_nav_ring *ring);
+
+/**
+ * k3_nav_ringacc_get_ring_id - Get the Ring ID
+ * @ring: pointer on ring
+ *
+ * Returns the Ring ID
+ */
+u32 k3_nav_ringacc_get_ring_id(struct k3_nav_ring *ring);
+
+/**
+ * k3_nav_ringacc_ring_cfg - ring configure
+ * @ring: pointer on ring
+ * @cfg: Ring configuration parameters (see &struct k3_nav_ring_cfg)
+ *
+ * Configures ring, including ring memory allocation.
+ * Returns 0 on success, errno otherwise.
+ */
+int k3_nav_ringacc_ring_cfg(struct k3_nav_ring *ring,
+                           struct k3_nav_ring_cfg *cfg);
+
+/**
+ * k3_nav_ringacc_ring_get_size - get ring size
+ * @ring: pointer on ring
+ *
+ * Returns ring size in number of elements.
+ */
+u32 k3_nav_ringacc_ring_get_size(struct k3_nav_ring *ring);
+
+/**
+ * k3_nav_ringacc_ring_get_free - get free elements
+ * @ring: pointer on ring
+ *
+ * Returns number of free elements in the ring.
+ */
+u32 k3_nav_ringacc_ring_get_free(struct k3_nav_ring *ring);
+
+/**
+ * k3_nav_ringacc_ring_get_occ - get ring occupancy
+ * @ring: pointer on ring
+ *
+ * Returns total number of valid entries on the ring
+ */
+u32 k3_nav_ringacc_ring_get_occ(struct k3_nav_ring *ring);
+
+/**
+ * k3_nav_ringacc_ring_is_full - checks if ring is full
+ * @ring: pointer on ring
+ *
+ * Returns true if the ring is full
+ */
+u32 k3_nav_ringacc_ring_is_full(struct k3_nav_ring *ring);
+
+/**
+ * k3_nav_ringacc_ring_push - push element to the ring tail
+ * @ring: pointer on ring
+ * @elem: pointer on ring element buffer
+ *
+ * Push one ring element to the ring tail. Size of the ring element is
+ * determined by ring configuration &struct k3_nav_ring_cfg elm_size.
+ *
+ * Returns 0 on success, errno otherwise.
+ */
+int k3_nav_ringacc_ring_push(struct k3_nav_ring *ring, void *elem);
+
+/**
+ * k3_nav_ringacc_ring_pop - pop element from the ring head
+ * @ring: pointer on ring
+ * @elem: pointer on ring element buffer
+ *
+ * Push one ring element from the ring head. Size of the ring element is
+ * determined by ring configuration &struct k3_nav_ring_cfg elm_size..
+ *
+ * Returns 0 on success, errno otherwise.
+ */
+int k3_nav_ringacc_ring_pop(struct k3_nav_ring *ring, void *elem);
+
+/**
+ * k3_nav_ringacc_ring_push_head - push element to the ring head
+ * @ring: pointer on ring
+ * @elem: pointer on ring element buffer
+ *
+ * Push one ring element to the ring head. Size of the ring element is
+ * determined by ring configuration &struct k3_nav_ring_cfg elm_size.
+ *
+ * Returns 0 on success, errno otherwise.
+ * Not Supported by ring modes: K3_NAV_RINGACC_RING_MODE_RING
+ */
+int k3_nav_ringacc_ring_push_head(struct k3_nav_ring *ring, void *elem);
+
+/**
+ * k3_nav_ringacc_ring_pop_tail - pop element from the ring tail
+ * @ring: pointer on ring
+ * @elem: pointer on ring element buffer
+ *
+ * Push one ring element from the ring tail. Size of the ring element is
+ * determined by ring configuration &struct k3_nav_ring_cfg elm_size.
+ *
+ * Returns 0 on success, errno otherwise.
+ * Not Supported by ring modes: K3_NAV_RINGACC_RING_MODE_RING
+ */
+int k3_nav_ringacc_ring_pop_tail(struct k3_nav_ring *ring, void *elem);
+
+#endif /* __SOC_TI_K3_NAVSS_RINGACC_API_H_ */
diff --git a/include/linux/soc/ti/ti-udma.h b/include/linux/soc/ti/ti-udma.h
new file mode 100644 (file)
index 0000000..e9d4226
--- /dev/null
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *  Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com
+ *  Author: Peter Ujfalusi <peter.ujfalusi@ti.com>
+ */
+
+#ifndef __TI_UDMA_H
+#define __TI_UDMA_H
+
+/**
+ * struct ti_udma_drv_packet_data - TI UDMA transfer specific data
+ *
+ * @pkt_type: Packet Type - specific for each DMA client HW
+ * @dest_tag: Destination tag The source pointer.
+ *
+ * TI UDMA transfer specific data passed as part of DMA transfer to
+ * the DMA client HW in UDMA descriptors.
+ */
+struct ti_udma_drv_packet_data {
+       u32     pkt_type;
+       u32     dest_tag;
+};
+
+#endif /* __TI_UDMA_H */
index 90d5053636522d7d8340817ae22556e3e77d085d..222cf665460ff294b5344764f700fcc82818ad5f 100644 (file)
@@ -212,14 +212,43 @@ struct ti_sci_clk_ops {
                        u64 *current_freq);
 };
 
+/**
+ * struct ti_sci_rm_core_ops - Resource management core operations
+ * @get_range:         Get a range of resources belonging to ti sci host.
+ * @get_rage_from_shost:       Get a range of resources belonging to
+ *                             specified host id.
+ *                     - s_host: Host processing entity to which the
+ *                               resources are allocated
+ *
+ * NOTE: for these functions, all the parameters are consolidated and defined
+ * as below:
+ * - handle:   Pointer to TISCI handle as retrieved by *ti_sci_get_handle
+ * - dev_id:   TISCI device ID.
+ * - subtype:  Resource assignment subtype that is being requested
+ *             from the given device.
+ * - range_start:      Start index of the resource range
+ * - range_end:                Number of resources in the range
+ */
+struct ti_sci_rm_core_ops {
+       int (*get_range)(const struct ti_sci_handle *handle, u32 dev_id,
+                        u8 subtype, u16 *range_start, u16 *range_num);
+       int (*get_range_from_shost)(const struct ti_sci_handle *handle,
+                                   u32 dev_id, u8 subtype, u8 s_host,
+                                   u16 *range_start, u16 *range_num);
+};
+
 /**
  * struct ti_sci_core_ops - SoC Core Operations
  * @reboot_device: Reboot the SoC
  *             Returns 0 for successful request(ideally should never return),
  *             else returns corresponding error value.
+ * @query_msmc: Query the size of available msmc
+ *             Return 0 for successful query else appropriate error value.
  */
 struct ti_sci_core_ops {
        int (*reboot_device)(const struct ti_sci_handle *handle);
+       int (*query_msmc)(const struct ti_sci_handle *handle,
+                         u64 *msmc_start, u64 *msmc_end);
 };
 
 /**
@@ -257,6 +286,230 @@ struct ti_sci_proc_ops {
                                    u32 *sts_flags);
 };
 
+#define TI_SCI_RING_MODE_RING                  (0)
+#define TI_SCI_RING_MODE_MESSAGE               (1)
+#define TI_SCI_RING_MODE_CREDENTIALS           (2)
+#define TI_SCI_RING_MODE_QM                    (3)
+
+#define TI_SCI_MSG_UNUSED_SECONDARY_HOST TI_SCI_RM_NULL_U8
+
+/* RA config.addr_lo parameter is valid for RM ring configure TI_SCI message */
+#define TI_SCI_MSG_VALUE_RM_RING_ADDR_LO_VALID BIT(0)
+/* RA config.addr_hi parameter is valid for RM ring configure TI_SCI message */
+#define TI_SCI_MSG_VALUE_RM_RING_ADDR_HI_VALID BIT(1)
+ /* RA config.count parameter is valid for RM ring configure TI_SCI message */
+#define TI_SCI_MSG_VALUE_RM_RING_COUNT_VALID   BIT(2)
+/* RA config.mode parameter is valid for RM ring configure TI_SCI message */
+#define TI_SCI_MSG_VALUE_RM_RING_MODE_VALID    BIT(3)
+/* RA config.size parameter is valid for RM ring configure TI_SCI message */
+#define TI_SCI_MSG_VALUE_RM_RING_SIZE_VALID    BIT(4)
+/* RA config.order_id parameter is valid for RM ring configure TISCI message */
+#define TI_SCI_MSG_VALUE_RM_RING_ORDER_ID_VALID        BIT(5)
+
+#define TI_SCI_MSG_VALUE_RM_ALL_NO_ORDER \
+       (TI_SCI_MSG_VALUE_RM_RING_ADDR_LO_VALID | \
+       TI_SCI_MSG_VALUE_RM_RING_ADDR_HI_VALID | \
+       TI_SCI_MSG_VALUE_RM_RING_COUNT_VALID | \
+       TI_SCI_MSG_VALUE_RM_RING_MODE_VALID | \
+       TI_SCI_MSG_VALUE_RM_RING_SIZE_VALID)
+
+/**
+ * struct ti_sci_rm_ringacc_ops - Ring Accelerator Management operations
+ * @config: configure the SoC Navigator Subsystem Ring Accelerator ring
+ * @get_config: get the SoC Navigator Subsystem Ring Accelerator ring
+ *             configuration
+ */
+struct ti_sci_rm_ringacc_ops {
+       int (*config)(const struct ti_sci_handle *handle,
+                     u32 valid_params, u16 nav_id, u16 index,
+                     u32 addr_lo, u32 addr_hi, u32 count, u8 mode,
+                     u8 size, u8 order_id
+       );
+       int (*get_config)(const struct ti_sci_handle *handle,
+                         u32 nav_id, u32 index, u8 *mode,
+                         u32 *addr_lo, u32 *addr_hi, u32 *count,
+                         u8 *size, u8 *order_id);
+};
+
+/**
+ * struct ti_sci_rm_psil_ops - PSI-L thread operations
+ * @pair: pair PSI-L source thread to a destination thread.
+ *     If the src_thread is mapped to UDMA tchan, the corresponding channel's
+ *     TCHAN_THRD_ID register is updated.
+ *     If the dst_thread is mapped to UDMA rchan, the corresponding channel's
+ *     RCHAN_THRD_ID register is updated.
+ * @unpair: unpair PSI-L source thread from a destination thread.
+ *     If the src_thread is mapped to UDMA tchan, the corresponding channel's
+ *     TCHAN_THRD_ID register is cleared.
+ *     If the dst_thread is mapped to UDMA rchan, the corresponding channel's
+ *     RCHAN_THRD_ID register is cleared.
+ */
+struct ti_sci_rm_psil_ops {
+       int (*pair)(const struct ti_sci_handle *handle, u32 nav_id,
+                   u32 src_thread, u32 dst_thread);
+       int (*unpair)(const struct ti_sci_handle *handle, u32 nav_id,
+                     u32 src_thread, u32 dst_thread);
+};
+
+/* UDMAP channel types */
+#define TI_SCI_RM_UDMAP_CHAN_TYPE_PKT_PBRR             2
+#define TI_SCI_RM_UDMAP_CHAN_TYPE_PKT_PBRR_SB          3       /* RX only */
+#define TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_PBRR            10
+#define TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_PBVR            11
+#define TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_BCOPY_PBRR      12
+#define TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_BCOPY_PBVR      13
+
+/* UDMAP channel atypes */
+#define TI_SCI_RM_UDMAP_ATYPE_PHYS                     0
+#define TI_SCI_RM_UDMAP_ATYPE_INTERMEDIATE             1
+#define TI_SCI_RM_UDMAP_ATYPE_VIRTUAL                  2
+
+/* UDMAP channel scheduling priorities */
+#define TI_SCI_RM_UDMAP_SCHED_PRIOR_HIGH               0
+#define TI_SCI_RM_UDMAP_SCHED_PRIOR_MEDHIGH            1
+#define TI_SCI_RM_UDMAP_SCHED_PRIOR_MEDLOW             2
+#define TI_SCI_RM_UDMAP_SCHED_PRIOR_LOW                        3
+
+#define TI_SCI_RM_UDMAP_RX_FLOW_DESC_HOST              0
+#define TI_SCI_RM_UDMAP_RX_FLOW_DESC_MONO              2
+
+/* UDMAP TX/RX channel valid_params common declarations */
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_PAUSE_ON_ERR_VALID                BIT(0)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_ATYPE_VALID                BIT(1)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_CHAN_TYPE_VALID            BIT(2)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_FETCH_SIZE_VALID           BIT(3)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_CQ_QNUM_VALID              BIT(4)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_PRIORITY_VALID             BIT(5)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_QOS_VALID                  BIT(6)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_ORDER_ID_VALID             BIT(7)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_SCHED_PRIORITY_VALID       BIT(8)
+
+/**
+ * Configures a Navigator Subsystem UDMAP transmit channel
+ *
+ * Configures a Navigator Subsystem UDMAP transmit channel registers.
+ * See @ti_sci_msg_rm_udmap_tx_ch_cfg_req
+ */
+struct ti_sci_msg_rm_udmap_tx_ch_cfg {
+       u32 valid_params;
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_FILT_EINFO_VALID        BIT(9)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_FILT_PSWORDS_VALID      BIT(10)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_SUPR_TDPKT_VALID        BIT(11)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_CREDIT_COUNT_VALID      BIT(12)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_FDEPTH_VALID            BIT(13)
+       u16 nav_id;
+       u16 index;
+       u8 tx_pause_on_err;
+       u8 tx_filt_einfo;
+       u8 tx_filt_pswords;
+       u8 tx_atype;
+       u8 tx_chan_type;
+       u8 tx_supr_tdpkt;
+       u16 tx_fetch_size;
+       u8 tx_credit_count;
+       u16 txcq_qnum;
+       u8 tx_priority;
+       u8 tx_qos;
+       u8 tx_orderid;
+       u16 fdepth;
+       u8 tx_sched_priority;
+};
+
+/**
+ * Configures a Navigator Subsystem UDMAP receive channel
+ *
+ * Configures a Navigator Subsystem UDMAP receive channel registers.
+ * See @ti_sci_msg_rm_udmap_rx_ch_cfg_req
+ */
+struct ti_sci_msg_rm_udmap_rx_ch_cfg {
+       u32 valid_params;
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_START_VALID      BIT(9)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_CNT_VALID        BIT(10)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_IGNORE_SHORT_VALID      BIT(11)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_IGNORE_LONG_VALID       BIT(12)
+       u16 nav_id;
+       u16 index;
+       u16 rx_fetch_size;
+       u16 rxcq_qnum;
+       u8 rx_priority;
+       u8 rx_qos;
+       u8 rx_orderid;
+       u8 rx_sched_priority;
+       u16 flowid_start;
+       u16 flowid_cnt;
+       u8 rx_pause_on_err;
+       u8 rx_atype;
+       u8 rx_chan_type;
+       u8 rx_ignore_short;
+       u8 rx_ignore_long;
+};
+
+/**
+ * Configures a Navigator Subsystem UDMAP receive flow
+ *
+ * Configures a Navigator Subsystem UDMAP receive flow's registers.
+ * See @tis_ci_msg_rm_udmap_flow_cfg_req
+ */
+struct ti_sci_msg_rm_udmap_flow_cfg {
+       u32 valid_params;
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_EINFO_PRESENT_VALID     BIT(0)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_PSINFO_PRESENT_VALID     BIT(1)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_ERROR_HANDLING_VALID     BIT(2)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DESC_TYPE_VALID          BIT(3)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SOP_OFFSET_VALID         BIT(4)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_QNUM_VALID          BIT(5)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_HI_VALID         BIT(6)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_LO_VALID         BIT(7)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_HI_VALID        BIT(8)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_LO_VALID        BIT(9)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_HI_SEL_VALID     BIT(10)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_LO_SEL_VALID     BIT(11)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_HI_SEL_VALID    BIT(12)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_LO_SEL_VALID    BIT(13)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ0_SZ0_QNUM_VALID      BIT(14)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ1_QNUM_VALID          BIT(15)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ2_QNUM_VALID          BIT(16)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ3_QNUM_VALID          BIT(17)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_PS_LOCATION_VALID        BIT(18)
+       u16 nav_id;
+       u16 flow_index;
+       u8 rx_einfo_present;
+       u8 rx_psinfo_present;
+       u8 rx_error_handling;
+       u8 rx_desc_type;
+       u16 rx_sop_offset;
+       u16 rx_dest_qnum;
+       u8 rx_src_tag_hi;
+       u8 rx_src_tag_lo;
+       u8 rx_dest_tag_hi;
+       u8 rx_dest_tag_lo;
+       u8 rx_src_tag_hi_sel;
+       u8 rx_src_tag_lo_sel;
+       u8 rx_dest_tag_hi_sel;
+       u8 rx_dest_tag_lo_sel;
+       u16 rx_fdq0_sz0_qnum;
+       u16 rx_fdq1_qnum;
+       u16 rx_fdq2_qnum;
+       u16 rx_fdq3_qnum;
+       u8 rx_ps_location;
+};
+
+/**
+ * struct ti_sci_rm_udmap_ops - UDMA Management operations
+ * @tx_ch_cfg: configure SoC Navigator Subsystem UDMA transmit channel.
+ * @rx_ch_cfg: configure SoC Navigator Subsystem UDMA receive channel.
+ * @rx_flow_cfg: configure SoC Navigator Subsystem UDMA receive flow.
+ */
+struct ti_sci_rm_udmap_ops {
+       int (*tx_ch_cfg)(const struct ti_sci_handle *handle,
+                        const struct ti_sci_msg_rm_udmap_tx_ch_cfg *params);
+       int (*rx_ch_cfg)(const struct ti_sci_handle *handle,
+                        const struct ti_sci_msg_rm_udmap_rx_ch_cfg *params);
+       int (*rx_flow_cfg)(
+               const struct ti_sci_handle *handle,
+               const struct ti_sci_msg_rm_udmap_flow_cfg *params);
+};
+
 /**
  * struct ti_sci_ops - Function support for TI SCI
  * @board_ops: Miscellaneous operations
@@ -264,6 +517,7 @@ struct ti_sci_proc_ops {
  * @clk_ops:   Clock specific operations
  * @core_ops:  Core specific operations
  * @proc_ops:  Processor specific operations
+ * @ring_ops: Ring Accelerator Management operations
  */
 struct ti_sci_ops {
        struct ti_sci_board_ops board_ops;
@@ -271,6 +525,10 @@ struct ti_sci_ops {
        struct ti_sci_clk_ops clk_ops;
        struct ti_sci_core_ops core_ops;
        struct ti_sci_proc_ops proc_ops;
+       struct ti_sci_rm_core_ops rm_core_ops;
+       struct ti_sci_rm_ringacc_ops rm_ring_ops;
+       struct ti_sci_rm_psil_ops rm_psil_ops;
+       struct ti_sci_rm_udmap_ops rm_udmap_ops;
 };
 
 /**
@@ -283,12 +541,42 @@ struct ti_sci_handle {
        struct ti_sci_version_info version;
 };
 
+#define TI_SCI_RESOURCE_NULL   0xffff
+
+/**
+ * struct ti_sci_resource_desc - Description of TI SCI resource instance range.
+ * @start:     Start index of the resource.
+ * @num:       Number of resources.
+ * @res_map:   Bitmap to manage the allocation of these resources.
+ */
+struct ti_sci_resource_desc {
+       u16 start;
+       u16 num;
+       unsigned long *res_map;
+};
+
+/**
+ * struct ti_sci_resource - Structure representing a resource assigned
+ *                         to a device.
+ * @sets:      Number of sets available from this resource type
+ * @desc:      Array of resource descriptors.
+ */
+struct ti_sci_resource {
+       u16 sets;
+       struct ti_sci_resource_desc *desc;
+};
+
 #if IS_ENABLED(CONFIG_TI_SCI_PROTOCOL)
 
 const struct ti_sci_handle *ti_sci_get_handle_from_sysfw(struct udevice *dev);
 const struct ti_sci_handle *ti_sci_get_handle(struct udevice *dev);
 const struct ti_sci_handle *ti_sci_get_by_phandle(struct udevice *dev,
                                                  const char *property);
+u16 ti_sci_get_free_resource(struct ti_sci_resource *res);
+void ti_sci_release_resource(struct ti_sci_resource *res, u16 id);
+struct ti_sci_resource *
+devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
+                           struct udevice *dev, u32 dev_id, char *of_prop);
 
 #else  /* CONFIG_TI_SCI_PROTOCOL */
 
@@ -309,6 +597,22 @@ const struct ti_sci_handle *ti_sci_get_by_phandle(struct udevice *dev,
 {
        return ERR_PTR(-EINVAL);
 }
+
+static inline u16 ti_sci_get_free_resource(struct ti_sci_resource *res)
+{
+       return TI_SCI_RESOURCE_NULL;
+}
+
+static inline void ti_sci_release_resource(struct ti_sci_resource *res, u16 id)
+{
+}
+
+static inline struct ti_sci_resource *
+devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
+                           struct udevice *dev, u32 dev_id, char *of_prop)
+{
+       return ERR_PTR(-EINVAL);
+}
 #endif /* CONFIG_TI_SCI_PROTOCOL */
 
 #endif /* __TISCI_PROTOCOL_H */
index b714fedf4572589b2350eeb3e1508a4420a2f16b..5efa6920b2a17ee83b45f18f4a30004426a72ed0 100644 (file)
@@ -878,7 +878,6 @@ extern Void_t*     sbrk();
 #define memalign memalign_simple
 static inline void free(void *ptr) {}
 void *calloc(size_t nmemb, size_t size);
-void *memalign_simple(size_t alignment, size_t bytes);
 void *realloc_simple(void *ptr, size_t size);
 void malloc_simple_info(void);
 #else
@@ -914,6 +913,7 @@ int initf_malloc(void);
 
 /* Simple versions which can be used when space is tight */
 void *malloc_simple(size_t size);
+void *memalign_simple(size_t alignment, size_t bytes);
 
 #pragma GCC visibility push(hidden)
 # if __STD_C
index dd52ed3f476c156c0528a7cbc3ed1ea153ad1493..44b32385c402e5697fec20ad9a820d0435773c39 100644 (file)
@@ -92,12 +92,14 @@ enum eth_state_t {
  * @enetaddr: The Ethernet MAC address that is loaded from EEPROM or env
  * @phy_interface: PHY interface to use - see PHY_INTERFACE_MODE_...
  * @max_speed: Maximum speed of Ethernet connection supported by MAC
+ * @priv_pdata: device specific platdata
  */
 struct eth_pdata {
        phys_addr_t iobase;
        unsigned char enetaddr[ARP_HLEN];
        int phy_interface;
        int max_speed;
+       void *priv_pdata;
 };
 
 enum eth_recv_flags {
index 5fb212cab1a9eada9b0bc9ca5b9fdd2ad1ca0ad3..9668503f0930ba5618dfd128a12d0dabcccdc502 100644 (file)
@@ -545,7 +545,11 @@ extern void pci_cfgfunc_do_nothing(struct pci_controller* hose, pci_dev_t dev,
 extern void pci_cfgfunc_config_device(struct pci_controller* hose, pci_dev_t dev,
                                      struct pci_config_table *);
 
-#define MAX_PCI_REGIONS                7
+#ifdef CONFIG_NR_DRAM_BANKS
+#define MAX_PCI_REGIONS (CONFIG_NR_DRAM_BANKS + 7)
+#else
+#define MAX_PCI_REGIONS 7
+#endif
 
 #define INDIRECT_TYPE_NO_PCIE_LINK     1
 
diff --git a/include/power/stpmic1.h b/include/power/stpmic1.h
new file mode 100644 (file)
index 0000000..0e6721d
--- /dev/null
@@ -0,0 +1,117 @@
+/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
+/*
+ * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
+ */
+
+#ifndef __PMIC_STPMIC1_H_
+#define __PMIC_STPMIC1_H_
+
+#define STPMIC1_MAIN_CR                        0x10
+#define STPMIC1_BUCKS_MRST_CR          0x18
+#define STPMIC1_LDOS_MRST_CR           0x1a
+#define STPMIC1_BUCKX_MAIN_CR(buck)    (0x20 + (buck))
+#define STPMIC1_REFDDR_MAIN_CR         0x24
+#define STPMIC1_LDOX_MAIN_CR(ldo)      (0x25 + (ldo))
+#define STPMIC1_BST_SW_CR              0x40
+#define STPMIC1_NVM_SR                 0xb8
+#define STPMIC1_NVM_CR                 0xb9
+
+/* Main PMIC Control Register (MAIN_CR) */
+#define STPMIC1_SWOFF                  BIT(0)
+#define STPMIC1_RREQ_EN                        BIT(1)
+
+/* BUCKS_MRST_CR */
+#define STPMIC1_MRST_BUCK(buck)                BIT(buck)
+#define STPMIC1_MRST_BUCK_ALL          GENMASK(3, 0)
+
+/* LDOS_MRST_CR */
+#define STPMIC1_MRST_LDO(ldo)          BIT(ldo)
+#define STPMIC1_MRST_LDO_ALL           GENMASK(6, 0)
+
+/* BUCKx_MAIN_CR (x=1...4) */
+#define STPMIC1_BUCK_ENA               BIT(0)
+#define STPMIC1_BUCK_PREG_MODE         BIT(1)
+#define STPMIC1_BUCK_VOUT_MASK         GENMASK(7, 2)
+#define STPMIC1_BUCK_VOUT_SHIFT                2
+#define STPMIC1_BUCK_VOUT(sel)         (sel << STPMIC1_BUCK_VOUT_SHIFT)
+
+#define STPMIC1_BUCK2_1200000V         STPMIC1_BUCK_VOUT(24)
+#define STPMIC1_BUCK2_1350000V         STPMIC1_BUCK_VOUT(30)
+
+#define STPMIC1_BUCK3_1800000V         STPMIC1_BUCK_VOUT(39)
+
+/* REFDDR_MAIN_CR */
+#define STPMIC1_VREF_ENA               BIT(0)
+
+/* LDOX_MAIN_CR */
+#define STPMIC1_LDO_ENA                        BIT(0)
+#define STPMIC1_LDO12356_VOUT_MASK     GENMASK(6, 2)
+#define STPMIC1_LDO12356_VOUT_SHIFT    2
+#define STPMIC1_LDO_VOUT(sel)          (sel << STPMIC1_LDO12356_VOUT_SHIFT)
+
+#define STPMIC1_LDO3_MODE              BIT(7)
+#define STPMIC1_LDO3_DDR_SEL           31
+#define STPMIC1_LDO3_1800000           STPMIC1_LDO_VOUT(9)
+
+#define STPMIC1_LDO4_UV                        3300000
+
+/* BST_SW_CR */
+#define STPMIC1_BST_ON                 BIT(0)
+#define STPMIC1_VBUSOTG_ON             BIT(1)
+#define STPMIC1_SWOUT_ON               BIT(2)
+#define STPMIC1_PWR_SW_ON              (STPMIC1_VBUSOTG_ON | STPMIC1_SWOUT_ON)
+
+/* NVM_SR */
+#define STPMIC1_NVM_BUSY               BIT(0)
+
+/* NVM_CR */
+#define STPMIC1_NVM_CMD_PROGRAM                1
+#define STPMIC1_NVM_CMD_READ           2
+
+/* Timeout */
+#define STPMIC1_DEFAULT_START_UP_DELAY_MS      1
+#define STPMIC1_DEFAULT_STOP_DELAY_MS          5
+#define STPMIC1_USB_BOOST_START_UP_DELAY_MS    10
+
+enum {
+       STPMIC1_BUCK1,
+       STPMIC1_BUCK2,
+       STPMIC1_BUCK3,
+       STPMIC1_BUCK4,
+       STPMIC1_MAX_BUCK,
+};
+
+enum {
+       STPMIC1_PREG_MODE_HP,
+       STPMIC1_PREG_MODE_LP,
+};
+
+enum {
+       STPMIC1_LDO1,
+       STPMIC1_LDO2,
+       STPMIC1_LDO3,
+       STPMIC1_LDO4,
+       STPMIC1_LDO5,
+       STPMIC1_LDO6,
+       STPMIC1_MAX_LDO,
+};
+
+enum {
+       STPMIC1_LDO_MODE_NORMAL,
+       STPMIC1_LDO_MODE_BYPASS,
+       STPMIC1_LDO_MODE_SINK_SOURCE,
+};
+
+enum {
+       STPMIC1_PWR_SW1,
+       STPMIC1_PWR_SW2,
+       STPMIC1_MAX_PWR_SW,
+};
+
+int stpmic1_shadow_read_byte(u8 addr, u8 *buf);
+int stpmic1_shadow_write_byte(u8 addr, u8 *buf);
+int stpmic1_nvm_read_byte(u8 addr, u8 *buf);
+int stpmic1_nvm_write_byte(u8 addr, u8 *buf);
+int stpmic1_nvm_read_all(u8 *buf, int buf_len);
+int stpmic1_nvm_write_all(u8 *buf, int buf_len);
+#endif
diff --git a/include/power/stpmu1.h b/include/power/stpmu1.h
deleted file mode 100644 (file)
index 5906fbf..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
-/*
- * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
- */
-
-#ifndef __PMIC_STPMU1_H_
-#define __PMIC_STPMU1_H_
-
-#define STPMU1_MASK_RESET_BUCK         0x18
-#define STPMU1_BUCKX_CTRL_REG(buck)    (0x20 + (buck))
-#define STPMU1_VREF_CTRL_REG           0x24
-#define STPMU1_LDOX_CTRL_REG(ldo)      (0x25 + (ldo))
-#define STPMU1_USB_CTRL_REG            0x40
-#define STPMU1_NVM_USER_STATUS_REG     0xb8
-#define STPMU1_NVM_USER_CONTROL_REG    0xb9
-
-#define STPMU1_MASK_RESET_BUCK3                BIT(2)
-
-#define STPMU1_BUCK_EN                 BIT(0)
-#define STPMU1_BUCK_MODE               BIT(1)
-#define STPMU1_BUCK_OUTPUT_MASK                GENMASK(7, 2)
-#define STPMU1_BUCK_OUTPUT_SHIFT       2
-#define STPMU1_BUCK2_1200000V          (24 << STPMU1_BUCK_OUTPUT_SHIFT)
-#define STPMU1_BUCK2_1350000V          (30 << STPMU1_BUCK_OUTPUT_SHIFT)
-#define STPMU1_BUCK3_1800000V          (39 << STPMU1_BUCK_OUTPUT_SHIFT)
-
-#define STPMU1_VREF_EN                 BIT(0)
-
-#define STPMU1_LDO_EN                  BIT(0)
-#define STPMU1_LDO12356_OUTPUT_MASK    GENMASK(6, 2)
-#define STPMU1_LDO12356_OUTPUT_SHIFT   2
-#define STPMU1_LDO3_MODE               BIT(7)
-#define STPMU1_LDO3_DDR_SEL            31
-#define STPMU1_LDO3_1800000            (9 << STPMU1_LDO12356_OUTPUT_SHIFT)
-#define STPMU1_LDO4_UV                 3300000
-
-#define STPMU1_USB_BOOST_EN            BIT(0)
-#define STPMU1_USB_PWR_SW_EN           GENMASK(2, 1)
-
-#define STPMU1_NVM_USER_CONTROL_PROGRAM        BIT(0)
-#define STPMU1_NVM_USER_CONTROL_READ   BIT(1)
-
-#define STPMU1_NVM_USER_STATUS_BUSY    BIT(0)
-#define STPMU1_NVM_USER_STATUS_ERROR   BIT(1)
-
-#define STPMU1_DEFAULT_START_UP_DELAY_MS       1
-#define STPMU1_DEFAULT_STOP_DELAY_MS           5
-#define STPMU1_USB_BOOST_START_UP_DELAY_MS     10
-
-enum {
-       STPMU1_BUCK1,
-       STPMU1_BUCK2,
-       STPMU1_BUCK3,
-       STPMU1_BUCK4,
-       STPMU1_MAX_BUCK,
-};
-
-enum {
-       STPMU1_BUCK_MODE_HP,
-       STPMU1_BUCK_MODE_LP,
-};
-
-enum {
-       STPMU1_LDO1,
-       STPMU1_LDO2,
-       STPMU1_LDO3,
-       STPMU1_LDO4,
-       STPMU1_LDO5,
-       STPMU1_LDO6,
-       STPMU1_MAX_LDO,
-};
-
-enum {
-       STPMU1_LDO_MODE_NORMAL,
-       STPMU1_LDO_MODE_BYPASS,
-       STPMU1_LDO_MODE_SINK_SOURCE,
-};
-
-enum {
-       STPMU1_PWR_SW1,
-       STPMU1_PWR_SW2,
-       STPMU1_MAX_PWR_SW,
-};
-
-#endif
index 65aa7a4ce5e9d95661025f937076fbdd6cc68b7f..a1a9ad5603dba2e6d6fb027471c0ffc552ad67f1 100644 (file)
@@ -43,6 +43,8 @@ struct udevice;
  * @data: An optional data field for scenarios where a single integer ID is not
  *       sufficient. If used, it can be populated through an .of_xlate op and
  *       processed during the various reset ops.
+ * @polarity: An optional polarity field for drivers that support
+ *       different reset polarities.
  *
  * Should additional information to identify and configure any reset signal
  * for any provider be required in the future, the struct could be expanded to
@@ -59,6 +61,7 @@ struct reset_ctl {
         */
        unsigned long id;
        unsigned long data;
+       unsigned long polarity;
 };
 
 /**
index 92427e5f32953f37c67b0369cf6bb3b35cfa521c..378594163b874246e606a41edf6e404e81412f81 100644 (file)
@@ -496,14 +496,15 @@ int spi_find_bus_and_cs(int busnum, int cs, struct udevice **busp,
  * device and slave device.
  *
  * If no such slave exists, and drv_name is not NULL, then a new slave device
- * is automatically bound on this chip select.
+ * is automatically bound on this chip select with requested speed and mode.
  *
- * Ths new slave device is probed ready for use with the given speed and mode.
+ * Ths new slave device is probed ready for use with the speed and mode
+ * from platdata when available or the requested values.
  *
  * @busnum:    SPI bus number
  * @cs:                Chip select to look for
- * @speed:     SPI speed to use for this slave
- * @mode:      SPI mode to use for this slave
+ * @speed:     SPI speed to use for this slave when not available in platdata
+ * @mode:      SPI mode to use for this slave when not available in platdata
  * @drv_name:  Name of driver to attach to this chip select
  * @dev_name:  Name of the new device thus created
  * @busp:      Returns bus device
index 4068de045dc2c4e204a0cc0ec9da3c7536ebaa7e..a6c12212a9b0cabe4a86dc47114b4d6e33b8fceb 100644 (file)
@@ -9,6 +9,7 @@
 #define __DWC2_USB_GADGET
 
 #define PHY0_SLEEP              (1 << 5)
+#define DWC2_MAX_HW_ENDPOINTS  16
 
 struct dwc2_plat_otg_data {
        void            *priv;
@@ -22,8 +23,14 @@ struct dwc2_plat_otg_data {
        unsigned int    rx_fifo_sz;
        unsigned int    np_tx_fifo_sz;
        unsigned int    tx_fifo_sz;
+       unsigned int    tx_fifo_sz_array[DWC2_MAX_HW_ENDPOINTS];
+       unsigned char   tx_fifo_sz_nb;
+       bool            force_b_session_valid;
+       bool            activate_stm_id_vb_detection;
 };
 
 int dwc2_udc_probe(struct dwc2_plat_otg_data *pdata);
 
+int dwc2_udc_B_session_valid(struct udevice *dev);
+
 #endif /* __DWC2_USB_GADGET */
index 1d57b48b173807dfb9914793e7ff283ab5962425..485071d0723356abe07ab48d31f0738333eea4f6 100644 (file)
@@ -70,6 +70,7 @@ enum video_log2_bpp {
  *             the LCD is updated
  * @cmap:      Colour map for 8-bit-per-pixel displays
  * @fg_col_idx:        Foreground color code (bit 3 = bold, bit 0-2 = color)
+ * @bg_col_idx:        Background color code (bit 3 = bold, bit 0-2 = color)
  */
 struct video_priv {
        /* Things set up by the driver: */
@@ -92,6 +93,7 @@ struct video_priv {
        bool flush_dcache;
        ushort *cmap;
        u8 fg_col_idx;
+       u8 bg_col_idx;
 };
 
 /* Placeholder - there are no video operations at present */
index 366d164cd76064cebd29f507d7b037d2ac2a0379..2120216593eec74b3f462e3a83dbb7cbbc8b06ad 100644 (file)
@@ -301,6 +301,19 @@ config LZO
        help
          This enables support for LZO compression algorithm.r
 
+config GZIP
+       bool "Enable gzip decompression support for SPL build"
+       select ZLIB
+       default y
+       help
+         This enables support for GZIP compression algorithm.
+
+config ZLIB
+       bool
+       default y
+       help
+         This enables ZLIB compression lib.
+
 config SPL_LZ4
        bool "Enable LZ4 decompression support in SPL"
        help
@@ -423,4 +436,8 @@ source lib/efi/Kconfig
 source lib/efi_loader/Kconfig
 source lib/optee/Kconfig
 
+config TEST_FDTDEC
+       bool "enable fdtdec test"
+       depends on OF_LIBFDT
+
 endmenu
index 7cdf81f40c1255439ca2164be4d0db6735d0be38..b14746e6b17683c757eaf594015163e996c52398 100644 (file)
@@ -300,9 +300,6 @@ efi_status_t efi_driver_init(void)
        struct driver *drv;
        efi_status_t ret = EFI_SUCCESS;
 
-       /* Save 'gd' pointer */
-       efi_save_gd();
-
        debug("EFI: Initializing EFI driver framework\n");
        for (drv = ll_entry_start(struct driver, driver);
             drv < ll_entry_end(struct driver, driver); ++drv) {
index 23487b8130e2e31630188f97db73b57d5c43243e..50b050159c377712fc0e3af0bfd25dea2ef4587e 100644 (file)
@@ -26,6 +26,16 @@ config EFI_UNICODE_CAPITALIZATION
          set, only the the correct handling of the letters of the codepage
          used by the FAT file system is ensured.
 
+config EFI_PLATFORM_LANG_CODES
+       string "Language codes supported by firmware"
+       depends on EFI_LOADER
+       default "en-US"
+       help
+         This value is used to initialize the PlatformLangCodes variable. Its
+         value is a semicolon (;) separated list of language codes in native
+         RFC 4646 format, e.g. "en-US;de-DE". The first language code is used
+         to initialize the PlatformLang variable.
+
 config EFI_LOADER_BOUNCE_BUFFER
        bool "EFI Applications use bounce buffers for DMA operations"
        depends on EFI_LOADER && ARM64
@@ -38,14 +48,11 @@ config EFI_LOADER_BOUNCE_BUFFER
 config EFI_LOADER_HII
        bool "Expose HII protocols to EFI applications"
        depends on EFI_LOADER
-       default n
+       default y
        help
          The Human Interface Infrastructure is a complicated framework that
          allows UEFI applications to draw fancy menus and hook strings using
          a translation framework.
 
          U-Boot implements enough of its features to be able to run the UEFI
-         Shell, but not more than that. The code is experimental still, so
-         beware that your system might break with HII enabled.
-
-         If unsure, say n.
+         Shell, but not more than that.
index b215bd7723da5a92865de778b34b9c3dafaec7fe..abc295e392e93338122578a8cdda61290605755e 100644 (file)
@@ -1569,26 +1569,6 @@ efi_status_t efi_setup_loaded_image(struct efi_device_path *device_path,
        if (ret != EFI_SUCCESS)
                goto failure;
 
-#if CONFIG_IS_ENABLED(EFI_LOADER_HII)
-       ret = efi_add_protocol(&obj->header,
-                              &efi_guid_hii_string_protocol,
-                              (void *)&efi_hii_string);
-       if (ret != EFI_SUCCESS)
-               goto failure;
-
-       ret = efi_add_protocol(&obj->header,
-                              &efi_guid_hii_database_protocol,
-                              (void *)&efi_hii_database);
-       if (ret != EFI_SUCCESS)
-               goto failure;
-
-       ret = efi_add_protocol(&obj->header,
-                              &efi_guid_hii_config_routing_protocol,
-                              (void *)&efi_hii_config_routing);
-       if (ret != EFI_SUCCESS)
-               goto failure;
-#endif
-
        *info_ptr = info;
        *handle_ptr = obj;
 
@@ -2287,7 +2267,7 @@ out:
  *
  * Return: status code
  */
-static efi_status_t EFIAPI efi_install_multiple_protocol_interfaces
+efi_status_t EFIAPI efi_install_multiple_protocol_interfaces
                                (efi_handle_t *handle, ...)
 {
        EFI_ENTRY("%p", handle);
index 53b40c8c3c2dd62b2de36dc768e3975b76b27bb0..d8c052d6ec50f743642ac375513ca821a499fa30 100644 (file)
@@ -5,8 +5,6 @@
  * (C) Copyright 2017 Rob Clark
  */
 
-#define LOG_CATEGORY LOGL_ERR
-
 #include <common.h>
 #include <blk.h>
 #include <dm.h>
@@ -970,7 +968,7 @@ efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
        if (!is_net) {
                part = blk_get_device_part_str(dev, devnr, &desc, &fs_partition,
                                               1);
-               if (part < 0)
+               if (part < 0 || !desc)
                        return EFI_INVALID_PARAMETER;
 
                if (device)
index dbe29b89603e4898abef1a72b842964f3e56c3f2..46681dc2082b120edd4f4c160eac3cb25f323f54 100644 (file)
@@ -193,6 +193,7 @@ static s64 efi_mem_carve_out(struct efi_mem_list *map,
                        free(map);
                } else {
                        map->desc.physical_start = carve_end;
+                       map->desc.virtual_start = carve_end;
                        map->desc.num_pages = (map_end - carve_end)
                                              >> EFI_PAGE_SHIFT;
                }
@@ -211,6 +212,7 @@ static s64 efi_mem_carve_out(struct efi_mem_list *map,
        newmap = calloc(1, sizeof(*newmap));
        newmap->desc = map->desc;
        newmap->desc.physical_start = carve_start;
+       newmap->desc.virtual_start = carve_start;
        newmap->desc.num_pages = (map_end - carve_start) >> EFI_PAGE_SHIFT;
        /* Insert before current entry (descending address order) */
        list_add_tail(&newmap->link, &map->link);
index b056ba3ee8804074a61a038e451fbdeb4a0e00aa..392f5c49513d9874fdef858c118aa9fcd0d281cc 100644 (file)
@@ -26,16 +26,10 @@ struct efi_root_dp {
  */
 efi_status_t efi_root_node_register(void)
 {
-       efi_handle_t root;
-       efi_status_t ret;
+       efi_handle_t root = NULL;
        struct efi_root_dp *dp;
 
-       /* Create handle */
-       ret = efi_create_handle(&root);
-       if (ret != EFI_SUCCESS)
-               return ret;
-
-       /* Install device path protocol */
+       /* Create device path protocol */
        dp = calloc(1, sizeof(*dp));
        if (!dp)
                return EFI_OUT_OF_RESOURCES;
@@ -51,29 +45,29 @@ efi_status_t efi_root_node_register(void)
        dp->end.sub_type = DEVICE_PATH_SUB_TYPE_END;
        dp->end.length = sizeof(struct efi_device_path);
 
-       /* Install device path protocol */
-       ret = efi_add_protocol(root, &efi_guid_device_path, dp);
-       if (ret != EFI_SUCCESS)
-               goto failure;
-
-       /* Install device path to text protocol */
-       ret = efi_add_protocol(root, &efi_guid_device_path_to_text_protocol,
-                              (void *)&efi_device_path_to_text);
-       if (ret != EFI_SUCCESS)
-               goto failure;
-
-       /* Install device path utilities protocol */
-       ret = efi_add_protocol(root, &efi_guid_device_path_utilities_protocol,
-                              (void *)&efi_device_path_utilities);
-       if (ret != EFI_SUCCESS)
-               goto failure;
-
-       /* Install Unicode collation protocol */
-       ret = efi_add_protocol(root, &efi_guid_unicode_collation_protocol,
-                              (void *)&efi_unicode_collation_protocol);
-       if (ret != EFI_SUCCESS)
-               goto failure;
-
-failure:
-       return ret;
+       /* Create root node and install protocols */
+       return EFI_CALL(efi_install_multiple_protocol_interfaces(&root,
+                      /* Device path protocol */
+                      &efi_guid_device_path, dp,
+                      /* Device path to text protocol */
+                      &efi_guid_device_path_to_text_protocol,
+                      (void *)&efi_device_path_to_text,
+                      /* Device path utilities protocol */
+                      &efi_guid_device_path_utilities_protocol,
+                      (void *)&efi_device_path_utilities,
+                      /* Unicode collation protocol */
+                      &efi_guid_unicode_collation_protocol,
+                      (void *)&efi_unicode_collation_protocol,
+#if CONFIG_IS_ENABLED(EFI_LOADER_HII)
+                      /* HII string protocol */
+                      &efi_guid_hii_string_protocol,
+                      (void *)&efi_hii_string,
+                      /* HII database protocol */
+                      &efi_guid_hii_database_protocol,
+                      (void *)&efi_hii_database,
+                      /* HII configuration routing protocol */
+                      &efi_guid_hii_config_routing_protocol,
+                      (void *)&efi_hii_config_routing,
+#endif
+                      NULL));
 }
index a908843d87ab50d0fd989c160890fc7354905321..b32a7b3f9346637d2719251aefafad683dd36982 100644 (file)
 
 #define OBJ_LIST_NOT_INITIALIZED 1
 
-/* Language code for American English according to RFC 4646 */
-#define EN_US L"en-US"
-
 static efi_status_t efi_obj_list_initialized = OBJ_LIST_NOT_INITIALIZED;
 
-/* Initialize and populate EFI object list */
-efi_status_t efi_init_obj_list(void)
+/**
+ * efi_init_platform_lang() - define supported languages
+ *
+ * Set the PlatformLangCodes and PlatformLang variables.
+ *
+ * Return:     status code
+ */
+static efi_status_t efi_init_platform_lang(void)
 {
-       efi_status_t ret = EFI_SUCCESS;
+       efi_status_t ret;
+       efi_uintn_t data_size = 0;
+       char *lang = CONFIG_EFI_PLATFORM_LANG_CODES;
+       char *pos;
 
        /*
-        * On the ARM architecture gd is mapped to a fixed register (r9 or x18).
-        * As this register may be overwritten by an EFI payload we save it here
-        * and restore it on every callback entered.
+        * Variable PlatformLangCodes defines the language codes that the
+        * machine can support.
         */
-       efi_save_gd();
+       ret = EFI_CALL(efi_set_variable(L"PlatformLangCodes",
+                                       &efi_global_variable_guid,
+                                       EFI_VARIABLE_BOOTSERVICE_ACCESS |
+                                       EFI_VARIABLE_RUNTIME_ACCESS,
+                                       sizeof(CONFIG_EFI_PLATFORM_LANG_CODES),
+                                       CONFIG_EFI_PLATFORM_LANG_CODES));
+       if (ret != EFI_SUCCESS)
+               goto out;
 
        /*
         * Variable PlatformLang defines the language that the machine has been
         * configured for.
         */
-       ret = EFI_CALL(efi_set_variable(L"PlatformLang",
+       ret = EFI_CALL(efi_get_variable(L"PlatformLang",
                                        &efi_global_variable_guid,
-                                       EFI_VARIABLE_BOOTSERVICE_ACCESS |
-                                       EFI_VARIABLE_RUNTIME_ACCESS,
-                                       sizeof(EN_US), EN_US));
-       if (ret != EFI_SUCCESS)
+                                       NULL, &data_size, &pos));
+       if (ret == EFI_BUFFER_TOO_SMALL) {
+               /* The variable is already set. Do not change it. */
+               ret = EFI_SUCCESS;
                goto out;
+       }
 
        /*
-        * Variable PlatformLangCodes defines the language codes that the
-        * machine can support.
+        * The list of supported languages is semicolon separated. Use the first
+        * language to initialize PlatformLang.
         */
-       ret = EFI_CALL(efi_set_variable(L"PlatformLangCodes",
+       pos = strchr(lang, ';');
+       if (pos)
+               *pos = 0;
+
+       ret = EFI_CALL(efi_set_variable(L"PlatformLang",
                                        &efi_global_variable_guid,
+                                       EFI_VARIABLE_NON_VOLATILE |
                                        EFI_VARIABLE_BOOTSERVICE_ACCESS |
                                        EFI_VARIABLE_RUNTIME_ACCESS,
-                                       sizeof(EN_US), EN_US));
+                                       1 + strlen(lang), lang));
+out:
        if (ret != EFI_SUCCESS)
-               goto out;
+               printf("EFI: cannot initialize platform language settings\n");
+       return ret;
+}
+
+/**
+ * efi_init_obj_list() - Initialize and populate EFI object list
+ *
+ * Return:     status code
+ */
+efi_status_t efi_init_obj_list(void)
+{
+       efi_status_t ret = EFI_SUCCESS;
 
        /* Initialize once only */
        if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED)
                return efi_obj_list_initialized;
 
+       /* Define supported languages */
+       ret = efi_init_platform_lang();
+       if (ret != EFI_SUCCESS)
+               goto out;
+
        /* Initialize system table */
        ret = efi_initialize_system_table();
        if (ret != EFI_SUCCESS)
index 24b4438ce4f51b9be75d02df6766c53f09f08ab9..5eeb42a9be3f35a3b9ccd22626104980aed85418 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright (c) 2018 Heinrich Schuchardt <xypron.glpk@gmx.de>
  *
- * This unit test checks the following runtime services:
+ * This unit test checks the following boottime services:
  * AllocatePages, FreePages, GetMemoryMap
  *
  * The memory type used for the device tree is checked.
@@ -65,6 +65,11 @@ static int find_in_memory_map(efi_uintn_t map_size,
        for (i = 0; map_size; ++i, map_size -= desc_size) {
                struct efi_mem_desc *entry = &memory_map[i];
 
+               if (entry->physical_start != entry->virtual_start) {
+                       efi_st_error("Physical and virtual addresses do not match\n");
+                       return EFI_ST_FAILURE;
+               }
+
                if (addr >= entry->physical_start &&
                    addr < entry->physical_start +
                            (entry->num_pages << EFI_PAGE_SHIFT)) {
@@ -171,9 +176,9 @@ static int execute(void)
        /* Check memory reservation for the device tree */
        if (fdt_addr &&
            find_in_memory_map(map_size, memory_map, desc_size, fdt_addr,
-                              EFI_RUNTIME_SERVICES_DATA) != EFI_ST_SUCCESS) {
+                              EFI_BOOT_SERVICES_DATA) != EFI_ST_SUCCESS) {
                efi_st_error
-                       ("Device tree not marked as runtime services data\n");
+                       ("Device tree not marked as boot services data\n");
                return EFI_ST_FAILURE;
        }
        return EFI_ST_SUCCESS;
index 09a7e133a539488bf1f01f96e4821ec362fb7a6a..9c9c30234732f09b8162414e12145373a23b6cc6 100644 (file)
@@ -45,7 +45,7 @@ static const char * const compat_names[COMPAT_COUNT] = {
        COMPAT(SAMSUNG_EXYNOS_TMU, "samsung,exynos-tmu"),
        COMPAT(SAMSUNG_EXYNOS_MIPI_DSI, "samsung,exynos-mipi-dsi"),
        COMPAT(SAMSUNG_EXYNOS_DWMMC, "samsung,exynos-dwmmc"),
-       COMPAT(GENERIC_SPI_FLASH, "spi-flash"),
+       COMPAT(GENERIC_SPI_FLASH, "jedec,spi-nor"),
        COMPAT(SAMSUNG_EXYNOS_SYSMMU, "samsung,sysmmu-v3.3"),
        COMPAT(INTEL_MICROCODE, "intel,microcode"),
        COMPAT(INTEL_QRK_MRC, "intel,quark-mrc"),
@@ -1088,18 +1088,18 @@ int fdtdec_decode_display_timing(const void *blob, int parent, int index,
        return ret;
 }
 
-int fdtdec_setup_mem_size_base(void)
+int fdtdec_setup_mem_size_base_fdt(const void *blob)
 {
        int ret, mem;
        struct fdt_resource res;
 
-       mem = fdt_path_offset(gd->fdt_blob, "/memory");
+       mem = fdt_path_offset(blob, "/memory");
        if (mem < 0) {
                debug("%s: Missing /memory node\n", __func__);
                return -EINVAL;
        }
 
-       ret = fdt_get_resource(gd->fdt_blob, mem, "reg", 0, &res);
+       ret = fdt_get_resource(blob, mem, "reg", 0, &res);
        if (ret != 0) {
                debug("%s: Unable to decode first memory bank\n", __func__);
                return -EINVAL;
@@ -1113,38 +1113,43 @@ int fdtdec_setup_mem_size_base(void)
        return 0;
 }
 
+int fdtdec_setup_mem_size_base(void)
+{
+       return fdtdec_setup_mem_size_base_fdt(gd->fdt_blob);
+}
+
 #if defined(CONFIG_NR_DRAM_BANKS)
 
 static int get_next_memory_node(const void *blob, int mem)
 {
        do {
-               mem = fdt_node_offset_by_prop_value(gd->fdt_blob, mem,
+               mem = fdt_node_offset_by_prop_value(blob, mem,
                                                    "device_type", "memory", 7);
        } while (!fdtdec_get_is_enabled(blob, mem));
 
        return mem;
 }
 
-int fdtdec_setup_memory_banksize(void)
+int fdtdec_setup_memory_banksize_fdt(const void *blob)
 {
        int bank, ret, mem, reg = 0;
        struct fdt_resource res;
 
-       mem = get_next_memory_node(gd->fdt_blob, -1);
+       mem = get_next_memory_node(blob, -1);
        if (mem < 0) {
                debug("%s: Missing /memory node\n", __func__);
                return -EINVAL;
        }
 
        for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
-               ret = fdt_get_resource(gd->fdt_blob, mem, "reg", reg++, &res);
+               ret = fdt_get_resource(blob, mem, "reg", reg++, &res);
                if (ret == -FDT_ERR_NOTFOUND) {
                        reg = 0;
-                       mem = get_next_memory_node(gd->fdt_blob, mem);
+                       mem = get_next_memory_node(blob, mem);
                        if (mem == -FDT_ERR_NOTFOUND)
                                break;
 
-                       ret = fdt_get_resource(gd->fdt_blob, mem, "reg", reg++, &res);
+                       ret = fdt_get_resource(blob, mem, "reg", reg++, &res);
                        if (ret == -FDT_ERR_NOTFOUND)
                                break;
                }
@@ -1164,6 +1169,12 @@ int fdtdec_setup_memory_banksize(void)
 
        return 0;
 }
+
+int fdtdec_setup_memory_banksize(void)
+{
+       return fdtdec_setup_memory_banksize_fdt(gd->fdt_blob);
+
+}
 #endif
 
 #if CONFIG_IS_ENABLED(MULTI_DTB_FIT)
@@ -1171,17 +1182,22 @@ int fdtdec_setup_memory_banksize(void)
        CONFIG_IS_ENABLED(MULTI_DTB_FIT_LZO)
 static int uncompress_blob(const void *src, ulong sz_src, void **dstp)
 {
-       size_t sz_out = CONFIG_SPL_MULTI_DTB_FIT_UNCOMPRESS_SZ;
+       size_t sz_out = CONFIG_VAL(MULTI_DTB_FIT_UNCOMPRESS_SZ);
+       bool gzip = 0, lzo = 0;
        ulong sz_in = sz_src;
        void *dst;
        int rc;
 
        if (CONFIG_IS_ENABLED(GZIP))
-               if (gzip_parse_header(src, sz_in) < 0)
-                       return -1;
+               if (gzip_parse_header(src, sz_in) >= 0)
+                       gzip = 1;
        if (CONFIG_IS_ENABLED(LZO))
-               if (!lzop_is_valid_header(src))
-                       return -EBADMSG;
+               if (!gzip && lzop_is_valid_header(src))
+                       lzo = 1;
+
+       if (!gzip && !lzo)
+               return -EBADMSG;
+
 
        if (CONFIG_IS_ENABLED(MULTI_DTB_FIT_DYN_ALLOC)) {
                dst = malloc(sz_out);
@@ -1197,10 +1213,12 @@ static int uncompress_blob(const void *src, ulong sz_src, void **dstp)
 #  endif
        }
 
-       if (CONFIG_IS_ENABLED(GZIP))
+       if (CONFIG_IS_ENABLED(GZIP) && gzip)
                rc = gunzip(dst, sz_out, (u8 *)src, &sz_in);
-       else if (CONFIG_IS_ENABLED(LZO))
+       else if (CONFIG_IS_ENABLED(LZO) && lzo)
                rc = lzop_decompress(src, sz_in, dst, &sz_out);
+       else
+               hang();
 
        if (rc < 0) {
                /* not a valid compressed blob */
@@ -1243,6 +1261,231 @@ __weak void *board_fdt_blob_setup(void)
 }
 #endif
 
+int fdtdec_set_phandle(void *blob, int node, uint32_t phandle)
+{
+       fdt32_t value = cpu_to_fdt32(phandle);
+
+       return fdt_setprop(blob, node, "phandle", &value, sizeof(value));
+}
+
+static int fdtdec_init_reserved_memory(void *blob)
+{
+       int na, ns, node, err;
+       fdt32_t value;
+
+       /* inherit #address-cells and #size-cells from the root node */
+       na = fdt_address_cells(blob, 0);
+       ns = fdt_size_cells(blob, 0);
+
+       node = fdt_add_subnode(blob, 0, "reserved-memory");
+       if (node < 0)
+               return node;
+
+       err = fdt_setprop(blob, node, "ranges", NULL, 0);
+       if (err < 0)
+               return err;
+
+       value = cpu_to_fdt32(ns);
+
+       err = fdt_setprop(blob, node, "#size-cells", &value, sizeof(value));
+       if (err < 0)
+               return err;
+
+       value = cpu_to_fdt32(na);
+
+       err = fdt_setprop(blob, node, "#address-cells", &value, sizeof(value));
+       if (err < 0)
+               return err;
+
+       return node;
+}
+
+int fdtdec_add_reserved_memory(void *blob, const char *basename,
+                              const struct fdt_memory *carveout,
+                              uint32_t *phandlep)
+{
+       fdt32_t cells[4] = {}, *ptr = cells;
+       uint32_t upper, lower, phandle;
+       int parent, node, na, ns, err;
+       char name[64];
+
+       /* create an empty /reserved-memory node if one doesn't exist */
+       parent = fdt_path_offset(blob, "/reserved-memory");
+       if (parent < 0) {
+               parent = fdtdec_init_reserved_memory(blob);
+               if (parent < 0)
+                       return parent;
+       }
+
+       /* only 1 or 2 #address-cells and #size-cells are supported */
+       na = fdt_address_cells(blob, parent);
+       if (na < 1 || na > 2)
+               return -FDT_ERR_BADNCELLS;
+
+       ns = fdt_size_cells(blob, parent);
+       if (ns < 1 || ns > 2)
+               return -FDT_ERR_BADNCELLS;
+
+       /* find a matching node and return the phandle to that */
+       fdt_for_each_subnode(node, blob, parent) {
+               const char *name = fdt_get_name(blob, node, NULL);
+               phys_addr_t addr, size;
+
+               addr = fdtdec_get_addr_size(blob, node, "reg", &size);
+               if (addr == FDT_ADDR_T_NONE) {
+                       debug("failed to read address/size for %s\n", name);
+                       continue;
+               }
+
+               if (addr == carveout->start && (addr + size) == carveout->end) {
+                       *phandlep = fdt_get_phandle(blob, node);
+                       return 0;
+               }
+       }
+
+       /*
+        * Unpack the start address and generate the name of the new node
+        * base on the basename and the unit-address.
+        */
+       lower = fdt_addr_unpack(carveout->start, &upper);
+
+       if (na > 1 && upper > 0)
+               snprintf(name, sizeof(name), "%s@%x,%x", basename, upper,
+                        lower);
+       else {
+               if (upper > 0) {
+                       debug("address %08x:%08x exceeds addressable space\n",
+                             upper, lower);
+                       return -FDT_ERR_BADVALUE;
+               }
+
+               snprintf(name, sizeof(name), "%s@%x", basename, lower);
+       }
+
+       node = fdt_add_subnode(blob, parent, name);
+       if (node < 0)
+               return node;
+
+       err = fdt_generate_phandle(blob, &phandle);
+       if (err < 0)
+               return err;
+
+       err = fdtdec_set_phandle(blob, node, phandle);
+       if (err < 0)
+               return err;
+
+       /* store one or two address cells */
+       if (na > 1)
+               *ptr++ = cpu_to_fdt32(upper);
+
+       *ptr++ = cpu_to_fdt32(lower);
+
+       /* store one or two size cells */
+       lower = fdt_size_unpack(carveout->end - carveout->start + 1, &upper);
+
+       if (ns > 1)
+               *ptr++ = cpu_to_fdt32(upper);
+
+       *ptr++ = cpu_to_fdt32(lower);
+
+       err = fdt_setprop(blob, node, "reg", cells, (na + ns) * sizeof(*cells));
+       if (err < 0)
+               return err;
+
+       /* return the phandle for the new node for the caller to use */
+       if (phandlep)
+               *phandlep = phandle;
+
+       return 0;
+}
+
+int fdtdec_get_carveout(const void *blob, const char *node, const char *name,
+                       unsigned int index, struct fdt_memory *carveout)
+{
+       const fdt32_t *prop;
+       uint32_t phandle;
+       int offset, len;
+       fdt_size_t size;
+
+       offset = fdt_path_offset(blob, node);
+       if (offset < 0)
+               return offset;
+
+       prop = fdt_getprop(blob, offset, name, &len);
+       if (!prop) {
+               debug("failed to get %s for %s\n", name, node);
+               return -FDT_ERR_NOTFOUND;
+       }
+
+       if ((len % sizeof(phandle)) != 0) {
+               debug("invalid phandle property\n");
+               return -FDT_ERR_BADPHANDLE;
+       }
+
+       if (len < (sizeof(phandle) * (index + 1))) {
+               debug("invalid phandle index\n");
+               return -FDT_ERR_BADPHANDLE;
+       }
+
+       phandle = fdt32_to_cpu(prop[index]);
+
+       offset = fdt_node_offset_by_phandle(blob, phandle);
+       if (offset < 0) {
+               debug("failed to find node for phandle %u\n", phandle);
+               return offset;
+       }
+
+       carveout->start = fdtdec_get_addr_size_auto_noparent(blob, offset,
+                                                            "reg", 0, &size,
+                                                            true);
+       if (carveout->start == FDT_ADDR_T_NONE) {
+               debug("failed to read address/size from \"reg\" property\n");
+               return -FDT_ERR_NOTFOUND;
+       }
+
+       carveout->end = carveout->start + size - 1;
+
+       return 0;
+}
+
+int fdtdec_set_carveout(void *blob, const char *node, const char *prop_name,
+                       unsigned int index, const char *name,
+                       const struct fdt_memory *carveout)
+{
+       uint32_t phandle;
+       int err, offset;
+       fdt32_t value;
+
+       /* XXX implement support for multiple phandles */
+       if (index > 0) {
+               debug("invalid index %u\n", index);
+               return -FDT_ERR_BADOFFSET;
+       }
+
+       err = fdtdec_add_reserved_memory(blob, name, carveout, &phandle);
+       if (err < 0) {
+               debug("failed to add reserved memory: %d\n", err);
+               return err;
+       }
+
+       offset = fdt_path_offset(blob, node);
+       if (offset < 0) {
+               debug("failed to find offset for node %s: %d\n", node, offset);
+               return offset;
+       }
+
+       value = cpu_to_fdt32(phandle);
+
+       err = fdt_setprop(blob, offset, prop_name, &value, sizeof(value));
+       if (err < 0) {
+               debug("failed to set %s property for node %s: %d\n", prop_name,
+                     node, err);
+               return err;
+       }
+
+       return 0;
+}
+
 int fdtdec_setup(void)
 {
 #if CONFIG_IS_ENABLED(OF_CONTROL)
index a82e27de942f2fb3ac2bfda8943b6bf63f7f1be1..f6defe16c5a694a9af4e5e476aa550edf4ab6225 100644 (file)
 /* The size of our test fdt blob */
 #define FDT_SIZE       (16 * 1024)
 
-/**
- * Check if an operation failed, and if so, print an error
- *
- * @param oper_name    Name of operation
- * @param err          Error code to check
- *
- * @return 0 if ok, -1 if there was an error
- */
-static int fdt_checkerr(const char *oper_name, int err)
-{
-       if (err) {
-               printf("%s: %s: %s\n", __func__, oper_name, fdt_strerror(err));
-               return -1;
-       }
+#define CHECK(op) ({                                                   \
+               int err = op;                                           \
+               if (err < 0) {                                          \
+                       printf("%s: %s: %s\n", __func__, #op,           \
+                              fdt_strerror(err));                      \
+                       return err;                                     \
+               }                                                       \
+                                                                       \
+               err;                                                    \
+       })
 
-       return 0;
-}
+#define CHECKVAL(op, expected) ({                                      \
+               int err = op;                                           \
+               if (err != expected) {                                  \
+                       printf("%s: %s: expected %d, but returned %d\n",\
+                              __func__, #op, expected, err);           \
+                       return err;                                     \
+               }                                                       \
+                                                                       \
+               err;                                                    \
+       })
 
-/**
- * Check the result of an operation and if incorrect, print an error
- *
- * @param oper_name    Name of operation
- * @param expected     Expected value
- * @param value                Actual value
- *
- * @return 0 if ok, -1 if there was an error
- */
-static int checkval(const char *oper_name, int expected, int value)
-{
-       if (expected != value) {
-               printf("%s: %s: expected %d, but returned %d\n", __func__,
-                      oper_name, expected, value);
-               return -1;
-       }
-
-       return 0;
-}
-
-#define CHECK(op)      if (fdt_checkerr(#op, op)) return -1
-#define CHECKVAL(op, expected) \
-       if (checkval(#op, expected, op)) \
-               return -1
 #define CHECKOK(op)    CHECKVAL(op, 0)
 
 /* maximum number of nodes / aliases to generate */
@@ -79,7 +59,9 @@ static int make_fdt(void *fdt, int size, const char *aliases,
 {
        char name[20], value[20];
        const char *s;
+#if defined(DEBUG) && defined(CONFIG_SANDBOX)
        int fd;
+#endif
 
        CHECK(fdt_create(fdt, size));
        CHECK(fdt_finish_reservemap(fdt));
@@ -136,7 +118,7 @@ static int run_test(const char *aliases, const char *nodes, const char *expect)
        CHECKVAL(make_fdt(blob, FDT_SIZE, aliases, nodes), 0);
        CHECKVAL(fdtdec_find_aliases_for_id(blob, "i2c",
                        COMPAT_UNKNOWN,
-                       list, ARRAY_SIZE(list)), strlen(expect));
+                       list, ARRAY_SIZE(list)), (int)strlen(expect));
 
        /* Check we got the right ones */
        for (i = 0, s = expect; *s; s++, i++) {
@@ -159,6 +141,156 @@ static int run_test(const char *aliases, const char *nodes, const char *expect)
        return 0;
 }
 
+static int make_fdt_carveout_device(void *fdt, uint32_t na, uint32_t ns)
+{
+       const char *basename = "/display";
+       struct fdt_memory carveout = {
+#ifdef CONFIG_PHYS_64BIT
+               .start = 0x180000000,
+               .end = 0x18fffffff,
+#else
+               .start = 0x80000000,
+               .end = 0x8fffffff,
+#endif
+       };
+       fdt32_t cells[4], *ptr = cells;
+       uint32_t upper, lower;
+       char name[32];
+       int offset;
+
+       /* store one or two address cells */
+       lower = fdt_addr_unpack(carveout.start, &upper);
+
+       if (na > 1 && upper > 0)
+               snprintf(name, sizeof(name), "%s@%x,%x", basename, upper,
+                        lower);
+       else
+               snprintf(name, sizeof(name), "%s@%x", basename, lower);
+
+       if (na > 1)
+               *ptr++ = cpu_to_fdt32(upper);
+
+       *ptr++ = cpu_to_fdt32(lower);
+
+       /* store one or two size cells */
+       lower = fdt_size_unpack(carveout.end - carveout.start + 1, &upper);
+
+       if (ns > 1)
+               *ptr++ = cpu_to_fdt32(upper);
+
+       *ptr++ = cpu_to_fdt32(lower);
+
+       offset = CHECK(fdt_add_subnode(fdt, 0, name + 1));
+       CHECK(fdt_setprop(fdt, offset, "reg", cells, (na + ns) * sizeof(*cells)));
+
+       return fdtdec_set_carveout(fdt, name, "memory-region", 0,
+                                  "framebuffer", &carveout);
+}
+
+static int check_fdt_carveout(void *fdt, uint32_t address_cells,
+                             uint32_t size_cells)
+{
+#ifdef CONFIG_PHYS_64BIT
+       const char *name = "/display@1,80000000";
+       const struct fdt_memory expected = {
+               .start = 0x180000000,
+               .end = 0x18fffffff,
+       };
+#else
+       const char *name = "/display@80000000";
+       const struct fdt_memory expected = {
+               .start = 0x80000000,
+               .end = 0x8fffffff,
+       };
+#endif
+       struct fdt_memory carveout;
+
+       printf("carveout: %pap-%pap na=%u ns=%u: ", &expected.start,
+              &expected.end, address_cells, size_cells);
+
+       CHECK(fdtdec_get_carveout(fdt, name, "memory-region", 0, &carveout));
+
+       if ((carveout.start != expected.start) ||
+           (carveout.end != expected.end)) {
+               printf("carveout: %pap-%pap, expected %pap-%pap\n",
+                      &carveout.start, &carveout.end,
+                      &expected.start, &expected.end);
+               return 1;
+       }
+
+       printf("pass\n");
+       return 0;
+}
+
+static int make_fdt_carveout(void *fdt, int size, uint32_t address_cells,
+                            uint32_t size_cells)
+{
+       fdt32_t na = cpu_to_fdt32(address_cells);
+       fdt32_t ns = cpu_to_fdt32(size_cells);
+#if defined(DEBUG) && defined(CONFIG_SANDBOX)
+       char filename[512];
+       int fd;
+#endif
+       int err;
+
+       CHECK(fdt_create(fdt, size));
+       CHECK(fdt_finish_reservemap(fdt));
+       CHECK(fdt_begin_node(fdt, ""));
+       CHECK(fdt_property(fdt, "#address-cells", &na, sizeof(na)));
+       CHECK(fdt_property(fdt, "#size-cells", &ns, sizeof(ns)));
+       CHECK(fdt_end_node(fdt));
+       CHECK(fdt_finish(fdt));
+       CHECK(fdt_pack(fdt));
+
+       CHECK(fdt_open_into(fdt, fdt, FDT_SIZE));
+
+       err = make_fdt_carveout_device(fdt, address_cells, size_cells);
+
+#if defined(DEBUG) && defined(CONFIG_SANDBOX)
+       snprintf(filename, sizeof(filename), "/tmp/fdtdec-carveout-%u-%u.dtb",
+                address_cells, size_cells);
+
+       fd = os_open(filename, OS_O_CREAT | OS_O_WRONLY);
+       if (fd < 0) {
+               printf("could not open .dtb file to write\n");
+               goto out;
+       }
+
+       os_write(fd, fdt, size);
+       os_close(fd);
+
+out:
+#endif
+       return err;
+}
+
+static int check_carveout(void)
+{
+       void *fdt;
+
+       fdt = malloc(FDT_SIZE);
+       if (!fdt) {
+               printf("%s: out of memory\n", __func__);
+               return 1;
+       }
+
+#ifndef CONFIG_PHYS_64BIT
+       CHECKVAL(make_fdt_carveout(fdt, FDT_SIZE, 1, 1), 0);
+       CHECKOK(check_fdt_carveout(fdt, 1, 1));
+       CHECKVAL(make_fdt_carveout(fdt, FDT_SIZE, 1, 2), 0);
+       CHECKOK(check_fdt_carveout(fdt, 1, 2));
+#else
+       CHECKVAL(make_fdt_carveout(fdt, FDT_SIZE, 1, 1), -FDT_ERR_BADVALUE);
+       CHECKVAL(make_fdt_carveout(fdt, FDT_SIZE, 1, 2), -FDT_ERR_BADVALUE);
+#endif
+       CHECKVAL(make_fdt_carveout(fdt, FDT_SIZE, 2, 1), 0);
+       CHECKOK(check_fdt_carveout(fdt, 2, 1));
+       CHECKVAL(make_fdt_carveout(fdt, FDT_SIZE, 2, 2), 0);
+       CHECKOK(check_fdt_carveout(fdt, 2, 2));
+
+       return 0;
+}
+
 static int do_test_fdtdec(cmd_tbl_t *cmdtp, int flag, int argc,
                          char * const argv[])
 {
@@ -200,6 +332,8 @@ static int do_test_fdtdec(cmd_tbl_t *cmdtp, int flag, int argc,
        CHECKOK(run_test("2a 1a 0a", "a", "  a"));
        CHECKOK(run_test("0a 1a 2a", "a", "a"));
 
+       CHECKOK(check_carveout());
+
        printf("Test passed\n");
        return 0;
 }
index b6ca4e0b0c308fb9f5ebb9dfe5639aaa90769f8c..693de9aa5ad8032375b22749a25bc236dc15d950 100644 (file)
@@ -73,6 +73,37 @@ uint32_t fdt_get_max_phandle(const void *fdt)
        return 0;
 }
 
+int fdt_generate_phandle(const void *fdt, uint32_t *phandle)
+{
+       uint32_t max = 0;
+       int offset = -1;
+
+       while (true) {
+               uint32_t value;
+
+               offset = fdt_next_node(fdt, offset, NULL);
+               if (offset < 0) {
+                       if (offset == -FDT_ERR_NOTFOUND)
+                               break;
+
+                       return offset;
+               }
+
+               value = fdt_get_phandle(fdt, offset);
+
+               if (value > max)
+                       max = value;
+       }
+
+       if (max == FDT_MAX_PHANDLE)
+               return -FDT_ERR_NOPHANDLES;
+
+       if (phandle)
+               *phandle = max + 1;
+
+       return 0;
+}
+
 int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)
 {
        FDT_CHECK_HEADER(fdt);
index 487d39ef0247a9b7f086561e0170719048b72a5c..1c68e67452d985a4433759346ce22f5b9645258b 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <common.h>
 #include <compiler.h>
+#include <image.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
 
@@ -23,8 +24,6 @@ typedef uint64_t U64;
 /* Unaltered (except removing unrelated code) from github.com/Cyan4973/lz4. */
 #include "lz4.c"       /* #include for inlining, do not link! */
 
-#define LZ4F_MAGIC 0x184D2204
-
 struct lz4_frame_header {
        u32 magic;
        union {
index 1b6c154d8d722215767a7cef1c850850dda6088a..2403825dc98d9c0430eb5b76e8d0bbc83ae09440 100644 (file)
@@ -457,7 +457,6 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
                return device_path_string(buf, end, ptr, field_width,
                                          precision, flags);
 #endif
-#ifdef CONFIG_CMD_NET
        case 'a':
                flags |= SPECIAL | ZEROPAD;
 
@@ -469,6 +468,7 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
                        break;
                }
                break;
+#ifdef CONFIG_CMD_NET
        case 'm':
                flags |= SPECIAL;
                /* Fallthrough */
index 70de9bb13a665c68de0c66193d04b0548cf0cfa2..de67677f61aef1223bdfd324f1d31ea6510c7de6 100644 (file)
@@ -525,4 +525,5 @@ quiet_cmd_fdtgrep = FDTGREP $@
       cmd_fdtgrep = $(objtree)/tools/fdtgrep $(fdtgrep_props) -RT $< \
                -n /chosen -n /config -O dtb | \
        $(objtree)/tools/fdtgrep -r -O dtb - -o $@ \
+               -P u-boot,dm-pre-reloc -P u-boot,dm-spl -P u-boot,dm-tpl \
                $(addprefix -P ,$(subst $\",,$(CONFIG_OF_SPL_REMOVE_PROPS)))
index 8c7c1592a562435a758b19ed84d1e6274994c260..421362d9532fa2fa1f369dce9a4cf0ef34dcbc2d 100644 (file)
@@ -1555,8 +1555,6 @@ CONFIG_QE
 CONFIG_QEMU_MIPS
 CONFIG_QIXIS_I2C_ACCESS
 CONFIG_QSPI
-CONFIG_QSPI_QUAD_SUPPORT
-CONFIG_QSPI_SEL_GPIO
 CONFIG_QUOTA
 CONFIG_R7780MP
 CONFIG_R8A66597_BASE_ADDR
@@ -1939,7 +1937,6 @@ CONFIG_STV0991
 CONFIG_STV0991_HZ
 CONFIG_STV0991_HZ_CLOCK
 CONFIG_ST_SMI
-CONFIG_SUNXI_AHCI
 CONFIG_SUNXI_GPIO
 CONFIG_SUNXI_MAX_FB_SIZE
 CONFIG_SUPERH_ON_CHIP_R8A66597
@@ -4399,9 +4396,7 @@ CONFIG_THOR_RESET_OFF
 CONFIG_THUNDERX
 CONFIG_TIMESTAMP
 CONFIG_TIZEN
-CONFIG_TI_KEYSTONE_SERDES
 CONFIG_TI_KSNAV
-CONFIG_TI_SPI_MMAP
 CONFIG_TMU_TIMER
 CONFIG_TPL_PAD_TO
 CONFIG_TPM_TIS_BASE_ADDRESS
@@ -4515,7 +4510,6 @@ CONFIG_USB_EHCI_MXS
 CONFIG_USB_EHCI_SPEAR
 CONFIG_USB_EHCI_TXFIFO_THRESH
 CONFIG_USB_EHCI_VCT
-CONFIG_USB_EHCI_VF
 CONFIG_USB_ETH_QMULT
 CONFIG_USB_ETH_SUBSET
 CONFIG_USB_EXT2_BOOT
@@ -4543,7 +4537,6 @@ CONFIG_USB_GADGET_SUPERH
 CONFIG_USB_INVENTRA_DMA
 CONFIG_USB_ISP1301_I2C_ADDR
 CONFIG_USB_MAX_CONTROLLER_COUNT
-CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
 CONFIG_USB_MUSB_TIMEOUT
 CONFIG_USB_MUSB_TUSB6010
 CONFIG_USB_OHCI_EP93XX
index dfb3236da3882654f5e7c393019f93da36d40bff..dc499884e4d1a7f1858225024cc97799af4f57ce 100644 (file)
@@ -115,6 +115,37 @@ uint32_t fdt_get_max_phandle(const void *fdt)
        return 0;
 }
 
+int fdt_generate_phandle(const void *fdt, uint32_t *phandle)
+{
+       uint32_t max = 0;
+       int offset = -1;
+
+       while (true) {
+               uint32_t value;
+
+               offset = fdt_next_node(fdt, offset, NULL);
+               if (offset < 0) {
+                       if (offset == -FDT_ERR_NOTFOUND)
+                               break;
+
+                       return offset;
+               }
+
+               value = fdt_get_phandle(fdt, offset);
+
+               if (value > max)
+                       max = value;
+       }
+
+       if (max == FDT_MAX_PHANDLE)
+               return -FDT_ERR_NOPHANDLES;
+
+       if (phandle)
+               *phandle = max + 1;
+
+       return 0;
+}
+
 int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)
 {
        FDT_CHECK_HEADER(fdt);
index fd73688f9e9f3e03e7298eb74db50439d5b2ab3d..cf86ddba88113f22f989c3041b8025193b69d71d 100644 (file)
 
 #define FDT_ERR_MAX            17
 
+/* constants */
+#define FDT_MAX_PHANDLE 0xfffffffe
+       /* Valid values for phandles range from 1 to 2^32-2. */
+
 /**********************************************************************/
 /* Low-level functions (you probably don't need these)                */
 /**********************************************************************/
@@ -313,6 +317,21 @@ const char *fdt_string(const void *fdt, int stroffset);
  */
 uint32_t fdt_get_max_phandle(const void *fdt);
 
+/**
+ * fdt_generate_phandle - return a new, unused phandle for a device tree blob
+ * @fdt: pointer to the device tree blob
+ * @phandle: return location for the new phandle
+ *
+ * Walks the device tree blob and looks for the highest phandle value. On
+ * success, the new, unused phandle value (one higher than the previously
+ * highest phandle value in the device tree blob) will be returned in the
+ * @phandle parameter.
+ *
+ * Returns:
+ *   0 on success or a negative error-code on failure
+ */
+int fdt_generate_phandle(const void *fdt, uint32_t *phandle);
+
 /**
  * fdt_num_mem_rsv - retrieve the number of memory reserve map entries
  * @fdt: pointer to the device tree blob
index bd2474628775ff6d7439d37c09344ab4e9edc56e..3ff9e28630752c1f55052e8c47c300d1dfb13e67 100644 (file)
@@ -52,6 +52,7 @@
  *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <stdbool.h>
 #include <stddef.h>
 #include <stdint.h>
 #include <stdlib.h>
index a294dda02e7dd6a5ce087d601ac67a7c919931db..0ff9da7ec630bbe70f633d6a9dddc3977c648433 100644 (file)
@@ -67,6 +67,13 @@ static int dm_test_syscon_by_phandle(struct unit_test_state *uts)
        ut_assert(!IS_ERR(map));
        ut_asserteq(4, map->range_count);
 
+       ut_assertok_ptr(syscon_regmap_lookup_by_phandle(dev,
+                                                       "third-syscon"));
+       map = syscon_regmap_lookup_by_phandle(dev, "third-syscon");
+       ut_assert(map);
+       ut_assert(!IS_ERR(map));
+       ut_asserteq(4, map->range_count);
+
        ut_assert(IS_ERR(syscon_regmap_lookup_by_phandle(dev, "not-present")));
 
        return 0;
index ff164132e935f986e97a844406dcc525621361dc..6cb82337b36b08c32eae9142f5d0311fdddd1e13 100644 (file)
@@ -1,6 +1,7 @@
 config UT_ENV
        bool "Enable env unit tests"
        depends on UNIT_TEST
+       default y
        help
          This enables the 'ut env' command which runs a series of unit
          tests on the env code.
index 567b57686a5ce0f5423eff18b56c5f1c1e9b4e56..5dccf4388663f3f4557865ae3517e24afb396430 100644 (file)
@@ -6,7 +6,8 @@
 
 #include <common.h>
 #include <hexdump.h>
-#include <dm/test.h>
+#include <test/lib.h>
+#include <test/test.h>
 #include <test/ut.h>
 
 static int lib_test_hex_to_bin(struct unit_test_state *uts)
@@ -32,7 +33,7 @@ static int lib_test_hex_to_bin(struct unit_test_state *uts)
        return 0;
 }
 
-DM_TEST(lib_test_hex_to_bin, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+LIB_TEST(lib_test_hex_to_bin, 0);
 
 static int lib_test_hex2bin(struct unit_test_state *uts)
 {
@@ -62,7 +63,7 @@ static int lib_test_hex2bin(struct unit_test_state *uts)
        return 0;
 }
 
-DM_TEST(lib_test_hex2bin, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+LIB_TEST(lib_test_hex2bin, 0);
 
 static int lib_test_bin2hex(struct unit_test_state *uts)
 {
@@ -92,4 +93,4 @@ static int lib_test_bin2hex(struct unit_test_state *uts)
        return 0;
 }
 
-DM_TEST(lib_test_bin2hex, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+LIB_TEST(lib_test_bin2hex, 0);
index 798f6eed3dc941b7451f0bdcdcf2414d5d0c8d7f..e3bb7b41c749f7522b9d91e37c23fd78a561d16e 100644 (file)
@@ -353,6 +353,19 @@ def test_fpga_loadmk_legacy_gz(u_boot_console):
     output = u_boot_console.run_command('fpga loadmk %x %x && echo %s' % (dev, addr, expected_text))
     assert expected_text in output
 
+@pytest.mark.buildconfigspec('cmd_fpga')
+@pytest.mark.buildconfigspec('cmd_fpga_loadmk')
+@pytest.mark.buildconfigspec('fit')
+@pytest.mark.buildconfigspec('cmd_echo')
+def test_fpga_loadmk_fit_external(u_boot_console):
+    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'mkimage_fit_external')
+
+    u_boot_console.run_command('imi %x' % (addr))
+
+    expected_text = 'FPGA loaded successfully'
+    output = u_boot_console.run_command('fpga loadmk %x %x:fpga && echo %s' % (dev, addr, expected_text))
+    assert expected_text in output
+
 @pytest.mark.buildconfigspec('cmd_fpga')
 @pytest.mark.buildconfigspec('cmd_fpga_loadmk')
 @pytest.mark.buildconfigspec('fit')
index a88a3830c0c8d41c93765474622205f8b43c22d8..dffaf9043a040815efedac502338308e3228eb9d 100644 (file)
@@ -1273,6 +1273,13 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
        e = image_find_option(IMAGE_CFG_DEBUG);
        if (e)
                main_hdr->flags = e->debug ? 0x1 : 0;
+       e = image_find_option(IMAGE_CFG_BINARY);
+       if (e) {
+               char *s = strrchr(e->binary.file, '/');
+
+               if (strcmp(s, "/binary.0") == 0)
+                       main_hdr->destaddr = cpu_to_le32(params->addr);
+       }
 
 #if defined(CONFIG_KWB_SECURE)
        if (image_get_csk_index() >= 0) {
index 2899adff81079e4a92edfe454e88c92d159d2e7a..d1e1a6743d15f9f03c59138b11941afda37964d2 100644 (file)
@@ -403,14 +403,21 @@ int main(int argc, char **argv)
                        exit (EXIT_FAILURE);
                }
 
-               /*
-                * scan through mkimage registry for all supported image types
-                * and verify the input image file header for match
-                * Print the image information for matched image type
-                * Returns the error code if not matched
-                */
-               retval = imagetool_verify_print_header_by_type(ptr, &sbuf,
-                               tparams, &params);
+               if (params.fflag) {
+                       /*
+                        * Verifies the header format based on the expected header for image
+                        * type in tparams
+                        */
+                       retval = imagetool_verify_print_header_by_type(ptr, &sbuf,
+                                       tparams, &params);
+               } else {
+                       /**
+                        * When listing the image, we are not given the image type. Simply check all
+                        * image types to find one that matches our header
+                        */
+                       retval = imagetool_verify_print_header(ptr, &sbuf,
+                                       tparams, &params);
+               }
 
                (void) munmap((void *)ptr, sbuf.st_size);
                (void) close (ifd);