Merge tag 'u-boot-imx-20190415' of git://git.denx.de/u-boot-imx
authorTom Rini <trini@konsulko.com>
Mon, 15 Apr 2019 11:31:14 +0000 (07:31 -0400)
committerTom Rini <trini@konsulko.com>
Mon, 15 Apr 2019 11:31:14 +0000 (07:31 -0400)
Move to DM
-----------

- DM support in sata
- Toradex Board to DM
- wandboard to DM
- tbs2910 to DM
- GE boards to DM
- VHybrid boards to DM
- DM_VIDEO for i.MX

262 files changed:
Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt [new file with mode: 0644]
MAINTAINERS
arch/arc/dts/axs10x_mb.dtsi
arch/arc/dts/hsdk.dts
arch/arm/dts/am335x-brppt1-spi.dts
arch/arm/dts/am437x-idk-evm.dts
arch/arm/dts/am437x-sk-evm.dts
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-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-theadorable.dts
arch/arm/dts/at91-sama5d2_xplained.dts
arch/arm/dts/at91-sama5d4_xplained.dts
arch/arm/dts/at91-sama5d4ek.dts
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/da850-evm-u-boot.dtsi
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/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/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/omap5-u-boot.dtsi
arch/arm/dts/r8a77970-eagle-u-boot.dts
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/sama5d27_som1.dtsi
arch/arm/dts/sama5d3xmb.dtsi
arch/arm/dts/sama5d3xmb_cmp.dtsi
arch/arm/dts/socfpga_arria5_socdk-u-boot.dtsi
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_sr1500.dts
arch/arm/dts/socfpga_cyclone5_vining_fpga-u-boot.dtsi
arch/arm/dts/stm32f746-disco.dts
arch/arm/dts/stm32f769-disco.dts
arch/arm/dts/stm32mp157c-ev1-u-boot.dtsi
arch/arm/dts/stv0991.dts
arch/arm/dts/zynq-zed.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/gpio.h
arch/arm/lib/interrupts_64.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/mscc/jr2/jr2.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/sunxi/MAINTAINERS
cmd/bootefi.c
cmd/sf.c
common/board_r.c
common/fdt_support.c
common/spl/spl_spi.c
common/usb_kbd.c
configs/ap152_defconfig [new file with mode: 0644]
configs/bcm963158_ram_defconfig
configs/bcm968380gerg_ram_defconfig
configs/bcm968580xref_ram_defconfig
configs/da850_am18xxevm_defconfig
configs/da850evm_defconfig
configs/linkit-smart-7688-ram_defconfig
configs/linkit-smart-7688_defconfig
configs/mscc_jr2_defconfig
configs/mscc_luton_defconfig
configs/mscc_ocelot_defconfig
configs/mscc_serval_defconfig
configs/mscc_servalt_defconfig
configs/sandbox64_defconfig
configs/sandbox_defconfig
doc/README.chromium
doc/README.chromium-chainload [new file with mode: 0644]
doc/README.uefi
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/git-mailrc
drivers/clk/altera/clk-arria10.c
drivers/clk/at91/pmc.c
drivers/core/ofnode.c
drivers/core/syscon-uclass.c
drivers/core/util.c
drivers/dma/bcm6348-iudma.c
drivers/gpio/Kconfig
drivers/gpio/bcm6345_gpio.c
drivers/mtd/mtdcore.c
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/ag7xxx.c
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/phy/Kconfig
drivers/phy/Makefile
drivers/phy/mt76x8-usb-phy.c [new file with mode: 0644]
drivers/pinctrl/ath79/Makefile
drivers/pinctrl/pinctrl-uclass.c
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/sysreset/sysreset_syscon.c
drivers/video/Kconfig
drivers/video/console_normal.c
drivers/video/console_rotate.c
drivers/video/pwm_backlight.c
drivers/video/vidconsole-uclass.c
drivers/video/video-uclass.c
dts/Kconfig
include/configs/ap152.h [new file with mode: 0644]
include/configs/sunxi-common.h
include/configs/vcoreiii.h
include/dm/pinctrl.h
include/dm/util.h
include/dt-bindings/mscc/jr2_data.h [new file with mode: 0644]
include/efi.h
include/efi_loader.h
include/fdtdec.h
include/linux/mtd/mtd.h
include/spi.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/vsprintf.c
scripts/Makefile.lib
scripts/dtc/libfdt/fdt_ro.c
scripts/dtc/libfdt/libfdt.h
scripts/dtc/libfdt/libfdt_env.h
test/dm/syscon.c
tools/mkimage.c

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 083bf47c8b963396cc5371d9ac77a258c8969637..c77abba1e5bebaf8cb06904c9b2006b03ac70f48 100644 (file)
@@ -310,7 +310,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
@@ -691,14 +691,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/
index dfc03810ca0d75e46f9ca0849a25a61183cc3503..b5aacd5170e18c31f2b80c37350e6453e43bf79e 100644 (file)
@@ -71,7 +71,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..5e9ba054a4cc4e24419aa03aea60c7ec2e1d612b 100644 (file)
@@ -96,7 +96,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 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>;
        };
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;
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;
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>;
 
