Merge branch 'u-boot/master' into 'u-boot-arm/master'
This commit is contained in:
commit
b939689c7b
|
@ -47,7 +47,7 @@ used under the terms of either of these licenses, i. e. with
|
||||||
|
|
||||||
SPDX-License-Identifier: GPL-2.0+ BSD-3-Clause
|
SPDX-License-Identifier: GPL-2.0+ BSD-3-Clause
|
||||||
|
|
||||||
you can chose between GPL-2.0+ and BSD-3-Clause licensing.
|
you can choose between GPL-2.0+ and BSD-3-Clause licensing.
|
||||||
|
|
||||||
We use the SPDX Unique License Identifiers here; these are available
|
We use the SPDX Unique License Identifiers here; these are available
|
||||||
at [2].
|
at [2].
|
||||||
|
@ -67,3 +67,4 @@ BSD 3-clause "New" or "Revised" License BSD-3-Clause Y bsd-3-clause.txt http:/
|
||||||
IBM PIBS (PowerPC Initialization and IBM-pibs ibm-pibs.txt
|
IBM PIBS (PowerPC Initialization and IBM-pibs ibm-pibs.txt
|
||||||
Boot Software) license
|
Boot Software) license
|
||||||
ISC License ISC Y isc.txt https://spdx.org/licenses/ISC
|
ISC License ISC Y isc.txt https://spdx.org/licenses/ISC
|
||||||
|
X11 License X11 x11.txt https://spdx.org/licenses/X11.html
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
X11 License
|
||||||
|
Copyright (C) 1996 X Consortium
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X
|
||||||
|
CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
Except as contained in this notice, the name of the X Consortium shall not be
|
||||||
|
used in advertising or otherwise to promote the sale, use or other dealings in
|
||||||
|
this Software without prior written authorization from the X Consortium.
|
||||||
|
|
||||||
|
X Window System is a trademark of X Consortium, Inc.
|
|
@ -328,10 +328,11 @@ T: git git://git.denx.de/u-boot-ppc4xx.git
|
||||||
F: arch/powerpc/cpu/ppc4xx/
|
F: arch/powerpc/cpu/ppc4xx/
|
||||||
|
|
||||||
NETWORK
|
NETWORK
|
||||||
M: Joe Hershberger <joe.hershberger@gmail.com>
|
M: Joe Hershberger <joe.hershberger@ni.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.denx.de/u-boot-net.git
|
T: git git://git.denx.de/u-boot-net.git
|
||||||
F: drivers/net/
|
F: drivers/net/
|
||||||
|
F: net/
|
||||||
|
|
||||||
NAND FLASH
|
NAND FLASH
|
||||||
M: Scott Wood <scottwood@freescale.com>
|
M: Scott Wood <scottwood@freescale.com>
|
||||||
|
|
11
Makefile
11
Makefile
|
@ -651,6 +651,7 @@ libs-$(CONFIG_FMAN_ENET) += drivers/net/fm/
|
||||||
libs-$(CONFIG_SYS_FSL_DDR) += drivers/ddr/fsl/
|
libs-$(CONFIG_SYS_FSL_DDR) += drivers/ddr/fsl/
|
||||||
libs-y += drivers/serial/
|
libs-y += drivers/serial/
|
||||||
libs-y += drivers/usb/dwc3/
|
libs-y += drivers/usb/dwc3/
|
||||||
|
libs-y += drivers/usb/emul/
|
||||||
libs-y += drivers/usb/eth/
|
libs-y += drivers/usb/eth/
|
||||||
libs-y += drivers/usb/gadget/
|
libs-y += drivers/usb/gadget/
|
||||||
libs-y += drivers/usb/gadget/udc/
|
libs-y += drivers/usb/gadget/udc/
|
||||||
|
@ -728,7 +729,7 @@ DO_STATIC_RELA =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Always append ALL so that arch config.mk's can add custom ones
|
# Always append ALL so that arch config.mk's can add custom ones
|
||||||
ALL-y += u-boot.srec u-boot.bin System.map binary_size_check
|
ALL-y += u-boot.srec u-boot.bin System.map u-boot.cfg binary_size_check
|
||||||
|
|
||||||
ALL-$(CONFIG_ONENAND_U_BOOT) += u-boot-onenand.bin
|
ALL-$(CONFIG_ONENAND_U_BOOT) += u-boot-onenand.bin
|
||||||
ifeq ($(CONFIG_SPL_FSL_PBL),y)
|
ifeq ($(CONFIG_SPL_FSL_PBL),y)
|
||||||
|
@ -870,6 +871,11 @@ ifndef CONFIG_SYS_UBOOT_START
|
||||||
CONFIG_SYS_UBOOT_START := 0
|
CONFIG_SYS_UBOOT_START := 0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Create a file containing the configuration options the image was built with
|
||||||
|
quiet_cmd_cpp_cfg = CFG $@
|
||||||
|
cmd_cpp_cfg = $(CPP) -Wp,-MD,$(depfile) $(cpp_flags) $(LDPPFLAGS) -ansi \
|
||||||
|
-D__ASSEMBLY__ -x assembler-with-cpp -P -dM -E -o $@ $<
|
||||||
|
|
||||||
MKIMAGEFLAGS_u-boot.img = -A $(ARCH) -T firmware -C none -O u-boot \
|
MKIMAGEFLAGS_u-boot.img = -A $(ARCH) -T firmware -C none -O u-boot \
|
||||||
-a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_UBOOT_START) \
|
-a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_UBOOT_START) \
|
||||||
-n "U-Boot $(UBOOTRELEASE) for $(BOARD) board"
|
-n "U-Boot $(UBOOTRELEASE) for $(BOARD) board"
|
||||||
|
@ -900,6 +906,9 @@ u-boot.sha1: u-boot.bin
|
||||||
u-boot.dis: u-boot
|
u-boot.dis: u-boot
|
||||||
$(OBJDUMP) -d $< > $@
|
$(OBJDUMP) -d $< > $@
|
||||||
|
|
||||||
|
u-boot.cfg: include/config.h
|
||||||
|
$(call if_changed,cpp_cfg)
|
||||||
|
|
||||||
ifdef CONFIG_TPL
|
ifdef CONFIG_TPL
|
||||||
SPL_PAYLOAD := tpl/u-boot-with-tpl.bin
|
SPL_PAYLOAD := tpl/u-boot-with-tpl.bin
|
||||||
else
|
else
|
||||||
|
|
99
README
99
README
|
@ -690,6 +690,14 @@ The following options need to be configured:
|
||||||
exists, unlike the similar options in the Linux kernel. Do not
|
exists, unlike the similar options in the Linux kernel. Do not
|
||||||
set these options unless they apply!
|
set these options unless they apply!
|
||||||
|
|
||||||
|
COUNTER_FREQUENCY
|
||||||
|
Generic timer clock source frequency.
|
||||||
|
|
||||||
|
COUNTER_FREQUENCY_REAL
|
||||||
|
Generic timer clock source frequency if the real clock is
|
||||||
|
different from COUNTER_FREQUENCY, and can only be determined
|
||||||
|
at run time.
|
||||||
|
|
||||||
NOTE: The following can be machine specific errata. These
|
NOTE: The following can be machine specific errata. These
|
||||||
do have ability to provide rudimentary version and machine
|
do have ability to provide rudimentary version and machine
|
||||||
specific checks, but expect no product checks.
|
specific checks, but expect no product checks.
|
||||||
|
@ -1947,6 +1955,26 @@ CBFS (Coreboot Filesystem) support
|
||||||
the console jump but can help speed up operation when scrolling
|
the console jump but can help speed up operation when scrolling
|
||||||
is slow.
|
is slow.
|
||||||
|
|
||||||
|
CONFIG_LCD_ROTATION
|
||||||
|
|
||||||
|
Sometimes, for example if the display is mounted in portrait
|
||||||
|
mode or even if it's mounted landscape but rotated by 180degree,
|
||||||
|
we need to rotate our content of the display relative to the
|
||||||
|
framebuffer, so that user can read the messages which are
|
||||||
|
printed out.
|
||||||
|
Once CONFIG_LCD_ROTATION is defined, the lcd_console will be
|
||||||
|
initialized with a given rotation from "vl_rot" out of
|
||||||
|
"vidinfo_t" which is provided by the board specific code.
|
||||||
|
The value for vl_rot is coded as following (matching to
|
||||||
|
fbcon=rotate:<n> linux-kernel commandline):
|
||||||
|
0 = no rotation respectively 0 degree
|
||||||
|
1 = 90 degree rotation
|
||||||
|
2 = 180 degree rotation
|
||||||
|
3 = 270 degree rotation
|
||||||
|
|
||||||
|
If CONFIG_LCD_ROTATION is not defined, the console will be
|
||||||
|
initialized with 0degree rotation.
|
||||||
|
|
||||||
CONFIG_LCD_BMP_RLE8
|
CONFIG_LCD_BMP_RLE8
|
||||||
|
|
||||||
Support drawing of RLE8-compressed bitmaps on the LCD.
|
Support drawing of RLE8-compressed bitmaps on the LCD.
|
||||||
|
@ -2375,6 +2403,8 @@ CBFS (Coreboot Filesystem) support
|
||||||
- define slave for bus 3 with CONFIG_SYS_MXC_I2C3_SLAVE
|
- define slave for bus 3 with CONFIG_SYS_MXC_I2C3_SLAVE
|
||||||
If those defines are not set, default value is 100000
|
If those defines are not set, default value is 100000
|
||||||
for speed, and 0 for slave.
|
for speed, and 0 for slave.
|
||||||
|
- enable bus 3 with CONFIG_SYS_I2C_MXC_I2C3
|
||||||
|
- enable bus 4 with CONFIG_SYS_I2C_MXC_I2C4
|
||||||
|
|
||||||
- drivers/i2c/rcar_i2c.c:
|
- drivers/i2c/rcar_i2c.c:
|
||||||
- activate this driver with CONFIG_SYS_I2C_RCAR
|
- activate this driver with CONFIG_SYS_I2C_RCAR
|
||||||
|
@ -3066,17 +3096,6 @@ CBFS (Coreboot Filesystem) support
|
||||||
memories can be connected with a given cs line.
|
memories can be connected with a given cs line.
|
||||||
Currently Xilinx Zynq qspi supports these type of connections.
|
Currently Xilinx Zynq qspi supports these type of connections.
|
||||||
|
|
||||||
CONFIG_SYS_SPI_ST_ENABLE_WP_PIN
|
|
||||||
enable the W#/Vpp signal to disable writing to the status
|
|
||||||
register on ST MICRON flashes like the N25Q128.
|
|
||||||
The status register write enable/disable bit, combined with
|
|
||||||
the W#/VPP signal provides hardware data protection for the
|
|
||||||
device as follows: When the enable/disable bit is set to 1,
|
|
||||||
and the W#/VPP signal is driven LOW, the status register
|
|
||||||
nonvolatile bits become read-only and the WRITE STATUS REGISTER
|
|
||||||
operation will not execute. The only way to exit this
|
|
||||||
hardware-protected mode is to drive W#/VPP HIGH.
|
|
||||||
|
|
||||||
- SystemACE Support:
|
- SystemACE Support:
|
||||||
CONFIG_SYSTEMACE
|
CONFIG_SYSTEMACE
|
||||||
|
|
||||||
|
@ -3198,55 +3217,6 @@ CBFS (Coreboot Filesystem) support
|
||||||
example, some LED's) on your board. At the moment,
|
example, some LED's) on your board. At the moment,
|
||||||
the following checkpoints are implemented:
|
the following checkpoints are implemented:
|
||||||
|
|
||||||
- Detailed boot stage timing
|
|
||||||
CONFIG_BOOTSTAGE
|
|
||||||
Define this option to get detailed timing of each stage
|
|
||||||
of the boot process.
|
|
||||||
|
|
||||||
CONFIG_BOOTSTAGE_USER_COUNT
|
|
||||||
This is the number of available user bootstage records.
|
|
||||||
Each time you call bootstage_mark(BOOTSTAGE_ID_ALLOC, ...)
|
|
||||||
a new ID will be allocated from this stash. If you exceed
|
|
||||||
the limit, recording will stop.
|
|
||||||
|
|
||||||
CONFIG_BOOTSTAGE_REPORT
|
|
||||||
Define this to print a report before boot, similar to this:
|
|
||||||
|
|
||||||
Timer summary in microseconds:
|
|
||||||
Mark Elapsed Stage
|
|
||||||
0 0 reset
|
|
||||||
3,575,678 3,575,678 board_init_f start
|
|
||||||
3,575,695 17 arch_cpu_init A9
|
|
||||||
3,575,777 82 arch_cpu_init done
|
|
||||||
3,659,598 83,821 board_init_r start
|
|
||||||
3,910,375 250,777 main_loop
|
|
||||||
29,916,167 26,005,792 bootm_start
|
|
||||||
30,361,327 445,160 start_kernel
|
|
||||||
|
|
||||||
CONFIG_CMD_BOOTSTAGE
|
|
||||||
Add a 'bootstage' command which supports printing a report
|
|
||||||
and un/stashing of bootstage data.
|
|
||||||
|
|
||||||
CONFIG_BOOTSTAGE_FDT
|
|
||||||
Stash the bootstage information in the FDT. A root 'bootstage'
|
|
||||||
node is created with each bootstage id as a child. Each child
|
|
||||||
has a 'name' property and either 'mark' containing the
|
|
||||||
mark time in microsecond, or 'accum' containing the
|
|
||||||
accumulated time for that bootstage id in microseconds.
|
|
||||||
For example:
|
|
||||||
|
|
||||||
bootstage {
|
|
||||||
154 {
|
|
||||||
name = "board_init_f";
|
|
||||||
mark = <3575678>;
|
|
||||||
};
|
|
||||||
170 {
|
|
||||||
name = "lcd";
|
|
||||||
accum = <33482>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
Code in the Linux kernel can find this in /proc/devicetree.
|
|
||||||
|
|
||||||
Legacy uImage format:
|
Legacy uImage format:
|
||||||
|
|
||||||
|
@ -3340,9 +3310,9 @@ Legacy uImage format:
|
||||||
65 net/eth.c Ethernet found.
|
65 net/eth.c Ethernet found.
|
||||||
|
|
||||||
-80 common/cmd_net.c usage wrong
|
-80 common/cmd_net.c usage wrong
|
||||||
80 common/cmd_net.c before calling NetLoop()
|
80 common/cmd_net.c before calling net_loop()
|
||||||
-81 common/cmd_net.c some error in NetLoop() occurred
|
-81 common/cmd_net.c some error in net_loop() occurred
|
||||||
81 common/cmd_net.c NetLoop() back without error
|
81 common/cmd_net.c net_loop() back without error
|
||||||
-82 common/cmd_net.c size == 0 (File with size 0 loaded)
|
-82 common/cmd_net.c size == 0 (File with size 0 loaded)
|
||||||
82 common/cmd_net.c trying automatic boot
|
82 common/cmd_net.c trying automatic boot
|
||||||
83 common/cmd_net.c running "source" command
|
83 common/cmd_net.c running "source" command
|
||||||
|
@ -4911,6 +4881,9 @@ Low Level (hardware related) configuration options:
|
||||||
- CONFIG_FSL_DDR_SYNC_REFRESH
|
- CONFIG_FSL_DDR_SYNC_REFRESH
|
||||||
Enable sync of refresh for multiple controllers.
|
Enable sync of refresh for multiple controllers.
|
||||||
|
|
||||||
|
- CONFIG_FSL_DDR_BIST
|
||||||
|
Enable built-in memory test for Freescale DDR controllers.
|
||||||
|
|
||||||
- CONFIG_SYS_83XX_DDR_USES_CS0
|
- CONFIG_SYS_83XX_DDR_USES_CS0
|
||||||
Only for 83xx systems. If specified, then DDR should
|
Only for 83xx systems. If specified, then DDR should
|
||||||
be configured using CS0 and CS1 instead of CS2 and CS3.
|
be configured using CS0 and CS1 instead of CS2 and CS3.
|
||||||
|
|
|
@ -37,7 +37,7 @@ int dev_open_net(void *cookie)
|
||||||
if (!dev_valid_net(cookie))
|
if (!dev_valid_net(cookie))
|
||||||
return API_ENODEV;
|
return API_ENODEV;
|
||||||
|
|
||||||
if (eth_init(gd->bd) < 0)
|
if (eth_init() < 0)
|
||||||
return API_EIO;
|
return API_EIO;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -70,6 +70,12 @@ config SANDBOX
|
||||||
select HAVE_GENERIC_BOARD
|
select HAVE_GENERIC_BOARD
|
||||||
select SYS_GENERIC_BOARD
|
select SYS_GENERIC_BOARD
|
||||||
select SUPPORT_OF_CONTROL
|
select SUPPORT_OF_CONTROL
|
||||||
|
select DM
|
||||||
|
select DM_SPI_FLASH
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_I2C
|
||||||
|
select DM_SPI
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config SH
|
config SH
|
||||||
bool "SuperH architecture"
|
bool "SuperH architecture"
|
||||||
|
@ -84,6 +90,9 @@ config X86
|
||||||
select HAVE_GENERIC_BOARD
|
select HAVE_GENERIC_BOARD
|
||||||
select SYS_GENERIC_BOARD
|
select SYS_GENERIC_BOARD
|
||||||
select SUPPORT_OF_CONTROL
|
select SUPPORT_OF_CONTROL
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
|
144
arch/arm/Kconfig
144
arch/arm/Kconfig
|
@ -33,6 +33,9 @@ config CPU_V7
|
||||||
bool
|
bool
|
||||||
select HAS_VBAR
|
select HAS_VBAR
|
||||||
|
|
||||||
|
config CPU_V7M
|
||||||
|
bool
|
||||||
|
|
||||||
config CPU_PXA
|
config CPU_PXA
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
@ -47,6 +50,7 @@ config SYS_CPU
|
||||||
default "arm1136" if CPU_ARM1136
|
default "arm1136" if CPU_ARM1136
|
||||||
default "arm1176" if CPU_ARM1176
|
default "arm1176" if CPU_ARM1176
|
||||||
default "armv7" if CPU_V7
|
default "armv7" if CPU_V7
|
||||||
|
default "armv7m" if CPU_V7M
|
||||||
default "pxa" if CPU_PXA
|
default "pxa" if CPU_PXA
|
||||||
default "sa1100" if CPU_SA1100
|
default "sa1100" if CPU_SA1100
|
||||||
default "armv8" if ARM64
|
default "armv8" if ARM64
|
||||||
|
@ -61,18 +65,6 @@ config SEMIHOSTING
|
||||||
choice
|
choice
|
||||||
prompt "Target select"
|
prompt "Target select"
|
||||||
|
|
||||||
config TARGET_INTEGRATORAP_CM720T
|
|
||||||
bool "Support integratorap_cm720t"
|
|
||||||
select CPU_ARM720T
|
|
||||||
|
|
||||||
config TARGET_INTEGRATORAP_CM920T
|
|
||||||
bool "Support integratorap_cm920t"
|
|
||||||
select CPU_ARM920T
|
|
||||||
|
|
||||||
config TARGET_INTEGRATORCP_CM920T
|
|
||||||
bool "Support integratorcp_cm920t"
|
|
||||||
select CPU_ARM920T
|
|
||||||
|
|
||||||
config ARCH_AT91
|
config ARCH_AT91
|
||||||
bool "Atmel AT91"
|
bool "Atmel AT91"
|
||||||
|
|
||||||
|
@ -92,14 +84,6 @@ config TARGET_SMDK2410
|
||||||
bool "Support smdk2410"
|
bool "Support smdk2410"
|
||||||
select CPU_ARM920T
|
select CPU_ARM920T
|
||||||
|
|
||||||
config TARGET_INTEGRATORAP_CM926EJS
|
|
||||||
bool "Support integratorap_cm926ejs"
|
|
||||||
select CPU_ARM926EJS
|
|
||||||
|
|
||||||
config TARGET_INTEGRATORCP_CM926EJS
|
|
||||||
bool "Support integratorcp_cm926ejs"
|
|
||||||
select CPU_ARM926EJS
|
|
||||||
|
|
||||||
config TARGET_ASPENITE
|
config TARGET_ASPENITE
|
||||||
bool "Support aspenite"
|
bool "Support aspenite"
|
||||||
select CPU_ARM926EJS
|
select CPU_ARM926EJS
|
||||||
|
@ -235,6 +219,8 @@ config TARGET_SPEAR600
|
||||||
config TARGET_STV0991
|
config TARGET_STV0991
|
||||||
bool "Support stv0991"
|
bool "Support stv0991"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
|
||||||
config TARGET_X600
|
config TARGET_X600
|
||||||
bool "Support x600"
|
bool "Support x600"
|
||||||
|
@ -245,10 +231,6 @@ config ARCH_VERSATILE
|
||||||
bool "ARM Ltd. Versatile family"
|
bool "ARM Ltd. Versatile family"
|
||||||
select CPU_ARM926EJS
|
select CPU_ARM926EJS
|
||||||
|
|
||||||
config TARGET_INTEGRATORCP_CM1136
|
|
||||||
bool "Support integratorcp_cm1136"
|
|
||||||
select CPU_ARM1136
|
|
||||||
|
|
||||||
config TARGET_IMX31_PHYCORE
|
config TARGET_IMX31_PHYCORE
|
||||||
bool "Support imx31_phycore"
|
bool "Support imx31_phycore"
|
||||||
select CPU_ARM1136
|
select CPU_ARM1136
|
||||||
|
@ -293,14 +275,9 @@ config TARGET_MX35PDK
|
||||||
|
|
||||||
config ARCH_BCM283X
|
config ARCH_BCM283X
|
||||||
bool "Broadcom BCM283X family"
|
bool "Broadcom BCM283X family"
|
||||||
|
select DM
|
||||||
config TARGET_INTEGRATORAP_CM946ES
|
select DM_SERIAL
|
||||||
bool "Support integratorap_cm946es"
|
select DM_GPIO
|
||||||
select CPU_ARM946ES
|
|
||||||
|
|
||||||
config TARGET_INTEGRATORCP_CM946ES
|
|
||||||
bool "Support integratorcp_cm946es"
|
|
||||||
select CPU_ARM946ES
|
|
||||||
|
|
||||||
config TARGET_VEXPRESS_CA15_TC2
|
config TARGET_VEXPRESS_CA15_TC2
|
||||||
bool "Support vexpress_ca15_tc2"
|
bool "Support vexpress_ca15_tc2"
|
||||||
|
@ -330,21 +307,33 @@ config TARGET_CM_T335
|
||||||
bool "Support cm_t335"
|
bool "Support cm_t335"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config TARGET_PEPPER
|
config TARGET_PEPPER
|
||||||
bool "Support pepper"
|
bool "Support pepper"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config TARGET_AM335X_IGEP0033
|
config TARGET_AM335X_IGEP0033
|
||||||
bool "Support am335x_igep0033"
|
bool "Support am335x_igep0033"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config TARGET_PCM051
|
config TARGET_PCM051
|
||||||
bool "Support pcm051"
|
bool "Support pcm051"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config TARGET_DRACO
|
config TARGET_DRACO
|
||||||
bool "Support draco"
|
bool "Support draco"
|
||||||
|
@ -370,11 +359,17 @@ config TARGET_PENGWYN
|
||||||
bool "Support pengwyn"
|
bool "Support pengwyn"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config TARGET_AM335X_EVM
|
config TARGET_AM335X_EVM
|
||||||
bool "Support am335x_evm"
|
bool "Support am335x_evm"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config TARGET_AM43XX_EVM
|
config TARGET_AM43XX_EVM
|
||||||
bool "Support am43xx_evm"
|
bool "Support am43xx_evm"
|
||||||
|
@ -385,6 +380,8 @@ config TARGET_BAV335X
|
||||||
bool "Support bav335x"
|
bool "Support bav335x"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
help
|
help
|
||||||
The BAV335x OEM Network Processor integrates all the functions of an
|
The BAV335x OEM Network Processor integrates all the functions of an
|
||||||
embedded network computer in a small, easy to use SODIMM module which
|
embedded network computer in a small, easy to use SODIMM module which
|
||||||
|
@ -419,15 +416,26 @@ config TARGET_BCMNSP
|
||||||
config ARCH_EXYNOS
|
config ARCH_EXYNOS
|
||||||
bool "Samsung EXYNOS"
|
bool "Samsung EXYNOS"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
|
select DM
|
||||||
|
select DM_SPI_FLASH
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_SPI
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config ARCH_S5PC1XX
|
config ARCH_S5PC1XX
|
||||||
bool "Samsung S5PC1XX"
|
bool "Samsung S5PC1XX"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config ARCH_HIGHBANK
|
config ARCH_HIGHBANK
|
||||||
bool "Calxeda Highbank"
|
bool "Calxeda Highbank"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
|
|
||||||
|
config ARCH_INTEGRATOR
|
||||||
|
bool "ARM Ltd. Integrator family"
|
||||||
|
|
||||||
config ARCH_KEYSTONE
|
config ARCH_KEYSTONE
|
||||||
bool "TI Keystone"
|
bool "TI Keystone"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
|
@ -517,11 +525,20 @@ config TARGET_MX6QARM2
|
||||||
config TARGET_MX6QSABREAUTO
|
config TARGET_MX6QSABREAUTO
|
||||||
bool "Support mx6qsabreauto"
|
bool "Support mx6qsabreauto"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
|
select DM
|
||||||
|
select DM_THERMAL
|
||||||
|
|
||||||
config TARGET_MX6SABRESD
|
config TARGET_MX6SABRESD
|
||||||
bool "Support mx6sabresd"
|
bool "Support mx6sabresd"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_THERMAL
|
||||||
|
|
||||||
|
config TARGET_MX6CUBOXI
|
||||||
|
bool "Support Solid-run mx6 boards"
|
||||||
|
select CPU_V7
|
||||||
|
select SUPPORT_SPL
|
||||||
|
|
||||||
config TARGET_MX6SLEVK
|
config TARGET_MX6SLEVK
|
||||||
bool "Support mx6slevk"
|
bool "Support mx6slevk"
|
||||||
|
@ -531,6 +548,8 @@ config TARGET_MX6SXSABRESD
|
||||||
bool "Support mx6sxsabresd"
|
bool "Support mx6sxsabresd"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_THERMAL
|
||||||
|
|
||||||
config TARGET_GW_VENTANA
|
config TARGET_GW_VENTANA
|
||||||
bool "Support gw_ventana"
|
bool "Support gw_ventana"
|
||||||
|
@ -591,16 +610,25 @@ config TARGET_CM_FX6
|
||||||
bool "Support cm_fx6"
|
bool "Support cm_fx6"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config TARGET_SOCFPGA_ARRIA5
|
config TARGET_SOCFPGA_ARRIA5
|
||||||
bool "Support socfpga_arria5"
|
bool "Support socfpga_arria5"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_SPI_FLASH
|
||||||
|
select DM_SPI
|
||||||
|
|
||||||
config TARGET_SOCFPGA_CYCLONE5
|
config TARGET_SOCFPGA_CYCLONE5
|
||||||
bool "Support socfpga_cyclone5"
|
bool "Support socfpga_cyclone5"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_SPI_FLASH
|
||||||
|
select DM_SPI
|
||||||
|
|
||||||
config ARCH_SUNXI
|
config ARCH_SUNXI
|
||||||
bool "Support sunxi (Allwinner) SoCs"
|
bool "Support sunxi (Allwinner) SoCs"
|
||||||
|
@ -617,10 +645,15 @@ config TARGET_VF610TWR
|
||||||
bool "Support vf610twr"
|
bool "Support vf610twr"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
|
|
||||||
config ZYNQ
|
config TARGET_COLIBRI_VF
|
||||||
|
bool "Support Colibri VF50/61"
|
||||||
|
select CPU_V7
|
||||||
|
|
||||||
|
config ARCH_ZYNQ
|
||||||
bool "Xilinx Zynq Platform"
|
bool "Xilinx Zynq Platform"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
|
||||||
config TARGET_XILINX_ZYNQMP
|
config TARGET_XILINX_ZYNQMP
|
||||||
bool "Support Xilinx ZynqMP Platform"
|
bool "Support Xilinx ZynqMP Platform"
|
||||||
|
@ -632,6 +665,12 @@ config TEGRA
|
||||||
select SPL
|
select SPL
|
||||||
select OF_CONTROL
|
select OF_CONTROL
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
|
select DM
|
||||||
|
select DM_SPI_FLASH
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_I2C
|
||||||
|
select DM_SPI
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config TARGET_VEXPRESS64_AEMV8A
|
config TARGET_VEXPRESS64_AEMV8A
|
||||||
bool "Support vexpress_aemv8a"
|
bool "Support vexpress_aemv8a"
|
||||||
|
@ -656,6 +695,28 @@ config TARGET_LS2085A_SIMU
|
||||||
select ARM64
|
select ARM64
|
||||||
select ARMV8_MULTIENTRY
|
select ARMV8_MULTIENTRY
|
||||||
|
|
||||||
|
config TARGET_LS2085AQDS
|
||||||
|
bool "Support ls2085aqds"
|
||||||
|
select ARM64
|
||||||
|
select ARMV8_MULTIENTRY
|
||||||
|
select SUPPORT_SPL
|
||||||
|
help
|
||||||
|
Support for Freescale LS2085AQDS platform
|
||||||
|
The LS2085A Development System (QDS) is a high-performance
|
||||||
|
development platform that supports the QorIQ LS2085A
|
||||||
|
Layerscape Architecture processor.
|
||||||
|
|
||||||
|
config TARGET_LS2085ARDB
|
||||||
|
bool "Support ls2085ardb"
|
||||||
|
select ARM64
|
||||||
|
select ARMV8_MULTIENTRY
|
||||||
|
select SUPPORT_SPL
|
||||||
|
help
|
||||||
|
Support for Freescale LS2085ARDB platform.
|
||||||
|
The LS2085A Reference design board (RDB) is a high-performance
|
||||||
|
development platform that supports the QorIQ LS2085A
|
||||||
|
Layerscape Architecture processor.
|
||||||
|
|
||||||
config TARGET_LS1021AQDS
|
config TARGET_LS1021AQDS
|
||||||
bool "Support ls1021aqds"
|
bool "Support ls1021aqds"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
|
@ -726,6 +787,13 @@ config ARCH_UNIPHIER
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
select SPL
|
select SPL
|
||||||
select OF_CONTROL
|
select OF_CONTROL
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_I2C
|
||||||
|
|
||||||
|
config TARGET_STM32F429_DISCOVERY
|
||||||
|
bool "Support STM32F429 Discovery"
|
||||||
|
select CPU_V7M
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
@ -739,6 +807,8 @@ source "arch/arm/cpu/armv7/exynos/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-highbank/Kconfig"
|
source "arch/arm/mach-highbank/Kconfig"
|
||||||
|
|
||||||
|
source "arch/arm/mach-integrator/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-keystone/Kconfig"
|
source "arch/arm/mach-keystone/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-kirkwood/Kconfig"
|
source "arch/arm/mach-kirkwood/Kconfig"
|
||||||
|
@ -767,7 +837,7 @@ source "arch/arm/mach-uniphier/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-versatile/Kconfig"
|
source "arch/arm/mach-versatile/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/cpu/armv7/zynq/Kconfig"
|
source "arch/arm/mach-zynq/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/cpu/armv7/Kconfig"
|
source "arch/arm/cpu/armv7/Kconfig"
|
||||||
|
|
||||||
|
@ -784,7 +854,6 @@ source "board/Marvell/db-mv784mp-gp/Kconfig"
|
||||||
source "board/Marvell/gplugd/Kconfig"
|
source "board/Marvell/gplugd/Kconfig"
|
||||||
source "board/altera/socfpga/Kconfig"
|
source "board/altera/socfpga/Kconfig"
|
||||||
source "board/armadeus/apf27/Kconfig"
|
source "board/armadeus/apf27/Kconfig"
|
||||||
source "board/armltd/integrator/Kconfig"
|
|
||||||
source "board/armltd/vexpress/Kconfig"
|
source "board/armltd/vexpress/Kconfig"
|
||||||
source "board/armltd/vexpress64/Kconfig"
|
source "board/armltd/vexpress64/Kconfig"
|
||||||
source "board/bachmann/ot1200/Kconfig"
|
source "board/bachmann/ot1200/Kconfig"
|
||||||
|
@ -807,6 +876,8 @@ source "board/denx/m53evk/Kconfig"
|
||||||
source "board/embest/mx6boards/Kconfig"
|
source "board/embest/mx6boards/Kconfig"
|
||||||
source "board/esg/ima3-mx53/Kconfig"
|
source "board/esg/ima3-mx53/Kconfig"
|
||||||
source "board/freescale/ls2085a/Kconfig"
|
source "board/freescale/ls2085a/Kconfig"
|
||||||
|
source "board/freescale/ls2085aqds/Kconfig"
|
||||||
|
source "board/freescale/ls2085ardb/Kconfig"
|
||||||
source "board/freescale/ls1021aqds/Kconfig"
|
source "board/freescale/ls1021aqds/Kconfig"
|
||||||
source "board/freescale/ls1021atwr/Kconfig"
|
source "board/freescale/ls1021atwr/Kconfig"
|
||||||
source "board/freescale/mx23evk/Kconfig"
|
source "board/freescale/mx23evk/Kconfig"
|
||||||
|
@ -856,6 +927,7 @@ source "board/siemens/draco/Kconfig"
|
||||||
source "board/siemens/pxm2/Kconfig"
|
source "board/siemens/pxm2/Kconfig"
|
||||||
source "board/siemens/rut/Kconfig"
|
source "board/siemens/rut/Kconfig"
|
||||||
source "board/silica/pengwyn/Kconfig"
|
source "board/silica/pengwyn/Kconfig"
|
||||||
|
source "board/solidrun/mx6cuboxi/Kconfig"
|
||||||
source "board/solidrun/hummingboard/Kconfig"
|
source "board/solidrun/hummingboard/Kconfig"
|
||||||
source "board/spear/spear300/Kconfig"
|
source "board/spear/spear300/Kconfig"
|
||||||
source "board/spear/spear310/Kconfig"
|
source "board/spear/spear310/Kconfig"
|
||||||
|
@ -864,6 +936,7 @@ source "board/spear/spear600/Kconfig"
|
||||||
source "board/spear/x600/Kconfig"
|
source "board/spear/x600/Kconfig"
|
||||||
source "board/st-ericsson/snowball/Kconfig"
|
source "board/st-ericsson/snowball/Kconfig"
|
||||||
source "board/st-ericsson/u8500/Kconfig"
|
source "board/st-ericsson/u8500/Kconfig"
|
||||||
|
source "board/st/stm32f429-discovery/Kconfig"
|
||||||
source "board/st/stv0991/Kconfig"
|
source "board/st/stv0991/Kconfig"
|
||||||
source "board/sunxi/Kconfig"
|
source "board/sunxi/Kconfig"
|
||||||
source "board/syteco/zmx25/Kconfig"
|
source "board/syteco/zmx25/Kconfig"
|
||||||
|
@ -875,6 +948,7 @@ source "board/ti/ti814x/Kconfig"
|
||||||
source "board/ti/ti816x/Kconfig"
|
source "board/ti/ti816x/Kconfig"
|
||||||
source "board/timll/devkit3250/Kconfig"
|
source "board/timll/devkit3250/Kconfig"
|
||||||
source "board/toradex/colibri_pxa270/Kconfig"
|
source "board/toradex/colibri_pxa270/Kconfig"
|
||||||
|
source "board/toradex/colibri_vf/Kconfig"
|
||||||
source "board/tqc/tqma6/Kconfig"
|
source "board/tqc/tqma6/Kconfig"
|
||||||
source "board/trizepsiv/Kconfig"
|
source "board/trizepsiv/Kconfig"
|
||||||
source "board/ttcontrol/vision2/Kconfig"
|
source "board/ttcontrol/vision2/Kconfig"
|
||||||
|
|
|
@ -55,6 +55,7 @@ machine-$(CONFIG_ORION5X) += orion5x
|
||||||
machine-$(CONFIG_TEGRA) += tegra
|
machine-$(CONFIG_TEGRA) += tegra
|
||||||
machine-$(CONFIG_ARCH_UNIPHIER) += uniphier
|
machine-$(CONFIG_ARCH_UNIPHIER) += uniphier
|
||||||
machine-$(CONFIG_ARCH_VERSATILE) += versatile
|
machine-$(CONFIG_ARCH_VERSATILE) += versatile
|
||||||
|
machine-$(CONFIG_ARCH_ZYNQ) += zynq
|
||||||
|
|
||||||
machdirs := $(patsubst %,arch/arm/mach-%/,$(machine-y))
|
machdirs := $(patsubst %,arch/arm/mach-%/,$(machine-y))
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
|
|
||||||
#include <asm-offsets.h>
|
#include <asm-offsets.h>
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <asm/hardware.h>
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*************************************************************************
|
*************************************************************************
|
||||||
|
|
|
@ -49,13 +49,6 @@ static const iomux_cfg_t iomux_boot[] = {
|
||||||
MX23_PAD_LCD_D03__GPIO_1_3 | MUX_CONFIG_BOOTMODE_PAD,
|
MX23_PAD_LCD_D03__GPIO_1_3 | MUX_CONFIG_BOOTMODE_PAD,
|
||||||
MX23_PAD_LCD_D04__GPIO_1_4 | MUX_CONFIG_BOOTMODE_PAD,
|
MX23_PAD_LCD_D04__GPIO_1_4 | MUX_CONFIG_BOOTMODE_PAD,
|
||||||
MX23_PAD_LCD_D05__GPIO_1_5 | MUX_CONFIG_BOOTMODE_PAD,
|
MX23_PAD_LCD_D05__GPIO_1_5 | MUX_CONFIG_BOOTMODE_PAD,
|
||||||
#elif defined(CONFIG_MX28)
|
|
||||||
MX28_PAD_LCD_D00__GPIO_1_0 | MUX_CONFIG_BOOTMODE_PAD,
|
|
||||||
MX28_PAD_LCD_D01__GPIO_1_1 | MUX_CONFIG_BOOTMODE_PAD,
|
|
||||||
MX28_PAD_LCD_D02__GPIO_1_2 | MUX_CONFIG_BOOTMODE_PAD,
|
|
||||||
MX28_PAD_LCD_D03__GPIO_1_3 | MUX_CONFIG_BOOTMODE_PAD,
|
|
||||||
MX28_PAD_LCD_D04__GPIO_1_4 | MUX_CONFIG_BOOTMODE_PAD,
|
|
||||||
MX28_PAD_LCD_D05__GPIO_1_5 | MUX_CONFIG_BOOTMODE_PAD,
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -65,10 +58,10 @@ static uint8_t mxs_get_bootmode_index(void)
|
||||||
int i;
|
int i;
|
||||||
uint8_t masked;
|
uint8_t masked;
|
||||||
|
|
||||||
|
#if defined(CONFIG_MX23)
|
||||||
/* Setup IOMUX of bootmode pads to GPIO */
|
/* Setup IOMUX of bootmode pads to GPIO */
|
||||||
mxs_iomux_setup_multiple_pads(iomux_boot, ARRAY_SIZE(iomux_boot));
|
mxs_iomux_setup_multiple_pads(iomux_boot, ARRAY_SIZE(iomux_boot));
|
||||||
|
|
||||||
#if defined(CONFIG_MX23)
|
|
||||||
/* Setup bootmode pins as GPIO input */
|
/* Setup bootmode pins as GPIO input */
|
||||||
gpio_direction_input(MX23_PAD_LCD_D00__GPIO_1_0);
|
gpio_direction_input(MX23_PAD_LCD_D00__GPIO_1_0);
|
||||||
gpio_direction_input(MX23_PAD_LCD_D01__GPIO_1_1);
|
gpio_direction_input(MX23_PAD_LCD_D01__GPIO_1_1);
|
||||||
|
@ -83,21 +76,11 @@ static uint8_t mxs_get_bootmode_index(void)
|
||||||
bootmode |= (gpio_get_value(MX23_PAD_LCD_D03__GPIO_1_3) ? 1 : 0) << 3;
|
bootmode |= (gpio_get_value(MX23_PAD_LCD_D03__GPIO_1_3) ? 1 : 0) << 3;
|
||||||
bootmode |= (gpio_get_value(MX23_PAD_LCD_D05__GPIO_1_5) ? 1 : 0) << 5;
|
bootmode |= (gpio_get_value(MX23_PAD_LCD_D05__GPIO_1_5) ? 1 : 0) << 5;
|
||||||
#elif defined(CONFIG_MX28)
|
#elif defined(CONFIG_MX28)
|
||||||
/* Setup bootmode pins as GPIO input */
|
/* The global boot mode will be detected by ROM code and its value
|
||||||
gpio_direction_input(MX28_PAD_LCD_D00__GPIO_1_0);
|
* is stored at the fixed address 0x00019BF0 in OCRAM.
|
||||||
gpio_direction_input(MX28_PAD_LCD_D01__GPIO_1_1);
|
*/
|
||||||
gpio_direction_input(MX28_PAD_LCD_D02__GPIO_1_2);
|
#define GLOBAL_BOOT_MODE_ADDR 0x00019BF0
|
||||||
gpio_direction_input(MX28_PAD_LCD_D03__GPIO_1_3);
|
bootmode = __raw_readl(GLOBAL_BOOT_MODE_ADDR);
|
||||||
gpio_direction_input(MX28_PAD_LCD_D04__GPIO_1_4);
|
|
||||||
gpio_direction_input(MX28_PAD_LCD_D05__GPIO_1_5);
|
|
||||||
|
|
||||||
/* Read bootmode pads */
|
|
||||||
bootmode |= (gpio_get_value(MX28_PAD_LCD_D00__GPIO_1_0) ? 1 : 0) << 0;
|
|
||||||
bootmode |= (gpio_get_value(MX28_PAD_LCD_D01__GPIO_1_1) ? 1 : 0) << 1;
|
|
||||||
bootmode |= (gpio_get_value(MX28_PAD_LCD_D02__GPIO_1_2) ? 1 : 0) << 2;
|
|
||||||
bootmode |= (gpio_get_value(MX28_PAD_LCD_D03__GPIO_1_3) ? 1 : 0) << 3;
|
|
||||||
bootmode |= (gpio_get_value(MX28_PAD_LCD_D04__GPIO_1_4) ? 1 : 0) << 4;
|
|
||||||
bootmode |= (gpio_get_value(MX28_PAD_LCD_D05__GPIO_1_5) ? 1 : 0) << 5;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(mxs_boot_modes); i++) {
|
for (i = 0; i < ARRAY_SIZE(mxs_boot_modes); i++) {
|
||||||
|
|
|
@ -32,7 +32,7 @@ int arch_cpu_init(void)
|
||||||
periph_clk_cfg |= CONFIG_SPEAR_UART48M;
|
periph_clk_cfg |= CONFIG_SPEAR_UART48M;
|
||||||
writel(periph_clk_cfg, &misc_p->periph_clk_cfg);
|
writel(periph_clk_cfg, &misc_p->periph_clk_cfg);
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_DESIGNWARE_ETH)
|
#if defined(CONFIG_ETH_DESIGNWARE)
|
||||||
periph1_clken |= MISC_ETHENB;
|
periph1_clken |= MISC_ETHENB;
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_DW_UDC)
|
#if defined(CONFIG_DW_UDC)
|
||||||
|
|
|
@ -53,7 +53,7 @@ static void cache_flush (void)
|
||||||
asm ("mcr p15, 0, %0, c7, c6, 0": :"r" (i));
|
asm ("mcr p15, 0, %0, c7, c6, 0": :"r" (i));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_INTEGRATOR
|
#ifndef CONFIG_ARCH_INTEGRATOR
|
||||||
|
|
||||||
__attribute__((noreturn)) void reset_cpu(ulong addr __attribute__((unused)))
|
__attribute__((noreturn)) void reset_cpu(ulong addr __attribute__((unused)))
|
||||||
{
|
{
|
||||||
|
@ -63,4 +63,4 @@ __attribute__((noreturn)) void reset_cpu(ulong addr __attribute__((unused)))
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* #ifdef CONFIG_INTEGRATOR */
|
#endif /* #ifdef CONFIG_ARCH_INTEGRATOR */
|
||||||
|
|
|
@ -12,7 +12,7 @@ obj-y += cache_v7.o
|
||||||
obj-y += cpu.o cp15.o
|
obj-y += cpu.o cp15.o
|
||||||
obj-y += syslib.o
|
obj-y += syslib.o
|
||||||
|
|
||||||
ifneq ($(CONFIG_AM43XX)$(CONFIG_AM33XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX)$(CONFIG_TEGRA)$(CONFIG_MX6)$(CONFIG_TI81XX)$(CONFIG_AT91FAMILY)$(CONFIG_SUNXI),)
|
ifneq ($(CONFIG_AM43XX)$(CONFIG_AM33XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX)$(CONFIG_TEGRA)$(CONFIG_MX6)$(CONFIG_TI81XX)$(CONFIG_AT91FAMILY)$(CONFIG_SUNXI)$(CONFIG_SOCFPGA),)
|
||||||
ifneq ($(CONFIG_SKIP_LOWLEVEL_INIT),y)
|
ifneq ($(CONFIG_SKIP_LOWLEVEL_INIT),y)
|
||||||
obj-y += lowlevel_init.o
|
obj-y += lowlevel_init.o
|
||||||
endif
|
endif
|
||||||
|
@ -56,4 +56,3 @@ obj-$(if $(filter stv0991,$(SOC)),y) += stv0991/
|
||||||
obj-$(CONFIG_ARCH_SUNXI) += sunxi/
|
obj-$(CONFIG_ARCH_SUNXI) += sunxi/
|
||||||
obj-$(CONFIG_U8500) += u8500/
|
obj-$(CONFIG_U8500) += u8500/
|
||||||
obj-$(CONFIG_VF610) += vf610/
|
obj-$(CONFIG_VF610) += vf610/
|
||||||
obj-$(CONFIG_ZYNQ) += zynq/
|
|
||||||
|
|
|
@ -65,19 +65,7 @@ endchoice
|
||||||
config SYS_SOC
|
config SYS_SOC
|
||||||
default "exynos"
|
default "exynos"
|
||||||
|
|
||||||
config DM
|
config DM_USB
|
||||||
default y
|
|
||||||
|
|
||||||
config DM_SERIAL
|
|
||||||
default y
|
|
||||||
|
|
||||||
config DM_SPI
|
|
||||||
default y
|
|
||||||
|
|
||||||
config DM_SPI_FLASH
|
|
||||||
default y
|
|
||||||
|
|
||||||
config DM_GPIO
|
|
||||||
default y
|
default y
|
||||||
|
|
||||||
source "board/samsung/smdkv310/Kconfig"
|
source "board/samsung/smdkv310/Kconfig"
|
||||||
|
|
|
@ -20,7 +20,7 @@ void get_sys_info(struct sys_info *sys_info)
|
||||||
{
|
{
|
||||||
struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||||
#ifdef CONFIG_FSL_IFC
|
#ifdef CONFIG_FSL_IFC
|
||||||
struct fsl_ifc *ifc_regs = (void *)CONFIG_SYS_IFC_ADDR;
|
struct fsl_ifc ifc_regs = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL};
|
||||||
u32 ccr;
|
u32 ccr;
|
||||||
#endif
|
#endif
|
||||||
struct ccsr_clk *clk = (void *)(CONFIG_SYS_FSL_LS1_CLK_ADDR);
|
struct ccsr_clk *clk = (void *)(CONFIG_SYS_FSL_LS1_CLK_ADDR);
|
||||||
|
@ -74,7 +74,7 @@ void get_sys_info(struct sys_info *sys_info)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_FSL_IFC)
|
#if defined(CONFIG_FSL_IFC)
|
||||||
ccr = in_be32(&ifc_regs->ifc_ccr);
|
ccr = in_be32(&ifc_regs.gregs->ifc_ccr);
|
||||||
ccr = ((ccr & IFC_CCR_CLK_DIV_MASK) >> IFC_CCR_CLK_DIV_SHIFT) + 1;
|
ccr = ((ccr & IFC_CCR_CLK_DIV_MASK) >> IFC_CCR_CLK_DIV_SHIFT) + 1;
|
||||||
|
|
||||||
sys_info->freq_localbus = sys_info->freq_systembus / ccr;
|
sys_info->freq_localbus = sys_info->freq_systembus / ccr;
|
||||||
|
|
|
@ -514,17 +514,21 @@ void mx6_dram_cfg(const struct mx6_ddr_sysinfo *sysinfo,
|
||||||
/* MR2 */
|
/* MR2 */
|
||||||
val = (sysinfo->rtt_wr & 3) << 9 | (ddr3_cfg->SRT & 1) << 7 |
|
val = (sysinfo->rtt_wr & 3) << 9 | (ddr3_cfg->SRT & 1) << 7 |
|
||||||
((tcwl - 3) & 3) << 3;
|
((tcwl - 3) & 3) << 3;
|
||||||
|
debug("MR2 CS%d: 0x%08x\n", cs, (u32)MR(val, 2, 3, cs));
|
||||||
mmdc0->mdscr = MR(val, 2, 3, cs);
|
mmdc0->mdscr = MR(val, 2, 3, cs);
|
||||||
/* MR3 */
|
/* MR3 */
|
||||||
|
debug("MR3 CS%d: 0x%08x\n", cs, (u32)MR(0, 3, 3, cs));
|
||||||
mmdc0->mdscr = MR(0, 3, 3, cs);
|
mmdc0->mdscr = MR(0, 3, 3, cs);
|
||||||
/* MR1 */
|
/* MR1 */
|
||||||
val = ((sysinfo->rtt_nom & 1) ? 1 : 0) << 2 |
|
val = ((sysinfo->rtt_nom & 1) ? 1 : 0) << 2 |
|
||||||
((sysinfo->rtt_nom & 2) ? 1 : 0) << 6;
|
((sysinfo->rtt_nom & 2) ? 1 : 0) << 6;
|
||||||
|
debug("MR1 CS%d: 0x%08x\n", cs, (u32)MR(val, 1, 3, cs));
|
||||||
mmdc0->mdscr = MR(val, 1, 3, cs);
|
mmdc0->mdscr = MR(val, 1, 3, cs);
|
||||||
/* MR0 */
|
/* MR0 */
|
||||||
val = ((tcl - 1) << 4) | /* CAS */
|
val = ((tcl - 1) << 4) | /* CAS */
|
||||||
(1 << 8) | /* DLL Reset */
|
(1 << 8) | /* DLL Reset */
|
||||||
((twr - 3) << 9); /* Write Recovery */
|
((twr - 3) << 9); /* Write Recovery */
|
||||||
|
debug("MR0 CS%d: 0x%08x\n", cs, (u32)MR(val, 0, 3, cs));
|
||||||
mmdc0->mdscr = MR(val, 0, 3, cs);
|
mmdc0->mdscr = MR(val, 0, 3, cs);
|
||||||
/* ZQ calibration */
|
/* ZQ calibration */
|
||||||
val = (1 << 10);
|
val = (1 << 10);
|
||||||
|
@ -535,10 +539,11 @@ void mx6_dram_cfg(const struct mx6_ddr_sysinfo *sysinfo,
|
||||||
mmdc0->mdpdc = (tcke & 0x7) << 16 |
|
mmdc0->mdpdc = (tcke & 0x7) << 16 |
|
||||||
5 << 12 | /* PWDT_1: 256 cycles */
|
5 << 12 | /* PWDT_1: 256 cycles */
|
||||||
5 << 8 | /* PWDT_0: 256 cycles */
|
5 << 8 | /* PWDT_0: 256 cycles */
|
||||||
1 << 7 | /* SLOW_PD */
|
|
||||||
1 << 6 | /* BOTH_CS_PD */
|
1 << 6 | /* BOTH_CS_PD */
|
||||||
(tcksrx & 0x7) << 3 |
|
(tcksrx & 0x7) << 3 |
|
||||||
(tcksre & 0x7);
|
(tcksre & 0x7);
|
||||||
|
if (!sysinfo->pd_fast_exit)
|
||||||
|
mmdc0->mdpdc |= (1 << 7); /* SLOW_PD */
|
||||||
mmdc0->mapsr = 0x00001006; /* ADOPT power down enabled */
|
mmdc0->mapsr = 0x00001006; /* ADOPT power down enabled */
|
||||||
|
|
||||||
/* Step 11: Configure ZQ calibration: one-time and periodic 1ms */
|
/* Step 11: Configure ZQ calibration: one-time and periodic 1ms */
|
||||||
|
|
|
@ -159,6 +159,16 @@ void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
|
||||||
#ifdef CONFIG_SCSI_AHCI_PLAT
|
#ifdef CONFIG_SCSI_AHCI_PLAT
|
||||||
void arch_preboot_os(void)
|
void arch_preboot_os(void)
|
||||||
{
|
{
|
||||||
ahci_reset(DWC_AHSATA_BASE);
|
ahci_reset((void __iomem *)DWC_AHSATA_BASE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_CMD_FASTBOOT) && !defined(CONFIG_ENV_IS_NOWHERE)
|
||||||
|
int fb_set_reboot_flag(void)
|
||||||
|
{
|
||||||
|
printf("Setting reboot to fastboot flag ...\n");
|
||||||
|
setenv("dofastboot", "1");
|
||||||
|
saveenv();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -69,7 +69,7 @@ int init_sata(int dev)
|
||||||
val = TI_SATA_IDLE_NO | TI_SATA_STANDBY_NO;
|
val = TI_SATA_IDLE_NO | TI_SATA_STANDBY_NO;
|
||||||
writel(val, TI_SATA_WRAPPER_BASE + TI_SATA_SYSCONFIG);
|
writel(val, TI_SATA_WRAPPER_BASE + TI_SATA_SYSCONFIG);
|
||||||
|
|
||||||
ret = ahci_init(DWC_AHSATA_BASE);
|
ret = ahci_init((void __iomem *)DWC_AHSATA_BASE);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -88,6 +88,6 @@ void scsi_init(void)
|
||||||
|
|
||||||
void scsi_bus_reset(void)
|
void scsi_bus_reset(void)
|
||||||
{
|
{
|
||||||
ahci_reset(DWC_AHSATA_BASE);
|
ahci_reset((void __iomem *)DWC_AHSATA_BASE);
|
||||||
ahci_init(DWC_AHSATA_BASE);
|
ahci_init((void __iomem *)DWC_AHSATA_BASE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,3 +60,16 @@ void __weak usb_fake_mac_from_die_id(u32 *id)
|
||||||
eth_setenv_enetaddr("usbethaddr", device_mac);
|
eth_setenv_enetaddr("usbethaddr", device_mac);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __weak usb_set_serial_num_from_die_id(u32 *id)
|
||||||
|
{
|
||||||
|
char serialno[72];
|
||||||
|
uint32_t serialno_lo, serialno_hi;
|
||||||
|
|
||||||
|
if (!getenv("serial#")) {
|
||||||
|
serialno_hi = id[0];
|
||||||
|
serialno_lo = id[1];
|
||||||
|
sprintf(serialno, "%08x%08x", serialno_hi, serialno_lo);
|
||||||
|
setenv("serial#", serialno);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -17,6 +17,9 @@ config TARGET_OMAP3_SDP3430
|
||||||
config TARGET_OMAP3_BEAGLE
|
config TARGET_OMAP3_BEAGLE
|
||||||
bool "TI OMAP3 BeagleBoard"
|
bool "TI OMAP3 BeagleBoard"
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config TARGET_CM_T35
|
config TARGET_CM_T35
|
||||||
bool "CompuLab CM-T3530 and CM-T3730 boards"
|
bool "CompuLab CM-T3530 and CM-T3730 boards"
|
||||||
|
@ -28,6 +31,9 @@ config TARGET_CM_T3517
|
||||||
config TARGET_DEVKIT8000
|
config TARGET_DEVKIT8000
|
||||||
bool "TimLL OMAP3 Devkit8000"
|
bool "TimLL OMAP3 Devkit8000"
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config TARGET_OMAP3_EVM
|
config TARGET_OMAP3_EVM
|
||||||
bool "TI OMAP3 EVM"
|
bool "TI OMAP3 EVM"
|
||||||
|
@ -44,13 +50,22 @@ config TARGET_OMAP3_EVM_QUICK_NAND
|
||||||
config TARGET_OMAP3_IGEP00X0
|
config TARGET_OMAP3_IGEP00X0
|
||||||
bool "IGEP"
|
bool "IGEP"
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config TARGET_OMAP3_OVERO
|
config TARGET_OMAP3_OVERO
|
||||||
bool "OMAP35xx Gumstix Overo"
|
bool "OMAP35xx Gumstix Overo"
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config TARGET_OMAP3_ZOOM1
|
config TARGET_OMAP3_ZOOM1
|
||||||
bool "TI Zoom1"
|
bool "TI Zoom1"
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config TARGET_AM3517_CRANE
|
config TARGET_AM3517_CRANE
|
||||||
bool "am3517_crane"
|
bool "am3517_crane"
|
||||||
|
@ -94,18 +109,12 @@ config TARGET_TWISTER
|
||||||
config TARGET_OMAP3_CAIRO
|
config TARGET_OMAP3_CAIRO
|
||||||
bool "QUIPOS CAIRO"
|
bool "QUIPOS CAIRO"
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
config DM
|
|
||||||
default y
|
|
||||||
|
|
||||||
config DM_GPIO
|
|
||||||
default y if DM
|
|
||||||
|
|
||||||
config DM_SERIAL
|
|
||||||
default y if DM
|
|
||||||
|
|
||||||
config SYS_SOC
|
config SYS_SOC
|
||||||
default "omap3"
|
default "omap3"
|
||||||
|
|
||||||
|
|
|
@ -460,7 +460,7 @@ void enable_basic_clocks(void)
|
||||||
(*prcm)->cm_l4per_gpio6_clkctrl,
|
(*prcm)->cm_l4per_gpio6_clkctrl,
|
||||||
(*prcm)->cm_l4per_gpio7_clkctrl,
|
(*prcm)->cm_l4per_gpio7_clkctrl,
|
||||||
(*prcm)->cm_l4per_gpio8_clkctrl,
|
(*prcm)->cm_l4per_gpio8_clkctrl,
|
||||||
#ifdef CONFIG_USB_DWC3
|
#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
|
||||||
(*prcm)->cm_l3init_ocp2scp1_clkctrl,
|
(*prcm)->cm_l3init_ocp2scp1_clkctrl,
|
||||||
(*prcm)->cm_l3init_usb_otg_ss1_clkctrl,
|
(*prcm)->cm_l3init_usb_otg_ss1_clkctrl,
|
||||||
#endif
|
#endif
|
||||||
|
@ -495,7 +495,7 @@ void enable_basic_clocks(void)
|
||||||
setbits_le32((*prcm)->cm_l3init_hsmmc2_clkctrl,
|
setbits_le32((*prcm)->cm_l3init_hsmmc2_clkctrl,
|
||||||
HSMMC_CLKCTRL_CLKSEL_MASK);
|
HSMMC_CLKCTRL_CLKSEL_MASK);
|
||||||
|
|
||||||
#ifdef CONFIG_USB_DWC3
|
#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
|
||||||
/* Enable 960 MHz clock for dwc3 */
|
/* Enable 960 MHz clock for dwc3 */
|
||||||
setbits_le32((*prcm)->cm_l3init_usb_otg_ss1_clkctrl,
|
setbits_le32((*prcm)->cm_l3init_usb_otg_ss1_clkctrl,
|
||||||
OPTFCLKEN_REFCLK960M);
|
OPTFCLKEN_REFCLK960M);
|
||||||
|
|
|
@ -440,6 +440,10 @@ struct omap_sys_ctrl_regs const dra7xx_ctrl = {
|
||||||
.control_emif1_sdram_config_ext = 0x4AE0C144,
|
.control_emif1_sdram_config_ext = 0x4AE0C144,
|
||||||
.control_emif2_sdram_config_ext = 0x4AE0C148,
|
.control_emif2_sdram_config_ext = 0x4AE0C148,
|
||||||
.control_wkup_ldovbb_mpu_voltage_ctrl = 0x4AE0C158,
|
.control_wkup_ldovbb_mpu_voltage_ctrl = 0x4AE0C158,
|
||||||
|
.control_std_fuse_die_id_0 = 0x4AE0C200,
|
||||||
|
.control_std_fuse_die_id_1 = 0x4AE0C208,
|
||||||
|
.control_std_fuse_die_id_2 = 0x4AE0C20C,
|
||||||
|
.control_std_fuse_die_id_3 = 0x4AE0C210,
|
||||||
.control_padconf_mode = 0x4AE0C5A0,
|
.control_padconf_mode = 0x4AE0C5A0,
|
||||||
.control_xtal_oscillator = 0x4AE0C5A4,
|
.control_xtal_oscillator = 0x4AE0C5A4,
|
||||||
.control_i2c_2 = 0x4AE0C5A8,
|
.control_i2c_2 = 0x4AE0C5A8,
|
||||||
|
|
|
@ -8,24 +8,36 @@ config TARGET_ARMADILLO_800EVA
|
||||||
|
|
||||||
config TARGET_GOSE
|
config TARGET_GOSE
|
||||||
bool "Gose board"
|
bool "Gose board"
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
|
||||||
config TARGET_KOELSCH
|
config TARGET_KOELSCH
|
||||||
bool "Koelsch board"
|
bool "Koelsch board"
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
|
||||||
config TARGET_LAGER
|
config TARGET_LAGER
|
||||||
bool "Lager board"
|
bool "Lager board"
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
|
||||||
config TARGET_KZM9G
|
config TARGET_KZM9G
|
||||||
bool "KZM9D board"
|
bool "KZM9D board"
|
||||||
|
|
||||||
config TARGET_ALT
|
config TARGET_ALT
|
||||||
bool "Alt board"
|
bool "Alt board"
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
|
||||||
config TARGET_SILK
|
config TARGET_SILK
|
||||||
bool "Silk board"
|
bool "Silk board"
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
|
||||||
config TARGET_PORTER
|
config TARGET_PORTER
|
||||||
bool "Porter board"
|
bool "Porter board"
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0+
|
# SPDX-License-Identifier: GPL-2.0+
|
||||||
#
|
#
|
||||||
|
|
||||||
obj-y := lowlevel_init.o
|
|
||||||
obj-y += misc.o timer.o reset_manager.o system_manager.o clock_manager.o \
|
obj-y += misc.o timer.o reset_manager.o system_manager.o clock_manager.o \
|
||||||
fpga_manager.o
|
fpga_manager.o
|
||||||
obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o scan_manager.o
|
obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o scan_manager.o
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2012 Altera Corporation <www.altera.com>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
/* Set up the platform, once the cpu has been initialized */
|
|
||||||
.globl lowlevel_init
|
|
||||||
lowlevel_init:
|
|
||||||
|
|
||||||
/* Remap */
|
|
||||||
#ifdef CONFIG_SPL_BUILD
|
|
||||||
/*
|
|
||||||
* SPL : configure the remap (L3 NIC-301 GPV)
|
|
||||||
* so the on-chip RAM at lower memory instead ROM.
|
|
||||||
*/
|
|
||||||
ldr r0, =SOCFPGA_L3REGS_ADDRESS
|
|
||||||
mov r1, #0x19
|
|
||||||
str r1, [r0]
|
|
||||||
#else
|
|
||||||
/*
|
|
||||||
* U-Boot : configure the remap (L3 NIC-301 GPV)
|
|
||||||
* so the SDRAM at lower memory instead on-chip RAM.
|
|
||||||
*/
|
|
||||||
ldr r0, =SOCFPGA_L3REGS_ADDRESS
|
|
||||||
mov r1, #0x2
|
|
||||||
str r1, [r0]
|
|
||||||
|
|
||||||
/* Private components security */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* U-Boot : configure private timer, global timer and cpu
|
|
||||||
* component access as non secure for kernel stage (as required
|
|
||||||
* by kernel)
|
|
||||||
*/
|
|
||||||
mrc p15,4,r0,c15,c0,0
|
|
||||||
add r1, r0, #0x54
|
|
||||||
ldr r2, [r1]
|
|
||||||
orr r2, r2, #0xff
|
|
||||||
orr r2, r2, #0xf00
|
|
||||||
str r2, [r1]
|
|
||||||
#endif /* #ifdef CONFIG_SPL_BUILD */
|
|
||||||
mov pc, lr
|
|
|
@ -49,7 +49,7 @@ void enable_caches(void)
|
||||||
/*
|
/*
|
||||||
* DesignWare Ethernet initialization
|
* DesignWare Ethernet initialization
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_DESIGNWARE_ETH
|
#ifdef CONFIG_ETH_DESIGNWARE
|
||||||
int cpu_eth_init(bd_t *bis)
|
int cpu_eth_init(bd_t *bis)
|
||||||
{
|
{
|
||||||
#if CONFIG_EMAC_BASE == SOCFPGA_EMAC0_ADDRESS
|
#if CONFIG_EMAC_BASE == SOCFPGA_EMAC0_ADDRESS
|
||||||
|
|
|
@ -113,3 +113,27 @@ void socfpga_spim_enable(void)
|
||||||
clrbits_le32(reset, (1 << RSTMGR_PERMODRST_SPIM0_LSB) |
|
clrbits_le32(reset, (1 << RSTMGR_PERMODRST_SPIM0_LSB) |
|
||||||
(1 << RSTMGR_PERMODRST_SPIM1_LSB));
|
(1 << RSTMGR_PERMODRST_SPIM1_LSB));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Bring UART0 out of reset. */
|
||||||
|
void socfpga_uart0_enable(void)
|
||||||
|
{
|
||||||
|
const void *reset = &reset_manager_base->per_mod_reset;
|
||||||
|
|
||||||
|
clrbits_le32(reset, 1 << RSTMGR_PERMODRST_UART0_LSB);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bring SDRAM controller out of reset. */
|
||||||
|
void socfpga_sdram_enable(void)
|
||||||
|
{
|
||||||
|
const void *reset = &reset_manager_base->per_mod_reset;
|
||||||
|
|
||||||
|
clrbits_le32(reset, 1 << RSTMGR_PERMODRST_SDR_LSB);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bring OSC1 timer out of reset. */
|
||||||
|
void socfpga_osc1timer_enable(void)
|
||||||
|
{
|
||||||
|
const void *reset = &reset_manager_base->per_mod_reset;
|
||||||
|
|
||||||
|
clrbits_le32(reset, 1 << RSTMGR_PERMODRST_OSC1TIMER0_LSB);
|
||||||
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
#include <asm/pl310.h>
|
||||||
#include <asm/u-boot.h>
|
#include <asm/u-boot.h>
|
||||||
#include <asm/utils.h>
|
#include <asm/utils.h>
|
||||||
#include <image.h>
|
#include <image.h>
|
||||||
|
@ -15,9 +16,13 @@
|
||||||
#include <asm/arch/freeze_controller.h>
|
#include <asm/arch/freeze_controller.h>
|
||||||
#include <asm/arch/clock_manager.h>
|
#include <asm/arch/clock_manager.h>
|
||||||
#include <asm/arch/scan_manager.h>
|
#include <asm/arch/scan_manager.h>
|
||||||
|
#include <asm/arch/sdram.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
static struct pl310_regs *const pl310 =
|
||||||
|
(struct pl310_regs *)CONFIG_SYS_PL310_BASE;
|
||||||
|
|
||||||
#define MAIN_VCO_BASE ( \
|
#define MAIN_VCO_BASE ( \
|
||||||
(CONFIG_HPS_MAINPLLGRP_VCO_DENOM << \
|
(CONFIG_HPS_MAINPLLGRP_VCO_DENOM << \
|
||||||
CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET) | \
|
CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET) | \
|
||||||
|
@ -43,6 +48,31 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||||
CLKMGR_SDRPLLGRP_VCO_NUMER_OFFSET) \
|
CLKMGR_SDRPLLGRP_VCO_NUMER_OFFSET) \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
void board_init_f(ulong dummy)
|
||||||
|
{
|
||||||
|
struct socfpga_system_manager *sysmgr_regs =
|
||||||
|
(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
|
||||||
|
unsigned long reg;
|
||||||
|
/*
|
||||||
|
* First C code to run. Clear fake OCRAM ECC first as SBE
|
||||||
|
* and DBE might triggered during power on
|
||||||
|
*/
|
||||||
|
reg = readl(&sysmgr_regs->eccgrp_ocram);
|
||||||
|
if (reg & SYSMGR_ECC_OCRAM_SERR)
|
||||||
|
writel(SYSMGR_ECC_OCRAM_SERR | SYSMGR_ECC_OCRAM_EN,
|
||||||
|
&sysmgr_regs->eccgrp_ocram);
|
||||||
|
if (reg & SYSMGR_ECC_OCRAM_DERR)
|
||||||
|
writel(SYSMGR_ECC_OCRAM_DERR | SYSMGR_ECC_OCRAM_EN,
|
||||||
|
&sysmgr_regs->eccgrp_ocram);
|
||||||
|
|
||||||
|
memset(__bss_start, 0, __bss_end - __bss_start);
|
||||||
|
|
||||||
|
/* Remap SDRAM to 0x0 */
|
||||||
|
writel(0x1, &pl310->pl310_addr_filter_start);
|
||||||
|
|
||||||
|
board_init_r(NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
u32 spl_boot_device(void)
|
u32 spl_boot_device(void)
|
||||||
{
|
{
|
||||||
return BOOT_DEVICE_RAM;
|
return BOOT_DEVICE_RAM;
|
||||||
|
@ -53,6 +83,7 @@ u32 spl_boot_device(void)
|
||||||
*/
|
*/
|
||||||
void spl_board_init(void)
|
void spl_board_init(void)
|
||||||
{
|
{
|
||||||
|
unsigned long sdram_size;
|
||||||
#ifndef CONFIG_SOCFPGA_VIRTUAL_TARGET
|
#ifndef CONFIG_SOCFPGA_VIRTUAL_TARGET
|
||||||
cm_config_t cm_default_cfg = {
|
cm_config_t cm_default_cfg = {
|
||||||
/* main group */
|
/* main group */
|
||||||
|
@ -144,10 +175,19 @@ void spl_board_init(void)
|
||||||
/* freeze all IO banks */
|
/* freeze all IO banks */
|
||||||
sys_mgr_frzctrl_freeze_req();
|
sys_mgr_frzctrl_freeze_req();
|
||||||
|
|
||||||
|
socfpga_sdram_enable();
|
||||||
|
socfpga_uart0_enable();
|
||||||
|
socfpga_osc1timer_enable();
|
||||||
|
|
||||||
|
timer_init();
|
||||||
|
|
||||||
debug("Reconfigure Clock Manager\n");
|
debug("Reconfigure Clock Manager\n");
|
||||||
/* reconfigure the PLLs */
|
/* reconfigure the PLLs */
|
||||||
cm_basic_init(&cm_default_cfg);
|
cm_basic_init(&cm_default_cfg);
|
||||||
|
|
||||||
|
/* Enable bootrom to configure IOs. */
|
||||||
|
sysmgr_enable_warmrstcfgio();
|
||||||
|
|
||||||
/* configure the IOCSR / IO buffer settings */
|
/* configure the IOCSR / IO buffer settings */
|
||||||
if (scan_mgr_configure_iocsr())
|
if (scan_mgr_configure_iocsr())
|
||||||
hang();
|
hang();
|
||||||
|
@ -165,4 +205,25 @@ void spl_board_init(void)
|
||||||
|
|
||||||
/* enable console uart printing */
|
/* enable console uart printing */
|
||||||
preloader_console_init();
|
preloader_console_init();
|
||||||
|
|
||||||
|
if (sdram_mmr_init_full(0xffffffff) != 0) {
|
||||||
|
puts("SDRAM init failed.\n");
|
||||||
|
hang();
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("SDRAM: Calibrating PHY\n");
|
||||||
|
/* SDRAM calibration */
|
||||||
|
if (sdram_calibration_full() == 0) {
|
||||||
|
puts("SDRAM calibration failed.\n");
|
||||||
|
hang();
|
||||||
|
}
|
||||||
|
|
||||||
|
sdram_size = sdram_calculate_size();
|
||||||
|
debug("SDRAM: %ld MiB\n", sdram_size >> 20);
|
||||||
|
|
||||||
|
/* Sanity check ensure correct SDRAM size specified */
|
||||||
|
if (get_ram_size(0, sdram_size) != sdram_size) {
|
||||||
|
puts("SDRAM size check failed!\n");
|
||||||
|
hang();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,3 +66,12 @@ void sysmgr_pinmux_init(void)
|
||||||
|
|
||||||
populate_sysmgr_fpgaintf_module();
|
populate_sysmgr_fpgaintf_module();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This bit allows the bootrom to configure the IOs after a warm reset.
|
||||||
|
*/
|
||||||
|
void sysmgr_enable_warmrstcfgio(void)
|
||||||
|
{
|
||||||
|
setbits_le32(&sysmgr_regs->romcodegrp_ctrl,
|
||||||
|
SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO);
|
||||||
|
}
|
||||||
|
|
|
@ -46,28 +46,33 @@ static int gpio_init(void)
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(22), SUNXI_GPIO_INPUT);
|
sunxi_gpio_set_cfgpin(SUNXI_GPB(22), SUNXI_GPIO_INPUT);
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(23), SUNXI_GPIO_INPUT);
|
sunxi_gpio_set_cfgpin(SUNXI_GPB(23), SUNXI_GPIO_INPUT);
|
||||||
#endif
|
#endif
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPF(2), SUNXI_GPF2_UART0_TX);
|
#if defined(CONFIG_MACH_SUN8I)
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPF(4), SUNXI_GPF4_UART0_RX);
|
sunxi_gpio_set_cfgpin(SUNXI_GPF(2), SUN8I_GPF_UART0_TX);
|
||||||
|
sunxi_gpio_set_cfgpin(SUNXI_GPF(4), SUN8I_GPF_UART0_RX);
|
||||||
|
#else
|
||||||
|
sunxi_gpio_set_cfgpin(SUNXI_GPF(2), SUNXI_GPF_UART0_TX);
|
||||||
|
sunxi_gpio_set_cfgpin(SUNXI_GPF(4), SUNXI_GPF_UART0_RX);
|
||||||
|
#endif
|
||||||
sunxi_gpio_set_pull(SUNXI_GPF(4), 1);
|
sunxi_gpio_set_pull(SUNXI_GPF(4), 1);
|
||||||
#elif CONFIG_CONS_INDEX == 1 && (defined(CONFIG_MACH_SUN4I) || defined(CONFIG_MACH_SUN7I))
|
#elif CONFIG_CONS_INDEX == 1 && (defined(CONFIG_MACH_SUN4I) || defined(CONFIG_MACH_SUN7I))
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(22), SUN4I_GPB22_UART0_TX);
|
sunxi_gpio_set_cfgpin(SUNXI_GPB(22), SUN4I_GPB_UART0);
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(23), SUN4I_GPB23_UART0_RX);
|
sunxi_gpio_set_cfgpin(SUNXI_GPB(23), SUN4I_GPB_UART0);
|
||||||
sunxi_gpio_set_pull(SUNXI_GPB(23), SUNXI_GPIO_PULL_UP);
|
sunxi_gpio_set_pull(SUNXI_GPB(23), SUNXI_GPIO_PULL_UP);
|
||||||
#elif CONFIG_CONS_INDEX == 1 && defined(CONFIG_MACH_SUN5I)
|
#elif CONFIG_CONS_INDEX == 1 && defined(CONFIG_MACH_SUN5I)
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(19), SUN5I_GPB19_UART0_TX);
|
sunxi_gpio_set_cfgpin(SUNXI_GPB(19), SUN5I_GPB_UART0);
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(20), SUN5I_GPB20_UART0_RX);
|
sunxi_gpio_set_cfgpin(SUNXI_GPB(20), SUN5I_GPB_UART0);
|
||||||
sunxi_gpio_set_pull(SUNXI_GPB(20), SUNXI_GPIO_PULL_UP);
|
sunxi_gpio_set_pull(SUNXI_GPB(20), SUNXI_GPIO_PULL_UP);
|
||||||
#elif CONFIG_CONS_INDEX == 1 && defined(CONFIG_MACH_SUN6I)
|
#elif CONFIG_CONS_INDEX == 1 && defined(CONFIG_MACH_SUN6I)
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPH(20), SUN6I_GPH20_UART0_TX);
|
sunxi_gpio_set_cfgpin(SUNXI_GPH(20), SUN6I_GPH_UART0);
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPH(21), SUN6I_GPH21_UART0_RX);
|
sunxi_gpio_set_cfgpin(SUNXI_GPH(21), SUN6I_GPH_UART0);
|
||||||
sunxi_gpio_set_pull(SUNXI_GPH(21), SUNXI_GPIO_PULL_UP);
|
sunxi_gpio_set_pull(SUNXI_GPH(21), SUNXI_GPIO_PULL_UP);
|
||||||
#elif CONFIG_CONS_INDEX == 2 && defined(CONFIG_MACH_SUN5I)
|
#elif CONFIG_CONS_INDEX == 2 && defined(CONFIG_MACH_SUN5I)
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPG(3), SUN5I_GPG3_UART1_TX);
|
sunxi_gpio_set_cfgpin(SUNXI_GPG(3), SUN5I_GPG_UART1);
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPG(4), SUN5I_GPG4_UART1_RX);
|
sunxi_gpio_set_cfgpin(SUNXI_GPG(4), SUN5I_GPG_UART1);
|
||||||
sunxi_gpio_set_pull(SUNXI_GPG(4), SUNXI_GPIO_PULL_UP);
|
sunxi_gpio_set_pull(SUNXI_GPG(4), SUNXI_GPIO_PULL_UP);
|
||||||
#elif CONFIG_CONS_INDEX == 5 && defined(CONFIG_MACH_SUN8I)
|
#elif CONFIG_CONS_INDEX == 5 && defined(CONFIG_MACH_SUN8I)
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPL(2), SUN8I_GPL2_R_UART_TX);
|
sunxi_gpio_set_cfgpin(SUNXI_GPL(2), SUN8I_GPL_R_UART);
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPL(3), SUN8I_GPL3_R_UART_RX);
|
sunxi_gpio_set_cfgpin(SUNXI_GPL(3), SUN8I_GPL_R_UART);
|
||||||
sunxi_gpio_set_pull(SUNXI_GPL(3), SUNXI_GPIO_PULL_UP);
|
sunxi_gpio_set_pull(SUNXI_GPL(3), SUNXI_GPIO_PULL_UP);
|
||||||
#else
|
#else
|
||||||
#error Unsupported console port number. Please fix pin mux settings in board.c
|
#error Unsupported console port number. Please fix pin mux settings in board.c
|
||||||
|
|
|
@ -21,15 +21,15 @@ static int rsb_set_device_mode(void);
|
||||||
static void rsb_cfg_io(void)
|
static void rsb_cfg_io(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_MACH_SUN8I
|
#ifdef CONFIG_MACH_SUN8I
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPL(0), SUN8I_GPL0_R_RSB_SCK);
|
sunxi_gpio_set_cfgpin(SUNXI_GPL(0), SUN8I_GPL_R_RSB);
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPL(1), SUN8I_GPL1_R_RSB_SDA);
|
sunxi_gpio_set_cfgpin(SUNXI_GPL(1), SUN8I_GPL_R_RSB);
|
||||||
sunxi_gpio_set_pull(SUNXI_GPL(0), 1);
|
sunxi_gpio_set_pull(SUNXI_GPL(0), 1);
|
||||||
sunxi_gpio_set_pull(SUNXI_GPL(1), 1);
|
sunxi_gpio_set_pull(SUNXI_GPL(1), 1);
|
||||||
sunxi_gpio_set_drv(SUNXI_GPL(0), 2);
|
sunxi_gpio_set_drv(SUNXI_GPL(0), 2);
|
||||||
sunxi_gpio_set_drv(SUNXI_GPL(1), 2);
|
sunxi_gpio_set_drv(SUNXI_GPL(1), 2);
|
||||||
#elif defined CONFIG_MACH_SUN9I
|
#elif defined CONFIG_MACH_SUN9I
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPN(0), SUN9I_GPN0_R_RSB_SCK);
|
sunxi_gpio_set_cfgpin(SUNXI_GPN(0), SUN9I_GPN_R_RSB);
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPN(1), SUN9I_GPN1_R_RSB_SDA);
|
sunxi_gpio_set_cfgpin(SUNXI_GPN(1), SUN9I_GPN_R_RSB);
|
||||||
sunxi_gpio_set_pull(SUNXI_GPN(0), 1);
|
sunxi_gpio_set_pull(SUNXI_GPN(0), 1);
|
||||||
sunxi_gpio_set_pull(SUNXI_GPN(1), 1);
|
sunxi_gpio_set_pull(SUNXI_GPN(1), 1);
|
||||||
sunxi_gpio_set_drv(SUNXI_GPN(0), 2);
|
sunxi_gpio_set_drv(SUNXI_GPN(0), 2);
|
||||||
|
|
|
@ -41,6 +41,7 @@ static struct sunxi_usbc_hcd {
|
||||||
int usb_rst_mask;
|
int usb_rst_mask;
|
||||||
int ahb_clk_mask;
|
int ahb_clk_mask;
|
||||||
int gpio_vbus;
|
int gpio_vbus;
|
||||||
|
int gpio_vbus_det;
|
||||||
int irq;
|
int irq;
|
||||||
int id;
|
int id;
|
||||||
} sunxi_usbc_hcd[] = {
|
} sunxi_usbc_hcd[] = {
|
||||||
|
@ -80,12 +81,6 @@ static struct sunxi_usbc_hcd {
|
||||||
|
|
||||||
static int enabled_hcd_count;
|
static int enabled_hcd_count;
|
||||||
|
|
||||||
static bool use_axp_drivebus(int index)
|
|
||||||
{
|
|
||||||
return index == 0 &&
|
|
||||||
strcmp(CONFIG_USB0_VBUS_PIN, "axp_drivebus") == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *sunxi_usbc_get_io_base(int index)
|
void *sunxi_usbc_get_io_base(int index)
|
||||||
{
|
{
|
||||||
switch (index) {
|
switch (index) {
|
||||||
|
@ -102,9 +97,6 @@ void *sunxi_usbc_get_io_base(int index)
|
||||||
|
|
||||||
static int get_vbus_gpio(int index)
|
static int get_vbus_gpio(int index)
|
||||||
{
|
{
|
||||||
if (use_axp_drivebus(index))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
switch (index) {
|
switch (index) {
|
||||||
case 0: return sunxi_name_to_gpio(CONFIG_USB0_VBUS_PIN);
|
case 0: return sunxi_name_to_gpio(CONFIG_USB0_VBUS_PIN);
|
||||||
case 1: return sunxi_name_to_gpio(CONFIG_USB1_VBUS_PIN);
|
case 1: return sunxi_name_to_gpio(CONFIG_USB1_VBUS_PIN);
|
||||||
|
@ -113,6 +105,14 @@ static int get_vbus_gpio(int index)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_vbus_detect_gpio(int index)
|
||||||
|
{
|
||||||
|
switch (index) {
|
||||||
|
case 0: return sunxi_name_to_gpio(CONFIG_USB0_VBUS_DET);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
static void usb_phy_write(struct sunxi_usbc_hcd *sunxi_usbc, int addr,
|
static void usb_phy_write(struct sunxi_usbc_hcd *sunxi_usbc, int addr,
|
||||||
int data, int len)
|
int data, int len)
|
||||||
{
|
{
|
||||||
|
@ -192,22 +192,35 @@ void sunxi_usbc_enable_squelch_detect(int index, int enable)
|
||||||
int sunxi_usbc_request_resources(int index)
|
int sunxi_usbc_request_resources(int index)
|
||||||
{
|
{
|
||||||
struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
|
struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
sunxi_usbc->gpio_vbus = get_vbus_gpio(index);
|
sunxi_usbc->gpio_vbus = get_vbus_gpio(index);
|
||||||
if (sunxi_usbc->gpio_vbus != -1)
|
if (sunxi_usbc->gpio_vbus != -1) {
|
||||||
return gpio_request(sunxi_usbc->gpio_vbus, "usbc_vbus");
|
ret |= gpio_request(sunxi_usbc->gpio_vbus, "usbc_vbus");
|
||||||
|
ret |= gpio_direction_output(sunxi_usbc->gpio_vbus, 0);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
sunxi_usbc->gpio_vbus_det = get_vbus_detect_gpio(index);
|
||||||
|
if (sunxi_usbc->gpio_vbus_det != -1) {
|
||||||
|
ret |= gpio_request(sunxi_usbc->gpio_vbus_det, "usbc_vbus_det");
|
||||||
|
ret |= gpio_direction_input(sunxi_usbc->gpio_vbus_det);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sunxi_usbc_free_resources(int index)
|
int sunxi_usbc_free_resources(int index)
|
||||||
{
|
{
|
||||||
struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
|
struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
if (sunxi_usbc->gpio_vbus != -1)
|
if (sunxi_usbc->gpio_vbus != -1)
|
||||||
return gpio_free(sunxi_usbc->gpio_vbus);
|
ret |= gpio_free(sunxi_usbc->gpio_vbus);
|
||||||
|
|
||||||
return 0;
|
if (sunxi_usbc->gpio_vbus_det != -1)
|
||||||
|
ret |= gpio_free(sunxi_usbc->gpio_vbus_det);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sunxi_usbc_enable(int index)
|
void sunxi_usbc_enable(int index)
|
||||||
|
@ -258,22 +271,38 @@ void sunxi_usbc_vbus_enable(int index)
|
||||||
{
|
{
|
||||||
struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
|
struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
|
||||||
|
|
||||||
#ifdef AXP_DRIVEBUS
|
|
||||||
if (use_axp_drivebus(index))
|
|
||||||
axp_drivebus_enable();
|
|
||||||
#endif
|
|
||||||
if (sunxi_usbc->gpio_vbus != -1)
|
if (sunxi_usbc->gpio_vbus != -1)
|
||||||
gpio_direction_output(sunxi_usbc->gpio_vbus, 1);
|
gpio_set_value(sunxi_usbc->gpio_vbus, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sunxi_usbc_vbus_disable(int index)
|
void sunxi_usbc_vbus_disable(int index)
|
||||||
{
|
{
|
||||||
struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
|
struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
|
||||||
|
|
||||||
#ifdef AXP_DRIVEBUS
|
|
||||||
if (use_axp_drivebus(index))
|
|
||||||
axp_drivebus_disable();
|
|
||||||
#endif
|
|
||||||
if (sunxi_usbc->gpio_vbus != -1)
|
if (sunxi_usbc->gpio_vbus != -1)
|
||||||
gpio_direction_output(sunxi_usbc->gpio_vbus, 0);
|
gpio_set_value(sunxi_usbc->gpio_vbus, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int sunxi_usbc_vbus_detect(int index)
|
||||||
|
{
|
||||||
|
struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
|
||||||
|
int err, retries = 3;
|
||||||
|
|
||||||
|
if (sunxi_usbc->gpio_vbus_det == -1) {
|
||||||
|
eprintf("Error: invalid vbus detection pin\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gpio_get_value(sunxi_usbc->gpio_vbus_det);
|
||||||
|
/*
|
||||||
|
* Vbus may have been provided by the board and just been turned of
|
||||||
|
* some milliseconds ago on reset, what we're measuring then is a
|
||||||
|
* residual charge on Vbus, sleep a bit and try again.
|
||||||
|
*/
|
||||||
|
while (err > 0 && retries--) {
|
||||||
|
mdelay(100);
|
||||||
|
err = gpio_get_value(sunxi_usbc->gpio_vbus_det);
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static char soc_type[] = "xx0";
|
||||||
|
|
||||||
#ifdef CONFIG_MXC_OCOTP
|
#ifdef CONFIG_MXC_OCOTP
|
||||||
void enable_ocotp_clk(unsigned char enable)
|
void enable_ocotp_clk(unsigned char enable)
|
||||||
{
|
{
|
||||||
|
@ -284,14 +286,37 @@ static char *get_reset_cause(void)
|
||||||
|
|
||||||
int print_cpuinfo(void)
|
int print_cpuinfo(void)
|
||||||
{
|
{
|
||||||
printf("CPU: Freescale Vybrid VF610 at %d MHz\n",
|
printf("CPU: Freescale Vybrid VF%s at %d MHz\n",
|
||||||
mxc_get_clock(MXC_ARM_CLK) / 1000000);
|
soc_type, mxc_get_clock(MXC_ARM_CLK) / 1000000);
|
||||||
printf("Reset cause: %s\n", get_reset_cause());
|
printf("Reset cause: %s\n", get_reset_cause());
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int arch_cpu_init(void)
|
||||||
|
{
|
||||||
|
struct mscm *mscm = (struct mscm *)MSCM_BASE_ADDR;
|
||||||
|
|
||||||
|
soc_type[0] = mscm->cpxcount ? '6' : '5'; /*Dual Core => VF6x0 */
|
||||||
|
soc_type[1] = mscm->cpxcfg1 ? '1' : '0'; /* L2 Cache => VFx10 */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_MISC_INIT
|
||||||
|
int arch_misc_init(void)
|
||||||
|
{
|
||||||
|
char soc[6];
|
||||||
|
|
||||||
|
strcat(soc, "vf");
|
||||||
|
strcat(soc, soc_type);
|
||||||
|
setenv("soc", soc);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int cpu_eth_init(bd_t *bis)
|
int cpu_eth_init(bd_t *bis)
|
||||||
{
|
{
|
||||||
int rc = -ENODEV;
|
int rc = -ENODEV;
|
||||||
|
@ -317,3 +342,19 @@ int get_clocks(void)
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_SYS_DCACHE_OFF
|
||||||
|
void enable_caches(void)
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_SYS_ARM_CACHE_WRITETHROUGH)
|
||||||
|
enum dcache_option option = DCACHE_WRITETHROUGH;
|
||||||
|
#else
|
||||||
|
enum dcache_option option = DCACHE_WRITEBACK;
|
||||||
|
#endif
|
||||||
|
dcache_enable();
|
||||||
|
icache_enable();
|
||||||
|
|
||||||
|
/* Enable caching on OCRAM */
|
||||||
|
mmu_set_region_dcache_behaviour(IRAM_BASE_ADDR, IRAM_SIZE, option);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
#
|
|
||||||
# Copyright (C) 2013 - 2015 Xilinx, Inc. All rights reserved.
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: GPL-2.0
|
|
||||||
#
|
|
||||||
# Allow NEON instructions (needed for lowlevel_init.S with GNU toolchain)
|
|
||||||
PLATFORM_RELFLAGS += -mfpu=neon
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
#
|
||||||
|
# (C) Copyright 2000-2006
|
||||||
|
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-2.0+
|
||||||
|
#
|
||||||
|
|
||||||
|
extra-y := start.o
|
||||||
|
obj-y += cpu.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_STM32F4) += stm32f4/
|
|
@ -0,0 +1,8 @@
|
||||||
|
#
|
||||||
|
# (C) Copyright 2015
|
||||||
|
# Kamil Lulko, <rev13@wp.pl>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-2.0+
|
||||||
|
#
|
||||||
|
|
||||||
|
PLATFORM_CPPFLAGS += -march=armv7-m -mthumb
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2010,2011
|
||||||
|
* Vladimir Khusainov, Emcraft Systems, vlad@emcraft.com
|
||||||
|
*
|
||||||
|
* (C) Copyright 2015
|
||||||
|
* Kamil Lulko, <rev13@wp.pl>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/armv7m.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is called right before passing control to
|
||||||
|
* the Linux kernel point.
|
||||||
|
*/
|
||||||
|
int cleanup_before_linux(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Perform the low-level reset.
|
||||||
|
*/
|
||||||
|
void reset_cpu(ulong addr)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Perform reset but keep priority group unchanged.
|
||||||
|
*/
|
||||||
|
writel((V7M_AIRCR_VECTKEY << V7M_AIRCR_VECTKEY_SHIFT)
|
||||||
|
| (V7M_SCB->aircr & V7M_AIRCR_PRIGROUP_MSK)
|
||||||
|
| V7M_AIRCR_SYSRESET, &V7M_SCB->aircr);
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2015
|
||||||
|
* Kamil Lulko, <rev13@wp.pl>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
.globl reset
|
||||||
|
.type reset, %function
|
||||||
|
reset:
|
||||||
|
b _main
|
||||||
|
|
||||||
|
.globl c_runtime_cpu_setup
|
||||||
|
c_runtime_cpu_setup:
|
||||||
|
mov pc, lr
|
|
@ -0,0 +1,11 @@
|
||||||
|
#
|
||||||
|
# (C) Copyright 2000-2006
|
||||||
|
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
|
#
|
||||||
|
# (C) Copyright 2015
|
||||||
|
# Kamil Lulko, <rev13@wp.pl>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-2.0+
|
||||||
|
#
|
||||||
|
|
||||||
|
obj-y += soc.o clock.o timer.o flash.o
|
|
@ -0,0 +1,209 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2015
|
||||||
|
* Kamil Lulko, <rev13@wp.pl>
|
||||||
|
*
|
||||||
|
* (C) Copyright 2014
|
||||||
|
* STMicroelectronics
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/arch/stm32.h>
|
||||||
|
|
||||||
|
#define RCC_CR_HSION (1 << 0)
|
||||||
|
#define RCC_CR_HSEON (1 << 16)
|
||||||
|
#define RCC_CR_HSERDY (1 << 17)
|
||||||
|
#define RCC_CR_HSEBYP (1 << 18)
|
||||||
|
#define RCC_CR_CSSON (1 << 19)
|
||||||
|
#define RCC_CR_PLLON (1 << 24)
|
||||||
|
#define RCC_CR_PLLRDY (1 << 25)
|
||||||
|
|
||||||
|
#define RCC_PLLCFGR_PLLM_MASK 0x3F
|
||||||
|
#define RCC_PLLCFGR_PLLN_MASK 0x7FC0
|
||||||
|
#define RCC_PLLCFGR_PLLP_MASK 0x30000
|
||||||
|
#define RCC_PLLCFGR_PLLQ_MASK 0xF000000
|
||||||
|
#define RCC_PLLCFGR_PLLSRC (1 << 22)
|
||||||
|
#define RCC_PLLCFGR_PLLN_SHIFT 6
|
||||||
|
#define RCC_PLLCFGR_PLLP_SHIFT 16
|
||||||
|
#define RCC_PLLCFGR_PLLQ_SHIFT 24
|
||||||
|
|
||||||
|
#define RCC_CFGR_AHB_PSC_MASK 0xF0
|
||||||
|
#define RCC_CFGR_APB1_PSC_MASK 0x1C00
|
||||||
|
#define RCC_CFGR_APB2_PSC_MASK 0xE000
|
||||||
|
#define RCC_CFGR_SW0 (1 << 0)
|
||||||
|
#define RCC_CFGR_SW1 (1 << 1)
|
||||||
|
#define RCC_CFGR_SW_MASK 0x3
|
||||||
|
#define RCC_CFGR_SW_HSI 0
|
||||||
|
#define RCC_CFGR_SW_HSE RCC_CFGR_SW0
|
||||||
|
#define RCC_CFGR_SW_PLL RCC_CFGR_SW1
|
||||||
|
#define RCC_CFGR_SWS0 (1 << 2)
|
||||||
|
#define RCC_CFGR_SWS1 (1 << 3)
|
||||||
|
#define RCC_CFGR_SWS_MASK 0xC
|
||||||
|
#define RCC_CFGR_SWS_HSI 0
|
||||||
|
#define RCC_CFGR_SWS_HSE RCC_CFGR_SWS0
|
||||||
|
#define RCC_CFGR_SWS_PLL RCC_CFGR_SWS1
|
||||||
|
#define RCC_CFGR_HPRE_SHIFT 4
|
||||||
|
#define RCC_CFGR_PPRE1_SHIFT 10
|
||||||
|
#define RCC_CFGR_PPRE2_SHIFT 13
|
||||||
|
|
||||||
|
#define RCC_APB1ENR_PWREN (1 << 28)
|
||||||
|
|
||||||
|
#define PWR_CR_VOS0 (1 << 14)
|
||||||
|
#define PWR_CR_VOS1 (1 << 15)
|
||||||
|
#define PWR_CR_VOS_MASK 0xC000
|
||||||
|
#define PWR_CR_VOS_SCALE_MODE_1 (PWR_CR_VOS0 | PWR_CR_VOS1)
|
||||||
|
#define PWR_CR_VOS_SCALE_MODE_2 (PWR_CR_VOS1)
|
||||||
|
#define PWR_CR_VOS_SCALE_MODE_3 (PWR_CR_VOS0)
|
||||||
|
|
||||||
|
#define FLASH_ACR_WS(n) n
|
||||||
|
#define FLASH_ACR_PRFTEN (1 << 8)
|
||||||
|
#define FLASH_ACR_ICEN (1 << 9)
|
||||||
|
#define FLASH_ACR_DCEN (1 << 10)
|
||||||
|
|
||||||
|
struct pll_psc {
|
||||||
|
u8 pll_m;
|
||||||
|
u16 pll_n;
|
||||||
|
u8 pll_p;
|
||||||
|
u8 pll_q;
|
||||||
|
u8 ahb_psc;
|
||||||
|
u8 apb1_psc;
|
||||||
|
u8 apb2_psc;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define AHB_PSC_1 0
|
||||||
|
#define AHB_PSC_2 0x8
|
||||||
|
#define AHB_PSC_4 0x9
|
||||||
|
#define AHB_PSC_8 0xA
|
||||||
|
#define AHB_PSC_16 0xB
|
||||||
|
#define AHB_PSC_64 0xC
|
||||||
|
#define AHB_PSC_128 0xD
|
||||||
|
#define AHB_PSC_256 0xE
|
||||||
|
#define AHB_PSC_512 0xF
|
||||||
|
|
||||||
|
#define APB_PSC_1 0
|
||||||
|
#define APB_PSC_2 0x4
|
||||||
|
#define APB_PSC_4 0x5
|
||||||
|
#define APB_PSC_8 0x6
|
||||||
|
#define APB_PSC_16 0x7
|
||||||
|
|
||||||
|
#if !defined(CONFIG_STM32_HSE_HZ)
|
||||||
|
#error "CONFIG_STM32_HSE_HZ not defined!"
|
||||||
|
#else
|
||||||
|
#if (CONFIG_STM32_HSE_HZ == 8000000)
|
||||||
|
struct pll_psc pll_psc_168 = {
|
||||||
|
.pll_m = 8,
|
||||||
|
.pll_n = 336,
|
||||||
|
.pll_p = 2,
|
||||||
|
.pll_q = 7,
|
||||||
|
.ahb_psc = AHB_PSC_1,
|
||||||
|
.apb1_psc = APB_PSC_4,
|
||||||
|
.apb2_psc = APB_PSC_2
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
#error "No PLL/Prescaler configuration for given CONFIG_STM32_HSE_HZ exists"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int configure_clocks(void)
|
||||||
|
{
|
||||||
|
/* Reset RCC configuration */
|
||||||
|
setbits_le32(&STM32_RCC->cr, RCC_CR_HSION);
|
||||||
|
writel(0, &STM32_RCC->cfgr); /* Reset CFGR */
|
||||||
|
clrbits_le32(&STM32_RCC->cr, (RCC_CR_HSEON | RCC_CR_CSSON
|
||||||
|
| RCC_CR_PLLON));
|
||||||
|
writel(0x24003010, &STM32_RCC->pllcfgr); /* Reset value from RM */
|
||||||
|
clrbits_le32(&STM32_RCC->cr, RCC_CR_HSEBYP);
|
||||||
|
writel(0, &STM32_RCC->cir); /* Disable all interrupts */
|
||||||
|
|
||||||
|
/* Configure for HSE+PLL operation */
|
||||||
|
setbits_le32(&STM32_RCC->cr, RCC_CR_HSEON);
|
||||||
|
while (!(readl(&STM32_RCC->cr) & RCC_CR_HSERDY))
|
||||||
|
;
|
||||||
|
|
||||||
|
/* Enable high performance mode, System frequency up to 168 MHz */
|
||||||
|
setbits_le32(&STM32_RCC->apb1enr, RCC_APB1ENR_PWREN);
|
||||||
|
writel(PWR_CR_VOS_SCALE_MODE_1, &STM32_PWR->cr);
|
||||||
|
|
||||||
|
setbits_le32(&STM32_RCC->cfgr, ((
|
||||||
|
pll_psc_168.ahb_psc << RCC_CFGR_HPRE_SHIFT)
|
||||||
|
| (pll_psc_168.apb1_psc << RCC_CFGR_PPRE1_SHIFT)
|
||||||
|
| (pll_psc_168.apb2_psc << RCC_CFGR_PPRE2_SHIFT)));
|
||||||
|
|
||||||
|
writel(pll_psc_168.pll_m
|
||||||
|
| (pll_psc_168.pll_n << RCC_PLLCFGR_PLLN_SHIFT)
|
||||||
|
| (((pll_psc_168.pll_p >> 1) - 1) << RCC_PLLCFGR_PLLP_SHIFT)
|
||||||
|
| (pll_psc_168.pll_q << RCC_PLLCFGR_PLLQ_SHIFT),
|
||||||
|
&STM32_RCC->pllcfgr);
|
||||||
|
setbits_le32(&STM32_RCC->pllcfgr, RCC_PLLCFGR_PLLSRC);
|
||||||
|
|
||||||
|
setbits_le32(&STM32_RCC->cr, RCC_CR_PLLON);
|
||||||
|
|
||||||
|
while (!(readl(&STM32_RCC->cr) & RCC_CR_PLLRDY))
|
||||||
|
;
|
||||||
|
|
||||||
|
/* 5 wait states, Prefetch enabled, D-Cache enabled, I-Cache enabled */
|
||||||
|
writel(FLASH_ACR_WS(5) | FLASH_ACR_PRFTEN | FLASH_ACR_ICEN
|
||||||
|
| FLASH_ACR_DCEN, &STM32_FLASH->acr);
|
||||||
|
|
||||||
|
clrbits_le32(&STM32_RCC->cfgr, (RCC_CFGR_SW0 | RCC_CFGR_SW1));
|
||||||
|
setbits_le32(&STM32_RCC->cfgr, RCC_CFGR_SW_PLL);
|
||||||
|
|
||||||
|
while ((readl(&STM32_RCC->cfgr) & RCC_CFGR_SWS_MASK) !=
|
||||||
|
RCC_CFGR_SWS_PLL)
|
||||||
|
;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long clock_get(enum clock clck)
|
||||||
|
{
|
||||||
|
u32 sysclk = 0;
|
||||||
|
u32 shift = 0;
|
||||||
|
/* Prescaler table lookups for clock computation */
|
||||||
|
u8 ahb_psc_table[16] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9
|
||||||
|
};
|
||||||
|
u8 apb_psc_table[8] = {
|
||||||
|
0, 0, 0, 0, 1, 2, 3, 4
|
||||||
|
};
|
||||||
|
|
||||||
|
if ((readl(&STM32_RCC->cfgr) & RCC_CFGR_SWS_MASK) ==
|
||||||
|
RCC_CFGR_SWS_PLL) {
|
||||||
|
u16 pllm, plln, pllp;
|
||||||
|
pllm = (readl(&STM32_RCC->pllcfgr) & RCC_PLLCFGR_PLLM_MASK);
|
||||||
|
plln = ((readl(&STM32_RCC->pllcfgr) & RCC_PLLCFGR_PLLN_MASK)
|
||||||
|
>> RCC_PLLCFGR_PLLN_SHIFT);
|
||||||
|
pllp = ((((readl(&STM32_RCC->pllcfgr) & RCC_PLLCFGR_PLLP_MASK)
|
||||||
|
>> RCC_PLLCFGR_PLLP_SHIFT) + 1) << 1);
|
||||||
|
sysclk = ((CONFIG_STM32_HSE_HZ / pllm) * plln) / pllp;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (clck) {
|
||||||
|
case CLOCK_CORE:
|
||||||
|
return sysclk;
|
||||||
|
break;
|
||||||
|
case CLOCK_AHB:
|
||||||
|
shift = ahb_psc_table[(
|
||||||
|
(readl(&STM32_RCC->cfgr) & RCC_CFGR_AHB_PSC_MASK)
|
||||||
|
>> RCC_CFGR_HPRE_SHIFT)];
|
||||||
|
return sysclk >>= shift;
|
||||||
|
break;
|
||||||
|
case CLOCK_APB1:
|
||||||
|
shift = apb_psc_table[(
|
||||||
|
(readl(&STM32_RCC->cfgr) & RCC_CFGR_APB1_PSC_MASK)
|
||||||
|
>> RCC_CFGR_PPRE1_SHIFT)];
|
||||||
|
return sysclk >>= shift;
|
||||||
|
break;
|
||||||
|
case CLOCK_APB2:
|
||||||
|
shift = apb_psc_table[(
|
||||||
|
(readl(&STM32_RCC->cfgr) & RCC_CFGR_APB2_PSC_MASK)
|
||||||
|
>> RCC_CFGR_PPRE2_SHIFT)];
|
||||||
|
return sysclk >>= shift;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,143 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2015
|
||||||
|
* Kamil Lulko, <rev13@wp.pl>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/arch/stm32.h>
|
||||||
|
|
||||||
|
#define STM32_FLASH_KEY1 0x45670123
|
||||||
|
#define STM32_FLASH_KEY2 0xCDEF89AB
|
||||||
|
|
||||||
|
flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS];
|
||||||
|
|
||||||
|
const u32 sect_sz_kb[CONFIG_SYS_MAX_FLASH_SECT] = {
|
||||||
|
[0 ... 3] = 16 * 1024,
|
||||||
|
[4] = 64 * 1024,
|
||||||
|
[5 ... 11] = 128 * 1024
|
||||||
|
};
|
||||||
|
|
||||||
|
static void stm32f4_flash_lock(u8 lock)
|
||||||
|
{
|
||||||
|
if (lock) {
|
||||||
|
setbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_LOCK);
|
||||||
|
} else {
|
||||||
|
writel(STM32_FLASH_KEY1, &STM32_FLASH->key);
|
||||||
|
writel(STM32_FLASH_KEY2, &STM32_FLASH->key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long flash_init(void)
|
||||||
|
{
|
||||||
|
unsigned long total_size = 0;
|
||||||
|
u8 i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) {
|
||||||
|
flash_info[i].flash_id = FLASH_STM32F4;
|
||||||
|
flash_info[i].sector_count = CONFIG_SYS_MAX_FLASH_SECT;
|
||||||
|
flash_info[i].start[0] = CONFIG_SYS_FLASH_BASE + (i << 20);
|
||||||
|
flash_info[i].size = sect_sz_kb[0];
|
||||||
|
for (j = 1; j < CONFIG_SYS_MAX_FLASH_SECT; j++) {
|
||||||
|
flash_info[i].start[j] = flash_info[i].start[j - 1]
|
||||||
|
+ (sect_sz_kb[j - 1]);
|
||||||
|
flash_info[i].size += sect_sz_kb[j];
|
||||||
|
}
|
||||||
|
total_size += flash_info[i].size;
|
||||||
|
}
|
||||||
|
|
||||||
|
return total_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void flash_print_info(flash_info_t *info)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (info->flash_id == FLASH_UNKNOWN) {
|
||||||
|
printf("missing or unknown FLASH type\n");
|
||||||
|
return;
|
||||||
|
} else if (info->flash_id == FLASH_STM32F4) {
|
||||||
|
printf("STM32F4 Embedded Flash\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf(" Size: %ld MB in %d Sectors\n",
|
||||||
|
info->size >> 20, info->sector_count);
|
||||||
|
|
||||||
|
printf(" Sector Start Addresses:");
|
||||||
|
for (i = 0; i < info->sector_count; ++i) {
|
||||||
|
if ((i % 5) == 0)
|
||||||
|
printf("\n ");
|
||||||
|
printf(" %08lX%s",
|
||||||
|
info->start[i],
|
||||||
|
info->protect[i] ? " (RO)" : " ");
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int flash_erase(flash_info_t *info, int first, int last)
|
||||||
|
{
|
||||||
|
u8 bank = 0xFF;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) {
|
||||||
|
if (info == &flash_info[i]) {
|
||||||
|
bank = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bank == 0xFF)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
stm32f4_flash_lock(0);
|
||||||
|
|
||||||
|
for (i = first; i <= last; i++) {
|
||||||
|
while (readl(&STM32_FLASH->sr) & STM32_FLASH_SR_BSY)
|
||||||
|
;
|
||||||
|
|
||||||
|
if (bank == 0) {
|
||||||
|
setbits_le32(&STM32_FLASH->cr,
|
||||||
|
(i << STM32_FLASH_CR_SNB_OFFSET));
|
||||||
|
} else if (bank == 1) {
|
||||||
|
setbits_le32(&STM32_FLASH->cr,
|
||||||
|
((0x10 | i) << STM32_FLASH_CR_SNB_OFFSET));
|
||||||
|
} else {
|
||||||
|
stm32f4_flash_lock(1);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
setbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_SER);
|
||||||
|
setbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_STRT);
|
||||||
|
|
||||||
|
while (readl(&STM32_FLASH->sr) & STM32_FLASH_SR_BSY)
|
||||||
|
;
|
||||||
|
|
||||||
|
clrbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_SER);
|
||||||
|
stm32f4_flash_lock(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int write_buff(flash_info_t *info, uchar *src, ulong addr, ulong cnt)
|
||||||
|
{
|
||||||
|
ulong i;
|
||||||
|
|
||||||
|
while (readl(&STM32_FLASH->sr) & STM32_FLASH_SR_BSY)
|
||||||
|
;
|
||||||
|
|
||||||
|
stm32f4_flash_lock(0);
|
||||||
|
|
||||||
|
setbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_PG);
|
||||||
|
/* To make things simple use byte writes only */
|
||||||
|
for (i = 0; i < cnt; i++) {
|
||||||
|
*(uchar *)(addr + i) = src[i];
|
||||||
|
while (readl(&STM32_FLASH->sr) & STM32_FLASH_SR_BSY)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
clrbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_PG);
|
||||||
|
stm32f4_flash_lock(1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2015
|
||||||
|
* Kamil Lulko, <rev13@wp.pl>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/armv7m.h>
|
||||||
|
#include <asm/arch/stm32.h>
|
||||||
|
|
||||||
|
u32 get_cpu_rev(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int arch_cpu_init(void)
|
||||||
|
{
|
||||||
|
configure_clocks();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configure the memory protection unit (MPU) to allow full access to
|
||||||
|
* the whole 4GB address space.
|
||||||
|
*/
|
||||||
|
writel(0, &V7M_MPU->rnr);
|
||||||
|
writel(0, &V7M_MPU->rbar);
|
||||||
|
writel((V7M_MPU_RASR_AP_RW_RW | V7M_MPU_RASR_SIZE_4GB
|
||||||
|
| V7M_MPU_RASR_EN), &V7M_MPU->rasr);
|
||||||
|
writel(V7M_MPU_CTRL_ENABLE | V7M_MPU_CTRL_HFNMIENA, &V7M_MPU->ctrl);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void s_init(void)
|
||||||
|
{
|
||||||
|
}
|
|
@ -0,0 +1,118 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2015
|
||||||
|
* Kamil Lulko, <rev13@wp.pl>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/armv7m.h>
|
||||||
|
#include <asm/arch/stm32.h>
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
#define STM32_TIM2_BASE (STM32_APB1PERIPH_BASE + 0x0000)
|
||||||
|
|
||||||
|
#define RCC_APB1ENR_TIM2EN (1 << 0)
|
||||||
|
|
||||||
|
struct stm32_tim2_5 {
|
||||||
|
u32 cr1;
|
||||||
|
u32 cr2;
|
||||||
|
u32 smcr;
|
||||||
|
u32 dier;
|
||||||
|
u32 sr;
|
||||||
|
u32 egr;
|
||||||
|
u32 ccmr1;
|
||||||
|
u32 ccmr2;
|
||||||
|
u32 ccer;
|
||||||
|
u32 cnt;
|
||||||
|
u32 psc;
|
||||||
|
u32 arr;
|
||||||
|
u32 reserved1;
|
||||||
|
u32 ccr1;
|
||||||
|
u32 ccr2;
|
||||||
|
u32 ccr3;
|
||||||
|
u32 ccr4;
|
||||||
|
u32 reserved2;
|
||||||
|
u32 dcr;
|
||||||
|
u32 dmar;
|
||||||
|
u32 or;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TIM_CR1_CEN (1 << 0)
|
||||||
|
|
||||||
|
#define TIM_EGR_UG (1 << 0)
|
||||||
|
|
||||||
|
int timer_init(void)
|
||||||
|
{
|
||||||
|
struct stm32_tim2_5 *tim = (struct stm32_tim2_5 *)STM32_TIM2_BASE;
|
||||||
|
|
||||||
|
setbits_le32(&STM32_RCC->apb1enr, RCC_APB1ENR_TIM2EN);
|
||||||
|
|
||||||
|
if (clock_get(CLOCK_AHB) == clock_get(CLOCK_APB1))
|
||||||
|
writel((clock_get(CLOCK_APB1) / CONFIG_SYS_HZ_CLOCK) - 1,
|
||||||
|
&tim->psc);
|
||||||
|
else
|
||||||
|
writel(((clock_get(CLOCK_APB1) * 2) / CONFIG_SYS_HZ_CLOCK) - 1,
|
||||||
|
&tim->psc);
|
||||||
|
|
||||||
|
writel(0xFFFFFFFF, &tim->arr);
|
||||||
|
writel(TIM_CR1_CEN, &tim->cr1);
|
||||||
|
setbits_le32(&tim->egr, TIM_EGR_UG);
|
||||||
|
|
||||||
|
gd->arch.tbl = 0;
|
||||||
|
gd->arch.tbu = 0;
|
||||||
|
gd->arch.lastinc = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ulong get_timer(ulong base)
|
||||||
|
{
|
||||||
|
return (get_ticks() / (CONFIG_SYS_HZ_CLOCK / CONFIG_SYS_HZ)) - base;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long long get_ticks(void)
|
||||||
|
{
|
||||||
|
struct stm32_tim2_5 *tim = (struct stm32_tim2_5 *)STM32_TIM2_BASE;
|
||||||
|
u32 now;
|
||||||
|
|
||||||
|
now = readl(&tim->cnt);
|
||||||
|
|
||||||
|
if (now >= gd->arch.lastinc)
|
||||||
|
gd->arch.tbl += (now - gd->arch.lastinc);
|
||||||
|
else
|
||||||
|
gd->arch.tbl += (0xFFFFFFFF - gd->arch.lastinc) + now;
|
||||||
|
|
||||||
|
gd->arch.lastinc = now;
|
||||||
|
|
||||||
|
return gd->arch.tbl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset_timer(void)
|
||||||
|
{
|
||||||
|
struct stm32_tim2_5 *tim = (struct stm32_tim2_5 *)STM32_TIM2_BASE;
|
||||||
|
|
||||||
|
gd->arch.lastinc = readl(&tim->cnt);
|
||||||
|
gd->arch.tbl = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* delay x useconds */
|
||||||
|
void __udelay(ulong usec)
|
||||||
|
{
|
||||||
|
unsigned long long start;
|
||||||
|
|
||||||
|
start = get_ticks(); /* get current timestamp */
|
||||||
|
while ((get_ticks() - start) < usec)
|
||||||
|
; /* loop till time has passed */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function is derived from PowerPC code (timebase clock frequency).
|
||||||
|
* On ARM it returns the number of timer ticks per second.
|
||||||
|
*/
|
||||||
|
ulong get_tbclk(void)
|
||||||
|
{
|
||||||
|
return CONFIG_SYS_HZ_CLOCK;
|
||||||
|
}
|
|
@ -6,6 +6,8 @@
|
||||||
|
|
||||||
obj-y += cpu.o
|
obj-y += cpu.o
|
||||||
obj-y += lowlevel.o
|
obj-y += lowlevel.o
|
||||||
|
obj-y += soc.o
|
||||||
obj-y += speed.o
|
obj-y += speed.o
|
||||||
|
obj-$(CONFIG_SYS_HAS_SERDES) += fsl_lsch3_serdes.o ls2085a_serdes.o
|
||||||
obj-$(CONFIG_MP) += mp.o
|
obj-$(CONFIG_MP) += mp.o
|
||||||
obj-$(CONFIG_OF_LIBFDT) += fdt.o
|
obj-$(CONFIG_OF_LIBFDT) += fdt.o
|
||||||
|
|
|
@ -8,3 +8,141 @@ Freescale LayerScape with Chassis Generation 3
|
||||||
|
|
||||||
This architecture supports Freescale ARMv8 SoCs with Chassis generation 3,
|
This architecture supports Freescale ARMv8 SoCs with Chassis generation 3,
|
||||||
for example LS2085A.
|
for example LS2085A.
|
||||||
|
|
||||||
|
Flash Layout
|
||||||
|
============
|
||||||
|
|
||||||
|
(1) A typical layout of various images (including Linux and other firmware images)
|
||||||
|
is shown below considering a 32MB NOR flash device present on most
|
||||||
|
pre-silicon platforms (simulator and emulator):
|
||||||
|
|
||||||
|
-------------------------
|
||||||
|
| FIT Image |
|
||||||
|
| (linux + DTB + RFS) |
|
||||||
|
------------------------- ----> 0x0120_0000
|
||||||
|
| Debug Server FW |
|
||||||
|
------------------------- ----> 0x00C0_0000
|
||||||
|
| AIOP FW |
|
||||||
|
------------------------- ----> 0x0070_0000
|
||||||
|
| MC FW |
|
||||||
|
------------------------- ----> 0x006C_0000
|
||||||
|
| MC DPL Blob |
|
||||||
|
------------------------- ----> 0x0020_0000
|
||||||
|
| BootLoader + Env|
|
||||||
|
------------------------- ----> 0x0000_1000
|
||||||
|
| PBI |
|
||||||
|
------------------------- ----> 0x0000_0080
|
||||||
|
| RCW |
|
||||||
|
------------------------- ----> 0x0000_0000
|
||||||
|
|
||||||
|
32-MB NOR flash layout for pre-silicon platforms (simulator and emulator)
|
||||||
|
|
||||||
|
(2) A typical layout of various images (including Linux and other firmware images)
|
||||||
|
is shown below considering a 128MB NOR flash device present on QDS and RDB
|
||||||
|
boards:
|
||||||
|
----------------------------------------- ----> 0x5_8800_0000 ---
|
||||||
|
| .. Unused .. (7M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8790_0000 |
|
||||||
|
| FIT Image (linux + DTB + RFS) (40M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8510_0000 |
|
||||||
|
| PHY firmware (2M) | |
|
||||||
|
----------------------------------------- ----> 0x5_84F0_0000 | 64K
|
||||||
|
| Debug Server FW (2M) | | Alt
|
||||||
|
----------------------------------------- ----> 0x5_84D0_0000 | Bank
|
||||||
|
| AIOP FW (4M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8490_0000 (vbank4)
|
||||||
|
| MC DPC Blob (1M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8480_0000 |
|
||||||
|
| MC DPL Blob (1M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8470_0000 |
|
||||||
|
| MC FW (4M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8430_0000 |
|
||||||
|
| BootLoader Environment (1M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8420_0000 |
|
||||||
|
| BootLoader (1M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8410_0000 |
|
||||||
|
| RCW and PBI (1M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8400_0000 ---
|
||||||
|
| .. Unused .. (7M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8390_0000 |
|
||||||
|
| FIT Image (linux + DTB + RFS) (40M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8110_0000 |
|
||||||
|
| PHY firmware (2M) | |
|
||||||
|
----------------------------------------- ----> 0x5_80F0_0000 | 64K
|
||||||
|
| Debug Server FW (2M) | | Bank
|
||||||
|
----------------------------------------- ----> 0x5_80D0_0000 |
|
||||||
|
| AIOP FW (4M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8090_0000 (vbank0)
|
||||||
|
| MC DPC Blob (1M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8080_0000 |
|
||||||
|
| MC DPL Blob (1M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8070_0000 |
|
||||||
|
| MC FW (4M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8030_0000 |
|
||||||
|
| BootLoader Environment (1M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8020_0000 |
|
||||||
|
| BootLoader (1M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8010_0000 |
|
||||||
|
| RCW and PBI (1M) | |
|
||||||
|
----------------------------------------- ----> 0x5_8000_0000 ---
|
||||||
|
|
||||||
|
128-MB NOR flash layout for QDS and RDB boards
|
||||||
|
|
||||||
|
Environment Variables
|
||||||
|
=====================
|
||||||
|
mcboottimeout: MC boot timeout in milliseconds. If this variable is not defined
|
||||||
|
the value CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS will be assumed.
|
||||||
|
|
||||||
|
mcmemsize: MC DRAM block size. If this variable is not defined, the value
|
||||||
|
CONFIG_SYS_LS_MC_DRAM_BLOCK_MIN_SIZE will be assumed.
|
||||||
|
|
||||||
|
Booting from NAND
|
||||||
|
-------------------
|
||||||
|
Booting from NAND requires two images, RCW and u-boot-with-spl.bin.
|
||||||
|
The difference between NAND boot RCW image and NOR boot image is the PBI
|
||||||
|
command sequence. Below is one example for PBI commands for QDS which uses
|
||||||
|
NAND device with 2KB/page, block size 128KB.
|
||||||
|
|
||||||
|
1) CCSR 4-byte write to 0x00e00404, data=0x00000000
|
||||||
|
2) CCSR 4-byte write to 0x00e00400, data=0x1800a000
|
||||||
|
The above two commands set bootloc register to 0x00000000_1800a000 where
|
||||||
|
the u-boot code will be running in OCRAM.
|
||||||
|
|
||||||
|
3) Block Copy: SRC=0x0107, SRC_ADDR=0x00020000, DEST_ADDR=0x1800a000,
|
||||||
|
BLOCK_SIZE=0x00014000
|
||||||
|
This command copies u-boot image from NAND device into OCRAM. The values need
|
||||||
|
to adjust accordingly.
|
||||||
|
|
||||||
|
SRC should match the cfg_rcw_src, the reset config pins. It depends
|
||||||
|
on the NAND device. See reference manual for cfg_rcw_src.
|
||||||
|
SRC_ADDR is the offset of u-boot-with-spl.bin image in NAND device. In
|
||||||
|
the example above, 128KB. For easy maintenance, we put it at
|
||||||
|
the beginning of next block from RCW.
|
||||||
|
DEST_ADDR is fixed at 0x1800a000, matching bootloc set above.
|
||||||
|
BLOCK_SIZE is the size to be copied by PBI.
|
||||||
|
|
||||||
|
RCW image should be written to the beginning of NAND device. Example of using
|
||||||
|
u-boot command
|
||||||
|
|
||||||
|
nand write <rcw image in memory> 0 <size of rcw image>
|
||||||
|
|
||||||
|
To form the NAND image, build u-boot with NAND config, for example,
|
||||||
|
ls2085aqds_nand_defconfig. The image needed is u-boot-with-spl.bin.
|
||||||
|
The u-boot image should be written to match SRC_ADDR, in above example 0x20000.
|
||||||
|
|
||||||
|
nand write <u-boot image in memory> 200000 <size of u-boot image>
|
||||||
|
|
||||||
|
With these two images in NAND device, the board can boot from NAND.
|
||||||
|
|
||||||
|
Another example for RDB boards,
|
||||||
|
|
||||||
|
1) CCSR 4-byte write to 0x00e00404, data=0x00000000
|
||||||
|
2) CCSR 4-byte write to 0x00e00400, data=0x1800a000
|
||||||
|
3) Block Copy: SRC=0x0119, SRC_ADDR=0x00080000, DEST_ADDR=0x1800a000,
|
||||||
|
BLOCK_SIZE=0x00014000
|
||||||
|
|
||||||
|
nand write <rcw image in memory> 0 <size of rcw image>
|
||||||
|
nand write <u-boot image in memory> 80000 <size of u-boot image>
|
||||||
|
|
||||||
|
Notice the difference from QDS is SRC, SRC_ADDR and the offset of u-boot image
|
||||||
|
to match board NAND device with 4KB/page, block size 512KB.
|
||||||
|
|
|
@ -10,7 +10,12 @@
|
||||||
#include <asm/armv8/mmu.h>
|
#include <asm/armv8/mmu.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/arch-fsl-lsch3/immap_lsch3.h>
|
#include <asm/arch-fsl-lsch3/immap_lsch3.h>
|
||||||
|
#include <fsl_debug_server.h>
|
||||||
#include <fsl-mc/fsl_mc.h>
|
#include <fsl-mc/fsl_mc.h>
|
||||||
|
#include <asm/arch/fsl_serdes.h>
|
||||||
|
#ifdef CONFIG_FSL_ESDHC
|
||||||
|
#include <fsl_esdhc.h>
|
||||||
|
#endif
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "mp.h"
|
#include "mp.h"
|
||||||
#include "speed.h"
|
#include "speed.h"
|
||||||
|
@ -24,8 +29,9 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||||
* levels of translation tables here to cover 40-bit address space.
|
* levels of translation tables here to cover 40-bit address space.
|
||||||
* We use 4KB granule size, with 40 bits physical address, T0SZ=24
|
* We use 4KB granule size, with 40 bits physical address, T0SZ=24
|
||||||
* Level 0 IA[39], table address @0
|
* Level 0 IA[39], table address @0
|
||||||
* Level 1 IA[31:30], table address @01000, 0x2000
|
* Level 1 IA[31:30], table address @0x1000, 0x2000
|
||||||
* Level 2 IA[29:21], table address @0x3000
|
* Level 2 IA[29:21], table address @0x3000, 0x4000
|
||||||
|
* Address above 0x5000 is free for other purpose.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define SECTION_SHIFT_L0 39UL
|
#define SECTION_SHIFT_L0 39UL
|
||||||
|
@ -60,12 +66,12 @@ static inline void early_mmu_setup(void)
|
||||||
{
|
{
|
||||||
int el;
|
int el;
|
||||||
u64 i;
|
u64 i;
|
||||||
u64 section_l1t0, section_l1t1, section_l2;
|
u64 section_l1t0, section_l1t1, section_l2t0, section_l2t1;
|
||||||
u64 *level0_table = (u64 *)CONFIG_SYS_FSL_OCRAM_BASE;
|
u64 *level0_table = (u64 *)CONFIG_SYS_FSL_OCRAM_BASE;
|
||||||
u64 *level1_table_0 = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x1000);
|
u64 *level1_table_0 = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x1000);
|
||||||
u64 *level1_table_1 = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x2000);
|
u64 *level1_table_1 = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x2000);
|
||||||
u64 *level2_table = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x3000);
|
u64 *level2_table_0 = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x3000);
|
||||||
|
u64 *level2_table_1 = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x4000);
|
||||||
|
|
||||||
level0_table[0] =
|
level0_table[0] =
|
||||||
(u64)level1_table_0 | PMD_TYPE_TABLE;
|
(u64)level1_table_0 | PMD_TYPE_TABLE;
|
||||||
|
@ -79,21 +85,25 @@ static inline void early_mmu_setup(void)
|
||||||
*/
|
*/
|
||||||
section_l1t0 = 0;
|
section_l1t0 = 0;
|
||||||
section_l1t1 = BLOCK_SIZE_L0;
|
section_l1t1 = BLOCK_SIZE_L0;
|
||||||
section_l2 = 0;
|
section_l2t0 = 0;
|
||||||
|
section_l2t1 = CONFIG_SYS_FLASH_BASE;
|
||||||
for (i = 0; i < 512; i++) {
|
for (i = 0; i < 512; i++) {
|
||||||
set_pgtable_section(level1_table_0, i, section_l1t0,
|
set_pgtable_section(level1_table_0, i, section_l1t0,
|
||||||
MT_DEVICE_NGNRNE);
|
MT_DEVICE_NGNRNE);
|
||||||
set_pgtable_section(level1_table_1, i, section_l1t1,
|
set_pgtable_section(level1_table_1, i, section_l1t1,
|
||||||
MT_NORMAL);
|
MT_NORMAL);
|
||||||
set_pgtable_section(level2_table, i, section_l2,
|
set_pgtable_section(level2_table_0, i, section_l2t0,
|
||||||
|
MT_DEVICE_NGNRNE);
|
||||||
|
set_pgtable_section(level2_table_1, i, section_l2t1,
|
||||||
MT_DEVICE_NGNRNE);
|
MT_DEVICE_NGNRNE);
|
||||||
section_l1t0 += BLOCK_SIZE_L1;
|
section_l1t0 += BLOCK_SIZE_L1;
|
||||||
section_l1t1 += BLOCK_SIZE_L1;
|
section_l1t1 += BLOCK_SIZE_L1;
|
||||||
section_l2 += BLOCK_SIZE_L2;
|
section_l2t0 += BLOCK_SIZE_L2;
|
||||||
|
section_l2t1 += BLOCK_SIZE_L2;
|
||||||
}
|
}
|
||||||
|
|
||||||
level1_table_0[0] =
|
level1_table_0[0] =
|
||||||
(u64)level2_table | PMD_TYPE_TABLE;
|
(u64)level2_table_0 | PMD_TYPE_TABLE;
|
||||||
level1_table_0[1] =
|
level1_table_0[1] =
|
||||||
0x40000000 | PMD_SECT_AF | PMD_TYPE_SECT |
|
0x40000000 | PMD_SECT_AF | PMD_TYPE_SECT |
|
||||||
PMD_ATTRINDX(MT_DEVICE_NGNRNE);
|
PMD_ATTRINDX(MT_DEVICE_NGNRNE);
|
||||||
|
@ -104,17 +114,34 @@ static inline void early_mmu_setup(void)
|
||||||
0xc0000000 | PMD_SECT_AF | PMD_TYPE_SECT |
|
0xc0000000 | PMD_SECT_AF | PMD_TYPE_SECT |
|
||||||
PMD_ATTRINDX(MT_NORMAL);
|
PMD_ATTRINDX(MT_NORMAL);
|
||||||
|
|
||||||
/* Rewrite table to enable cache */
|
/* Rewerite table to enable cache for OCRAM */
|
||||||
set_pgtable_section(level2_table,
|
set_pgtable_section(level2_table_0,
|
||||||
CONFIG_SYS_FSL_OCRAM_BASE >> SECTION_SHIFT_L2,
|
CONFIG_SYS_FSL_OCRAM_BASE >> SECTION_SHIFT_L2,
|
||||||
CONFIG_SYS_FSL_OCRAM_BASE,
|
CONFIG_SYS_FSL_OCRAM_BASE,
|
||||||
MT_NORMAL);
|
MT_NORMAL);
|
||||||
for (i = CONFIG_SYS_IFC_BASE >> SECTION_SHIFT_L2;
|
|
||||||
i < (CONFIG_SYS_IFC_BASE + CONFIG_SYS_IFC_SIZE)
|
#if defined(CONFIG_SYS_NOR0_CSPR_EARLY) && defined(CONFIG_SYS_NOR_AMASK_EARLY)
|
||||||
>> SECTION_SHIFT_L2; i++) {
|
/* Rewrite table to enable cache for two entries (4MB) */
|
||||||
section_l2 = i << SECTION_SHIFT_L2;
|
section_l2t1 = CONFIG_SYS_IFC_BASE;
|
||||||
set_pgtable_section(level2_table, i,
|
set_pgtable_section(level2_table_0,
|
||||||
section_l2, MT_NORMAL);
|
section_l2t1 >> SECTION_SHIFT_L2,
|
||||||
|
section_l2t1,
|
||||||
|
MT_NORMAL);
|
||||||
|
section_l2t1 += BLOCK_SIZE_L2;
|
||||||
|
set_pgtable_section(level2_table_0,
|
||||||
|
section_l2t1 >> SECTION_SHIFT_L2,
|
||||||
|
section_l2t1,
|
||||||
|
MT_NORMAL);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Create a mapping for 256MB IFC region to final flash location */
|
||||||
|
level1_table_0[CONFIG_SYS_FLASH_BASE >> SECTION_SHIFT_L1] =
|
||||||
|
(u64)level2_table_1 | PMD_TYPE_TABLE;
|
||||||
|
section_l2t1 = CONFIG_SYS_IFC_BASE;
|
||||||
|
for (i = 0; i < 0x10000000 >> SECTION_SHIFT_L2; i++) {
|
||||||
|
set_pgtable_section(level2_table_1, i,
|
||||||
|
section_l2t1, MT_DEVICE_NGNRNE);
|
||||||
|
section_l2t1 += BLOCK_SIZE_L2;
|
||||||
}
|
}
|
||||||
|
|
||||||
el = current_el();
|
el = current_el();
|
||||||
|
@ -347,6 +374,7 @@ u32 fsl_qoriq_core_to_type(unsigned int core)
|
||||||
#ifdef CONFIG_DISPLAY_CPUINFO
|
#ifdef CONFIG_DISPLAY_CPUINFO
|
||||||
int print_cpuinfo(void)
|
int print_cpuinfo(void)
|
||||||
{
|
{
|
||||||
|
struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||||
struct sys_info sysinfo;
|
struct sys_info sysinfo;
|
||||||
char buf[32];
|
char buf[32];
|
||||||
unsigned int i, core;
|
unsigned int i, core;
|
||||||
|
@ -370,21 +398,40 @@ int print_cpuinfo(void)
|
||||||
printf(" DP-DDR: %-4s MHz", strmhz(buf, sysinfo.freq_ddrbus2));
|
printf(" DP-DDR: %-4s MHz", strmhz(buf, sysinfo.freq_ddrbus2));
|
||||||
puts("\n");
|
puts("\n");
|
||||||
|
|
||||||
|
/* Display the RCW, so that no one gets confused as to what RCW
|
||||||
|
* we're actually using for this boot.
|
||||||
|
*/
|
||||||
|
puts("Reset Configuration Word (RCW):");
|
||||||
|
for (i = 0; i < ARRAY_SIZE(gur->rcwsr); i++) {
|
||||||
|
u32 rcw = in_le32(&gur->rcwsr[i]);
|
||||||
|
|
||||||
|
if ((i % 4) == 0)
|
||||||
|
printf("\n %02x:", i * 4);
|
||||||
|
printf(" %08x", rcw);
|
||||||
|
}
|
||||||
|
puts("\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_FSL_ESDHC
|
||||||
|
int cpu_mmc_init(bd_t *bis)
|
||||||
|
{
|
||||||
|
return fsl_esdhc_mmc_init(bis);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int cpu_eth_init(bd_t *bis)
|
int cpu_eth_init(bd_t *bis)
|
||||||
{
|
{
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
|
||||||
#ifdef CONFIG_FSL_MC_ENET
|
#ifdef CONFIG_FSL_MC_ENET
|
||||||
error = mc_init(bis);
|
error = fsl_mc_ldpaa_init(bis);
|
||||||
#endif
|
#endif
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int arch_early_init_r(void)
|
int arch_early_init_r(void)
|
||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
|
@ -393,5 +440,43 @@ int arch_early_init_r(void)
|
||||||
if (rv)
|
if (rv)
|
||||||
printf("Did not wake secondary cores\n");
|
printf("Did not wake secondary cores\n");
|
||||||
|
|
||||||
|
#ifdef CONFIG_SYS_HAS_SERDES
|
||||||
|
fsl_serdes_init();
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int timer_init(void)
|
||||||
|
{
|
||||||
|
u32 __iomem *cntcr = (u32 *)CONFIG_SYS_FSL_TIMER_ADDR;
|
||||||
|
u32 __iomem *cltbenr = (u32 *)CONFIG_SYS_FSL_PMU_CLTBENR;
|
||||||
|
#ifdef COUNTER_FREQUENCY_REAL
|
||||||
|
unsigned long cntfrq = COUNTER_FREQUENCY_REAL;
|
||||||
|
|
||||||
|
/* Update with accurate clock frequency */
|
||||||
|
asm volatile("msr cntfrq_el0, %0" : : "r" (cntfrq) : "memory");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Enable timebase for all clusters.
|
||||||
|
* It is safe to do so even some clusters are not enabled.
|
||||||
|
*/
|
||||||
|
out_le32(cltbenr, 0xf);
|
||||||
|
|
||||||
|
/* Enable clock for timer
|
||||||
|
* This is a global setting.
|
||||||
|
*/
|
||||||
|
out_le32(cntcr, 0x1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset_cpu(ulong addr)
|
||||||
|
{
|
||||||
|
u32 __iomem *rstcr = (u32 *)CONFIG_SYS_FSL_RST_ADDR;
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
/* Raise RESET_REQ_B */
|
||||||
|
val = in_le32(rstcr);
|
||||||
|
val |= 0x02;
|
||||||
|
out_le32(rstcr, val);
|
||||||
|
}
|
||||||
|
|
|
@ -7,6 +7,9 @@
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <libfdt.h>
|
#include <libfdt.h>
|
||||||
#include <fdt_support.h>
|
#include <fdt_support.h>
|
||||||
|
#ifdef CONFIG_FSL_ESDHC
|
||||||
|
#include <fsl_esdhc.h>
|
||||||
|
#endif
|
||||||
#include "mp.h"
|
#include "mp.h"
|
||||||
|
|
||||||
#ifdef CONFIG_MP
|
#ifdef CONFIG_MP
|
||||||
|
@ -62,7 +65,11 @@ void ft_cpu_setup(void *blob, bd_t *bd)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_NS16550
|
#ifdef CONFIG_SYS_NS16550
|
||||||
do_fixup_by_compat_u32(blob, "ns16550",
|
do_fixup_by_compat_u32(blob, "fsl,ns16550",
|
||||||
"clock-frequency", CONFIG_SYS_NS16550_CLK, 1);
|
"clock-frequency", CONFIG_SYS_NS16550_CLK, 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_FSL_ESDHC)
|
||||||
|
fdt_fixup_esdhc(blob, bd);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,115 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Freescale Semiconductor, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/errno.h>
|
||||||
|
#include <asm/arch/fsl_serdes.h>
|
||||||
|
#include <asm/arch-fsl-lsch3/immap_lsch3.h>
|
||||||
|
#include <fsl-mc/ldpaa_wriop.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_SYS_FSL_SRDS_1
|
||||||
|
static u8 serdes1_prtcl_map[SERDES_PRCTL_COUNT];
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SYS_FSL_SRDS_2
|
||||||
|
static u8 serdes2_prtcl_map[SERDES_PRCTL_COUNT];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int is_serdes_configured(enum srds_prtcl device)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SYS_FSL_SRDS_1
|
||||||
|
ret |= serdes1_prtcl_map[device];
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SYS_FSL_SRDS_2
|
||||||
|
ret |= serdes2_prtcl_map[device];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return !!ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int serdes_get_first_lane(u32 sd, enum srds_prtcl device)
|
||||||
|
{
|
||||||
|
struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||||
|
u32 cfg = in_le32(&gur->rcwsr[28]);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
switch (sd) {
|
||||||
|
#ifdef CONFIG_SYS_FSL_SRDS_1
|
||||||
|
case FSL_SRDS_1:
|
||||||
|
cfg &= FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_MASK;
|
||||||
|
cfg >>= FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_SHIFT;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SYS_FSL_SRDS_2
|
||||||
|
case FSL_SRDS_2:
|
||||||
|
cfg &= FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_MASK;
|
||||||
|
cfg >>= FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_SHIFT;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
printf("invalid SerDes%d\n", sd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Is serdes enabled at all? */
|
||||||
|
if (cfg == 0)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
for (i = 0; i < SRDS_MAX_LANES; i++) {
|
||||||
|
if (serdes_get_prtcl(sd, cfg, i) == device)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
void serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift,
|
||||||
|
u8 serdes_prtcl_map[SERDES_PRCTL_COUNT])
|
||||||
|
{
|
||||||
|
struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||||
|
u32 cfg;
|
||||||
|
int lane;
|
||||||
|
|
||||||
|
memset(serdes_prtcl_map, 0, sizeof(serdes_prtcl_map));
|
||||||
|
|
||||||
|
cfg = in_le32(&gur->rcwsr[28]) & sd_prctl_mask;
|
||||||
|
cfg >>= sd_prctl_shift;
|
||||||
|
printf("Using SERDES%d Protocol: %d (0x%x)\n", sd + 1, cfg, cfg);
|
||||||
|
|
||||||
|
if (!is_serdes_prtcl_valid(sd, cfg))
|
||||||
|
printf("SERDES%d[PRTCL] = 0x%x is not valid\n", sd + 1, cfg);
|
||||||
|
|
||||||
|
for (lane = 0; lane < SRDS_MAX_LANES; lane++) {
|
||||||
|
enum srds_prtcl lane_prtcl = serdes_get_prtcl(sd, cfg, lane);
|
||||||
|
if (unlikely(lane_prtcl >= SERDES_PRCTL_COUNT))
|
||||||
|
debug("Unknown SerDes lane protocol %d\n", lane_prtcl);
|
||||||
|
else {
|
||||||
|
serdes_prtcl_map[lane_prtcl] = 1;
|
||||||
|
#ifdef CONFIG_FSL_MC_ENET
|
||||||
|
wriop_init_dpmac(sd, lane + 1, (int)lane_prtcl);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fsl_serdes_init(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_SYS_FSL_SRDS_1
|
||||||
|
serdes_init(FSL_SRDS_1,
|
||||||
|
CONFIG_SYS_FSL_LSCH3_SERDES_ADDR,
|
||||||
|
FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_MASK,
|
||||||
|
FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_SHIFT,
|
||||||
|
serdes1_prtcl_map);
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SYS_FSL_SRDS_2
|
||||||
|
serdes_init(FSL_SRDS_2,
|
||||||
|
CONFIG_SYS_FSL_LSCH3_SERDES_ADDR + FSL_SRDS_2 * 0x10000,
|
||||||
|
FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_MASK,
|
||||||
|
FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_SHIFT,
|
||||||
|
serdes2_prtcl_map);
|
||||||
|
#endif
|
||||||
|
}
|
|
@ -15,6 +15,15 @@
|
||||||
ENTRY(lowlevel_init)
|
ENTRY(lowlevel_init)
|
||||||
mov x29, lr /* Save LR */
|
mov x29, lr /* Save LR */
|
||||||
|
|
||||||
|
/* Add fully-coherent masters to DVM domain */
|
||||||
|
ldr x1, =CCI_MN_BASE
|
||||||
|
ldr x2, [x1, #CCI_MN_RNF_NODEID_LIST]
|
||||||
|
str x2, [x1, #CCI_MN_DVM_DOMAIN_CTL_SET]
|
||||||
|
1: ldr x3, [x1, #CCI_MN_DVM_DOMAIN_CTL_SET]
|
||||||
|
mvn x0, x3
|
||||||
|
tst x0, x3 /* Wait for domain addition to complete */
|
||||||
|
b.ne 1b
|
||||||
|
|
||||||
/* Set the SMMU page size in the sACR register */
|
/* Set the SMMU page size in the sACR register */
|
||||||
ldr x1, =SMMU_BASE
|
ldr x1, =SMMU_BASE
|
||||||
ldr w0, [x1, #0x10]
|
ldr w0, [x1, #0x10]
|
||||||
|
@ -224,6 +233,9 @@ ENTRY(secondary_boot_func)
|
||||||
/* physical address of this cpus spin table element */
|
/* physical address of this cpus spin table element */
|
||||||
add x11, x1, x0
|
add x11, x1, x0
|
||||||
|
|
||||||
|
ldr x0, =__real_cntfrq
|
||||||
|
ldr x0, [x0]
|
||||||
|
msr cntfrq_el0, x0 /* set with real frequency */
|
||||||
str x9, [x11, #16] /* LPID */
|
str x9, [x11, #16] /* LPID */
|
||||||
mov x4, #1
|
mov x4, #1
|
||||||
str x4, [x11, #8] /* STATUS */
|
str x4, [x11, #8] /* STATUS */
|
||||||
|
@ -275,6 +287,9 @@ ENDPROC(secondary_switch_to_el1)
|
||||||
|
|
||||||
/* 64 bit alignment for elements accessed as data */
|
/* 64 bit alignment for elements accessed as data */
|
||||||
.align 4
|
.align 4
|
||||||
|
.global __real_cntfrq
|
||||||
|
__real_cntfrq:
|
||||||
|
.quad COUNTER_FREQUENCY
|
||||||
.globl __secondary_boot_code_size
|
.globl __secondary_boot_code_size
|
||||||
.type __secondary_boot_code_size, %object
|
.type __secondary_boot_code_size, %object
|
||||||
/* Secondary Boot Code ends here */
|
/* Secondary Boot Code ends here */
|
||||||
|
|
|
@ -0,0 +1,117 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Freescale Semiconductor, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <asm/arch/fsl_serdes.h>
|
||||||
|
#include <asm/arch-fsl-lsch3/immap_lsch3.h>
|
||||||
|
|
||||||
|
struct serdes_config {
|
||||||
|
u8 protocol;
|
||||||
|
u8 lanes[SRDS_MAX_LANES];
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct serdes_config serdes1_cfg_tbl[] = {
|
||||||
|
/* SerDes 1 */
|
||||||
|
{0x03, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2 } },
|
||||||
|
{0x05, {PCIE2, PCIE2, PCIE2, PCIE2, SGMII4, SGMII3, SGMII2, SGMII1 } },
|
||||||
|
{0x07, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, SGMII2,
|
||||||
|
SGMII1 } },
|
||||||
|
{0x09, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, SGMII2,
|
||||||
|
SGMII1 } },
|
||||||
|
{0x0A, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, SGMII2,
|
||||||
|
SGMII1 } },
|
||||||
|
{0x0C, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, SGMII2,
|
||||||
|
SGMII1 } },
|
||||||
|
{0x0E, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, SGMII2,
|
||||||
|
SGMII1 } },
|
||||||
|
{0x26, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, XFI2, XFI1 } },
|
||||||
|
{0x28, {SGMII8, SGMII7, SGMII6, SGMII5, XFI4, XFI3, XFI2, XFI1 } },
|
||||||
|
{0x2A, {XFI8, XFI7, XFI6, XFI5, XFI4, XFI3, XFI2, XFI1 } },
|
||||||
|
{0x2B, {SGMII8, SGMII7, SGMII6, SGMII5, XAUI1, XAUI1, XAUI1, XAUI1 } },
|
||||||
|
{0x32, {XAUI2, XAUI2, XAUI2, XAUI2, XAUI1, XAUI1, XAUI1, XAUI1 } },
|
||||||
|
{0x33, {PCIE2, PCIE2, PCIE2, PCIE2, QSGMII_D, QSGMII_C, QSGMII_B,
|
||||||
|
QSGMII_A} },
|
||||||
|
{0x35, {QSGMII_D, QSGMII_C, QSGMII_B, PCIE2, XFI4, XFI3, XFI2, XFI1 } },
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
static struct serdes_config serdes2_cfg_tbl[] = {
|
||||||
|
/* SerDes 2 */
|
||||||
|
{0x07, {SGMII9, SGMII10, SGMII11, SGMII12, SGMII13, SGMII14, SGMII15,
|
||||||
|
SGMII16 } },
|
||||||
|
{0x09, {SGMII9, SGMII10, SGMII11, SGMII12, SGMII13, SGMII14, SGMII15,
|
||||||
|
SGMII16 } },
|
||||||
|
{0x0A, {SGMII9, SGMII10, SGMII11, SGMII12, SGMII13, SGMII14, SGMII15,
|
||||||
|
SGMII16 } },
|
||||||
|
{0x0C, {SGMII9, SGMII10, SGMII11, SGMII12, SGMII13, SGMII14, SGMII15,
|
||||||
|
SGMII16 } },
|
||||||
|
{0x0E, {SGMII9, SGMII10, SGMII11, SGMII12, SGMII13, SGMII14, SGMII15,
|
||||||
|
SGMII16 } },
|
||||||
|
{0x3D, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3 } },
|
||||||
|
{0x3E, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3 } },
|
||||||
|
{0x3F, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4 } },
|
||||||
|
{0x40, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4 } },
|
||||||
|
{0x41, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, SATA1, SATA2 } },
|
||||||
|
{0x42, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, SATA1, SATA2 } },
|
||||||
|
{0x43, {PCIE3, PCIE3, PCIE3, PCIE3, NONE, NONE, SATA1, SATA2 } },
|
||||||
|
{0x44, {PCIE3, PCIE3, PCIE3, PCIE3, NONE, NONE, SATA1, SATA2 } },
|
||||||
|
{0x45, {PCIE3, SGMII10, SGMII11, SGMII12, PCIE4, SGMII14, SGMII15,
|
||||||
|
SGMII16 } },
|
||||||
|
{0x47, {SGMII9, SGMII10, SGMII11, SGMII12, PCIE4, PCIE4, PCIE4,
|
||||||
|
PCIE4 } },
|
||||||
|
{0x49, {SGMII9, SGMII10, SGMII11, SGMII12, PCIE4, PCIE4, SATA1,
|
||||||
|
SATA2 } },
|
||||||
|
{0x4A, {SGMII9, SGMII10, SGMII11, SGMII12, PCIE4, PCIE4, SATA1,
|
||||||
|
SATA2 } },
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct serdes_config *serdes_cfg_tbl[] = {
|
||||||
|
serdes1_cfg_tbl,
|
||||||
|
serdes2_cfg_tbl,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
|
||||||
|
{
|
||||||
|
struct serdes_config *ptr;
|
||||||
|
|
||||||
|
if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ptr = serdes_cfg_tbl[serdes];
|
||||||
|
while (ptr->protocol) {
|
||||||
|
if (ptr->protocol == cfg)
|
||||||
|
return ptr->lanes[lane];
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int is_serdes_prtcl_valid(int serdes, u32 prtcl)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
struct serdes_config *ptr;
|
||||||
|
|
||||||
|
if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ptr = serdes_cfg_tbl[serdes];
|
||||||
|
while (ptr->protocol) {
|
||||||
|
if (ptr->protocol == prtcl)
|
||||||
|
break;
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ptr->protocol)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (i = 0; i < SRDS_MAX_LANES; i++) {
|
||||||
|
if (ptr->lanes[i] != NONE)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -31,6 +31,13 @@ int fsl_lsch3_wake_seconday_cores(void)
|
||||||
int i, timeout = 10;
|
int i, timeout = 10;
|
||||||
u64 *table = get_spin_tbl_addr();
|
u64 *table = get_spin_tbl_addr();
|
||||||
|
|
||||||
|
#ifdef COUNTER_FREQUENCY_REAL
|
||||||
|
/* update for secondary cores */
|
||||||
|
__real_cntfrq = COUNTER_FREQUENCY_REAL;
|
||||||
|
flush_dcache_range((unsigned long)&__real_cntfrq,
|
||||||
|
(unsigned long)&__real_cntfrq + 8);
|
||||||
|
#endif
|
||||||
|
|
||||||
cores = cpu_mask();
|
cores = cpu_mask();
|
||||||
/* Clear spin table so that secondary processors
|
/* Clear spin table so that secondary processors
|
||||||
* observe the correct value after waking up from wfe.
|
* observe the correct value after waking up from wfe.
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#define id_to_core(x) ((x & 3) | (x >> 6))
|
#define id_to_core(x) ((x & 3) | (x >> 6))
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
extern u64 __spin_table[];
|
extern u64 __spin_table[];
|
||||||
|
extern u64 __real_cntfrq;
|
||||||
extern u64 *secondary_boot_code;
|
extern u64 *secondary_boot_code;
|
||||||
extern size_t __secondary_boot_code_size;
|
extern size_t __secondary_boot_code_size;
|
||||||
int fsl_lsch3_wake_seconday_cores(void);
|
int fsl_lsch3_wake_seconday_cores(void);
|
||||||
|
|
|
@ -0,0 +1,107 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Freescale Semiconductor
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <fsl_ifc.h>
|
||||||
|
#include <nand.h>
|
||||||
|
#include <spl.h>
|
||||||
|
#include <asm/arch-fsl-lsch3/soc.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/global_data.h>
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
static void erratum_a008751(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_SYS_FSL_ERRATUM_A008751
|
||||||
|
u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
|
||||||
|
|
||||||
|
writel(0x27672b2a, scfg + SCFG_USB3PRM1CR / 4);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void erratum_rcw_src(void)
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_SPL)
|
||||||
|
u32 __iomem *dcfg_ccsr = (u32 __iomem *)DCFG_BASE;
|
||||||
|
u32 __iomem *dcfg_dcsr = (u32 __iomem *)DCFG_DCSR_BASE;
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
val = in_le32(dcfg_ccsr + DCFG_PORSR1 / 4);
|
||||||
|
val &= ~DCFG_PORSR1_RCW_SRC;
|
||||||
|
val |= DCFG_PORSR1_RCW_SRC_NOR;
|
||||||
|
out_le32(dcfg_dcsr + DCFG_DCSR_PORCR1 / 4, val);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#define I2C_DEBUG_REG 0x6
|
||||||
|
#define I2C_GLITCH_EN 0x8
|
||||||
|
/*
|
||||||
|
* This erratum requires setting glitch_en bit to enable
|
||||||
|
* digital glitch filter to improve clock stability.
|
||||||
|
*/
|
||||||
|
static void erratum_a009203(void)
|
||||||
|
{
|
||||||
|
u8 __iomem *ptr;
|
||||||
|
#ifdef CONFIG_SYS_I2C
|
||||||
|
#ifdef I2C1_BASE_ADDR
|
||||||
|
ptr = (u8 __iomem *)(I2C1_BASE_ADDR + I2C_DEBUG_REG);
|
||||||
|
|
||||||
|
writeb(I2C_GLITCH_EN, ptr);
|
||||||
|
#endif
|
||||||
|
#ifdef I2C2_BASE_ADDR
|
||||||
|
ptr = (u8 __iomem *)(I2C2_BASE_ADDR + I2C_DEBUG_REG);
|
||||||
|
|
||||||
|
writeb(I2C_GLITCH_EN, ptr);
|
||||||
|
#endif
|
||||||
|
#ifdef I2C3_BASE_ADDR
|
||||||
|
ptr = (u8 __iomem *)(I2C3_BASE_ADDR + I2C_DEBUG_REG);
|
||||||
|
|
||||||
|
writeb(I2C_GLITCH_EN, ptr);
|
||||||
|
#endif
|
||||||
|
#ifdef I2C4_BASE_ADDR
|
||||||
|
ptr = (u8 __iomem *)(I2C4_BASE_ADDR + I2C_DEBUG_REG);
|
||||||
|
|
||||||
|
writeb(I2C_GLITCH_EN, ptr);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void fsl_lsch3_early_init_f(void)
|
||||||
|
{
|
||||||
|
erratum_a008751();
|
||||||
|
erratum_rcw_src();
|
||||||
|
init_early_memctl_regs(); /* tighten IFC timing */
|
||||||
|
erratum_a009203();
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SPL_BUILD
|
||||||
|
void board_init_f(ulong dummy)
|
||||||
|
{
|
||||||
|
/* Clear global data */
|
||||||
|
memset((void *)gd, 0, sizeof(gd_t));
|
||||||
|
|
||||||
|
arch_cpu_init();
|
||||||
|
board_early_init_f();
|
||||||
|
timer_init();
|
||||||
|
env_init();
|
||||||
|
gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE);
|
||||||
|
|
||||||
|
serial_init();
|
||||||
|
console_init_f();
|
||||||
|
dram_init();
|
||||||
|
|
||||||
|
/* Clear the BSS. */
|
||||||
|
memset(__bss_start, 0, __bss_end - __bss_start);
|
||||||
|
|
||||||
|
board_init_r(NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 spl_boot_device(void)
|
||||||
|
{
|
||||||
|
return BOOT_DEVICE_NAND;
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -26,7 +26,7 @@ void get_sys_info(struct sys_info *sys_info)
|
||||||
{
|
{
|
||||||
struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||||
#ifdef CONFIG_FSL_IFC
|
#ifdef CONFIG_FSL_IFC
|
||||||
struct fsl_ifc *ifc_regs = (void *)CONFIG_SYS_IFC_ADDR;
|
struct fsl_ifc ifc_regs = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL};
|
||||||
u32 ccr;
|
u32 ccr;
|
||||||
#endif
|
#endif
|
||||||
struct ccsr_clk_cluster_group __iomem *clk_grp[2] = {
|
struct ccsr_clk_cluster_group __iomem *clk_grp[2] = {
|
||||||
|
@ -86,6 +86,8 @@ void get_sys_info(struct sys_info *sys_info)
|
||||||
sys_info->freq_systembus *= (in_le32(&gur->rcwsr[0]) >>
|
sys_info->freq_systembus *= (in_le32(&gur->rcwsr[0]) >>
|
||||||
FSL_CHASSIS3_RCWSR0_SYS_PLL_RAT_SHIFT) &
|
FSL_CHASSIS3_RCWSR0_SYS_PLL_RAT_SHIFT) &
|
||||||
FSL_CHASSIS3_RCWSR0_SYS_PLL_RAT_MASK;
|
FSL_CHASSIS3_RCWSR0_SYS_PLL_RAT_MASK;
|
||||||
|
/* Platform clock is half of platform PLL */
|
||||||
|
sys_info->freq_systembus /= 2;
|
||||||
sys_info->freq_ddrbus *= (in_le32(&gur->rcwsr[0]) >>
|
sys_info->freq_ddrbus *= (in_le32(&gur->rcwsr[0]) >>
|
||||||
FSL_CHASSIS3_RCWSR0_MEM_PLL_RAT_SHIFT) &
|
FSL_CHASSIS3_RCWSR0_MEM_PLL_RAT_SHIFT) &
|
||||||
FSL_CHASSIS3_RCWSR0_MEM_PLL_RAT_MASK;
|
FSL_CHASSIS3_RCWSR0_MEM_PLL_RAT_MASK;
|
||||||
|
@ -102,10 +104,7 @@ void get_sys_info(struct sys_info *sys_info)
|
||||||
offsetof(struct ccsr_clk_cluster_group,
|
offsetof(struct ccsr_clk_cluster_group,
|
||||||
pllngsr[i%3].gsr));
|
pllngsr[i%3].gsr));
|
||||||
ratio[i] = (in_le32(offset) >> 1) & 0x3f;
|
ratio[i] = (in_le32(offset) >> 1) & 0x3f;
|
||||||
if (ratio[i] > 4)
|
freq_c_pll[i] = sysclk * ratio[i];
|
||||||
freq_c_pll[i] = sysclk * ratio[i];
|
|
||||||
else
|
|
||||||
freq_c_pll[i] = sys_info->freq_systembus * ratio[i];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
|
for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
|
||||||
|
@ -119,7 +118,7 @@ void get_sys_info(struct sys_info *sys_info)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_FSL_IFC)
|
#if defined(CONFIG_FSL_IFC)
|
||||||
ccr = in_le32(&ifc_regs->ifc_ccr);
|
ccr = in_le32(&ifc_regs.gregs->ifc_ccr);
|
||||||
ccr = ((ccr & IFC_CCR_CLK_DIV_MASK) >> IFC_CCR_CLK_DIV_SHIFT) + 1;
|
ccr = ((ccr & IFC_CCR_CLK_DIV_MASK) >> IFC_CCR_CLK_DIV_SHIFT) + 1;
|
||||||
|
|
||||||
sys_info->freq_localbus = sys_info->freq_systembus / ccr;
|
sys_info->freq_localbus = sys_info->freq_systembus / ccr;
|
||||||
|
|
|
@ -25,7 +25,18 @@ unsigned long get_tbclk(void)
|
||||||
unsigned long timer_read_counter(void)
|
unsigned long timer_read_counter(void)
|
||||||
{
|
{
|
||||||
unsigned long cntpct;
|
unsigned long cntpct;
|
||||||
|
#ifdef CONFIG_SYS_FSL_ERRATUM_A008585
|
||||||
|
/* This erratum number needs to be confirmed to match ARM document */
|
||||||
|
unsigned long temp;
|
||||||
|
#endif
|
||||||
isb();
|
isb();
|
||||||
asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
|
asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
|
||||||
|
#ifdef CONFIG_SYS_FSL_ERRATUM_A008585
|
||||||
|
asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
|
||||||
|
while (temp != cntpct) {
|
||||||
|
asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
|
||||||
|
asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return cntpct;
|
return cntpct;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2013
|
||||||
|
* David Feng <fenghua@phytium.com.cn>
|
||||||
|
*
|
||||||
|
* (C) Copyright 2002
|
||||||
|
* Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
|
||||||
|
*
|
||||||
|
* (C) Copyright 2010
|
||||||
|
* Texas Instruments, <www.ti.com>
|
||||||
|
* Aneesh V <aneesh@ti.com>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
MEMORY { .sram : ORIGIN = CONFIG_SPL_TEXT_BASE,
|
||||||
|
LENGTH = CONFIG_SPL_MAX_SIZE }
|
||||||
|
MEMORY { .sdram : ORIGIN = CONFIG_SPL_BSS_START_ADDR,
|
||||||
|
LENGTH = CONFIG_SPL_BSS_MAX_SIZE }
|
||||||
|
|
||||||
|
OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64")
|
||||||
|
OUTPUT_ARCH(aarch64)
|
||||||
|
ENTRY(_start)
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.text : {
|
||||||
|
. = ALIGN(8);
|
||||||
|
*(.__image_copy_start)
|
||||||
|
CPUDIR/start.o (.text*)
|
||||||
|
*(.text*)
|
||||||
|
} >.sram
|
||||||
|
|
||||||
|
.rodata : {
|
||||||
|
. = ALIGN(8);
|
||||||
|
*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
|
||||||
|
} >.sram
|
||||||
|
|
||||||
|
.data : {
|
||||||
|
. = ALIGN(8);
|
||||||
|
*(.data*)
|
||||||
|
} >.sram
|
||||||
|
|
||||||
|
.u_boot_list : {
|
||||||
|
. = ALIGN(8);
|
||||||
|
KEEP(*(SORT(.u_boot_list*)));
|
||||||
|
} >.sram
|
||||||
|
|
||||||
|
.image_copy_end : {
|
||||||
|
. = ALIGN(8);
|
||||||
|
*(.__image_copy_end)
|
||||||
|
} >.sram
|
||||||
|
|
||||||
|
.end : {
|
||||||
|
. = ALIGN(8);
|
||||||
|
*(.__end)
|
||||||
|
} >.sram
|
||||||
|
|
||||||
|
.bss_start : {
|
||||||
|
. = ALIGN(8);
|
||||||
|
KEEP(*(.__bss_start));
|
||||||
|
} >.sdram
|
||||||
|
|
||||||
|
.bss : {
|
||||||
|
*(.bss*)
|
||||||
|
. = ALIGN(8);
|
||||||
|
} >.sdram
|
||||||
|
|
||||||
|
.bss_end : {
|
||||||
|
KEEP(*(.__bss_end));
|
||||||
|
} >.sdram
|
||||||
|
|
||||||
|
/DISCARD/ : { *(.dynsym) }
|
||||||
|
/DISCARD/ : { *(.dynstr*) }
|
||||||
|
/DISCARD/ : { *(.dynamic*) }
|
||||||
|
/DISCARD/ : { *(.plt*) }
|
||||||
|
/DISCARD/ : { *(.interp*) }
|
||||||
|
/DISCARD/ : { *(.gnu*) }
|
||||||
|
}
|
|
@ -7,3 +7,4 @@
|
||||||
|
|
||||||
obj-y += clk.o
|
obj-y += clk.o
|
||||||
obj-y += cpu.o
|
obj-y += cpu.o
|
||||||
|
obj-$(CONFIG_MP) += mp.o
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
#include <asm/arch/clk.h>
|
||||||
#include <asm/arch/hardware.h>
|
#include <asm/arch/hardware.h>
|
||||||
#include <asm/arch/sys_proto.h>
|
#include <asm/arch/sys_proto.h>
|
||||||
|
|
||||||
|
@ -16,6 +17,8 @@ unsigned long get_uart_clk(int dev_id)
|
||||||
u32 ver = zynqmp_get_silicon_version();
|
u32 ver = zynqmp_get_silicon_version();
|
||||||
|
|
||||||
switch (ver) {
|
switch (ver) {
|
||||||
|
case ZYNQMP_CSU_VERSION_VELOCE:
|
||||||
|
return 48000;
|
||||||
case ZYNQMP_CSU_VERSION_EP108:
|
case ZYNQMP_CSU_VERSION_EP108:
|
||||||
return 25000000;
|
return 25000000;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,9 +20,175 @@ unsigned int zynqmp_get_silicon_version(void)
|
||||||
gd->cpu_clk = get_tbclk();
|
gd->cpu_clk = get_tbclk();
|
||||||
|
|
||||||
switch (gd->cpu_clk) {
|
switch (gd->cpu_clk) {
|
||||||
|
case 0 ... 1000000:
|
||||||
|
return ZYNQMP_CSU_VERSION_VELOCE;
|
||||||
case 50000000:
|
case 50000000:
|
||||||
return ZYNQMP_CSU_VERSION_QEMU;
|
return ZYNQMP_CSU_VERSION_QEMU;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ZYNQMP_CSU_VERSION_EP108;
|
return ZYNQMP_CSU_VERSION_EP108;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_SYS_DCACHE_OFF
|
||||||
|
#include <asm/armv8/mmu.h>
|
||||||
|
|
||||||
|
#define SECTION_SHIFT_L1 30UL
|
||||||
|
#define SECTION_SHIFT_L2 21UL
|
||||||
|
#define BLOCK_SIZE_L0 0x8000000000UL
|
||||||
|
#define BLOCK_SIZE_L1 (1 << SECTION_SHIFT_L1)
|
||||||
|
#define BLOCK_SIZE_L2 (1 << SECTION_SHIFT_L2)
|
||||||
|
|
||||||
|
#define TCR_TG1_4K (1 << 31)
|
||||||
|
#define TCR_EPD1_DISABLE (1 << 23)
|
||||||
|
#define ZYNQMO_VA_BITS 40
|
||||||
|
#define ZYNQMP_TCR TCR_TG1_4K | \
|
||||||
|
TCR_EPD1_DISABLE | \
|
||||||
|
TCR_SHARED_OUTER | \
|
||||||
|
TCR_SHARED_INNER | \
|
||||||
|
TCR_IRGN_WBWA | \
|
||||||
|
TCR_ORGN_WBWA | \
|
||||||
|
TCR_T0SZ(ZYNQMO_VA_BITS)
|
||||||
|
|
||||||
|
#define MEMORY_ATTR PMD_SECT_AF | PMD_SECT_INNER_SHARE | \
|
||||||
|
PMD_ATTRINDX(MT_NORMAL) | \
|
||||||
|
PMD_TYPE_SECT
|
||||||
|
#define DEVICE_ATTR PMD_SECT_AF | PMD_SECT_PXN | \
|
||||||
|
PMD_SECT_UXN | PMD_ATTRINDX(MT_DEVICE_NGNRNE) | \
|
||||||
|
PMD_TYPE_SECT
|
||||||
|
|
||||||
|
/* 4K size is required to place 512 entries in each level */
|
||||||
|
#define TLB_TABLE_SIZE 0x1000
|
||||||
|
|
||||||
|
struct attr_tbl {
|
||||||
|
u32 num;
|
||||||
|
u64 attr;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct attr_tbl attr_tbll1t0[4] = { {16, 0x0},
|
||||||
|
{8, DEVICE_ATTR},
|
||||||
|
{32, MEMORY_ATTR},
|
||||||
|
{456, DEVICE_ATTR}
|
||||||
|
};
|
||||||
|
static struct attr_tbl attr_tbll2t3[4] = { {0x180, DEVICE_ATTR},
|
||||||
|
{0x40, 0x0},
|
||||||
|
{0x3F, DEVICE_ATTR},
|
||||||
|
{0x1, MEMORY_ATTR}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This mmu table looks as below
|
||||||
|
* Level 0 table contains two entries to 512GB sizes. One is Level1 Table 0
|
||||||
|
* and other Level1 Table1.
|
||||||
|
* Level1 Table0 contains entries for each 1GB from 0 to 511GB.
|
||||||
|
* Level1 Table1 contains entries for each 1GB from 512GB to 1TB.
|
||||||
|
* Level2 Table0, Level2 Table1, Level2 Table2 and Level2 Table3 contains
|
||||||
|
* entries for each 2MB starting from 0GB, 1GB, 2GB and 3GB respectively.
|
||||||
|
*/
|
||||||
|
static void zynqmp_mmu_setup(void)
|
||||||
|
{
|
||||||
|
int el;
|
||||||
|
u32 index_attr;
|
||||||
|
u64 i, section_l1t0, section_l1t1;
|
||||||
|
u64 section_l2t0, section_l2t1, section_l2t2, section_l2t3;
|
||||||
|
u64 *level0_table = (u64 *)gd->arch.tlb_addr;
|
||||||
|
u64 *level1_table_0 = (u64 *)(gd->arch.tlb_addr + TLB_TABLE_SIZE);
|
||||||
|
u64 *level1_table_1 = (u64 *)(gd->arch.tlb_addr + (2 * TLB_TABLE_SIZE));
|
||||||
|
u64 *level2_table_0 = (u64 *)(gd->arch.tlb_addr + (3 * TLB_TABLE_SIZE));
|
||||||
|
u64 *level2_table_1 = (u64 *)(gd->arch.tlb_addr + (4 * TLB_TABLE_SIZE));
|
||||||
|
u64 *level2_table_2 = (u64 *)(gd->arch.tlb_addr + (5 * TLB_TABLE_SIZE));
|
||||||
|
u64 *level2_table_3 = (u64 *)(gd->arch.tlb_addr + (6 * TLB_TABLE_SIZE));
|
||||||
|
|
||||||
|
level0_table[0] =
|
||||||
|
(u64)level1_table_0 | PMD_TYPE_TABLE;
|
||||||
|
level0_table[1] =
|
||||||
|
(u64)level1_table_1 | PMD_TYPE_TABLE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* set level 1 table 0, covering 0 to 512GB
|
||||||
|
* set level 1 table 1, covering 512GB to 1TB
|
||||||
|
*/
|
||||||
|
section_l1t0 = 0;
|
||||||
|
section_l1t1 = BLOCK_SIZE_L0;
|
||||||
|
|
||||||
|
index_attr = 0;
|
||||||
|
for (i = 0; i < 512; i++) {
|
||||||
|
level1_table_0[i] = section_l1t0;
|
||||||
|
level1_table_0[i] |= attr_tbll1t0[index_attr].attr;
|
||||||
|
attr_tbll1t0[index_attr].num--;
|
||||||
|
if (attr_tbll1t0[index_attr].num == 0)
|
||||||
|
index_attr++;
|
||||||
|
level1_table_1[i] = section_l1t1;
|
||||||
|
level1_table_1[i] |= DEVICE_ATTR;
|
||||||
|
section_l1t0 += BLOCK_SIZE_L1;
|
||||||
|
section_l1t1 += BLOCK_SIZE_L1;
|
||||||
|
}
|
||||||
|
|
||||||
|
level1_table_0[0] =
|
||||||
|
(u64)level2_table_0 | PMD_TYPE_TABLE;
|
||||||
|
level1_table_0[1] =
|
||||||
|
(u64)level2_table_1 | PMD_TYPE_TABLE;
|
||||||
|
level1_table_0[2] =
|
||||||
|
(u64)level2_table_2 | PMD_TYPE_TABLE;
|
||||||
|
level1_table_0[3] =
|
||||||
|
(u64)level2_table_3 | PMD_TYPE_TABLE;
|
||||||
|
|
||||||
|
section_l2t0 = 0;
|
||||||
|
section_l2t1 = section_l2t0 + BLOCK_SIZE_L1; /* 1GB */
|
||||||
|
section_l2t2 = section_l2t1 + BLOCK_SIZE_L1; /* 2GB */
|
||||||
|
section_l2t3 = section_l2t2 + BLOCK_SIZE_L1; /* 3GB */
|
||||||
|
|
||||||
|
index_attr = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 512; i++) {
|
||||||
|
level2_table_0[i] = section_l2t0 | MEMORY_ATTR;
|
||||||
|
level2_table_1[i] = section_l2t1 | MEMORY_ATTR;
|
||||||
|
level2_table_2[i] = section_l2t2 | DEVICE_ATTR;
|
||||||
|
level2_table_3[i] = section_l2t3 |
|
||||||
|
attr_tbll2t3[index_attr].attr;
|
||||||
|
attr_tbll2t3[index_attr].num--;
|
||||||
|
if (attr_tbll2t3[index_attr].num == 0)
|
||||||
|
index_attr++;
|
||||||
|
section_l2t0 += BLOCK_SIZE_L2;
|
||||||
|
section_l2t1 += BLOCK_SIZE_L2;
|
||||||
|
section_l2t2 += BLOCK_SIZE_L2;
|
||||||
|
section_l2t3 += BLOCK_SIZE_L2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* flush new MMU table */
|
||||||
|
flush_dcache_range(gd->arch.tlb_addr,
|
||||||
|
gd->arch.tlb_addr + gd->arch.tlb_size);
|
||||||
|
|
||||||
|
/* point TTBR to the new table */
|
||||||
|
el = current_el();
|
||||||
|
set_ttbr_tcr_mair(el, gd->arch.tlb_addr,
|
||||||
|
ZYNQMP_TCR, MEMORY_ATTRIBUTES);
|
||||||
|
|
||||||
|
set_sctlr(get_sctlr() | CR_M);
|
||||||
|
}
|
||||||
|
|
||||||
|
int arch_cpu_init(void)
|
||||||
|
{
|
||||||
|
icache_enable();
|
||||||
|
__asm_invalidate_dcache_all();
|
||||||
|
__asm_invalidate_tlb_all();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function is called from lib/board.c.
|
||||||
|
* It recreates MMU table in main memory. MMU and d-cache are enabled earlier.
|
||||||
|
* There is no need to disable d-cache for this operation.
|
||||||
|
*/
|
||||||
|
void enable_caches(void)
|
||||||
|
{
|
||||||
|
/* The data cache is not active unless the mmu is enabled */
|
||||||
|
if (!(get_sctlr() & CR_M)) {
|
||||||
|
invalidate_dcache_all();
|
||||||
|
__asm_invalidate_tlb_all();
|
||||||
|
zynqmp_mmu_setup();
|
||||||
|
}
|
||||||
|
puts("Enabling Caches...\n");
|
||||||
|
|
||||||
|
set_sctlr(get_sctlr() | CR_C);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,242 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2014 - 2015 Xilinx, Inc.
|
||||||
|
* Michal Simek <michal.simek@xilinx.com>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <asm/arch/hardware.h>
|
||||||
|
#include <asm/arch/sys_proto.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
|
||||||
|
#define LOCK 0
|
||||||
|
#define SPLIT 1
|
||||||
|
|
||||||
|
#define HALT 0
|
||||||
|
#define RELEASE 1
|
||||||
|
|
||||||
|
#define ZYNQMP_BOOTADDR_HIGH_MASK 0xFFFFFFFF
|
||||||
|
#define ZYNQMP_R5_HIVEC_ADDR 0xFFFF0000
|
||||||
|
#define ZYNQMP_R5_LOVEC_ADDR 0x0
|
||||||
|
#define ZYNQMP_RPU_CFG_CPU_HALT_MASK 0x01
|
||||||
|
#define ZYNQMP_RPU_CFG_HIVEC_MASK 0x04
|
||||||
|
#define ZYNQMP_RPU_GLBL_CTRL_SPLIT_LOCK_MASK 0x08
|
||||||
|
#define ZYNQMP_RPU_GLBL_CTRL_TCM_COMB_MASK 0x40
|
||||||
|
#define ZYNQMP_RPU_GLBL_CTRL_SLCLAMP_MASK 0x10
|
||||||
|
|
||||||
|
#define ZYNQMP_CRLAPB_RST_LPD_AMBA_RST_MASK 0x04
|
||||||
|
#define ZYNQMP_CRLAPB_RST_LPD_R50_RST_MASK 0x01
|
||||||
|
#define ZYNQMP_CRLAPB_RST_LPD_R51_RST_MASK 0x02
|
||||||
|
#define ZYNQMP_CRLAPB_CPU_R5_CTRL_CLKACT_MASK 0x1000000
|
||||||
|
|
||||||
|
#define ZYNQMP_TCM_START_ADDRESS 0xFFE00000
|
||||||
|
#define ZYNQMP_TCM_BOTH_SIZE 0x40000
|
||||||
|
|
||||||
|
#define ZYNQMP_CORE_APU0 0
|
||||||
|
#define ZYNQMP_CORE_APU3 3
|
||||||
|
|
||||||
|
#define ZYNQMP_MAX_CORES 6
|
||||||
|
|
||||||
|
int is_core_valid(unsigned int core)
|
||||||
|
{
|
||||||
|
if (core < ZYNQMP_MAX_CORES)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cpu_reset(int nr)
|
||||||
|
{
|
||||||
|
puts("Feature is not implemented.\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_r5_halt_mode(u8 halt, u8 mode)
|
||||||
|
{
|
||||||
|
u32 tmp;
|
||||||
|
|
||||||
|
tmp = readl(&rpu_base->rpu0_cfg);
|
||||||
|
if (halt == HALT)
|
||||||
|
tmp &= ~ZYNQMP_RPU_CFG_CPU_HALT_MASK;
|
||||||
|
else
|
||||||
|
tmp |= ZYNQMP_RPU_CFG_CPU_HALT_MASK;
|
||||||
|
writel(tmp, &rpu_base->rpu0_cfg);
|
||||||
|
|
||||||
|
if (mode == LOCK) {
|
||||||
|
tmp = readl(&rpu_base->rpu1_cfg);
|
||||||
|
if (halt == HALT)
|
||||||
|
tmp &= ~ZYNQMP_RPU_CFG_CPU_HALT_MASK;
|
||||||
|
else
|
||||||
|
tmp |= ZYNQMP_RPU_CFG_CPU_HALT_MASK;
|
||||||
|
writel(tmp, &rpu_base->rpu1_cfg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_r5_tcm_mode(u8 mode)
|
||||||
|
{
|
||||||
|
u32 tmp;
|
||||||
|
|
||||||
|
tmp = readl(&rpu_base->rpu_glbl_ctrl);
|
||||||
|
if (mode == LOCK) {
|
||||||
|
tmp &= ~ZYNQMP_RPU_GLBL_CTRL_SPLIT_LOCK_MASK;
|
||||||
|
tmp |= ZYNQMP_RPU_GLBL_CTRL_TCM_COMB_MASK |
|
||||||
|
ZYNQMP_RPU_GLBL_CTRL_SLCLAMP_MASK;
|
||||||
|
} else {
|
||||||
|
tmp |= ZYNQMP_RPU_GLBL_CTRL_SPLIT_LOCK_MASK;
|
||||||
|
tmp &= ~(ZYNQMP_RPU_GLBL_CTRL_TCM_COMB_MASK |
|
||||||
|
ZYNQMP_RPU_GLBL_CTRL_SLCLAMP_MASK);
|
||||||
|
}
|
||||||
|
|
||||||
|
writel(tmp, &rpu_base->rpu_glbl_ctrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_r5_reset(u8 mode)
|
||||||
|
{
|
||||||
|
u32 tmp;
|
||||||
|
|
||||||
|
tmp = readl(&crlapb_base->rst_lpd_top);
|
||||||
|
tmp |= (ZYNQMP_CRLAPB_RST_LPD_AMBA_RST_MASK |
|
||||||
|
ZYNQMP_CRLAPB_RST_LPD_R50_RST_MASK);
|
||||||
|
|
||||||
|
if (mode == LOCK)
|
||||||
|
tmp |= ZYNQMP_CRLAPB_RST_LPD_R51_RST_MASK;
|
||||||
|
|
||||||
|
writel(tmp, &crlapb_base->rst_lpd_top);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void release_r5_reset(u8 mode)
|
||||||
|
{
|
||||||
|
u32 tmp;
|
||||||
|
|
||||||
|
tmp = readl(&crlapb_base->rst_lpd_top);
|
||||||
|
tmp &= ~(ZYNQMP_CRLAPB_RST_LPD_AMBA_RST_MASK |
|
||||||
|
ZYNQMP_CRLAPB_RST_LPD_R50_RST_MASK);
|
||||||
|
|
||||||
|
if (mode == LOCK)
|
||||||
|
tmp &= ~ZYNQMP_CRLAPB_RST_LPD_R51_RST_MASK;
|
||||||
|
|
||||||
|
writel(tmp, &crlapb_base->rst_lpd_top);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void enable_clock_r5(void)
|
||||||
|
{
|
||||||
|
u32 tmp;
|
||||||
|
|
||||||
|
tmp = readl(&crlapb_base->cpu_r5_ctrl);
|
||||||
|
tmp |= ZYNQMP_CRLAPB_CPU_R5_CTRL_CLKACT_MASK;
|
||||||
|
writel(tmp, &crlapb_base->cpu_r5_ctrl);
|
||||||
|
|
||||||
|
/* Give some delay for clock
|
||||||
|
* to propogate */
|
||||||
|
udelay(0x500);
|
||||||
|
}
|
||||||
|
|
||||||
|
int cpu_disable(int nr)
|
||||||
|
{
|
||||||
|
if (nr >= ZYNQMP_CORE_APU0 && nr <= ZYNQMP_CORE_APU3) {
|
||||||
|
u32 val = readl(&crfapb_base->rst_fpd_apu);
|
||||||
|
val |= 1 << nr;
|
||||||
|
writel(val, &crfapb_base->rst_fpd_apu);
|
||||||
|
} else {
|
||||||
|
set_r5_reset(LOCK);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cpu_status(int nr)
|
||||||
|
{
|
||||||
|
if (nr >= ZYNQMP_CORE_APU0 && nr <= ZYNQMP_CORE_APU3) {
|
||||||
|
u32 addr_low = readl(((u8 *)&apu_base->rvbar_addr0_l) + nr * 8);
|
||||||
|
u32 addr_high = readl(((u8 *)&apu_base->rvbar_addr0_h) +
|
||||||
|
nr * 8);
|
||||||
|
u32 val = readl(&crfapb_base->rst_fpd_apu);
|
||||||
|
val &= 1 << nr;
|
||||||
|
printf("APU CPU%d %s - starting address HI: %x, LOW: %x\n",
|
||||||
|
nr, val ? "OFF" : "ON" , addr_high, addr_low);
|
||||||
|
} else {
|
||||||
|
u32 val = readl(&crlapb_base->rst_lpd_top);
|
||||||
|
val &= 1 << (nr - 4);
|
||||||
|
printf("RPU CPU%d %s\n", nr - 4, val ? "OFF" : "ON");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_r5_start(u8 high)
|
||||||
|
{
|
||||||
|
u32 tmp;
|
||||||
|
|
||||||
|
tmp = readl(&rpu_base->rpu0_cfg);
|
||||||
|
if (high)
|
||||||
|
tmp |= ZYNQMP_RPU_CFG_HIVEC_MASK;
|
||||||
|
else
|
||||||
|
tmp &= ~ZYNQMP_RPU_CFG_HIVEC_MASK;
|
||||||
|
writel(tmp, &rpu_base->rpu0_cfg);
|
||||||
|
|
||||||
|
tmp = readl(&rpu_base->rpu1_cfg);
|
||||||
|
if (high)
|
||||||
|
tmp |= ZYNQMP_RPU_CFG_HIVEC_MASK;
|
||||||
|
else
|
||||||
|
tmp &= ~ZYNQMP_RPU_CFG_HIVEC_MASK;
|
||||||
|
writel(tmp, &rpu_base->rpu1_cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
int cpu_release(int nr, int argc, char * const argv[])
|
||||||
|
{
|
||||||
|
if (nr >= ZYNQMP_CORE_APU0 && nr <= ZYNQMP_CORE_APU3) {
|
||||||
|
u64 boot_addr = simple_strtoull(argv[0], NULL, 16);
|
||||||
|
/* HIGH */
|
||||||
|
writel((u32)(boot_addr >> 32),
|
||||||
|
((u8 *)&apu_base->rvbar_addr0_h) + nr * 8);
|
||||||
|
/* LOW */
|
||||||
|
writel((u32)(boot_addr & ZYNQMP_BOOTADDR_HIGH_MASK),
|
||||||
|
((u8 *)&apu_base->rvbar_addr0_l) + nr * 8);
|
||||||
|
|
||||||
|
u32 val = readl(&crfapb_base->rst_fpd_apu);
|
||||||
|
val &= ~(1 << nr);
|
||||||
|
writel(val, &crfapb_base->rst_fpd_apu);
|
||||||
|
} else {
|
||||||
|
if (argc != 2) {
|
||||||
|
printf("Invalid number of arguments to release.\n");
|
||||||
|
printf("<addr> <mode>-Start addr lockstep or split\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 boot_addr = simple_strtoul(argv[0], NULL, 16);
|
||||||
|
if (!(boot_addr == ZYNQMP_R5_LOVEC_ADDR ||
|
||||||
|
boot_addr == ZYNQMP_R5_HIVEC_ADDR)) {
|
||||||
|
printf("Invalid starting address 0x%x\n", boot_addr);
|
||||||
|
printf("0 or 0xffff0000 are permitted\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strncmp(argv[1], "lockstep", 8)) {
|
||||||
|
printf("R5 lockstep mode\n");
|
||||||
|
set_r5_tcm_mode(LOCK);
|
||||||
|
set_r5_halt_mode(HALT, LOCK);
|
||||||
|
|
||||||
|
if (boot_addr == 0)
|
||||||
|
set_r5_start(0);
|
||||||
|
else
|
||||||
|
set_r5_start(1);
|
||||||
|
|
||||||
|
enable_clock_r5();
|
||||||
|
release_r5_reset(LOCK);
|
||||||
|
set_r5_halt_mode(RELEASE, LOCK);
|
||||||
|
} else if (!strncmp(argv[1], "split", 5)) {
|
||||||
|
printf("R5 split mode\n");
|
||||||
|
set_r5_tcm_mode(SPLIT);
|
||||||
|
set_r5_halt_mode(HALT, SPLIT);
|
||||||
|
enable_clock_r5();
|
||||||
|
release_r5_reset(SPLIT);
|
||||||
|
set_r5_halt_mode(RELEASE, SPLIT);
|
||||||
|
} else {
|
||||||
|
printf("Unsupported mode\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -39,11 +39,12 @@ dtb-$(CONFIG_ARCH_UNIPHIER) += \
|
||||||
uniphier-ph1-pro4-ref.dtb \
|
uniphier-ph1-pro4-ref.dtb \
|
||||||
uniphier-ph1-ld4-ref.dtb \
|
uniphier-ph1-ld4-ref.dtb \
|
||||||
uniphier-ph1-sld8-ref.dtb
|
uniphier-ph1-sld8-ref.dtb
|
||||||
dtb-$(CONFIG_ZYNQ) += zynq-zc702.dtb \
|
dtb-$(CONFIG_ARCH_ZYNQ) += zynq-zc702.dtb \
|
||||||
zynq-zc706.dtb \
|
zynq-zc706.dtb \
|
||||||
zynq-zed.dtb \
|
zynq-zed.dtb \
|
||||||
zynq-zybo.dtb \
|
zynq-zybo.dtb \
|
||||||
zynq-microzed.dtb \
|
zynq-microzed.dtb \
|
||||||
|
zynq-picozed.dtb \
|
||||||
zynq-zc770-xm010.dtb \
|
zynq-zc770-xm010.dtb \
|
||||||
zynq-zc770-xm012.dtb \
|
zynq-zc770-xm012.dtb \
|
||||||
zynq-zc770-xm013.dtb
|
zynq-zc770-xm013.dtb
|
||||||
|
@ -54,6 +55,9 @@ dtb-$(CONFIG_SOCFPGA) += \
|
||||||
socfpga_cyclone5_socdk.dtb \
|
socfpga_cyclone5_socdk.dtb \
|
||||||
socfpga_cyclone5_socrates.dtb
|
socfpga_cyclone5_socrates.dtb
|
||||||
|
|
||||||
|
dtb-$(CONFIG_LS102XA) += ls1021a-qds.dtb \
|
||||||
|
ls1021a-twr.dtb
|
||||||
|
|
||||||
targets += $(dtb-y)
|
targets += $(dtb-y)
|
||||||
|
|
||||||
DTC_FLAGS += -R 4 -p 0x1000
|
DTC_FLAGS += -R 4 -p 0x1000
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
* U-Boot additions to enable a generic Exynos GPIO driver
|
* U-Boot additions to enable a generic Exynos GPIO driver
|
||||||
*
|
*
|
||||||
* Copyright (c) 2014 Google, Inc
|
* Copyright (c) 2014 Google, Inc
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/{
|
/{
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
* U-Boot additions to enable a generic Exynos GPIO driver
|
* U-Boot additions to enable a generic Exynos GPIO driver
|
||||||
*
|
*
|
||||||
* Copyright (c) 2014 Google, Inc
|
* Copyright (c) 2014 Google, Inc
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/{
|
/{
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
* U-Boot additions to enable a generic Exynos GPIO driver
|
* U-Boot additions to enable a generic Exynos GPIO driver
|
||||||
*
|
*
|
||||||
* Copyright (c) 2014 Google, Inc
|
* Copyright (c) 2014 Google, Inc
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/{
|
/{
|
||||||
|
|
|
@ -40,9 +40,9 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
i2c4: i2c@12ca0000 {
|
i2c4: i2c@12ca0000 {
|
||||||
cros-ec@1e {
|
cros_ec: cros-ec@1e {
|
||||||
reg = <0x1e>;
|
reg = <0x1e>;
|
||||||
compatible = "google,cros-ec";
|
compatible = "google,cros-ec-i2c";
|
||||||
i2c-max-frequency = <100000>;
|
i2c-max-frequency = <100000>;
|
||||||
u-boot,i2c-offset-len = <0>;
|
u-boot,i2c-offset-len = <0>;
|
||||||
ec-interrupt = <&gpx1 6 GPIO_ACTIVE_LOW>;
|
ec-interrupt = <&gpx1 6 GPIO_ACTIVE_LOW>;
|
||||||
|
@ -65,9 +65,10 @@
|
||||||
spi@131b0000 {
|
spi@131b0000 {
|
||||||
spi-max-frequency = <1000000>;
|
spi-max-frequency = <1000000>;
|
||||||
spi-deactivate-delay = <100>;
|
spi-deactivate-delay = <100>;
|
||||||
cros_ec: cros-ec@0 {
|
|
||||||
reg = <0>;
|
embedded-controller {
|
||||||
compatible = "google,cros-ec";
|
compatible = "google,cros-ec-i2c";
|
||||||
|
reg = <0x1e>;
|
||||||
spi-max-frequency = <5000000>;
|
spi-max-frequency = <5000000>;
|
||||||
ec-interrupt = <&gpx1 6 GPIO_ACTIVE_LOW>;
|
ec-interrupt = <&gpx1 6 GPIO_ACTIVE_LOW>;
|
||||||
optimise-flash-write;
|
optimise-flash-write;
|
||||||
|
@ -133,6 +134,7 @@
|
||||||
|
|
||||||
ehci@12110000 {
|
ehci@12110000 {
|
||||||
samsung,vbus-gpio = <&gpx1 1 GPIO_ACTIVE_HIGH>;
|
samsung,vbus-gpio = <&gpx1 1 GPIO_ACTIVE_HIGH>;
|
||||||
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
xhci@12000000 {
|
xhci@12000000 {
|
||||||
|
|
|
@ -104,12 +104,12 @@
|
||||||
spi@12d40000 { /* spi2 */
|
spi@12d40000 { /* spi2 */
|
||||||
spi-max-frequency = <4000000>;
|
spi-max-frequency = <4000000>;
|
||||||
spi-deactivate-delay = <200>;
|
spi-deactivate-delay = <200>;
|
||||||
|
|
||||||
cros_ec: cros-ec@0 {
|
cros_ec: cros-ec@0 {
|
||||||
|
compatible = "google,cros-ec-spi";
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
compatible = "google,cros-ec";
|
|
||||||
spi-half-duplex;
|
spi-half-duplex;
|
||||||
spi-max-timeout-ms = <1100>;
|
spi-max-timeout-ms = <1100>;
|
||||||
spi-frame-header = <0xec>;
|
|
||||||
ec-interrupt = <&gpx1 5 GPIO_ACTIVE_LOW>;
|
ec-interrupt = <&gpx1 5 GPIO_ACTIVE_LOW>;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
* U-Boot additions to enable a generic Exynos GPIO driver
|
* U-Boot additions to enable a generic Exynos GPIO driver
|
||||||
*
|
*
|
||||||
* Copyright (c) 2014 Google, Inc
|
* Copyright (c) 2014 Google, Inc
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/{
|
/{
|
||||||
|
|
|
@ -97,11 +97,10 @@
|
||||||
spi-max-frequency = <4000000>;
|
spi-max-frequency = <4000000>;
|
||||||
spi-deactivate-delay = <200>;
|
spi-deactivate-delay = <200>;
|
||||||
cros_ec: cros-ec@0 {
|
cros_ec: cros-ec@0 {
|
||||||
|
compatible = "google,cros-ec-spi";
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
compatible = "google,cros-ec";
|
|
||||||
spi-half-duplex;
|
spi-half-duplex;
|
||||||
spi-max-timeout-ms = <1100>;
|
spi-max-timeout-ms = <1100>;
|
||||||
spi-frame-header = <0xec>;
|
|
||||||
ec-interrupt = <&gpx1 5 GPIO_ACTIVE_LOW>;
|
ec-interrupt = <&gpx1 5 GPIO_ACTIVE_LOW>;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -0,0 +1,216 @@
|
||||||
|
/*
|
||||||
|
* Freescale ls1021a QDS board device tree source
|
||||||
|
*
|
||||||
|
* Copyright 2013-2015 Freescale Semiconductor, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
/dts-v1/;
|
||||||
|
#include "ls1021a.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "LS1021A QDS Board";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
enet0_rgmii_phy = &rgmii_phy1;
|
||||||
|
enet1_rgmii_phy = &rgmii_phy2;
|
||||||
|
enet2_rgmii_phy = &rgmii_phy3;
|
||||||
|
enet0_sgmii_phy = &sgmii_phy1c;
|
||||||
|
enet1_sgmii_phy = &sgmii_phy1d;
|
||||||
|
spi0 = &qspi;
|
||||||
|
spi1 = &dspi0;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&dspi0 {
|
||||||
|
bus-num = <0>;
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
dspiflash: at45db021d@0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "spi-flash";
|
||||||
|
spi-max-frequency = <16000000>;
|
||||||
|
spi-cpol;
|
||||||
|
spi-cpha;
|
||||||
|
reg = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&qspi {
|
||||||
|
bus-num = <0>;
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
qflash0: s25fl128s@0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "spi-flash";
|
||||||
|
spi-max-frequency = <20000000>;
|
||||||
|
reg = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&i2c0 {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
pca9547: mux@77 {
|
||||||
|
reg = <0x77>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
i2c@0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
reg = <0x0>;
|
||||||
|
|
||||||
|
ds3232: rtc@68 {
|
||||||
|
compatible = "dallas,ds3232";
|
||||||
|
reg = <0x68>;
|
||||||
|
interrupts = <GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
i2c@2 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
reg = <0x2>;
|
||||||
|
|
||||||
|
ina220@40 {
|
||||||
|
compatible = "ti,ina220";
|
||||||
|
reg = <0x40>;
|
||||||
|
shunt-resistor = <1000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
ina220@41 {
|
||||||
|
compatible = "ti,ina220";
|
||||||
|
reg = <0x41>;
|
||||||
|
shunt-resistor = <1000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
i2c@3 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
reg = <0x3>;
|
||||||
|
|
||||||
|
eeprom@56 {
|
||||||
|
compatible = "atmel,24c512";
|
||||||
|
reg = <0x56>;
|
||||||
|
};
|
||||||
|
|
||||||
|
eeprom@57 {
|
||||||
|
compatible = "atmel,24c512";
|
||||||
|
reg = <0x57>;
|
||||||
|
};
|
||||||
|
|
||||||
|
adt7461a@4c {
|
||||||
|
compatible = "adi,adt7461a";
|
||||||
|
reg = <0x4c>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&ifc {
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
/* NOR, NAND Flashes and FPGA on board */
|
||||||
|
ranges = <0x0 0x0 0x60000000 0x08000000
|
||||||
|
0x2 0x0 0x7e800000 0x00010000
|
||||||
|
0x3 0x0 0x7fb00000 0x00000100>;
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
nor@0,0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "cfi-flash";
|
||||||
|
reg = <0x0 0x0 0x8000000>;
|
||||||
|
bank-width = <2>;
|
||||||
|
device-width = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
fpga: board-control@3,0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "simple-bus";
|
||||||
|
reg = <0x3 0x0 0x0000100>;
|
||||||
|
bank-width = <1>;
|
||||||
|
device-width = <1>;
|
||||||
|
ranges = <0 3 0 0x100>;
|
||||||
|
|
||||||
|
mdio-mux-emi1 {
|
||||||
|
compatible = "mdio-mux-mmioreg";
|
||||||
|
mdio-parent-bus = <&mdio0>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
reg = <0x54 1>; /* BRDCFG4 */
|
||||||
|
mux-mask = <0xe0>; /* EMI1[2:0] */
|
||||||
|
|
||||||
|
/* Onboard PHYs */
|
||||||
|
ls1021amdio0: mdio@0 {
|
||||||
|
reg = <0>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
rgmii_phy1: ethernet-phy@1 {
|
||||||
|
reg = <0x1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ls1021amdio1: mdio@20 {
|
||||||
|
reg = <0x20>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
rgmii_phy2: ethernet-phy@2 {
|
||||||
|
reg = <0x2>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ls1021amdio2: mdio@40 {
|
||||||
|
reg = <0x40>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
rgmii_phy3: ethernet-phy@3 {
|
||||||
|
reg = <0x3>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ls1021amdio3: mdio@60 {
|
||||||
|
reg = <0x60>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
sgmii_phy1c: ethernet-phy@1c {
|
||||||
|
reg = <0x1c>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ls1021amdio4: mdio@80 {
|
||||||
|
reg = <0x80>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
sgmii_phy1d: ethernet-phy@1d {
|
||||||
|
reg = <0x1d>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&lpuart0 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&mdio0 {
|
||||||
|
tbi0: tbi-phy@8 {
|
||||||
|
reg = <0x8>;
|
||||||
|
device_type = "tbi-phy";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&uart0 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&uart1 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
|
@ -0,0 +1,87 @@
|
||||||
|
/*
|
||||||
|
* Freescale ls1021a TWR board device tree source
|
||||||
|
*
|
||||||
|
* Copyright 2013-2015 Freescale Semiconductor, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
/dts-v1/;
|
||||||
|
#include "ls1021a.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "LS1021A TWR Board";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
enet2_rgmii_phy = &rgmii_phy1;
|
||||||
|
enet0_sgmii_phy = &sgmii_phy2;
|
||||||
|
enet1_sgmii_phy = &sgmii_phy0;
|
||||||
|
spi0 = &qspi;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&qspi {
|
||||||
|
bus-num = <0>;
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
qflash0: n25q128a13@0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "spi-flash";
|
||||||
|
spi-max-frequency = <20000000>;
|
||||||
|
reg = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&i2c0 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&i2c1 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&ifc {
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
/* NOR Flash on board */
|
||||||
|
ranges = <0x0 0x0 0x60000000 0x08000000>;
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
nor@0,0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "cfi-flash";
|
||||||
|
reg = <0x0 0x0 0x8000000>;
|
||||||
|
bank-width = <2>;
|
||||||
|
device-width = <1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&lpuart0 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&mdio0 {
|
||||||
|
sgmii_phy0: ethernet-phy@0 {
|
||||||
|
reg = <0x0>;
|
||||||
|
};
|
||||||
|
rgmii_phy1: ethernet-phy@1 {
|
||||||
|
reg = <0x1>;
|
||||||
|
};
|
||||||
|
sgmii_phy2: ethernet-phy@2 {
|
||||||
|
reg = <0x2>;
|
||||||
|
};
|
||||||
|
tbi1: tbi-phy@1f {
|
||||||
|
reg = <0x1f>;
|
||||||
|
device_type = "tbi-phy";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&uart0 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&uart1 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
|
@ -0,0 +1,381 @@
|
||||||
|
/*
|
||||||
|
* Freescale ls1021a SOC common device tree source
|
||||||
|
*
|
||||||
|
* Copyright 2013-2015 Freescale Semiconductor, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "skeleton.dtsi"
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
compatible = "fsl,ls1021a";
|
||||||
|
interrupt-parent = <&gic>;
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
serial0 = &lpuart0;
|
||||||
|
serial1 = &lpuart1;
|
||||||
|
serial2 = &lpuart2;
|
||||||
|
serial3 = &lpuart3;
|
||||||
|
serial4 = &lpuart4;
|
||||||
|
serial5 = &lpuart5;
|
||||||
|
sysclk = &sysclk;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpus {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
cpu@f00 {
|
||||||
|
compatible = "arm,cortex-a7";
|
||||||
|
device_type = "cpu";
|
||||||
|
reg = <0xf00>;
|
||||||
|
clocks = <&cluster1_clk>;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu@f01 {
|
||||||
|
compatible = "arm,cortex-a7";
|
||||||
|
device_type = "cpu";
|
||||||
|
reg = <0xf01>;
|
||||||
|
clocks = <&cluster1_clk>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
timer {
|
||||||
|
compatible = "arm,armv7-timer";
|
||||||
|
interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
|
||||||
|
<GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
|
||||||
|
<GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
|
||||||
|
<GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pmu {
|
||||||
|
compatible = "arm,cortex-a7-pmu";
|
||||||
|
interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
};
|
||||||
|
|
||||||
|
soc {
|
||||||
|
compatible = "simple-bus";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
device_type = "soc";
|
||||||
|
interrupt-parent = <&gic>;
|
||||||
|
ranges;
|
||||||
|
|
||||||
|
gic: interrupt-controller@1400000 {
|
||||||
|
compatible = "arm,cortex-a7-gic";
|
||||||
|
#interrupt-cells = <3>;
|
||||||
|
interrupt-controller;
|
||||||
|
reg = <0x1401000 0x1000>,
|
||||||
|
<0x1402000 0x1000>,
|
||||||
|
<0x1404000 0x2000>,
|
||||||
|
<0x1406000 0x2000>;
|
||||||
|
interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_HIGH)>;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
ifc: ifc@1530000 {
|
||||||
|
compatible = "fsl,ifc", "simple-bus";
|
||||||
|
reg = <0x1530000 0x10000>;
|
||||||
|
interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
};
|
||||||
|
|
||||||
|
dcfg: dcfg@1ee0000 {
|
||||||
|
compatible = "fsl,ls1021a-dcfg", "syscon";
|
||||||
|
reg = <0x1ee0000 0x10000>;
|
||||||
|
big-endian;
|
||||||
|
};
|
||||||
|
|
||||||
|
esdhc: esdhc@1560000 {
|
||||||
|
compatible = "fsl,esdhc";
|
||||||
|
reg = <0x1560000 0x10000>;
|
||||||
|
interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clock-frequency = <0>;
|
||||||
|
voltage-ranges = <1800 1800 3300 3300>;
|
||||||
|
sdhci,auto-cmd12;
|
||||||
|
big-endian;
|
||||||
|
bus-width = <4>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
scfg: scfg@1570000 {
|
||||||
|
compatible = "fsl,ls1021a-scfg", "syscon";
|
||||||
|
reg = <0x1570000 0x10000>;
|
||||||
|
big-endian;
|
||||||
|
};
|
||||||
|
|
||||||
|
clockgen: clocking@1ee1000 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges = <0x0 0x1ee1000 0x10000>;
|
||||||
|
|
||||||
|
sysclk: sysclk {
|
||||||
|
compatible = "fixed-clock";
|
||||||
|
#clock-cells = <0>;
|
||||||
|
clock-output-names = "sysclk";
|
||||||
|
};
|
||||||
|
|
||||||
|
cga_pll1: pll@800 {
|
||||||
|
compatible = "fsl,qoriq-core-pll-2.0";
|
||||||
|
#clock-cells = <1>;
|
||||||
|
reg = <0x800 0x10>;
|
||||||
|
clocks = <&sysclk>;
|
||||||
|
clock-output-names = "cga-pll1", "cga-pll1-div2",
|
||||||
|
"cga-pll1-div4";
|
||||||
|
};
|
||||||
|
|
||||||
|
platform_clk: pll@c00 {
|
||||||
|
compatible = "fsl,qoriq-core-pll-2.0";
|
||||||
|
#clock-cells = <1>;
|
||||||
|
reg = <0xc00 0x10>;
|
||||||
|
clocks = <&sysclk>;
|
||||||
|
clock-output-names = "platform-clk", "platform-clk-div2";
|
||||||
|
};
|
||||||
|
|
||||||
|
cluster1_clk: clk0c0@0 {
|
||||||
|
compatible = "fsl,qoriq-core-mux-2.0";
|
||||||
|
#clock-cells = <0>;
|
||||||
|
reg = <0x0 0x10>;
|
||||||
|
clock-names = "pll1cga", "pll1cga-div2", "pll1cga-div4";
|
||||||
|
clocks = <&cga_pll1 0>, <&cga_pll1 1>, <&cga_pll1 2>;
|
||||||
|
clock-output-names = "cluster1-clk";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
dspi0: dspi@2100000 {
|
||||||
|
compatible = "fsl,vf610-dspi";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
reg = <0x2100000 0x10000>;
|
||||||
|
interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clock-names = "dspi";
|
||||||
|
clocks = <&platform_clk 1>;
|
||||||
|
num-cs = <6>;
|
||||||
|
big-endian;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
dspi1: dspi@2110000 {
|
||||||
|
compatible = "fsl,vf610-dspi";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
reg = <0x2110000 0x10000>;
|
||||||
|
interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clock-names = "dspi";
|
||||||
|
clocks = <&platform_clk 1>;
|
||||||
|
num-cs = <6>;
|
||||||
|
big-endian;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
qspi: quadspi@1550000 {
|
||||||
|
compatible = "fsl,vf610-qspi";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
reg = <0x1550000 0x10000>,
|
||||||
|
<0x40000000 0x4000000>;
|
||||||
|
num-cs = <2>;
|
||||||
|
big-endian;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
i2c0: i2c@2180000 {
|
||||||
|
compatible = "fsl,vf610-i2c";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
reg = <0x2180000 0x10000>;
|
||||||
|
interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clock-names = "i2c";
|
||||||
|
clocks = <&platform_clk 1>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
i2c1: i2c@2190000 {
|
||||||
|
compatible = "fsl,vf610-i2c";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
reg = <0x2190000 0x10000>;
|
||||||
|
interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clock-names = "i2c";
|
||||||
|
clocks = <&platform_clk 1>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
i2c2: i2c@21a0000 {
|
||||||
|
compatible = "fsl,vf610-i2c";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
reg = <0x21a0000 0x10000>;
|
||||||
|
interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clock-names = "i2c";
|
||||||
|
clocks = <&platform_clk 1>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
uart0: serial@21c0500 {
|
||||||
|
compatible = "fsl,16550-FIFO64", "ns16550a";
|
||||||
|
reg = <0x21c0500 0x100>;
|
||||||
|
interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clock-frequency = <0>;
|
||||||
|
fifo-size = <15>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
uart1: serial@21c0600 {
|
||||||
|
compatible = "fsl,16550-FIFO64", "ns16550a";
|
||||||
|
reg = <0x21c0600 0x100>;
|
||||||
|
interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clock-frequency = <0>;
|
||||||
|
fifo-size = <15>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
uart2: serial@21d0500 {
|
||||||
|
compatible = "fsl,16550-FIFO64", "ns16550a";
|
||||||
|
reg = <0x21d0500 0x100>;
|
||||||
|
interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clock-frequency = <0>;
|
||||||
|
fifo-size = <15>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
uart3: serial@21d0600 {
|
||||||
|
compatible = "fsl,16550-FIFO64", "ns16550a";
|
||||||
|
reg = <0x21d0600 0x100>;
|
||||||
|
interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clock-frequency = <0>;
|
||||||
|
fifo-size = <15>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
lpuart0: serial@2950000 {
|
||||||
|
compatible = "fsl,ls1021a-lpuart";
|
||||||
|
reg = <0x2950000 0x1000>;
|
||||||
|
interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&sysclk>;
|
||||||
|
clock-names = "ipg";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
lpuart1: serial@2960000 {
|
||||||
|
compatible = "fsl,ls1021a-lpuart";
|
||||||
|
reg = <0x2960000 0x1000>;
|
||||||
|
interrupts = <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&platform_clk 1>;
|
||||||
|
clock-names = "ipg";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
lpuart2: serial@2970000 {
|
||||||
|
compatible = "fsl,ls1021a-lpuart";
|
||||||
|
reg = <0x2970000 0x1000>;
|
||||||
|
interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&platform_clk 1>;
|
||||||
|
clock-names = "ipg";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
lpuart3: serial@2980000 {
|
||||||
|
compatible = "fsl,ls1021a-lpuart";
|
||||||
|
reg = <0x2980000 0x1000>;
|
||||||
|
interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&platform_clk 1>;
|
||||||
|
clock-names = "ipg";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
lpuart4: serial@2990000 {
|
||||||
|
compatible = "fsl,ls1021a-lpuart";
|
||||||
|
reg = <0x2990000 0x1000>;
|
||||||
|
interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&platform_clk 1>;
|
||||||
|
clock-names = "ipg";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
lpuart5: serial@29a0000 {
|
||||||
|
compatible = "fsl,ls1021a-lpuart";
|
||||||
|
reg = <0x29a0000 0x1000>;
|
||||||
|
interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&platform_clk 1>;
|
||||||
|
clock-names = "ipg";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
wdog0: watchdog@2ad0000 {
|
||||||
|
compatible = "fsl,imx21-wdt";
|
||||||
|
reg = <0x2ad0000 0x10000>;
|
||||||
|
interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&platform_clk 1>;
|
||||||
|
clock-names = "wdog-en";
|
||||||
|
big-endian;
|
||||||
|
};
|
||||||
|
|
||||||
|
sai1: sai@2b50000 {
|
||||||
|
compatible = "fsl,vf610-sai";
|
||||||
|
reg = <0x2b50000 0x10000>;
|
||||||
|
interrupts = <GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&platform_clk 1>;
|
||||||
|
clock-names = "sai";
|
||||||
|
dma-names = "tx", "rx";
|
||||||
|
dmas = <&edma0 1 47>,
|
||||||
|
<&edma0 1 46>;
|
||||||
|
big-endian;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
sai2: sai@2b60000 {
|
||||||
|
compatible = "fsl,vf610-sai";
|
||||||
|
reg = <0x2b60000 0x10000>;
|
||||||
|
interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&platform_clk 1>;
|
||||||
|
clock-names = "sai";
|
||||||
|
dma-names = "tx", "rx";
|
||||||
|
dmas = <&edma0 1 45>,
|
||||||
|
<&edma0 1 44>;
|
||||||
|
big-endian;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
edma0: edma@2c00000 {
|
||||||
|
#dma-cells = <2>;
|
||||||
|
compatible = "fsl,vf610-edma";
|
||||||
|
reg = <0x2c00000 0x10000>,
|
||||||
|
<0x2c10000 0x10000>,
|
||||||
|
<0x2c20000 0x10000>;
|
||||||
|
interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
interrupt-names = "edma-tx", "edma-err";
|
||||||
|
dma-channels = <32>;
|
||||||
|
big-endian;
|
||||||
|
clock-names = "dmamux0", "dmamux1";
|
||||||
|
clocks = <&platform_clk 1>,
|
||||||
|
<&platform_clk 1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
mdio0: mdio@2d24000 {
|
||||||
|
compatible = "gianfar";
|
||||||
|
device_type = "mdio";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
reg = <0x2d24000 0x4000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb@8600000 {
|
||||||
|
compatible = "fsl-usb2-dr-v2.5", "fsl-usb2-dr";
|
||||||
|
reg = <0x8600000 0x1000>;
|
||||||
|
interrupts = <GIC_SPI 171 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
dr_mode = "host";
|
||||||
|
phy_type = "ulpi";
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3@3100000 {
|
||||||
|
compatible = "snps,dwc3";
|
||||||
|
reg = <0x3100000 0x10000>;
|
||||||
|
interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
dr_mode = "host";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -2,6 +2,8 @@
|
||||||
* U-Boot additions to enable a generic Exynos GPIO driver
|
* U-Boot additions to enable a generic Exynos GPIO driver
|
||||||
*
|
*
|
||||||
* Copyright (c) 2014 Google, Inc
|
* Copyright (c) 2014 Google, Inc
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
* U-Boot additions to enable a generic Exynos GPIO driver
|
* U-Boot additions to enable a generic Exynos GPIO driver
|
||||||
*
|
*
|
||||||
* Copyright (c) 2014 Google, Inc
|
* Copyright (c) 2014 Google, Inc
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
/*
|
||||||
|
* Skeleton device tree in the 64 bits version; the bare minimum
|
||||||
|
* needed to boot; just include and add a compatible value. The
|
||||||
|
* bootloader will typically populate the memory node.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/ {
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <2>;
|
||||||
|
chosen { };
|
||||||
|
aliases { };
|
||||||
|
memory { device_type = "memory"; reg = <0 0 0 0>; };
|
||||||
|
};
|
|
@ -25,6 +25,10 @@
|
||||||
* to be added to the gmac1 device tree blob.
|
* to be added to the gmac1 device tree blob.
|
||||||
*/
|
*/
|
||||||
ethernet0 = &gmac1;
|
ethernet0 = &gmac1;
|
||||||
|
|
||||||
|
spi0 = "/spi@ff705000"; /* QSPI */
|
||||||
|
spi1 = "/spi@fff00000";
|
||||||
|
spi2 = "/spi@fff01000";
|
||||||
};
|
};
|
||||||
|
|
||||||
regulator_3_3v: 3-3-v-regulator {
|
regulator_3_3v: 3-3-v-regulator {
|
||||||
|
@ -72,3 +76,23 @@
|
||||||
&usb1 {
|
&usb1 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&qspi {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
flash0: n25q00@0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "n25q00";
|
||||||
|
reg = <0>; /* chip select */
|
||||||
|
spi-max-frequency = <50000000>;
|
||||||
|
m25p,fast-read;
|
||||||
|
page-size = <256>;
|
||||||
|
block-size = <16>; /* 2^16, 64KB */
|
||||||
|
read-delay = <4>; /* delay value in read data capture register */
|
||||||
|
tshsl-ns = <50>;
|
||||||
|
tsd2d-ns = <50>;
|
||||||
|
tchsh-ns = <4>;
|
||||||
|
tslch-ns = <4>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
|
@ -25,6 +25,10 @@
|
||||||
* to be added to the gmac1 device tree blob.
|
* to be added to the gmac1 device tree blob.
|
||||||
*/
|
*/
|
||||||
ethernet0 = &gmac1;
|
ethernet0 = &gmac1;
|
||||||
|
|
||||||
|
spi0 = "/spi@ff705000"; /* QSPI */
|
||||||
|
spi1 = "/spi@fff00000";
|
||||||
|
spi2 = "/spi@fff01000";
|
||||||
};
|
};
|
||||||
|
|
||||||
regulator_3_3v: 3-3-v-regulator {
|
regulator_3_3v: 3-3-v-regulator {
|
||||||
|
@ -77,3 +81,23 @@
|
||||||
&usb1 {
|
&usb1 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&qspi {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
flash0: n25q00@0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "n25q00";
|
||||||
|
reg = <0>; /* chip select */
|
||||||
|
spi-max-frequency = <50000000>;
|
||||||
|
m25p,fast-read;
|
||||||
|
page-size = <256>;
|
||||||
|
block-size = <16>; /* 2^16, 64KB */
|
||||||
|
read-delay = <4>; /* delay value in read data capture register */
|
||||||
|
tshsl-ns = <50>;
|
||||||
|
tsd2d-ns = <50>;
|
||||||
|
tchsh-ns = <4>;
|
||||||
|
tslch-ns = <4>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
|
@ -230,6 +230,7 @@
|
||||||
|
|
||||||
usb@7d000000 { /* Rear external USB port. */
|
usb@7d000000 { /* Rear external USB port. */
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(N, 4) GPIO_ACTIVE_HIGH>;
|
||||||
};
|
};
|
||||||
|
|
||||||
usb-phy@7d000000 {
|
usb-phy@7d000000 {
|
||||||
|
@ -246,6 +247,7 @@
|
||||||
|
|
||||||
usb@7d008000 { /* Left external USB port. */
|
usb@7d008000 { /* Left external USB port. */
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(N, 5) GPIO_ACTIVE_HIGH>;
|
||||||
};
|
};
|
||||||
|
|
||||||
usb-phy@7d008000 {
|
usb-phy@7d008000 {
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Avnet PicoZed board DTS
|
||||||
|
*
|
||||||
|
* Copyright (C) 2015 Xilinx, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
/dts-v1/;
|
||||||
|
#include "zynq-7000.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "Zynq PicoZed Board";
|
||||||
|
compatible = "xlnx,zynq-picozed", "xlnx,zynq-7000";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
serial0 = &uart1;
|
||||||
|
};
|
||||||
|
|
||||||
|
memory {
|
||||||
|
device_type = "memory";
|
||||||
|
reg = <0 0x40000000>;
|
||||||
|
};
|
||||||
|
};
|
|
@ -22,6 +22,9 @@ ifeq ($(SOC),$(filter $(SOC),mx6))
|
||||||
obj-$(CONFIG_CMD_SATA) += sata.o
|
obj-$(CONFIG_CMD_SATA) += sata.o
|
||||||
obj-$(CONFIG_IMX_VIDEO_SKIP) += video.o
|
obj-$(CONFIG_IMX_VIDEO_SKIP) += video.o
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(SOC),$(filter $(SOC),vf610))
|
||||||
|
obj-y += ddrmc-vf610.o
|
||||||
|
endif
|
||||||
obj-$(CONFIG_CMD_BMODE) += cmd_bmode.o
|
obj-$(CONFIG_CMD_BMODE) += cmd_bmode.o
|
||||||
obj-$(CONFIG_CMD_HDMIDETECT) += cmd_hdmidet.o
|
obj-$(CONFIG_CMD_HDMIDETECT) += cmd_hdmidet.o
|
||||||
obj-$(CONFIG_CMD_DEKBLOB) += cmd_dek.o
|
obj-$(CONFIG_CMD_DEKBLOB) += cmd_dek.o
|
||||||
|
|
|
@ -0,0 +1,278 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Toradex, Inc.
|
||||||
|
*
|
||||||
|
* Based on vf610twr:
|
||||||
|
* Copyright 2013 Freescale Semiconductor, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/arch/imx-regs.h>
|
||||||
|
#include <asm/arch/iomux-vf610.h>
|
||||||
|
#include <asm/arch/ddrmc-vf610.h>
|
||||||
|
|
||||||
|
void ddrmc_setup_iomux(void)
|
||||||
|
{
|
||||||
|
static const iomux_v3_cfg_t ddr_pads[] = {
|
||||||
|
VF610_PAD_DDR_A15__DDR_A_15,
|
||||||
|
VF610_PAD_DDR_A14__DDR_A_14,
|
||||||
|
VF610_PAD_DDR_A13__DDR_A_13,
|
||||||
|
VF610_PAD_DDR_A12__DDR_A_12,
|
||||||
|
VF610_PAD_DDR_A11__DDR_A_11,
|
||||||
|
VF610_PAD_DDR_A10__DDR_A_10,
|
||||||
|
VF610_PAD_DDR_A9__DDR_A_9,
|
||||||
|
VF610_PAD_DDR_A8__DDR_A_8,
|
||||||
|
VF610_PAD_DDR_A7__DDR_A_7,
|
||||||
|
VF610_PAD_DDR_A6__DDR_A_6,
|
||||||
|
VF610_PAD_DDR_A5__DDR_A_5,
|
||||||
|
VF610_PAD_DDR_A4__DDR_A_4,
|
||||||
|
VF610_PAD_DDR_A3__DDR_A_3,
|
||||||
|
VF610_PAD_DDR_A2__DDR_A_2,
|
||||||
|
VF610_PAD_DDR_A1__DDR_A_1,
|
||||||
|
VF610_PAD_DDR_A0__DDR_A_0,
|
||||||
|
VF610_PAD_DDR_BA2__DDR_BA_2,
|
||||||
|
VF610_PAD_DDR_BA1__DDR_BA_1,
|
||||||
|
VF610_PAD_DDR_BA0__DDR_BA_0,
|
||||||
|
VF610_PAD_DDR_CAS__DDR_CAS_B,
|
||||||
|
VF610_PAD_DDR_CKE__DDR_CKE_0,
|
||||||
|
VF610_PAD_DDR_CLK__DDR_CLK_0,
|
||||||
|
VF610_PAD_DDR_CS__DDR_CS_B_0,
|
||||||
|
VF610_PAD_DDR_D15__DDR_D_15,
|
||||||
|
VF610_PAD_DDR_D14__DDR_D_14,
|
||||||
|
VF610_PAD_DDR_D13__DDR_D_13,
|
||||||
|
VF610_PAD_DDR_D12__DDR_D_12,
|
||||||
|
VF610_PAD_DDR_D11__DDR_D_11,
|
||||||
|
VF610_PAD_DDR_D10__DDR_D_10,
|
||||||
|
VF610_PAD_DDR_D9__DDR_D_9,
|
||||||
|
VF610_PAD_DDR_D8__DDR_D_8,
|
||||||
|
VF610_PAD_DDR_D7__DDR_D_7,
|
||||||
|
VF610_PAD_DDR_D6__DDR_D_6,
|
||||||
|
VF610_PAD_DDR_D5__DDR_D_5,
|
||||||
|
VF610_PAD_DDR_D4__DDR_D_4,
|
||||||
|
VF610_PAD_DDR_D3__DDR_D_3,
|
||||||
|
VF610_PAD_DDR_D2__DDR_D_2,
|
||||||
|
VF610_PAD_DDR_D1__DDR_D_1,
|
||||||
|
VF610_PAD_DDR_D0__DDR_D_0,
|
||||||
|
VF610_PAD_DDR_DQM1__DDR_DQM_1,
|
||||||
|
VF610_PAD_DDR_DQM0__DDR_DQM_0,
|
||||||
|
VF610_PAD_DDR_DQS1__DDR_DQS_1,
|
||||||
|
VF610_PAD_DDR_DQS0__DDR_DQS_0,
|
||||||
|
VF610_PAD_DDR_RAS__DDR_RAS_B,
|
||||||
|
VF610_PAD_DDR_WE__DDR_WE_B,
|
||||||
|
VF610_PAD_DDR_ODT1__DDR_ODT_0,
|
||||||
|
VF610_PAD_DDR_ODT0__DDR_ODT_1,
|
||||||
|
VF610_PAD_DDR_RESETB,
|
||||||
|
};
|
||||||
|
|
||||||
|
imx_iomux_v3_setup_multiple_pads(ddr_pads, ARRAY_SIZE(ddr_pads));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ddrmc_phy_init(void)
|
||||||
|
{
|
||||||
|
struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
|
||||||
|
|
||||||
|
writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[0]);
|
||||||
|
writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[16]);
|
||||||
|
writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[32]);
|
||||||
|
|
||||||
|
writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[1]);
|
||||||
|
writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[17]);
|
||||||
|
|
||||||
|
writel(DDRMC_PHY_CTRL, &ddrmr->phy[2]);
|
||||||
|
writel(DDRMC_PHY_CTRL, &ddrmr->phy[18]);
|
||||||
|
writel(DDRMC_PHY_CTRL, &ddrmr->phy[34]);
|
||||||
|
|
||||||
|
writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[3]);
|
||||||
|
writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[19]);
|
||||||
|
writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[35]);
|
||||||
|
|
||||||
|
writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[4]);
|
||||||
|
writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[20]);
|
||||||
|
writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[36]);
|
||||||
|
|
||||||
|
/* LPDDR2 only parameter */
|
||||||
|
writel(DDRMC_PHY_OFF, &ddrmr->phy[49]);
|
||||||
|
|
||||||
|
writel(DDRMC_PHY50_DDR3_MODE |
|
||||||
|
DDRMC_PHY50_EN_SW_HALF_CYCLE, &ddrmr->phy[50]);
|
||||||
|
|
||||||
|
/* Processor Pad ODT settings */
|
||||||
|
writel(DDRMC_PHY_PROC_PAD_ODT, &ddrmr->phy[52]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ddrmc_ctrl_lvl_init(struct ddrmc_lvl_info *lvl)
|
||||||
|
{
|
||||||
|
struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
|
||||||
|
u32 cr102 = 0, cr105 = 0, cr106 = 0, cr110 = 0;
|
||||||
|
|
||||||
|
if (lvl->wrlvl_reg_en) {
|
||||||
|
writel(DDRMC_CR97_WRLVL_EN, &ddrmr->cr[97]);
|
||||||
|
writel(DDRMC_CR98_WRLVL_DL_0(lvl->wrlvl_dl_0), &ddrmr->cr[98]);
|
||||||
|
writel(DDRMC_CR99_WRLVL_DL_1(lvl->wrlvl_dl_1), &ddrmr->cr[99]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lvl->rdlvl_reg_en) {
|
||||||
|
cr102 |= DDRMC_CR102_RDLVL_REG_EN;
|
||||||
|
cr105 |= DDRMC_CR105_RDLVL_DL_0(lvl->rdlvl_dl_0);
|
||||||
|
cr110 |= DDRMC_CR110_RDLVL_DL_1(lvl->rdlvl_dl_1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lvl->rdlvl_gt_reg_en) {
|
||||||
|
cr102 |= DDRMC_CR102_RDLVL_GT_REGEN;
|
||||||
|
cr106 |= DDRMC_CR106_RDLVL_GTDL_0(lvl->rdlvl_gt_dl_0);
|
||||||
|
cr110 |= DDRMC_CR110_RDLVL_GTDL_1(lvl->rdlvl_gt_dl_1);
|
||||||
|
}
|
||||||
|
|
||||||
|
writel(cr102, &ddrmr->cr[102]);
|
||||||
|
writel(cr105, &ddrmr->cr[105]);
|
||||||
|
writel(cr106, &ddrmr->cr[106]);
|
||||||
|
writel(cr110, &ddrmr->cr[110]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ddrmc_ctrl_init_ddr3(struct ddr3_jedec_timings const *timings,
|
||||||
|
struct ddrmc_lvl_info *lvl,
|
||||||
|
int col_diff, int row_diff)
|
||||||
|
{
|
||||||
|
struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
|
||||||
|
|
||||||
|
writel(DDRMC_CR00_DRAM_CLASS_DDR3, &ddrmr->cr[0]);
|
||||||
|
writel(DDRMC_CR02_DRAM_TINIT(timings->tinit), &ddrmr->cr[2]);
|
||||||
|
writel(DDRMC_CR10_TRST_PWRON(timings->trst_pwron), &ddrmr->cr[10]);
|
||||||
|
|
||||||
|
writel(DDRMC_CR11_CKE_INACTIVE(timings->cke_inactive), &ddrmr->cr[11]);
|
||||||
|
writel(DDRMC_CR12_WRLAT(timings->wrlat) |
|
||||||
|
DDRMC_CR12_CASLAT_LIN(timings->caslat_lin), &ddrmr->cr[12]);
|
||||||
|
writel(DDRMC_CR13_TRC(timings->trc) | DDRMC_CR13_TRRD(timings->trrd) |
|
||||||
|
DDRMC_CR13_TCCD(timings->tccd), &ddrmr->cr[13]);
|
||||||
|
writel(DDRMC_CR14_TFAW(timings->tfaw) | DDRMC_CR14_TRP(timings->trp) |
|
||||||
|
DDRMC_CR14_TWTR(timings->twtr) |
|
||||||
|
DDRMC_CR14_TRAS_MIN(timings->tras_min), &ddrmr->cr[14]);
|
||||||
|
writel(DDRMC_CR16_TMRD(timings->tmrd) |
|
||||||
|
DDRMC_CR16_TRTP(timings->trtp), &ddrmr->cr[16]);
|
||||||
|
writel(DDRMC_CR17_TRAS_MAX(timings->tras_max) |
|
||||||
|
DDRMC_CR17_TMOD(timings->tmod), &ddrmr->cr[17]);
|
||||||
|
writel(DDRMC_CR18_TCKESR(timings->tckesr) |
|
||||||
|
DDRMC_CR18_TCKE(timings->tcke), &ddrmr->cr[18]);
|
||||||
|
|
||||||
|
writel(DDRMC_CR20_AP_EN, &ddrmr->cr[20]);
|
||||||
|
writel(DDRMC_CR21_TRCD_INT(timings->trcd_int) |
|
||||||
|
DDRMC_CR21_CCMAP_EN, &ddrmr->cr[21]);
|
||||||
|
|
||||||
|
writel(DDRMC_CR22_TDAL(timings->tdal), &ddrmr->cr[22]);
|
||||||
|
writel(DDRMC_CR23_BSTLEN(3) |
|
||||||
|
DDRMC_CR23_TDLL(timings->tdll), &ddrmr->cr[23]);
|
||||||
|
writel(DDRMC_CR24_TRP_AB(timings->trp_ab), &ddrmr->cr[24]);
|
||||||
|
|
||||||
|
writel(DDRMC_CR25_TREF_EN, &ddrmr->cr[25]);
|
||||||
|
writel(DDRMC_CR26_TREF(timings->tref) |
|
||||||
|
DDRMC_CR26_TRFC(timings->trfc), &ddrmr->cr[26]);
|
||||||
|
writel(DDRMC_CR28_TREF_INT(0), &ddrmr->cr[28]);
|
||||||
|
writel(DDRMC_CR29_TPDEX(timings->tpdex), &ddrmr->cr[29]);
|
||||||
|
|
||||||
|
writel(DDRMC_CR30_TXPDLL(timings->txpdll), &ddrmr->cr[30]);
|
||||||
|
writel(DDRMC_CR31_TXSNR(timings->txsnr) |
|
||||||
|
DDRMC_CR31_TXSR(timings->txsr), &ddrmr->cr[31]);
|
||||||
|
writel(DDRMC_CR33_EN_QK_SREF, &ddrmr->cr[33]);
|
||||||
|
writel(DDRMC_CR34_CKSRX(timings->cksrx) |
|
||||||
|
DDRMC_CR34_CKSRE(timings->cksre), &ddrmr->cr[34]);
|
||||||
|
|
||||||
|
writel(DDRMC_CR38_FREQ_CHG_EN(0), &ddrmr->cr[38]);
|
||||||
|
writel(DDRMC_CR39_PHY_INI_COM(1024) | DDRMC_CR39_PHY_INI_STA(16) |
|
||||||
|
DDRMC_CR39_FRQ_CH_DLLOFF(2), &ddrmr->cr[39]);
|
||||||
|
|
||||||
|
writel(DDRMC_CR41_PHY_INI_STRT_INI_DIS, &ddrmr->cr[41]);
|
||||||
|
writel(DDRMC_CR48_MR1_DA_0(70) |
|
||||||
|
DDRMC_CR48_MR0_DA_0(1056), &ddrmr->cr[48]);
|
||||||
|
|
||||||
|
writel(DDRMC_CR66_ZQCL(timings->zqcl) |
|
||||||
|
DDRMC_CR66_ZQINIT(timings->zqinit), &ddrmr->cr[66]);
|
||||||
|
writel(DDRMC_CR67_ZQCS(timings->zqcs), &ddrmr->cr[67]);
|
||||||
|
writel(DDRMC_CR69_ZQ_ON_SREF_EX(2), &ddrmr->cr[69]);
|
||||||
|
|
||||||
|
writel(DDRMC_CR70_REF_PER_ZQ(timings->ref_per_zq), &ddrmr->cr[70]);
|
||||||
|
writel(DDRMC_CR72_ZQCS_ROTATE(0), &ddrmr->cr[72]);
|
||||||
|
|
||||||
|
writel(DDRMC_CR73_APREBIT(timings->aprebit) |
|
||||||
|
DDRMC_CR73_COL_DIFF(col_diff) |
|
||||||
|
DDRMC_CR73_ROW_DIFF(row_diff), &ddrmr->cr[73]);
|
||||||
|
writel(DDRMC_CR74_BANKSPLT_EN | DDRMC_CR74_ADDR_CMP_EN |
|
||||||
|
DDRMC_CR74_CMD_AGE_CNT(64) | DDRMC_CR74_AGE_CNT(64),
|
||||||
|
&ddrmr->cr[74]);
|
||||||
|
writel(DDRMC_CR75_RW_PG_EN | DDRMC_CR75_RW_EN | DDRMC_CR75_PRI_EN |
|
||||||
|
DDRMC_CR75_PLEN, &ddrmr->cr[75]);
|
||||||
|
writel(DDRMC_CR76_NQENT_ACTDIS(3) | DDRMC_CR76_D_RW_G_BKCN(3) |
|
||||||
|
DDRMC_CR76_W2R_SPLT_EN, &ddrmr->cr[76]);
|
||||||
|
writel(DDRMC_CR77_CS_MAP | DDRMC_CR77_DI_RD_INTLEAVE |
|
||||||
|
DDRMC_CR77_SWAP_EN, &ddrmr->cr[77]);
|
||||||
|
writel(DDRMC_CR78_Q_FULLNESS(7) |
|
||||||
|
DDRMC_CR78_BUR_ON_FLY_BIT(12), &ddrmr->cr[78]);
|
||||||
|
writel(DDRMC_CR79_CTLUPD_AREF(0), &ddrmr->cr[79]);
|
||||||
|
|
||||||
|
writel(DDRMC_CR82_INT_MASK, &ddrmr->cr[82]);
|
||||||
|
|
||||||
|
writel(DDRMC_CR87_ODT_WR_MAPCS0, &ddrmr->cr[87]);
|
||||||
|
writel(DDRMC_CR88_TODTL_CMD(4), &ddrmr->cr[88]);
|
||||||
|
writel(DDRMC_CR89_AODT_RWSMCS(2), &ddrmr->cr[89]);
|
||||||
|
|
||||||
|
writel(DDRMC_CR91_R2W_SMCSDL(2), &ddrmr->cr[91]);
|
||||||
|
writel(DDRMC_CR96_WLMRD(timings->wlmrd) |
|
||||||
|
DDRMC_CR96_WLDQSEN(timings->wldqsen), &ddrmr->cr[96]);
|
||||||
|
|
||||||
|
if (lvl != NULL)
|
||||||
|
ddrmc_ctrl_lvl_init(lvl);
|
||||||
|
|
||||||
|
writel(DDRMC_CR117_AXI0_W_PRI(0) |
|
||||||
|
DDRMC_CR117_AXI0_R_PRI(0), &ddrmr->cr[117]);
|
||||||
|
writel(DDRMC_CR118_AXI1_W_PRI(1) |
|
||||||
|
DDRMC_CR118_AXI1_R_PRI(1), &ddrmr->cr[118]);
|
||||||
|
|
||||||
|
writel(DDRMC_CR120_AXI0_PRI1_RPRI(2) |
|
||||||
|
DDRMC_CR120_AXI0_PRI0_RPRI(2), &ddrmr->cr[120]);
|
||||||
|
writel(DDRMC_CR121_AXI0_PRI3_RPRI(2) |
|
||||||
|
DDRMC_CR121_AXI0_PRI2_RPRI(2), &ddrmr->cr[121]);
|
||||||
|
writel(DDRMC_CR122_AXI1_PRI1_RPRI(1) | DDRMC_CR122_AXI1_PRI0_RPRI(1) |
|
||||||
|
DDRMC_CR122_AXI0_PRIRLX(100), &ddrmr->cr[122]);
|
||||||
|
writel(DDRMC_CR123_AXI1_P_ODR_EN | DDRMC_CR123_AXI1_PRI3_RPRI(1) |
|
||||||
|
DDRMC_CR123_AXI1_PRI2_RPRI(1), &ddrmr->cr[123]);
|
||||||
|
writel(DDRMC_CR124_AXI1_PRIRLX(100), &ddrmr->cr[124]);
|
||||||
|
|
||||||
|
writel(DDRMC_CR126_PHY_RDLAT(8), &ddrmr->cr[126]);
|
||||||
|
writel(DDRMC_CR132_WRLAT_ADJ(5) |
|
||||||
|
DDRMC_CR132_RDLAT_ADJ(6), &ddrmr->cr[132]);
|
||||||
|
writel(DDRMC_CR137_PHYCTL_DL(2), &ddrmr->cr[137]);
|
||||||
|
writel(DDRMC_CR138_PHY_WRLV_MXDL(256) |
|
||||||
|
DDRMC_CR138_PHYDRAM_CK_EN(1), &ddrmr->cr[138]);
|
||||||
|
writel(DDRMC_CR139_PHY_WRLV_RESPLAT(4) | DDRMC_CR139_PHY_WRLV_LOAD(7) |
|
||||||
|
DDRMC_CR139_PHY_WRLV_DLL(3) |
|
||||||
|
DDRMC_CR139_PHY_WRLV_EN(3), &ddrmr->cr[139]);
|
||||||
|
writel(DDRMC_CR140_PHY_WRLV_WW(64), &ddrmr->cr[140]);
|
||||||
|
writel(DDRMC_CR143_RDLV_GAT_MXDL(1536) |
|
||||||
|
DDRMC_CR143_RDLV_MXDL(128), &ddrmr->cr[143]);
|
||||||
|
writel(DDRMC_CR144_PHY_RDLVL_RES(4) | DDRMC_CR144_PHY_RDLV_LOAD(7) |
|
||||||
|
DDRMC_CR144_PHY_RDLV_DLL(3) |
|
||||||
|
DDRMC_CR144_PHY_RDLV_EN(3), &ddrmr->cr[144]);
|
||||||
|
writel(DDRMC_CR145_PHY_RDLV_RR(64), &ddrmr->cr[145]);
|
||||||
|
writel(DDRMC_CR146_PHY_RDLVL_RESP(64), &ddrmr->cr[146]);
|
||||||
|
writel(DDRMC_CR147_RDLV_RESP_MASK(983040), &ddrmr->cr[147]);
|
||||||
|
writel(DDRMC_CR148_RDLV_GATE_RESP_MASK(983040), &ddrmr->cr[148]);
|
||||||
|
writel(DDRMC_CR151_RDLV_GAT_DQ_ZERO_CNT(1) |
|
||||||
|
DDRMC_CR151_RDLVL_DQ_ZERO_CNT(1), &ddrmr->cr[151]);
|
||||||
|
|
||||||
|
writel(DDRMC_CR154_PAD_ZQ_EARLY_CMP_EN_TIMER(13) |
|
||||||
|
DDRMC_CR154_PAD_ZQ_MODE(1) |
|
||||||
|
DDRMC_CR154_DDR_SEL_PAD_CONTR(3) |
|
||||||
|
DDRMC_CR154_PAD_ZQ_HW_FOR(1), &ddrmr->cr[154]);
|
||||||
|
writel(DDRMC_CR155_PAD_ODT_BYTE1(2) |
|
||||||
|
DDRMC_CR155_PAD_ODT_BYTE0(2), &ddrmr->cr[155]);
|
||||||
|
writel(DDRMC_CR158_TWR(6), &ddrmr->cr[158]);
|
||||||
|
writel(DDRMC_CR161_ODT_EN(1) | DDRMC_CR161_TODTH_RD(2) |
|
||||||
|
DDRMC_CR161_TODTH_WR(2), &ddrmr->cr[161]);
|
||||||
|
|
||||||
|
ddrmc_phy_init();
|
||||||
|
|
||||||
|
writel(DDRMC_CR00_DRAM_CLASS_DDR3 | DDRMC_CR00_START, &ddrmr->cr[0]);
|
||||||
|
|
||||||
|
while (!(readl(&ddrmr->cr[80]) && 0x100))
|
||||||
|
udelay(10);
|
||||||
|
}
|
|
@ -137,14 +137,62 @@ struct pad_signals {
|
||||||
int mcasp0_fsr;
|
int mcasp0_fsr;
|
||||||
int mcasp0_axr1;
|
int mcasp0_axr1;
|
||||||
int mcasp0_ahclkx;
|
int mcasp0_ahclkx;
|
||||||
int xdma_event_intr0;
|
int cam0_hd;
|
||||||
int xdma_event_intr1;
|
int cam0_vd;
|
||||||
|
int cam0_field;
|
||||||
|
int cam0_wen;
|
||||||
|
int cam0_pclk;
|
||||||
|
int cam0_data8;
|
||||||
|
int cam0_data9;
|
||||||
|
int cam1_data9;
|
||||||
|
int cam1_data8;
|
||||||
|
int cam1_hd;
|
||||||
|
int cam1_vd;
|
||||||
|
int cam1_pclk;
|
||||||
|
int cam1_field;
|
||||||
|
int cam1_wen;
|
||||||
|
int cam1_data0;
|
||||||
|
int cam1_data1;
|
||||||
|
int cam1_data2;
|
||||||
|
int cam1_data3;
|
||||||
|
int cam1_data4;
|
||||||
|
int cam1_data5;
|
||||||
|
int cam1_data6;
|
||||||
|
int cam1_data7;
|
||||||
|
int cam0_data0;
|
||||||
|
int cam0_data1;
|
||||||
|
int cam0_data2;
|
||||||
|
int cam0_data3;
|
||||||
|
int cam0_data4;
|
||||||
|
int cam0_data5;
|
||||||
|
int cam0_data6;
|
||||||
|
int cam0_data7;
|
||||||
|
int uart3_rxd;
|
||||||
|
int uart3_txd;
|
||||||
|
int uart3_ctsn;
|
||||||
|
int uart3_rtsn;
|
||||||
|
int gpio5_8;
|
||||||
|
int gpio5_9;
|
||||||
|
int gpio5_10;
|
||||||
|
int gpio5_11;
|
||||||
|
int gpio5_12;
|
||||||
|
int gpio5_13;
|
||||||
|
int spi4_sclk;
|
||||||
|
int spi4_d0;
|
||||||
|
int spi4_d1;
|
||||||
|
int spi4_cs0;
|
||||||
|
int spi2_sclk;
|
||||||
|
int spi2_d0;
|
||||||
|
int spi2_d1;
|
||||||
|
int spi2_cs0;
|
||||||
|
int xdma_evt_intr0;
|
||||||
|
int xdma_evt_intr1;
|
||||||
|
int clkreq;
|
||||||
int nresetin_out;
|
int nresetin_out;
|
||||||
int porz;
|
|
||||||
int nnmi;
|
|
||||||
int osc0_in;
|
|
||||||
int osc0_out;
|
|
||||||
int rsvd1;
|
int rsvd1;
|
||||||
|
int nnmi;
|
||||||
|
int rsvd2;
|
||||||
|
int rsvd3;
|
||||||
int tms;
|
int tms;
|
||||||
int tdi;
|
int tdi;
|
||||||
int tdo;
|
int tdo;
|
||||||
|
@ -154,34 +202,11 @@ struct pad_signals {
|
||||||
int emu1;
|
int emu1;
|
||||||
int osc1_in;
|
int osc1_in;
|
||||||
int osc1_out;
|
int osc1_out;
|
||||||
int pmic_power_en;
|
|
||||||
int rtc_porz;
|
int rtc_porz;
|
||||||
int rsvd2;
|
int ext_wakeup0;
|
||||||
int ext_wakeup;
|
int pmic_power_en0;
|
||||||
int enz_kaldo_1p8v;
|
|
||||||
int usb0_dm;
|
|
||||||
int usb0_dp;
|
|
||||||
int usb0_ce;
|
|
||||||
int usb0_id;
|
|
||||||
int usb0_vbus;
|
|
||||||
int usb0_drvvbus;
|
int usb0_drvvbus;
|
||||||
int usb1_dm;
|
|
||||||
int usb1_dp;
|
|
||||||
int usb1_ce;
|
|
||||||
int usb1_id;
|
|
||||||
int usb1_vbus;
|
|
||||||
int usb1_drvvbus;
|
int usb1_drvvbus;
|
||||||
int ddr_resetn;
|
|
||||||
int ddr_csn0;
|
|
||||||
int ddr_cke;
|
|
||||||
int ddr_ck;
|
|
||||||
int ddr_nck;
|
|
||||||
int ddr_casn;
|
|
||||||
int ddr_rasn;
|
|
||||||
int ddr_wen;
|
|
||||||
int ddr_ba0;
|
|
||||||
int ddr_ba1;
|
|
||||||
int ddr_ba2;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _MUX_AM43XX_H_ */
|
#endif /* _MUX_AM43XX_H_ */
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
#ifndef __ARM7_HW_H
|
|
||||||
#define __ARM7_HW_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2004 Cucy Systems (http://www.cucy.com)
|
|
||||||
* Curt Brune <curt@cucy.com>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_INTEGRATOR)
|
|
||||||
/* include IntegratorCP/CM720T specific hardware file if there was one */
|
|
||||||
#else
|
|
||||||
#error No hardware file defined for this configuration
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __ARM7_HW_H */
|
|
|
@ -8,6 +8,14 @@
|
||||||
#define _ASM_ARMV8_FSL_LSCH3_CONFIG_
|
#define _ASM_ARMV8_FSL_LSCH3_CONFIG_
|
||||||
|
|
||||||
#include <fsl_ddrc_version.h>
|
#include <fsl_ddrc_version.h>
|
||||||
|
|
||||||
|
#define CONFIG_SYS_PAGE_SIZE 0x10000
|
||||||
|
|
||||||
|
#ifndef L1_CACHE_BYTES
|
||||||
|
#define L1_CACHE_SHIFT 6
|
||||||
|
#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define CONFIG_MP
|
#define CONFIG_MP
|
||||||
#define CONFIG_SYS_FSL_OCRAM_BASE 0x18000000 /* initial RAM */
|
#define CONFIG_SYS_FSL_OCRAM_BASE 0x18000000 /* initial RAM */
|
||||||
/* Link Definitions */
|
/* Link Definitions */
|
||||||
|
@ -23,6 +31,7 @@
|
||||||
#define CONFIG_SYS_FSL_CH3_CLK_GRPA_ADDR (CONFIG_SYS_IMMR + 0x00300000)
|
#define CONFIG_SYS_FSL_CH3_CLK_GRPA_ADDR (CONFIG_SYS_IMMR + 0x00300000)
|
||||||
#define CONFIG_SYS_FSL_CH3_CLK_GRPB_ADDR (CONFIG_SYS_IMMR + 0x00310000)
|
#define CONFIG_SYS_FSL_CH3_CLK_GRPB_ADDR (CONFIG_SYS_IMMR + 0x00310000)
|
||||||
#define CONFIG_SYS_FSL_CH3_CLK_CTRL_ADDR (CONFIG_SYS_IMMR + 0x00370000)
|
#define CONFIG_SYS_FSL_CH3_CLK_CTRL_ADDR (CONFIG_SYS_IMMR + 0x00370000)
|
||||||
|
#define CONFIG_SYS_FSL_ESDHC_ADDR (CONFIG_SYS_IMMR + 0x01140000)
|
||||||
#define CONFIG_SYS_IFC_ADDR (CONFIG_SYS_IMMR + 0x01240000)
|
#define CONFIG_SYS_IFC_ADDR (CONFIG_SYS_IMMR + 0x01240000)
|
||||||
#define CONFIG_SYS_NS16550_COM1 (CONFIG_SYS_IMMR + 0x011C0500)
|
#define CONFIG_SYS_NS16550_COM1 (CONFIG_SYS_IMMR + 0x011C0500)
|
||||||
#define CONFIG_SYS_NS16550_COM2 (CONFIG_SYS_IMMR + 0x011C0600)
|
#define CONFIG_SYS_NS16550_COM2 (CONFIG_SYS_IMMR + 0x011C0600)
|
||||||
|
@ -30,6 +39,20 @@
|
||||||
#define CONFIG_SYS_FSL_PMU_CLTBENR (CONFIG_SYS_FSL_PMU_ADDR + \
|
#define CONFIG_SYS_FSL_PMU_CLTBENR (CONFIG_SYS_FSL_PMU_ADDR + \
|
||||||
0x18A0)
|
0x18A0)
|
||||||
|
|
||||||
|
#define CONFIG_SYS_FSL_WRIOP1_ADDR (CONFIG_SYS_IMMR + 0x7B80000)
|
||||||
|
#define CONFIG_SYS_FSL_WRIOP1_MDIO1 (CONFIG_SYS_FSL_WRIOP1_ADDR + 0x16000)
|
||||||
|
#define CONFIG_SYS_FSL_WRIOP1_MDIO2 (CONFIG_SYS_FSL_WRIOP1_ADDR + 0x17000)
|
||||||
|
#define CONFIG_SYS_FSL_LSCH3_SERDES_ADDR (CONFIG_SYS_IMMR + 0xEA0000)
|
||||||
|
|
||||||
|
/* SP (Cortex-A5) related */
|
||||||
|
#define CONFIG_SYS_FSL_SP_ADDR (CONFIG_SYS_IMMR + 0x00F00000)
|
||||||
|
#define CONFIG_SYS_FSL_SP_VSG_GIC_ADDR (CONFIG_SYS_FSL_SP_ADDR)
|
||||||
|
#define CONFIG_SYS_FSL_SP_VSG_GIC_VIGR1 (CONFIG_SYS_FSL_SP_ADDR)
|
||||||
|
#define CONFIG_SYS_FSL_SP_VSG_GIC_VIGR2 \
|
||||||
|
(CONFIG_SYS_FSL_SP_ADDR + 0x0008)
|
||||||
|
#define CONFIG_SYS_FSL_SP_LOOPBACK_DUART \
|
||||||
|
(CONFIG_SYS_FSL_SP_ADDR + 0x1000)
|
||||||
|
|
||||||
#define CONFIG_SYS_FSL_DCSR_DDR_ADDR 0x70012c000ULL
|
#define CONFIG_SYS_FSL_DCSR_DDR_ADDR 0x70012c000ULL
|
||||||
#define CONFIG_SYS_FSL_DCSR_DDR2_ADDR 0x70012d000ULL
|
#define CONFIG_SYS_FSL_DCSR_DDR2_ADDR 0x70012d000ULL
|
||||||
#define CONFIG_SYS_FSL_DCSR_DDR3_ADDR 0x700132000ULL
|
#define CONFIG_SYS_FSL_DCSR_DDR3_ADDR 0x700132000ULL
|
||||||
|
@ -88,22 +111,57 @@
|
||||||
#define CONFIG_MAX_MEM_MAPPED CONFIG_SYS_LS2_DDR_BLOCK1_SIZE
|
#define CONFIG_MAX_MEM_MAPPED CONFIG_SYS_LS2_DDR_BLOCK1_SIZE
|
||||||
#define CONFIG_SYS_FSL_DDR_VER FSL_DDR_VER_5_0
|
#define CONFIG_SYS_FSL_DDR_VER FSL_DDR_VER_5_0
|
||||||
|
|
||||||
|
#define CONFIG_SYS_FSL_ESDHC_LE
|
||||||
/* IFC */
|
/* IFC */
|
||||||
#define CONFIG_SYS_FSL_IFC_LE
|
#define CONFIG_SYS_FSL_IFC_LE
|
||||||
|
#define CONFIG_SYS_MEMAC_LITTLE_ENDIAN
|
||||||
|
|
||||||
|
/* PCIe */
|
||||||
|
#define CONFIG_SYS_PCIE1_ADDR (CONFIG_SYS_IMMR + 0x2400000)
|
||||||
|
#define CONFIG_SYS_PCIE2_ADDR (CONFIG_SYS_IMMR + 0x2500000)
|
||||||
|
#define CONFIG_SYS_PCIE3_ADDR (CONFIG_SYS_IMMR + 0x2600000)
|
||||||
|
#define CONFIG_SYS_PCIE4_ADDR (CONFIG_SYS_IMMR + 0x2700000)
|
||||||
|
#define CONFIG_SYS_PCIE1_PHYS_ADDR 0x1000000000ULL
|
||||||
|
#define CONFIG_SYS_PCIE2_PHYS_ADDR 0x1200000000ULL
|
||||||
|
#define CONFIG_SYS_PCIE3_PHYS_ADDR 0x1400000000ULL
|
||||||
|
#define CONFIG_SYS_PCIE4_PHYS_ADDR 0x1600000000ULL
|
||||||
|
|
||||||
|
/* Cache Coherent Interconnect */
|
||||||
|
#define CCI_MN_BASE 0x04000000
|
||||||
|
#define CCI_MN_RNF_NODEID_LIST 0x180
|
||||||
|
#define CCI_MN_DVM_DOMAIN_CTL 0x200
|
||||||
|
#define CCI_MN_DVM_DOMAIN_CTL_SET 0x210
|
||||||
|
|
||||||
|
/* Device Configuration */
|
||||||
|
#define DCFG_BASE 0x01e00000
|
||||||
|
#define DCFG_PORSR1 0x000
|
||||||
|
#define DCFG_PORSR1_RCW_SRC 0xff800000
|
||||||
|
#define DCFG_PORSR1_RCW_SRC_NOR 0x12f00000
|
||||||
|
|
||||||
|
#define DCFG_DCSR_BASE 0X700100000ULL
|
||||||
|
#define DCFG_DCSR_PORCR1 0x000
|
||||||
|
|
||||||
|
/* Supplemental Configuration */
|
||||||
|
#define SCFG_BASE 0x01fc0000
|
||||||
|
#define SCFG_USB3PRM1CR 0x000
|
||||||
|
|
||||||
#ifdef CONFIG_LS2085A
|
#ifdef CONFIG_LS2085A
|
||||||
#define CONFIG_MAX_CPUS 16
|
#define CONFIG_MAX_CPUS 16
|
||||||
#define CONFIG_SYS_FSL_IFC_BANK_COUNT 8
|
#define CONFIG_SYS_FSL_IFC_BANK_COUNT 8
|
||||||
#define CONFIG_NUM_DDR_CONTROLLERS 3
|
#define CONFIG_NUM_DDR_CONTROLLERS 3
|
||||||
#define CONFIG_SYS_FSL_CLUSTER_CLOCKS { 1, 1, 4, 4 }
|
#define CONFIG_SYS_FSL_CLUSTER_CLOCKS { 1, 1, 4, 4 }
|
||||||
|
#define CONFIG_SYS_FSL_SRDS_1
|
||||||
|
#define CONFIG_SYS_FSL_SRDS_2
|
||||||
#else
|
#else
|
||||||
#error SoC not defined
|
#error SoC not defined
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_LS2085A
|
#ifdef CONFIG_LS2085A
|
||||||
#define CONFIG_SYS_FSL_ERRATUM_A008336
|
#define CONFIG_SYS_FSL_ERRATUM_A008336
|
||||||
|
#define CONFIG_SYS_FSL_ERRATUM_A008511
|
||||||
#define CONFIG_SYS_FSL_ERRATUM_A008514
|
#define CONFIG_SYS_FSL_ERRATUM_A008514
|
||||||
|
#define CONFIG_SYS_FSL_ERRATUM_A008585
|
||||||
|
#define CONFIG_SYS_FSL_ERRATUM_A008751
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _ASM_ARMV8_FSL_LSCH3_CONFIG_ */
|
#endif /* _ASM_ARMV8_FSL_LSCH3_CONFIG_ */
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Freescale Semiconductor, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __FSL_SERDES_H
|
||||||
|
#define __FSL_SERDES_H
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#define SRDS_MAX_LANES 8
|
||||||
|
|
||||||
|
enum srds_prtcl {
|
||||||
|
NONE = 0,
|
||||||
|
PCIE1,
|
||||||
|
PCIE2,
|
||||||
|
PCIE3,
|
||||||
|
PCIE4,
|
||||||
|
SATA1,
|
||||||
|
SATA2,
|
||||||
|
XAUI1,
|
||||||
|
XAUI2,
|
||||||
|
XFI1,
|
||||||
|
XFI2,
|
||||||
|
XFI3,
|
||||||
|
XFI4,
|
||||||
|
XFI5,
|
||||||
|
XFI6,
|
||||||
|
XFI7,
|
||||||
|
XFI8,
|
||||||
|
SGMII1,
|
||||||
|
SGMII2,
|
||||||
|
SGMII3,
|
||||||
|
SGMII4,
|
||||||
|
SGMII5,
|
||||||
|
SGMII6,
|
||||||
|
SGMII7,
|
||||||
|
SGMII8,
|
||||||
|
SGMII9,
|
||||||
|
SGMII10,
|
||||||
|
SGMII11,
|
||||||
|
SGMII12,
|
||||||
|
SGMII13,
|
||||||
|
SGMII14,
|
||||||
|
SGMII15,
|
||||||
|
SGMII16,
|
||||||
|
QSGMII_A, /* A indicates MACs 1-4 */
|
||||||
|
QSGMII_B, /* B indicates MACs 5-8 */
|
||||||
|
QSGMII_C, /* C indicates MACs 9-12 */
|
||||||
|
QSGMII_D, /* D indicates MACs 12-16 */
|
||||||
|
SERDES_PRCTL_COUNT
|
||||||
|
};
|
||||||
|
|
||||||
|
enum srds {
|
||||||
|
FSL_SRDS_1 = 0,
|
||||||
|
FSL_SRDS_2 = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
int is_serdes_configured(enum srds_prtcl device);
|
||||||
|
void fsl_serdes_init(void);
|
||||||
|
|
||||||
|
int serdes_get_first_lane(u32 sd, enum srds_prtcl device);
|
||||||
|
enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane);
|
||||||
|
int is_serdes_prtcl_valid(int serdes, u32 prtcl);
|
||||||
|
|
||||||
|
#endif /* __FSL_SERDES_H */
|
|
@ -47,6 +47,30 @@ struct ccsr_gur {
|
||||||
u32 devdisr5; /* Device disable control 5 */
|
u32 devdisr5; /* Device disable control 5 */
|
||||||
u32 devdisr6; /* Device disable control 6 */
|
u32 devdisr6; /* Device disable control 6 */
|
||||||
u32 devdisr7; /* Device disable control 7 */
|
u32 devdisr7; /* Device disable control 7 */
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC1 0x00000001
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC2 0x00000002
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC3 0x00000004
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC4 0x00000008
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC5 0x00000010
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC6 0x00000020
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC7 0x00000040
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC8 0x00000080
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC9 0x00000100
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC10 0x00000200
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC11 0x00000400
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC12 0x00000800
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC13 0x00001000
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC14 0x00002000
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC15 0x00004000
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC16 0x00008000
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC17 0x00010000
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC18 0x00020000
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC19 0x00040000
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC20 0x00080000
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC21 0x00100000
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC22 0x00200000
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC23 0x00400000
|
||||||
|
#define FSL_CHASSIS3_DEVDISR2_DPMAC24 0x00800000
|
||||||
u8 res_08c[0x90-0x8c];
|
u8 res_08c[0x90-0x8c];
|
||||||
u32 coredisru; /* uppper portion for support of 64 cores */
|
u32 coredisru; /* uppper portion for support of 64 cores */
|
||||||
u32 coredisrl; /* lower portion for support of 64 cores */
|
u32 coredisrl; /* lower portion for support of 64 cores */
|
||||||
|
@ -63,6 +87,11 @@ struct ccsr_gur {
|
||||||
#define FSL_CHASSIS3_RCWSR0_MEM_PLL_RAT_MASK 0x3f
|
#define FSL_CHASSIS3_RCWSR0_MEM_PLL_RAT_MASK 0x3f
|
||||||
#define FSL_CHASSIS3_RCWSR0_MEM2_PLL_RAT_SHIFT 18
|
#define FSL_CHASSIS3_RCWSR0_MEM2_PLL_RAT_SHIFT 18
|
||||||
#define FSL_CHASSIS3_RCWSR0_MEM2_PLL_RAT_MASK 0x3f
|
#define FSL_CHASSIS3_RCWSR0_MEM2_PLL_RAT_MASK 0x3f
|
||||||
|
#define FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_MASK 0x00FF0000
|
||||||
|
#define FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_SHIFT 16
|
||||||
|
#define FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_MASK 0xFF000000
|
||||||
|
#define FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_SHIFT 24
|
||||||
|
|
||||||
u8 res_180[0x200-0x180];
|
u8 res_180[0x200-0x180];
|
||||||
u32 scratchrw[32]; /* Scratch Read/Write */
|
u32 scratchrw[32]; /* Scratch Read/Write */
|
||||||
u8 res_280[0x300-0x280];
|
u8 res_280[0x300-0x280];
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Freescale Semiconductor
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
void fsl_lsch3_early_init_f(void);
|
||||||
|
|
|
@ -119,10 +119,6 @@
|
||||||
|
|
||||||
#define DCU_LAYER_MAX_NUM 16
|
#define DCU_LAYER_MAX_NUM 16
|
||||||
|
|
||||||
#define QE_MURAM_SIZE 0x6000UL
|
|
||||||
#define MAX_QE_RISC 1
|
|
||||||
#define QE_NUM_OF_SNUM 28
|
|
||||||
|
|
||||||
#define CONFIG_SYS_FSL_SRDS_1
|
#define CONFIG_SYS_FSL_SRDS_1
|
||||||
|
|
||||||
#ifdef CONFIG_LS102XA
|
#ifdef CONFIG_LS102XA
|
||||||
|
|
|
@ -17,6 +17,9 @@
|
||||||
#define SOC_VER_LS1021 0x11
|
#define SOC_VER_LS1021 0x11
|
||||||
#define SOC_VER_LS1022 0x12
|
#define SOC_VER_LS1022 0x12
|
||||||
|
|
||||||
|
#define SOC_MAJOR_VER_1_0 0x1
|
||||||
|
#define SOC_MAJOR_VER_2_0 0x2
|
||||||
|
|
||||||
#define CCSR_BRR_OFFSET 0xe4
|
#define CCSR_BRR_OFFSET 0xe4
|
||||||
#define CCSR_SCRATCHRW1_OFFSET 0x200
|
#define CCSR_SCRATCHRW1_OFFSET 0x200
|
||||||
|
|
||||||
|
|
|
@ -250,6 +250,7 @@ struct mx6_ddr_sysinfo {
|
||||||
u8 mif3_mode; /* Command prediction working mode */
|
u8 mif3_mode; /* Command prediction working mode */
|
||||||
u8 rst_to_cke; /* Time from SDE enable to CKE rise */
|
u8 rst_to_cke; /* Time from SDE enable to CKE rise */
|
||||||
u8 sde_to_rst; /* Time from SDE enable until DDR reset# is high */
|
u8 sde_to_rst; /* Time from SDE enable until DDR reset# is high */
|
||||||
|
u8 pd_fast_exit;/* enable precharge powerdown fast-exit */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -15,6 +15,9 @@ void socfpga_bridges_reset(int enable);
|
||||||
void socfpga_emac_reset(int enable);
|
void socfpga_emac_reset(int enable);
|
||||||
void socfpga_watchdog_reset(void);
|
void socfpga_watchdog_reset(void);
|
||||||
void socfpga_spim_enable(void);
|
void socfpga_spim_enable(void);
|
||||||
|
void socfpga_uart0_enable(void);
|
||||||
|
void socfpga_sdram_enable(void);
|
||||||
|
void socfpga_osc1timer_enable(void);
|
||||||
|
|
||||||
struct socfpga_reset_manager {
|
struct socfpga_reset_manager {
|
||||||
u32 status;
|
u32 status;
|
||||||
|
@ -36,7 +39,10 @@ struct socfpga_reset_manager {
|
||||||
#define RSTMGR_PERMODRST_EMAC0_LSB 0
|
#define RSTMGR_PERMODRST_EMAC0_LSB 0
|
||||||
#define RSTMGR_PERMODRST_EMAC1_LSB 1
|
#define RSTMGR_PERMODRST_EMAC1_LSB 1
|
||||||
#define RSTMGR_PERMODRST_L4WD0_LSB 6
|
#define RSTMGR_PERMODRST_L4WD0_LSB 6
|
||||||
|
#define RSTMGR_PERMODRST_OSC1TIMER0_LSB 8
|
||||||
|
#define RSTMGR_PERMODRST_UART0_LSB 16
|
||||||
#define RSTMGR_PERMODRST_SPIM0_LSB 18
|
#define RSTMGR_PERMODRST_SPIM0_LSB 18
|
||||||
#define RSTMGR_PERMODRST_SPIM1_LSB 19
|
#define RSTMGR_PERMODRST_SPIM1_LSB 19
|
||||||
|
#define RSTMGR_PERMODRST_SDR_LSB 29
|
||||||
|
|
||||||
#endif /* _RESET_MANAGER_H_ */
|
#endif /* _RESET_MANAGER_H_ */
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Marek Vasut <marex@denx.de>
|
||||||
|
*
|
||||||
|
* FIXME: This file contains temporary stub functions and is here
|
||||||
|
* only until these functions are properly merged into
|
||||||
|
* mainline.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ARCH_SDRAM_H__
|
||||||
|
#define __ARCH_SDRAM_H__
|
||||||
|
|
||||||
|
/* function declaration */
|
||||||
|
inline unsigned long sdram_calculate_size(void) { return 0; }
|
||||||
|
inline unsigned sdram_mmr_init_full(unsigned int sdr_phy_reg) { return 0; }
|
||||||
|
inline int sdram_calibration_full(void) { return 0; }
|
||||||
|
|
||||||
|
#endif /* __ARCH_SDRAM_H__ */
|
|
@ -10,6 +10,7 @@
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
void sysmgr_pinmux_init(void);
|
void sysmgr_pinmux_init(void);
|
||||||
|
void sysmgr_enable_warmrstcfgio(void);
|
||||||
|
|
||||||
/* declaration for handoff table type */
|
/* declaration for handoff table type */
|
||||||
extern unsigned long sys_mgr_init_table[CONFIG_HPS_PINMUX_NUM];
|
extern unsigned long sys_mgr_init_table[CONFIG_HPS_PINMUX_NUM];
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2013
|
||||||
|
* Pavel Boldin, Emcraft Systems, paboldin@emcraft.com
|
||||||
|
*
|
||||||
|
* (C) Copyright 2015
|
||||||
|
* Kamil Lulko, <rev13@wp.pl>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MACH_FMC_H_
|
||||||
|
#define _MACH_FMC_H_
|
||||||
|
|
||||||
|
struct stm32_fmc_regs {
|
||||||
|
u32 sdcr1; /* Control register 1 */
|
||||||
|
u32 sdcr2; /* Control register 2 */
|
||||||
|
u32 sdtr1; /* Timing register 1 */
|
||||||
|
u32 sdtr2; /* Timing register 2 */
|
||||||
|
u32 sdcmr; /* Mode register */
|
||||||
|
u32 sdrtr; /* Refresh timing register */
|
||||||
|
u32 sdsr; /* Status register */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FMC registers base
|
||||||
|
*/
|
||||||
|
#define STM32_SDRAM_FMC_BASE 0xA0000140
|
||||||
|
#define STM32_SDRAM_FMC ((struct stm32_fmc_regs *)STM32_SDRAM_FMC_BASE)
|
||||||
|
|
||||||
|
/* Control register SDCR */
|
||||||
|
#define FMC_SDCR_RPIPE_SHIFT 13 /* RPIPE bit shift */
|
||||||
|
#define FMC_SDCR_RBURST_SHIFT 12 /* RBURST bit shift */
|
||||||
|
#define FMC_SDCR_SDCLK_SHIFT 10 /* SDRAM clock divisor shift */
|
||||||
|
#define FMC_SDCR_WP_SHIFT 9 /* Write protection shift */
|
||||||
|
#define FMC_SDCR_CAS_SHIFT 7 /* CAS latency shift */
|
||||||
|
#define FMC_SDCR_NB_SHIFT 6 /* Number of banks shift */
|
||||||
|
#define FMC_SDCR_MWID_SHIFT 4 /* Memory width shift */
|
||||||
|
#define FMC_SDCR_NR_SHIFT 2 /* Number of row address bits shift */
|
||||||
|
#define FMC_SDCR_NC_SHIFT 0 /* Number of col address bits shift */
|
||||||
|
|
||||||
|
/* Timings register SDTR */
|
||||||
|
#define FMC_SDTR_TMRD_SHIFT 0 /* Load mode register to active */
|
||||||
|
#define FMC_SDTR_TXSR_SHIFT 4 /* Exit self-refresh time */
|
||||||
|
#define FMC_SDTR_TRAS_SHIFT 8 /* Self-refresh time */
|
||||||
|
#define FMC_SDTR_TRC_SHIFT 12 /* Row cycle delay */
|
||||||
|
#define FMC_SDTR_TWR_SHIFT 16 /* Recovery delay */
|
||||||
|
#define FMC_SDTR_TRP_SHIFT 20 /* Row precharge delay */
|
||||||
|
#define FMC_SDTR_TRCD_SHIFT 24 /* Row-to-column delay */
|
||||||
|
|
||||||
|
|
||||||
|
#define FMC_SDCMR_NRFS_SHIFT 5
|
||||||
|
|
||||||
|
#define FMC_SDCMR_MODE_NORMAL 0
|
||||||
|
#define FMC_SDCMR_MODE_START_CLOCK 1
|
||||||
|
#define FMC_SDCMR_MODE_PRECHARGE 2
|
||||||
|
#define FMC_SDCMR_MODE_AUTOREFRESH 3
|
||||||
|
#define FMC_SDCMR_MODE_WRITE_MODE 4
|
||||||
|
#define FMC_SDCMR_MODE_SELFREFRESH 5
|
||||||
|
#define FMC_SDCMR_MODE_POWERDOWN 6
|
||||||
|
|
||||||
|
#define FMC_SDCMR_BANK_1 (1 << 4)
|
||||||
|
#define FMC_SDCMR_BANK_2 (1 << 3)
|
||||||
|
|
||||||
|
#define FMC_SDCMR_MODE_REGISTER_SHIFT 9
|
||||||
|
|
||||||
|
#define FMC_SDSR_BUSY (1 << 5)
|
||||||
|
|
||||||
|
#define FMC_BUSY_WAIT() do { \
|
||||||
|
__asm__ __volatile__ ("dsb" : : : "memory"); \
|
||||||
|
while (STM32_SDRAM_FMC->sdsr & FMC_SDSR_BUSY) \
|
||||||
|
; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _MACH_FMC_H_ */
|
|
@ -0,0 +1,116 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2011
|
||||||
|
* Yuri Tikhonov, Emcraft Systems, yur@emcraft.com
|
||||||
|
*
|
||||||
|
* (C) Copyright 2015
|
||||||
|
* Kamil Lulko, <rev13@wp.pl>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _STM32_GPIO_H_
|
||||||
|
#define _STM32_GPIO_H_
|
||||||
|
|
||||||
|
enum stm32_gpio_port {
|
||||||
|
STM32_GPIO_PORT_A = 0,
|
||||||
|
STM32_GPIO_PORT_B,
|
||||||
|
STM32_GPIO_PORT_C,
|
||||||
|
STM32_GPIO_PORT_D,
|
||||||
|
STM32_GPIO_PORT_E,
|
||||||
|
STM32_GPIO_PORT_F,
|
||||||
|
STM32_GPIO_PORT_G,
|
||||||
|
STM32_GPIO_PORT_H,
|
||||||
|
STM32_GPIO_PORT_I
|
||||||
|
};
|
||||||
|
|
||||||
|
enum stm32_gpio_pin {
|
||||||
|
STM32_GPIO_PIN_0 = 0,
|
||||||
|
STM32_GPIO_PIN_1,
|
||||||
|
STM32_GPIO_PIN_2,
|
||||||
|
STM32_GPIO_PIN_3,
|
||||||
|
STM32_GPIO_PIN_4,
|
||||||
|
STM32_GPIO_PIN_5,
|
||||||
|
STM32_GPIO_PIN_6,
|
||||||
|
STM32_GPIO_PIN_7,
|
||||||
|
STM32_GPIO_PIN_8,
|
||||||
|
STM32_GPIO_PIN_9,
|
||||||
|
STM32_GPIO_PIN_10,
|
||||||
|
STM32_GPIO_PIN_11,
|
||||||
|
STM32_GPIO_PIN_12,
|
||||||
|
STM32_GPIO_PIN_13,
|
||||||
|
STM32_GPIO_PIN_14,
|
||||||
|
STM32_GPIO_PIN_15
|
||||||
|
};
|
||||||
|
|
||||||
|
enum stm32_gpio_mode {
|
||||||
|
STM32_GPIO_MODE_IN = 0,
|
||||||
|
STM32_GPIO_MODE_OUT,
|
||||||
|
STM32_GPIO_MODE_AF,
|
||||||
|
STM32_GPIO_MODE_AN
|
||||||
|
};
|
||||||
|
|
||||||
|
enum stm32_gpio_otype {
|
||||||
|
STM32_GPIO_OTYPE_PP = 0,
|
||||||
|
STM32_GPIO_OTYPE_OD
|
||||||
|
};
|
||||||
|
|
||||||
|
enum stm32_gpio_speed {
|
||||||
|
STM32_GPIO_SPEED_2M = 0,
|
||||||
|
STM32_GPIO_SPEED_25M,
|
||||||
|
STM32_GPIO_SPEED_50M,
|
||||||
|
STM32_GPIO_SPEED_100M
|
||||||
|
};
|
||||||
|
|
||||||
|
enum stm32_gpio_pupd {
|
||||||
|
STM32_GPIO_PUPD_NO = 0,
|
||||||
|
STM32_GPIO_PUPD_UP,
|
||||||
|
STM32_GPIO_PUPD_DOWN
|
||||||
|
};
|
||||||
|
|
||||||
|
enum stm32_gpio_af {
|
||||||
|
STM32_GPIO_AF0 = 0,
|
||||||
|
STM32_GPIO_AF1,
|
||||||
|
STM32_GPIO_AF2,
|
||||||
|
STM32_GPIO_AF3,
|
||||||
|
STM32_GPIO_AF4,
|
||||||
|
STM32_GPIO_AF5,
|
||||||
|
STM32_GPIO_AF6,
|
||||||
|
STM32_GPIO_AF7,
|
||||||
|
STM32_GPIO_AF8,
|
||||||
|
STM32_GPIO_AF9,
|
||||||
|
STM32_GPIO_AF10,
|
||||||
|
STM32_GPIO_AF11,
|
||||||
|
STM32_GPIO_AF12,
|
||||||
|
STM32_GPIO_AF13,
|
||||||
|
STM32_GPIO_AF14,
|
||||||
|
STM32_GPIO_AF15
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stm32_gpio_dsc {
|
||||||
|
enum stm32_gpio_port port;
|
||||||
|
enum stm32_gpio_pin pin;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stm32_gpio_ctl {
|
||||||
|
enum stm32_gpio_mode mode;
|
||||||
|
enum stm32_gpio_otype otype;
|
||||||
|
enum stm32_gpio_speed speed;
|
||||||
|
enum stm32_gpio_pupd pupd;
|
||||||
|
enum stm32_gpio_af af;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline unsigned stm32_gpio_to_port(unsigned gpio)
|
||||||
|
{
|
||||||
|
return gpio / 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned stm32_gpio_to_pin(unsigned gpio)
|
||||||
|
{
|
||||||
|
return gpio % 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
int stm32_gpio_config(const struct stm32_gpio_dsc *gpio_dsc,
|
||||||
|
const struct stm32_gpio_ctl *gpio_ctl);
|
||||||
|
int stm32_gpout_set(const struct stm32_gpio_dsc *gpio_dsc, int state);
|
||||||
|
|
||||||
|
#endif /* _STM32_GPIO_H_ */
|
|
@ -0,0 +1,108 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2011
|
||||||
|
* Yuri Tikhonov, Emcraft Systems, yur@emcraft.com
|
||||||
|
*
|
||||||
|
* (C) Copyright 2015
|
||||||
|
* Kamil Lulko, <rev13@wp.pl>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MACH_STM32_H_
|
||||||
|
#define _MACH_STM32_H_
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Peripheral memory map
|
||||||
|
*/
|
||||||
|
#define STM32_PERIPH_BASE 0x40000000
|
||||||
|
#define STM32_APB1PERIPH_BASE (STM32_PERIPH_BASE + 0x00000000)
|
||||||
|
#define STM32_APB2PERIPH_BASE (STM32_PERIPH_BASE + 0x00010000)
|
||||||
|
#define STM32_AHB1PERIPH_BASE (STM32_PERIPH_BASE + 0x00020000)
|
||||||
|
#define STM32_AHB2PERIPH_BASE (STM32_PERIPH_BASE + 0x10000000)
|
||||||
|
|
||||||
|
#define STM32_BUS_MASK 0xFFFF0000
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Register maps
|
||||||
|
*/
|
||||||
|
struct stm32_rcc_regs {
|
||||||
|
u32 cr; /* RCC clock control */
|
||||||
|
u32 pllcfgr; /* RCC PLL configuration */
|
||||||
|
u32 cfgr; /* RCC clock configuration */
|
||||||
|
u32 cir; /* RCC clock interrupt */
|
||||||
|
u32 ahb1rstr; /* RCC AHB1 peripheral reset */
|
||||||
|
u32 ahb2rstr; /* RCC AHB2 peripheral reset */
|
||||||
|
u32 ahb3rstr; /* RCC AHB3 peripheral reset */
|
||||||
|
u32 rsv0;
|
||||||
|
u32 apb1rstr; /* RCC APB1 peripheral reset */
|
||||||
|
u32 apb2rstr; /* RCC APB2 peripheral reset */
|
||||||
|
u32 rsv1[2];
|
||||||
|
u32 ahb1enr; /* RCC AHB1 peripheral clock enable */
|
||||||
|
u32 ahb2enr; /* RCC AHB2 peripheral clock enable */
|
||||||
|
u32 ahb3enr; /* RCC AHB3 peripheral clock enable */
|
||||||
|
u32 rsv2;
|
||||||
|
u32 apb1enr; /* RCC APB1 peripheral clock enable */
|
||||||
|
u32 apb2enr; /* RCC APB2 peripheral clock enable */
|
||||||
|
u32 rsv3[2];
|
||||||
|
u32 ahb1lpenr; /* RCC AHB1 periph clk enable in low pwr mode */
|
||||||
|
u32 ahb2lpenr; /* RCC AHB2 periph clk enable in low pwr mode */
|
||||||
|
u32 ahb3lpenr; /* RCC AHB3 periph clk enable in low pwr mode */
|
||||||
|
u32 rsv4;
|
||||||
|
u32 apb1lpenr; /* RCC APB1 periph clk enable in low pwr mode */
|
||||||
|
u32 apb2lpenr; /* RCC APB2 periph clk enable in low pwr mode */
|
||||||
|
u32 rsv5[2];
|
||||||
|
u32 bdcr; /* RCC Backup domain control */
|
||||||
|
u32 csr; /* RCC clock control & status */
|
||||||
|
u32 rsv6[2];
|
||||||
|
u32 sscgr; /* RCC spread spectrum clock generation */
|
||||||
|
u32 plli2scfgr; /* RCC PLLI2S configuration */
|
||||||
|
u32 pllsaicfgr;
|
||||||
|
u32 dckcfgr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stm32_pwr_regs {
|
||||||
|
u32 cr;
|
||||||
|
u32 csr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stm32_flash_regs {
|
||||||
|
u32 acr;
|
||||||
|
u32 key;
|
||||||
|
u32 optkeyr;
|
||||||
|
u32 sr;
|
||||||
|
u32 cr;
|
||||||
|
u32 optcr;
|
||||||
|
u32 optcr1;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Registers access macros
|
||||||
|
*/
|
||||||
|
#define STM32_RCC_BASE (STM32_AHB1PERIPH_BASE + 0x3800)
|
||||||
|
#define STM32_RCC ((struct stm32_rcc_regs *)STM32_RCC_BASE)
|
||||||
|
|
||||||
|
#define STM32_PWR_BASE (STM32_APB1PERIPH_BASE + 0x7000)
|
||||||
|
#define STM32_PWR ((struct stm32_pwr_regs *)STM32_PWR_BASE)
|
||||||
|
|
||||||
|
#define STM32_FLASH_BASE (STM32_AHB1PERIPH_BASE + 0x3C00)
|
||||||
|
#define STM32_FLASH ((struct stm32_flash_regs *)STM32_FLASH_BASE)
|
||||||
|
|
||||||
|
#define STM32_FLASH_SR_BSY (1 << 16)
|
||||||
|
|
||||||
|
#define STM32_FLASH_CR_PG (1 << 0)
|
||||||
|
#define STM32_FLASH_CR_SER (1 << 1)
|
||||||
|
#define STM32_FLASH_CR_STRT (1 << 16)
|
||||||
|
#define STM32_FLASH_CR_LOCK (1 << 31)
|
||||||
|
#define STM32_FLASH_CR_SNB_OFFSET 3
|
||||||
|
|
||||||
|
enum clock {
|
||||||
|
CLOCK_CORE,
|
||||||
|
CLOCK_AHB,
|
||||||
|
CLOCK_APB1,
|
||||||
|
CLOCK_APB2
|
||||||
|
};
|
||||||
|
|
||||||
|
int configure_clocks(void);
|
||||||
|
unsigned long clock_get(enum clock clck);
|
||||||
|
|
||||||
|
#endif /* _MACH_STM32_H_ */
|
|
@ -94,6 +94,13 @@
|
||||||
#define SUNXI_TWI0_BASE 0x01c2ac00
|
#define SUNXI_TWI0_BASE 0x01c2ac00
|
||||||
#define SUNXI_TWI1_BASE 0x01c2b000
|
#define SUNXI_TWI1_BASE 0x01c2b000
|
||||||
#define SUNXI_TWI2_BASE 0x01c2b400
|
#define SUNXI_TWI2_BASE 0x01c2b400
|
||||||
|
#ifdef CONFIG_MACH_SUN6I
|
||||||
|
#define SUNXI_TWI3_BASE 0x01c0b800
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_MACH_SUN7I
|
||||||
|
#define SUNXI_TWI3_BASE 0x01c2b800
|
||||||
|
#define SUNXI_TWI4_BASE 0x01c2c000
|
||||||
|
#endif
|
||||||
|
|
||||||
#define SUNXI_CAN_BASE 0x01c2bc00
|
#define SUNXI_CAN_BASE 0x01c2bc00
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,7 @@ struct sunxi_gpio_reg {
|
||||||
#define GPIO_CFG_INDEX(pin) (((pin) & 0x1f) >> 3)
|
#define GPIO_CFG_INDEX(pin) (((pin) & 0x1f) >> 3)
|
||||||
#define GPIO_CFG_OFFSET(pin) ((((pin) & 0x1f) & 0x7) << 2)
|
#define GPIO_CFG_OFFSET(pin) ((((pin) & 0x1f) & 0x7) << 2)
|
||||||
|
|
||||||
#define GPIO_DRV_INDEX(pin) (((pin) & 0x1f) >> 4)
|
#define GPIO_DRV_INDEX(pin) (((pin) & 0x1f) >> 4)
|
||||||
#define GPIO_DRV_OFFSET(pin) ((((pin) & 0x1f) & 0xf) << 1)
|
#define GPIO_DRV_OFFSET(pin) ((((pin) & 0x1f) & 0xf) << 1)
|
||||||
|
|
||||||
#define GPIO_PULL_INDEX(pin) (((pin) & 0x1f) >> 4)
|
#define GPIO_PULL_INDEX(pin) (((pin) & 0x1f) >> 4)
|
||||||
|
@ -142,71 +142,77 @@ enum sunxi_gpio_number {
|
||||||
#define SUNXI_GPIO_INPUT 0
|
#define SUNXI_GPIO_INPUT 0
|
||||||
#define SUNXI_GPIO_OUTPUT 1
|
#define SUNXI_GPIO_OUTPUT 1
|
||||||
|
|
||||||
#define SUNXI_GPA0_EMAC 2
|
#define SUNXI_GPA_EMAC 2
|
||||||
#define SUN6I_GPA0_GMAC 2
|
#define SUN6I_GPA_GMAC 2
|
||||||
#define SUN7I_GPA0_GMAC 5
|
#define SUN7I_GPA_GMAC 5
|
||||||
|
#define SUN6I_GPA_SDC2 5
|
||||||
|
#define SUN6I_GPA_SDC3 4
|
||||||
|
|
||||||
#define SUNXI_GPB0_TWI0 2
|
#define SUN4I_GPB_TWI0 2
|
||||||
|
#define SUN4I_GPB_TWI1 2
|
||||||
|
#define SUN5I_GPB_TWI1 2
|
||||||
|
#define SUN4I_GPB_TWI2 2
|
||||||
|
#define SUN5I_GPB_TWI2 2
|
||||||
|
#define SUN4I_GPB_UART0 2
|
||||||
|
#define SUN5I_GPB_UART0 2
|
||||||
|
|
||||||
#define SUN4I_GPB22_UART0_TX 2
|
#define SUNXI_GPC_SDC2 3
|
||||||
#define SUN4I_GPB23_UART0_RX 2
|
#define SUN6I_GPC_SDC3 4
|
||||||
|
|
||||||
#define SUN5I_GPB19_UART0_TX 2
|
#define SUN8I_GPD_SDC1 3
|
||||||
#define SUN5I_GPB20_UART0_RX 2
|
#define SUNXI_GPD_LCD0 2
|
||||||
|
#define SUNXI_GPD_LVDS0 3
|
||||||
|
|
||||||
#define SUNXI_GPC6_SDC2 3
|
#define SUN5I_GPE_SDC2 3
|
||||||
|
#define SUN8I_GPE_TWI2 3
|
||||||
|
|
||||||
#define SUNXI_GPD0_LCD0 2
|
#define SUNXI_GPF_SDC0 2
|
||||||
#define SUNXI_GPD0_LVDS0 3
|
#define SUNXI_GPF_UART0 4
|
||||||
|
#define SUN8I_GPF_UART0 3
|
||||||
|
|
||||||
#define SUNXI_GPF0_SDC0 2
|
#define SUN4I_GPG_SDC1 4
|
||||||
|
#define SUN5I_GPG_SDC1 2
|
||||||
|
#define SUN6I_GPG_SDC1 2
|
||||||
|
#define SUN8I_GPG_SDC1 2
|
||||||
|
#define SUN6I_GPG_TWI3 2
|
||||||
|
#define SUN5I_GPG_UART1 4
|
||||||
|
|
||||||
#define SUNXI_GPF2_SDC0 2
|
#define SUN4I_GPH_SDC1 5
|
||||||
|
#define SUN6I_GPH_TWI0 2
|
||||||
|
#define SUN8I_GPH_TWI0 2
|
||||||
|
#define SUN6I_GPH_TWI1 2
|
||||||
|
#define SUN8I_GPH_TWI1 2
|
||||||
|
#define SUN6I_GPH_TWI2 2
|
||||||
|
#define SUN6I_GPH_UART0 2
|
||||||
|
|
||||||
#ifdef CONFIG_MACH_SUN8I
|
#define SUNXI_GPI_SDC3 2
|
||||||
#define SUNXI_GPF2_UART0_TX 3
|
#define SUN7I_GPI_TWI3 3
|
||||||
#define SUNXI_GPF4_UART0_RX 3
|
#define SUN7I_GPI_TWI4 3
|
||||||
#else
|
|
||||||
#define SUNXI_GPF2_UART0_TX 4
|
|
||||||
#define SUNXI_GPF4_UART0_RX 4
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SUN4I_GPG0_SDC1 4
|
|
||||||
|
|
||||||
#define SUN5I_GPG3_SDC1 2
|
|
||||||
|
|
||||||
#define SUN5I_GPG3_UART1_TX 4
|
|
||||||
#define SUN5I_GPG4_UART1_RX 4
|
|
||||||
|
|
||||||
#define SUN4I_GPH22_SDC1 5
|
|
||||||
|
|
||||||
#define SUN6I_GPH20_UART0_TX 2
|
|
||||||
#define SUN6I_GPH21_UART0_RX 2
|
|
||||||
|
|
||||||
#define SUN4I_GPI4_SDC3 2
|
|
||||||
|
|
||||||
#define SUN6I_GPL0_R_P2WI_SCK 3
|
#define SUN6I_GPL0_R_P2WI_SCK 3
|
||||||
#define SUN6I_GPL1_R_P2WI_SDA 3
|
#define SUN6I_GPL1_R_P2WI_SDA 3
|
||||||
|
|
||||||
#define SUN8I_GPL0_R_RSB_SCK 2
|
#define SUN8I_GPL_R_RSB 2
|
||||||
#define SUN8I_GPL1_R_RSB_SDA 2
|
#define SUN8I_GPL_R_UART 2
|
||||||
#define SUN8I_GPL2_R_UART_TX 2
|
|
||||||
#define SUN8I_GPL3_R_UART_RX 2
|
|
||||||
|
|
||||||
#define SUN9I_GPN0_R_RSB_SCK 3
|
#define SUN9I_GPN_R_RSB 3
|
||||||
#define SUN9I_GPN1_R_RSB_SDA 3
|
|
||||||
|
|
||||||
/* GPIO pin pull-up/down config */
|
/* GPIO pin pull-up/down config */
|
||||||
#define SUNXI_GPIO_PULL_DISABLE 0
|
#define SUNXI_GPIO_PULL_DISABLE 0
|
||||||
#define SUNXI_GPIO_PULL_UP 1
|
#define SUNXI_GPIO_PULL_UP 1
|
||||||
#define SUNXI_GPIO_PULL_DOWN 2
|
#define SUNXI_GPIO_PULL_DOWN 2
|
||||||
|
|
||||||
|
/* Virtual AXP0 GPIOs */
|
||||||
|
#define SUNXI_GPIO_AXP0_VBUS_DETECT 8
|
||||||
|
#define SUNXI_GPIO_AXP0_VBUS_ENABLE 9
|
||||||
|
|
||||||
void sunxi_gpio_set_cfgbank(struct sunxi_gpio *pio, int bank_offset, u32 val);
|
void sunxi_gpio_set_cfgbank(struct sunxi_gpio *pio, int bank_offset, u32 val);
|
||||||
void sunxi_gpio_set_cfgpin(u32 pin, u32 val);
|
void sunxi_gpio_set_cfgpin(u32 pin, u32 val);
|
||||||
int sunxi_gpio_get_cfgbank(struct sunxi_gpio *pio, int bank_offset);
|
int sunxi_gpio_get_cfgbank(struct sunxi_gpio *pio, int bank_offset);
|
||||||
int sunxi_gpio_get_cfgpin(u32 pin);
|
int sunxi_gpio_get_cfgpin(u32 pin);
|
||||||
int sunxi_gpio_set_drv(u32 pin, u32 val);
|
int sunxi_gpio_set_drv(u32 pin, u32 val);
|
||||||
int sunxi_gpio_set_pull(u32 pin, u32 val);
|
int sunxi_gpio_set_pull(u32 pin, u32 val);
|
||||||
|
int sunxi_name_to_gpio_bank(const char *name);
|
||||||
int sunxi_name_to_gpio(const char *name);
|
int sunxi_name_to_gpio(const char *name);
|
||||||
#define name_to_gpio(name) sunxi_name_to_gpio(name)
|
#define name_to_gpio(name) sunxi_name_to_gpio(name)
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,22 @@
|
||||||
|
|
||||||
#include <asm/arch/cpu.h>
|
#include <asm/arch/cpu.h>
|
||||||
|
|
||||||
#define CONFIG_I2C_MVTWSI_BASE SUNXI_TWI0_BASE
|
#ifdef CONFIG_I2C0_ENABLE
|
||||||
|
#define CONFIG_I2C_MVTWSI_BASE0 SUNXI_TWI0_BASE
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_I2C1_ENABLE
|
||||||
|
#define CONFIG_I2C_MVTWSI_BASE1 SUNXI_TWI1_BASE
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_I2C2_ENABLE
|
||||||
|
#define CONFIG_I2C_MVTWSI_BASE2 SUNXI_TWI2_BASE
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_I2C3_ENABLE
|
||||||
|
#define CONFIG_I2C_MVTWSI_BASE3 SUNXI_TWI3_BASE
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_I2C4_ENABLE
|
||||||
|
#define CONFIG_I2C_MVTWSI_BASE4 SUNXI_TWI4_BASE
|
||||||
|
#endif
|
||||||
|
|
||||||
/* This is abp0-clk on sun4i/5i/7i / abp1-clk on sun6i/sun8i which is 24MHz */
|
/* This is abp0-clk on sun4i/5i/7i / abp1-clk on sun6i/sun8i which is 24MHz */
|
||||||
#define CONFIG_SYS_TCLK 24000000
|
#define CONFIG_SYS_TCLK 24000000
|
||||||
|
|
||||||
|
|
|
@ -20,4 +20,5 @@ void sunxi_usbc_enable(int index);
|
||||||
void sunxi_usbc_disable(int index);
|
void sunxi_usbc_disable(int index);
|
||||||
void sunxi_usbc_vbus_enable(int index);
|
void sunxi_usbc_vbus_enable(int index);
|
||||||
void sunxi_usbc_vbus_disable(int index);
|
void sunxi_usbc_vbus_disable(int index);
|
||||||
|
int sunxi_usbc_vbus_detect(int index);
|
||||||
void sunxi_usbc_enable_squelch_detect(int index, int enable);
|
void sunxi_usbc_enable_squelch_detect(int index, int enable);
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue