Merge branch 'master' of git://git.denx.de/u-boot
Signed-off-by: Stefano Babic <sbabic@denx.de> Conflicts: boards.cfg
This commit is contained in:
commit
dab5e3469d
7
.gitignore
vendored
7
.gitignore
vendored
@ -20,7 +20,9 @@
|
||||
*.bin
|
||||
*.patch
|
||||
*.cfgtmp
|
||||
*.dts.tmp
|
||||
|
||||
# host programs on Cygwin
|
||||
*.exe
|
||||
|
||||
# Build tree
|
||||
/build-*
|
||||
@ -47,8 +49,7 @@
|
||||
/errlog
|
||||
/reloc_off
|
||||
|
||||
/spl/*
|
||||
!/spl/Makefile
|
||||
/spl/
|
||||
/tpl/
|
||||
|
||||
#
|
||||
|
105
Makefile
105
Makefile
@ -8,7 +8,7 @@
|
||||
VERSION = 2014
|
||||
PATCHLEVEL = 07
|
||||
SUBLEVEL =
|
||||
EXTRAVERSION = -rc1
|
||||
EXTRAVERSION =
|
||||
NAME =
|
||||
|
||||
# *DOCUMENTATION*
|
||||
@ -209,11 +209,6 @@ HOSTCXX = g++
|
||||
HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
|
||||
HOSTCXXFLAGS = -O2
|
||||
|
||||
ifeq ($(shell $(HOSTCC) -v 2>&1 | grep -c "clang version"), 1)
|
||||
HOSTCFLAGS += -Wno-unused-value -Wno-unused-parameter \
|
||||
-Wno-missing-field-initializers -fno-delete-null-pointer-checks
|
||||
endif
|
||||
|
||||
ifeq ($(HOSTOS),cygwin)
|
||||
HOSTCFLAGS += -ansi
|
||||
endif
|
||||
@ -249,18 +244,18 @@ endif
|
||||
KBUILD_MODULES :=
|
||||
KBUILD_BUILTIN := 1
|
||||
|
||||
# If we have only "make modules", don't compile built-in objects.
|
||||
# When we're building modules with modversions, we need to consider
|
||||
# the built-in objects during the descend as well, in order to
|
||||
# make sure the checksums are up to date before we record them.
|
||||
# If we have only "make modules", don't compile built-in objects.
|
||||
# When we're building modules with modversions, we need to consider
|
||||
# the built-in objects during the descend as well, in order to
|
||||
# make sure the checksums are up to date before we record them.
|
||||
|
||||
ifeq ($(MAKECMDGOALS),modules)
|
||||
KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1)
|
||||
endif
|
||||
|
||||
# If we have "make <whatever> modules", compile modules
|
||||
# in addition to whatever we do anyway.
|
||||
# Just "make" or "make all" shall build modules as well
|
||||
# If we have "make <whatever> modules", compile modules
|
||||
# in addition to whatever we do anyway.
|
||||
# Just "make" or "make all" shall build modules as well
|
||||
|
||||
# U-Boot does not need modules
|
||||
#ifneq ($(filter all _all modules,$(MAKECMDGOALS)),)
|
||||
@ -320,15 +315,6 @@ endif
|
||||
|
||||
export quiet Q KBUILD_VERBOSE
|
||||
|
||||
ifneq ($(CC),)
|
||||
ifeq ($(shell $(CC) -v 2>&1 | grep -c "clang version"), 1)
|
||||
COMPILER := clang
|
||||
else
|
||||
COMPILER := gcc
|
||||
endif
|
||||
export COMPILER
|
||||
endif
|
||||
|
||||
# Look for make include files relative to root of kernel src
|
||||
MAKEFLAGS += --include-dir=$(srctree)
|
||||
|
||||
@ -354,7 +340,7 @@ STRIP = $(CROSS_COMPILE)strip
|
||||
OBJCOPY = $(CROSS_COMPILE)objcopy
|
||||
OBJDUMP = $(CROSS_COMPILE)objdump
|
||||
AWK = awk
|
||||
RANLIB = $(CROSS_COMPILE)RANLIB
|
||||
PERL = perl
|
||||
DTC = dtc
|
||||
CHECK = sparse
|
||||
|
||||
@ -376,8 +362,8 @@ export VERSION PATCHLEVEL SUBLEVEL UBOOTRELEASE UBOOTVERSION
|
||||
export ARCH CPU BOARD VENDOR SOC CPUDIR BOARDDIR
|
||||
export CONFIG_SHELL HOSTCC HOSTCFLAGS HOSTLDFLAGS CROSS_COMPILE AS LD CC
|
||||
export CPP AR NM LDR STRIP OBJCOPY OBJDUMP
|
||||
export MAKE AWK
|
||||
export DTC CHECK CHECKFLAGS
|
||||
export MAKE AWK PERL
|
||||
export HOSTCXX HOSTCXXFLAGS DTC CHECK CHECKFLAGS
|
||||
|
||||
export KBUILD_CPPFLAGS NOSTDINC_FLAGS UBOOTINCLUDE OBJCOPYFLAGS LDFLAGS
|
||||
export KBUILD_CFLAGS KBUILD_AFLAGS
|
||||
@ -515,12 +501,6 @@ endif
|
||||
|
||||
# If there is no specified link script, we look in a number of places for it
|
||||
ifndef LDSCRIPT
|
||||
ifeq ($(CONFIG_NAND_U_BOOT),y)
|
||||
LDSCRIPT := $(srctree)/board/$(BOARDDIR)/u-boot-nand.lds
|
||||
ifeq ($(wildcard $(LDSCRIPT)),)
|
||||
LDSCRIPT := $(srctree)/$(CPUDIR)/u-boot-nand.lds
|
||||
endif
|
||||
endif
|
||||
ifeq ($(wildcard $(LDSCRIPT)),)
|
||||
LDSCRIPT := $(srctree)/board/$(BOARDDIR)/u-boot.lds
|
||||
endif
|
||||
@ -545,20 +525,6 @@ endif
|
||||
|
||||
KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector)
|
||||
|
||||
ifeq ($(COMPILER),clang)
|
||||
KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
|
||||
KBUILD_CPPFLAGS += $(call cc-option,-Wno-unknown-warning-option,)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, unused-variable)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, format-invalid-specifier)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, gnu)
|
||||
# Quiet clang warning: comparison of unsigned expression < 0 is always false
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, tautological-compare)
|
||||
# CLANG uses a _MergedGlobals as optimization, but this breaks modpost, as the
|
||||
# source of a reference will be _MergedGlobals and not on of the whitelisted names.
|
||||
# See modpost pattern 2
|
||||
KBUILD_CFLAGS += $(call cc-option, -mno-global-merge,)
|
||||
endif
|
||||
|
||||
KBUILD_CFLAGS += -g
|
||||
# $(KBUILD_AFLAGS) sets -g, which causes gcc to pass a suitable -g<format>
|
||||
# option to the assembler.
|
||||
@ -740,9 +706,8 @@ DO_STATIC_RELA =
|
||||
endif
|
||||
|
||||
# Always append ALL so that arch config.mk's can add custom ones
|
||||
ALL-y += u-boot.srec u-boot.bin System.map
|
||||
ALL-y += u-boot.srec u-boot.bin System.map binary_size_check
|
||||
|
||||
ALL-$(CONFIG_NAND_U_BOOT) += u-boot-nand.bin
|
||||
ALL-$(CONFIG_ONENAND_U_BOOT) += u-boot-onenand.bin
|
||||
ifeq ($(CONFIG_SPL_FSL_PBL),y)
|
||||
ALL-$(CONFIG_RAMBOOT_PBL) += u-boot-with-spl-pbl.bin
|
||||
@ -820,6 +785,19 @@ u-boot.hex u-boot.srec: u-boot FORCE
|
||||
|
||||
OBJCOPYFLAGS_u-boot.bin := -O binary
|
||||
|
||||
binary_size_check: u-boot.bin System.map FORCE
|
||||
@file_size=`stat -c %s u-boot.bin` ; \
|
||||
map_size=$(shell cat System.map | \
|
||||
awk '/_image_copy_start/ {start = $$1} /_image_binary_end/ {end = $$1} END {if (start != "" && end != "") print "ibase=16; " toupper(end) " - " toupper(start)}' \
|
||||
| bc); \
|
||||
if [ "" != "$$map_size" ]; then \
|
||||
if test $$map_size -ne $$file_size; then \
|
||||
echo "System.map shows a binary size of $$map_size" >&2 ; \
|
||||
echo " but u-boot.bin shows $$file_size" >&2 ; \
|
||||
exit 1; \
|
||||
fi \
|
||||
fi
|
||||
|
||||
u-boot.bin: u-boot FORCE
|
||||
$(call if_changed,objcopy)
|
||||
$(call DO_STATIC_RELA,$<,$@,$(CONFIG_SYS_TEXT_BASE))
|
||||
@ -1148,33 +1126,16 @@ cmd_cpp_lds = $(CPP) -Wp,-MD,$(depfile) $(cpp_flags) $(LDPPFLAGS) -ansi \
|
||||
u-boot.lds: $(LDSCRIPT) prepare FORCE
|
||||
$(call if_changed_dep,cpp_lds)
|
||||
|
||||
PHONY += nand_spl
|
||||
nand_spl: prepare
|
||||
$(Q)$(MAKE) $(build)=nand_spl/board/$(BOARDDIR) all
|
||||
@echo >&2
|
||||
@echo >&2 "==================== WARNING ====================="
|
||||
@echo >&2 "nand_spl will not be included in v2014.07 release."
|
||||
@echo >&2 "Please switch over to SPL."
|
||||
@echo >&2 "Otherwise, this board will be removed."
|
||||
@echo >&2 "=================================================="
|
||||
@echo >&2
|
||||
|
||||
nand_spl/u-boot-spl-16k.bin: nand_spl
|
||||
@:
|
||||
|
||||
u-boot-nand.bin: nand_spl/u-boot-spl-16k.bin u-boot.bin FORCE
|
||||
$(call if_changed,cat)
|
||||
|
||||
spl/u-boot-spl.bin: spl/u-boot-spl
|
||||
@:
|
||||
spl/u-boot-spl: tools prepare
|
||||
$(Q)$(MAKE) obj=spl -f $(srctree)/spl/Makefile all
|
||||
$(Q)$(MAKE) obj=spl -f $(srctree)/scripts/Makefile.spl all
|
||||
|
||||
spl/sunxi-spl.bin: spl/u-boot-spl
|
||||
@:
|
||||
|
||||
tpl/u-boot-tpl.bin: tools prepare
|
||||
$(Q)$(MAKE) obj=tpl -f $(srctree)/spl/Makefile all CONFIG_TPL_BUILD=y
|
||||
$(Q)$(MAKE) obj=tpl -f $(srctree)/scripts/Makefile.spl all CONFIG_TPL_BUILD=y
|
||||
|
||||
TAG_SUBDIRS := $(u-boot-dirs) include
|
||||
|
||||
@ -1254,14 +1215,12 @@ CLEAN_FILES += u-boot.lds include/bmp_logo.h include/bmp_logo_data.h \
|
||||
include/tpl-autoconf.mk
|
||||
|
||||
# Directories & files removed with 'make clobber'
|
||||
CLOBBER_DIRS += $(patsubst %,spl/%, $(filter-out Makefile, \
|
||||
$(shell ls -1 spl 2>/dev/null))) \
|
||||
tpl
|
||||
CLOBBER_FILES += u-boot* MLO* SPL System.map nand_spl/u-boot*
|
||||
CLOBBER_DIRS += spl tpl
|
||||
CLOBBER_FILES += u-boot* MLO* SPL System.map
|
||||
|
||||
# Directories & files removed with 'make mrproper'
|
||||
MRPROPER_DIRS += include/config include/generated \
|
||||
.tmp_objdiff
|
||||
.tmp_objdiff
|
||||
MRPROPER_FILES += .config .config.old \
|
||||
tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \
|
||||
include/config.h include/config.mk
|
||||
@ -1290,8 +1249,6 @@ clean: $(clean-dirs)
|
||||
-o -name '*.symtypes' -o -name 'modules.order' \
|
||||
-o -name modules.builtin -o -name '.tmp_*.o.*' \
|
||||
-o -name '*.gcno' \) -type f -print | xargs rm -f
|
||||
@find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
|
||||
-path './nand_spl/*' -type l -print | xargs rm -f
|
||||
|
||||
# clobber
|
||||
#
|
||||
@ -1317,7 +1274,7 @@ $(mrproper-dirs):
|
||||
mrproper: clobber $(mrproper-dirs)
|
||||
$(call cmd,rmdirs)
|
||||
$(call cmd,rmfiles)
|
||||
@rm -f arch/*/include/asm/arch arch/*/include/asm/proc
|
||||
@rm -f arch/*/include/asm/arch
|
||||
|
||||
# distclean
|
||||
#
|
||||
|
178
README
178
README
@ -321,14 +321,6 @@ The following options need to be configured:
|
||||
the LCD display every second with
|
||||
a "rotator" |\-/|\-/
|
||||
|
||||
- Board flavour: (if CONFIG_MPC8260ADS is defined)
|
||||
CONFIG_ADSTYPE
|
||||
Possible values are:
|
||||
CONFIG_SYS_8260ADS - original MPC8260ADS
|
||||
CONFIG_SYS_8266ADS - MPC8266ADS
|
||||
CONFIG_SYS_PQ2FADS - PQ2FADS-ZU or PQ2FADS-VR
|
||||
CONFIG_SYS_8272ADS - MPC8272ADS
|
||||
|
||||
- Marvell Family Member
|
||||
CONFIG_SYS_MVFS - define it if you want to enable
|
||||
multiple fs option at one time
|
||||
@ -1008,6 +1000,7 @@ The following options need to be configured:
|
||||
CONFIG_CMD_IMLS List all images found in NOR flash
|
||||
CONFIG_CMD_IMLS_NAND * List all images found in NAND flash
|
||||
CONFIG_CMD_IMMAP * IMMR dump support
|
||||
CONFIG_CMD_IOTRACE * I/O tracing for debugging
|
||||
CONFIG_CMD_IMPORTENV * import an environment
|
||||
CONFIG_CMD_INI * import data from an ini file into the env
|
||||
CONFIG_CMD_IRQ * irqinfo
|
||||
@ -1179,6 +1172,28 @@ The following options need to be configured:
|
||||
Note that if the GPIO device uses I2C, then the I2C interface
|
||||
must also be configured. See I2C Support, below.
|
||||
|
||||
- I/O tracing:
|
||||
When CONFIG_IO_TRACE is selected, U-Boot intercepts all I/O
|
||||
accesses and can checksum them or write a list of them out
|
||||
to memory. See the 'iotrace' command for details. This is
|
||||
useful for testing device drivers since it can confirm that
|
||||
the driver behaves the same way before and after a code
|
||||
change. Currently this is supported on sandbox and arm. To
|
||||
add support for your architecture, add '#include <iotrace.h>'
|
||||
to the bottom of arch/<arch>/include/asm/io.h and test.
|
||||
|
||||
Example output from the 'iotrace stats' command is below.
|
||||
Note that if the trace buffer is exhausted, the checksum will
|
||||
still continue to operate.
|
||||
|
||||
iotrace is enabled
|
||||
Start: 10000000 (buffer start address)
|
||||
Size: 00010000 (buffer size)
|
||||
Offset: 00000120 (current buffer offset)
|
||||
Output: 10000120 (start + offset)
|
||||
Count: 00000018 (number of trace records)
|
||||
CRC32: 9526fb66 (CRC32 of all trace records)
|
||||
|
||||
- Timestamp Support:
|
||||
|
||||
When CONFIG_TIMESTAMP is selected, the timestamp
|
||||
@ -1432,9 +1447,6 @@ The following options need to be configured:
|
||||
CONFIG_USB_EHCI_TXFIFO_THRESH enables setting of the
|
||||
txfilltuning field in the EHCI controller on reset.
|
||||
|
||||
CONFIG_USB_HUB_MIN_POWER_ON_DELAY defines the minimum
|
||||
interval for usb hub power-on delay.(minimum 100msec)
|
||||
|
||||
- USB Device:
|
||||
Define the below if you wish to use the USB console.
|
||||
Once firmware is rebuilt from a serial console issue the
|
||||
@ -1645,6 +1657,12 @@ CBFS (Coreboot Filesystem) support
|
||||
filesystem. Available commands are cbfsinit, cbfsinfo, cbfsls
|
||||
and cbfsload.
|
||||
|
||||
- FAT(File Allocation Table) filesystem cluster size:
|
||||
CONFIG_FS_FAT_MAX_CLUSTSIZE
|
||||
|
||||
Define the max cluster size for fat operations else
|
||||
a default value of 65536 will be defined.
|
||||
|
||||
- Keyboard Support:
|
||||
CONFIG_ISA_KEYBOARD
|
||||
|
||||
@ -2270,6 +2288,21 @@ CBFS (Coreboot Filesystem) support
|
||||
9 i2c buses for Exynos4 and 1 for S3C24X0 SoCs from Samsung)
|
||||
with a fix speed from 100000 and the slave addr 0!
|
||||
|
||||
- drivers/i2c/ihs_i2c.c
|
||||
- activate this driver with CONFIG_SYS_I2C_IHS
|
||||
- CONFIG_SYS_I2C_IHS_CH0 activate hardware channel 0
|
||||
- CONFIG_SYS_I2C_IHS_SPEED_0 speed channel 0
|
||||
- CONFIG_SYS_I2C_IHS_SLAVE_0 slave addr channel 0
|
||||
- CONFIG_SYS_I2C_IHS_CH1 activate hardware channel 1
|
||||
- CONFIG_SYS_I2C_IHS_SPEED_1 speed channel 1
|
||||
- CONFIG_SYS_I2C_IHS_SLAVE_1 slave addr channel 1
|
||||
- CONFIG_SYS_I2C_IHS_CH2 activate hardware channel 2
|
||||
- CONFIG_SYS_I2C_IHS_SPEED_2 speed channel 2
|
||||
- CONFIG_SYS_I2C_IHS_SLAVE_2 slave addr channel 2
|
||||
- CONFIG_SYS_I2C_IHS_CH3 activate hardware channel 3
|
||||
- CONFIG_SYS_I2C_IHS_SPEED_3 speed channel 3
|
||||
- CONFIG_SYS_I2C_IHS_SLAVE_3 slave addr channel 3
|
||||
|
||||
additional defines:
|
||||
|
||||
CONFIG_SYS_NUM_I2C_BUSES
|
||||
@ -3202,6 +3235,19 @@ FIT uImage format:
|
||||
-150 common/cmd_nand.c Incorrect FIT image format
|
||||
151 common/cmd_nand.c FIT image format OK
|
||||
|
||||
- legacy image format:
|
||||
CONFIG_IMAGE_FORMAT_LEGACY
|
||||
enables the legacy image format support in U-Boot.
|
||||
|
||||
Default:
|
||||
enabled if CONFIG_FIT_SIGNATURE is not defined.
|
||||
|
||||
CONFIG_DISABLE_IMAGE_LEGACY
|
||||
disable the legacy image format
|
||||
|
||||
This define is introduced, as the legacy image format is
|
||||
enabled per default for backward compatibility.
|
||||
|
||||
- FIT image support:
|
||||
CONFIG_FIT
|
||||
Enable support for the FIT uImage format.
|
||||
@ -3218,6 +3264,16 @@ FIT uImage format:
|
||||
using a hash signed and verified using RSA. See
|
||||
doc/uImage.FIT/signature.txt for more details.
|
||||
|
||||
WARNING: When relying on signed FIT images with required
|
||||
signature check the legacy image format is default
|
||||
disabled. If a board need legacy image format support
|
||||
enable this through CONFIG_IMAGE_FORMAT_LEGACY
|
||||
|
||||
CONFIG_FIT_DISABLE_SHA256
|
||||
Supporting SHA256 hashes has quite an impact on binary size.
|
||||
For constrained systems sha256 hash support can be disabled
|
||||
with this option.
|
||||
|
||||
- Standalone program support:
|
||||
CONFIG_STANDALONE_LOAD_ADDR
|
||||
|
||||
@ -4033,6 +4089,43 @@ to save the current settings.
|
||||
environment area within the total memory of your DataFlash placed
|
||||
at the specified address.
|
||||
|
||||
- CONFIG_ENV_IS_IN_SPI_FLASH:
|
||||
|
||||
Define this if you have a SPI Flash memory device which you
|
||||
want to use for the environment.
|
||||
|
||||
- CONFIG_ENV_OFFSET:
|
||||
- CONFIG_ENV_SIZE:
|
||||
|
||||
These two #defines specify the offset and size of the
|
||||
environment area within the SPI Flash. CONFIG_ENV_OFFSET must be
|
||||
aligned to an erase sector boundary.
|
||||
|
||||
- CONFIG_ENV_SECT_SIZE:
|
||||
|
||||
Define the SPI flash's sector size.
|
||||
|
||||
- CONFIG_ENV_OFFSET_REDUND (optional):
|
||||
|
||||
This setting describes a second storage area of CONFIG_ENV_SIZE
|
||||
size used to hold a redundant copy of the environment data, so
|
||||
that there is a valid backup copy in case there is a power failure
|
||||
during a "saveenv" operation. CONFIG_ENV_OFFSET_RENDUND must be
|
||||
aligned to an erase sector boundary.
|
||||
|
||||
- CONFIG_ENV_SPI_BUS (optional):
|
||||
- CONFIG_ENV_SPI_CS (optional):
|
||||
|
||||
Define the SPI bus and chip select. If not defined they will be 0.
|
||||
|
||||
- CONFIG_ENV_SPI_MAX_HZ (optional):
|
||||
|
||||
Define the SPI max work clock. If not defined then use 1MHz.
|
||||
|
||||
- CONFIG_ENV_SPI_MODE (optional):
|
||||
|
||||
Define the SPI work mode. If not defined then use SPI_MODE_3.
|
||||
|
||||
- CONFIG_ENV_IS_IN_REMOTE:
|
||||
|
||||
Define this if you have a remote memory space which you
|
||||
@ -4120,6 +4213,37 @@ but it can not erase, write this NOR flash by SRIO or PCIE interface.
|
||||
You will probably want to define these to avoid a really noisy system
|
||||
when storing the env in UBI.
|
||||
|
||||
- CONFIG_ENV_IS_IN_FAT:
|
||||
Define this if you want to use the FAT file system for the environment.
|
||||
|
||||
- FAT_ENV_INTERFACE:
|
||||
|
||||
Define this to a string that is the name of the block device.
|
||||
|
||||
- FAT_ENV_DEV_AND_PART:
|
||||
|
||||
Define this to a string to specify the partition of the device. It can
|
||||
be as following:
|
||||
|
||||
"D:P", "D:0", "D", "D:" or "D:auto" (D, P are integers. And P >= 1)
|
||||
- "D:P": device D partition P. Error occurs if device D has no
|
||||
partition table.
|
||||
- "D:0": device D.
|
||||
- "D" or "D:": device D partition 1 if device D has partition
|
||||
table, or the whole device D if has no partition
|
||||
table.
|
||||
- "D:auto": first partition in device D with bootable flag set.
|
||||
If none, first valid paratition in device D. If no
|
||||
partition table then means device D.
|
||||
|
||||
- FAT_ENV_FILE:
|
||||
|
||||
It's a string of the FAT file name. This file use to store the
|
||||
envrionment.
|
||||
|
||||
- CONFIG_FAT_WRITE:
|
||||
This should be defined. Otherwise it cannot save the envrionment file.
|
||||
|
||||
- CONFIG_ENV_IS_IN_MMC:
|
||||
|
||||
Define this if you have an MMC device which you want to use for the
|
||||
@ -4640,6 +4764,33 @@ within that device.
|
||||
window->master inbound window->master LAW->the ucode address in
|
||||
master's memory space.
|
||||
|
||||
Freescale Layerscape Management Complex Firmware Support:
|
||||
---------------------------------------------------------
|
||||
The Freescale Layerscape Management Complex (MC) supports the loading of
|
||||
"firmware".
|
||||
This firmware often needs to be loaded during U-Boot booting, so macros
|
||||
are used to identify the storage device (NOR flash, SPI, etc) and the address
|
||||
within that device.
|
||||
|
||||
- CONFIG_FSL_MC_ENET
|
||||
Enable the MC driver for Layerscape SoCs.
|
||||
|
||||
- CONFIG_SYS_LS_MC_FW_ADDR
|
||||
The address in the storage device where the firmware is located. The
|
||||
meaning of this address depends on which CONFIG_SYS_LS_MC_FW_IN_xxx macro
|
||||
is also specified.
|
||||
|
||||
- CONFIG_SYS_LS_MC_FW_LENGTH
|
||||
The maximum possible size of the firmware. The firmware binary format
|
||||
has a field that specifies the actual size of the firmware, but it
|
||||
might not be possible to read any part of the firmware unless some
|
||||
local storage is allocated to hold the entire firmware first.
|
||||
|
||||
- CONFIG_SYS_LS_MC_FW_IN_NOR
|
||||
Specifies that MC firmware is located in NOR flash, mapped as
|
||||
normal addressable memory via the LBC. CONFIG_SYS_LS_MC_FW_ADDR is the
|
||||
virtual address in NOR flash.
|
||||
|
||||
Building the Software:
|
||||
======================
|
||||
|
||||
@ -5295,6 +5446,11 @@ Information structure as we define in include/asm-<arch>/u-boot.h,
|
||||
and make sure that your definition of IMAP_ADDR uses the same value
|
||||
as your U-Boot configuration in CONFIG_SYS_IMMR.
|
||||
|
||||
Note that U-Boot now has a driver model, a unified model for drivers.
|
||||
If you are adding a new driver, plumb it into driver model. If there
|
||||
is no uclass available, you are encouraged to create one. See
|
||||
doc/driver-model.
|
||||
|
||||
|
||||
Configuring the Linux kernel:
|
||||
-----------------------------
|
||||
|
1
arch/.gitignore
vendored
1
arch/.gitignore
vendored
@ -1,2 +1 @@
|
||||
/*/include/asm/arch
|
||||
/*/include/asm/proc
|
||||
|
@ -8,6 +8,7 @@
|
||||
#define __ASM_ARC_CONFIG_H_
|
||||
|
||||
#define CONFIG_SYS_GENERIC_GLOBAL_DATA
|
||||
#define CONFIG_SYS_BOOT_RAMDISK_HIGH
|
||||
|
||||
#define CONFIG_LMB
|
||||
|
||||
|
@ -116,6 +116,10 @@ else
|
||||
OBJCOPYFLAGS += -j .text -j .rodata -j .hash -j .data -j .got.plt -j .u_boot_list -j .rel.dyn
|
||||
endif
|
||||
|
||||
ifdef CONFIG_OF_EMBED
|
||||
OBJCOPYFLAGS += -j .dtb.init.rodata
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_IMX_CONFIG),)
|
||||
ifdef CONFIG_SPL
|
||||
ifndef CONFIG_SPL_BUILD
|
||||
|
@ -2,48 +2,457 @@
|
||||
* Low-level initialization for EP93xx
|
||||
*
|
||||
* Copyright (C) 2009 Matthias Kaehlcke <matthias@kaehlcke.net>
|
||||
* Copyright (C) 2013
|
||||
* Sergey Kostanabev <sergey.kostanbaev <at> fairwaves.ru>
|
||||
*
|
||||
* Copyright (C) 2006 Dominic Rath <Dominic.Rath@gmx.de>
|
||||
* Copyright (C) 2006 Cirrus Logic Inc.
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <version.h>
|
||||
#include <asm/arch/ep93xx.h>
|
||||
#include <config.h>
|
||||
#include <asm/arch-ep93xx/ep93xx.h>
|
||||
|
||||
/*
|
||||
/* Configure the SDRAM based on the supplied settings.
|
||||
*
|
||||
* Input: r0 - SDRAM DEVCFG register
|
||||
* r2 - configuration for SDRAM chips
|
||||
* Output: none
|
||||
* Modifies: r3, r4
|
||||
*/
|
||||
ep93xx_sdram_config:
|
||||
/* Program the SDRAM device configuration register. */
|
||||
ldr r3, =SDRAM_BASE
|
||||
#ifdef CONFIG_EDB93XX_SDCS0
|
||||
str r0, [r3, #SDRAM_OFF_DEVCFG0]
|
||||
#endif
|
||||
#ifdef CONFIG_EDB93XX_SDCS1
|
||||
str r0, [r3, #SDRAM_OFF_DEVCFG1]
|
||||
#endif
|
||||
#ifdef CONFIG_EDB93XX_SDCS2
|
||||
str r0, [r3, #SDRAM_OFF_DEVCFG2]
|
||||
#endif
|
||||
#ifdef CONFIG_EDB93XX_SDCS3
|
||||
str r0, [r3, #SDRAM_OFF_DEVCFG3]
|
||||
#endif
|
||||
|
||||
/* Set the Initialize and MRS bits (issue continuous NOP commands
|
||||
* (INIT & MRS set))
|
||||
*/
|
||||
ldr r4, =(EP93XX_SDRAMCTRL_GLOBALCFG_INIT | \
|
||||
EP93XX_SDRAMCTRL_GLOBALCFG_MRS | \
|
||||
EP93XX_SDRAMCTRL_GLOBALCFG_CKE)
|
||||
str r4, [r3, #SDRAM_OFF_GLCONFIG]
|
||||
|
||||
/* Delay for 200us. */
|
||||
mov r4, #0x3000
|
||||
delay1:
|
||||
subs r4, r4, #1
|
||||
bne delay1
|
||||
|
||||
/* Clear the MRS bit to issue a precharge all. */
|
||||
ldr r4, =(EP93XX_SDRAMCTRL_GLOBALCFG_INIT | \
|
||||
EP93XX_SDRAMCTRL_GLOBALCFG_CKE)
|
||||
str r4, [r3, #SDRAM_OFF_GLCONFIG]
|
||||
|
||||
/* Temporarily set the refresh timer to 0x10. Make it really low so
|
||||
* that refresh cycles are generated.
|
||||
*/
|
||||
ldr r4, =0x10
|
||||
str r4, [r3, #SDRAM_OFF_REFRSHTIMR]
|
||||
|
||||
/* Delay for at least 80 SDRAM clock cycles. */
|
||||
mov r4, #80
|
||||
delay2:
|
||||
subs r4, r4, #1
|
||||
bne delay2
|
||||
|
||||
/* Set the refresh timer to the fastest required for any device
|
||||
* that might be used. Set 9.6 ms refresh time.
|
||||
*/
|
||||
ldr r4, =0x01e0
|
||||
str r4, [r3, #SDRAM_OFF_REFRSHTIMR]
|
||||
|
||||
/* Select mode register update mode. */
|
||||
ldr r4, =(EP93XX_SDRAMCTRL_GLOBALCFG_CKE | \
|
||||
EP93XX_SDRAMCTRL_GLOBALCFG_MRS)
|
||||
str r4, [r3, #SDRAM_OFF_GLCONFIG]
|
||||
|
||||
/* Program the mode register on the SDRAM by performing fake read */
|
||||
ldr r4, [r2]
|
||||
|
||||
/* Select normal operating mode. */
|
||||
ldr r4, =EP93XX_SDRAMCTRL_GLOBALCFG_CKE
|
||||
str r4, [r3, #SDRAM_OFF_GLCONFIG]
|
||||
|
||||
/* Return to the caller. */
|
||||
mov pc, lr
|
||||
|
||||
/*
|
||||
* Test to see if the SDRAM has been configured in a usable mode.
|
||||
*
|
||||
* Input: r0 - Test address of SDRAM
|
||||
* Output: r0 - 0 -- Test OK, -1 -- Failed
|
||||
* Modifies: r0-r5
|
||||
*/
|
||||
ep93xx_sdram_test:
|
||||
/* Load the test patterns to be written to SDRAM. */
|
||||
ldr r1, =0xf00dface
|
||||
ldr r2, =0xdeadbeef
|
||||
ldr r3, =0x08675309
|
||||
ldr r4, =0xdeafc0ed
|
||||
|
||||
/* Store the test patterns to SDRAM. */
|
||||
stmia r0, {r1-r4}
|
||||
|
||||
/* Load the test patterns from SDRAM one at a time and compare them
|
||||
* to the actual pattern.
|
||||
*/
|
||||
ldr r5, [r0]
|
||||
cmp r5, r1
|
||||
ldreq r5, [r0, #0x0004]
|
||||
cmpeq r5, r2
|
||||
ldreq r5, [r0, #0x0008]
|
||||
cmpeq r5, r3
|
||||
ldreq r5, [r0, #0x000c]
|
||||
cmpeq r5, r4
|
||||
|
||||
/* Return -1 if a mismatch was encountered, 0 otherwise. */
|
||||
mvnne r0, #0xffffffff
|
||||
moveq r0, #0x00000000
|
||||
|
||||
/* Return to the caller. */
|
||||
mov pc, lr
|
||||
|
||||
/*
|
||||
* Determine the size of the SDRAM. Use data=address for the scan.
|
||||
*
|
||||
* Input: r0 - Start SDRAM address
|
||||
* Return: r0 - Single block size
|
||||
* r1 - Valid block mask
|
||||
* r2 - Total block count
|
||||
* Modifies: r0-r5
|
||||
*/
|
||||
ep93xx_sdram_size:
|
||||
/* Store zero at offset zero. */
|
||||
str r0, [r0]
|
||||
|
||||
/* Start checking for an alias at 1MB into SDRAM. */
|
||||
ldr r1, =0x00100000
|
||||
|
||||
/* Store the offset at the current offset. */
|
||||
check_block_size:
|
||||
str r1, [r0, r1]
|
||||
|
||||
/* Read back from zero. */
|
||||
ldr r2, [r0]
|
||||
|
||||
/* Stop searching of an alias was found. */
|
||||
cmp r1, r2
|
||||
beq found_block_size
|
||||
|
||||
/* Advance to the next power of two boundary. */
|
||||
mov r1, r1, lsl #1
|
||||
|
||||
/* Loop back if the size has not reached 256MB. */
|
||||
cmp r1, #0x10000000
|
||||
bne check_block_size
|
||||
|
||||
/* A full 256MB of memory was found, so return it now. */
|
||||
ldr r0, =0x10000000
|
||||
ldr r1, =0x00000000
|
||||
ldr r2, =0x00000001
|
||||
mov pc, lr
|
||||
|
||||
/* An alias was found. See if the first block is 128MB in size. */
|
||||
found_block_size:
|
||||
cmp r1, #0x08000000
|
||||
|
||||
/* The first block is 128MB, so there is no further memory. Return it
|
||||
* now.
|
||||
*/
|
||||
ldreq r0, =0x08000000
|
||||
ldreq r1, =0x00000000
|
||||
ldreq r2, =0x00000001
|
||||
moveq pc, lr
|
||||
|
||||
/* Save the block size, set the block address bits to zero, and
|
||||
* initialize the block count to one.
|
||||
*/
|
||||
mov r3, r1
|
||||
ldr r4, =0x00000000
|
||||
ldr r5, =0x00000001
|
||||
|
||||
/* Look for additional blocks of memory by searching for non-aliases. */
|
||||
find_blocks:
|
||||
/* Store zero back to address zero. It may be overwritten. */
|
||||
str r0, [r0]
|
||||
|
||||
/* Advance to the next power of two boundary. */
|
||||
mov r1, r1, lsl #1
|
||||
|
||||
/* Store the offset at the current offset. */
|
||||
str r1, [r0, r1]
|
||||
|
||||
/* Read back from zero. */
|
||||
ldr r2, [r0]
|
||||
|
||||
/* See if a non-alias was found. */
|
||||
cmp r1, r2
|
||||
|
||||
/* If a non-alias was found, then or in the block address bit and
|
||||
* multiply the block count by two (since there are two unique
|
||||
* blocks, one with this bit zero and one with it one).
|
||||
*/
|
||||
orrne r4, r4, r1
|
||||
movne r5, r5, lsl #1
|
||||
|
||||
/* Continue searching if there are more address bits to check. */
|
||||
cmp r1, #0x08000000
|
||||
bne find_blocks
|
||||
|
||||
/* Return the block size, address mask, and count. */
|
||||
mov r0, r3
|
||||
mov r1, r4
|
||||
mov r2, r5
|
||||
|
||||
/* Return to the caller. */
|
||||
mov pc, lr
|
||||
|
||||
|
||||
.globl lowlevel_init
|
||||
lowlevel_init:
|
||||
/* backup return address */
|
||||
ldr r1, =SYSCON_SCRATCH0
|
||||
str lr, [r1]
|
||||
|
||||
/* Turn on both LEDs */
|
||||
bl red_led_on
|
||||
bl green_led_on
|
||||
mov r6, lr
|
||||
|
||||
/* Configure flash wait states before we switch to the PLL */
|
||||
bl flash_cfg
|
||||
/* Make sure caches are off and invalidated. */
|
||||
ldr r0, =0x00000000
|
||||
mcr p15, 0, r0, c1, c0, 0
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
||||
/* Set up PLL */
|
||||
bl pll_cfg
|
||||
/* Turn off the green LED and turn on the red LED. If the red LED
|
||||
* is left on for too long, the external reset circuit described
|
||||
* by application note AN258 will cause the system to reset.
|
||||
*/
|
||||
ldr r1, =EP93XX_LED_DATA
|
||||
ldr r0, [r1]
|
||||
bic r0, r0, #EP93XX_LED_GREEN_ON
|
||||
orr r0, r0, #EP93XX_LED_RED_ON
|
||||
str r0, [r1]
|
||||
|
||||
/* Turn off the Green LED and leave the Red LED on */
|
||||
bl green_led_off
|
||||
/* Undo the silly static memory controller programming performed
|
||||
* by the boot rom.
|
||||
*/
|
||||
ldr r0, =SMC_BASE
|
||||
|
||||
/* Setup SDRAM */
|
||||
bl sdram_cfg
|
||||
/* Set WST1 and WST2 to 31 HCLK cycles (slowest access) */
|
||||
ldr r1, =0x0000fbe0
|
||||
|
||||
/* Turn on Green LED, Turn off the Red LED */
|
||||
bl green_led_on
|
||||
bl red_led_off
|
||||
/* Reset EP93XX_OFF_SMCBCR0 */
|
||||
ldr r2, [r0]
|
||||
orr r2, r2, r1
|
||||
str r2, [r0]
|
||||
|
||||
/* FIXME: we use async mode for now */
|
||||
mrc p15, 0, r0, c1, c0, 0
|
||||
orr r0, r0, #0xc0000000
|
||||
mcr p15, 0, r0, c1, c0, 0
|
||||
ldr r2, [r0, #EP93XX_OFF_SMCBCR1]
|
||||
orr r2, r2, r1
|
||||
str r2, [r0, #EP93XX_OFF_SMCBCR1]
|
||||
|
||||
/* restore return address */
|
||||
ldr r1, =SYSCON_SCRATCH0
|
||||
ldr lr, [r1]
|
||||
ldr r2, [r0, #EP93XX_OFF_SMCBCR2]
|
||||
orr r2, r2, r1
|
||||
str r2, [r0, #EP93XX_OFF_SMCBCR2]
|
||||
|
||||
mov pc, lr
|
||||
ldr r2, [r0, #EP93XX_OFF_SMCBCR3]
|
||||
orr r2, r2, r1
|
||||
str r2, [r0, #EP93XX_OFF_SMCBCR3]
|
||||
|
||||
ldr r2, [r0, #EP93XX_OFF_SMCBCR6]
|
||||
orr r2, r2, r1
|
||||
str r2, [r0, #EP93XX_OFF_SMCBCR6]
|
||||
|
||||
ldr r2, [r0, #EP93XX_OFF_SMCBCR7]
|
||||
orr r2, r2, r1
|
||||
str r2, [r0, #EP93XX_OFF_SMCBCR7]
|
||||
|
||||
/* Set the PLL1 and processor clock. */
|
||||
ldr r0, =SYSCON_BASE
|
||||
#ifdef CONFIG_EDB9301
|
||||
/* 332MHz, giving a 166MHz processor clock. */
|
||||
ldr r1, = 0x02b49907
|
||||
#else
|
||||
|
||||
#ifdef CONFIG_EDB93XX_INDUSTRIAL
|
||||
/* 384MHz, giving a 196MHz processor clock. */
|
||||
ldr r1, =0x02a4bb38
|
||||
#else
|
||||
/* 400MHz, giving a 200MHz processor clock. */
|
||||
ldr r1, =0x02a4e39e
|
||||
#endif
|
||||
#endif
|
||||
str r1, [r0, #SYSCON_OFF_CLKSET1]
|
||||
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
||||
/* Need to make sure that SDRAM is configured correctly before
|
||||
* coping the code into it.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_EDB93XX_SDCS0
|
||||
mov r11, #SDRAM_DEVCFG0_BASE
|
||||
#endif
|
||||
#ifdef CONFIG_EDB93XX_SDCS1
|
||||
mov r11, #SDRAM_DEVCFG1_BASE
|
||||
#endif
|
||||
#ifdef CONFIG_EDB93XX_SDCS2
|
||||
mov r11, #SDRAM_DEVCFG2_BASE
|
||||
#endif
|
||||
#ifdef CONFIG_EDB93XX_SDCS3
|
||||
ldr r0, =SYSCON_BASE
|
||||
ldr r0, [r0, #SYSCON_OFF_SYSCFG]
|
||||
ands r0, r0, #SYSCON_SYSCFG_LASDO
|
||||
moveq r11, #SDRAM_DEVCFG3_ASD0_BASE
|
||||
movne r11, #SDRAM_DEVCFG3_ASD1_BASE
|
||||
#endif
|
||||
/* See Table 13-5 in EP93xx datasheet for more info about DRAM
|
||||
* register mapping */
|
||||
|
||||
/* Try a 32-bit wide configuration of SDRAM. */
|
||||
ldr r0, =(EP93XX_SDRAMCTRL_DEVCFG_BANKCOUNT | \
|
||||
EP93XX_SDRAMCTRL_DEVCFG_SROMLL | \
|
||||
EP93XX_SDRAMCTRL_DEVCFG_CASLAT_2 | \
|
||||
EP93XX_SDRAMCTRL_DEVCFG_RASTOCAS_2)
|
||||
|
||||
/* Set burst count: 4 and CAS: 2
|
||||
* Burst mode [A11:A10]; CAS [A16:A14]
|
||||
*/
|
||||
orr r2, r11, #0x00008800
|
||||
bl ep93xx_sdram_config
|
||||
|
||||
/* Test the SDRAM. */
|
||||
mov r0, r11
|
||||
bl ep93xx_sdram_test
|
||||
cmp r0, #0x00000000
|
||||
beq ep93xx_sdram_done
|
||||
|
||||
/* Try a 16-bit wide configuration of SDRAM. */
|
||||
ldr r0, =(EP93XX_SDRAMCTRL_DEVCFG_BANKCOUNT | \
|
||||
EP93XX_SDRAMCTRL_DEVCFG_SROMLL | \
|
||||
EP93XX_SDRAMCTRL_DEVCFG_CASLAT_2 | \
|
||||
EP93XX_SDRAMCTRL_DEVCFG_RASTOCAS_2 | \
|
||||
EP93XX_SDRAMCTRL_DEVCFG_EXTBUSWIDTH)
|
||||
|
||||
/* Set burst count: 8, CAS: 2, sequential burst
|
||||
* Accoring to Table 13-3 for 16bit operations mapping must be shifted.
|
||||
* Burst mode [A10:A9]; CAS [A15:A13]
|
||||
*/
|
||||
orr r2, r11, #0x00004600
|
||||
bl ep93xx_sdram_config
|
||||
|
||||
/* Test the SDRAM. */
|
||||
mov r0, r11
|
||||
bl ep93xx_sdram_test
|
||||
cmp r0, #0x00000000
|
||||
beq ep93xx_sdram_done
|
||||
|
||||
/* Turn off the red LED. */
|
||||
ldr r0, =EP93XX_LED_DATA
|
||||
ldr r1, [r0]
|
||||
bic r1, r1, #EP93XX_LED_RED_ON
|
||||
str r1, [r0]
|
||||
|
||||
/* There is no SDRAM so flash the green LED. */
|
||||
flash_green:
|
||||
orr r1, r1, #EP93XX_LED_GREEN_ON
|
||||
str r1, [r0]
|
||||
ldr r2, =0x00010000
|
||||
flash_green_delay_1:
|
||||
subs r2, r2, #1
|
||||
bne flash_green_delay_1
|
||||
bic r1, r1, #EP93XX_LED_GREEN_ON
|
||||
str r1, [r0]
|
||||
ldr r2, =0x00010000
|
||||
flash_green_delay_2:
|
||||
subs r2, r2, #1
|
||||
bne flash_green_delay_2
|
||||
orr r1, r1, #EP93XX_LED_GREEN_ON
|
||||
str r1, [r0]
|
||||
ldr r2, =0x00010000
|
||||
flash_green_delay_3:
|
||||
subs r2, r2, #1
|
||||
bne flash_green_delay_3
|
||||
bic r1, r1, #EP93XX_LED_GREEN_ON
|
||||
str r1, [r0]
|
||||
ldr r2, =0x00050000
|
||||
flash_green_delay_4:
|
||||
subs r2, r2, #1
|
||||
bne flash_green_delay_4
|
||||
b flash_green
|
||||
|
||||
|
||||
ep93xx_sdram_done:
|
||||
ldr r1, =EP93XX_LED_DATA
|
||||
ldr r0, [r1]
|
||||
bic r0, r0, #EP93XX_LED_RED_ON
|
||||
str r0, [r1]
|
||||
|
||||
/* Determine the size of the SDRAM. */
|
||||
mov r0, r11
|
||||
bl ep93xx_sdram_size
|
||||
|
||||
/* Save the SDRAM characteristics. */
|
||||
mov r8, r0
|
||||
mov r9, r1
|
||||
mov r10, r2
|
||||
|
||||
/* Compute total memory size into r1 */
|
||||
mul r1, r8, r10
|
||||
#ifdef CONFIG_EDB93XX_SDCS0
|
||||
ldr r2, [r0, #SDRAM_OFF_DEVCFG0]
|
||||
#endif
|
||||
#ifdef CONFIG_EDB93XX_SDCS1
|
||||
ldr r2, [r0, #SDRAM_OFF_DEVCFG1]
|
||||
#endif
|
||||
#ifdef CONFIG_EDB93XX_SDCS2
|
||||
ldr r2, [r0, #SDRAM_OFF_DEVCFG2]
|
||||
#endif
|
||||
#ifdef CONFIG_EDB93XX_SDCS3
|
||||
ldr r2, [r0, #SDRAM_OFF_DEVCFG3]
|
||||
#endif
|
||||
|
||||
/* Consider small DRAM size as:
|
||||
* < 32Mb for 32bit bus
|
||||
* < 64Mb for 16bit bus
|
||||
*/
|
||||
tst r2, #EP93XX_SDRAMCTRL_DEVCFG_EXTBUSWIDTH
|
||||
moveq r1, r1, lsr #1
|
||||
cmp r1, #0x02000000
|
||||
|
||||
#if defined(CONFIG_EDB9301)
|
||||
/* Set refresh counter to 20ms for small DRAM size, otherwise 9.6ms */
|
||||
movlt r1, #0x03f0
|
||||
movge r1, #0x01e0
|
||||
#else
|
||||
/* Set refresh counter to 30.7ms for small DRAM size, otherwise 15ms */
|
||||
movlt r1, #0x0600
|
||||
movge r1, #0x2f0
|
||||
#endif
|
||||
str r1, [r0, #SDRAM_OFF_REFRSHTIMR]
|
||||
|
||||
/* Save the memory configuration information. */
|
||||
orr r0, r11, #UBOOT_MEMORYCNF_BANK_SIZE
|
||||
stmia r0, {r8-r11}
|
||||
|
||||
mov lr, r6
|
||||
mov pc, lr
|
||||
|
@ -165,3 +165,20 @@ void at91_macb_hw_init(void)
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_GENERIC_ATMEL_MCI
|
||||
void at91_mci_hw_init(void)
|
||||
{
|
||||
struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
|
||||
|
||||
at91_set_a_periph(AT91_PIO_PORTA, 0, 0); /* MCI0 CLK */
|
||||
at91_set_a_periph(AT91_PIO_PORTA, 1, 0); /* MCI0 CDA */
|
||||
at91_set_a_periph(AT91_PIO_PORTA, 2, 0); /* MCI0 DA0 */
|
||||
at91_set_a_periph(AT91_PIO_PORTA, 3, 0); /* MCI0 DA1 */
|
||||
at91_set_a_periph(AT91_PIO_PORTA, 4, 0); /* MCI0 DA2 */
|
||||
at91_set_a_periph(AT91_PIO_PORTA, 5, 0); /* MCI0 DA3 */
|
||||
|
||||
/* Enable clock */
|
||||
writel(1 << ATMEL_ID_MCI0, &pmc->pcer);
|
||||
}
|
||||
#endif
|
||||
|
@ -14,7 +14,7 @@
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/davinci_misc.h>
|
||||
#include <asm/arch/ddr2_defs.h>
|
||||
#include <asm/arch/emif_defs.h>
|
||||
#include <asm/ti-common/davinci_nand.h>
|
||||
#include <asm/arch/pll_defs.h>
|
||||
|
||||
void davinci_enable_uart0(void)
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <nand.h>
|
||||
#include <ns16550.h>
|
||||
#include <post.h>
|
||||
#include <asm/ti-common/davinci_nand.h>
|
||||
#include <asm/arch/dm365_lowlevel.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/cpu.h>
|
||||
#include <asm/arch/kirkwood.h>
|
||||
#include <hush.h>
|
||||
|
||||
#define BUFLEN 16
|
||||
|
||||
@ -211,7 +210,7 @@ static void kw_sysrst_action(void)
|
||||
|
||||
debug("Starting %s process...\n", __FUNCTION__);
|
||||
ret = run_command(s, 0);
|
||||
if (ret < 0)
|
||||
if (ret != 0)
|
||||
debug("Error.. %s failed\n", __FUNCTION__);
|
||||
else
|
||||
debug("%s process finished\n", __FUNCTION__);
|
||||
|
@ -15,7 +15,6 @@
|
||||
#include <asm/io.h>
|
||||
#include <u-boot/md5.h>
|
||||
#include <asm/arch/cpu.h>
|
||||
#include <hush.h>
|
||||
|
||||
#define BUFLEN 16
|
||||
|
||||
|
@ -143,6 +143,19 @@ int arch_misc_init(void)
|
||||
}
|
||||
|
||||
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
|
||||
/*
|
||||
* In the case of non-SPL based booting we'll want to call these
|
||||
* functions a tiny bit later as it will require gd to be set and cleared
|
||||
* and that's not true in s_init in this case so we cannot do it there.
|
||||
*/
|
||||
int board_early_init_f(void)
|
||||
{
|
||||
prcm_init();
|
||||
set_mux_conf_regs();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function is the place to do per-board things such as ramp up the
|
||||
* MPU clock frequency.
|
||||
@ -224,7 +237,7 @@ void s_init(void)
|
||||
set_uart_mux_conf();
|
||||
setup_clocks_for_console();
|
||||
uart_soft_reset();
|
||||
#ifdef CONFIG_NOR_BOOT
|
||||
#if defined(CONFIG_NOR_BOOT) || defined(CONFIG_QSPI_BOOT)
|
||||
gd->baudrate = CONFIG_BAUDRATE;
|
||||
serial_init();
|
||||
gd->have_console = 1;
|
||||
@ -232,20 +245,13 @@ void s_init(void)
|
||||
gd = &gdata;
|
||||
preloader_console_init();
|
||||
#endif
|
||||
prcm_init();
|
||||
set_mux_conf_regs();
|
||||
#if defined(CONFIG_SPL_AM33XX_ENABLE_RTC32K_OSC)
|
||||
/* Enable RTC32K clock */
|
||||
rtc32k_enable();
|
||||
#endif
|
||||
#ifdef CONFIG_SPL_BUILD
|
||||
board_early_init_f();
|
||||
sdram_init();
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_SYS_DCACHE_OFF
|
||||
void enable_caches(void)
|
||||
{
|
||||
/* Enable D-cache. I-cache is already enabled in start.S */
|
||||
dcache_enable();
|
||||
}
|
||||
#endif /* !CONFIG_SYS_DCACHE_OFF */
|
||||
|
@ -170,8 +170,19 @@ void do_enable_clocks(u32 *const *clk_domains,
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
* Before scaling up the clocks we need to have the PMIC scale up the
|
||||
* voltages first. This will be dependent on which PMIC is in use
|
||||
* and in some cases we may not be scaling things up at all and thus not
|
||||
* need to do anything here.
|
||||
*/
|
||||
__weak void scale_vcores(void)
|
||||
{
|
||||
}
|
||||
|
||||
void prcm_init()
|
||||
{
|
||||
enable_basic_clocks();
|
||||
scale_vcores();
|
||||
setup_dplls();
|
||||
}
|
||||
|
@ -53,6 +53,8 @@ const struct dpll_regs dpll_ddr_regs = {
|
||||
|
||||
void setup_clocks_for_console(void)
|
||||
{
|
||||
u32 clkctrl, idlest = MODULE_CLKCTRL_IDLEST_DISABLED;
|
||||
|
||||
/* Do not add any spl_debug prints in this function */
|
||||
clrsetbits_le32(&cmwkup->wkclkstctrl, CD_CLKCTRL_CLKTRCTRL_MASK,
|
||||
CD_CLKCTRL_CLKTRCTRL_SW_WKUP <<
|
||||
@ -63,6 +65,13 @@ void setup_clocks_for_console(void)
|
||||
MODULE_CLKCTRL_MODULEMODE_MASK,
|
||||
MODULE_CLKCTRL_MODULEMODE_SW_EXPLICIT_EN <<
|
||||
MODULE_CLKCTRL_MODULEMODE_SHIFT);
|
||||
|
||||
while ((idlest == MODULE_CLKCTRL_IDLEST_DISABLED) ||
|
||||
(idlest == MODULE_CLKCTRL_IDLEST_TRANSITIONING)) {
|
||||
clkctrl = readl(&cmwkup->wkup_uart0ctrl);
|
||||
idlest = (clkctrl & MODULE_CLKCTRL_IDLEST_MASK) >>
|
||||
MODULE_CLKCTRL_IDLEST_SHIFT;
|
||||
}
|
||||
}
|
||||
|
||||
void enable_basic_clocks(void)
|
||||
|
@ -94,7 +94,20 @@ void config_sdram_emif4d5(const struct emif_regs *regs, int nr)
|
||||
writel(regs->emif_rd_wr_exec_thresh,
|
||||
&emif_reg[nr]->emif_rd_wr_exec_thresh);
|
||||
|
||||
/*
|
||||
* for most SOCs these registers won't need to be changed so only
|
||||
* write to these registers if someone explicitly has set the
|
||||
* register's value.
|
||||
*/
|
||||
if(regs->emif_cos_config) {
|
||||
writel(regs->emif_prio_class_serv_map, &emif_reg[nr]->emif_prio_class_serv_map);
|
||||
writel(regs->emif_connect_id_serv_1_map, &emif_reg[nr]->emif_connect_id_serv_1_map);
|
||||
writel(regs->emif_connect_id_serv_2_map, &emif_reg[nr]->emif_connect_id_serv_2_map);
|
||||
writel(regs->emif_cos_config, &emif_reg[nr]->emif_cos_config);
|
||||
}
|
||||
|
||||
writel(regs->ref_ctrl, &emif_reg[nr]->emif_sdram_ref_ctrl);
|
||||
writel(regs->ref_ctrl, &emif_reg[nr]->emif_sdram_ref_ctrl_shdw);
|
||||
writel(regs->sdram_config, &emif_reg[nr]->emif_sdram_config);
|
||||
writel(regs->sdram_config, &cstat->secure_emif_sdram_config);
|
||||
|
||||
|
@ -21,6 +21,10 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
int dram_init(void)
|
||||
{
|
||||
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
|
||||
sdram_init();
|
||||
#endif
|
||||
|
||||
/* dram_init must store complete ramsize in gd->ram_size */
|
||||
gd->ram_size = get_ram_size(
|
||||
(void *)CONFIG_SYS_SDRAM_BASE,
|
||||
@ -111,7 +115,7 @@ void config_ddr(unsigned int pll, const struct ctrl_ioregs *ioregs,
|
||||
#endif
|
||||
#ifdef CONFIG_AM43XX
|
||||
writel(readl(&cm_device->cm_dll_ctrl) & ~0x1, &cm_device->cm_dll_ctrl);
|
||||
while ((readl(&cm_device->cm_dll_ctrl) && CM_DLL_READYST) == 0)
|
||||
while ((readl(&cm_device->cm_dll_ctrl) & CM_DLL_READYST) == 0)
|
||||
;
|
||||
writel(0x80000000, &ddrctrl->ddrioctrl);
|
||||
|
||||
|
10
arch/arm/cpu/armv7/at91/config.mk
Normal file
10
arch/arm/cpu/armv7/at91/config.mk
Normal file
@ -0,0 +1,10 @@
|
||||
#
|
||||
# Copyright (C) 2014, Andreas Bießmann <andreas.devel@googlemail.com>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
ifdef CONFIG_SPL_BUILD
|
||||
ALL-y += boot.bin
|
||||
else
|
||||
ALL-y += u-boot.img
|
||||
endif
|
@ -61,6 +61,8 @@ int print_cpuinfo(void)
|
||||
|
||||
void enable_caches(void)
|
||||
{
|
||||
icache_enable();
|
||||
dcache_enable();
|
||||
}
|
||||
|
||||
unsigned int get_chip_id(void)
|
||||
|
@ -354,41 +354,10 @@ void invalidate_icache_all(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Stub implementations for outer cache operations
|
||||
*/
|
||||
void __v7_outer_cache_enable(void)
|
||||
{
|
||||
}
|
||||
void v7_outer_cache_enable(void)
|
||||
__attribute__((weak, alias("__v7_outer_cache_enable")));
|
||||
|
||||
void __v7_outer_cache_disable(void)
|
||||
{
|
||||
}
|
||||
void v7_outer_cache_disable(void)
|
||||
__attribute__((weak, alias("__v7_outer_cache_disable")));
|
||||
|
||||
void __v7_outer_cache_flush_all(void)
|
||||
{
|
||||
}
|
||||
void v7_outer_cache_flush_all(void)
|
||||
__attribute__((weak, alias("__v7_outer_cache_flush_all")));
|
||||
|
||||
void __v7_outer_cache_inval_all(void)
|
||||
{
|
||||
}
|
||||
void v7_outer_cache_inval_all(void)
|
||||
__attribute__((weak, alias("__v7_outer_cache_inval_all")));
|
||||
|
||||
void __v7_outer_cache_flush_range(u32 start, u32 end)
|
||||
{
|
||||
}
|
||||
void v7_outer_cache_flush_range(u32 start, u32 end)
|
||||
__attribute__((weak, alias("__v7_outer_cache_flush_range")));
|
||||
|
||||
void __v7_outer_cache_inval_range(u32 start, u32 end)
|
||||
{
|
||||
}
|
||||
void v7_outer_cache_inval_range(u32 start, u32 end)
|
||||
__attribute__((weak, alias("__v7_outer_cache_inval_range")));
|
||||
/* Stub implementations for outer cache operations */
|
||||
__weak void v7_outer_cache_enable(void) {}
|
||||
__weak void v7_outer_cache_disable(void) {}
|
||||
__weak void v7_outer_cache_flush_all(void) {}
|
||||
__weak void v7_outer_cache_inval_all(void) {}
|
||||
__weak void v7_outer_cache_flush_range(u32 start, u32 end) {}
|
||||
__weak void v7_outer_cache_inval_range(u32 start, u32 end) {}
|
||||
|
@ -869,7 +869,7 @@ static void exynos4_set_mmc_clk(int dev_index, unsigned int div)
|
||||
{
|
||||
struct exynos4_clock *clk =
|
||||
(struct exynos4_clock *)samsung_get_base_clock();
|
||||
unsigned int addr;
|
||||
unsigned int addr, clear_bit, set_bit;
|
||||
|
||||
/*
|
||||
* CLK_DIV_FSYS1
|
||||
@ -877,44 +877,26 @@ static void exynos4_set_mmc_clk(int dev_index, unsigned int div)
|
||||
* CLK_DIV_FSYS2
|
||||
* MMC2_PRE_RATIO [15:8], MMC3_PRE_RATIO [31:24]
|
||||
* CLK_DIV_FSYS3
|
||||
* MMC4_PRE_RATIO [15:8]
|
||||
* MMC4_RATIO [3:0]
|
||||
*/
|
||||
if (dev_index < 2) {
|
||||
addr = (unsigned int)&clk->div_fsys1;
|
||||
} else if (dev_index == 4) {
|
||||
clear_bit = MASK_PRE_RATIO(dev_index);
|
||||
set_bit = SET_PRE_RATIO(dev_index, div);
|
||||
} else if (dev_index == 4) {
|
||||
addr = (unsigned int)&clk->div_fsys3;
|
||||
dev_index -= 4;
|
||||
/* MMC4 is controlled with the MMC4_RATIO value */
|
||||
clear_bit = MASK_RATIO(dev_index);
|
||||
set_bit = SET_RATIO(dev_index, div);
|
||||
} else {
|
||||
addr = (unsigned int)&clk->div_fsys2;
|
||||
dev_index -= 2;
|
||||
clear_bit = MASK_PRE_RATIO(dev_index);
|
||||
set_bit = SET_PRE_RATIO(dev_index, div);
|
||||
}
|
||||
|
||||
clrsetbits_le32(addr, 0xff << ((dev_index << 4) + 8),
|
||||
(div & 0xff) << ((dev_index << 4) + 8));
|
||||
}
|
||||
|
||||
/* exynos4x12: set the mmc clock */
|
||||
static void exynos4x12_set_mmc_clk(int dev_index, unsigned int div)
|
||||
{
|
||||
struct exynos4x12_clock *clk =
|
||||
(struct exynos4x12_clock *)samsung_get_base_clock();
|
||||
unsigned int addr;
|
||||
|
||||
/*
|
||||
* CLK_DIV_FSYS1
|
||||
* MMC0_PRE_RATIO [15:8], MMC1_PRE_RATIO [31:24]
|
||||
* CLK_DIV_FSYS2
|
||||
* MMC2_PRE_RATIO [15:8], MMC3_PRE_RATIO [31:24]
|
||||
*/
|
||||
if (dev_index < 2) {
|
||||
addr = (unsigned int)&clk->div_fsys1;
|
||||
} else {
|
||||
addr = (unsigned int)&clk->div_fsys2;
|
||||
dev_index -= 2;
|
||||
}
|
||||
|
||||
clrsetbits_le32(addr, 0xff << ((dev_index << 4) + 8),
|
||||
(div & 0xff) << ((dev_index << 4) + 8));
|
||||
clrsetbits_le32(addr, clear_bit, set_bit);
|
||||
}
|
||||
|
||||
/* exynos5: set the mmc clock */
|
||||
@ -1612,10 +1594,7 @@ void set_mmc_clk(int dev_index, unsigned int div)
|
||||
else
|
||||
exynos5_set_mmc_clk(dev_index, div);
|
||||
} else {
|
||||
if (proid_is_exynos4412())
|
||||
exynos4x12_set_mmc_clk(dev_index, div);
|
||||
else
|
||||
exynos4_set_mmc_clk(dev_index, div);
|
||||
exynos4_set_mmc_clk(dev_index, div);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -162,7 +162,7 @@ void mem_ctrl_init(int reset)
|
||||
|
||||
/* If there are any other memory variant, add their init call below */
|
||||
if (param->mem_type == DDR_MODE_DDR3) {
|
||||
ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size, reset);
|
||||
ret = ddr3_mem_ctrl_init(mem, reset);
|
||||
if (ret) {
|
||||
/* will hang if failed to init memory control */
|
||||
while (1)
|
||||
|
@ -6,6 +6,7 @@
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <config.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
@ -16,7 +17,11 @@
|
||||
#include "exynos5_setup.h"
|
||||
#include "clock_init.h"
|
||||
|
||||
#define TIMEOUT 10000
|
||||
#define TIMEOUT_US 10000
|
||||
#define NUM_BYTE_LANES 4
|
||||
#define DEFAULT_DQS 8
|
||||
#define DEFAULT_DQS_X4 (DEFAULT_DQS << 24) || (DEFAULT_DQS << 16) \
|
||||
|| (DEFAULT_DQS << 8) || (DEFAULT_DQS << 0)
|
||||
|
||||
#ifdef CONFIG_EXYNOS5250
|
||||
static void reset_phy_ctrl(void)
|
||||
@ -28,8 +33,7 @@ static void reset_phy_ctrl(void)
|
||||
writel(DDR3PHY_CTRL_PHY_RESET, &clk->lpddr3phy_ctrl);
|
||||
}
|
||||
|
||||
int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
|
||||
int reset)
|
||||
int ddr3_mem_ctrl_init(struct mem_timings *mem, int reset)
|
||||
{
|
||||
unsigned int val;
|
||||
struct exynos5_phy_control *phy0_ctrl, *phy1_ctrl;
|
||||
@ -177,7 +181,7 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
|
||||
writel(val, &phy1_ctrl->phy_con1);
|
||||
|
||||
writel(CTRL_RDLVL_GATE_ENABLE, &dmc->rdlvl_config);
|
||||
i = TIMEOUT;
|
||||
i = TIMEOUT_US;
|
||||
while ((readl(&dmc->phystatus) &
|
||||
(RDLVL_COMPLETE_CHO | RDLVL_COMPLETE_CH1)) !=
|
||||
(RDLVL_COMPLETE_CHO | RDLVL_COMPLETE_CH1) && i > 0) {
|
||||
@ -221,8 +225,220 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_EXYNOS5420
|
||||
int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
|
||||
int reset)
|
||||
/**
|
||||
* RAM address to use in the test.
|
||||
*
|
||||
* We'll use 4 words at this address and 4 at this address + 0x80 (Ares
|
||||
* interleaves channels every 128 bytes). This will allow us to evaluate all of
|
||||
* the chips in a 1 chip per channel (2GB) system and half the chips in a 2
|
||||
* chip per channel (4GB) system. We can't test the 2nd chip since we need to
|
||||
* do tests before the 2nd chip is enabled. Looking at the 2nd chip isn't
|
||||
* critical because the 1st and 2nd chip have very similar timings (they'd
|
||||
* better have similar timings, since there's only a single adjustment that is
|
||||
* shared by both chips).
|
||||
*/
|
||||
const unsigned int test_addr = CONFIG_SYS_SDRAM_BASE;
|
||||
|
||||
/* Test pattern with which RAM will be tested */
|
||||
static const unsigned int test_pattern[] = {
|
||||
0x5a5a5a5a,
|
||||
0xa5a5a5a5,
|
||||
0xf0f0f0f0,
|
||||
0x0f0f0f0f,
|
||||
};
|
||||
|
||||
/**
|
||||
* This function is a test vector for sw read leveling,
|
||||
* it compares the read data with the written data.
|
||||
*
|
||||
* @param ch DMC channel number
|
||||
* @param byte_lane which DQS byte offset,
|
||||
* possible values are 0,1,2,3
|
||||
* @return TRUE if memory was good, FALSE if not.
|
||||
*/
|
||||
static bool dmc_valid_window_test_vector(int ch, int byte_lane)
|
||||
{
|
||||
unsigned int read_data;
|
||||
unsigned int mask;
|
||||
int i;
|
||||
|
||||
mask = 0xFF << (8 * byte_lane);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(test_pattern); i++) {
|
||||
read_data = readl(test_addr + i * 4 + ch * 0x80);
|
||||
if ((read_data & mask) != (test_pattern[i] & mask))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function returns current read offset value.
|
||||
*
|
||||
* @param phy_ctrl pointer to the current phy controller
|
||||
*/
|
||||
static unsigned int dmc_get_read_offset_value(struct exynos5420_phy_control
|
||||
*phy_ctrl)
|
||||
{
|
||||
return readl(&phy_ctrl->phy_con4);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function performs resync, so that slave DLL is updated.
|
||||
*
|
||||
* @param phy_ctrl pointer to the current phy controller
|
||||
*/
|
||||
static void ddr_phy_set_do_resync(struct exynos5420_phy_control *phy_ctrl)
|
||||
{
|
||||
setbits_le32(&phy_ctrl->phy_con10, PHY_CON10_CTRL_OFFSETR3);
|
||||
clrbits_le32(&phy_ctrl->phy_con10, PHY_CON10_CTRL_OFFSETR3);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function sets read offset value register with 'offset'.
|
||||
*
|
||||
* ...we also call call ddr_phy_set_do_resync().
|
||||
*
|
||||
* @param phy_ctrl pointer to the current phy controller
|
||||
* @param offset offset to read DQS
|
||||
*/
|
||||
static void dmc_set_read_offset_value(struct exynos5420_phy_control *phy_ctrl,
|
||||
unsigned int offset)
|
||||
{
|
||||
writel(offset, &phy_ctrl->phy_con4);
|
||||
ddr_phy_set_do_resync(phy_ctrl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a 2s complement byte to a byte with a sign bit.
|
||||
*
|
||||
* NOTE: you shouldn't use normal math on the number returned by this function.
|
||||
* As an example, -10 = 0xf6. After this function -10 = 0x8a. If you wanted
|
||||
* to do math and get the average of 10 and -10 (should be 0):
|
||||
* 0x8a + 0xa = 0x94 (-108)
|
||||
* 0x94 / 2 = 0xca (-54)
|
||||
* ...and 0xca = sign bit plus 0x4a, or -74
|
||||
*
|
||||
* Also note that you lose the ability to represent -128 since there are two
|
||||
* representations of 0.
|
||||
*
|
||||
* @param b The byte to convert in two's complement.
|
||||
* @return The 7-bit value + sign bit.
|
||||
*/
|
||||
|
||||
unsigned char make_signed_byte(signed char b)
|
||||
{
|
||||
if (b < 0)
|
||||
return 0x80 | -b;
|
||||
else
|
||||
return b;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test various shifts starting at 'start' and going to 'end'.
|
||||
*
|
||||
* For each byte lane, we'll walk through shift starting at 'start' and going
|
||||
* to 'end' (inclusive). When we are finally able to read the test pattern
|
||||
* we'll store the value in the results array.
|
||||
*
|
||||
* @param phy_ctrl pointer to the current phy controller
|
||||
* @param ch channel number
|
||||
* @param start the start shift. -127 to 127
|
||||
* @param end the end shift. -127 to 127
|
||||
* @param results we'll store results for each byte lane.
|
||||
*/
|
||||
|
||||
void test_shifts(struct exynos5420_phy_control *phy_ctrl, int ch,
|
||||
int start, int end, int results[NUM_BYTE_LANES])
|
||||
{
|
||||
int incr = (start < end) ? 1 : -1;
|
||||
int byte_lane;
|
||||
|
||||
for (byte_lane = 0; byte_lane < NUM_BYTE_LANES; byte_lane++) {
|
||||
int shift;
|
||||
|
||||
dmc_set_read_offset_value(phy_ctrl, DEFAULT_DQS_X4);
|
||||
results[byte_lane] = DEFAULT_DQS;
|
||||
|
||||
for (shift = start; shift != (end + incr); shift += incr) {
|
||||
unsigned int byte_offsetr;
|
||||
unsigned int offsetr;
|
||||
|
||||
byte_offsetr = make_signed_byte(shift);
|
||||
|
||||
offsetr = dmc_get_read_offset_value(phy_ctrl);
|
||||
offsetr &= ~(0xFF << (8 * byte_lane));
|
||||
offsetr |= (byte_offsetr << (8 * byte_lane));
|
||||
dmc_set_read_offset_value(phy_ctrl, offsetr);
|
||||
|
||||
if (dmc_valid_window_test_vector(ch, byte_lane)) {
|
||||
results[byte_lane] = shift;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This function performs SW read leveling to compensate DQ-DQS skew at
|
||||
* receiver it first finds the optimal read offset value on each DQS
|
||||
* then applies the value to PHY.
|
||||
*
|
||||
* Read offset value has its min margin and max margin. If read offset
|
||||
* value exceeds its min or max margin, read data will have corruption.
|
||||
* To avoid this we are doing sw read leveling.
|
||||
*
|
||||
* SW read leveling is:
|
||||
* 1> Finding offset value's left_limit and right_limit
|
||||
* 2> and calculate its center value
|
||||
* 3> finally programs that center value to PHY
|
||||
* 4> then PHY gets its optimal offset value.
|
||||
*
|
||||
* @param phy_ctrl pointer to the current phy controller
|
||||
* @param ch channel number
|
||||
* @param coarse_lock_val The coarse lock value read from PHY_CON13.
|
||||
* (0 - 0x7f)
|
||||
*/
|
||||
static void software_find_read_offset(struct exynos5420_phy_control *phy_ctrl,
|
||||
int ch, unsigned int coarse_lock_val)
|
||||
{
|
||||
unsigned int offsetr_cent;
|
||||
int byte_lane;
|
||||
int left_limit;
|
||||
int right_limit;
|
||||
int left[NUM_BYTE_LANES];
|
||||
int right[NUM_BYTE_LANES];
|
||||
int i;
|
||||
|
||||
/* Fill the memory with test patterns */
|
||||
for (i = 0; i < ARRAY_SIZE(test_pattern); i++)
|
||||
writel(test_pattern[i], test_addr + i * 4 + ch * 0x80);
|
||||
|
||||
/* Figure out the limits we'll test with; keep -127 < limit < 127 */
|
||||
left_limit = DEFAULT_DQS - coarse_lock_val;
|
||||
right_limit = DEFAULT_DQS + coarse_lock_val;
|
||||
if (right_limit > 127)
|
||||
right_limit = 127;
|
||||
|
||||
/* Fill in the location where reads were OK from left and right */
|
||||
test_shifts(phy_ctrl, ch, left_limit, right_limit, left);
|
||||
test_shifts(phy_ctrl, ch, right_limit, left_limit, right);
|
||||
|
||||
/* Make a final value by taking the center between the left and right */
|
||||
offsetr_cent = 0;
|
||||
for (byte_lane = 0; byte_lane < NUM_BYTE_LANES; byte_lane++) {
|
||||
int temp_center;
|
||||
unsigned int vmwc;
|
||||
|
||||
temp_center = (left[byte_lane] + right[byte_lane]) / 2;
|
||||
vmwc = make_signed_byte(temp_center);
|
||||
offsetr_cent |= vmwc << (8 * byte_lane);
|
||||
}
|
||||
dmc_set_read_offset_value(phy_ctrl, offsetr_cent);
|
||||
}
|
||||
|
||||
int ddr3_mem_ctrl_init(struct mem_timings *mem, int reset)
|
||||
{
|
||||
struct exynos5420_clock *clk =
|
||||
(struct exynos5420_clock *)samsung_get_base_clock();
|
||||
@ -231,7 +447,9 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
|
||||
struct exynos5420_phy_control *phy0_ctrl, *phy1_ctrl;
|
||||
struct exynos5420_dmc *drex0, *drex1;
|
||||
struct exynos5420_tzasc *tzasc0, *tzasc1;
|
||||
struct exynos5_power *pmu;
|
||||
uint32_t val, n_lock_r, n_lock_w_phy0, n_lock_w_phy1;
|
||||
uint32_t lock0_info, lock1_info;
|
||||
int chip;
|
||||
int i;
|
||||
|
||||
@ -244,6 +462,7 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
|
||||
tzasc0 = (struct exynos5420_tzasc *)samsung_get_base_dmc_tzasc();
|
||||
tzasc1 = (struct exynos5420_tzasc *)(samsung_get_base_dmc_tzasc()
|
||||
+ DMC_OFFSET);
|
||||
pmu = (struct exynos5_power *)EXYNOS5420_POWER_BASE;
|
||||
|
||||
/* Enable PAUSE for DREX */
|
||||
setbits_le32(&clk->pause, ENABLE_BIT);
|
||||
@ -394,7 +613,41 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
|
||||
*/
|
||||
dmc_config_mrs(mem, &drex0->directcmd);
|
||||
dmc_config_mrs(mem, &drex1->directcmd);
|
||||
} else {
|
||||
}
|
||||
|
||||
/*
|
||||
* Get PHY_CON13 from both phys. Gate CLKM around reading since
|
||||
* PHY_CON13 is glitchy when CLKM is running. We're paranoid and
|
||||
* wait until we get a "fine lock", though a coarse lock is probably
|
||||
* OK (we only use the coarse numbers below). We try to gate the
|
||||
* clock for as short a time as possible in case SDRAM is somehow
|
||||
* sensitive. sdelay(10) in the loop is arbitrary to make sure
|
||||
* there is some time for PHY_CON13 to get updated. In practice
|
||||
* no delay appears to be needed.
|
||||
*/
|
||||
val = readl(&clk->gate_bus_cdrex);
|
||||
while (true) {
|
||||
writel(val & ~0x1, &clk->gate_bus_cdrex);
|
||||
lock0_info = readl(&phy0_ctrl->phy_con13);
|
||||
writel(val, &clk->gate_bus_cdrex);
|
||||
|
||||
if ((lock0_info & CTRL_FINE_LOCKED) == CTRL_FINE_LOCKED)
|
||||
break;
|
||||
|
||||
sdelay(10);
|
||||
}
|
||||
while (true) {
|
||||
writel(val & ~0x2, &clk->gate_bus_cdrex);
|
||||
lock1_info = readl(&phy1_ctrl->phy_con13);
|
||||
writel(val, &clk->gate_bus_cdrex);
|
||||
|
||||
if ((lock1_info & CTRL_FINE_LOCKED) == CTRL_FINE_LOCKED)
|
||||
break;
|
||||
|
||||
sdelay(10);
|
||||
}
|
||||
|
||||
if (!reset) {
|
||||
/*
|
||||
* During Suspend-Resume & S/W-Reset, as soon as PMU releases
|
||||
* pad retention, CKE goes high. This causes memory contents
|
||||
@ -445,15 +698,13 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
|
||||
val |= (RDLVL_PASS_ADJ_VAL << RDLVL_PASS_ADJ_OFFSET);
|
||||
writel(val, &phy1_ctrl->phy_con1);
|
||||
|
||||
n_lock_r = readl(&phy0_ctrl->phy_con13);
|
||||
n_lock_w_phy0 = (n_lock_r & CTRL_LOCK_COARSE_MASK) >> 2;
|
||||
n_lock_w_phy0 = (lock0_info & CTRL_LOCK_COARSE_MASK) >> 2;
|
||||
n_lock_r = readl(&phy0_ctrl->phy_con12);
|
||||
n_lock_r &= ~CTRL_DLL_ON;
|
||||
n_lock_r |= n_lock_w_phy0;
|
||||
writel(n_lock_r, &phy0_ctrl->phy_con12);
|
||||
|
||||
n_lock_r = readl(&phy1_ctrl->phy_con13);
|
||||
n_lock_w_phy1 = (n_lock_r & CTRL_LOCK_COARSE_MASK) >> 2;
|
||||
n_lock_w_phy1 = (lock1_info & CTRL_LOCK_COARSE_MASK) >> 2;
|
||||
n_lock_r = readl(&phy1_ctrl->phy_con12);
|
||||
n_lock_r &= ~CTRL_DLL_ON;
|
||||
n_lock_r |= n_lock_w_phy1;
|
||||
@ -482,7 +733,7 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
|
||||
writel(val, &phy1_ctrl->phy_con1);
|
||||
|
||||
writel(CTRL_RDLVL_GATE_ENABLE, &drex0->rdlvl_config);
|
||||
i = TIMEOUT;
|
||||
i = TIMEOUT_US;
|
||||
while (((readl(&drex0->phystatus) & RDLVL_COMPLETE_CHO) !=
|
||||
RDLVL_COMPLETE_CHO) && (i > 0)) {
|
||||
/*
|
||||
@ -497,7 +748,7 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
|
||||
writel(CTRL_RDLVL_GATE_DISABLE, &drex0->rdlvl_config);
|
||||
|
||||
writel(CTRL_RDLVL_GATE_ENABLE, &drex1->rdlvl_config);
|
||||
i = TIMEOUT;
|
||||
i = TIMEOUT_US;
|
||||
while (((readl(&drex1->phystatus) & RDLVL_COMPLETE_CHO) !=
|
||||
RDLVL_COMPLETE_CHO) && (i > 0)) {
|
||||
/*
|
||||
@ -522,77 +773,6 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
|
||||
&drex1->directcmd);
|
||||
}
|
||||
|
||||
if (mem->read_leveling_enable) {
|
||||
/* Set Read DQ Calibration */
|
||||
val = (0x3 << DIRECT_CMD_BANK_SHIFT) | 0x4;
|
||||
for (chip = 0; chip < mem->chips_to_configure; chip++) {
|
||||
writel(val | (chip << DIRECT_CMD_CHIP_SHIFT),
|
||||
&drex0->directcmd);
|
||||
writel(val | (chip << DIRECT_CMD_CHIP_SHIFT),
|
||||
&drex1->directcmd);
|
||||
}
|
||||
|
||||
val = readl(&phy0_ctrl->phy_con1);
|
||||
val |= READ_LEVELLING_DDR3;
|
||||
writel(val, &phy0_ctrl->phy_con1);
|
||||
val = readl(&phy1_ctrl->phy_con1);
|
||||
val |= READ_LEVELLING_DDR3;
|
||||
writel(val, &phy1_ctrl->phy_con1);
|
||||
|
||||
val = readl(&phy0_ctrl->phy_con2);
|
||||
val |= (RDLVL_EN | RDLVL_INCR_ADJ);
|
||||
writel(val, &phy0_ctrl->phy_con2);
|
||||
val = readl(&phy1_ctrl->phy_con2);
|
||||
val |= (RDLVL_EN | RDLVL_INCR_ADJ);
|
||||
writel(val, &phy1_ctrl->phy_con2);
|
||||
|
||||
setbits_le32(&drex0->rdlvl_config,
|
||||
CTRL_RDLVL_DATA_ENABLE);
|
||||
i = TIMEOUT;
|
||||
while (((readl(&drex0->phystatus) & RDLVL_COMPLETE_CHO)
|
||||
!= RDLVL_COMPLETE_CHO) && (i > 0)) {
|
||||
/*
|
||||
* TODO(waihong): Comment on how long this take
|
||||
* to timeout
|
||||
*/
|
||||
sdelay(100);
|
||||
i--;
|
||||
}
|
||||
if (!i)
|
||||
return SETUP_ERR_RDLV_COMPLETE_TIMEOUT;
|
||||
|
||||
clrbits_le32(&drex0->rdlvl_config,
|
||||
CTRL_RDLVL_DATA_ENABLE);
|
||||
setbits_le32(&drex1->rdlvl_config,
|
||||
CTRL_RDLVL_DATA_ENABLE);
|
||||
i = TIMEOUT;
|
||||
while (((readl(&drex1->phystatus) & RDLVL_COMPLETE_CHO)
|
||||
!= RDLVL_COMPLETE_CHO) && (i > 0)) {
|
||||
/*
|
||||
* TODO(waihong): Comment on how long this take
|
||||
* to timeout
|
||||
*/
|
||||
sdelay(100);
|
||||
i--;
|
||||
}
|
||||
if (!i)
|
||||
return SETUP_ERR_RDLV_COMPLETE_TIMEOUT;
|
||||
|
||||
clrbits_le32(&drex1->rdlvl_config,
|
||||
CTRL_RDLVL_DATA_ENABLE);
|
||||
|
||||
val = (0x3 << DIRECT_CMD_BANK_SHIFT);
|
||||
for (chip = 0; chip < mem->chips_to_configure; chip++) {
|
||||
writel(val | (chip << DIRECT_CMD_CHIP_SHIFT),
|
||||
&drex0->directcmd);
|
||||
writel(val | (chip << DIRECT_CMD_CHIP_SHIFT),
|
||||
&drex1->directcmd);
|
||||
}
|
||||
|
||||
update_reset_dll(&drex0->phycontrol0, DDR_MODE_DDR3);
|
||||
update_reset_dll(&drex1->phycontrol0, DDR_MODE_DDR3);
|
||||
}
|
||||
|
||||
/* Common Settings for Leveling */
|
||||
val = PHY_CON12_RESET_VAL;
|
||||
writel((val + n_lock_w_phy0), &phy0_ctrl->phy_con12);
|
||||
@ -602,6 +782,27 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
|
||||
setbits_le32(&phy1_ctrl->phy_con2, DLL_DESKEW_EN);
|
||||
}
|
||||
|
||||
/*
|
||||
* Do software read leveling
|
||||
*
|
||||
* Do this before we turn on auto refresh since the auto refresh can
|
||||
* be in conflict with the resync operation that's part of setting
|
||||
* read leveling.
|
||||
*/
|
||||
if (!reset) {
|
||||
/* restore calibrated value after resume */
|
||||
dmc_set_read_offset_value(phy0_ctrl, readl(&pmu->pmu_spare1));
|
||||
dmc_set_read_offset_value(phy1_ctrl, readl(&pmu->pmu_spare2));
|
||||
} else {
|
||||
software_find_read_offset(phy0_ctrl, 0,
|
||||
CTRL_LOCK_COARSE(lock0_info));
|
||||
software_find_read_offset(phy1_ctrl, 1,
|
||||
CTRL_LOCK_COARSE(lock1_info));
|
||||
/* save calibrated value to restore after resume */
|
||||
writel(dmc_get_read_offset_value(phy0_ctrl), &pmu->pmu_spare1);
|
||||
writel(dmc_get_read_offset_value(phy1_ctrl), &pmu->pmu_spare2);
|
||||
}
|
||||
|
||||
/* Send PALL command */
|
||||
dmc_config_prech(mem, &drex0->directcmd);
|
||||
dmc_config_prech(mem, &drex1->directcmd);
|
||||
|
@ -282,8 +282,12 @@
|
||||
#define PHY_CON12_VAL 0x10107F50
|
||||
#define CTRL_START (1 << 6)
|
||||
#define CTRL_DLL_ON (1 << 5)
|
||||
#define CTRL_LOCK_COARSE_OFFSET 10
|
||||
#define CTRL_LOCK_COARSE_MASK (0x7F << CTRL_LOCK_COARSE_OFFSET)
|
||||
#define CTRL_LOCK_COARSE(x) (((x) & CTRL_LOCK_COARSE_MASK) >> \
|
||||
CTRL_LOCK_COARSE_OFFSET)
|
||||
#define CTRL_FORCE_MASK (0x7F << 8)
|
||||
#define CTRL_LOCK_COARSE_MASK (0x7F << 10)
|
||||
#define CTRL_FINE_LOCKED 0x7
|
||||
|
||||
#define CTRL_OFFSETD_RESET_VAL 0x8
|
||||
#define CTRL_OFFSETD_VAL 0x7F
|
||||
@ -431,10 +435,10 @@
|
||||
|
||||
/*
|
||||
* Definitions that differ with SoC's.
|
||||
* Below is the part defining macros for smdk5250.
|
||||
* Else part introduces macros for smdk5420.
|
||||
* Below is the part defining macros for Exynos5250.
|
||||
* Else part introduces macros for Exynos5420.
|
||||
*/
|
||||
#ifndef CONFIG_SMDK5420
|
||||
#ifndef CONFIG_EXYNOS5420
|
||||
|
||||
/* APLL_CON1 */
|
||||
#define APLL_CON1_VAL (0x00203800)
|
||||
@ -890,16 +894,11 @@ enum {
|
||||
/*
|
||||
* Memory variant specific initialization code for DDR3
|
||||
*
|
||||
* @param mem Memory timings for this memory type.
|
||||
* @param mem_iv_size Memory interleaving size is a configurable parameter
|
||||
* which the DMC uses to decide how to split a memory
|
||||
* chunk into smaller chunks to support concurrent
|
||||
* accesses; may vary across boards.
|
||||
* @param mem Memory timings for this memory type.
|
||||
* @param reset Reset DDR PHY during initialization.
|
||||
* @return 0 if ok, SETUP_ERR_... if there is a problem
|
||||
*/
|
||||
int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
|
||||
int reset);
|
||||
int ddr3_mem_ctrl_init(struct mem_timings *mem, int reset);
|
||||
|
||||
/* Memory variant specific initialization code for LPDDR3 */
|
||||
void lpddr3_mem_ctrl_init(void);
|
||||
|
@ -39,6 +39,7 @@ enum {
|
||||
DO_CLOCKS = 1 << 1,
|
||||
DO_MEM_RESET = 1 << 2,
|
||||
DO_UART = 1 << 3,
|
||||
DO_POWER = 1 << 4,
|
||||
};
|
||||
|
||||
int do_lowlevel_init(void)
|
||||
@ -60,9 +61,12 @@ int do_lowlevel_init(void)
|
||||
break;
|
||||
default:
|
||||
/* This is a normal boot (not a wake from sleep) */
|
||||
actions = DO_CLOCKS | DO_MEM_RESET;
|
||||
actions = DO_CLOCKS | DO_MEM_RESET | DO_POWER;
|
||||
}
|
||||
|
||||
if (actions & DO_POWER)
|
||||
set_ps_hold_ctrl();
|
||||
|
||||
if (actions & DO_CLOCKS) {
|
||||
system_clock_init();
|
||||
mem_ctrl_init(actions & DO_MEM_RESET);
|
||||
|
@ -573,15 +573,26 @@ static void exynos4_i2c_config(int peripheral, int flags)
|
||||
static int exynos4_mmc_config(int peripheral, int flags)
|
||||
{
|
||||
int i, start = 0, start_ext = 0;
|
||||
unsigned int func, ext_func;
|
||||
|
||||
switch (peripheral) {
|
||||
case PERIPH_ID_SDMMC0:
|
||||
start = EXYNOS4_GPIO_K00;
|
||||
start_ext = EXYNOS4_GPIO_K13;
|
||||
func = S5P_GPIO_FUNC(0x2);
|
||||
ext_func = S5P_GPIO_FUNC(0x3);
|
||||
break;
|
||||
case PERIPH_ID_SDMMC2:
|
||||
start = EXYNOS4_GPIO_K20;
|
||||
start_ext = EXYNOS4_GPIO_K33;
|
||||
func = S5P_GPIO_FUNC(0x2);
|
||||
ext_func = S5P_GPIO_FUNC(0x3);
|
||||
break;
|
||||
case PERIPH_ID_SDMMC4:
|
||||
start = EXYNOS4_GPIO_K00;
|
||||
start_ext = EXYNOS4_GPIO_K13;
|
||||
func = S5P_GPIO_FUNC(0x3);
|
||||
ext_func = S5P_GPIO_FUNC(0x4);
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
@ -589,13 +600,14 @@ static int exynos4_mmc_config(int peripheral, int flags)
|
||||
for (i = start; i < (start + 7); i++) {
|
||||
if (i == (start + 2))
|
||||
continue;
|
||||
gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
|
||||
gpio_cfg_pin(i, func);
|
||||
gpio_set_pull(i, S5P_GPIO_PULL_NONE);
|
||||
gpio_set_drv(i, S5P_GPIO_DRV_4X);
|
||||
}
|
||||
/* SDMMC2 do not use 8bit mode at exynos4 */
|
||||
if (flags & PINMUX_FLAG_8BIT_MODE) {
|
||||
for (i = start_ext; i < (start_ext + 4); i++) {
|
||||
gpio_cfg_pin(i, S5P_GPIO_FUNC(0x3));
|
||||
gpio_cfg_pin(i, ext_func);
|
||||
gpio_set_pull(i, S5P_GPIO_PULL_NONE);
|
||||
gpio_set_drv(i, S5P_GPIO_DRV_4X);
|
||||
}
|
||||
@ -676,15 +688,26 @@ static void exynos4x12_i2c_config(int peripheral, int flags)
|
||||
static int exynos4x12_mmc_config(int peripheral, int flags)
|
||||
{
|
||||
int i, start = 0, start_ext = 0;
|
||||
unsigned int func, ext_func;
|
||||
|
||||
switch (peripheral) {
|
||||
case PERIPH_ID_SDMMC0:
|
||||
start = EXYNOS4X12_GPIO_K00;
|
||||
start_ext = EXYNOS4X12_GPIO_K13;
|
||||
func = S5P_GPIO_FUNC(0x2);
|
||||
ext_func = S5P_GPIO_FUNC(0x3);
|
||||
break;
|
||||
case PERIPH_ID_SDMMC2:
|
||||
start = EXYNOS4X12_GPIO_K20;
|
||||
start_ext = EXYNOS4X12_GPIO_K33;
|
||||
func = S5P_GPIO_FUNC(0x2);
|
||||
ext_func = S5P_GPIO_FUNC(0x3);
|
||||
break;
|
||||
case PERIPH_ID_SDMMC4:
|
||||
start = EXYNOS4_GPIO_K00;
|
||||
start_ext = EXYNOS4_GPIO_K13;
|
||||
func = S5P_GPIO_FUNC(0x3);
|
||||
ext_func = S5P_GPIO_FUNC(0x4);
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
@ -692,13 +715,13 @@ static int exynos4x12_mmc_config(int peripheral, int flags)
|
||||
for (i = start; i < (start + 7); i++) {
|
||||
if (i == (start + 2))
|
||||
continue;
|
||||
gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
|
||||
gpio_cfg_pin(i, func);
|
||||
gpio_set_pull(i, S5P_GPIO_PULL_NONE);
|
||||
gpio_set_drv(i, S5P_GPIO_DRV_4X);
|
||||
}
|
||||
if (flags & PINMUX_FLAG_8BIT_MODE) {
|
||||
for (i = start_ext; i < (start_ext + 4); i++) {
|
||||
gpio_cfg_pin(i, S5P_GPIO_FUNC(0x3));
|
||||
gpio_cfg_pin(i, ext_func);
|
||||
gpio_set_pull(i, S5P_GPIO_PULL_NONE);
|
||||
gpio_set_drv(i, S5P_GPIO_DRV_4X);
|
||||
}
|
||||
@ -759,10 +782,10 @@ static int exynos4_pinmux_config(int peripheral, int flags)
|
||||
break;
|
||||
case PERIPH_ID_SDMMC0:
|
||||
case PERIPH_ID_SDMMC2:
|
||||
case PERIPH_ID_SDMMC4:
|
||||
return exynos4_mmc_config(peripheral, flags);
|
||||
case PERIPH_ID_SDMMC1:
|
||||
case PERIPH_ID_SDMMC3:
|
||||
case PERIPH_ID_SDMMC4:
|
||||
debug("SDMMC device %d not implemented\n", peripheral);
|
||||
return -1;
|
||||
default:
|
||||
@ -794,10 +817,10 @@ static int exynos4x12_pinmux_config(int peripheral, int flags)
|
||||
break;
|
||||
case PERIPH_ID_SDMMC0:
|
||||
case PERIPH_ID_SDMMC2:
|
||||
case PERIPH_ID_SDMMC4:
|
||||
return exynos4x12_mmc_config(peripheral, flags);
|
||||
case PERIPH_ID_SDMMC1:
|
||||
case PERIPH_ID_SDMMC3:
|
||||
case PERIPH_ID_SDMMC4:
|
||||
debug("SDMMC device %d not implemented\n", peripheral);
|
||||
return -1;
|
||||
default:
|
||||
|
@ -112,6 +112,12 @@ static void exynos5_set_ps_hold_ctrl(void)
|
||||
EXYNOS_PS_HOLD_CONTROL_DATA_HIGH);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set ps_hold data driving value high
|
||||
* This enables the machine to stay powered on
|
||||
* after the initial power-on condition goes away
|
||||
* (e.g. power button).
|
||||
*/
|
||||
void set_ps_hold_ctrl(void)
|
||||
{
|
||||
if (cpu_is_exynos5())
|
||||
|
@ -4,8 +4,8 @@
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include<common.h>
|
||||
#include<config.h>
|
||||
#include <common.h>
|
||||
#include <config.h>
|
||||
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/clk.h>
|
||||
|
@ -5,7 +5,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
obj-y += aemif.o
|
||||
obj-y += init.o
|
||||
obj-y += psc.o
|
||||
obj-y += clock.o
|
||||
|
@ -8,6 +8,7 @@
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <ns16550.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
@ -30,6 +31,14 @@ int arch_cpu_init(void)
|
||||
share_all_segments(11); /* PCIE */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* just initialise the COM2 port so that TI specific
|
||||
* UART register PWREMU_MGMT is initialized. Linux UART
|
||||
* driver doesn't handle this.
|
||||
*/
|
||||
NS16550_init((NS16550_t)(CONFIG_SYS_NS16550_COM2),
|
||||
CONFIG_SYS_NS16550_CLK / 16 / CONFIG_BAUDRATE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -22,6 +22,10 @@ obj-y += pipe3-phy.o
|
||||
obj-$(CONFIG_SCSI_AHCI_PLAT) += sata.o
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_SYS_DCACHE_OFF),)
|
||||
obj-y += omap-cache.o
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_OMAP34XX),)
|
||||
obj-y += boot-common.o
|
||||
obj-y += lowlevel_init.o
|
||||
|
@ -18,13 +18,8 @@
|
||||
#include <asm/emif.h>
|
||||
#include <asm/omap_common.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#define ARMV7_DCACHE_WRITEBACK 0xe
|
||||
#define ARMV7_DOMAIN_CLIENT 1
|
||||
#define ARMV7_DOMAIN_MASK (0x3 << 0)
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
void do_set_mux(u32 base, struct pad_conf_entry const *array, int size)
|
||||
@ -263,40 +258,3 @@ int print_cpuinfo(void)
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_SYS_DCACHE_OFF
|
||||
void enable_caches(void)
|
||||
{
|
||||
/* Enable D-cache. I-cache is already enabled in start.S */
|
||||
dcache_enable();
|
||||
}
|
||||
|
||||
void dram_bank_mmu_setup(int bank)
|
||||
{
|
||||
bd_t *bd = gd->bd;
|
||||
int i;
|
||||
|
||||
u32 start = bd->bi_dram[bank].start >> 20;
|
||||
u32 size = bd->bi_dram[bank].size >> 20;
|
||||
u32 end = start + size;
|
||||
|
||||
debug("%s: bank: %d\n", __func__, bank);
|
||||
for (i = start; i < end; i++)
|
||||
set_section_dcache(i, ARMV7_DCACHE_WRITEBACK);
|
||||
|
||||
}
|
||||
|
||||
void arm_init_domains(void)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = get_dacr();
|
||||
/*
|
||||
* Set DOMAIN to client access so that all permissions
|
||||
* set in pagetables are validated by the mmu.
|
||||
*/
|
||||
reg &= ~ARMV7_DOMAIN_MASK;
|
||||
reg |= ARMV7_DOMAIN_CLIENT;
|
||||
set_dacr(reg);
|
||||
}
|
||||
#endif
|
||||
|
@ -121,7 +121,8 @@ void gpmc_init(void)
|
||||
writel(0x00000008, &gpmc_cfg->sysconfig);
|
||||
writel(0x00000000, &gpmc_cfg->irqstatus);
|
||||
writel(0x00000000, &gpmc_cfg->irqenable);
|
||||
writel(0x00000000, &gpmc_cfg->timeout_control);
|
||||
/* disable timeout, set a safe reset value */
|
||||
writel(0x00001ff0, &gpmc_cfg->timeout_control);
|
||||
#ifdef CONFIG_NOR
|
||||
writel(0x00000200, &gpmc_cfg->config);
|
||||
#else
|
||||
@ -133,5 +134,6 @@ void gpmc_init(void)
|
||||
writel(0, &gpmc_cfg->cs[0].config7);
|
||||
sdelay(1000);
|
||||
/* enable chip-select specific configurations */
|
||||
enable_gpmc_cs_config(gpmc_regs, &gpmc_cfg->cs[0], base, size);
|
||||
if (base != 0)
|
||||
enable_gpmc_cs_config(gpmc_regs, &gpmc_cfg->cs[0], base, size);
|
||||
}
|
||||
|
56
arch/arm/cpu/armv7/omap-common/omap-cache.c
Normal file
56
arch/arm/cpu/armv7/omap-common/omap-cache.c
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
*
|
||||
* Common functions for OMAP4/5 based boards
|
||||
*
|
||||
* (C) Copyright 2010
|
||||
* Texas Instruments, <www.ti.com>
|
||||
*
|
||||
* Author :
|
||||
* Aneesh V <aneesh@ti.com>
|
||||
* Steve Sakoman <steve@sakoman.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/cache.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#define ARMV7_DCACHE_WRITEBACK 0xe
|
||||
#define ARMV7_DOMAIN_CLIENT 1
|
||||
#define ARMV7_DOMAIN_MASK (0x3 << 0)
|
||||
|
||||
void enable_caches(void)
|
||||
{
|
||||
/* Enable D-cache. I-cache is already enabled in start.S */
|
||||
dcache_enable();
|
||||
}
|
||||
|
||||
void dram_bank_mmu_setup(int bank)
|
||||
{
|
||||
bd_t *bd = gd->bd;
|
||||
int i;
|
||||
|
||||
u32 start = bd->bi_dram[bank].start >> 20;
|
||||
u32 size = bd->bi_dram[bank].size >> 20;
|
||||
u32 end = start + size;
|
||||
|
||||
debug("%s: bank: %d\n", __func__, bank);
|
||||
for (i = start; i < end; i++)
|
||||
set_section_dcache(i, ARMV7_DCACHE_WRITEBACK);
|
||||
}
|
||||
|
||||
void arm_init_domains(void)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = get_dacr();
|
||||
/*
|
||||
* Set DOMAIN to client access so that all permissions
|
||||
* set in pagetables are validated by the mmu.
|
||||
*/
|
||||
reg &= ~ARMV7_DOMAIN_MASK;
|
||||
reg |= ARMV7_DOMAIN_CLIENT;
|
||||
set_dacr(reg);
|
||||
}
|
@ -147,7 +147,7 @@ void secure_unlock_mem(void)
|
||||
* configure secure registers and exit secure world
|
||||
* general use.
|
||||
*****************************************************************************/
|
||||
void secureworld_exit()
|
||||
void secureworld_exit(void)
|
||||
{
|
||||
unsigned long i;
|
||||
|
||||
@ -178,7 +178,7 @@ void secureworld_exit()
|
||||
* Description: If chip is GP/EMU(special) type, unlock the SRAM for
|
||||
* general use.
|
||||
*****************************************************************************/
|
||||
void try_unlock_memory()
|
||||
void try_unlock_memory(void)
|
||||
{
|
||||
int mode;
|
||||
int in_sdram = is_running_in_sdram();
|
||||
@ -478,11 +478,3 @@ void omap3_outer_cache_disable(void)
|
||||
omap3_update_aux_cr(0, 0x2);
|
||||
}
|
||||
#endif /* !CONFIG_SYS_L2CACHE_OFF */
|
||||
|
||||
#ifndef CONFIG_SYS_DCACHE_OFF
|
||||
void enable_caches(void)
|
||||
{
|
||||
/* Enable D-cache. I-cache is already enabled in start.S */
|
||||
dcache_enable();
|
||||
}
|
||||
#endif /* !CONFIG_SYS_DCACHE_OFF */
|
||||
|
@ -21,17 +21,6 @@
|
||||
struct gpmc *gpmc_cfg;
|
||||
|
||||
#if defined(CONFIG_CMD_NAND)
|
||||
#if defined(GPMC_NAND_ECC_SP_x8_LAYOUT) || defined(GPMC_NAND_ECC_LP_x8_LAYOUT)
|
||||
static const u32 gpmc_m_nand[GPMC_MAX_REG] = {
|
||||
SMNAND_GPMC_CONFIG1,
|
||||
SMNAND_GPMC_CONFIG2,
|
||||
SMNAND_GPMC_CONFIG3,
|
||||
SMNAND_GPMC_CONFIG4,
|
||||
SMNAND_GPMC_CONFIG5,
|
||||
SMNAND_GPMC_CONFIG6,
|
||||
0,
|
||||
};
|
||||
#else
|
||||
static const u32 gpmc_m_nand[GPMC_MAX_REG] = {
|
||||
M_NAND_GPMC_CONFIG1,
|
||||
M_NAND_GPMC_CONFIG2,
|
||||
@ -40,7 +29,6 @@ static const u32 gpmc_m_nand[GPMC_MAX_REG] = {
|
||||
M_NAND_GPMC_CONFIG5,
|
||||
M_NAND_GPMC_CONFIG6, 0
|
||||
};
|
||||
#endif
|
||||
#endif /* CONFIG_CMD_NAND */
|
||||
|
||||
#if defined(CONFIG_CMD_ONENAND)
|
||||
|
@ -9,4 +9,4 @@
|
||||
|
||||
obj-y := lowlevel_init.o
|
||||
obj-y += misc.o timer.o reset_manager.o system_manager.o clock_manager.o
|
||||
obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
|
||||
obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o scan_manager.o
|
||||
|
@ -14,3 +14,27 @@ int dram_init(void)
|
||||
gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DISPLAY_CPUINFO)
|
||||
/*
|
||||
* Print CPU information
|
||||
*/
|
||||
int print_cpuinfo(void)
|
||||
{
|
||||
puts("CPU : Altera SOCFPGA Platform\n");
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SYS_CONSOLE_IS_IN_ENV) && \
|
||||
defined(CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE)
|
||||
int overwrite_console(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int misc_init_r(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
209
arch/arm/cpu/armv7/socfpga/scan_manager.c
Normal file
209
arch/arm/cpu/armv7/socfpga/scan_manager.c
Normal file
@ -0,0 +1,209 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Altera Corporation <www.altera.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/freeze_controller.h>
|
||||
#include <asm/arch/scan_manager.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
static const struct socfpga_scan_manager *scan_manager_base =
|
||||
(void *)(SOCFPGA_SCANMGR_ADDRESS);
|
||||
static const struct socfpga_freeze_controller *freeze_controller_base =
|
||||
(void *)(SOCFPGA_SYSMGR_ADDRESS + SYSMGR_FRZCTRL_ADDRESS);
|
||||
|
||||
/*
|
||||
* Function to check IO scan chain engine status and wait if the engine is
|
||||
* is active. Poll the IO scan chain engine till maximum iteration reached.
|
||||
*/
|
||||
static inline uint32_t scan_chain_engine_is_idle(uint32_t max_iter)
|
||||
{
|
||||
uint32_t scanmgr_status;
|
||||
|
||||
scanmgr_status = readl(&scan_manager_base->stat);
|
||||
|
||||
/* Poll the engine until the scan engine is inactive */
|
||||
while (SCANMGR_STAT_ACTIVE_GET(scanmgr_status) ||
|
||||
(SCANMGR_STAT_WFIFOCNT_GET(scanmgr_status) > 0)) {
|
||||
max_iter--;
|
||||
if (max_iter > 0)
|
||||
scanmgr_status = readl(&scan_manager_base->stat);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Program HPS IO Scan Chain */
|
||||
uint32_t scan_mgr_io_scan_chain_prg(
|
||||
uint32_t io_scan_chain_id,
|
||||
uint32_t io_scan_chain_len_in_bits,
|
||||
const uint32_t *iocsr_scan_chain)
|
||||
{
|
||||
uint16_t tdi_tdo_header;
|
||||
uint32_t io_program_iter;
|
||||
uint32_t io_scan_chain_data_residual;
|
||||
uint32_t residual;
|
||||
uint32_t i;
|
||||
uint32_t index = 0;
|
||||
|
||||
/*
|
||||
* De-assert reinit if the IO scan chain is intended for HIO. In
|
||||
* this, its the chain 3.
|
||||
*/
|
||||
if (io_scan_chain_id == 3)
|
||||
clrbits_le32(&freeze_controller_base->hioctrl,
|
||||
SYSMGR_FRZCTRL_HIOCTRL_DLLRST_MASK);
|
||||
|
||||
/*
|
||||
* Check if the scan chain engine is inactive and the
|
||||
* WFIFO is empty before enabling the IO scan chain
|
||||
*/
|
||||
if (!scan_chain_engine_is_idle(SCAN_MAX_DELAY))
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* Enable IO Scan chain based on scan chain id
|
||||
* Note: only one chain can be enabled at a time
|
||||
*/
|
||||
setbits_le32(&scan_manager_base->en, 1 << io_scan_chain_id);
|
||||
|
||||
/*
|
||||
* Calculate number of iteration needed for full 128-bit (4 x32-bits)
|
||||
* bits shifting. Each TDI_TDO packet can shift in maximum 128-bits
|
||||
*/
|
||||
io_program_iter = io_scan_chain_len_in_bits >>
|
||||
IO_SCAN_CHAIN_128BIT_SHIFT;
|
||||
io_scan_chain_data_residual = io_scan_chain_len_in_bits &
|
||||
IO_SCAN_CHAIN_128BIT_MASK;
|
||||
|
||||
/* Construct TDI_TDO packet for 128-bit IO scan chain (2 bytes) */
|
||||
tdi_tdo_header = TDI_TDO_HEADER_FIRST_BYTE |
|
||||
(TDI_TDO_MAX_PAYLOAD << TDI_TDO_HEADER_SECOND_BYTE_SHIFT);
|
||||
|
||||
/* Program IO scan chain in 128-bit iteration */
|
||||
for (i = 0; i < io_program_iter; i++) {
|
||||
/* write TDI_TDO packet header to scan manager */
|
||||
writel(tdi_tdo_header, &scan_manager_base->fifo_double_byte);
|
||||
|
||||
/* calculate array index. Multiply by 4 as write 4 x 32bits */
|
||||
index = i * 4;
|
||||
|
||||
/* write 4 successive 32-bit IO scan chain data into WFIFO */
|
||||
writel(iocsr_scan_chain[index],
|
||||
&scan_manager_base->fifo_quad_byte);
|
||||
writel(iocsr_scan_chain[index + 1],
|
||||
&scan_manager_base->fifo_quad_byte);
|
||||
writel(iocsr_scan_chain[index + 2],
|
||||
&scan_manager_base->fifo_quad_byte);
|
||||
writel(iocsr_scan_chain[index + 3],
|
||||
&scan_manager_base->fifo_quad_byte);
|
||||
|
||||
/*
|
||||
* Check if the scan chain engine has completed the
|
||||
* IO scan chain data shifting
|
||||
*/
|
||||
if (!scan_chain_engine_is_idle(SCAN_MAX_DELAY))
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Calculate array index for final TDI_TDO packet */
|
||||
index = io_program_iter * 4;
|
||||
|
||||
/* Final TDI_TDO packet if any */
|
||||
if (io_scan_chain_data_residual) {
|
||||
/*
|
||||
* Calculate number of quad bytes FIFO write
|
||||
* needed for the final TDI_TDO packet
|
||||
*/
|
||||
io_program_iter = io_scan_chain_data_residual >>
|
||||
IO_SCAN_CHAIN_32BIT_SHIFT;
|
||||
|
||||
/*
|
||||
* Construct TDI_TDO packet for remaining IO
|
||||
* scan chain (2 bytes)
|
||||
*/
|
||||
tdi_tdo_header = TDI_TDO_HEADER_FIRST_BYTE |
|
||||
((io_scan_chain_data_residual - 1) <<
|
||||
TDI_TDO_HEADER_SECOND_BYTE_SHIFT);
|
||||
|
||||
/*
|
||||
* Program the last part of IO scan chain write TDI_TDO packet
|
||||
* header (2 bytes) to scan manager
|
||||
*/
|
||||
writel(tdi_tdo_header, &scan_manager_base->fifo_double_byte);
|
||||
|
||||
for (i = 0; i < io_program_iter; i++) {
|
||||
/*
|
||||
* write remaining scan chain data into scan
|
||||
* manager WFIFO with 4 bytes write
|
||||
*/
|
||||
writel(iocsr_scan_chain[index + i],
|
||||
&scan_manager_base->fifo_quad_byte);
|
||||
}
|
||||
|
||||
index += io_program_iter;
|
||||
residual = io_scan_chain_data_residual &
|
||||
IO_SCAN_CHAIN_32BIT_MASK;
|
||||
|
||||
if (IO_SCAN_CHAIN_PAYLOAD_24BIT < residual) {
|
||||
/*
|
||||
* write the last 4B scan chain data
|
||||
* into scan manager WFIFO
|
||||
*/
|
||||
writel(iocsr_scan_chain[index],
|
||||
&scan_manager_base->fifo_quad_byte);
|
||||
} else {
|
||||
/*
|
||||
* write the remaining 1 - 3 bytes scan chain
|
||||
* data into scan manager WFIFO byte by byte
|
||||
* to prevent JTAG engine shifting unused data
|
||||
* from the FIFO and mistaken the data as a
|
||||
* valid command (even though unused bits are
|
||||
* set to 0, but just to prevent hardware
|
||||
* glitch)
|
||||
*/
|
||||
for (i = 0; i < residual; i += 8) {
|
||||
writel(((iocsr_scan_chain[index] >> i)
|
||||
& IO_SCAN_CHAIN_BYTE_MASK),
|
||||
&scan_manager_base->fifo_single_byte);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if the scan chain engine has completed the
|
||||
* IO scan chain data shifting
|
||||
*/
|
||||
if (!scan_chain_engine_is_idle(SCAN_MAX_DELAY))
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Disable IO Scan chain when configuration done*/
|
||||
clrbits_le32(&scan_manager_base->en, 1 << io_scan_chain_id);
|
||||
return 0;
|
||||
|
||||
error:
|
||||
/* Disable IO Scan chain when error detected */
|
||||
clrbits_le32(&scan_manager_base->en, 1 << io_scan_chain_id);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int scan_mgr_configure_iocsr(void)
|
||||
{
|
||||
int status = 0;
|
||||
|
||||
/* configure the IOCSR through scan chain */
|
||||
status |= scan_mgr_io_scan_chain_prg(0,
|
||||
CONFIG_HPS_IOCSR_SCANCHAIN0_LENGTH, iocsr_scan_chain0_table);
|
||||
status |= scan_mgr_io_scan_chain_prg(1,
|
||||
CONFIG_HPS_IOCSR_SCANCHAIN1_LENGTH, iocsr_scan_chain1_table);
|
||||
status |= scan_mgr_io_scan_chain_prg(2,
|
||||
CONFIG_HPS_IOCSR_SCANCHAIN2_LENGTH, iocsr_scan_chain2_table);
|
||||
status |= scan_mgr_io_scan_chain_prg(3,
|
||||
CONFIG_HPS_IOCSR_SCANCHAIN3_LENGTH, iocsr_scan_chain3_table);
|
||||
return status;
|
||||
}
|
@ -121,6 +121,10 @@ void spl_board_init(void)
|
||||
/* reconfigure the PLLs */
|
||||
cm_basic_init(&cm_default_cfg);
|
||||
|
||||
/* configure the IOCSR / IO buffer settings */
|
||||
if (scan_mgr_configure_iocsr())
|
||||
hang();
|
||||
|
||||
/* configure the pin muxing through system manager */
|
||||
sysmgr_pinmux_init();
|
||||
#endif /* CONFIG_SOCFPGA_VIRTUAL_TARGET */
|
||||
|
@ -328,7 +328,7 @@ static int tegra_display_decode_config(const void *blob,
|
||||
rgb = fdt_subnode_offset(blob, node, "rgb");
|
||||
|
||||
config->panel_node = fdtdec_lookup_phandle(blob, rgb, "nvidia,panel");
|
||||
if (!config->panel_node < 0) {
|
||||
if (config->panel_node < 0) {
|
||||
debug("%s: Cannot find panel information\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
@ -18,6 +18,7 @@ SECTIONS
|
||||
.text :
|
||||
{
|
||||
*(.__image_copy_start)
|
||||
*(.vectors)
|
||||
CPUDIR/start.o (.text*)
|
||||
*(.text*)
|
||||
}
|
||||
|
@ -12,15 +12,14 @@
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#ifndef CONFIG_SYS_DCACHE_OFF
|
||||
|
||||
static void set_pgtable_section(u64 section, u64 memory_type)
|
||||
void set_pgtable_section(u64 *page_table, u64 index, u64 section,
|
||||
u64 memory_type)
|
||||
{
|
||||
u64 *page_table = (u64 *)gd->arch.tlb_addr;
|
||||
u64 value;
|
||||
|
||||
value = (section << SECTION_SHIFT) | PMD_TYPE_SECT | PMD_SECT_AF;
|
||||
value = section | PMD_TYPE_SECT | PMD_SECT_AF;
|
||||
value |= PMD_ATTRINDX(memory_type);
|
||||
page_table[section] = value;
|
||||
page_table[index] = value;
|
||||
}
|
||||
|
||||
/* to activate the MMU we need to set up virtual memory */
|
||||
@ -28,10 +27,13 @@ static void mmu_setup(void)
|
||||
{
|
||||
int i, j, el;
|
||||
bd_t *bd = gd->bd;
|
||||
u64 *page_table = (u64 *)gd->arch.tlb_addr;
|
||||
|
||||
/* Setup an identity-mapping for all spaces */
|
||||
for (i = 0; i < (PGTABLE_SIZE >> 3); i++)
|
||||
set_pgtable_section(i, MT_DEVICE_NGNRNE);
|
||||
for (i = 0; i < (PGTABLE_SIZE >> 3); i++) {
|
||||
set_pgtable_section(page_table, i, i << SECTION_SHIFT,
|
||||
MT_DEVICE_NGNRNE);
|
||||
}
|
||||
|
||||
/* Setup an identity-mapping for all RAM space */
|
||||
for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
|
||||
@ -39,38 +41,26 @@ static void mmu_setup(void)
|
||||
ulong end = bd->bi_dram[i].start + bd->bi_dram[i].size;
|
||||
for (j = start >> SECTION_SHIFT;
|
||||
j < end >> SECTION_SHIFT; j++) {
|
||||
set_pgtable_section(j, MT_NORMAL);
|
||||
set_pgtable_section(page_table, j, j << SECTION_SHIFT,
|
||||
MT_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
/* load TTBR0 */
|
||||
el = current_el();
|
||||
if (el == 1) {
|
||||
asm volatile("msr ttbr0_el1, %0"
|
||||
: : "r" (gd->arch.tlb_addr) : "memory");
|
||||
asm volatile("msr tcr_el1, %0"
|
||||
: : "r" (TCR_FLAGS | TCR_EL1_IPS_BITS)
|
||||
: "memory");
|
||||
asm volatile("msr mair_el1, %0"
|
||||
: : "r" (MEMORY_ATTRIBUTES) : "memory");
|
||||
set_ttbr_tcr_mair(el, gd->arch.tlb_addr,
|
||||
TCR_FLAGS | TCR_EL1_IPS_BITS,
|
||||
MEMORY_ATTRIBUTES);
|
||||
} else if (el == 2) {
|
||||
asm volatile("msr ttbr0_el2, %0"
|
||||
: : "r" (gd->arch.tlb_addr) : "memory");
|
||||
asm volatile("msr tcr_el2, %0"
|
||||
: : "r" (TCR_FLAGS | TCR_EL2_IPS_BITS)
|
||||
: "memory");
|
||||
asm volatile("msr mair_el2, %0"
|
||||
: : "r" (MEMORY_ATTRIBUTES) : "memory");
|
||||
set_ttbr_tcr_mair(el, gd->arch.tlb_addr,
|
||||
TCR_FLAGS | TCR_EL2_IPS_BITS,
|
||||
MEMORY_ATTRIBUTES);
|
||||
} else {
|
||||
asm volatile("msr ttbr0_el3, %0"
|
||||
: : "r" (gd->arch.tlb_addr) : "memory");
|
||||
asm volatile("msr tcr_el3, %0"
|
||||
: : "r" (TCR_FLAGS | TCR_EL2_IPS_BITS)
|
||||
: "memory");
|
||||
asm volatile("msr mair_el3, %0"
|
||||
: : "r" (MEMORY_ATTRIBUTES) : "memory");
|
||||
set_ttbr_tcr_mair(el, gd->arch.tlb_addr,
|
||||
TCR_FLAGS | TCR_EL3_IPS_BITS,
|
||||
MEMORY_ATTRIBUTES);
|
||||
}
|
||||
|
||||
/* enable the mmu */
|
||||
set_sctlr(get_sctlr() | CR_M);
|
||||
}
|
||||
@ -83,12 +73,17 @@ void invalidate_dcache_all(void)
|
||||
__asm_invalidate_dcache_all();
|
||||
}
|
||||
|
||||
void __weak flush_l3_cache(void)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs a clean & invalidation of the entire data cache at all levels
|
||||
*/
|
||||
void flush_dcache_all(void)
|
||||
{
|
||||
__asm_flush_dcache_all();
|
||||
flush_l3_cache();
|
||||
}
|
||||
|
||||
/*
|
||||
@ -221,7 +216,7 @@ void invalidate_icache_all(void)
|
||||
* Enable dCache & iCache, whether cache is actually enabled
|
||||
* depend on CONFIG_SYS_DCACHE_OFF and CONFIG_SYS_ICACHE_OFF
|
||||
*/
|
||||
void enable_caches(void)
|
||||
void __weak enable_caches(void)
|
||||
{
|
||||
icache_enable();
|
||||
dcache_enable();
|
||||
|
9
arch/arm/cpu/armv8/fsl-lsch3/Makefile
Normal file
9
arch/arm/cpu/armv8/fsl-lsch3/Makefile
Normal file
@ -0,0 +1,9 @@
|
||||
#
|
||||
# Copyright 2014, Freescale Semiconductor
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
obj-y += cpu.o
|
||||
obj-y += lowlevel.o
|
||||
obj-y += speed.o
|
10
arch/arm/cpu/armv8/fsl-lsch3/README
Normal file
10
arch/arm/cpu/armv8/fsl-lsch3/README
Normal file
@ -0,0 +1,10 @@
|
||||
#
|
||||
# Copyright 2014 Freescale Semiconductor
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
Freescale LayerScape with Chassis Generation 3
|
||||
|
||||
This architecture supports Freescale ARMv8 SoCs with Chassis generation 3,
|
||||
for example LS2085A.
|
436
arch/arm/cpu/armv8/fsl-lsch3/cpu.c
Normal file
436
arch/arm/cpu/armv8/fsl-lsch3/cpu.c
Normal file
@ -0,0 +1,436 @@
|
||||
/*
|
||||
* Copyright 2014 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/armv8/mmu.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch-fsl-lsch3/immap_lsch3.h>
|
||||
#include "cpu.h"
|
||||
#include "speed.h"
|
||||
#include <fsl_mc.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#ifndef CONFIG_SYS_DCACHE_OFF
|
||||
/*
|
||||
* To start MMU before DDR is available, we create MMU table in SRAM.
|
||||
* The base address of SRAM is CONFIG_SYS_FSL_OCRAM_BASE. We use three
|
||||
* levels of translation tables here to cover 40-bit address space.
|
||||
* We use 4KB granule size, with 40 bits physical address, T0SZ=24
|
||||
* Level 0 IA[39], table address @0
|
||||
* Level 1 IA[31:30], table address @01000, 0x2000
|
||||
* Level 2 IA[29:21], table address @0x3000
|
||||
*/
|
||||
|
||||
#define SECTION_SHIFT_L0 39UL
|
||||
#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 CONFIG_SYS_IFC_BASE 0x30000000
|
||||
#define CONFIG_SYS_IFC_SIZE 0x10000000
|
||||
#define CONFIG_SYS_IFC_BASE2 0x500000000
|
||||
#define CONFIG_SYS_IFC_SIZE2 0x100000000
|
||||
#define TCR_EL2_PS_40BIT (2 << 16)
|
||||
#define LSCH3_VA_BITS (40)
|
||||
#define LSCH3_TCR (TCR_TG0_4K | \
|
||||
TCR_EL2_PS_40BIT | \
|
||||
TCR_SHARED_NON | \
|
||||
TCR_ORGN_NC | \
|
||||
TCR_IRGN_NC | \
|
||||
TCR_T0SZ(LSCH3_VA_BITS))
|
||||
|
||||
/*
|
||||
* Final MMU
|
||||
* Let's start from the same layout as early MMU and modify as needed.
|
||||
* IFC regions will be cache-inhibit.
|
||||
*/
|
||||
#define FINAL_QBMAN_CACHED_MEM 0x818000000UL
|
||||
#define FINAL_QBMAN_CACHED_SIZE 0x4000000
|
||||
|
||||
|
||||
static inline void early_mmu_setup(void)
|
||||
{
|
||||
int el;
|
||||
u64 i;
|
||||
u64 section_l1t0, section_l1t1, section_l2;
|
||||
u64 *level0_table = (u64 *)CONFIG_SYS_FSL_OCRAM_BASE;
|
||||
u64 *level1_table_0 = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x1000);
|
||||
u64 *level1_table_1 = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x2000);
|
||||
u64 *level2_table = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x3000);
|
||||
|
||||
|
||||
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 to cache_inhibit, covering 0 to 512GB
|
||||
* set level 1 table 1 to cache enabled, covering 512GB to 1TB
|
||||
* set level 2 table to cache-inhibit, covering 0 to 1GB
|
||||
*/
|
||||
section_l1t0 = 0;
|
||||
section_l1t1 = BLOCK_SIZE_L0;
|
||||
section_l2 = 0;
|
||||
for (i = 0; i < 512; i++) {
|
||||
set_pgtable_section(level1_table_0, i, section_l1t0,
|
||||
MT_DEVICE_NGNRNE);
|
||||
set_pgtable_section(level1_table_1, i, section_l1t1,
|
||||
MT_NORMAL);
|
||||
set_pgtable_section(level2_table, i, section_l2,
|
||||
MT_DEVICE_NGNRNE);
|
||||
section_l1t0 += BLOCK_SIZE_L1;
|
||||
section_l1t1 += BLOCK_SIZE_L1;
|
||||
section_l2 += BLOCK_SIZE_L2;
|
||||
}
|
||||
|
||||
level1_table_0[0] =
|
||||
(u64)level2_table | PMD_TYPE_TABLE;
|
||||
level1_table_0[1] =
|
||||
0x40000000 | PMD_SECT_AF | PMD_TYPE_SECT |
|
||||
PMD_ATTRINDX(MT_DEVICE_NGNRNE);
|
||||
level1_table_0[2] =
|
||||
0x80000000 | PMD_SECT_AF | PMD_TYPE_SECT |
|
||||
PMD_ATTRINDX(MT_NORMAL);
|
||||
level1_table_0[3] =
|
||||
0xc0000000 | PMD_SECT_AF | PMD_TYPE_SECT |
|
||||
PMD_ATTRINDX(MT_NORMAL);
|
||||
|
||||
/* Rewrite table to enable cache */
|
||||
set_pgtable_section(level2_table,
|
||||
CONFIG_SYS_FSL_OCRAM_BASE >> SECTION_SHIFT_L2,
|
||||
CONFIG_SYS_FSL_OCRAM_BASE,
|
||||
MT_NORMAL);
|
||||
for (i = CONFIG_SYS_IFC_BASE >> SECTION_SHIFT_L2;
|
||||
i < (CONFIG_SYS_IFC_BASE + CONFIG_SYS_IFC_SIZE)
|
||||
>> SECTION_SHIFT_L2; i++) {
|
||||
section_l2 = i << SECTION_SHIFT_L2;
|
||||
set_pgtable_section(level2_table, i,
|
||||
section_l2, MT_NORMAL);
|
||||
}
|
||||
|
||||
el = current_el();
|
||||
set_ttbr_tcr_mair(el, (u64)level0_table, LSCH3_TCR, MEMORY_ATTRIBUTES);
|
||||
set_sctlr(get_sctlr() | CR_M);
|
||||
}
|
||||
|
||||
/*
|
||||
* This final tale looks similar to early table, but different in detail.
|
||||
* These tables are in regular memory. Cache on IFC is disabled. One sub table
|
||||
* is added to enable cache for QBMan.
|
||||
*/
|
||||
static inline void final_mmu_setup(void)
|
||||
{
|
||||
int el;
|
||||
u64 i, tbl_base, tbl_limit, section_base;
|
||||
u64 section_l1t0, section_l1t1, section_l2;
|
||||
u64 *level0_table = (u64 *)gd->arch.tlb_addr;
|
||||
u64 *level1_table_0 = (u64 *)(gd->arch.tlb_addr + 0x1000);
|
||||
u64 *level1_table_1 = (u64 *)(gd->arch.tlb_addr + 0x2000);
|
||||
u64 *level2_table_0 = (u64 *)(gd->arch.tlb_addr + 0x3000);
|
||||
u64 *level2_table_1 = (u64 *)(gd->arch.tlb_addr + 0x4000);
|
||||
|
||||
|
||||
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 to cache_inhibit, covering 0 to 512GB
|
||||
* set level 1 table 1 to cache enabled, covering 512GB to 1TB
|
||||
* set level 2 table 0 to cache-inhibit, covering 0 to 1GB
|
||||
*/
|
||||
section_l1t0 = 0;
|
||||
section_l1t1 = BLOCK_SIZE_L0;
|
||||
section_l2 = 0;
|
||||
for (i = 0; i < 512; i++) {
|
||||
set_pgtable_section(level1_table_0, i, section_l1t0,
|
||||
MT_DEVICE_NGNRNE);
|
||||
set_pgtable_section(level1_table_1, i, section_l1t1,
|
||||
MT_NORMAL);
|
||||
set_pgtable_section(level2_table_0, i, section_l2,
|
||||
MT_DEVICE_NGNRNE);
|
||||
section_l1t0 += BLOCK_SIZE_L1;
|
||||
section_l1t1 += BLOCK_SIZE_L1;
|
||||
section_l2 += BLOCK_SIZE_L2;
|
||||
}
|
||||
|
||||
level1_table_0[0] =
|
||||
(u64)level2_table_0 | PMD_TYPE_TABLE;
|
||||
level1_table_0[2] =
|
||||
0x80000000 | PMD_SECT_AF | PMD_TYPE_SECT |
|
||||
PMD_ATTRINDX(MT_NORMAL);
|
||||
level1_table_0[3] =
|
||||
0xc0000000 | PMD_SECT_AF | PMD_TYPE_SECT |
|
||||
PMD_ATTRINDX(MT_NORMAL);
|
||||
|
||||
/* Rewrite table to enable cache */
|
||||
set_pgtable_section(level2_table_0,
|
||||
CONFIG_SYS_FSL_OCRAM_BASE >> SECTION_SHIFT_L2,
|
||||
CONFIG_SYS_FSL_OCRAM_BASE,
|
||||
MT_NORMAL);
|
||||
|
||||
/*
|
||||
* Fill in other part of tables if cache is needed
|
||||
* If finer granularity than 1GB is needed, sub table
|
||||
* should be created.
|
||||
*/
|
||||
section_base = FINAL_QBMAN_CACHED_MEM & ~(BLOCK_SIZE_L1 - 1);
|
||||
i = section_base >> SECTION_SHIFT_L1;
|
||||
level1_table_0[i] = (u64)level2_table_1 | PMD_TYPE_TABLE;
|
||||
section_l2 = section_base;
|
||||
for (i = 0; i < 512; i++) {
|
||||
set_pgtable_section(level2_table_1, i, section_l2,
|
||||
MT_DEVICE_NGNRNE);
|
||||
section_l2 += BLOCK_SIZE_L2;
|
||||
}
|
||||
tbl_base = FINAL_QBMAN_CACHED_MEM & (BLOCK_SIZE_L1 - 1);
|
||||
tbl_limit = (FINAL_QBMAN_CACHED_MEM + FINAL_QBMAN_CACHED_SIZE) &
|
||||
(BLOCK_SIZE_L1 - 1);
|
||||
for (i = tbl_base >> SECTION_SHIFT_L2;
|
||||
i < tbl_limit >> SECTION_SHIFT_L2; i++) {
|
||||
section_l2 = section_base + (i << SECTION_SHIFT_L2);
|
||||
set_pgtable_section(level2_table_1, i,
|
||||
section_l2, MT_NORMAL);
|
||||
}
|
||||
|
||||
/* 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();
|
||||
asm volatile("dsb sy");
|
||||
if (el == 1) {
|
||||
asm volatile("msr ttbr0_el1, %0"
|
||||
: : "r" ((u64)level0_table) : "memory");
|
||||
} else if (el == 2) {
|
||||
asm volatile("msr ttbr0_el2, %0"
|
||||
: : "r" ((u64)level0_table) : "memory");
|
||||
} else if (el == 3) {
|
||||
asm volatile("msr ttbr0_el3, %0"
|
||||
: : "r" ((u64)level0_table) : "memory");
|
||||
} else {
|
||||
hang();
|
||||
}
|
||||
asm volatile("isb");
|
||||
|
||||
/*
|
||||
* MMU is already enabled, just need to invalidate TLB to load the
|
||||
* new table. The new table is compatible with the current table, if
|
||||
* MMU somehow walks through the new table before invalidation TLB,
|
||||
* it still works. So we don't need to turn off MMU here.
|
||||
*/
|
||||
}
|
||||
|
||||
int arch_cpu_init(void)
|
||||
{
|
||||
icache_enable();
|
||||
__asm_invalidate_dcache_all();
|
||||
__asm_invalidate_tlb_all();
|
||||
early_mmu_setup();
|
||||
set_sctlr(get_sctlr() | CR_C);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* flush_l3_cache
|
||||
* Dickens L3 cache can be flushed by transitioning from FAM to SFONLY power
|
||||
* state, by writing to HP-F P-state request register.
|
||||
* Fixme: This function should moved to a common file if other SoCs also use
|
||||
* the same Dickens.
|
||||
*/
|
||||
#define HNF0_PSTATE_REQ 0x04200010
|
||||
#define HNF1_PSTATE_REQ 0x04210010
|
||||
#define HNF2_PSTATE_REQ 0x04220010
|
||||
#define HNF3_PSTATE_REQ 0x04230010
|
||||
#define HNF4_PSTATE_REQ 0x04240010
|
||||
#define HNF5_PSTATE_REQ 0x04250010
|
||||
#define HNF6_PSTATE_REQ 0x04260010
|
||||
#define HNF7_PSTATE_REQ 0x04270010
|
||||
#define HNFPSTAT_MASK (0xFFFFFFFFFFFFFFFC)
|
||||
#define HNFPSTAT_FAM 0x3
|
||||
#define HNFPSTAT_SFONLY 0x01
|
||||
|
||||
static void hnf_pstate_req(u64 *ptr, u64 state)
|
||||
{
|
||||
int timeout = 1000;
|
||||
out_le64(ptr, (in_le64(ptr) & HNFPSTAT_MASK) | (state & 0x3));
|
||||
ptr++;
|
||||
/* checking if the transition is completed */
|
||||
while (timeout > 0) {
|
||||
if (((in_le64(ptr) & 0x0c) >> 2) == (state & 0x3))
|
||||
break;
|
||||
udelay(100);
|
||||
timeout--;
|
||||
}
|
||||
}
|
||||
|
||||
void flush_l3_cache(void)
|
||||
{
|
||||
hnf_pstate_req((u64 *)HNF0_PSTATE_REQ, HNFPSTAT_SFONLY);
|
||||
hnf_pstate_req((u64 *)HNF1_PSTATE_REQ, HNFPSTAT_SFONLY);
|
||||
hnf_pstate_req((u64 *)HNF2_PSTATE_REQ, HNFPSTAT_SFONLY);
|
||||
hnf_pstate_req((u64 *)HNF3_PSTATE_REQ, HNFPSTAT_SFONLY);
|
||||
hnf_pstate_req((u64 *)HNF4_PSTATE_REQ, HNFPSTAT_SFONLY);
|
||||
hnf_pstate_req((u64 *)HNF5_PSTATE_REQ, HNFPSTAT_SFONLY);
|
||||
hnf_pstate_req((u64 *)HNF6_PSTATE_REQ, HNFPSTAT_SFONLY);
|
||||
hnf_pstate_req((u64 *)HNF7_PSTATE_REQ, HNFPSTAT_SFONLY);
|
||||
hnf_pstate_req((u64 *)HNF0_PSTATE_REQ, HNFPSTAT_FAM);
|
||||
hnf_pstate_req((u64 *)HNF1_PSTATE_REQ, HNFPSTAT_FAM);
|
||||
hnf_pstate_req((u64 *)HNF2_PSTATE_REQ, HNFPSTAT_FAM);
|
||||
hnf_pstate_req((u64 *)HNF3_PSTATE_REQ, HNFPSTAT_FAM);
|
||||
hnf_pstate_req((u64 *)HNF4_PSTATE_REQ, HNFPSTAT_FAM);
|
||||
hnf_pstate_req((u64 *)HNF5_PSTATE_REQ, HNFPSTAT_FAM);
|
||||
hnf_pstate_req((u64 *)HNF6_PSTATE_REQ, HNFPSTAT_FAM);
|
||||
hnf_pstate_req((u64 *)HNF7_PSTATE_REQ, HNFPSTAT_FAM);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
final_mmu_setup();
|
||||
__asm_invalidate_tlb_all();
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline u32 initiator_type(u32 cluster, int init_id)
|
||||
{
|
||||
struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||
u32 idx = (cluster >> (init_id * 8)) & TP_CLUSTER_INIT_MASK;
|
||||
u32 type = in_le32(&gur->tp_ityp[idx]);
|
||||
|
||||
if (type & TP_ITYP_AV)
|
||||
return type;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
u32 cpu_mask(void)
|
||||
{
|
||||
struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||
int i = 0, count = 0;
|
||||
u32 cluster, type, mask = 0;
|
||||
|
||||
do {
|
||||
int j;
|
||||
cluster = in_le32(&gur->tp_cluster[i].lower);
|
||||
for (j = 0; j < TP_INIT_PER_CLUSTER; j++) {
|
||||
type = initiator_type(cluster, j);
|
||||
if (type) {
|
||||
if (TP_ITYP_TYPE(type) == TP_ITYP_TYPE_ARM)
|
||||
mask |= 1 << count;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
} while ((cluster & TP_CLUSTER_EOC) != TP_CLUSTER_EOC);
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the number of cores on this SOC.
|
||||
*/
|
||||
int cpu_numcores(void)
|
||||
{
|
||||
return hweight32(cpu_mask());
|
||||
}
|
||||
|
||||
int fsl_qoriq_core_to_cluster(unsigned int core)
|
||||
{
|
||||
struct ccsr_gur __iomem *gur =
|
||||
(void __iomem *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||
int i = 0, count = 0;
|
||||
u32 cluster;
|
||||
|
||||
do {
|
||||
int j;
|
||||
cluster = in_le32(&gur->tp_cluster[i].lower);
|
||||
for (j = 0; j < TP_INIT_PER_CLUSTER; j++) {
|
||||
if (initiator_type(cluster, j)) {
|
||||
if (count == core)
|
||||
return i;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
} while ((cluster & TP_CLUSTER_EOC) != TP_CLUSTER_EOC);
|
||||
|
||||
return -1; /* cannot identify the cluster */
|
||||
}
|
||||
|
||||
u32 fsl_qoriq_core_to_type(unsigned int core)
|
||||
{
|
||||
struct ccsr_gur __iomem *gur =
|
||||
(void __iomem *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||
int i = 0, count = 0;
|
||||
u32 cluster, type;
|
||||
|
||||
do {
|
||||
int j;
|
||||
cluster = in_le32(&gur->tp_cluster[i].lower);
|
||||
for (j = 0; j < TP_INIT_PER_CLUSTER; j++) {
|
||||
type = initiator_type(cluster, j);
|
||||
if (type) {
|
||||
if (count == core)
|
||||
return type;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
} while ((cluster & TP_CLUSTER_EOC) != TP_CLUSTER_EOC);
|
||||
|
||||
return -1; /* cannot identify the cluster */
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DISPLAY_CPUINFO
|
||||
int print_cpuinfo(void)
|
||||
{
|
||||
struct sys_info sysinfo;
|
||||
char buf[32];
|
||||
unsigned int i, core;
|
||||
u32 type;
|
||||
|
||||
get_sys_info(&sysinfo);
|
||||
puts("Clock Configuration:");
|
||||
for_each_cpu(i, core, cpu_numcores(), cpu_mask()) {
|
||||
if (!(i % 3))
|
||||
puts("\n ");
|
||||
type = TP_ITYP_VER(fsl_qoriq_core_to_type(core));
|
||||
printf("CPU%d(%s):%-4s MHz ", core,
|
||||
type == TY_ITYP_VER_A7 ? "A7 " :
|
||||
(type == TY_ITYP_VER_A53 ? "A53" :
|
||||
(type == TY_ITYP_VER_A57 ? "A57" : " ")),
|
||||
strmhz(buf, sysinfo.freq_processor[core]));
|
||||
}
|
||||
printf("\n Bus: %-4s MHz ",
|
||||
strmhz(buf, sysinfo.freq_systembus));
|
||||
printf("DDR: %-4s MHz", strmhz(buf, sysinfo.freq_ddrbus));
|
||||
puts("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int cpu_eth_init(bd_t *bis)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
#ifdef CONFIG_FSL_MC_ENET
|
||||
error = mc_init(bis);
|
||||
#endif
|
||||
return error;
|
||||
}
|
7
arch/arm/cpu/armv8/fsl-lsch3/cpu.h
Normal file
7
arch/arm/cpu/armv8/fsl-lsch3/cpu.h
Normal file
@ -0,0 +1,7 @@
|
||||
/*
|
||||
* Copyright 2014, Freescale Semiconductor
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
int fsl_qoriq_core_to_cluster(unsigned int core);
|
65
arch/arm/cpu/armv8/fsl-lsch3/lowlevel.S
Normal file
65
arch/arm/cpu/armv8/fsl-lsch3/lowlevel.S
Normal file
@ -0,0 +1,65 @@
|
||||
/*
|
||||
* (C) Copyright 2014 Freescale Semiconductor
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*
|
||||
* Extracted from armv8/start.S
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/macro.h>
|
||||
|
||||
ENTRY(lowlevel_init)
|
||||
mov x29, lr /* Save LR */
|
||||
|
||||
/* Set the SMMU page size in the sACR register */
|
||||
ldr x1, =SMMU_BASE
|
||||
ldr w0, [x1, #0x10]
|
||||
orr w0, w0, #1 << 16 /* set sACR.pagesize to indicate 64K page */
|
||||
str w0, [x1, #0x10]
|
||||
|
||||
/* Initialize GIC Secure Bank Status */
|
||||
#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
|
||||
branch_if_slave x0, 1f
|
||||
ldr x0, =GICD_BASE
|
||||
bl gic_init_secure
|
||||
1:
|
||||
#ifdef CONFIG_GICV3
|
||||
ldr x0, =GICR_BASE
|
||||
bl gic_init_secure_percpu
|
||||
#elif defined(CONFIG_GICV2)
|
||||
ldr x0, =GICD_BASE
|
||||
ldr x1, =GICC_BASE
|
||||
bl gic_init_secure_percpu
|
||||
#endif
|
||||
#endif
|
||||
|
||||
branch_if_master x0, x1, 1f
|
||||
|
||||
/*
|
||||
* Slave should wait for master clearing spin table.
|
||||
* This sync prevent salves observing incorrect
|
||||
* value of spin table and jumping to wrong place.
|
||||
*/
|
||||
#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
|
||||
#ifdef CONFIG_GICV2
|
||||
ldr x0, =GICC_BASE
|
||||
#endif
|
||||
bl gic_wait_for_interrupt
|
||||
#endif
|
||||
|
||||
/*
|
||||
* All processors will enter EL2 and optionally EL1.
|
||||
*/
|
||||
bl armv8_switch_to_el2
|
||||
#ifdef CONFIG_ARMV8_SWITCH_TO_EL1
|
||||
bl armv8_switch_to_el1
|
||||
#endif
|
||||
b 2f
|
||||
|
||||
1:
|
||||
2:
|
||||
mov lr, x29 /* Restore LR */
|
||||
ret
|
||||
ENDPROC(lowlevel_init)
|
176
arch/arm/cpu/armv8/fsl-lsch3/speed.c
Normal file
176
arch/arm/cpu/armv8/fsl-lsch3/speed.c
Normal file
@ -0,0 +1,176 @@
|
||||
/*
|
||||
* Copyright 2014, Freescale Semiconductor, Inc.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*
|
||||
* Derived from arch/power/cpu/mpc85xx/speed.c
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <fsl_ifc.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch-fsl-lsch3/immap_lsch3.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include "cpu.h"
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#ifndef CONFIG_SYS_FSL_NUM_CC_PLLS
|
||||
#define CONFIG_SYS_FSL_NUM_CC_PLLS 6
|
||||
#endif
|
||||
|
||||
|
||||
void get_sys_info(struct sys_info *sys_info)
|
||||
{
|
||||
struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||
#ifdef CONFIG_FSL_IFC
|
||||
struct fsl_ifc *ifc_regs = (void *)CONFIG_SYS_IFC_ADDR;
|
||||
u32 ccr;
|
||||
#endif
|
||||
struct ccsr_clk_cluster_group __iomem *clk_grp[2] = {
|
||||
(void *)(CONFIG_SYS_FSL_CH3_CLK_GRPA_ADDR),
|
||||
(void *)(CONFIG_SYS_FSL_CH3_CLK_GRPB_ADDR)
|
||||
};
|
||||
struct ccsr_clk_ctrl __iomem *clk_ctrl =
|
||||
(void *)(CONFIG_SYS_FSL_CH3_CLK_CTRL_ADDR);
|
||||
unsigned int cpu;
|
||||
const u8 core_cplx_pll[16] = {
|
||||
[0] = 0, /* CC1 PPL / 1 */
|
||||
[1] = 0, /* CC1 PPL / 2 */
|
||||
[2] = 0, /* CC1 PPL / 4 */
|
||||
[4] = 1, /* CC2 PPL / 1 */
|
||||
[5] = 1, /* CC2 PPL / 2 */
|
||||
[6] = 1, /* CC2 PPL / 4 */
|
||||
[8] = 2, /* CC3 PPL / 1 */
|
||||
[9] = 2, /* CC3 PPL / 2 */
|
||||
[10] = 2, /* CC3 PPL / 4 */
|
||||
[12] = 3, /* CC4 PPL / 1 */
|
||||
[13] = 3, /* CC4 PPL / 2 */
|
||||
[14] = 3, /* CC4 PPL / 4 */
|
||||
};
|
||||
|
||||
const u8 core_cplx_pll_div[16] = {
|
||||
[0] = 1, /* CC1 PPL / 1 */
|
||||
[1] = 2, /* CC1 PPL / 2 */
|
||||
[2] = 4, /* CC1 PPL / 4 */
|
||||
[4] = 1, /* CC2 PPL / 1 */
|
||||
[5] = 2, /* CC2 PPL / 2 */
|
||||
[6] = 4, /* CC2 PPL / 4 */
|
||||
[8] = 1, /* CC3 PPL / 1 */
|
||||
[9] = 2, /* CC3 PPL / 2 */
|
||||
[10] = 4, /* CC3 PPL / 4 */
|
||||
[12] = 1, /* CC4 PPL / 1 */
|
||||
[13] = 2, /* CC4 PPL / 2 */
|
||||
[14] = 4, /* CC4 PPL / 4 */
|
||||
};
|
||||
|
||||
uint i, cluster;
|
||||
uint freq_c_pll[CONFIG_SYS_FSL_NUM_CC_PLLS];
|
||||
uint ratio[CONFIG_SYS_FSL_NUM_CC_PLLS];
|
||||
unsigned long sysclk = CONFIG_SYS_CLK_FREQ;
|
||||
int cc_group[12] = CONFIG_SYS_FSL_CLUSTER_CLOCKS;
|
||||
u32 c_pll_sel, cplx_pll;
|
||||
void *offset;
|
||||
|
||||
sys_info->freq_systembus = sysclk;
|
||||
#ifdef CONFIG_DDR_CLK_FREQ
|
||||
sys_info->freq_ddrbus = CONFIG_DDR_CLK_FREQ;
|
||||
#else
|
||||
sys_info->freq_ddrbus = sysclk;
|
||||
#endif
|
||||
|
||||
sys_info->freq_systembus *= (in_le32(&gur->rcwsr[0]) >>
|
||||
FSL_CHASSIS3_RCWSR0_SYS_PLL_RAT_SHIFT) &
|
||||
FSL_CHASSIS3_RCWSR0_SYS_PLL_RAT_MASK;
|
||||
sys_info->freq_ddrbus *= (in_le32(&gur->rcwsr[0]) >>
|
||||
FSL_CHASSIS3_RCWSR0_MEM_PLL_RAT_SHIFT) &
|
||||
FSL_CHASSIS3_RCWSR0_MEM_PLL_RAT_MASK;
|
||||
|
||||
for (i = 0; i < CONFIG_SYS_FSL_NUM_CC_PLLS; i++) {
|
||||
/*
|
||||
* fixme: prefer to combine the following into one line, but
|
||||
* cannot pass compiling without warning about in_le32.
|
||||
*/
|
||||
offset = (void *)((size_t)clk_grp[i/3] +
|
||||
offsetof(struct ccsr_clk_cluster_group,
|
||||
pllngsr[i%3].gsr));
|
||||
ratio[i] = (in_le32(offset) >> 1) & 0x3f;
|
||||
if (ratio[i] > 4)
|
||||
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()) {
|
||||
cluster = fsl_qoriq_core_to_cluster(cpu);
|
||||
c_pll_sel = (in_le32(&clk_ctrl->clkcncsr[cluster].csr) >> 27)
|
||||
& 0xf;
|
||||
cplx_pll = core_cplx_pll[c_pll_sel];
|
||||
cplx_pll += cc_group[cluster] - 1;
|
||||
sys_info->freq_processor[cpu] =
|
||||
freq_c_pll[cplx_pll] / core_cplx_pll_div[c_pll_sel];
|
||||
}
|
||||
|
||||
#if defined(CONFIG_FSL_IFC)
|
||||
ccr = in_le32(&ifc_regs->ifc_ccr);
|
||||
ccr = ((ccr & IFC_CCR_CLK_DIV_MASK) >> IFC_CCR_CLK_DIV_SHIFT) + 1;
|
||||
|
||||
sys_info->freq_localbus = sys_info->freq_systembus / ccr;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
int get_clocks(void)
|
||||
{
|
||||
struct sys_info sys_info;
|
||||
get_sys_info(&sys_info);
|
||||
gd->cpu_clk = sys_info.freq_processor[0];
|
||||
gd->bus_clk = sys_info.freq_systembus;
|
||||
gd->mem_clk = sys_info.freq_ddrbus;
|
||||
|
||||
#if defined(CONFIG_FSL_ESDHC)
|
||||
gd->arch.sdhc_clk = gd->bus_clk / 2;
|
||||
#endif /* defined(CONFIG_FSL_ESDHC) */
|
||||
|
||||
if (gd->cpu_clk != 0)
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
/********************************************
|
||||
* get_bus_freq
|
||||
* return system bus freq in Hz
|
||||
*********************************************/
|
||||
ulong get_bus_freq(ulong dummy)
|
||||
{
|
||||
if (!gd->bus_clk)
|
||||
get_clocks();
|
||||
|
||||
return gd->bus_clk;
|
||||
}
|
||||
|
||||
/********************************************
|
||||
* get_ddr_freq
|
||||
* return ddr bus freq in Hz
|
||||
*********************************************/
|
||||
ulong get_ddr_freq(ulong dummy)
|
||||
{
|
||||
if (!gd->mem_clk)
|
||||
get_clocks();
|
||||
|
||||
return gd->mem_clk;
|
||||
}
|
||||
|
||||
unsigned int mxc_get_clock(enum mxc_clock clk)
|
||||
{
|
||||
switch (clk) {
|
||||
case MXC_I2C_CLK:
|
||||
return get_bus_freq(0) / 2;
|
||||
default:
|
||||
printf("Unsupported clock\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
7
arch/arm/cpu/armv8/fsl-lsch3/speed.h
Normal file
7
arch/arm/cpu/armv8/fsl-lsch3/speed.h
Normal file
@ -0,0 +1,7 @@
|
||||
/*
|
||||
* Copyright 2014, Freescale Semiconductor, Inc.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
void get_sys_info(struct sys_info *sys_info);
|
@ -43,7 +43,7 @@ ENTRY(armv8_switch_to_el1)
|
||||
mrs x0, cnthctl_el2
|
||||
orr x0, x0, #0x3 /* Enable EL1 access to timers */
|
||||
msr cnthctl_el2, x0
|
||||
msr cntvoff_el2, x0
|
||||
msr cntvoff_el2, xzr
|
||||
mrs x0, cntkctl_el1
|
||||
orr x0, x0, #0x3 /* Enable EL0 access to timers */
|
||||
msr cntkctl_el1, x0
|
||||
|
@ -20,6 +20,43 @@ static void at91_disable_wdt(void)
|
||||
writel(AT91_WDT_MR_WDDIS, &wdt->mr);
|
||||
}
|
||||
|
||||
static void switch_to_main_crystal_osc(void)
|
||||
{
|
||||
struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
|
||||
u32 tmp;
|
||||
|
||||
tmp = readl(&pmc->mor);
|
||||
tmp &= ~AT91_PMC_MOR_OSCOUNT(0xff);
|
||||
tmp &= ~AT91_PMC_MOR_KEY(0xff);
|
||||
tmp |= AT91_PMC_MOR_MOSCEN;
|
||||
tmp |= AT91_PMC_MOR_OSCOUNT(8);
|
||||
tmp |= AT91_PMC_MOR_KEY(0x37);
|
||||
writel(tmp, &pmc->mor);
|
||||
while (!(readl(&pmc->sr) & AT91_PMC_IXR_MOSCS))
|
||||
;
|
||||
|
||||
tmp = readl(&pmc->mor);
|
||||
tmp &= ~AT91_PMC_MOR_OSCBYPASS;
|
||||
tmp &= ~AT91_PMC_MOR_KEY(0xff);
|
||||
tmp |= AT91_PMC_MOR_KEY(0x37);
|
||||
writel(tmp, &pmc->mor);
|
||||
|
||||
tmp = readl(&pmc->mor);
|
||||
tmp |= AT91_PMC_MOR_MOSCSEL;
|
||||
tmp &= ~AT91_PMC_MOR_KEY(0xff);
|
||||
tmp |= AT91_PMC_MOR_KEY(0x37);
|
||||
writel(tmp, &pmc->mor);
|
||||
|
||||
while (!(readl(&pmc->sr) & AT91_PMC_IXR_MOSCSELS))
|
||||
;
|
||||
|
||||
tmp = readl(&pmc->mor);
|
||||
tmp &= ~AT91_PMC_MOR_MOSCRCEN;
|
||||
tmp &= ~AT91_PMC_MOR_KEY(0xff);
|
||||
tmp |= AT91_PMC_MOR_KEY(0x37);
|
||||
writel(tmp, &pmc->mor);
|
||||
}
|
||||
|
||||
void at91_plla_init(u32 pllar)
|
||||
{
|
||||
struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
|
||||
@ -76,6 +113,8 @@ u32 spl_boot_mode(void)
|
||||
|
||||
void s_init(void)
|
||||
{
|
||||
switch_to_main_crystal_osc();
|
||||
|
||||
/* disable watchdog */
|
||||
at91_disable_wdt();
|
||||
|
||||
|
@ -6,7 +6,8 @@ dtb-$(CONFIG_EXYNOS4) += exynos4210-origen.dtb \
|
||||
dtb-$(CONFIG_EXYNOS5) += exynos5250-arndale.dtb \
|
||||
exynos5250-snow.dtb \
|
||||
exynos5250-smdk5250.dtb \
|
||||
exynos5420-smdk5420.dtb
|
||||
exynos5420-smdk5420.dtb \
|
||||
exynos5420-peach-pit.dtb
|
||||
dtb-$(CONFIG_MX6) += imx6q-sabreauto.dtb
|
||||
dtb-$(CONFIG_TEGRA) += tegra20-harmony.dtb \
|
||||
tegra20-medcom-wide.dtb \
|
||||
@ -31,6 +32,7 @@ dtb-$(CONFIG_ZYNQ) += zynq-zc702.dtb \
|
||||
zynq-zc770-xm010.dtb \
|
||||
zynq-zc770-xm012.dtb \
|
||||
zynq-zc770-xm013.dtb
|
||||
dtb-$(CONFIG_AM33XX) += am335x-boneblack.dtb
|
||||
|
||||
targets += $(dtb-y)
|
||||
|
||||
|
262
arch/arm/dts/am335x-bone-common.dtsi
Normal file
262
arch/arm/dts/am335x-bone-common.dtsi
Normal file
@ -0,0 +1,262 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
/ {
|
||||
model = "TI AM335x BeagleBone";
|
||||
compatible = "ti,am335x-bone", "ti,am33xx";
|
||||
|
||||
cpus {
|
||||
cpu@0 {
|
||||
cpu0-supply = <&dcdc2_reg>;
|
||||
};
|
||||
};
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x80000000 0x10000000>; /* 256 MB */
|
||||
};
|
||||
|
||||
am33xx_pinmux: pinmux@44e10800 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&clkout2_pin>;
|
||||
|
||||
user_leds_s0: user_leds_s0 {
|
||||
pinctrl-single,pins = <
|
||||
0x54 (PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* gpmc_a5.gpio1_21 */
|
||||
0x58 (PIN_OUTPUT_PULLUP | MUX_MODE7) /* gpmc_a6.gpio1_22 */
|
||||
0x5c (PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* gpmc_a7.gpio1_23 */
|
||||
0x60 (PIN_OUTPUT_PULLUP | MUX_MODE7) /* gpmc_a8.gpio1_24 */
|
||||
>;
|
||||
};
|
||||
|
||||
i2c0_pins: pinmux_i2c0_pins {
|
||||
pinctrl-single,pins = <
|
||||
0x188 (PIN_INPUT_PULLUP | MUX_MODE0) /* i2c0_sda.i2c0_sda */
|
||||
0x18c (PIN_INPUT_PULLUP | MUX_MODE0) /* i2c0_scl.i2c0_scl */
|
||||
>;
|
||||
};
|
||||
|
||||
uart0_pins: pinmux_uart0_pins {
|
||||
pinctrl-single,pins = <
|
||||
0x170 (PIN_INPUT_PULLUP | MUX_MODE0) /* uart0_rxd.uart0_rxd */
|
||||
0x174 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* uart0_txd.uart0_txd */
|
||||
>;
|
||||
};
|
||||
|
||||
clkout2_pin: pinmux_clkout2_pin {
|
||||
pinctrl-single,pins = <
|
||||
0x1b4 (PIN_OUTPUT_PULLDOWN | MUX_MODE3) /* xdma_event_intr1.clkout2 */
|
||||
>;
|
||||
};
|
||||
|
||||
cpsw_default: cpsw_default {
|
||||
pinctrl-single,pins = <
|
||||
/* Slave 1 */
|
||||
0x110 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxerr.mii1_rxerr */
|
||||
0x114 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txen.mii1_txen */
|
||||
0x118 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxdv.mii1_rxdv */
|
||||
0x11c (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd3.mii1_txd3 */
|
||||
0x120 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd2.mii1_txd2 */
|
||||
0x124 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd1.mii1_txd1 */
|
||||
0x128 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd0.mii1_txd0 */
|
||||
0x12c (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_txclk.mii1_txclk */
|
||||
0x130 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxclk.mii1_rxclk */
|
||||
0x134 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd3.mii1_rxd3 */
|
||||
0x138 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd2.mii1_rxd2 */
|
||||
0x13c (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd1.mii1_rxd1 */
|
||||
0x140 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd0.mii1_rxd0 */
|
||||
>;
|
||||
};
|
||||
|
||||
cpsw_sleep: cpsw_sleep {
|
||||
pinctrl-single,pins = <
|
||||
/* Slave 1 reset value */
|
||||
0x110 (PIN_INPUT_PULLDOWN | MUX_MODE7)
|
||||
0x114 (PIN_INPUT_PULLDOWN | MUX_MODE7)
|
||||
0x118 (PIN_INPUT_PULLDOWN | MUX_MODE7)
|
||||
0x11c (PIN_INPUT_PULLDOWN | MUX_MODE7)
|
||||
0x120 (PIN_INPUT_PULLDOWN | MUX_MODE7)
|
||||
0x124 (PIN_INPUT_PULLDOWN | MUX_MODE7)
|
||||
0x128 (PIN_INPUT_PULLDOWN | MUX_MODE7)
|
||||
0x12c (PIN_INPUT_PULLDOWN | MUX_MODE7)
|
||||
0x130 (PIN_INPUT_PULLDOWN | MUX_MODE7)
|
||||
0x134 (PIN_INPUT_PULLDOWN | MUX_MODE7)
|
||||
0x138 (PIN_INPUT_PULLDOWN | MUX_MODE7)
|
||||
0x13c (PIN_INPUT_PULLDOWN | MUX_MODE7)
|
||||
0x140 (PIN_INPUT_PULLDOWN | MUX_MODE7)
|
||||
>;
|
||||
};
|
||||
|
||||
davinci_mdio_default: davinci_mdio_default {
|
||||
pinctrl-single,pins = <
|
||||
/* MDIO */
|
||||
0x148 (PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0) /* mdio_data.mdio_data */
|
||||
0x14c (PIN_OUTPUT_PULLUP | MUX_MODE0) /* mdio_clk.mdio_clk */
|
||||
>;
|
||||
};
|
||||
|
||||
davinci_mdio_sleep: davinci_mdio_sleep {
|
||||
pinctrl-single,pins = <
|
||||
/* MDIO reset value */
|
||||
0x148 (PIN_INPUT_PULLDOWN | MUX_MODE7)
|
||||
0x14c (PIN_INPUT_PULLDOWN | MUX_MODE7)
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
ocp {
|
||||
uart0: serial@44e09000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart0_pins>;
|
||||
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
musb: usb@47400000 {
|
||||
status = "okay";
|
||||
|
||||
control@44e10000 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
usb-phy@47401300 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
usb-phy@47401b00 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
usb@47401000 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
usb@47401800 {
|
||||
status = "okay";
|
||||
dr_mode = "host";
|
||||
};
|
||||
|
||||
dma-controller@07402000 {
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
i2c0: i2c@44e0b000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c0_pins>;
|
||||
|
||||
status = "okay";
|
||||
clock-frequency = <400000>;
|
||||
|
||||
tps: tps@24 {
|
||||
reg = <0x24>;
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
leds {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&user_leds_s0>;
|
||||
|
||||
compatible = "gpio-leds";
|
||||
|
||||
led@2 {
|
||||
label = "beaglebone:green:heartbeat";
|
||||
gpios = <&gpio1 21 GPIO_ACTIVE_HIGH>;
|
||||
linux,default-trigger = "heartbeat";
|
||||
default-state = "off";
|
||||
};
|
||||
|
||||
led@3 {
|
||||
label = "beaglebone:green:mmc0";
|
||||
gpios = <&gpio1 22 GPIO_ACTIVE_HIGH>;
|
||||
linux,default-trigger = "mmc0";
|
||||
default-state = "off";
|
||||
};
|
||||
|
||||
led@4 {
|
||||
label = "beaglebone:green:usr2";
|
||||
gpios = <&gpio1 23 GPIO_ACTIVE_HIGH>;
|
||||
default-state = "off";
|
||||
};
|
||||
|
||||
led@5 {
|
||||
label = "beaglebone:green:usr3";
|
||||
gpios = <&gpio1 24 GPIO_ACTIVE_HIGH>;
|
||||
default-state = "off";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
/include/ "tps65217.dtsi"
|
||||
|
||||
&tps {
|
||||
regulators {
|
||||
dcdc1_reg: regulator@0 {
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
dcdc2_reg: regulator@1 {
|
||||
/* VDD_MPU voltage limits 0.95V - 1.26V with +/-4% tolerance */
|
||||
regulator-name = "vdd_mpu";
|
||||
regulator-min-microvolt = <925000>;
|
||||
regulator-max-microvolt = <1325000>;
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
dcdc3_reg: regulator@2 {
|
||||
/* VDD_CORE voltage limits 0.95V - 1.1V with +/-4% tolerance */
|
||||
regulator-name = "vdd_core";
|
||||
regulator-min-microvolt = <925000>;
|
||||
regulator-max-microvolt = <1150000>;
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo1_reg: regulator@3 {
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo2_reg: regulator@4 {
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo3_reg: regulator@5 {
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo4_reg: regulator@6 {
|
||||
regulator-always-on;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&cpsw_emac0 {
|
||||
phy_id = <&davinci_mdio>, <0>;
|
||||
phy-mode = "mii";
|
||||
};
|
||||
|
||||
&cpsw_emac1 {
|
||||
phy_id = <&davinci_mdio>, <1>;
|
||||
phy-mode = "mii";
|
||||
};
|
||||
|
||||
&mac {
|
||||
pinctrl-names = "default", "sleep";
|
||||
pinctrl-0 = <&cpsw_default>;
|
||||
pinctrl-1 = <&cpsw_sleep>;
|
||||
|
||||
};
|
||||
|
||||
&davinci_mdio {
|
||||
pinctrl-names = "default", "sleep";
|
||||
pinctrl-0 = <&davinci_mdio_default>;
|
||||
pinctrl-1 = <&davinci_mdio_sleep>;
|
||||
};
|
17
arch/arm/dts/am335x-boneblack.dts
Normal file
17
arch/arm/dts/am335x-boneblack.dts
Normal file
@ -0,0 +1,17 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
/dts-v1/;
|
||||
|
||||
#include "am33xx.dtsi"
|
||||
#include "am335x-bone-common.dtsi"
|
||||
|
||||
&ldo3_reg {
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
};
|
649
arch/arm/dts/am33xx.dtsi
Normal file
649
arch/arm/dts/am33xx.dtsi
Normal file
@ -0,0 +1,649 @@
|
||||
/*
|
||||
* Device Tree Source for AM33XX SoC
|
||||
*
|
||||
* Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public License
|
||||
* version 2. This program is licensed "as is" without any warranty of any
|
||||
* kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/pinctrl/am33xx.h>
|
||||
|
||||
#include "skeleton.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "ti,am33xx";
|
||||
interrupt-parent = <&intc>;
|
||||
|
||||
aliases {
|
||||
serial0 = &uart0;
|
||||
serial1 = &uart1;
|
||||
serial2 = &uart2;
|
||||
serial3 = &uart3;
|
||||
serial4 = &uart4;
|
||||
serial5 = &uart5;
|
||||
d_can0 = &dcan0;
|
||||
d_can1 = &dcan1;
|
||||
usb0 = &usb0;
|
||||
usb1 = &usb1;
|
||||
phy0 = &usb0_phy;
|
||||
phy1 = &usb1_phy;
|
||||
};
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
cpu@0 {
|
||||
compatible = "arm,cortex-a8";
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
|
||||
/*
|
||||
* To consider voltage drop between PMIC and SoC,
|
||||
* tolerance value is reduced to 2% from 4% and
|
||||
* voltage value is increased as a precaution.
|
||||
*/
|
||||
operating-points = <
|
||||
/* kHz uV */
|
||||
720000 1285000
|
||||
600000 1225000
|
||||
500000 1125000
|
||||
275000 1125000
|
||||
>;
|
||||
voltage-tolerance = <2>; /* 2 percentage */
|
||||
clock-latency = <300000>; /* From omap-cpufreq driver */
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
* The soc node represents the soc top level view. It is uses for IPs
|
||||
* that are not memory mapped in the MPU view or for the MPU itself.
|
||||
*/
|
||||
soc {
|
||||
compatible = "ti,omap-infra";
|
||||
mpu {
|
||||
compatible = "ti,omap3-mpu";
|
||||
ti,hwmods = "mpu";
|
||||
};
|
||||
};
|
||||
|
||||
am33xx_pinmux: pinmux@44e10800 {
|
||||
compatible = "pinctrl-single";
|
||||
reg = <0x44e10800 0x0238>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
pinctrl-single,register-width = <32>;
|
||||
pinctrl-single,function-mask = <0x7f>;
|
||||
};
|
||||
|
||||
/*
|
||||
* XXX: Use a flat representation of the AM33XX interconnect.
|
||||
* The real AM33XX interconnect network is quite complex.Since
|
||||
* that will not bring real advantage to represent that in DT
|
||||
* for the moment, just use a fake OCP bus entry to represent
|
||||
* the whole bus hierarchy.
|
||||
*/
|
||||
ocp {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
ti,hwmods = "l3_main";
|
||||
|
||||
intc: interrupt-controller@48200000 {
|
||||
compatible = "ti,omap2-intc";
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
ti,intc-size = <128>;
|
||||
reg = <0x48200000 0x1000>;
|
||||
};
|
||||
|
||||
gpio0: gpio@44e07000 {
|
||||
compatible = "ti,omap4-gpio";
|
||||
ti,hwmods = "gpio1";
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
reg = <0x44e07000 0x1000>;
|
||||
interrupts = <96>;
|
||||
};
|
||||
|
||||
gpio1: gpio@4804c000 {
|
||||
compatible = "ti,omap4-gpio";
|
||||
ti,hwmods = "gpio2";
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
reg = <0x4804c000 0x1000>;
|
||||
interrupts = <98>;
|
||||
};
|
||||
|
||||
gpio2: gpio@481ac000 {
|
||||
compatible = "ti,omap4-gpio";
|
||||
ti,hwmods = "gpio3";
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
reg = <0x481ac000 0x1000>;
|
||||
interrupts = <32>;
|
||||
};
|
||||
|
||||
gpio3: gpio@481ae000 {
|
||||
compatible = "ti,omap4-gpio";
|
||||
ti,hwmods = "gpio4";
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
reg = <0x481ae000 0x1000>;
|
||||
interrupts = <62>;
|
||||
};
|
||||
|
||||
uart0: serial@44e09000 {
|
||||
compatible = "ti,omap3-uart";
|
||||
ti,hwmods = "uart1";
|
||||
clock-frequency = <48000000>;
|
||||
reg = <0x44e09000 0x2000>;
|
||||
interrupts = <72>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uart1: serial@48022000 {
|
||||
compatible = "ti,omap3-uart";
|
||||
ti,hwmods = "uart2";
|
||||
clock-frequency = <48000000>;
|
||||
reg = <0x48022000 0x2000>;
|
||||
interrupts = <73>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uart2: serial@48024000 {
|
||||
compatible = "ti,omap3-uart";
|
||||
ti,hwmods = "uart3";
|
||||
clock-frequency = <48000000>;
|
||||
reg = <0x48024000 0x2000>;
|
||||
interrupts = <74>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uart3: serial@481a6000 {
|
||||
compatible = "ti,omap3-uart";
|
||||
ti,hwmods = "uart4";
|
||||
clock-frequency = <48000000>;
|
||||
reg = <0x481a6000 0x2000>;
|
||||
interrupts = <44>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uart4: serial@481a8000 {
|
||||
compatible = "ti,omap3-uart";
|
||||
ti,hwmods = "uart5";
|
||||
clock-frequency = <48000000>;
|
||||
reg = <0x481a8000 0x2000>;
|
||||
interrupts = <45>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uart5: serial@481aa000 {
|
||||
compatible = "ti,omap3-uart";
|
||||
ti,hwmods = "uart6";
|
||||
clock-frequency = <48000000>;
|
||||
reg = <0x481aa000 0x2000>;
|
||||
interrupts = <46>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c0: i2c@44e0b000 {
|
||||
compatible = "ti,omap4-i2c";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
ti,hwmods = "i2c1";
|
||||
reg = <0x44e0b000 0x1000>;
|
||||
interrupts = <70>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c1: i2c@4802a000 {
|
||||
compatible = "ti,omap4-i2c";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
ti,hwmods = "i2c2";
|
||||
reg = <0x4802a000 0x1000>;
|
||||
interrupts = <71>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c2: i2c@4819c000 {
|
||||
compatible = "ti,omap4-i2c";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
ti,hwmods = "i2c3";
|
||||
reg = <0x4819c000 0x1000>;
|
||||
interrupts = <30>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
wdt2: wdt@44e35000 {
|
||||
compatible = "ti,omap3-wdt";
|
||||
ti,hwmods = "wd_timer2";
|
||||
reg = <0x44e35000 0x1000>;
|
||||
interrupts = <91>;
|
||||
};
|
||||
|
||||
dcan0: d_can@481cc000 {
|
||||
compatible = "bosch,d_can";
|
||||
ti,hwmods = "d_can0";
|
||||
reg = <0x481cc000 0x2000
|
||||
0x44e10644 0x4>;
|
||||
interrupts = <52>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
dcan1: d_can@481d0000 {
|
||||
compatible = "bosch,d_can";
|
||||
ti,hwmods = "d_can1";
|
||||
reg = <0x481d0000 0x2000
|
||||
0x44e10644 0x4>;
|
||||
interrupts = <55>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
timer1: timer@44e31000 {
|
||||
compatible = "ti,am335x-timer-1ms";
|
||||
reg = <0x44e31000 0x400>;
|
||||
interrupts = <67>;
|
||||
ti,hwmods = "timer1";
|
||||
ti,timer-alwon;
|
||||
};
|
||||
|
||||
timer2: timer@48040000 {
|
||||
compatible = "ti,am335x-timer";
|
||||
reg = <0x48040000 0x400>;
|
||||
interrupts = <68>;
|
||||
ti,hwmods = "timer2";
|
||||
};
|
||||
|
||||
timer3: timer@48042000 {
|
||||
compatible = "ti,am335x-timer";
|
||||
reg = <0x48042000 0x400>;
|
||||
interrupts = <69>;
|
||||
ti,hwmods = "timer3";
|
||||
};
|
||||
|
||||
timer4: timer@48044000 {
|
||||
compatible = "ti,am335x-timer";
|
||||
reg = <0x48044000 0x400>;
|
||||
interrupts = <92>;
|
||||
ti,hwmods = "timer4";
|
||||
ti,timer-pwm;
|
||||
};
|
||||
|
||||
timer5: timer@48046000 {
|
||||
compatible = "ti,am335x-timer";
|
||||
reg = <0x48046000 0x400>;
|
||||
interrupts = <93>;
|
||||
ti,hwmods = "timer5";
|
||||
ti,timer-pwm;
|
||||
};
|
||||
|
||||
timer6: timer@48048000 {
|
||||
compatible = "ti,am335x-timer";
|
||||
reg = <0x48048000 0x400>;
|
||||
interrupts = <94>;
|
||||
ti,hwmods = "timer6";
|
||||
ti,timer-pwm;
|
||||
};
|
||||
|
||||
timer7: timer@4804a000 {
|
||||
compatible = "ti,am335x-timer";
|
||||
reg = <0x4804a000 0x400>;
|
||||
interrupts = <95>;
|
||||
ti,hwmods = "timer7";
|
||||
ti,timer-pwm;
|
||||
};
|
||||
|
||||
rtc@44e3e000 {
|
||||
compatible = "ti,da830-rtc";
|
||||
reg = <0x44e3e000 0x1000>;
|
||||
interrupts = <75
|
||||
76>;
|
||||
ti,hwmods = "rtc";
|
||||
};
|
||||
|
||||
spi0: spi@48030000 {
|
||||
compatible = "ti,omap4-mcspi";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x48030000 0x400>;
|
||||
interrupts = <65>;
|
||||
ti,spi-num-cs = <2>;
|
||||
ti,hwmods = "spi0";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
spi1: spi@481a0000 {
|
||||
compatible = "ti,omap4-mcspi";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x481a0000 0x400>;
|
||||
interrupts = <125>;
|
||||
ti,spi-num-cs = <2>;
|
||||
ti,hwmods = "spi1";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb: usb@47400000 {
|
||||
compatible = "ti,am33xx-usb";
|
||||
reg = <0x47400000 0x1000>;
|
||||
ranges;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ti,hwmods = "usb_otg_hs";
|
||||
status = "disabled";
|
||||
|
||||
ctrl_mod: control@44e10000 {
|
||||
compatible = "ti,am335x-usb-ctrl-module";
|
||||
reg = <0x44e10620 0x10
|
||||
0x44e10648 0x4>;
|
||||
reg-names = "phy_ctrl", "wakeup";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb0_phy: usb-phy@47401300 {
|
||||
compatible = "ti,am335x-usb-phy";
|
||||
reg = <0x47401300 0x100>;
|
||||
reg-names = "phy";
|
||||
status = "disabled";
|
||||
ti,ctrl_mod = <&ctrl_mod>;
|
||||
};
|
||||
|
||||
usb0: usb@47401000 {
|
||||
compatible = "ti,musb-am33xx";
|
||||
status = "disabled";
|
||||
reg = <0x47401400 0x400
|
||||
0x47401000 0x200>;
|
||||
reg-names = "mc", "control";
|
||||
|
||||
interrupts = <18>;
|
||||
interrupt-names = "mc";
|
||||
dr_mode = "otg";
|
||||
mentor,multipoint = <1>;
|
||||
mentor,num-eps = <16>;
|
||||
mentor,ram-bits = <12>;
|
||||
mentor,power = <500>;
|
||||
phys = <&usb0_phy>;
|
||||
|
||||
dmas = <&cppi41dma 0 0 &cppi41dma 1 0
|
||||
&cppi41dma 2 0 &cppi41dma 3 0
|
||||
&cppi41dma 4 0 &cppi41dma 5 0
|
||||
&cppi41dma 6 0 &cppi41dma 7 0
|
||||
&cppi41dma 8 0 &cppi41dma 9 0
|
||||
&cppi41dma 10 0 &cppi41dma 11 0
|
||||
&cppi41dma 12 0 &cppi41dma 13 0
|
||||
&cppi41dma 14 0 &cppi41dma 0 1
|
||||
&cppi41dma 1 1 &cppi41dma 2 1
|
||||
&cppi41dma 3 1 &cppi41dma 4 1
|
||||
&cppi41dma 5 1 &cppi41dma 6 1
|
||||
&cppi41dma 7 1 &cppi41dma 8 1
|
||||
&cppi41dma 9 1 &cppi41dma 10 1
|
||||
&cppi41dma 11 1 &cppi41dma 12 1
|
||||
&cppi41dma 13 1 &cppi41dma 14 1>;
|
||||
dma-names =
|
||||
"rx1", "rx2", "rx3", "rx4", "rx5", "rx6", "rx7",
|
||||
"rx8", "rx9", "rx10", "rx11", "rx12", "rx13",
|
||||
"rx14", "rx15",
|
||||
"tx1", "tx2", "tx3", "tx4", "tx5", "tx6", "tx7",
|
||||
"tx8", "tx9", "tx10", "tx11", "tx12", "tx13",
|
||||
"tx14", "tx15";
|
||||
};
|
||||
|
||||
usb1_phy: usb-phy@47401b00 {
|
||||
compatible = "ti,am335x-usb-phy";
|
||||
reg = <0x47401b00 0x100>;
|
||||
reg-names = "phy";
|
||||
status = "disabled";
|
||||
ti,ctrl_mod = <&ctrl_mod>;
|
||||
};
|
||||
|
||||
usb1: usb@47401800 {
|
||||
compatible = "ti,musb-am33xx";
|
||||
status = "disabled";
|
||||
reg = <0x47401c00 0x400
|
||||
0x47401800 0x200>;
|
||||
reg-names = "mc", "control";
|
||||
interrupts = <19>;
|
||||
interrupt-names = "mc";
|
||||
dr_mode = "otg";
|
||||
mentor,multipoint = <1>;
|
||||
mentor,num-eps = <16>;
|
||||
mentor,ram-bits = <12>;
|
||||
mentor,power = <500>;
|
||||
phys = <&usb1_phy>;
|
||||
|
||||
dmas = <&cppi41dma 15 0 &cppi41dma 16 0
|
||||
&cppi41dma 17 0 &cppi41dma 18 0
|
||||
&cppi41dma 19 0 &cppi41dma 20 0
|
||||
&cppi41dma 21 0 &cppi41dma 22 0
|
||||
&cppi41dma 23 0 &cppi41dma 24 0
|
||||
&cppi41dma 25 0 &cppi41dma 26 0
|
||||
&cppi41dma 27 0 &cppi41dma 28 0
|
||||
&cppi41dma 29 0 &cppi41dma 15 1
|
||||
&cppi41dma 16 1 &cppi41dma 17 1
|
||||
&cppi41dma 18 1 &cppi41dma 19 1
|
||||
&cppi41dma 20 1 &cppi41dma 21 1
|
||||
&cppi41dma 22 1 &cppi41dma 23 1
|
||||
&cppi41dma 24 1 &cppi41dma 25 1
|
||||
&cppi41dma 26 1 &cppi41dma 27 1
|
||||
&cppi41dma 28 1 &cppi41dma 29 1>;
|
||||
dma-names =
|
||||
"rx1", "rx2", "rx3", "rx4", "rx5", "rx6", "rx7",
|
||||
"rx8", "rx9", "rx10", "rx11", "rx12", "rx13",
|
||||
"rx14", "rx15",
|
||||
"tx1", "tx2", "tx3", "tx4", "tx5", "tx6", "tx7",
|
||||
"tx8", "tx9", "tx10", "tx11", "tx12", "tx13",
|
||||
"tx14", "tx15";
|
||||
};
|
||||
|
||||
cppi41dma: dma-controller@07402000 {
|
||||
compatible = "ti,am3359-cppi41";
|
||||
reg = <0x47400000 0x1000
|
||||
0x47402000 0x1000
|
||||
0x47403000 0x1000
|
||||
0x47404000 0x4000>;
|
||||
reg-names = "glue", "controller", "scheduler", "queuemgr";
|
||||
interrupts = <17>;
|
||||
interrupt-names = "glue";
|
||||
#dma-cells = <2>;
|
||||
#dma-channels = <30>;
|
||||
#dma-requests = <256>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
epwmss0: epwmss@48300000 {
|
||||
compatible = "ti,am33xx-pwmss";
|
||||
reg = <0x48300000 0x10>;
|
||||
ti,hwmods = "epwmss0";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
status = "disabled";
|
||||
ranges = <0x48300100 0x48300100 0x80 /* ECAP */
|
||||
0x48300180 0x48300180 0x80 /* EQEP */
|
||||
0x48300200 0x48300200 0x80>; /* EHRPWM */
|
||||
|
||||
ecap0: ecap@48300100 {
|
||||
compatible = "ti,am33xx-ecap";
|
||||
#pwm-cells = <3>;
|
||||
reg = <0x48300100 0x80>;
|
||||
ti,hwmods = "ecap0";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
ehrpwm0: ehrpwm@48300200 {
|
||||
compatible = "ti,am33xx-ehrpwm";
|
||||
#pwm-cells = <3>;
|
||||
reg = <0x48300200 0x80>;
|
||||
ti,hwmods = "ehrpwm0";
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
epwmss1: epwmss@48302000 {
|
||||
compatible = "ti,am33xx-pwmss";
|
||||
reg = <0x48302000 0x10>;
|
||||
ti,hwmods = "epwmss1";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
status = "disabled";
|
||||
ranges = <0x48302100 0x48302100 0x80 /* ECAP */
|
||||
0x48302180 0x48302180 0x80 /* EQEP */
|
||||
0x48302200 0x48302200 0x80>; /* EHRPWM */
|
||||
|
||||
ecap1: ecap@48302100 {
|
||||
compatible = "ti,am33xx-ecap";
|
||||
#pwm-cells = <3>;
|
||||
reg = <0x48302100 0x80>;
|
||||
ti,hwmods = "ecap1";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
ehrpwm1: ehrpwm@48302200 {
|
||||
compatible = "ti,am33xx-ehrpwm";
|
||||
#pwm-cells = <3>;
|
||||
reg = <0x48302200 0x80>;
|
||||
ti,hwmods = "ehrpwm1";
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
epwmss2: epwmss@48304000 {
|
||||
compatible = "ti,am33xx-pwmss";
|
||||
reg = <0x48304000 0x10>;
|
||||
ti,hwmods = "epwmss2";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
status = "disabled";
|
||||
ranges = <0x48304100 0x48304100 0x80 /* ECAP */
|
||||
0x48304180 0x48304180 0x80 /* EQEP */
|
||||
0x48304200 0x48304200 0x80>; /* EHRPWM */
|
||||
|
||||
ecap2: ecap@48304100 {
|
||||
compatible = "ti,am33xx-ecap";
|
||||
#pwm-cells = <3>;
|
||||
reg = <0x48304100 0x80>;
|
||||
ti,hwmods = "ecap2";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
ehrpwm2: ehrpwm@48304200 {
|
||||
compatible = "ti,am33xx-ehrpwm";
|
||||
#pwm-cells = <3>;
|
||||
reg = <0x48304200 0x80>;
|
||||
ti,hwmods = "ehrpwm2";
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
mac: ethernet@4a100000 {
|
||||
compatible = "ti,cpsw";
|
||||
ti,hwmods = "cpgmac0";
|
||||
cpdma_channels = <8>;
|
||||
ale_entries = <1024>;
|
||||
bd_ram_size = <0x2000>;
|
||||
no_bd_ram = <0>;
|
||||
rx_descs = <64>;
|
||||
mac_control = <0x20>;
|
||||
slaves = <2>;
|
||||
active_slave = <0>;
|
||||
cpts_clock_mult = <0x80000000>;
|
||||
cpts_clock_shift = <29>;
|
||||
reg = <0x4a100000 0x800
|
||||
0x4a101200 0x100>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
interrupt-parent = <&intc>;
|
||||
/*
|
||||
* c0_rx_thresh_pend
|
||||
* c0_rx_pend
|
||||
* c0_tx_pend
|
||||
* c0_misc_pend
|
||||
*/
|
||||
interrupts = <40 41 42 43>;
|
||||
ranges;
|
||||
|
||||
davinci_mdio: mdio@4a101000 {
|
||||
compatible = "ti,davinci_mdio";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
ti,hwmods = "davinci_mdio";
|
||||
bus_freq = <1000000>;
|
||||
reg = <0x4a101000 0x100>;
|
||||
};
|
||||
|
||||
cpsw_emac0: slave@4a100200 {
|
||||
/* Filled in by U-Boot */
|
||||
mac-address = [ 00 00 00 00 00 00 ];
|
||||
};
|
||||
|
||||
cpsw_emac1: slave@4a100300 {
|
||||
/* Filled in by U-Boot */
|
||||
mac-address = [ 00 00 00 00 00 00 ];
|
||||
};
|
||||
};
|
||||
|
||||
ocmcram: ocmcram@40300000 {
|
||||
compatible = "ti,am3352-ocmcram";
|
||||
reg = <0x40300000 0x10000>;
|
||||
ti,hwmods = "ocmcram";
|
||||
};
|
||||
|
||||
wkup_m3: wkup_m3@44d00000 {
|
||||
compatible = "ti,am3353-wkup-m3";
|
||||
reg = <0x44d00000 0x4000 /* M3 UMEM */
|
||||
0x44d80000 0x2000>; /* M3 DMEM */
|
||||
ti,hwmods = "wkup_m3";
|
||||
};
|
||||
|
||||
elm: elm@48080000 {
|
||||
compatible = "ti,am3352-elm";
|
||||
reg = <0x48080000 0x2000>;
|
||||
interrupts = <4>;
|
||||
ti,hwmods = "elm";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
tscadc: tscadc@44e0d000 {
|
||||
compatible = "ti,am3359-tscadc";
|
||||
reg = <0x44e0d000 0x1000>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <16>;
|
||||
ti,hwmods = "adc_tsc";
|
||||
status = "disabled";
|
||||
|
||||
tsc {
|
||||
compatible = "ti,am3359-tsc";
|
||||
};
|
||||
am335x_adc: adc {
|
||||
#io-channel-cells = <1>;
|
||||
compatible = "ti,am3359-adc";
|
||||
};
|
||||
};
|
||||
|
||||
gpmc: gpmc@50000000 {
|
||||
compatible = "ti,am3352-gpmc";
|
||||
ti,hwmods = "gpmc";
|
||||
reg = <0x50000000 0x2000>;
|
||||
interrupts = <100>;
|
||||
gpmc,num-cs = <7>;
|
||||
gpmc,num-waitpins = <2>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
};
|
15
arch/arm/dts/dt-bindings/gpio/gpio.h
Normal file
15
arch/arm/dts/dt-bindings/gpio/gpio.h
Normal file
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* This header provides constants for most GPIO bindings.
|
||||
*
|
||||
* Most GPIO bindings include a flags cell as part of the GPIO specifier.
|
||||
* In most cases, the format of the flags cell uses the standard values
|
||||
* defined in this header.
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_GPIO_GPIO_H
|
||||
#define _DT_BINDINGS_GPIO_GPIO_H
|
||||
|
||||
#define GPIO_ACTIVE_HIGH 0
|
||||
#define GPIO_ACTIVE_LOW 1
|
||||
|
||||
#endif
|
42
arch/arm/dts/dt-bindings/pinctrl/am33xx.h
Normal file
42
arch/arm/dts/dt-bindings/pinctrl/am33xx.h
Normal file
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* This header provides constants specific to AM33XX pinctrl bindings.
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_PINCTRL_AM33XX_H
|
||||
#define _DT_BINDINGS_PINCTRL_AM33XX_H
|
||||
|
||||
#include <dt-bindings/pinctrl/omap.h>
|
||||
|
||||
/* am33xx specific mux bit defines */
|
||||
#undef PULL_ENA
|
||||
#undef INPUT_EN
|
||||
|
||||
#define PULL_DISABLE (1 << 3)
|
||||
#define INPUT_EN (1 << 5)
|
||||
#define SLEWCTRL_FAST (1 << 6)
|
||||
|
||||
/* update macro depending on INPUT_EN and PULL_ENA */
|
||||
#undef PIN_OUTPUT
|
||||
#undef PIN_OUTPUT_PULLUP
|
||||
#undef PIN_OUTPUT_PULLDOWN
|
||||
#undef PIN_INPUT
|
||||
#undef PIN_INPUT_PULLUP
|
||||
#undef PIN_INPUT_PULLDOWN
|
||||
|
||||
#define PIN_OUTPUT (PULL_DISABLE)
|
||||
#define PIN_OUTPUT_PULLUP (PULL_UP)
|
||||
#define PIN_OUTPUT_PULLDOWN 0
|
||||
#define PIN_INPUT (INPUT_EN | PULL_DISABLE)
|
||||
#define PIN_INPUT_PULLUP (INPUT_EN | PULL_UP)
|
||||
#define PIN_INPUT_PULLDOWN (INPUT_EN)
|
||||
|
||||
/* undef non-existing modes */
|
||||
#undef PIN_OFF_NONE
|
||||
#undef PIN_OFF_OUTPUT_HIGH
|
||||
#undef PIN_OFF_OUTPUT_LOW
|
||||
#undef PIN_OFF_INPUT_PULLUP
|
||||
#undef PIN_OFF_INPUT_PULLDOWN
|
||||
#undef PIN_OFF_WAKEUPENABLE
|
||||
|
||||
#endif
|
||||
|
55
arch/arm/dts/dt-bindings/pinctrl/omap.h
Normal file
55
arch/arm/dts/dt-bindings/pinctrl/omap.h
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* This header provides constants for OMAP pinctrl bindings.
|
||||
*
|
||||
* Copyright (C) 2009 Nokia
|
||||
* Copyright (C) 2009-2010 Texas Instruments
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_PINCTRL_OMAP_H
|
||||
#define _DT_BINDINGS_PINCTRL_OMAP_H
|
||||
|
||||
/* 34xx mux mode options for each pin. See TRM for options */
|
||||
#define MUX_MODE0 0
|
||||
#define MUX_MODE1 1
|
||||
#define MUX_MODE2 2
|
||||
#define MUX_MODE3 3
|
||||
#define MUX_MODE4 4
|
||||
#define MUX_MODE5 5
|
||||
#define MUX_MODE6 6
|
||||
#define MUX_MODE7 7
|
||||
|
||||
/* 24xx/34xx mux bit defines */
|
||||
#define PULL_ENA (1 << 3)
|
||||
#define PULL_UP (1 << 4)
|
||||
#define ALTELECTRICALSEL (1 << 5)
|
||||
|
||||
/* 34xx specific mux bit defines */
|
||||
#define INPUT_EN (1 << 8)
|
||||
#define OFF_EN (1 << 9)
|
||||
#define OFFOUT_EN (1 << 10)
|
||||
#define OFFOUT_VAL (1 << 11)
|
||||
#define OFF_PULL_EN (1 << 12)
|
||||
#define OFF_PULL_UP (1 << 13)
|
||||
#define WAKEUP_EN (1 << 14)
|
||||
|
||||
/* 44xx specific mux bit defines */
|
||||
#define WAKEUP_EVENT (1 << 15)
|
||||
|
||||
/* Active pin states */
|
||||
#define PIN_OUTPUT 0
|
||||
#define PIN_OUTPUT_PULLUP (PIN_OUTPUT | PULL_ENA | PULL_UP)
|
||||
#define PIN_OUTPUT_PULLDOWN (PIN_OUTPUT | PULL_ENA)
|
||||
#define PIN_INPUT INPUT_EN
|
||||
#define PIN_INPUT_PULLUP (PULL_ENA | INPUT_EN | PULL_UP)
|
||||
#define PIN_INPUT_PULLDOWN (PULL_ENA | INPUT_EN)
|
||||
|
||||
/* Off mode states */
|
||||
#define PIN_OFF_NONE 0
|
||||
#define PIN_OFF_OUTPUT_HIGH (OFF_EN | OFFOUT_EN | OFFOUT_VAL)
|
||||
#define PIN_OFF_OUTPUT_LOW (OFF_EN | OFFOUT_EN)
|
||||
#define PIN_OFF_INPUT_PULLUP (OFF_EN | OFF_PULL_EN | OFF_PULL_UP)
|
||||
#define PIN_OFF_INPUT_PULLDOWN (OFF_EN | OFF_PULL_EN)
|
||||
#define PIN_OFF_WAKEUPENABLE WAKEUP_EN
|
||||
|
||||
#endif
|
||||
|
@ -128,6 +128,14 @@
|
||||
interrupts = <0 78 0>;
|
||||
};
|
||||
|
||||
dwmmc@12550000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos-dwmmc";
|
||||
reg = <0x12550000 0x1000>;
|
||||
interrupts = <0 131 0>;
|
||||
};
|
||||
|
||||
gpio: gpio {
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
|
@ -31,6 +31,7 @@
|
||||
console = "/serial@13820000";
|
||||
mmc0 = "sdhci@12510000";
|
||||
mmc2 = "sdhci@12530000";
|
||||
mmc4 = "dwmmc@12550000";
|
||||
};
|
||||
|
||||
i2c@138d0000 {
|
||||
@ -416,6 +417,7 @@
|
||||
samsung,bus-width = <8>;
|
||||
samsung,timing = <1 3 3>;
|
||||
pwr-gpios = <&gpio 0xB2 0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@12520000 {
|
||||
@ -431,4 +433,14 @@
|
||||
sdhci@12540000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
dwmmc@12550000 {
|
||||
samsung,bus-width = <8>;
|
||||
samsung,timing = <2 1 0>;
|
||||
pwr-gpios = <&gpio 0xB2 0>;
|
||||
fifoth_val = <0x203f0040>;
|
||||
bus_hz = <400000000>;
|
||||
div = <0x3>;
|
||||
index = <4>;
|
||||
};
|
||||
};
|
||||
|
@ -136,7 +136,7 @@
|
||||
mmc@12200000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5250-dwmmc";
|
||||
compatible = "samsung,exynos-dwmmc";
|
||||
reg = <0x12200000 0x1000>;
|
||||
interrupts = <0 75 0>;
|
||||
};
|
||||
@ -144,7 +144,7 @@
|
||||
mmc@12210000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5250-dwmmc";
|
||||
compatible = "samsung,exynos-dwmmc";
|
||||
reg = <0x12210000 0x1000>;
|
||||
interrupts = <0 76 0>;
|
||||
};
|
||||
@ -152,7 +152,7 @@
|
||||
mmc@12220000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5250-dwmmc";
|
||||
compatible = "samsung,exynos-dwmmc";
|
||||
reg = <0x12220000 0x1000>;
|
||||
interrupts = <0 77 0>;
|
||||
};
|
||||
@ -160,7 +160,7 @@
|
||||
mmc@12230000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5250-dwmmc";
|
||||
compatible = "samsung,exynos-dwmmc";
|
||||
reg = <0x12230000 0x1000>;
|
||||
interrupts = <0 78 0>;
|
||||
};
|
||||
|
@ -44,7 +44,7 @@
|
||||
reg = <0x1e>;
|
||||
compatible = "google,cros-ec";
|
||||
i2c-max-frequency = <100000>;
|
||||
ec-interrupt = <&gpio 782 1>;
|
||||
ec-interrupt = <&gpio 182 1>;
|
||||
};
|
||||
|
||||
power-regulator@48 {
|
||||
@ -60,7 +60,7 @@
|
||||
reg = <0>;
|
||||
compatible = "google,cros-ec";
|
||||
spi-max-frequency = <5000000>;
|
||||
ec-interrupt = <&gpio 782 1>;
|
||||
ec-interrupt = <&gpio 182 1>;
|
||||
optimise-flash-write;
|
||||
status = "disabled";
|
||||
};
|
||||
@ -80,6 +80,19 @@
|
||||
reg = <0x22>;
|
||||
compatible = "maxim,max98095-codec";
|
||||
};
|
||||
|
||||
ptn3460-bridge@20 {
|
||||
compatible = "nxp,ptn3460";
|
||||
reg = <0x20>;
|
||||
/*
|
||||
* TODO(sjg@chromium.org): Use GPIOs here
|
||||
* powerdown-gpio = <&gpy2 5 0>;
|
||||
* reset-gpio = <&gpx1 5 0>;
|
||||
* edid-emulation = <5>;
|
||||
* pinctrl-names = "default";
|
||||
* pinctrl-0 = <&ptn3460_gpios>;
|
||||
*/
|
||||
};
|
||||
};
|
||||
|
||||
i2c@12c60000 {
|
||||
@ -184,4 +197,48 @@
|
||||
/* UP LEFT */
|
||||
0x070b0067 0x070c0069>;
|
||||
};
|
||||
|
||||
fimd@14400000 {
|
||||
samsung,vl-freq = <60>;
|
||||
samsung,vl-col = <1366>;
|
||||
samsung,vl-row = <768>;
|
||||
samsung,vl-width = <1366>;
|
||||
samsung,vl-height = <768>;
|
||||
|
||||
samsung,vl-clkp;
|
||||
samsung,vl-dp;
|
||||
samsung,vl-hsp;
|
||||
samsung,vl-vsp;
|
||||
|
||||
samsung,vl-bpix = <4>;
|
||||
|
||||
samsung,vl-hspw = <32>;
|
||||
samsung,vl-hbpd = <80>;
|
||||
samsung,vl-hfpd = <48>;
|
||||
samsung,vl-vspw = <5>;
|
||||
samsung,vl-vbpd = <14>;
|
||||
samsung,vl-vfpd = <3>;
|
||||
samsung,vl-cmd-allow-len = <0xf>;
|
||||
|
||||
samsung,winid = <0>;
|
||||
samsung,interface-mode = <1>;
|
||||
samsung,dp-enabled = <1>;
|
||||
samsung,dual-lcd-enabled = <0>;
|
||||
};
|
||||
|
||||
dp@145b0000 {
|
||||
samsung,lt-status = <0>;
|
||||
|
||||
samsung,master-mode = <0>;
|
||||
samsung,bist-mode = <0>;
|
||||
samsung,bist-pattern = <0>;
|
||||
samsung,h-sync-polarity = <0>;
|
||||
samsung,v-sync-polarity = <0>;
|
||||
samsung,interlaced = <0>;
|
||||
samsung,color-space = <0>;
|
||||
samsung,dynamic-range = <0>;
|
||||
samsung,ycbcr-coeff = <0>;
|
||||
samsung,color-depth = <1>;
|
||||
};
|
||||
|
||||
};
|
||||
|
127
arch/arm/dts/exynos5420-peach-pit.dts
Normal file
127
arch/arm/dts/exynos5420-peach-pit.dts
Normal file
@ -0,0 +1,127 @@
|
||||
/*
|
||||
* SAMSUNG/GOOGLE Peach-Pit board device tree source
|
||||
*
|
||||
* Copyright (c) 2013 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
/include/ "exynos54xx.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Samsung/Google Peach Pit board based on Exynos5420";
|
||||
|
||||
compatible = "google,pit-rev#", "google,pit",
|
||||
"google,peach", "samsung,exynos5420", "samsung,exynos5";
|
||||
|
||||
config {
|
||||
google,bad-wake-gpios = <&gpio 0x56 0>; /* gpx0-6 */
|
||||
hwid = "PIT TEST A-A 7848";
|
||||
lazy-init = <1>;
|
||||
};
|
||||
|
||||
aliases {
|
||||
serial0 = "/serial@12C30000";
|
||||
console = "/serial@12C30000";
|
||||
pmic = "/i2c@12ca0000";
|
||||
};
|
||||
|
||||
dmc {
|
||||
mem-manuf = "samsung";
|
||||
mem-type = "ddr3";
|
||||
clock-frequency = <800000000>;
|
||||
arm-frequency = <1700000000>;
|
||||
};
|
||||
|
||||
tmu@10060000 {
|
||||
samsung,min-temp = <25>;
|
||||
samsung,max-temp = <125>;
|
||||
samsung,start-warning = <95>;
|
||||
samsung,start-tripping = <105>;
|
||||
samsung,hw-tripping = <110>;
|
||||
samsung,efuse-min-value = <40>;
|
||||
samsung,efuse-value = <55>;
|
||||
samsung,efuse-max-value = <100>;
|
||||
samsung,slope = <274761730>;
|
||||
samsung,dc-value = <25>;
|
||||
};
|
||||
|
||||
/* MAX77802 is on i2c bus 4 */
|
||||
i2c@12ca0000 {
|
||||
clock-frequency = <400000>;
|
||||
power-regulator@9 {
|
||||
compatible = "maxim,max77802-pmic";
|
||||
reg = <0x9>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c@12cd0000 { /* i2c7 */
|
||||
clock-frequency = <100000>;
|
||||
soundcodec@20 {
|
||||
reg = <0x20>;
|
||||
compatible = "maxim,max98090-codec";
|
||||
};
|
||||
};
|
||||
|
||||
sound@3830000 {
|
||||
samsung,codec-type = "max98090";
|
||||
};
|
||||
|
||||
i2c@12e10000 { /* i2c9 */
|
||||
clock-frequency = <400000>;
|
||||
tpm@20 {
|
||||
compatible = "infineon,slb9645-tpm";
|
||||
reg = <0x20>;
|
||||
};
|
||||
};
|
||||
|
||||
spi@12d30000 { /* spi1 */
|
||||
spi-max-frequency = <50000000>;
|
||||
firmware_storage_spi: flash@0 {
|
||||
reg = <0>;
|
||||
|
||||
/*
|
||||
* A region for the kernel to store a panic event
|
||||
* which the firmware will add to the log.
|
||||
*/
|
||||
elog-panic-event-offset = <0x01e00000 0x100000>;
|
||||
|
||||
elog-shrink-size = <0x400>;
|
||||
elog-full-threshold = <0xc00>;
|
||||
};
|
||||
};
|
||||
|
||||
spi@12d40000 { /* spi2 */
|
||||
spi-max-frequency = <4000000>;
|
||||
spi-deactivate-delay = <200>;
|
||||
cros-ec@0 {
|
||||
reg = <0>;
|
||||
compatible = "google,cros-ec";
|
||||
spi-half-duplex;
|
||||
spi-max-timeout-ms = <1100>;
|
||||
spi-frame-header = <0xec>;
|
||||
ec-interrupt = <&gpio 93 1>; /* GPX1_5 */
|
||||
|
||||
/*
|
||||
* This describes the flash memory within the EC. Note
|
||||
* that the STM32L flash erases to 0, not 0xff.
|
||||
*/
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
flash@8000000 {
|
||||
reg = <0x08000000 0x20000>;
|
||||
erase-value = <0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
xhci@12000000 {
|
||||
samsung,vbus-gpio = <&gpio 0x40 0>; /* H00 */
|
||||
};
|
||||
|
||||
xhci@12400000 {
|
||||
samsung,vbus-gpio = <&gpio 0x41 0>; /* H01 */
|
||||
};
|
||||
};
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
/include/ "exynos5420.dtsi"
|
||||
/include/ "exynos54xx.dtsi"
|
||||
|
||||
/ {
|
||||
model = "SAMSUNG SMDK5420 board based on EXYNOS5420";
|
||||
@ -19,27 +19,6 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
i2c0 = "/i2c@12c60000";
|
||||
i2c1 = "/i2c@12c70000";
|
||||
i2c2 = "/i2c@12c80000";
|
||||
i2c3 = "/i2c@12c90000";
|
||||
i2c4 = "/i2c@12ca0000";
|
||||
i2c5 = "/i2c@12cb0000";
|
||||
i2c6 = "/i2c@12cc0000";
|
||||
i2c7 = "/i2c@12cd0000";
|
||||
i2c8 = "/i2c@12e00000";
|
||||
i2c9 = "/i2c@12e10000";
|
||||
i2c10 = "/i2c@12e20000";
|
||||
spi0 = "/spi@12d20000";
|
||||
spi1 = "/spi@12d30000";
|
||||
spi2 = "/spi@12d40000";
|
||||
spi3 = "/spi@131a0000";
|
||||
spi4 = "/spi@131b0000";
|
||||
mmc0 = "/mmc@12200000";
|
||||
mmc1 = "/mmc@12210000";
|
||||
mmc2 = "/mmc@12220000";
|
||||
xhci0 = "/xhci@12000000";
|
||||
xhci1 = "/xhci@12400000";
|
||||
serial0 = "/serial@12C30000";
|
||||
console = "/serial@12C30000";
|
||||
};
|
||||
|
@ -1,70 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2013 SAMSUNG Electronics
|
||||
* SAMSUNG EXYNOS5420 SoC device tree source
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
/include/ "exynos5.dtsi"
|
||||
|
||||
/ {
|
||||
config {
|
||||
machine-arch-id = <4151>;
|
||||
};
|
||||
|
||||
i2c@12ca0000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5-hsi2c";
|
||||
reg = <0x12CA0000 0x100>;
|
||||
interrupts = <0 60 0>;
|
||||
};
|
||||
|
||||
i2c@12cb0000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5-hsi2c";
|
||||
reg = <0x12CB0000 0x100>;
|
||||
interrupts = <0 61 0>;
|
||||
};
|
||||
|
||||
i2c@12cc0000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5-hsi2c";
|
||||
reg = <0x12CC0000 0x100>;
|
||||
interrupts = <0 62 0>;
|
||||
};
|
||||
|
||||
i2c@12cd0000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5-hsi2c";
|
||||
reg = <0x12CD0000 0x100>;
|
||||
interrupts = <0 63 0>;
|
||||
};
|
||||
|
||||
i2c@12e00000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5-hsi2c";
|
||||
reg = <0x12E00000 0x100>;
|
||||
interrupts = <0 87 0>;
|
||||
};
|
||||
|
||||
i2c@12e10000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5-hsi2c";
|
||||
reg = <0x12E10000 0x100>;
|
||||
interrupts = <0 88 0>;
|
||||
};
|
||||
|
||||
i2c@12e20000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5-hsi2c";
|
||||
reg = <0x12E20000 0x100>;
|
||||
interrupts = <0 203 0>;
|
||||
};
|
||||
};
|
151
arch/arm/dts/exynos54xx.dtsi
Normal file
151
arch/arm/dts/exynos54xx.dtsi
Normal file
@ -0,0 +1,151 @@
|
||||
/*
|
||||
* (C) Copyright 2013 SAMSUNG Electronics
|
||||
* SAMSUNG EXYNOS5420 SoC device tree source
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
/include/ "exynos5.dtsi"
|
||||
|
||||
/ {
|
||||
config {
|
||||
machine-arch-id = <4151>;
|
||||
};
|
||||
|
||||
aliases {
|
||||
i2c0 = "/i2c@12c60000";
|
||||
i2c1 = "/i2c@12c70000";
|
||||
i2c2 = "/i2c@12c80000";
|
||||
i2c3 = "/i2c@12c90000";
|
||||
i2c4 = "/i2c@12ca0000";
|
||||
i2c5 = "/i2c@12cb0000";
|
||||
i2c6 = "/i2c@12cc0000";
|
||||
i2c7 = "/i2c@12cd0000";
|
||||
i2c8 = "/i2c@12e00000";
|
||||
i2c9 = "/i2c@12e10000";
|
||||
i2c10 = "/i2c@12e20000";
|
||||
spi0 = "/spi@12d20000";
|
||||
spi1 = "/spi@12d30000";
|
||||
spi2 = "/spi@12d40000";
|
||||
spi3 = "/spi@131a0000";
|
||||
spi4 = "/spi@131b0000";
|
||||
mmc0 = "/mmc@12200000";
|
||||
mmc1 = "/mmc@12210000";
|
||||
mmc2 = "/mmc@12220000";
|
||||
xhci0 = "/xhci@12000000";
|
||||
xhci1 = "/xhci@12400000";
|
||||
};
|
||||
|
||||
i2c@12ca0000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5-hsi2c";
|
||||
reg = <0x12CA0000 0x100>;
|
||||
interrupts = <0 60 0>;
|
||||
};
|
||||
|
||||
i2c@12cb0000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5-hsi2c";
|
||||
reg = <0x12CB0000 0x100>;
|
||||
interrupts = <0 61 0>;
|
||||
};
|
||||
|
||||
i2c@12cc0000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5-hsi2c";
|
||||
reg = <0x12CC0000 0x100>;
|
||||
interrupts = <0 62 0>;
|
||||
};
|
||||
|
||||
i2c@12cd0000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5-hsi2c";
|
||||
reg = <0x12CD0000 0x100>;
|
||||
interrupts = <0 63 0>;
|
||||
};
|
||||
|
||||
i2c@12e00000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5-hsi2c";
|
||||
reg = <0x12E00000 0x100>;
|
||||
interrupts = <0 87 0>;
|
||||
};
|
||||
|
||||
i2c@12e10000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5-hsi2c";
|
||||
reg = <0x12E10000 0x100>;
|
||||
interrupts = <0 88 0>;
|
||||
};
|
||||
|
||||
i2c@12e20000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos5-hsi2c";
|
||||
reg = <0x12E20000 0x100>;
|
||||
interrupts = <0 203 0>;
|
||||
};
|
||||
|
||||
mmc@12200000 {
|
||||
samsung,bus-width = <8>;
|
||||
samsung,timing = <1 3 3>;
|
||||
samsung,removable = <0>;
|
||||
samsung,pre-init;
|
||||
};
|
||||
|
||||
mmc@12210000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
mmc@12220000 {
|
||||
samsung,bus-width = <4>;
|
||||
samsung,timing = <1 2 3>;
|
||||
samsung,removable = <1>;
|
||||
};
|
||||
|
||||
mmc@12230000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
fimd@14400000 {
|
||||
/* sysmmu is not used in U-Boot */
|
||||
samsung,disable-sysmmu;
|
||||
};
|
||||
|
||||
dp@145b0000 {
|
||||
samsung,lt-status = <0>;
|
||||
|
||||
samsung,master-mode = <0>;
|
||||
samsung,bist-mode = <0>;
|
||||
samsung,bist-pattern = <0>;
|
||||
samsung,h-sync-polarity = <0>;
|
||||
samsung,v-sync-polarity = <0>;
|
||||
samsung,interlaced = <0>;
|
||||
samsung,color-space = <0>;
|
||||
samsung,dynamic-range = <0>;
|
||||
samsung,ycbcr-coeff = <0>;
|
||||
samsung,color-depth = <1>;
|
||||
};
|
||||
|
||||
dmc {
|
||||
mem-type = "ddr3";
|
||||
};
|
||||
|
||||
xhci1: xhci@12400000 {
|
||||
compatible = "samsung,exynos5250-xhci";
|
||||
reg = <0x12400000 0x10000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
phy {
|
||||
compatible = "samsung,exynos5250-usb3-phy";
|
||||
reg = <0x12500000 0x100>;
|
||||
};
|
||||
};
|
||||
};
|
1
arch/arm/dts/include/dt-bindings
Symbolic link
1
arch/arm/dts/include/dt-bindings
Symbolic link
@ -0,0 +1 @@
|
||||
../../../../include/dt-bindings
|
@ -1,3 +1,6 @@
|
||||
#include <dt-bindings/gpio/tegra-gpio.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
#include "skeleton.dtsi"
|
||||
|
||||
/ {
|
||||
@ -46,17 +49,17 @@
|
||||
0 143 0x04>;
|
||||
};
|
||||
|
||||
gpio: gpio {
|
||||
gpio: gpio@6000d000 {
|
||||
compatible = "nvidia,tegra114-gpio", "nvidia,tegra30-gpio";
|
||||
reg = <0x6000d000 0x1000>;
|
||||
interrupts = <0 32 0x04
|
||||
0 33 0x04
|
||||
0 34 0x04
|
||||
0 35 0x04
|
||||
0 55 0x04
|
||||
0 87 0x04
|
||||
0 89 0x04
|
||||
0 125 0x04>;
|
||||
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#gpio-cells = <2>;
|
||||
gpio-controller;
|
||||
#interrupt-cells = <2>;
|
||||
|
@ -17,7 +17,8 @@
|
||||
sdhci1 = "/sdhci@700b0400";
|
||||
spi0 = "/spi@7000d400";
|
||||
spi1 = "/spi@7000da00";
|
||||
usb0 = "/usb@7d008000";
|
||||
usb0 = "/usb@7d000000";
|
||||
usb1 = "/usb@7d008000";
|
||||
};
|
||||
|
||||
memory {
|
||||
@ -77,6 +78,12 @@
|
||||
bus-width = <8>;
|
||||
};
|
||||
|
||||
usb@7d000000 {
|
||||
status = "okay";
|
||||
dr_mode = "otg";
|
||||
nvidia,vbus-gpio = <&gpio 108 0>; /* gpio PN4, USB_VBUS_EN0 */
|
||||
};
|
||||
|
||||
usb@7d008000 {
|
||||
status = "okay";
|
||||
nvidia,vbus-gpio = <&gpio 109 0>; /* gpio PN5, USB_VBUS_EN1 */
|
||||
|
@ -17,7 +17,8 @@
|
||||
sdhci1 = "/sdhci@700b0400";
|
||||
spi0 = "/spi@7000d400";
|
||||
spi1 = "/spi@7000da00";
|
||||
usb0 = "/usb@7d008000";
|
||||
usb0 = "/usb@7d000000";
|
||||
usb1 = "/usb@7d008000";
|
||||
};
|
||||
|
||||
memory {
|
||||
@ -77,6 +78,12 @@
|
||||
bus-width = <8>;
|
||||
};
|
||||
|
||||
usb@7d000000 {
|
||||
status = "okay";
|
||||
dr_mode = "otg";
|
||||
nvidia,vbus-gpio = <&gpio 108 0>; /* gpio PN4, USB_VBUS_EN0 */
|
||||
};
|
||||
|
||||
usb@7d008000 {
|
||||
status = "okay";
|
||||
nvidia,vbus-gpio = <&gpio 109 0>; /* gpio PN5, USB_VBUS_EN1 */
|
||||
|
@ -1,3 +1,6 @@
|
||||
#include <dt-bindings/gpio/tegra-gpio.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
#include "skeleton.dtsi"
|
||||
|
||||
/ {
|
||||
@ -49,14 +52,14 @@
|
||||
gpio: gpio@6000d000 {
|
||||
compatible = "nvidia,tegra124-gpio", "nvidia,tegra30-gpio";
|
||||
reg = <0x6000d000 0x1000>;
|
||||
interrupts = <0 32 0x04
|
||||
0 33 0x04
|
||||
0 34 0x04
|
||||
0 35 0x04
|
||||
0 55 0x04
|
||||
0 87 0x04
|
||||
0 89 0x04
|
||||
0 125 0x04>;
|
||||
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#gpio-cells = <2>;
|
||||
gpio-controller;
|
||||
#interrupt-cells = <2>;
|
||||
|
@ -1,3 +1,6 @@
|
||||
#include <dt-bindings/gpio/tegra-gpio.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
#include "skeleton.dtsi"
|
||||
|
||||
/ {
|
||||
@ -139,10 +142,18 @@
|
||||
|
||||
gpio: gpio@6000d000 {
|
||||
compatible = "nvidia,tegra20-gpio";
|
||||
reg = < 0x6000d000 0x1000 >;
|
||||
interrupts = < 64 65 66 67 87 119 121 >;
|
||||
reg = <0x6000d000 0x1000>;
|
||||
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#gpio-cells = <2>;
|
||||
gpio-controller;
|
||||
#interrupt-cells = <2>;
|
||||
interrupt-controller;
|
||||
};
|
||||
|
||||
pinmux: pinmux@70000000 {
|
||||
|
@ -14,7 +14,8 @@
|
||||
i2c4 = "/i2c@7000c700";
|
||||
sdhci0 = "/sdhci@78000600";
|
||||
sdhci1 = "/sdhci@78000000";
|
||||
usb0 = "/usb@7d008000";
|
||||
usb0 = "/usb@7d000000";
|
||||
usb1 = "/usb@7d008000";
|
||||
};
|
||||
|
||||
memory {
|
||||
@ -70,6 +71,12 @@
|
||||
bus-width = <8>;
|
||||
};
|
||||
|
||||
usb@7d000000 {
|
||||
status = "okay";
|
||||
dr_mode = "otg";
|
||||
nvidia,vbus-gpio = <&gpio 238 0>; /* gpio DD6, PEX_L1_CLKREQ */
|
||||
};
|
||||
|
||||
usb@7d008000 {
|
||||
nvidia,vbus-gpio = <&gpio 236 0>; /* PDD4 */
|
||||
status = "okay";
|
||||
|
@ -1,3 +1,6 @@
|
||||
#include <dt-bindings/gpio/tegra-gpio.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
#include "skeleton.dtsi"
|
||||
|
||||
/ {
|
||||
@ -47,17 +50,17 @@
|
||||
clocks = <&tegra_car 34>;
|
||||
};
|
||||
|
||||
gpio: gpio {
|
||||
gpio: gpio@6000d000 {
|
||||
compatible = "nvidia,tegra30-gpio";
|
||||
reg = <0x6000d000 0x1000>;
|
||||
interrupts = <0 32 0x04
|
||||
0 33 0x04
|
||||
0 34 0x04
|
||||
0 35 0x04
|
||||
0 55 0x04
|
||||
0 87 0x04
|
||||
0 89 0x04
|
||||
0 125 0x04>;
|
||||
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#gpio-cells = <2>;
|
||||
gpio-controller;
|
||||
#interrupt-cells = <2>;
|
||||
|
56
arch/arm/dts/tps65217.dtsi
Normal file
56
arch/arm/dts/tps65217.dtsi
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Integrated Power Management Chip
|
||||
* http://www.ti.com/lit/ds/symlink/tps65217.pdf
|
||||
*/
|
||||
|
||||
&tps {
|
||||
compatible = "ti,tps65217";
|
||||
|
||||
regulators {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
dcdc1_reg: regulator@0 {
|
||||
reg = <0>;
|
||||
regulator-compatible = "dcdc1";
|
||||
};
|
||||
|
||||
dcdc2_reg: regulator@1 {
|
||||
reg = <1>;
|
||||
regulator-compatible = "dcdc2";
|
||||
};
|
||||
|
||||
dcdc3_reg: regulator@2 {
|
||||
reg = <2>;
|
||||
regulator-compatible = "dcdc3";
|
||||
};
|
||||
|
||||
ldo1_reg: regulator@3 {
|
||||
reg = <3>;
|
||||
regulator-compatible = "ldo1";
|
||||
};
|
||||
|
||||
ldo2_reg: regulator@4 {
|
||||
reg = <4>;
|
||||
regulator-compatible = "ldo2";
|
||||
};
|
||||
|
||||
ldo3_reg: regulator@5 {
|
||||
reg = <5>;
|
||||
regulator-compatible = "ldo3";
|
||||
};
|
||||
|
||||
ldo4_reg: regulator@6 {
|
||||
reg = <6>;
|
||||
regulator-compatible = "ldo4";
|
||||
};
|
||||
};
|
||||
};
|
@ -34,10 +34,6 @@ $(IMX_CONFIG): %.cfgtmp: % FORCE
|
||||
$(Q)mkdir -p $(dir $@)
|
||||
$(call if_changed_dep,cpp_cfg)
|
||||
|
||||
quiet_cmd_mkimage = MKIMAGE $@
|
||||
cmd_mkimage = $(objtree)/tools/mkimage $(MKIMAGEFLAGS_$(@F)) -d $< $@ \
|
||||
$(if $(KBUILD_VERBOSE:1=), >/dev/null)
|
||||
|
||||
MKIMAGEFLAGS_u-boot.imx = -n $(filter-out $< $(PHONY),$^) -T imximage \
|
||||
-e $(CONFIG_SYS_TEXT_BASE)
|
||||
|
||||
|
@ -107,6 +107,7 @@ const struct dpll_params *get_dpll_mpu_params(void);
|
||||
const struct dpll_params *get_dpll_core_params(void);
|
||||
const struct dpll_params *get_dpll_per_params(void);
|
||||
const struct dpll_params *get_dpll_ddr_params(void);
|
||||
void scale_vcores(void);
|
||||
void do_setup_dpll(const struct dpll_regs *, const struct dpll_params *);
|
||||
void prcm_init(void);
|
||||
void enable_basic_clocks(void);
|
||||
|
@ -26,7 +26,17 @@
|
||||
#define TCLR_PRE BIT(5) /* Pre-scaler enable */
|
||||
#define TCLR_PTV_SHIFT (2) /* Pre-scaler shift value */
|
||||
#define TCLR_PRE_DISABLE CL_BIT(5) /* Pre-scalar disable */
|
||||
#define TCLR_CE BIT(6) /* compare mode enable */
|
||||
#define TCLR_SCPWM BIT(7) /* pwm outpin behaviour */
|
||||
#define TCLR_TCM BIT(8) /* edge detection of input pin*/
|
||||
#define TCLR_TRG_SHIFT (10) /* trigmode on pwm outpin */
|
||||
#define TCLR_PT BIT(12) /* pulse/toggle mode of outpin*/
|
||||
#define TCLR_CAPTMODE BIT(13) /* capture mode */
|
||||
#define TCLR_GPOCFG BIT(14) /* 0=output,1=input */
|
||||
|
||||
#define TCFG_RESET BIT(0) /* software reset */
|
||||
#define TCFG_EMUFREE BIT(1) /* behaviour of tmr on debug */
|
||||
#define TCFG_IDLEMOD_SHIFT (2) /* power management */
|
||||
/* device type */
|
||||
#define DEVICE_MASK (BIT(8) | BIT(9) | BIT(10))
|
||||
#define TST_DEVICE 0x0
|
||||
@ -87,7 +97,8 @@ struct cm_wkuppll {
|
||||
unsigned int wkctrlclkctrl; /* offset 0x04 */
|
||||
unsigned int wkgpio0clkctrl; /* offset 0x08 */
|
||||
unsigned int wkl4wkclkctrl; /* offset 0x0c */
|
||||
unsigned int resv2[4];
|
||||
unsigned int timer0clkctrl; /* offset 0x10 */
|
||||
unsigned int resv2[3];
|
||||
unsigned int idlestdpllmpu; /* offset 0x20 */
|
||||
unsigned int resv3[2];
|
||||
unsigned int clkseldpllmpu; /* offset 0x2c */
|
||||
@ -121,7 +132,9 @@ struct cm_wkuppll {
|
||||
unsigned int wkup_uart0ctrl; /* offset 0xB4 */
|
||||
unsigned int wkup_i2c0ctrl; /* offset 0xB8 */
|
||||
unsigned int wkup_adctscctrl; /* offset 0xBC */
|
||||
unsigned int resv12[6];
|
||||
unsigned int resv12;
|
||||
unsigned int timer1clkctrl; /* offset 0xC4 */
|
||||
unsigned int resv13[4];
|
||||
unsigned int divm6dpllcore; /* offset 0xD8 */
|
||||
};
|
||||
|
||||
@ -178,7 +191,9 @@ struct cm_perpll {
|
||||
unsigned int epwmss2clkctrl; /* offset 0xD8 */
|
||||
unsigned int l3instrclkctrl; /* offset 0xDC */
|
||||
unsigned int l3clkctrl; /* Offset 0xE0 */
|
||||
unsigned int resv8[4];
|
||||
unsigned int resv8[2];
|
||||
unsigned int timer5clkctrl; /* offset 0xEC */
|
||||
unsigned int timer6clkctrl; /* offset 0xF0 */
|
||||
unsigned int mmc1clkctrl; /* offset 0xF4 */
|
||||
unsigned int mmc2clkctrl; /* offset 0xF8 */
|
||||
unsigned int resv9[8];
|
||||
@ -191,9 +206,17 @@ struct cm_perpll {
|
||||
|
||||
/* Encapsulating Display pll registers */
|
||||
struct cm_dpll {
|
||||
unsigned int resv1[2];
|
||||
unsigned int resv1;
|
||||
unsigned int clktimer7clk; /* offset 0x04 */
|
||||
unsigned int clktimer2clk; /* offset 0x08 */
|
||||
unsigned int resv2[10];
|
||||
unsigned int clktimer3clk; /* offset 0x0C */
|
||||
unsigned int clktimer4clk; /* offset 0x10 */
|
||||
unsigned int resv2;
|
||||
unsigned int clktimer5clk; /* offset 0x18 */
|
||||
unsigned int clktimer6clk; /* offset 0x1C */
|
||||
unsigned int resv3[2];
|
||||
unsigned int clktimer1clk; /* offset 0x28 */
|
||||
unsigned int resv4[2];
|
||||
unsigned int clklcdcpixelclk; /* offset 0x34 */
|
||||
};
|
||||
#else
|
||||
@ -466,6 +489,12 @@ struct ctrl_stat {
|
||||
#define OMAP_GPIO_SETDATAOUT 0x0194
|
||||
|
||||
/* Control Device Register */
|
||||
|
||||
/* Control Device Register */
|
||||
#define MREQPRIO_0_SAB_INIT1_MASK 0xFFFFFF8F
|
||||
#define MREQPRIO_0_SAB_INIT0_MASK 0xFFFFFFF8
|
||||
#define MREQPRIO_1_DSS_MASK 0xFFFFFF8F
|
||||
|
||||
struct ctrl_dev {
|
||||
unsigned int deviceid; /* offset 0x00 */
|
||||
unsigned int resv1[7];
|
||||
@ -479,10 +508,25 @@ struct ctrl_dev {
|
||||
unsigned int macid1h; /* offset 0x3c */
|
||||
unsigned int resv4[4];
|
||||
unsigned int miisel; /* offset 0x50 */
|
||||
unsigned int resv5[106];
|
||||
unsigned int resv5[7];
|
||||
unsigned int mreqprio_0; /* offset 0x70 */
|
||||
unsigned int mreqprio_1; /* offset 0x74 */
|
||||
unsigned int resv6[97];
|
||||
unsigned int efuse_sma; /* offset 0x1FC */
|
||||
};
|
||||
|
||||
/* Bandwidth Limiter Portion of the L3Fast Configuration Register */
|
||||
#define BW_LIMITER_BW_FRAC_MASK 0xFFFFFFE0
|
||||
#define BW_LIMITER_BW_INT_MASK 0xFFFFFFF0
|
||||
#define BW_LIMITER_BW_WATERMARK_MASK 0xFFFFF800
|
||||
|
||||
struct l3f_cfg_bwlimiter {
|
||||
u32 padding0[2];
|
||||
u32 modena_init0_bw_fractional;
|
||||
u32 modena_init0_bw_integer;
|
||||
u32 modena_init0_watermark_0;
|
||||
};
|
||||
|
||||
/* gmii_sel register defines */
|
||||
#define GMII1_SEL_MII 0x0
|
||||
#define GMII1_SEL_RMII 0x1
|
||||
|
@ -13,6 +13,9 @@
|
||||
|
||||
/* Module base addresses */
|
||||
|
||||
/* L3 Fast Configuration Bandwidth Limiter Base Address */
|
||||
#define L3F_CFG_BWLIMITER 0x44005200
|
||||
|
||||
/* UART Base Address */
|
||||
#define UART0_BASE 0x44E09000
|
||||
|
||||
@ -40,6 +43,11 @@
|
||||
#define VTP0_CTRL_ADDR 0x44E10E0C
|
||||
#define VTP1_CTRL_ADDR 0x48140E10
|
||||
|
||||
/* USB CTRL Base Address */
|
||||
#define USB1_CTRL 0x44e10628
|
||||
#define USB1_CTRL_CM_PWRDN BIT(0)
|
||||
#define USB1_CTRL_OTG_PWRDN BIT(1)
|
||||
|
||||
/* DDR Base address */
|
||||
#define DDR_PHY_CMD_ADDR 0x44E12000
|
||||
#define DDR_PHY_DATA_ADDR 0x44E120C8
|
||||
|
@ -29,6 +29,8 @@
|
||||
#define SRAM_SCRATCH_SPACE_ADDR 0x40337C00
|
||||
#define AM4372_BOARD_NAME_START SRAM_SCRATCH_SPACE_ADDR
|
||||
#define AM4372_BOARD_NAME_END SRAM_SCRATCH_SPACE_ADDR + 0xC
|
||||
#define AM4372_BOARD_VERSION_START SRAM_SCRATCH_SPACE_ADDR + 0xD
|
||||
#define AM4372_BOARD_VERSION_END SRAM_SCRATCH_SPACE_ADDR + 0x14
|
||||
#define QSPI_BASE 0x47900000
|
||||
#endif
|
||||
#endif
|
||||
|
@ -70,7 +70,10 @@ typedef struct at91_pmc {
|
||||
|
||||
#define AT91_PMC_MOR_MOSCEN 0x01
|
||||
#define AT91_PMC_MOR_OSCBYPASS 0x02
|
||||
#define AT91_PMC_MOR_MOSCRCEN 0x08
|
||||
#define AT91_PMC_MOR_OSCOUNT(x) ((x & 0xff) << 8)
|
||||
#define AT91_PMC_MOR_KEY(x) ((x & 0xff) << 16)
|
||||
#define AT91_PMC_MOR_MOSCSEL (1 << 24)
|
||||
|
||||
#define AT91_PMC_PLLXR_DIV(x) (x & 0xFF)
|
||||
#define AT91_PMC_PLLXR_PLLCOUNT(x) ((x & 0x3F) << 8)
|
||||
@ -142,6 +145,7 @@ typedef struct at91_pmc {
|
||||
#define AT91_PMC_IXR_PCKRDY1 0x00000200
|
||||
#define AT91_PMC_IXR_PCKRDY2 0x00000400
|
||||
#define AT91_PMC_IXR_PCKRDY3 0x00000800
|
||||
#define AT91_PMC_IXR_MOSCSELS 0x00010000
|
||||
|
||||
#define AT91_PMC_PCK (1 << 0) /* Processor Clock */
|
||||
#define AT91RM9200_PMC_UDP (1 << 1) /* USB Devcice Port Clock [AT91RM9200 only] */
|
||||
|
@ -12,6 +12,9 @@
|
||||
#ifndef __AT91SAM9X5_H__
|
||||
#define __AT91SAM9X5_H__
|
||||
|
||||
#define CONFIG_ARM926EJS /* ARM926EJS Core */
|
||||
#define CONFIG_AT91FAMILY /* it's a member of AT91 family */
|
||||
|
||||
/*
|
||||
* Peripheral identifiers/interrupts.
|
||||
*/
|
||||
|
@ -25,8 +25,6 @@
|
||||
# include <asm/arch/at91sam9x5.h>
|
||||
#elif defined(CONFIG_AT91CAP9)
|
||||
# include <asm/arch/at91cap9.h>
|
||||
#elif defined(CONFIG_AT91X40)
|
||||
# include <asm/arch/at91x40.h>
|
||||
#elif defined(CONFIG_SAMA5D3)
|
||||
# include <asm/arch/sama5d3.h>
|
||||
#else
|
||||
|
@ -1,72 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
#ifndef _EMIF_DEFS_H_
|
||||
#define _EMIF_DEFS_H_
|
||||
|
||||
#include <asm/arch/hardware.h>
|
||||
|
||||
struct davinci_emif_regs {
|
||||
u_int32_t ercsr;
|
||||
u_int32_t awccr;
|
||||
u_int32_t sdbcr;
|
||||
u_int32_t sdrcr;
|
||||
u_int32_t ab1cr;
|
||||
u_int32_t ab2cr;
|
||||
u_int32_t ab3cr;
|
||||
u_int32_t ab4cr;
|
||||
u_int32_t sdtimr;
|
||||
u_int32_t ddrsr;
|
||||
u_int32_t ddrphycr;
|
||||
u_int32_t ddrphysr;
|
||||
u_int32_t totar;
|
||||
u_int32_t totactr;
|
||||
u_int32_t ddrphyid_rev;
|
||||
u_int32_t sdsretr;
|
||||
u_int32_t eirr;
|
||||
u_int32_t eimr;
|
||||
u_int32_t eimsr;
|
||||
u_int32_t eimcr;
|
||||
u_int32_t ioctrlr;
|
||||
u_int32_t iostatr;
|
||||
u_int8_t rsvd0[8];
|
||||
u_int32_t nandfcr;
|
||||
u_int32_t nandfsr;
|
||||
u_int8_t rsvd1[8];
|
||||
u_int32_t nandfecc[4];
|
||||
u_int8_t rsvd2[60];
|
||||
u_int32_t nand4biteccload;
|
||||
u_int32_t nand4bitecc[4];
|
||||
u_int32_t nanderradd1;
|
||||
u_int32_t nanderradd2;
|
||||
u_int32_t nanderrval1;
|
||||
u_int32_t nanderrval2;
|
||||
};
|
||||
|
||||
#define davinci_emif_regs \
|
||||
((struct davinci_emif_regs *)DAVINCI_ASYNC_EMIF_CNTRL_BASE)
|
||||
|
||||
#define DAVINCI_NANDFCR_NAND_ENABLE(n) (1 << (n-2))
|
||||
#define DAVINCI_NANDFCR_4BIT_ECC_SEL_MASK (3 << 4)
|
||||
#define DAVINCI_NANDFCR_4BIT_ECC_SEL(n) ((n-2) << 4)
|
||||
#define DAVINCI_NANDFCR_1BIT_ECC_START(n) (1 << (8 + (n-2)))
|
||||
#define DAVINCI_NANDFCR_4BIT_ECC_START (1 << 12)
|
||||
#define DAVINCI_NANDFCR_4BIT_CALC_START (1 << 13)
|
||||
#define DAVINCI_NANDFCR_CS2NAND (1 << 0)
|
||||
|
||||
/* Chip Select setup */
|
||||
#define DAVINCI_ABCR_STROBE_SELECT (1 << 31)
|
||||
#define DAVINCI_ABCR_EXT_WAIT (1 << 30)
|
||||
#define DAVINCI_ABCR_WSETUP(n) (n << 26)
|
||||
#define DAVINCI_ABCR_WSTROBE(n) (n << 20)
|
||||
#define DAVINCI_ABCR_WHOLD(n) (n << 17)
|
||||
#define DAVINCI_ABCR_RSETUP(n) (n << 13)
|
||||
#define DAVINCI_ABCR_RSTROBE(n) (n << 7)
|
||||
#define DAVINCI_ABCR_RHOLD(n) (n << 4)
|
||||
#define DAVINCI_ABCR_TA(n) (n << 2)
|
||||
#define DAVINCI_ABCR_ASIZE_16BIT 1
|
||||
#define DAVINCI_ABCR_ASIZE_8BIT 0
|
||||
|
||||
#endif
|
@ -597,7 +597,6 @@ static inline enum davinci_clk_ids get_async3_src(void)
|
||||
#if defined(CONFIG_SOC_DM365)
|
||||
#include <asm/arch/aintc_defs.h>
|
||||
#include <asm/arch/ddr2_defs.h>
|
||||
#include <asm/arch/emif_defs.h>
|
||||
#include <asm/arch/gpio.h>
|
||||
#include <asm/arch/pll_defs.h>
|
||||
#include <asm/arch/psc_defs.h>
|
||||
|
@ -1,38 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
|
||||
*
|
||||
* Parts shamelesly stolen from Linux Kernel source tree.
|
||||
*
|
||||
* ------------------------------------------------------------
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
#ifndef _NAND_DEFS_H_
|
||||
#define _NAND_DEFS_H_
|
||||
|
||||
#include <asm/arch/hardware.h>
|
||||
|
||||
#ifdef CONFIG_SOC_DM646X
|
||||
#define MASK_CLE 0x80000
|
||||
#define MASK_ALE 0x40000
|
||||
#else
|
||||
#define MASK_CLE 0x10
|
||||
#define MASK_ALE 0x08
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SYS_NAND_MASK_CLE
|
||||
#undef MASK_CLE
|
||||
#define MASK_CLE CONFIG_SYS_NAND_MASK_CLE
|
||||
#endif
|
||||
#ifdef CONFIG_SYS_NAND_MASK_ALE
|
||||
#undef MASK_ALE
|
||||
#define MASK_ALE CONFIG_SYS_NAND_MASK_ALE
|
||||
#endif
|
||||
|
||||
#define NAND_READ_START 0x00
|
||||
#define NAND_READ_END 0x30
|
||||
#define NAND_STATUS 0x70
|
||||
|
||||
extern void davinci_nand_init(struct nand_chip *nand);
|
||||
|
||||
#endif
|
@ -1,6 +1,9 @@
|
||||
/*
|
||||
* Cirrus Logic EP93xx register definitions.
|
||||
*
|
||||
* Copyright (C) 2013
|
||||
* Sergey Kostanbaev <sergey.kostanbaev <at> fairwaves.ru>
|
||||
*
|
||||
* Copyright (C) 2009
|
||||
* Matthias Kaehlcke <matthias@kaehlcke.net>
|
||||
*
|
||||
@ -287,6 +290,20 @@ struct sdram_regs {
|
||||
#define SDRAM_DEVCFG_CASLAT_2 0x00010000
|
||||
#define SDRAM_DEVCFG_RASTOCAS_2 0x00200000
|
||||
|
||||
#define SDRAM_OFF_GLCONFIG 0x0004
|
||||
#define SDRAM_OFF_REFRSHTIMR 0x0008
|
||||
|
||||
#define SDRAM_OFF_DEVCFG0 0x0010
|
||||
#define SDRAM_OFF_DEVCFG1 0x0014
|
||||
#define SDRAM_OFF_DEVCFG2 0x0018
|
||||
#define SDRAM_OFF_DEVCFG3 0x001C
|
||||
|
||||
#define SDRAM_DEVCFG0_BASE 0xC0000000
|
||||
#define SDRAM_DEVCFG1_BASE 0xD0000000
|
||||
#define SDRAM_DEVCFG2_BASE 0xE0000000
|
||||
#define SDRAM_DEVCFG3_ASD0_BASE 0xF0000000
|
||||
#define SDRAM_DEVCFG3_ASD1_BASE 0x00000000
|
||||
|
||||
#define GLCONFIG_INIT (1 << 0)
|
||||
#define GLCONFIG_MRS (1 << 1)
|
||||
#define GLCONFIG_SMEMBUSY (1 << 5)
|
||||
@ -295,6 +312,43 @@ struct sdram_regs {
|
||||
#define GLCONFIG_CLKSHUTDOWN (1 << 30)
|
||||
#define GLCONFIG_CKE (1 << 31)
|
||||
|
||||
#define EP93XX_SDRAMCTRL 0x80060000
|
||||
#define EP93XX_SDRAMCTRL_GLOBALCFG_INIT 0x00000001
|
||||
#define EP93XX_SDRAMCTRL_GLOBALCFG_MRS 0x00000002
|
||||
#define EP93XX_SDRAMCTRL_GLOBALCFG_SMEMBUSY 0x00000020
|
||||
#define EP93XX_SDRAMCTRL_GLOBALCFG_LCR 0x00000040
|
||||
#define EP93XX_SDRAMCTRL_GLOBALCFG_REARBEN 0x00000080
|
||||
#define EP93XX_SDRAMCTRL_GLOBALCFG_CLKSHUTDOWN 0x40000000
|
||||
#define EP93XX_SDRAMCTRL_GLOBALCFG_CKE 0x80000000
|
||||
|
||||
#define EP93XX_SDRAMCTRL_REFRESH_MASK 0x0000FFFF
|
||||
|
||||
#define EP93XX_SDRAMCTRL_BOOTSTATUS_WIDTH_32 0x00000002
|
||||
#define EP93XX_SDRAMCTRL_BOOTSTATUS_WIDTH_16 0x00000001
|
||||
#define EP93XX_SDRAMCTRL_BOOTSTATUS_WIDTH_8 0x00000000
|
||||
#define EP93XX_SDRAMCTRL_BOOTSTATUS_WIDTH_MASK 0x00000003
|
||||
#define EP93XX_SDRAMCTRL_BOOTSTATUS_MEDIA 0x00000004
|
||||
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_EXTBUSWIDTH 0x00000004
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_BANKCOUNT 0x00000008
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_SROM512 0x00000010
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_SROMLL 0x00000020
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_2KPAGE 0x00000040
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_SFCONFIGADDR 0x00000080
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_CASLAT_MASK 0x00070000
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_CASLAT_2 0x00010000
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_CASLAT_3 0x00020000
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_CASLAT_4 0x00030000
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_CASLAT_5 0x00040000
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_CASLAT_6 0x00050000
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_CASLAT_7 0x00060000
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_CASLAT_8 0x00070000
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_WBL 0x00080000
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_RASTOCAS_MASK 0x00300000
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_RASTOCAS_2 0x00200000
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_RASTOCAS_3 0x00300000
|
||||
#define EP93XX_SDRAMCTRL_DEVCFG_AUTOPRECHARGE 0x01000000
|
||||
|
||||
/*
|
||||
* 0x80070000 - 0x8007FFFF: Reserved
|
||||
*/
|
||||
@ -324,6 +378,13 @@ struct smc_regs {
|
||||
};
|
||||
#endif
|
||||
|
||||
#define EP93XX_OFF_SMCBCR0 0x00
|
||||
#define EP93XX_OFF_SMCBCR1 0x04
|
||||
#define EP93XX_OFF_SMCBCR2 0x08
|
||||
#define EP93XX_OFF_SMCBCR3 0x0C
|
||||
#define EP93XX_OFF_SMCBCR6 0x18
|
||||
#define EP93XX_OFF_SMCBCR7 0x1C
|
||||
|
||||
#define SMC_BCR_IDCY_SHIFT 0
|
||||
#define SMC_BCR_WST1_SHIFT 5
|
||||
#define SMC_BCR_BLE (1 << 10)
|
||||
@ -445,6 +506,14 @@ struct gpio_regs {
|
||||
};
|
||||
#endif
|
||||
|
||||
#define EP93XX_LED_DATA 0x80840020
|
||||
#define EP93XX_LED_GREEN_ON 0x0001
|
||||
#define EP93XX_LED_RED_ON 0x0002
|
||||
|
||||
#define EP93XX_LED_DDR 0x80840024
|
||||
#define EP93XX_LED_GREEN_ENABLE 0x0001
|
||||
#define EP93XX_LED_RED_ENABLE 0x00020000
|
||||
|
||||
/*
|
||||
* 0x80850000 - 0x8087FFFF: Reserved
|
||||
*/
|
||||
@ -519,6 +588,9 @@ struct gpio_regs {
|
||||
#define SYSCON_OFFSET 0x930000
|
||||
#define SYSCON_BASE (EP93XX_APB_BASE | SYSCON_OFFSET)
|
||||
|
||||
/* Security */
|
||||
#define SECURITY_EXTENSIONID 0x80832714
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
struct syscon_regs {
|
||||
uint32_t pwrsts;
|
||||
@ -553,7 +625,11 @@ struct syscon_regs {
|
||||
#define SYSCON_SCRATCH0 (SYSCON_BASE + 0x0040)
|
||||
#endif
|
||||
|
||||
#define SYSCON_OFF_CLKSET1 0x0020
|
||||
#define SYSCON_OFF_SYSCFG 0x009c
|
||||
|
||||
#define SYSCON_PWRCNT_UART_BAUD (1 << 29)
|
||||
#define SYSCON_PWRCNT_USH_EN (1 << 28)
|
||||
|
||||
#define SYSCON_CLKSET_PLL_X2IPD_SHIFT 0
|
||||
#define SYSCON_CLKSET_PLL_X2FBD2_SHIFT 5
|
||||
@ -571,6 +647,8 @@ struct syscon_regs {
|
||||
#define SYSCON_CHIPID_REV_MASK 0xF0000000
|
||||
#define SYSCON_DEVICECFG_SWRST (1 << 31)
|
||||
|
||||
#define SYSCON_SYSCFG_LASDO 0x00000020
|
||||
|
||||
/*
|
||||
* 0x80930000 - 0x8093FFFF: Watchdog Timer
|
||||
*/
|
||||
@ -580,3 +658,10 @@ struct syscon_regs {
|
||||
/*
|
||||
* 0x80950000 - 0x9000FFFF: Reserved
|
||||
*/
|
||||
|
||||
/*
|
||||
* During low_level init we store memory layout in memory at specific location
|
||||
*/
|
||||
#define UBOOT_MEMORYCNF_BANK_SIZE 0x2000
|
||||
#define UBOOT_MEMORYCNF_BANK_MASK 0x2004
|
||||
#define UBOOT_MEMORYCNF_BANK_COUNT 0x2008
|
||||
|
@ -16,6 +16,11 @@
|
||||
#define BPLL 5
|
||||
#define RPLL 6
|
||||
|
||||
#define MASK_PRE_RATIO(x) (0xff << ((x << 4) + 8))
|
||||
#define MASK_RATIO(x) (0xf << (x << 4))
|
||||
#define SET_PRE_RATIO(x, y) ((y & 0xff) << ((x << 4) + 8))
|
||||
#define SET_RATIO(x, y) ((y & 0xf) << (x << 4))
|
||||
|
||||
enum pll_src_bit {
|
||||
EXYNOS_SRC_MPLL = 6,
|
||||
EXYNOS_SRC_EPLL,
|
||||
|
@ -467,6 +467,9 @@ enum mem_manuf {
|
||||
/* PHY_CON1 register fields */
|
||||
#define PHY_CON1_RDLVL_RDDATA_ADJ_SHIFT 0
|
||||
|
||||
/* PHY_CON4 rgister fields */
|
||||
#define PHY_CON10_CTRL_OFFSETR3 (1 << 24)
|
||||
|
||||
/* PHY_CON12 register fields */
|
||||
#define PHY_CON12_CTRL_START_POINT_SHIFT 24
|
||||
#define PHY_CON12_CTRL_INC_SHIFT 16
|
||||
|
@ -906,8 +906,8 @@ struct exynos5420_power {
|
||||
unsigned int sysip_dat3;
|
||||
unsigned char res11[0xe0];
|
||||
unsigned int pmu_spare0;
|
||||
unsigned int pmu_spare1;
|
||||
unsigned int pmu_spare2;
|
||||
unsigned int pmu_spare1; /* Store PHY0_CON4 for read leveling */
|
||||
unsigned int pmu_spare2; /* Store PHY1_CON4 for read leveling */
|
||||
unsigned int pmu_spare3;
|
||||
unsigned char res12[0x4];
|
||||
unsigned int cg_status0;
|
||||
@ -1726,4 +1726,5 @@ uint32_t get_reset_status(void);
|
||||
|
||||
/* Read the resume function and call it */
|
||||
void power_exit_wakeup(void);
|
||||
|
||||
#endif
|
||||
|
23
arch/arm/include/asm/arch-fsl-lsch3/clock.h
Normal file
23
arch/arm/include/asm/arch-fsl-lsch3/clock.h
Normal file
@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Copyright 2014 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_FSL_LSCH3_CLOCK_H_
|
||||
#define __ASM_ARCH_FSL_LSCH3_CLOCK_H_
|
||||
|
||||
#include <common.h>
|
||||
|
||||
enum mxc_clock {
|
||||
MXC_ARM_CLK = 0,
|
||||
MXC_BUS_CLK,
|
||||
MXC_UART_CLK,
|
||||
MXC_ESDHC_CLK,
|
||||
MXC_I2C_CLK,
|
||||
};
|
||||
|
||||
unsigned int mxc_get_clock(enum mxc_clock clk);
|
||||
|
||||
#endif /* __ASM_ARCH_FSL_LSCH3_CLOCK_H_ */
|
65
arch/arm/include/asm/arch-fsl-lsch3/config.h
Normal file
65
arch/arm/include/asm/arch-fsl-lsch3/config.h
Normal file
@ -0,0 +1,65 @@
|
||||
/*
|
||||
* Copyright 2014, Freescale Semiconductor
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#ifndef _ASM_ARMV8_FSL_LSCH3_CONFIG_
|
||||
#define _ASM_ARMV8_FSL_LSCH3_CONFIG_
|
||||
|
||||
#include <fsl_ddrc_version.h>
|
||||
|
||||
#define CONFIG_SYS_FSL_OCRAM_BASE 0x18000000 /* initial RAM */
|
||||
/* Link Definitions */
|
||||
#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_FSL_OCRAM_BASE + 0xfff0)
|
||||
|
||||
#define CONFIG_SYS_IMMR 0x01000000
|
||||
#define CONFIG_SYS_FSL_DDR_ADDR (CONFIG_SYS_IMMR + 0x00080000)
|
||||
#define CONFIG_SYS_FSL_DDR2_ADDR (CONFIG_SYS_IMMR + 0x00090000)
|
||||
#define CONFIG_SYS_FSL_GUTS_ADDR (CONFIG_SYS_IMMR + 0x00E00000)
|
||||
#define CONFIG_SYS_FSL_PMU_ADDR (CONFIG_SYS_IMMR + 0x00E30000)
|
||||
#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_CTRL_ADDR (CONFIG_SYS_IMMR + 0x00370000)
|
||||
#define CONFIG_SYS_IFC_ADDR (CONFIG_SYS_IMMR + 0x01240000)
|
||||
#define CONFIG_SYS_NS16550_COM1 (CONFIG_SYS_IMMR + 0x011C0500)
|
||||
#define CONFIG_SYS_NS16550_COM2 (CONFIG_SYS_IMMR + 0x011C0600)
|
||||
#define CONFIG_SYS_FSL_TIMER_ADDR 0x023d0000
|
||||
#define CONFIG_SYS_FSL_PMU_CLTBENR (CONFIG_SYS_FSL_PMU_ADDR + \
|
||||
0x18A0)
|
||||
|
||||
#define I2C1_BASE_ADDR (CONFIG_SYS_IMMR + 0x01000000)
|
||||
#define I2C2_BASE_ADDR (CONFIG_SYS_IMMR + 0x01010000)
|
||||
#define I2C3_BASE_ADDR (CONFIG_SYS_IMMR + 0x01020000)
|
||||
#define I2C4_BASE_ADDR (CONFIG_SYS_IMMR + 0x01030000)
|
||||
|
||||
/* Generic Interrupt Controller Definitions */
|
||||
#define GICD_BASE 0x06000000
|
||||
#define GICR_BASE 0x06100000
|
||||
|
||||
/* SMMU Defintions */
|
||||
#define SMMU_BASE 0x05000000 /* GR0 Base */
|
||||
|
||||
/* DDR */
|
||||
#define CONFIG_SYS_FSL_DDR_LE
|
||||
#define CONFIG_VERY_BIG_RAM
|
||||
#define CONFIG_SYS_FSL_DDRC_ARM_GEN3 /* Enable Freescale ARM DDR3 driver */
|
||||
#define CONFIG_SYS_FSL_DDR /* Freescale DDR driver */
|
||||
#define CONFIG_SYS_LS2_DDR_BLOCK1_SIZE ((phys_size_t)2 << 30)
|
||||
#define CONFIG_MAX_MEM_MAPPED CONFIG_SYS_LS2_DDR_BLOCK1_SIZE
|
||||
#define CONFIG_SYS_FSL_DDR_VER FSL_DDR_VER_5_0
|
||||
|
||||
|
||||
/* IFC */
|
||||
#define CONFIG_SYS_FSL_IFC_LE
|
||||
|
||||
#ifdef CONFIG_LS2085A
|
||||
#define CONFIG_MAX_CPUS 16
|
||||
#define CONFIG_SYS_FSL_IFC_BANK_COUNT 8
|
||||
#define CONFIG_NUM_DDR_CONTROLLERS 2
|
||||
#define CONFIG_SYS_FSL_CLUSTER_CLOCKS { 1, 1, 4, 4 }
|
||||
#else
|
||||
#error SoC not defined
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_ARMV8_FSL_LSCH3_CONFIG_ */
|
9
arch/arm/include/asm/arch-fsl-lsch3/gpio.h
Normal file
9
arch/arm/include/asm/arch-fsl-lsch3/gpio.h
Normal file
@ -0,0 +1,9 @@
|
||||
/*
|
||||
* Copyright 2014, Freescale Semiconductor
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#ifndef _ASM_ARMV8_FSL_LSCH3_GPIO_H_
|
||||
#define _ASM_ARMV8_FSL_LSCH3_GPIO_H_
|
||||
#endif /* _ASM_ARMV8_FSL_LSCH3_GPIO_H_ */
|
116
arch/arm/include/asm/arch-fsl-lsch3/immap_lsch3.h
Normal file
116
arch/arm/include/asm/arch-fsl-lsch3/immap_lsch3.h
Normal file
@ -0,0 +1,116 @@
|
||||
/*
|
||||
* LayerScape Internal Memory Map
|
||||
*
|
||||
* Copyright 2014 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#ifndef __ARCH_FSL_LSCH3_IMMAP_H
|
||||
#define __ARCH_FSL_LSCH3_IMMAP_H_
|
||||
|
||||
/* This is chassis generation 3 */
|
||||
|
||||
struct sys_info {
|
||||
unsigned long freq_processor[CONFIG_MAX_CPUS];
|
||||
unsigned long freq_systembus;
|
||||
unsigned long freq_ddrbus;
|
||||
unsigned long freq_localbus;
|
||||
unsigned long freq_qe;
|
||||
#ifdef CONFIG_SYS_DPAA_FMAN
|
||||
unsigned long freq_fman[CONFIG_SYS_NUM_FMAN];
|
||||
#endif
|
||||
#ifdef CONFIG_SYS_DPAA_QBMAN
|
||||
unsigned long freq_qman;
|
||||
#endif
|
||||
#ifdef CONFIG_SYS_DPAA_PME
|
||||
unsigned long freq_pme;
|
||||
#endif
|
||||
};
|
||||
|
||||
/* Global Utilities Block */
|
||||
struct ccsr_gur {
|
||||
u32 porsr1; /* POR status 1 */
|
||||
u32 porsr2; /* POR status 2 */
|
||||
u8 res_008[0x20-0x8];
|
||||
u32 gpporcr1; /* General-purpose POR configuration */
|
||||
u32 gpporcr2; /* General-purpose POR configuration 2 */
|
||||
u32 dcfg_fusesr; /* Fuse status register */
|
||||
u32 gpporcr3;
|
||||
u32 gpporcr4;
|
||||
u8 res_034[0x70-0x34];
|
||||
u32 devdisr; /* Device disable control */
|
||||
u32 devdisr2; /* Device disable control 2 */
|
||||
u32 devdisr3; /* Device disable control 3 */
|
||||
u32 devdisr4; /* Device disable control 4 */
|
||||
u32 devdisr5; /* Device disable control 5 */
|
||||
u32 devdisr6; /* Device disable control 6 */
|
||||
u32 devdisr7; /* Device disable control 7 */
|
||||
u8 res_08c[0x90-0x8c];
|
||||
u32 coredisru; /* uppper portion for support of 64 cores */
|
||||
u32 coredisrl; /* lower portion for support of 64 cores */
|
||||
u8 res_098[0xa0-0x98];
|
||||
u32 pvr; /* Processor version */
|
||||
u32 svr; /* System version */
|
||||
u32 mvr; /* Manufacturing version */
|
||||
u8 res_0ac[0x100-0xac];
|
||||
u32 rcwsr[32]; /* Reset control word status */
|
||||
|
||||
#define FSL_CHASSIS3_RCWSR0_SYS_PLL_RAT_SHIFT 2
|
||||
#define FSL_CHASSIS3_RCWSR0_SYS_PLL_RAT_MASK 0x1f
|
||||
#define FSL_CHASSIS3_RCWSR0_MEM_PLL_RAT_SHIFT 10
|
||||
#define FSL_CHASSIS3_RCWSR0_MEM_PLL_RAT_MASK 0x3f
|
||||
u8 res_180[0x200-0x180];
|
||||
u32 scratchrw[32]; /* Scratch Read/Write */
|
||||
u8 res_280[0x300-0x280];
|
||||
u32 scratchw1r[4]; /* Scratch Read (Write once) */
|
||||
u8 res_310[0x400-0x310];
|
||||
u32 bootlocptrl; /* Boot location pointer low-order addr */
|
||||
u32 bootlocptrh; /* Boot location pointer high-order addr */
|
||||
u8 res_408[0x500-0x408];
|
||||
u8 res_500[0x740-0x500]; /* add more registers when needed */
|
||||
u32 tp_ityp[64]; /* Topology Initiator Type Register */
|
||||
struct {
|
||||
u32 upper;
|
||||
u32 lower;
|
||||
} tp_cluster[3]; /* Core Cluster n Topology Register */
|
||||
u8 res_858[0x1000-0x858];
|
||||
};
|
||||
|
||||
#define TP_ITYP_AV 0x00000001 /* Initiator available */
|
||||
#define TP_ITYP_TYPE(x) (((x) & 0x6) >> 1) /* Initiator Type */
|
||||
#define TP_ITYP_TYPE_ARM 0x0
|
||||
#define TP_ITYP_TYPE_PPC 0x1 /* PowerPC */
|
||||
#define TP_ITYP_TYPE_OTHER 0x2 /* StarCore DSP */
|
||||
#define TP_ITYP_TYPE_HA 0x3 /* HW Accelerator */
|
||||
#define TP_ITYP_THDS(x) (((x) & 0x18) >> 3) /* # threads */
|
||||
#define TP_ITYP_VER(x) (((x) & 0xe0) >> 5) /* Initiator Version */
|
||||
#define TY_ITYP_VER_A7 0x1
|
||||
#define TY_ITYP_VER_A53 0x2
|
||||
#define TY_ITYP_VER_A57 0x3
|
||||
|
||||
#define TP_CLUSTER_EOC 0x80000000 /* end of clusters */
|
||||
#define TP_CLUSTER_INIT_MASK 0x0000003f /* initiator mask */
|
||||
#define TP_INIT_PER_CLUSTER 4
|
||||
|
||||
struct ccsr_clk_cluster_group {
|
||||
struct {
|
||||
u8 res_00[0x10];
|
||||
u32 csr;
|
||||
u8 res_14[0x20-0x14];
|
||||
} hwncsr[3];
|
||||
u8 res_60[0x80-0x60];
|
||||
struct {
|
||||
u32 gsr;
|
||||
u8 res_84[0xa0-0x84];
|
||||
} pllngsr[3];
|
||||
u8 res_e0[0x100-0xe0];
|
||||
};
|
||||
|
||||
struct ccsr_clk_ctrl {
|
||||
struct {
|
||||
u32 csr; /* core cluster n clock control status */
|
||||
u8 res_04[0x20-0x04];
|
||||
} clkcncsr[8];
|
||||
};
|
||||
#endif /* __ARCH_FSL_LSCH3_IMMAP_H */
|
13
arch/arm/include/asm/arch-fsl-lsch3/imx-regs.h
Normal file
13
arch/arm/include/asm/arch-fsl-lsch3/imx-regs.h
Normal file
@ -0,0 +1,13 @@
|
||||
/*
|
||||
* Copyright 2014 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_FSL_LSCH3_IMX_REGS_H_
|
||||
#define __ASM_ARCH_FSL_LSCH3_IMX_REGS_H_
|
||||
|
||||
#define I2C_QUIRK_REG /* enable 8-bit driver */
|
||||
|
||||
#endif /* __ASM_ARCH_FSL_LSCH3_IMX_REGS_H_ */
|
@ -9,13 +9,6 @@
|
||||
#ifndef __ASM_ARCH_HARDWARE_K2HK_H
|
||||
#define __ASM_ARCH_HARDWARE_K2HK_H
|
||||
|
||||
#define K2HK_ASYNC_EMIF_CNTRL_BASE 0x21000a00
|
||||
#define DAVINCI_ASYNC_EMIF_CNTRL_BASE K2HK_ASYNC_EMIF_CNTRL_BASE
|
||||
#define K2HK_ASYNC_EMIF_DATA_CE0_BASE 0x30000000
|
||||
#define K2HK_ASYNC_EMIF_DATA_CE1_BASE 0x34000000
|
||||
#define K2HK_ASYNC_EMIF_DATA_CE2_BASE 0x38000000
|
||||
#define K2HK_ASYNC_EMIF_DATA_CE3_BASE 0x3c000000
|
||||
|
||||
#define K2HK_PLL_CNTRL_BASE 0x02310000
|
||||
#define CLOCK_BASE K2HK_PLL_CNTRL_BASE
|
||||
#define KS2_RSTCTRL (K2HK_PLL_CNTRL_BASE + 0xe8)
|
||||
@ -115,8 +108,6 @@
|
||||
#define K2HK_LPSC_ARM_SREFLEX 51
|
||||
#define K2HK_LPSC_TETRIS 52
|
||||
|
||||
#define K2HK_UART0_BASE 0x02530c00
|
||||
|
||||
/* DDR3A definitions */
|
||||
#define K2HK_DDR3A_EMIF_CTRL_BASE 0x21010000
|
||||
#define K2HK_DDR3A_EMIF_DATA_BASE 0x80000000
|
||||
|
@ -22,32 +22,6 @@
|
||||
typedef volatile unsigned int dv_reg;
|
||||
typedef volatile unsigned int *dv_reg_p;
|
||||
|
||||
#define ASYNC_EMIF_NUM_CS 4
|
||||
#define ASYNC_EMIF_MODE_NOR 0
|
||||
#define ASYNC_EMIF_MODE_NAND 1
|
||||
#define ASYNC_EMIF_MODE_ONENAND 2
|
||||
#define ASYNC_EMIF_PRESERVE -1
|
||||
|
||||
struct async_emif_config {
|
||||
unsigned mode;
|
||||
unsigned select_strobe;
|
||||
unsigned extend_wait;
|
||||
unsigned wr_setup;
|
||||
unsigned wr_strobe;
|
||||
unsigned wr_hold;
|
||||
unsigned rd_setup;
|
||||
unsigned rd_strobe;
|
||||
unsigned rd_hold;
|
||||
unsigned turn_around;
|
||||
enum {
|
||||
ASYNC_EMIF_8 = 0,
|
||||
ASYNC_EMIF_16 = 1,
|
||||
ASYNC_EMIF_32 = 2,
|
||||
} width;
|
||||
};
|
||||
|
||||
void init_async_emif(int num_cs, struct async_emif_config *config);
|
||||
|
||||
struct ddr3_phy_config {
|
||||
unsigned int pllcr;
|
||||
unsigned int pgcr1_mask;
|
||||
@ -142,6 +116,13 @@ struct ddr3_emif_config {
|
||||
#define KS2_DDR3_PMCTL_OFFSET 0x38
|
||||
#define KS2_DDR3_ZQCFG_OFFSET 0xC8
|
||||
|
||||
#define KS2_UART0_BASE 0x02530c00
|
||||
#define KS2_UART1_BASE 0x02531000
|
||||
|
||||
/* AEMIF */
|
||||
#define KS2_AEMIF_CNTRL_BASE 0x21000a00
|
||||
#define DAVINCI_ASYNC_EMIF_CNTRL_BASE KS2_AEMIF_CNTRL_BASE
|
||||
|
||||
#ifdef CONFIG_SOC_K2HK
|
||||
#include <asm/arch/hardware-k2hk.h>
|
||||
#endif
|
||||
|
@ -1,23 +0,0 @@
|
||||
/*
|
||||
* nand driver definitions to re-use davinci nand driver on Keystone2
|
||||
*
|
||||
* (C) Copyright 2012-2014
|
||||
* Texas Instruments Incorporated, <www.ti.com>
|
||||
* (C) Copyright 2007 Sergey Kubushyn <ksi@koi8.net>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
#ifndef _NAND_DEFS_H_
|
||||
#define _NAND_DEFS_H_
|
||||
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
|
||||
#define MASK_CLE 0x4000
|
||||
#define MASK_ALE 0x2000
|
||||
|
||||
#define NAND_READ_START 0x00
|
||||
#define NAND_READ_END 0x30
|
||||
#define NAND_STATUS 0x70
|
||||
|
||||
#endif
|
@ -5,7 +5,7 @@
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
#ifndef _ASM_ARCH_SPL_H_
|
||||
#define _ASM_SPL_H_
|
||||
#define _ASM_ARCH_SPL_H_
|
||||
|
||||
#define BOOT_DEVICE_SPI 2
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user