index bcb4bfdd5c198cdc809a808ce2317cfecb0cb9c7..5b18d62c3c5f1d22040421aaf5133abb7a3907ff 100644 (file)
                u-boot,dm-pre-reloc;
                #address-cells = <1>;
                #size-cells = <1>;
-               compatible = "n25q128a13", "jedec,spi-nor", "spi-flash";
+               compatible = "n25q128a13", "jedec,spi-nor";
                reg = <0>; /* Chip select 0 */
                spi-max-frequency = <27777777>;
        };
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 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..4f41f6273872c2f228c4f2c6af42f62e64fe0d1a 100644 (file)
                        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";
+               };
        };
 };
index 23b80c67a64a6db77569c86851220693a0c736bc..5d5e64db0812ff0c0caf190976cd62c778fefc26 100644 (file)
                        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";
+               };
        };
 };
index dc5afb5a24afa4641891f421266ff841c7cf09ea..b5c825b052bc3181de2634d8729acc55f15a716d 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";
+};
index 0c59f94710c97925d9e05b6390c42be3f80d3a5f..15febb030f11f9e1c384399905f95fab454335b5 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";
+};
index ab9368b9d3a6a0b0c125d243d62b9dd4f1b26a88..1683f3472e4dfc51bd0a21240b46fe85bf791d74 100644 (file)
@@ -13,7 +13,7 @@
 };
 
 &flash {
-       compatible = "m25p64", "spi-flash";
+       compatible = "m25p64", "jedec,spi-nor";
 };
 
 &mmc0 {
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 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 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 4820c7e50da780bf0fe1a7488bd05fdee2a4ca7f..7c5deef8083f399a2ab80cb1ca35270af8052bd9 100644 (file)
@@ -74,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>;
@@ -96,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 b67332fed5b2286a164882995b12eb39f84fc5ec..ecca2dfac1ad4d4d85f6afa10bc5d9b82c0f4e4c 100644 (file)
@@ -39,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>;
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;
        };
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 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 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 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>;
                                };
index c44d1ee2fa188b7262e70499865a7b5b4e2e63e7..e75f2902c54be3f4bfefba01f1d883ee30f526b3 100644 (file)
@@ -30,7 +30,7 @@
 };
 
 &flash {
-       compatible = "n25q00", "spi-flash";
+       compatible = "n25q00", "jedec,spi-nor";
        u-boot,dm-pre-reloc;
 };
 
index b7054bfd5af514bc4ba0fc21b48757aa88cb7dab..93e4d45ad2b7edb0f67abc67ee92af56e81f9a37 100644 (file)
@@ -91,7 +91,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..2fafd7e399d3eb86854b645144ff005fd4a3dce0 100644 (file)
@@ -34,7 +34,7 @@
 };
 
 &flash0 {
-       compatible = "n25q00", "spi-flash";
+       compatible = "n25q00", "jedec,spi-nor";
        u-boot,dm-pre-reloc;
 
        partition@qspi-boot {
index 648f1bd01d74fc7b177641529e1dcc08b23913d7..7ef30531f4a62687018e1de13d50694d41b8cd2b 100644 (file)
@@ -30,7 +30,7 @@
 };
 
 &flash {
-       compatible = "n25q00", "spi-flash";
+       compatible = "n25q00", "jedec,spi-nor";
        u-boot,dm-pre-reloc;
 };
 
index 31bd1dba0ffcc39a5f695a6ccdb82dbb2b8fa9bb..1003115ceadb8bf3d0c7510ae1b4fce81238e1f8 100644 (file)
@@ -30,7 +30,7 @@
 };
 
 &flash {
-       compatible = "n25q256a", "spi-flash";
+       compatible = "n25q256a", "jedec,spi-nor";
        u-boot,dm-pre-reloc;
 };
 
index 6a6c29be79be91a2235a702c741c45edb454b692..1a18c4f3baf6f913193dd5668189e78e2dc08875 100644 (file)
@@ -99,7 +99,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..e05ca8279a9eef942e5542827cce5f723e9bea59 100644 (file)
        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;
        };
 };
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>;
index 6a18d032ae5400c6a37c68232368a53e556254f6..8b92b1fa2eeea286f1ce7728906517e57b9bafde 100644 (file)
 };
 
 &flash0 {
-       compatible = "spi-flash";
+       compatible = "jedec,spi-nor";
        u-boot,dm-spl;
 };
 
 &flash1 {
-       compatible = "spi-flash";
+       compatible = "jedec,spi-nor";
 };
 
 &qspi {
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;
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 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 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 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 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..c060802e8a450bf0085ad75610b67a02c0b2e8c1 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";
+               };
        };
 };
index 513045ee0519d81c28dda66da06c99a478d8c65a..98471e3894de4fa2544dfbd525fd9b17c0ac279f 100644 (file)
                label = "bcm968380gerg:green:usb";
        };
 };
+
+&gpio_lo {
+       status = "okay";
+};
+
+&gpio_mid0 {
+       status = "okay";
+};
+
+&gpio_mid1 {
+       status = "okay";
+};
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 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 */
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 7f96d2bb1c477e621802d3569046f203f9fb3384..338f374e56ee543e8e43e1608d111a8cec24f803 100644 (file)
@@ -353,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 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 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 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 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 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 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;
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 fc55e98550a2f1dc6aa199c04a07882045e5ca4e..5659249fdf3d692fbc154a6a4d0669e3fb0bc071 100644 (file)
@@ -20,6 +20,7 @@ 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_CACHE=y
 CONFIG_DOS_PARTITION=y
 CONFIG_ISO_PARTITION=y
@@ -28,6 +29,8 @@ 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_MMC is not set
 CONFIG_SPECIFY_CONSOLE_INDEX=y
 # CONFIG_SPL_SERIAL_PRESENT is not set
index 61661bd756c7ef8de95e2dcef83f8ff0be71d6c4..fa9dc85d638d42da5fa5c3b89c6b7b11671a9d7b 100644 (file)
@@ -24,6 +24,7 @@ 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_MISC is not set
 CONFIG_DEFAULT_DEVICE_TREE="brcm,bcm968380gerg"
@@ -31,6 +32,7 @@ CONFIG_DEFAULT_DEVICE_TREE="brcm,bcm968380gerg"
 # 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
index e8cb3a0d2a9bcc4d304bfbf0e58929445bc71afd..456ece72d5cbbe970eaa71da8c9a9c3721aaa1ad 100644 (file)
@@ -15,6 +15,7 @@ CONFIG_SUPPORT_RAW_INITRD=y
 CONFIG_DISPLAY_BOARDINFO_LATE=y
 CONFIG_HUSH_PARSER=y
 CONFIG_CMD_BOOTEFI_SELFTEST=y
+CONFIG_CMD_GPIO=y
 CONFIG_DOS_PARTITION=y
 CONFIG_ISO_PARTITION=y
 CONFIG_EFI_PARTITION=y
@@ -22,6 +23,8 @@ 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_MMC is not set
 CONFIG_SPECIFY_CONSOLE_INDEX=y
 # CONFIG_SPL_SERIAL_PRESENT is not set
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 4083dcbae69bc58b0acf03d264bbaeac291a46ab..4b09ba10a6758292ff7eaa278c8c74fbbc93cd51 100644 (file)
@@ -43,10 +43,6 @@ CONFIG_OF_CONTROL=y
 CONFIG_SPL_OF_CONTROL=y
 CONFIG_DEFAULT_DEVICE_TREE="da850-evm"
 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
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 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 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 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 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 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>;
index ec6d8bf8f4feadd112aceed6d31202342f999d9e..f989792e8d3ff85cb59edd4e815f5a6925cdf373 100644 (file)
@@ -24,7 +24,7 @@ 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 lukma          Lukasz Majewski <lukma@denx.de>
 alias macpaul        Macpaul Lin <macpaul@andestech.com>
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 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 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);
 
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 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 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 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 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 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 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 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 11fce9c4fe5c73d22b68b884195a6dbe3b1f016a..efdb178450e1cf6477024d5e8286ff9a43e992f1 100644 (file)
@@ -256,7 +256,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);
index 055900def001ffe2e6a1d76cfdbb5534b31fc5c3..b4914071308d95419ef63c3a3b49b33af328161d 100644 (file)
@@ -60,7 +60,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 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 53871f864f5379f2d6c45a46a0fe219ca1854892..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
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;
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 a5f30c8fd03b53559a55190e909b35f0c5cf0527..c9ab66cccc817910979f35699a8f8ffa6b5e1987 100644 (file)
@@ -291,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
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 b01d1c3c843516733a9895866032d1e3958cd14b..ee18260be695894e0c0b1afcc128ffec2af35f19 100644 (file)
@@ -449,7 +449,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 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 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/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) (
index ad00f79f203a469fe1b92ade5fa2e07fe513d0bb..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
 
@@ -991,6 +1020,146 @@ int fdtdec_setup_memory_banksize_fdt(const void *blob);
  */
 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 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 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 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 8fe5d85a050643c512963402ac566d2ad9801848..2120216593eec74b3f462e3a83dbb7cbbc8b06ad 100644 (file)
@@ -436,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 a51dc5e98670ccf02883ef5ee03633c05db9cdf0..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"),
@@ -1261,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 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 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 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);