Merge branch 'master' of git://git.denx.de/u-boot
This commit is contained in:
commit
1254ff97ab
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
|||||||
VERSION = 2015
|
VERSION = 2015
|
||||||
PATCHLEVEL = 07
|
PATCHLEVEL = 07
|
||||||
SUBLEVEL =
|
SUBLEVEL =
|
||||||
EXTRAVERSION = -rc2
|
EXTRAVERSION = -rc3
|
||||||
NAME =
|
NAME =
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
22
README
22
README
@ -1048,9 +1048,7 @@ The following options need to be configured:
|
|||||||
Monitor commands can be included or excluded
|
Monitor commands can be included or excluded
|
||||||
from the build by using the #include files
|
from the build by using the #include files
|
||||||
<config_cmd_all.h> and #undef'ing unwanted
|
<config_cmd_all.h> and #undef'ing unwanted
|
||||||
commands, or using <config_cmd_default.h>
|
commands, or adding #define's for wanted commands.
|
||||||
and augmenting with additional #define's
|
|
||||||
for wanted commands.
|
|
||||||
|
|
||||||
The default command configuration includes all commands
|
The default command configuration includes all commands
|
||||||
except those marked below with a "*".
|
except those marked below with a "*".
|
||||||
@ -3037,6 +3035,19 @@ CBFS (Coreboot Filesystem) support
|
|||||||
this is instead controlled by the value of
|
this is instead controlled by the value of
|
||||||
/config/load-environment.
|
/config/load-environment.
|
||||||
|
|
||||||
|
- Parallel Flash support:
|
||||||
|
CONFIG_SYS_NO_FLASH
|
||||||
|
|
||||||
|
Traditionally U-boot was run on systems with parallel NOR
|
||||||
|
flash. This option is used to disable support for parallel NOR
|
||||||
|
flash. This option should be defined if the board does not have
|
||||||
|
parallel flash.
|
||||||
|
|
||||||
|
If this option is not defined one of the generic flash drivers
|
||||||
|
(e.g. CONFIG_FLASH_CFI_DRIVER or CONFIG_ST_SMI) must be
|
||||||
|
selected or the board must provide an implementation of the
|
||||||
|
flash API (see include/flash.h).
|
||||||
|
|
||||||
- DataFlash Support:
|
- DataFlash Support:
|
||||||
CONFIG_HAS_DATAFLASH
|
CONFIG_HAS_DATAFLASH
|
||||||
|
|
||||||
@ -3068,11 +3079,6 @@ CBFS (Coreboot Filesystem) support
|
|||||||
Define this option to include a destructive SPI flash
|
Define this option to include a destructive SPI flash
|
||||||
test ('sf test').
|
test ('sf test').
|
||||||
|
|
||||||
CONFIG_SPI_FLASH_BAR Ban/Extended Addr Reg
|
|
||||||
|
|
||||||
Define this option to use the Bank addr/Extended addr
|
|
||||||
support on SPI flashes which has size > 16Mbytes.
|
|
||||||
|
|
||||||
CONFIG_SF_DUAL_FLASH Dual flash memories
|
CONFIG_SF_DUAL_FLASH Dual flash memories
|
||||||
|
|
||||||
Define this option to use dual flash support where two flash
|
Define this option to use dual flash support where two flash
|
||||||
|
@ -18,13 +18,14 @@ config ARC
|
|||||||
|
|
||||||
config ARM
|
config ARM
|
||||||
bool "ARM architecture"
|
bool "ARM architecture"
|
||||||
select HAVE_PRIVATE_LIBGCC
|
select HAVE_PRIVATE_LIBGCC if !ARM64
|
||||||
select HAVE_GENERIC_BOARD
|
select HAVE_GENERIC_BOARD
|
||||||
select SUPPORT_OF_CONTROL
|
select SUPPORT_OF_CONTROL
|
||||||
|
|
||||||
config AVR32
|
config AVR32
|
||||||
bool "AVR32 architecture"
|
bool "AVR32 architecture"
|
||||||
select HAVE_GENERIC_BOARD
|
select HAVE_GENERIC_BOARD
|
||||||
|
select SYS_GENERIC_BOARD
|
||||||
|
|
||||||
config BLACKFIN
|
config BLACKFIN
|
||||||
bool "Blackfin architecture"
|
bool "Blackfin architecture"
|
||||||
|
@ -4,9 +4,6 @@ menu "ARC architecture"
|
|||||||
config SYS_ARCH
|
config SYS_ARCH
|
||||||
default "arc"
|
default "arc"
|
||||||
|
|
||||||
config USE_PRIVATE_LIBGCC
|
|
||||||
default y
|
|
||||||
|
|
||||||
config SYS_CPU
|
config SYS_CPU
|
||||||
default "arcv1" if ISA_ARCOMPACT
|
default "arcv1" if ISA_ARCOMPACT
|
||||||
default "arcv2" if ISA_ARCV2
|
default "arcv2" if ISA_ARCV2
|
||||||
|
@ -47,9 +47,12 @@
|
|||||||
#endif
|
#endif
|
||||||
#define ARC_BCR_DC_BUILD 0x72
|
#define ARC_BCR_DC_BUILD 0x72
|
||||||
#define ARC_BCR_SLC 0xce
|
#define ARC_BCR_SLC 0xce
|
||||||
#define ARC_AUX_SLC_CONTROL 0x903
|
#define ARC_AUX_SLC_CONFIG 0x901
|
||||||
|
#define ARC_AUX_SLC_CTRL 0x903
|
||||||
#define ARC_AUX_SLC_FLUSH 0x904
|
#define ARC_AUX_SLC_FLUSH 0x904
|
||||||
#define ARC_AUX_SLC_INVALIDATE 0x905
|
#define ARC_AUX_SLC_INVALIDATE 0x905
|
||||||
|
#define ARC_AUX_SLC_IVDL 0x910
|
||||||
|
#define ARC_AUX_SLC_FLDL 0x912
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
/* Accessors for auxiliary registers */
|
/* Accessors for auxiliary registers */
|
||||||
|
@ -29,12 +29,7 @@
|
|||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#ifdef CONFIG_ISA_ARCV2
|
void cache_init(void);
|
||||||
void slc_enable(void);
|
|
||||||
void slc_disable(void);
|
|
||||||
void slc_flush(void);
|
|
||||||
void slc_invalidate(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
|
@ -53,6 +53,9 @@ static void boot_prep_linux(bootm_headers_t *images)
|
|||||||
hang();
|
hang();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__weak void smp_set_core_boot_addr(unsigned long addr, int corenr) {}
|
||||||
|
__weak void smp_kick_all_cpus(void) {}
|
||||||
|
|
||||||
/* Subcommand: GO */
|
/* Subcommand: GO */
|
||||||
static void boot_jump_linux(bootm_headers_t *images, int flag)
|
static void boot_jump_linux(bootm_headers_t *images, int flag)
|
||||||
{
|
{
|
||||||
@ -80,6 +83,9 @@ static void boot_jump_linux(bootm_headers_t *images, int flag)
|
|||||||
r2 = (unsigned int)getenv("bootargs");
|
r2 = (unsigned int)getenv("bootargs");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
smp_set_core_boot_addr((unsigned long)kernel_entry, -1);
|
||||||
|
smp_kick_all_cpus();
|
||||||
|
|
||||||
if (!fake)
|
if (!fake)
|
||||||
kernel_entry(r0, 0, r2);
|
kernel_entry(r0, 0, r2);
|
||||||
}
|
}
|
||||||
|
@ -5,9 +5,13 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
#include <linux/compiler.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
#include <asm/arcregs.h>
|
#include <asm/arcregs.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
|
|
||||||
|
#define CACHE_LINE_MASK (~(CONFIG_SYS_CACHELINE_SIZE - 1))
|
||||||
|
|
||||||
/* Bit values in IC_CTRL */
|
/* Bit values in IC_CTRL */
|
||||||
#define IC_CTRL_CACHE_DISABLE (1 << 0)
|
#define IC_CTRL_CACHE_DISABLE (1 << 0)
|
||||||
|
|
||||||
@ -18,60 +22,186 @@
|
|||||||
#define CACHE_VER_NUM_MASK 0xF
|
#define CACHE_VER_NUM_MASK 0xF
|
||||||
#define SLC_CTRL_SB (1 << 2)
|
#define SLC_CTRL_SB (1 << 2)
|
||||||
|
|
||||||
|
#define OP_INV 0x1
|
||||||
|
#define OP_FLUSH 0x2
|
||||||
|
#define OP_INV_IC 0x3
|
||||||
|
|
||||||
|
#ifdef CONFIG_ISA_ARCV2
|
||||||
|
/*
|
||||||
|
* By default that variable will fall into .bss section.
|
||||||
|
* But .bss section is not relocated and so it will be initilized before
|
||||||
|
* relocation but will be used after being zeroed.
|
||||||
|
*/
|
||||||
|
int slc_line_sz __section(".data");
|
||||||
|
int slc_exists __section(".data");
|
||||||
|
|
||||||
|
static unsigned int __before_slc_op(const int op)
|
||||||
|
{
|
||||||
|
unsigned int reg = reg;
|
||||||
|
|
||||||
|
if (op == OP_INV) {
|
||||||
|
/*
|
||||||
|
* IM is set by default and implies Flush-n-inv
|
||||||
|
* Clear it here for vanilla inv
|
||||||
|
*/
|
||||||
|
reg = read_aux_reg(ARC_AUX_SLC_CTRL);
|
||||||
|
write_aux_reg(ARC_AUX_SLC_CTRL, reg & ~DC_CTRL_INV_MODE_FLUSH);
|
||||||
|
}
|
||||||
|
|
||||||
|
return reg;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __after_slc_op(const int op, unsigned int reg)
|
||||||
|
{
|
||||||
|
if (op & OP_FLUSH) /* flush / flush-n-inv both wait */
|
||||||
|
while (read_aux_reg(ARC_AUX_SLC_CTRL) &
|
||||||
|
DC_CTRL_FLUSH_STATUS)
|
||||||
|
;
|
||||||
|
|
||||||
|
/* Switch back to default Invalidate mode */
|
||||||
|
if (op == OP_INV)
|
||||||
|
write_aux_reg(ARC_AUX_SLC_CTRL, reg | DC_CTRL_INV_MODE_FLUSH);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void __slc_line_loop(unsigned long paddr, unsigned long sz,
|
||||||
|
const int op)
|
||||||
|
{
|
||||||
|
unsigned int aux_cmd;
|
||||||
|
int num_lines;
|
||||||
|
|
||||||
|
#define SLC_LINE_MASK (~(slc_line_sz - 1))
|
||||||
|
|
||||||
|
aux_cmd = op & OP_INV ? ARC_AUX_SLC_IVDL : ARC_AUX_SLC_FLDL;
|
||||||
|
|
||||||
|
sz += paddr & ~SLC_LINE_MASK;
|
||||||
|
paddr &= SLC_LINE_MASK;
|
||||||
|
|
||||||
|
num_lines = DIV_ROUND_UP(sz, slc_line_sz);
|
||||||
|
|
||||||
|
while (num_lines-- > 0) {
|
||||||
|
write_aux_reg(aux_cmd, paddr);
|
||||||
|
paddr += slc_line_sz;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void __slc_entire_op(const int cacheop)
|
||||||
|
{
|
||||||
|
int aux;
|
||||||
|
unsigned int ctrl_reg = __before_slc_op(cacheop);
|
||||||
|
|
||||||
|
if (cacheop & OP_INV) /* Inv or flush-n-inv use same cmd reg */
|
||||||
|
aux = ARC_AUX_SLC_INVALIDATE;
|
||||||
|
else
|
||||||
|
aux = ARC_AUX_SLC_FLUSH;
|
||||||
|
|
||||||
|
write_aux_reg(aux, 0x1);
|
||||||
|
|
||||||
|
__after_slc_op(cacheop, ctrl_reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void __slc_line_op(unsigned long paddr, unsigned long sz,
|
||||||
|
const int cacheop)
|
||||||
|
{
|
||||||
|
unsigned int ctrl_reg = __before_slc_op(cacheop);
|
||||||
|
__slc_line_loop(paddr, sz, cacheop);
|
||||||
|
__after_slc_op(cacheop, ctrl_reg);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define __slc_entire_op(cacheop)
|
||||||
|
#define __slc_line_op(paddr, sz, cacheop)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline int icache_exists(void)
|
||||||
|
{
|
||||||
|
/* Check if Instruction Cache is available */
|
||||||
|
if (read_aux_reg(ARC_BCR_IC_BUILD) & CACHE_VER_NUM_MASK)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int dcache_exists(void)
|
||||||
|
{
|
||||||
|
/* Check if Data Cache is available */
|
||||||
|
if (read_aux_reg(ARC_BCR_DC_BUILD) & CACHE_VER_NUM_MASK)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cache_init(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_ISA_ARCV2
|
||||||
|
/* Check if System-Level Cache (SLC) is available */
|
||||||
|
if (read_aux_reg(ARC_BCR_SLC) & CACHE_VER_NUM_MASK) {
|
||||||
|
#define LSIZE_OFFSET 4
|
||||||
|
#define LSIZE_MASK 3
|
||||||
|
if (read_aux_reg(ARC_AUX_SLC_CONFIG) &
|
||||||
|
(LSIZE_MASK << LSIZE_OFFSET))
|
||||||
|
slc_line_sz = 64;
|
||||||
|
else
|
||||||
|
slc_line_sz = 128;
|
||||||
|
slc_exists = 1;
|
||||||
|
} else {
|
||||||
|
slc_exists = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
int icache_status(void)
|
int icache_status(void)
|
||||||
{
|
{
|
||||||
/* If no cache in CPU exit immediately */
|
if (!icache_exists())
|
||||||
if (!(read_aux_reg(ARC_BCR_IC_BUILD) & CACHE_VER_NUM_MASK))
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return (read_aux_reg(ARC_AUX_IC_CTRL) & IC_CTRL_CACHE_DISABLE) !=
|
if (read_aux_reg(ARC_AUX_IC_CTRL) & IC_CTRL_CACHE_DISABLE)
|
||||||
IC_CTRL_CACHE_DISABLE;
|
return 0;
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void icache_enable(void)
|
void icache_enable(void)
|
||||||
{
|
{
|
||||||
/* If no cache in CPU exit immediately */
|
if (icache_exists())
|
||||||
if (!(read_aux_reg(ARC_BCR_IC_BUILD) & CACHE_VER_NUM_MASK))
|
write_aux_reg(ARC_AUX_IC_CTRL, read_aux_reg(ARC_AUX_IC_CTRL) &
|
||||||
return;
|
~IC_CTRL_CACHE_DISABLE);
|
||||||
|
|
||||||
write_aux_reg(ARC_AUX_IC_CTRL, read_aux_reg(ARC_AUX_IC_CTRL) &
|
|
||||||
~IC_CTRL_CACHE_DISABLE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void icache_disable(void)
|
void icache_disable(void)
|
||||||
{
|
{
|
||||||
/* If no cache in CPU exit immediately */
|
if (icache_exists())
|
||||||
if (!(read_aux_reg(ARC_BCR_IC_BUILD) & CACHE_VER_NUM_MASK))
|
write_aux_reg(ARC_AUX_IC_CTRL, read_aux_reg(ARC_AUX_IC_CTRL) |
|
||||||
return;
|
IC_CTRL_CACHE_DISABLE);
|
||||||
|
|
||||||
write_aux_reg(ARC_AUX_IC_CTRL, read_aux_reg(ARC_AUX_IC_CTRL) |
|
|
||||||
IC_CTRL_CACHE_DISABLE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_SYS_DCACHE_OFF
|
||||||
void invalidate_icache_all(void)
|
void invalidate_icache_all(void)
|
||||||
{
|
{
|
||||||
/* If no cache in CPU exit immediately */
|
|
||||||
if (!(read_aux_reg(ARC_BCR_IC_BUILD) & CACHE_VER_NUM_MASK))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Any write to IC_IVIC register triggers invalidation of entire I$ */
|
/* Any write to IC_IVIC register triggers invalidation of entire I$ */
|
||||||
write_aux_reg(ARC_AUX_IC_IVIC, 1);
|
if (icache_status()) {
|
||||||
|
write_aux_reg(ARC_AUX_IC_IVIC, 1);
|
||||||
|
read_aux_reg(ARC_AUX_IC_CTRL); /* blocks */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
void invalidate_icache_all(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int dcache_status(void)
|
int dcache_status(void)
|
||||||
{
|
{
|
||||||
/* If no cache in CPU exit immediately */
|
if (!dcache_exists())
|
||||||
if (!(read_aux_reg(ARC_BCR_DC_BUILD) & CACHE_VER_NUM_MASK))
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return (read_aux_reg(ARC_AUX_DC_CTRL) & DC_CTRL_CACHE_DISABLE) !=
|
if (read_aux_reg(ARC_AUX_DC_CTRL) & DC_CTRL_CACHE_DISABLE)
|
||||||
DC_CTRL_CACHE_DISABLE;
|
return 0;
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dcache_enable(void)
|
void dcache_enable(void)
|
||||||
{
|
{
|
||||||
/* If no cache in CPU exit immediately */
|
if (!dcache_exists())
|
||||||
if (!(read_aux_reg(ARC_BCR_DC_BUILD) & CACHE_VER_NUM_MASK))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
write_aux_reg(ARC_AUX_DC_CTRL, read_aux_reg(ARC_AUX_DC_CTRL) &
|
write_aux_reg(ARC_AUX_DC_CTRL, read_aux_reg(ARC_AUX_DC_CTRL) &
|
||||||
@ -80,91 +210,123 @@ void dcache_enable(void)
|
|||||||
|
|
||||||
void dcache_disable(void)
|
void dcache_disable(void)
|
||||||
{
|
{
|
||||||
/* If no cache in CPU exit immediately */
|
if (!dcache_exists())
|
||||||
if (!(read_aux_reg(ARC_BCR_DC_BUILD) & CACHE_VER_NUM_MASK))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
write_aux_reg(ARC_AUX_DC_CTRL, read_aux_reg(ARC_AUX_DC_CTRL) |
|
write_aux_reg(ARC_AUX_DC_CTRL, read_aux_reg(ARC_AUX_DC_CTRL) |
|
||||||
DC_CTRL_CACHE_DISABLE);
|
DC_CTRL_CACHE_DISABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void flush_dcache_all(void)
|
|
||||||
{
|
|
||||||
/* If no cache in CPU exit immediately */
|
|
||||||
if (!(read_aux_reg(ARC_BCR_DC_BUILD) & CACHE_VER_NUM_MASK))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Do flush of entire cache */
|
|
||||||
write_aux_reg(ARC_AUX_DC_FLSH, 1);
|
|
||||||
|
|
||||||
/* Wait flush end */
|
|
||||||
while (read_aux_reg(ARC_AUX_DC_CTRL) & DC_CTRL_FLUSH_STATUS)
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef CONFIG_SYS_DCACHE_OFF
|
#ifndef CONFIG_SYS_DCACHE_OFF
|
||||||
static void dcache_flush_line(unsigned addr)
|
/*
|
||||||
|
* Common Helper for Line Operations on {I,D}-Cache
|
||||||
|
*/
|
||||||
|
static inline void __cache_line_loop(unsigned long paddr, unsigned long sz,
|
||||||
|
const int cacheop)
|
||||||
{
|
{
|
||||||
|
unsigned int aux_cmd;
|
||||||
#if (CONFIG_ARC_MMU_VER == 3)
|
#if (CONFIG_ARC_MMU_VER == 3)
|
||||||
write_aux_reg(ARC_AUX_DC_PTAG, addr);
|
unsigned int aux_tag;
|
||||||
#endif
|
#endif
|
||||||
write_aux_reg(ARC_AUX_DC_FLDL, addr);
|
int num_lines;
|
||||||
|
|
||||||
/* Wait flush end */
|
if (cacheop == OP_INV_IC) {
|
||||||
while (read_aux_reg(ARC_AUX_DC_CTRL) & DC_CTRL_FLUSH_STATUS)
|
aux_cmd = ARC_AUX_IC_IVIL;
|
||||||
;
|
|
||||||
|
|
||||||
#ifndef CONFIG_SYS_ICACHE_OFF
|
|
||||||
/*
|
|
||||||
* Invalidate I$ for addresses range just flushed from D$.
|
|
||||||
* If we try to execute data flushed above it will be valid/correct
|
|
||||||
*/
|
|
||||||
#if (CONFIG_ARC_MMU_VER == 3)
|
#if (CONFIG_ARC_MMU_VER == 3)
|
||||||
write_aux_reg(ARC_AUX_IC_PTAG, addr);
|
aux_tag = ARC_AUX_IC_PTAG;
|
||||||
#endif
|
#endif
|
||||||
write_aux_reg(ARC_AUX_IC_IVIL, addr);
|
} else {
|
||||||
#endif /* CONFIG_SYS_ICACHE_OFF */
|
/* d$ cmd: INV (discard or wback-n-discard) OR FLUSH (wback) */
|
||||||
|
aux_cmd = cacheop & OP_INV ? ARC_AUX_DC_IVDL : ARC_AUX_DC_FLDL;
|
||||||
|
#if (CONFIG_ARC_MMU_VER == 3)
|
||||||
|
aux_tag = ARC_AUX_DC_PTAG;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
sz += paddr & ~CACHE_LINE_MASK;
|
||||||
|
paddr &= CACHE_LINE_MASK;
|
||||||
|
|
||||||
|
num_lines = DIV_ROUND_UP(sz, CONFIG_SYS_CACHELINE_SIZE);
|
||||||
|
|
||||||
|
while (num_lines-- > 0) {
|
||||||
|
#if (CONFIG_ARC_MMU_VER == 3)
|
||||||
|
write_aux_reg(aux_tag, paddr);
|
||||||
|
#endif
|
||||||
|
write_aux_reg(aux_cmd, paddr);
|
||||||
|
paddr += CONFIG_SYS_CACHELINE_SIZE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_SYS_DCACHE_OFF */
|
|
||||||
|
|
||||||
void flush_dcache_range(unsigned long start, unsigned long end)
|
static unsigned int __before_dc_op(const int op)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_SYS_DCACHE_OFF
|
unsigned int reg;
|
||||||
unsigned int addr;
|
|
||||||
|
|
||||||
start = start & (~(CONFIG_SYS_CACHELINE_SIZE - 1));
|
if (op == OP_INV) {
|
||||||
end = end & (~(CONFIG_SYS_CACHELINE_SIZE - 1));
|
/*
|
||||||
|
* IM is set by default and implies Flush-n-inv
|
||||||
|
* Clear it here for vanilla inv
|
||||||
|
*/
|
||||||
|
reg = read_aux_reg(ARC_AUX_DC_CTRL);
|
||||||
|
write_aux_reg(ARC_AUX_DC_CTRL, reg & ~DC_CTRL_INV_MODE_FLUSH);
|
||||||
|
}
|
||||||
|
|
||||||
for (addr = start; addr <= end; addr += CONFIG_SYS_CACHELINE_SIZE)
|
return reg;
|
||||||
dcache_flush_line(addr);
|
|
||||||
#endif /* CONFIG_SYS_DCACHE_OFF */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __after_dc_op(const int op, unsigned int reg)
|
||||||
|
{
|
||||||
|
if (op & OP_FLUSH) /* flush / flush-n-inv both wait */
|
||||||
|
while (read_aux_reg(ARC_AUX_DC_CTRL) & DC_CTRL_FLUSH_STATUS)
|
||||||
|
;
|
||||||
|
|
||||||
|
/* Switch back to default Invalidate mode */
|
||||||
|
if (op == OP_INV)
|
||||||
|
write_aux_reg(ARC_AUX_DC_CTRL, reg | DC_CTRL_INV_MODE_FLUSH);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void __dc_entire_op(const int cacheop)
|
||||||
|
{
|
||||||
|
int aux;
|
||||||
|
unsigned int ctrl_reg = __before_dc_op(cacheop);
|
||||||
|
|
||||||
|
if (cacheop & OP_INV) /* Inv or flush-n-inv use same cmd reg */
|
||||||
|
aux = ARC_AUX_DC_IVDC;
|
||||||
|
else
|
||||||
|
aux = ARC_AUX_DC_FLSH;
|
||||||
|
|
||||||
|
write_aux_reg(aux, 0x1);
|
||||||
|
|
||||||
|
__after_dc_op(cacheop, ctrl_reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void __dc_line_op(unsigned long paddr, unsigned long sz,
|
||||||
|
const int cacheop)
|
||||||
|
{
|
||||||
|
unsigned int ctrl_reg = __before_dc_op(cacheop);
|
||||||
|
__cache_line_loop(paddr, sz, cacheop);
|
||||||
|
__after_dc_op(cacheop, ctrl_reg);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define __dc_entire_op(cacheop)
|
||||||
|
#define __dc_line_op(paddr, sz, cacheop)
|
||||||
|
#endif /* !CONFIG_SYS_DCACHE_OFF */
|
||||||
|
|
||||||
void invalidate_dcache_range(unsigned long start, unsigned long end)
|
void invalidate_dcache_range(unsigned long start, unsigned long end)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_SYS_DCACHE_OFF
|
__dc_line_op(start, end - start, OP_INV);
|
||||||
unsigned int addr;
|
#ifdef CONFIG_ISA_ARCV2
|
||||||
|
if (slc_exists)
|
||||||
start = start & (~(CONFIG_SYS_CACHELINE_SIZE - 1));
|
__slc_line_op(start, end - start, OP_INV);
|
||||||
end = end & (~(CONFIG_SYS_CACHELINE_SIZE - 1));
|
|
||||||
|
|
||||||
for (addr = start; addr <= end; addr += CONFIG_SYS_CACHELINE_SIZE) {
|
|
||||||
#if (CONFIG_ARC_MMU_VER == 3)
|
|
||||||
write_aux_reg(ARC_AUX_DC_PTAG, addr);
|
|
||||||
#endif
|
#endif
|
||||||
write_aux_reg(ARC_AUX_DC_IVDL, addr);
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_SYS_DCACHE_OFF */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void invalidate_dcache_all(void)
|
void flush_dcache_range(unsigned long start, unsigned long end)
|
||||||
{
|
{
|
||||||
/* If no cache in CPU exit immediately */
|
__dc_line_op(start, end - start, OP_FLUSH);
|
||||||
if (!(read_aux_reg(ARC_BCR_DC_BUILD) & CACHE_VER_NUM_MASK))
|
#ifdef CONFIG_ISA_ARCV2
|
||||||
return;
|
if (slc_exists)
|
||||||
|
__slc_line_op(start, end - start, OP_FLUSH);
|
||||||
/* Write 1 to DC_IVDC register triggers invalidation of entire D$ */
|
#endif
|
||||||
write_aux_reg(ARC_AUX_DC_IVDC, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void flush_cache(unsigned long start, unsigned long size)
|
void flush_cache(unsigned long start, unsigned long size)
|
||||||
@ -172,47 +334,20 @@ void flush_cache(unsigned long start, unsigned long size)
|
|||||||
flush_dcache_range(start, start + size);
|
flush_dcache_range(start, start + size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void invalidate_dcache_all(void)
|
||||||
|
{
|
||||||
|
__dc_entire_op(OP_INV);
|
||||||
#ifdef CONFIG_ISA_ARCV2
|
#ifdef CONFIG_ISA_ARCV2
|
||||||
void slc_enable(void)
|
if (slc_exists)
|
||||||
{
|
__slc_entire_op(OP_INV);
|
||||||
/* If SLC ver = 0, no SLC present in CPU */
|
#endif
|
||||||
if (!(read_aux_reg(ARC_BCR_SLC) & 0xff))
|
|
||||||
return;
|
|
||||||
|
|
||||||
write_aux_reg(ARC_AUX_SLC_CONTROL,
|
|
||||||
read_aux_reg(ARC_AUX_SLC_CONTROL) & ~1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void slc_disable(void)
|
void flush_dcache_all(void)
|
||||||
{
|
{
|
||||||
/* If SLC ver = 0, no SLC present in CPU */
|
__dc_entire_op(OP_FLUSH);
|
||||||
if (!(read_aux_reg(ARC_BCR_SLC) & 0xff))
|
#ifdef CONFIG_ISA_ARCV2
|
||||||
return;
|
if (slc_exists)
|
||||||
|
__slc_entire_op(OP_FLUSH);
|
||||||
write_aux_reg(ARC_AUX_SLC_CONTROL,
|
#endif
|
||||||
read_aux_reg(ARC_AUX_SLC_CONTROL) | 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void slc_flush(void)
|
|
||||||
{
|
|
||||||
/* If SLC ver = 0, no SLC present in CPU */
|
|
||||||
if (!(read_aux_reg(ARC_BCR_SLC) & 0xff))
|
|
||||||
return;
|
|
||||||
|
|
||||||
write_aux_reg(ARC_AUX_SLC_FLUSH, 1);
|
|
||||||
|
|
||||||
/* Wait flush end */
|
|
||||||
while (read_aux_reg(ARC_AUX_SLC_CONTROL) & SLC_CTRL_SB)
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
void slc_invalidate(void)
|
|
||||||
{
|
|
||||||
/* If SLC ver = 0, no SLC present in CPU */
|
|
||||||
if (!(read_aux_reg(ARC_BCR_SLC) & 0xff))
|
|
||||||
return;
|
|
||||||
|
|
||||||
write_aux_reg(ARC_AUX_SLC_INVALIDATE, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONFIG_ISA_ARCV2 */
|
|
||||||
|
@ -23,6 +23,8 @@ int arch_cpu_init(void)
|
|||||||
gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
|
gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
|
||||||
gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
|
gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
|
||||||
|
|
||||||
|
cache_init();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,16 +10,8 @@ DECLARE_GLOBAL_DATA_PTR;
|
|||||||
|
|
||||||
int init_cache_f_r(void)
|
int init_cache_f_r(void)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_SYS_ICACHE_OFF
|
|
||||||
icache_enable();
|
|
||||||
/* Make sure no stale entries persist from before we disabled cache */
|
|
||||||
invalidate_icache_all();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CONFIG_SYS_DCACHE_OFF
|
#ifndef CONFIG_SYS_DCACHE_OFF
|
||||||
dcache_enable();
|
flush_dcache_all();
|
||||||
/* Make sure no stale entries persist from before we disabled cache */
|
|
||||||
invalidate_dcache_all();
|
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -13,19 +13,47 @@ ENTRY(_start)
|
|||||||
/* Setup interrupt vector base that matches "__text_start" */
|
/* Setup interrupt vector base that matches "__text_start" */
|
||||||
sr __ivt_start, [ARC_AUX_INTR_VEC_BASE]
|
sr __ivt_start, [ARC_AUX_INTR_VEC_BASE]
|
||||||
|
|
||||||
|
; Disable/enable I-cache according to configuration
|
||||||
|
lr r5, [ARC_BCR_IC_BUILD]
|
||||||
|
breq r5, 0, 1f ; I$ doesn't exist
|
||||||
|
lr r5, [ARC_AUX_IC_CTRL]
|
||||||
|
#ifndef CONFIG_SYS_ICACHE_OFF
|
||||||
|
bclr r5, r5, 0 ; 0 - Enable, 1 is Disable
|
||||||
|
#else
|
||||||
|
bset r5, r5, 0 ; I$ exists, but is not used
|
||||||
|
#endif
|
||||||
|
sr r5, [ARC_AUX_IC_CTRL]
|
||||||
|
|
||||||
|
1:
|
||||||
|
; Disable/enable D-cache according to configuration
|
||||||
|
lr r5, [ARC_BCR_DC_BUILD]
|
||||||
|
breq r5, 0, 1f ; D$ doesn't exist
|
||||||
|
lr r5, [ARC_AUX_DC_CTRL]
|
||||||
|
bclr r5, r5, 6 ; Invalidate (discard w/o wback)
|
||||||
|
#ifndef CONFIG_SYS_DCACHE_OFF
|
||||||
|
bclr r5, r5, 0 ; Enable (+Inv)
|
||||||
|
#else
|
||||||
|
bset r5, r5, 0 ; Disable (+Inv)
|
||||||
|
#endif
|
||||||
|
sr r5, [ARC_AUX_DC_CTRL]
|
||||||
|
|
||||||
|
1:
|
||||||
|
#ifdef CONFIG_ISA_ARCV2
|
||||||
|
; Disable System-Level Cache (SLC)
|
||||||
|
lr r5, [ARC_BCR_SLC]
|
||||||
|
breq r5, 0, 1f ; SLC doesn't exist
|
||||||
|
lr r5, [ARC_AUX_SLC_CTRL]
|
||||||
|
bclr r5, r5, 6 ; Invalidate (discard w/o wback)
|
||||||
|
bclr r5, r5, 0 ; Enable (+Inv)
|
||||||
|
sr r5, [ARC_AUX_SLC_CTRL]
|
||||||
|
|
||||||
|
1:
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Setup stack- and frame-pointers */
|
/* Setup stack- and frame-pointers */
|
||||||
mov %sp, CONFIG_SYS_INIT_SP_ADDR
|
mov %sp, CONFIG_SYS_INIT_SP_ADDR
|
||||||
mov %fp, %sp
|
mov %fp, %sp
|
||||||
|
|
||||||
/* Unconditionally disable caches */
|
|
||||||
#ifdef CONFIG_ISA_ARCV2
|
|
||||||
bl slc_flush
|
|
||||||
bl slc_disable
|
|
||||||
#endif
|
|
||||||
bl flush_dcache_all
|
|
||||||
bl dcache_disable
|
|
||||||
bl icache_disable
|
|
||||||
|
|
||||||
/* Allocate and zero GD, update SP */
|
/* Allocate and zero GD, update SP */
|
||||||
mov %r0, %sp
|
mov %r0, %sp
|
||||||
bl board_init_f_mem
|
bl board_init_f_mem
|
||||||
|
@ -346,8 +346,13 @@ config TARGET_DRACO
|
|||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
|
||||||
config TARGET_DXR2
|
config TARGET_THUBAN
|
||||||
bool "Support dxr2"
|
bool "Support thuban"
|
||||||
|
select CPU_V7
|
||||||
|
select SUPPORT_SPL
|
||||||
|
|
||||||
|
config TARGET_RASTABAN
|
||||||
|
bool "Support rastaban"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
|
||||||
@ -369,6 +374,14 @@ config TARGET_PENGWYN
|
|||||||
select DM_SERIAL
|
select DM_SERIAL
|
||||||
select DM_GPIO
|
select DM_GPIO
|
||||||
|
|
||||||
|
config TARGET_AM335X_BALTOS
|
||||||
|
bool "Support am335x_baltos"
|
||||||
|
select CPU_V7
|
||||||
|
select SUPPORT_SPL
|
||||||
|
select DM
|
||||||
|
select DM_SERIAL
|
||||||
|
select DM_GPIO
|
||||||
|
|
||||||
config TARGET_AM335X_EVM
|
config TARGET_AM335X_EVM
|
||||||
bool "Support am335x_evm"
|
bool "Support am335x_evm"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
@ -653,7 +666,11 @@ config ARCH_ZYNQ
|
|||||||
bool "Xilinx Zynq Platform"
|
bool "Xilinx Zynq Platform"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select OF_CONTROL
|
||||||
|
select SPL_DISABLE_OF_CONTROL
|
||||||
select DM
|
select DM
|
||||||
|
select DM_SPI
|
||||||
|
select DM_SPI_FLASH
|
||||||
|
|
||||||
config TARGET_XILINX_ZYNQMP
|
config TARGET_XILINX_ZYNQMP
|
||||||
bool "Support Xilinx ZynqMP Platform"
|
bool "Support Xilinx ZynqMP Platform"
|
||||||
@ -959,6 +976,7 @@ source "board/trizepsiv/Kconfig"
|
|||||||
source "board/ttcontrol/vision2/Kconfig"
|
source "board/ttcontrol/vision2/Kconfig"
|
||||||
source "board/udoo/Kconfig"
|
source "board/udoo/Kconfig"
|
||||||
source "board/vpac270/Kconfig"
|
source "board/vpac270/Kconfig"
|
||||||
|
source "board/vscom/baltos/Kconfig"
|
||||||
source "board/wandboard/Kconfig"
|
source "board/wandboard/Kconfig"
|
||||||
source "board/warp/Kconfig"
|
source "board/warp/Kconfig"
|
||||||
source "board/woodburn/Kconfig"
|
source "board/woodburn/Kconfig"
|
||||||
|
@ -123,30 +123,33 @@ void config_sdram_emif4d5(const struct emif_regs *regs, int nr)
|
|||||||
writel(regs->ref_ctrl, &emif_reg[nr]->emif_sdram_ref_ctrl);
|
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->ref_ctrl, &emif_reg[nr]->emif_sdram_ref_ctrl_shdw);
|
||||||
|
|
||||||
/* Perform hardware leveling. */
|
/* Perform hardware leveling for DDR3 */
|
||||||
udelay(1000);
|
if (emif_sdram_type(regs->sdram_config) == EMIF_SDRAM_TYPE_DDR3) {
|
||||||
writel(readl(&emif_reg[nr]->emif_ddr_ext_phy_ctrl_36) |
|
udelay(1000);
|
||||||
0x100, &emif_reg[nr]->emif_ddr_ext_phy_ctrl_36);
|
writel(readl(&emif_reg[nr]->emif_ddr_ext_phy_ctrl_36) |
|
||||||
writel(readl(&emif_reg[nr]->emif_ddr_ext_phy_ctrl_36_shdw) |
|
0x100, &emif_reg[nr]->emif_ddr_ext_phy_ctrl_36);
|
||||||
0x100, &emif_reg[nr]->emif_ddr_ext_phy_ctrl_36_shdw);
|
writel(readl(&emif_reg[nr]->emif_ddr_ext_phy_ctrl_36_shdw) |
|
||||||
|
0x100, &emif_reg[nr]->emif_ddr_ext_phy_ctrl_36_shdw);
|
||||||
|
|
||||||
writel(0x80000000, &emif_reg[nr]->emif_rd_wr_lvl_rmp_ctl);
|
writel(0x80000000, &emif_reg[nr]->emif_rd_wr_lvl_rmp_ctl);
|
||||||
|
|
||||||
/* Enable read leveling */
|
/* Enable read leveling */
|
||||||
writel(0x80000000, &emif_reg[nr]->emif_rd_wr_lvl_ctl);
|
writel(0x80000000, &emif_reg[nr]->emif_rd_wr_lvl_ctl);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enable full read and write leveling. Wait for read and write
|
* Enable full read and write leveling. Wait for read and write
|
||||||
* leveling bit to clear RDWRLVLFULL_START bit 31
|
* leveling bit to clear RDWRLVLFULL_START bit 31
|
||||||
*/
|
*/
|
||||||
while((readl(&emif_reg[nr]->emif_rd_wr_lvl_ctl) & 0x80000000) != 0)
|
while ((readl(&emif_reg[nr]->emif_rd_wr_lvl_ctl) & 0x80000000)
|
||||||
;
|
!= 0)
|
||||||
|
;
|
||||||
|
|
||||||
/* Check the timeout register to see if leveling is complete */
|
/* Check the timeout register to see if leveling is complete */
|
||||||
if((readl(&emif_reg[nr]->emif_status) & 0x70) != 0)
|
if ((readl(&emif_reg[nr]->emif_status) & 0x70) != 0)
|
||||||
puts("DDR3 H/W leveling incomplete with errors\n");
|
puts("DDR3 H/W leveling incomplete with errors\n");
|
||||||
|
|
||||||
if (emif_sdram_type() == EMIF_SDRAM_TYPE_LPDDR2) {
|
} else {
|
||||||
|
/* DDR2 */
|
||||||
configure_mr(nr, 0);
|
configure_mr(nr, 0);
|
||||||
configure_mr(nr, 1);
|
configure_mr(nr, 1);
|
||||||
}
|
}
|
||||||
@ -182,10 +185,50 @@ void set_sdram_timings(const struct emif_regs *regs, int nr)
|
|||||||
writel(regs->sdram_tim3, &emif_reg[nr]->emif_sdram_tim_3_shdw);
|
writel(regs->sdram_tim3, &emif_reg[nr]->emif_sdram_tim_3_shdw);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configure EXT PHY registers for software leveling
|
||||||
|
*/
|
||||||
|
static void ext_phy_settings_swlvl(const struct emif_regs *regs, int nr)
|
||||||
|
{
|
||||||
|
u32 *ext_phy_ctrl_base = 0;
|
||||||
|
u32 *emif_ext_phy_ctrl_base = 0;
|
||||||
|
__maybe_unused const u32 *ext_phy_ctrl_const_regs;
|
||||||
|
u32 i = 0;
|
||||||
|
__maybe_unused u32 size;
|
||||||
|
|
||||||
|
ext_phy_ctrl_base = (u32 *)&(regs->emif_ddr_ext_phy_ctrl_1);
|
||||||
|
emif_ext_phy_ctrl_base =
|
||||||
|
(u32 *)&(emif_reg[nr]->emif_ddr_ext_phy_ctrl_1);
|
||||||
|
|
||||||
|
/* Configure external phy control timing registers */
|
||||||
|
for (i = 0; i < EMIF_EXT_PHY_CTRL_TIMING_REG; i++) {
|
||||||
|
writel(*ext_phy_ctrl_base, emif_ext_phy_ctrl_base++);
|
||||||
|
/* Update shadow registers */
|
||||||
|
writel(*ext_phy_ctrl_base++, emif_ext_phy_ctrl_base++);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_AM43XX
|
||||||
|
/*
|
||||||
|
* External phy 6-24 registers do not change with ddr frequency.
|
||||||
|
* These only need to be set on DDR2 on AM43xx.
|
||||||
|
*/
|
||||||
|
emif_get_ext_phy_ctrl_const_regs(&ext_phy_ctrl_const_regs, &size);
|
||||||
|
|
||||||
|
if (!size)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++) {
|
||||||
|
writel(ext_phy_ctrl_const_regs[i], emif_ext_phy_ctrl_base++);
|
||||||
|
/* Update shadow registers */
|
||||||
|
writel(ext_phy_ctrl_const_regs[i], emif_ext_phy_ctrl_base++);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Configure EXT PHY registers for hardware leveling
|
* Configure EXT PHY registers for hardware leveling
|
||||||
*/
|
*/
|
||||||
static void ext_phy_settings(const struct emif_regs *regs, int nr)
|
static void ext_phy_settings_hwlvl(const struct emif_regs *regs, int nr)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Enable hardware leveling on the EMIF. For details about these
|
* Enable hardware leveling on the EMIF. For details about these
|
||||||
@ -256,8 +299,12 @@ void config_ddr_phy(const struct emif_regs *regs, int nr)
|
|||||||
writel(regs->emif_ddr_phy_ctlr_1,
|
writel(regs->emif_ddr_phy_ctlr_1,
|
||||||
&emif_reg[nr]->emif_ddr_phy_ctrl_1_shdw);
|
&emif_reg[nr]->emif_ddr_phy_ctrl_1_shdw);
|
||||||
|
|
||||||
if (get_emif_rev((u32)emif_reg[nr]) == EMIF_4D5)
|
if (get_emif_rev((u32)emif_reg[nr]) == EMIF_4D5) {
|
||||||
ext_phy_settings(regs, nr);
|
if (emif_sdram_type(regs->sdram_config) == EMIF_SDRAM_TYPE_DDR3)
|
||||||
|
ext_phy_settings_hwlvl(regs, nr);
|
||||||
|
else
|
||||||
|
ext_phy_settings_swlvl(regs, nr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -124,8 +124,9 @@ void config_ddr(unsigned int pll, const struct ctrl_ioregs *ioregs,
|
|||||||
/* Set CKE to be controlled by EMIF/DDR PHY */
|
/* Set CKE to be controlled by EMIF/DDR PHY */
|
||||||
writel(DDR_CKE_CTRL_NORMAL, &ddrctrl->ddrckectrl);
|
writel(DDR_CKE_CTRL_NORMAL, &ddrctrl->ddrckectrl);
|
||||||
|
|
||||||
/* Allow EMIF to control DDR_RESET */
|
if (emif_sdram_type(regs->sdram_config) == EMIF_SDRAM_TYPE_DDR3)
|
||||||
writel(0x00000000, &ddrctrl->ddrioctrl);
|
/* Allow EMIF to control DDR_RESET */
|
||||||
|
writel(0x00000000, &ddrctrl->ddrioctrl);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Program EMIF instance */
|
/* Program EMIF instance */
|
||||||
|
@ -74,9 +74,6 @@ endchoice
|
|||||||
config SYS_SOC
|
config SYS_SOC
|
||||||
default "exynos"
|
default "exynos"
|
||||||
|
|
||||||
config DM_USB
|
|
||||||
default y
|
|
||||||
|
|
||||||
source "board/samsung/smdkv310/Kconfig"
|
source "board/samsung/smdkv310/Kconfig"
|
||||||
source "board/samsung/trats/Kconfig"
|
source "board/samsung/trats/Kconfig"
|
||||||
source "board/samsung/universal_c210/Kconfig"
|
source "board/samsung/universal_c210/Kconfig"
|
||||||
|
@ -372,6 +372,7 @@ static void setup_dplls(void)
|
|||||||
{
|
{
|
||||||
u32 temp;
|
u32 temp;
|
||||||
const struct dpll_params *params;
|
const struct dpll_params *params;
|
||||||
|
struct emif_reg_struct *emif = (struct emif_reg_struct *)EMIF1_BASE;
|
||||||
|
|
||||||
debug("setup_dplls\n");
|
debug("setup_dplls\n");
|
||||||
|
|
||||||
@ -382,7 +383,8 @@ static void setup_dplls(void)
|
|||||||
* Core DPLL will be locked after setting up EMIF
|
* Core DPLL will be locked after setting up EMIF
|
||||||
* using the FREQ_UPDATE method(freq_update_core())
|
* using the FREQ_UPDATE method(freq_update_core())
|
||||||
*/
|
*/
|
||||||
if (emif_sdram_type() == EMIF_SDRAM_TYPE_LPDDR2)
|
if (emif_sdram_type(readl(&emif->emif_sdram_config)) ==
|
||||||
|
EMIF_SDRAM_TYPE_LPDDR2)
|
||||||
do_setup_dpll((*prcm)->cm_clkmode_dpll_core, params,
|
do_setup_dpll((*prcm)->cm_clkmode_dpll_core, params,
|
||||||
DPLL_NO_LOCK, "core");
|
DPLL_NO_LOCK, "core");
|
||||||
else
|
else
|
||||||
@ -508,6 +510,12 @@ static u32 optimize_vcore_voltage(struct volts const *v)
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_IODELAY_RECALIBRATION
|
||||||
|
void __weak recalibrate_iodelay(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup the voltages for the main SoC core power domains.
|
* Setup the voltages for the main SoC core power domains.
|
||||||
* We start with the maximum voltages allowed here, as set in the corresponding
|
* We start with the maximum voltages allowed here, as set in the corresponding
|
||||||
@ -561,6 +569,16 @@ void scale_vcores(struct vcores_data const *vcores)
|
|||||||
|
|
||||||
debug("cor: %d\n", vcores->core.value);
|
debug("cor: %d\n", vcores->core.value);
|
||||||
do_scale_vcore(vcores->core.addr, vcores->core.value, vcores->core.pmic);
|
do_scale_vcore(vcores->core.addr, vcores->core.value, vcores->core.pmic);
|
||||||
|
/*
|
||||||
|
* IO delay recalibration should be done immediately after
|
||||||
|
* adjusting AVS voltages for VDD_CORE_L.
|
||||||
|
* Respective boards should call __recalibrate_iodelay()
|
||||||
|
* with proper mux, virtual and manual mode configurations.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_IODELAY_RECALIBRATION
|
||||||
|
recalibrate_iodelay();
|
||||||
|
#endif
|
||||||
|
|
||||||
debug("mpu: %d\n", vcores->mpu.value);
|
debug("mpu: %d\n", vcores->mpu.value);
|
||||||
do_scale_vcore(vcores->mpu.addr, vcores->mpu.value, vcores->mpu.pmic);
|
do_scale_vcore(vcores->mpu.addr, vcores->mpu.value, vcores->mpu.pmic);
|
||||||
/* Configure MPU ABB LDO after scale */
|
/* Configure MPU ABB LDO after scale */
|
||||||
@ -587,6 +605,16 @@ void scale_vcores(struct vcores_data const *vcores)
|
|||||||
val = optimize_vcore_voltage(&vcores->core);
|
val = optimize_vcore_voltage(&vcores->core);
|
||||||
do_scale_vcore(vcores->core.addr, val, vcores->core.pmic);
|
do_scale_vcore(vcores->core.addr, val, vcores->core.pmic);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IO delay recalibration should be done immediately after
|
||||||
|
* adjusting AVS voltages for VDD_CORE_L.
|
||||||
|
* Respective boards should call __recalibrate_iodelay()
|
||||||
|
* with proper mux, virtual and manual mode configurations.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_IODELAY_RECALIBRATION
|
||||||
|
recalibrate_iodelay();
|
||||||
|
#endif
|
||||||
|
|
||||||
val = optimize_vcore_voltage(&vcores->mpu);
|
val = optimize_vcore_voltage(&vcores->mpu);
|
||||||
do_scale_vcore(vcores->mpu.addr, val, vcores->mpu.pmic);
|
do_scale_vcore(vcores->mpu.addr, val, vcores->mpu.pmic);
|
||||||
|
|
||||||
|
@ -242,13 +242,122 @@ static void omap5_ddr3_leveling(u32 base, const struct emif_regs *regs)
|
|||||||
__udelay(130);
|
__udelay(130);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ddr3_leveling(u32 base, const struct emif_regs *regs)
|
static void update_hwleveling_output(u32 base, const struct emif_regs *regs)
|
||||||
{
|
{
|
||||||
if (is_omap54xx())
|
struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
|
||||||
omap5_ddr3_leveling(base, regs);
|
u32 *emif_ext_phy_ctrl_reg, *emif_phy_status;
|
||||||
|
u32 reg, i;
|
||||||
|
|
||||||
|
emif_phy_status = (u32 *)&emif->emif_ddr_phy_status[7];
|
||||||
|
|
||||||
|
/* Update PHY_REG_RDDQS_RATIO */
|
||||||
|
emif_ext_phy_ctrl_reg = (u32 *)&emif->emif_ddr_ext_phy_ctrl_7;
|
||||||
|
for (i = 0; i < PHY_RDDQS_RATIO_REGS; i++) {
|
||||||
|
reg = readl(emif_phy_status++);
|
||||||
|
writel(reg, emif_ext_phy_ctrl_reg++);
|
||||||
|
writel(reg, emif_ext_phy_ctrl_reg++);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update PHY_REG_FIFO_WE_SLAVE_RATIO */
|
||||||
|
emif_ext_phy_ctrl_reg = (u32 *)&emif->emif_ddr_ext_phy_ctrl_2;
|
||||||
|
for (i = 0; i < PHY_FIFO_WE_SLAVE_RATIO_REGS; i++) {
|
||||||
|
reg = readl(emif_phy_status++);
|
||||||
|
writel(reg, emif_ext_phy_ctrl_reg++);
|
||||||
|
writel(reg, emif_ext_phy_ctrl_reg++);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update PHY_REG_WR_DQ/DQS_SLAVE_RATIO */
|
||||||
|
emif_ext_phy_ctrl_reg = (u32 *)&emif->emif_ddr_ext_phy_ctrl_12;
|
||||||
|
for (i = 0; i < PHY_REG_WR_DQ_SLAVE_RATIO_REGS; i++) {
|
||||||
|
reg = readl(emif_phy_status++);
|
||||||
|
writel(reg, emif_ext_phy_ctrl_reg++);
|
||||||
|
writel(reg, emif_ext_phy_ctrl_reg++);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disable Leveling */
|
||||||
|
writel(regs->emif_ddr_phy_ctlr_1, &emif->emif_ddr_phy_ctrl_1);
|
||||||
|
writel(regs->emif_ddr_phy_ctlr_1, &emif->emif_ddr_phy_ctrl_1_shdw);
|
||||||
|
writel(0x0, &emif->emif_rd_wr_lvl_rmp_ctl);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ddr3_init(u32 base, const struct emif_regs *regs)
|
static void dra7_ddr3_leveling(u32 base, const struct emif_regs *regs)
|
||||||
|
{
|
||||||
|
struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
|
||||||
|
|
||||||
|
/* Clear Error Status */
|
||||||
|
clrsetbits_le32(&emif->emif_ddr_ext_phy_ctrl_36,
|
||||||
|
EMIF_REG_PHY_FIFO_WE_IN_MISALINED_CLR,
|
||||||
|
EMIF_REG_PHY_FIFO_WE_IN_MISALINED_CLR);
|
||||||
|
|
||||||
|
clrsetbits_le32(&emif->emif_ddr_ext_phy_ctrl_36_shdw,
|
||||||
|
EMIF_REG_PHY_FIFO_WE_IN_MISALINED_CLR,
|
||||||
|
EMIF_REG_PHY_FIFO_WE_IN_MISALINED_CLR);
|
||||||
|
|
||||||
|
/* Disable refreshed before leveling */
|
||||||
|
clrsetbits_le32(&emif->emif_sdram_ref_ctrl, EMIF_REG_INITREF_DIS_SHIFT,
|
||||||
|
EMIF_REG_INITREF_DIS_SHIFT);
|
||||||
|
|
||||||
|
/* Start Full leveling */
|
||||||
|
writel(DDR3_FULL_LVL, &emif->emif_rd_wr_lvl_ctl);
|
||||||
|
|
||||||
|
__udelay(300);
|
||||||
|
|
||||||
|
/* Check for leveling timeout */
|
||||||
|
if (readl(&emif->emif_status) & EMIF_REG_LEVELING_TO_MASK) {
|
||||||
|
printf("Leveling timeout on EMIF%d\n", emif_num(base));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable refreshes after leveling */
|
||||||
|
clrbits_le32(&emif->emif_sdram_ref_ctrl, EMIF_REG_INITREF_DIS_SHIFT);
|
||||||
|
|
||||||
|
debug("HW leveling success\n");
|
||||||
|
/*
|
||||||
|
* Update slave ratios in EXT_PHY_CTRLx registers
|
||||||
|
* as per HW leveling output
|
||||||
|
*/
|
||||||
|
update_hwleveling_output(base, regs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dra7_ddr3_init(u32 base, const struct emif_regs *regs)
|
||||||
|
{
|
||||||
|
struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
|
||||||
|
|
||||||
|
if (warm_reset())
|
||||||
|
emif_reset_phy(base);
|
||||||
|
do_ext_phy_settings(base, regs);
|
||||||
|
|
||||||
|
writel(regs->ref_ctrl | EMIF_REG_INITREF_DIS_MASK,
|
||||||
|
&emif->emif_sdram_ref_ctrl);
|
||||||
|
/* Update timing registers */
|
||||||
|
writel(regs->sdram_tim1, &emif->emif_sdram_tim_1);
|
||||||
|
writel(regs->sdram_tim2, &emif->emif_sdram_tim_2);
|
||||||
|
writel(regs->sdram_tim3, &emif->emif_sdram_tim_3);
|
||||||
|
|
||||||
|
writel(EMIF_L3_CONFIG_VAL_SYS_10_MPU_5_LL_0, &emif->emif_l3_config);
|
||||||
|
writel(regs->read_idle_ctrl, &emif->emif_read_idlectrl);
|
||||||
|
writel(regs->zq_config, &emif->emif_zq_config);
|
||||||
|
writel(regs->temp_alert_config, &emif->emif_temp_alert_config);
|
||||||
|
writel(regs->emif_rd_wr_lvl_rmp_ctl, &emif->emif_rd_wr_lvl_rmp_ctl);
|
||||||
|
writel(regs->emif_rd_wr_lvl_ctl, &emif->emif_rd_wr_lvl_ctl);
|
||||||
|
|
||||||
|
writel(regs->emif_ddr_phy_ctlr_1_init, &emif->emif_ddr_phy_ctrl_1);
|
||||||
|
writel(regs->emif_rd_wr_exec_thresh, &emif->emif_rd_wr_exec_thresh);
|
||||||
|
|
||||||
|
writel(regs->ref_ctrl, &emif->emif_sdram_ref_ctrl);
|
||||||
|
|
||||||
|
writel(regs->sdram_config2, &emif->emif_lpddr2_nvm_config);
|
||||||
|
writel(regs->sdram_config_init, &emif->emif_sdram_config);
|
||||||
|
|
||||||
|
__udelay(1000);
|
||||||
|
|
||||||
|
writel(regs->ref_ctrl_final, &emif->emif_sdram_ref_ctrl);
|
||||||
|
|
||||||
|
if (regs->emif_rd_wr_lvl_rmp_ctl & EMIF_REG_RDWRLVL_EN_MASK)
|
||||||
|
dra7_ddr3_leveling(base, regs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void omap5_ddr3_init(u32 base, const struct emif_regs *regs)
|
||||||
{
|
{
|
||||||
struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
|
struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
|
||||||
|
|
||||||
@ -269,25 +378,20 @@ static void ddr3_init(u32 base, const struct emif_regs *regs)
|
|||||||
|
|
||||||
writel(regs->read_idle_ctrl, &emif->emif_read_idlectrl);
|
writel(regs->read_idle_ctrl, &emif->emif_read_idlectrl);
|
||||||
|
|
||||||
/*
|
writel(regs->sdram_config2, &emif->emif_lpddr2_nvm_config);
|
||||||
* The same sequence should work on OMAP5432 as well. But strange that
|
writel(regs->sdram_config_init, &emif->emif_sdram_config);
|
||||||
* it is not working
|
do_ext_phy_settings(base, regs);
|
||||||
*/
|
|
||||||
if (is_dra7xx()) {
|
|
||||||
do_ext_phy_settings(base, regs);
|
|
||||||
writel(regs->ref_ctrl_final, &emif->emif_sdram_ref_ctrl);
|
|
||||||
writel(regs->sdram_config2, &emif->emif_lpddr2_nvm_config);
|
|
||||||
writel(regs->sdram_config_init, &emif->emif_sdram_config);
|
|
||||||
} else {
|
|
||||||
writel(regs->sdram_config2, &emif->emif_lpddr2_nvm_config);
|
|
||||||
writel(regs->sdram_config_init, &emif->emif_sdram_config);
|
|
||||||
do_ext_phy_settings(base, regs);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* enable leveling */
|
|
||||||
writel(regs->emif_rd_wr_lvl_rmp_ctl, &emif->emif_rd_wr_lvl_rmp_ctl);
|
writel(regs->emif_rd_wr_lvl_rmp_ctl, &emif->emif_rd_wr_lvl_rmp_ctl);
|
||||||
|
omap5_ddr3_leveling(base, regs);
|
||||||
|
}
|
||||||
|
|
||||||
ddr3_leveling(base, regs);
|
static void ddr3_init(u32 base, const struct emif_regs *regs)
|
||||||
|
{
|
||||||
|
if (is_omap54xx())
|
||||||
|
omap5_ddr3_init(base, regs);
|
||||||
|
else
|
||||||
|
dra7_ddr3_init(base, regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS
|
#ifndef CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS
|
||||||
@ -1066,16 +1170,18 @@ static void do_sdram_init(u32 base)
|
|||||||
* Changing the timing registers in EMIF can happen(going from one
|
* Changing the timing registers in EMIF can happen(going from one
|
||||||
* OPP to another)
|
* OPP to another)
|
||||||
*/
|
*/
|
||||||
if (!(in_sdram || warm_reset())) {
|
if (!in_sdram && (!warm_reset() || is_dra7xx())) {
|
||||||
if (emif_sdram_type() == EMIF_SDRAM_TYPE_LPDDR2)
|
if (emif_sdram_type(regs->sdram_config) ==
|
||||||
|
EMIF_SDRAM_TYPE_LPDDR2)
|
||||||
lpddr2_init(base, regs);
|
lpddr2_init(base, regs);
|
||||||
else
|
else
|
||||||
ddr3_init(base, regs);
|
ddr3_init(base, regs);
|
||||||
}
|
}
|
||||||
if (warm_reset() && (emif_sdram_type() == EMIF_SDRAM_TYPE_DDR3)) {
|
if (warm_reset() && (emif_sdram_type(regs->sdram_config) ==
|
||||||
|
EMIF_SDRAM_TYPE_DDR3) && !is_dra7xx()) {
|
||||||
set_lpmode_selfrefresh(base);
|
set_lpmode_selfrefresh(base);
|
||||||
emif_reset_phy(base);
|
emif_reset_phy(base);
|
||||||
ddr3_leveling(base, regs);
|
omap5_ddr3_leveling(base, regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write to the shadow registers */
|
/* Write to the shadow registers */
|
||||||
@ -1294,7 +1400,8 @@ static void do_bug0039_workaround(u32 base)
|
|||||||
void sdram_init(void)
|
void sdram_init(void)
|
||||||
{
|
{
|
||||||
u32 in_sdram, size_prog, size_detect;
|
u32 in_sdram, size_prog, size_detect;
|
||||||
u32 sdram_type = emif_sdram_type();
|
struct emif_reg_struct *emif = (struct emif_reg_struct *)EMIF1_BASE;
|
||||||
|
u32 sdram_type = emif_sdram_type(emif->emif_sdram_config);
|
||||||
|
|
||||||
debug(">>sdram_init()\n");
|
debug(">>sdram_init()\n");
|
||||||
|
|
||||||
|
@ -11,3 +11,4 @@ obj-y += sdram.o
|
|||||||
obj-y += prcm-regs.o
|
obj-y += prcm-regs.o
|
||||||
obj-y += hw_data.o
|
obj-y += hw_data.o
|
||||||
obj-y += abb.o
|
obj-y += abb.o
|
||||||
|
obj-$(CONFIG_IODELAY_RECALIBRATION) += dra7xx_iodelay.o
|
||||||
|
238
arch/arm/cpu/armv7/omap5/dra7xx_iodelay.c
Normal file
238
arch/arm/cpu/armv7/omap5/dra7xx_iodelay.c
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
/*
|
||||||
|
* (C) Copyright 2015
|
||||||
|
* Texas Instruments Incorporated, <www.ti.com>
|
||||||
|
*
|
||||||
|
* Lokesh Vutla <lokeshvutla@ti.com>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <asm/utils.h>
|
||||||
|
#include <asm/arch/dra7xx_iodelay.h>
|
||||||
|
#include <asm/arch/omap.h>
|
||||||
|
#include <asm/arch/sys_proto.h>
|
||||||
|
#include <asm/arch/clock.h>
|
||||||
|
#include <asm/arch/mux_dra7xx.h>
|
||||||
|
#include <asm/omap_common.h>
|
||||||
|
|
||||||
|
static int isolate_io(u32 isolate)
|
||||||
|
{
|
||||||
|
if (isolate) {
|
||||||
|
clrsetbits_le32((*ctrl)->control_pbias, SDCARD_PWRDNZ,
|
||||||
|
SDCARD_PWRDNZ);
|
||||||
|
clrsetbits_le32((*ctrl)->control_pbias, SDCARD_BIAS_PWRDNZ,
|
||||||
|
SDCARD_BIAS_PWRDNZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Override control on ISOCLKIN signal to IO pad ring. */
|
||||||
|
clrsetbits_le32((*prcm)->prm_io_pmctrl, PMCTRL_ISOCLK_OVERRIDE_MASK,
|
||||||
|
PMCTRL_ISOCLK_OVERRIDE_CTRL);
|
||||||
|
if (!wait_on_value(PMCTRL_ISOCLK_STATUS_MASK, PMCTRL_ISOCLK_STATUS_MASK,
|
||||||
|
(u32 *)(*prcm)->prm_io_pmctrl, LDELAY))
|
||||||
|
return ERR_DEISOLATE_IO << isolate;
|
||||||
|
|
||||||
|
/* Isolate/Deisolate IO */
|
||||||
|
clrsetbits_le32((*ctrl)->ctrl_core_sma_sw_0, CTRL_ISOLATE_MASK,
|
||||||
|
isolate << CTRL_ISOLATE_SHIFT);
|
||||||
|
/* Dummy read to add delay t > 10ns */
|
||||||
|
readl((*ctrl)->ctrl_core_sma_sw_0);
|
||||||
|
|
||||||
|
/* Return control on ISOCLKIN to hardware */
|
||||||
|
clrsetbits_le32((*prcm)->prm_io_pmctrl, PMCTRL_ISOCLK_OVERRIDE_MASK,
|
||||||
|
PMCTRL_ISOCLK_NOT_OVERRIDE_CTRL);
|
||||||
|
if (!wait_on_value(PMCTRL_ISOCLK_STATUS_MASK,
|
||||||
|
0 << PMCTRL_ISOCLK_STATUS_SHIFT,
|
||||||
|
(u32 *)(*prcm)->prm_io_pmctrl, LDELAY))
|
||||||
|
return ERR_DEISOLATE_IO << isolate;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int calibrate_iodelay(u32 base)
|
||||||
|
{
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
/* Configure REFCLK period */
|
||||||
|
reg = readl(base + CFG_REG_2_OFFSET);
|
||||||
|
reg &= ~CFG_REG_REFCLK_PERIOD_MASK;
|
||||||
|
reg |= CFG_REG_REFCLK_PERIOD;
|
||||||
|
writel(reg, base + CFG_REG_2_OFFSET);
|
||||||
|
|
||||||
|
/* Initiate Calibration */
|
||||||
|
clrsetbits_le32(base + CFG_REG_0_OFFSET, CFG_REG_CALIB_STRT_MASK,
|
||||||
|
CFG_REG_CALIB_STRT << CFG_REG_CALIB_STRT_SHIFT);
|
||||||
|
if (!wait_on_value(CFG_REG_CALIB_STRT_MASK, CFG_REG_CALIB_END,
|
||||||
|
(u32 *)(base + CFG_REG_0_OFFSET), LDELAY))
|
||||||
|
return ERR_CALIBRATE_IODELAY;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int update_delay_mechanism(u32 base)
|
||||||
|
{
|
||||||
|
/* Initiate the reload of calibrated values. */
|
||||||
|
clrsetbits_le32(base + CFG_REG_0_OFFSET, CFG_REG_ROM_READ_MASK,
|
||||||
|
CFG_REG_ROM_READ_START);
|
||||||
|
if (!wait_on_value(CFG_REG_ROM_READ_MASK, CFG_REG_ROM_READ_END,
|
||||||
|
(u32 *)(base + CFG_REG_0_OFFSET), LDELAY))
|
||||||
|
return ERR_UPDATE_DELAY;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u32 calculate_delay(u32 base, u16 offset, u16 den)
|
||||||
|
{
|
||||||
|
u16 refclk_period, dly_cnt, ref_cnt;
|
||||||
|
u32 reg, q, r;
|
||||||
|
|
||||||
|
refclk_period = readl(base + CFG_REG_2_OFFSET) &
|
||||||
|
CFG_REG_REFCLK_PERIOD_MASK;
|
||||||
|
|
||||||
|
reg = readl(base + offset);
|
||||||
|
dly_cnt = (reg & CFG_REG_DLY_CNT_MASK) >> CFG_REG_DLY_CNT_SHIFT;
|
||||||
|
ref_cnt = (reg & CFG_REG_REF_CNT_MASK) >> CFG_REG_REF_CNT_SHIFT;
|
||||||
|
|
||||||
|
if (!dly_cnt || !den)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To avoid overflow and integer truncation, delay value
|
||||||
|
* is calculated as quotient + remainder.
|
||||||
|
*/
|
||||||
|
q = 5 * ((ref_cnt * refclk_period) / (dly_cnt * den));
|
||||||
|
r = (10 * ((ref_cnt * refclk_period) % (dly_cnt * den))) /
|
||||||
|
(2 * dly_cnt * den);
|
||||||
|
|
||||||
|
return q + r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u32 get_cfg_reg(u16 a_delay, u16 g_delay, u32 cpde, u32 fpde)
|
||||||
|
{
|
||||||
|
u32 g_delay_coarse, g_delay_fine;
|
||||||
|
u32 a_delay_coarse, a_delay_fine;
|
||||||
|
u32 c_elements, f_elements;
|
||||||
|
u32 total_delay, reg = 0;
|
||||||
|
|
||||||
|
g_delay_coarse = g_delay / 920;
|
||||||
|
g_delay_fine = ((g_delay % 920) * 10) / 60;
|
||||||
|
|
||||||
|
a_delay_coarse = a_delay / cpde;
|
||||||
|
a_delay_fine = ((a_delay % cpde) * 10) / fpde;
|
||||||
|
|
||||||
|
c_elements = g_delay_coarse + a_delay_coarse;
|
||||||
|
f_elements = (g_delay_fine + a_delay_fine) / 10;
|
||||||
|
|
||||||
|
if (f_elements > 22) {
|
||||||
|
total_delay = c_elements * cpde + f_elements * fpde;
|
||||||
|
|
||||||
|
c_elements = total_delay / cpde;
|
||||||
|
f_elements = (total_delay % cpde) / fpde;
|
||||||
|
}
|
||||||
|
|
||||||
|
reg = (c_elements << CFG_X_COARSE_DLY_SHIFT) & CFG_X_COARSE_DLY_MASK;
|
||||||
|
reg |= (f_elements << CFG_X_FINE_DLY_SHIFT) & CFG_X_FINE_DLY_MASK;
|
||||||
|
reg |= CFG_X_SIGNATURE << CFG_X_SIGNATURE_SHIFT;
|
||||||
|
reg |= CFG_X_LOCK << CFG_X_LOCK_SHIFT;
|
||||||
|
|
||||||
|
return reg;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_set_iodelay(u32 base, struct iodelay_cfg_entry const *array,
|
||||||
|
int niodelays)
|
||||||
|
{
|
||||||
|
struct iodelay_cfg_entry *iodelay = (struct iodelay_cfg_entry *)array;
|
||||||
|
u32 reg, cpde, fpde, i;
|
||||||
|
|
||||||
|
if (!niodelays)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
cpde = calculate_delay((*ctrl)->iodelay_config_base, CFG_REG_3_OFFSET,
|
||||||
|
88);
|
||||||
|
if (!cpde)
|
||||||
|
return ERR_CPDE;
|
||||||
|
|
||||||
|
fpde = calculate_delay((*ctrl)->iodelay_config_base, CFG_REG_4_OFFSET,
|
||||||
|
264);
|
||||||
|
if (!fpde)
|
||||||
|
return ERR_FPDE;
|
||||||
|
|
||||||
|
for (i = 0; i < niodelays; i++, iodelay++) {
|
||||||
|
reg = get_cfg_reg(iodelay->a_delay, iodelay->g_delay, cpde,
|
||||||
|
fpde);
|
||||||
|
writel(reg, base + iodelay->offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void __recalibrate_iodelay(struct pad_conf_entry const *pad, int npads,
|
||||||
|
struct iodelay_cfg_entry const *iodelay,
|
||||||
|
int niodelays)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
/* IO recalibration should be done only from SRAM */
|
||||||
|
if (OMAP_INIT_CONTEXT_SPL != omap_hw_init_context()) {
|
||||||
|
puts("IODELAY recalibration called from invalid context - use only from SPL in SRAM\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* unlock IODELAY CONFIG registers */
|
||||||
|
writel(CFG_IODELAY_UNLOCK_KEY, (*ctrl)->iodelay_config_base +
|
||||||
|
CFG_REG_8_OFFSET);
|
||||||
|
|
||||||
|
ret = calibrate_iodelay((*ctrl)->iodelay_config_base);
|
||||||
|
if (ret)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
ret = isolate_io(ISOLATE_IO);
|
||||||
|
if (ret)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
ret = update_delay_mechanism((*ctrl)->iodelay_config_base);
|
||||||
|
if (ret)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
/* Configure Mux settings */
|
||||||
|
do_set_mux32((*ctrl)->control_padconf_core_base, pad, npads);
|
||||||
|
|
||||||
|
/* Configure Manual IO timing modes */
|
||||||
|
ret = do_set_iodelay((*ctrl)->iodelay_config_base, iodelay, niodelays);
|
||||||
|
if (ret)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
ret = isolate_io(DEISOLATE_IO);
|
||||||
|
|
||||||
|
err:
|
||||||
|
/* lock IODELAY CONFIG registers */
|
||||||
|
writel(CFG_IODELAY_LOCK_KEY, (*ctrl)->iodelay_config_base +
|
||||||
|
CFG_REG_8_OFFSET);
|
||||||
|
/*
|
||||||
|
* UART cannot be used during IO recalibration sequence as IOs are in
|
||||||
|
* isolation. So error handling and debug prints are done after
|
||||||
|
* complete IO delay recalibration sequence
|
||||||
|
*/
|
||||||
|
switch (ret) {
|
||||||
|
case ERR_CALIBRATE_IODELAY:
|
||||||
|
puts("IODELAY: IO delay calibration sequence failed\n");
|
||||||
|
break;
|
||||||
|
case ERR_ISOLATE_IO:
|
||||||
|
puts("IODELAY: Isolation of Device IOs failed\n");
|
||||||
|
break;
|
||||||
|
case ERR_UPDATE_DELAY:
|
||||||
|
puts("IODELAY: Delay mechanism update with new calibrated values failed\n");
|
||||||
|
break;
|
||||||
|
case ERR_DEISOLATE_IO:
|
||||||
|
puts("IODELAY: De-isolation of Device IOs failed\n");
|
||||||
|
break;
|
||||||
|
case ERR_CPDE:
|
||||||
|
puts("IODELAY: CPDE calculation failed\n");
|
||||||
|
break;
|
||||||
|
case ERR_FPDE:
|
||||||
|
puts("IODELAY: FPDE calculation failed\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
debug("IODELAY: IO delay recalibration successfully completed\n");
|
||||||
|
}
|
||||||
|
}
|
@ -534,6 +534,9 @@ void enable_basic_clocks(void)
|
|||||||
void enable_basic_uboot_clocks(void)
|
void enable_basic_uboot_clocks(void)
|
||||||
{
|
{
|
||||||
u32 const clk_domains_essential[] = {
|
u32 const clk_domains_essential[] = {
|
||||||
|
#if defined(CONFIG_DRA7XX) || defined(CONFIG_AM57XX)
|
||||||
|
(*prcm)->cm_ipu_clkstctrl,
|
||||||
|
#endif
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -547,7 +550,11 @@ void enable_basic_uboot_clocks(void)
|
|||||||
(*prcm)->cm_l4per_i2c2_clkctrl,
|
(*prcm)->cm_l4per_i2c2_clkctrl,
|
||||||
(*prcm)->cm_l4per_i2c3_clkctrl,
|
(*prcm)->cm_l4per_i2c3_clkctrl,
|
||||||
(*prcm)->cm_l4per_i2c4_clkctrl,
|
(*prcm)->cm_l4per_i2c4_clkctrl,
|
||||||
|
#if defined(CONFIG_DRA7XX) || defined(CONFIG_AM57XX)
|
||||||
|
(*prcm)->cm_ipu_i2c5_clkctrl,
|
||||||
|
#else
|
||||||
(*prcm)->cm_l4per_i2c5_clkctrl,
|
(*prcm)->cm_l4per_i2c5_clkctrl,
|
||||||
|
#endif
|
||||||
(*prcm)->cm_l3init_hsusbhost_clkctrl,
|
(*prcm)->cm_l3init_hsusbhost_clkctrl,
|
||||||
(*prcm)->cm_l3init_fsusb_clkctrl,
|
(*prcm)->cm_l3init_fsusb_clkctrl,
|
||||||
0
|
0
|
||||||
@ -592,8 +599,8 @@ const struct ctrl_ioregs ioregs_dra7xx_es1 = {
|
|||||||
.ctrl_ddrch = 0x40404040,
|
.ctrl_ddrch = 0x40404040,
|
||||||
.ctrl_lpddr2ch = 0x40404040,
|
.ctrl_lpddr2ch = 0x40404040,
|
||||||
.ctrl_ddr3ch = 0x80808080,
|
.ctrl_ddr3ch = 0x80808080,
|
||||||
.ctrl_ddrio_0 = 0xA2084210,
|
.ctrl_ddrio_0 = 0x00094A40,
|
||||||
.ctrl_ddrio_1 = 0x84210840,
|
.ctrl_ddrio_1 = 0x04A52000,
|
||||||
.ctrl_ddrio_2 = 0x84210000,
|
.ctrl_ddrio_2 = 0x84210000,
|
||||||
.ctrl_emif_sdram_config_ext = 0x0001C1A7,
|
.ctrl_emif_sdram_config_ext = 0x0001C1A7,
|
||||||
.ctrl_emif_sdram_config_ext_final = 0x0001C1A7,
|
.ctrl_emif_sdram_config_ext_final = 0x0001C1A7,
|
||||||
@ -604,8 +611,8 @@ const struct ctrl_ioregs ioregs_dra72x_es1 = {
|
|||||||
.ctrl_ddrch = 0x40404040,
|
.ctrl_ddrch = 0x40404040,
|
||||||
.ctrl_lpddr2ch = 0x40404040,
|
.ctrl_lpddr2ch = 0x40404040,
|
||||||
.ctrl_ddr3ch = 0x60606080,
|
.ctrl_ddr3ch = 0x60606080,
|
||||||
.ctrl_ddrio_0 = 0xA2084210,
|
.ctrl_ddrio_0 = 0x00094A40,
|
||||||
.ctrl_ddrio_1 = 0x84210840,
|
.ctrl_ddrio_1 = 0x04A52000,
|
||||||
.ctrl_ddrio_2 = 0x84210000,
|
.ctrl_ddrio_2 = 0x84210000,
|
||||||
.ctrl_emif_sdram_config_ext = 0x0001C1A7,
|
.ctrl_emif_sdram_config_ext = 0x0001C1A7,
|
||||||
.ctrl_emif_sdram_config_ext_final = 0x0001C1A7,
|
.ctrl_emif_sdram_config_ext_final = 0x0001C1A7,
|
||||||
|
@ -40,6 +40,15 @@ static struct gpio_bank gpio_bank_54xx[8] = {
|
|||||||
|
|
||||||
const struct gpio_bank *const omap_gpio_bank = gpio_bank_54xx;
|
const struct gpio_bank *const omap_gpio_bank = gpio_bank_54xx;
|
||||||
|
|
||||||
|
void do_set_mux32(u32 base, struct pad_conf_entry const *array, int size)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
struct pad_conf_entry *pad = (struct pad_conf_entry *)array;
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++, pad++)
|
||||||
|
writel(pad->val, base + pad->offset);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SPL_BUILD
|
#ifdef CONFIG_SPL_BUILD
|
||||||
/* LPDDR2 specific IO settings */
|
/* LPDDR2 specific IO settings */
|
||||||
static void io_settings_lpddr2(void)
|
static void io_settings_lpddr2(void)
|
||||||
@ -75,16 +84,20 @@ static void io_settings_ddr3(void)
|
|||||||
|
|
||||||
writel(ioregs->ctrl_ddrio_0, (*ctrl)->control_ddrio_0);
|
writel(ioregs->ctrl_ddrio_0, (*ctrl)->control_ddrio_0);
|
||||||
writel(ioregs->ctrl_ddrio_1, (*ctrl)->control_ddrio_1);
|
writel(ioregs->ctrl_ddrio_1, (*ctrl)->control_ddrio_1);
|
||||||
writel(ioregs->ctrl_ddrio_2, (*ctrl)->control_ddrio_2);
|
|
||||||
|
if (!is_dra7xx()) {
|
||||||
|
writel(ioregs->ctrl_ddrio_2, (*ctrl)->control_ddrio_2);
|
||||||
|
writel(ioregs->ctrl_lpddr2ch, (*ctrl)->control_lpddr2ch1_1);
|
||||||
|
}
|
||||||
|
|
||||||
/* omap5432 does not use lpddr2 */
|
/* omap5432 does not use lpddr2 */
|
||||||
writel(ioregs->ctrl_lpddr2ch, (*ctrl)->control_lpddr2ch1_0);
|
writel(ioregs->ctrl_lpddr2ch, (*ctrl)->control_lpddr2ch1_0);
|
||||||
writel(ioregs->ctrl_lpddr2ch, (*ctrl)->control_lpddr2ch1_1);
|
|
||||||
|
|
||||||
writel(ioregs->ctrl_emif_sdram_config_ext,
|
writel(ioregs->ctrl_emif_sdram_config_ext,
|
||||||
(*ctrl)->control_emif1_sdram_config_ext);
|
(*ctrl)->control_emif1_sdram_config_ext);
|
||||||
writel(ioregs->ctrl_emif_sdram_config_ext,
|
if (!is_dra72x())
|
||||||
(*ctrl)->control_emif2_sdram_config_ext);
|
writel(ioregs->ctrl_emif_sdram_config_ext,
|
||||||
|
(*ctrl)->control_emif2_sdram_config_ext);
|
||||||
|
|
||||||
if (is_omap54xx()) {
|
if (is_omap54xx()) {
|
||||||
/* Disable DLL select */
|
/* Disable DLL select */
|
||||||
@ -109,6 +122,7 @@ static void io_settings_ddr3(void)
|
|||||||
void do_io_settings(void)
|
void do_io_settings(void)
|
||||||
{
|
{
|
||||||
u32 io_settings = 0, mask = 0;
|
u32 io_settings = 0, mask = 0;
|
||||||
|
struct emif_reg_struct *emif = (struct emif_reg_struct *)EMIF1_BASE;
|
||||||
|
|
||||||
/* Impedance settings EMMC, C2C 1,2, hsi2 */
|
/* Impedance settings EMMC, C2C 1,2, hsi2 */
|
||||||
mask = (ds_mask << 2) | (ds_mask << 8) |
|
mask = (ds_mask << 2) | (ds_mask << 8) |
|
||||||
@ -164,7 +178,7 @@ void do_io_settings(void)
|
|||||||
(sc_fast << 17) | (sc_fast << 14);
|
(sc_fast << 17) | (sc_fast << 14);
|
||||||
writel(io_settings, (*ctrl)->control_smart3io_padconf_1);
|
writel(io_settings, (*ctrl)->control_smart3io_padconf_1);
|
||||||
|
|
||||||
if (emif_sdram_type() == EMIF_SDRAM_TYPE_LPDDR2)
|
if (emif_sdram_type(emif->emif_sdram_config) == EMIF_SDRAM_TYPE_LPDDR2)
|
||||||
io_settings_lpddr2();
|
io_settings_lpddr2();
|
||||||
else
|
else
|
||||||
io_settings_ddr3();
|
io_settings_ddr3();
|
||||||
|
@ -378,6 +378,7 @@ struct omap_sys_ctrl_regs const dra7xx_ctrl = {
|
|||||||
.control_status = 0x4A002134,
|
.control_status = 0x4A002134,
|
||||||
.control_phy_power_usb = 0x4A002370,
|
.control_phy_power_usb = 0x4A002370,
|
||||||
.control_phy_power_sata = 0x4A002374,
|
.control_phy_power_sata = 0x4A002374,
|
||||||
|
.ctrl_core_sma_sw_0 = 0x4A0023FC,
|
||||||
.control_core_mac_id_0_lo = 0x4A002514,
|
.control_core_mac_id_0_lo = 0x4A002514,
|
||||||
.control_core_mac_id_0_hi = 0x4A002518,
|
.control_core_mac_id_0_hi = 0x4A002518,
|
||||||
.control_core_mac_id_1_lo = 0x4A00251C,
|
.control_core_mac_id_1_lo = 0x4A00251C,
|
||||||
@ -457,6 +458,7 @@ struct omap_sys_ctrl_regs const dra7xx_ctrl = {
|
|||||||
.control_efuse_3 = 0x4AE0C5D0,
|
.control_efuse_3 = 0x4AE0C5D0,
|
||||||
.control_efuse_4 = 0x4AE0C5D4,
|
.control_efuse_4 = 0x4AE0C5D4,
|
||||||
.control_efuse_13 = 0x4AE0C5F0,
|
.control_efuse_13 = 0x4AE0C5F0,
|
||||||
|
.iodelay_config_base = 0x4844A000,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct prcm_regs const omap5_es2_prcm = {
|
struct prcm_regs const omap5_es2_prcm = {
|
||||||
@ -815,6 +817,10 @@ struct prcm_regs const dra7xx_prcm = {
|
|||||||
.cm_dsp_clkstctrl = 0x4a005400,
|
.cm_dsp_clkstctrl = 0x4a005400,
|
||||||
.cm_dsp_dsp_clkctrl = 0x4a005420,
|
.cm_dsp_dsp_clkctrl = 0x4a005420,
|
||||||
|
|
||||||
|
/* cm IPU */
|
||||||
|
.cm_ipu_clkstctrl = 0x4a005540,
|
||||||
|
.cm_ipu_i2c5_clkctrl = 0x4a005578,
|
||||||
|
|
||||||
/* prm irqstatus regs */
|
/* prm irqstatus regs */
|
||||||
.prm_irqstatus_mpu_2 = 0x4ae06014,
|
.prm_irqstatus_mpu_2 = 0x4ae06014,
|
||||||
|
|
||||||
@ -976,6 +982,7 @@ struct prcm_regs const dra7xx_prcm = {
|
|||||||
.prm_rstctrl = 0x4ae07d00,
|
.prm_rstctrl = 0x4ae07d00,
|
||||||
.prm_rstst = 0x4ae07d04,
|
.prm_rstst = 0x4ae07d04,
|
||||||
.prm_rsttime = 0x4ae07d08,
|
.prm_rsttime = 0x4ae07d08,
|
||||||
|
.prm_io_pmctrl = 0x4ae07d20,
|
||||||
.prm_vc_val_bypass = 0x4ae07da0,
|
.prm_vc_val_bypass = 0x4ae07da0,
|
||||||
.prm_vc_cfg_i2c_mode = 0x4ae07db4,
|
.prm_vc_cfg_i2c_mode = 0x4ae07db4,
|
||||||
.prm_vc_cfg_i2c_clk = 0x4ae07db8,
|
.prm_vc_cfg_i2c_clk = 0x4ae07db8,
|
||||||
|
@ -146,18 +146,18 @@ const struct emif_regs emif_1_regs_ddr3_532_mhz_1cs_dra_es1 = {
|
|||||||
.sdram_tim1 = 0xCCCF36B3,
|
.sdram_tim1 = 0xCCCF36B3,
|
||||||
.sdram_tim2 = 0x308F7FDA,
|
.sdram_tim2 = 0x308F7FDA,
|
||||||
.sdram_tim3 = 0x027F88A8,
|
.sdram_tim3 = 0x027F88A8,
|
||||||
.read_idle_ctrl = 0x00050001,
|
.read_idle_ctrl = 0x00050000,
|
||||||
.zq_config = 0x0007190B,
|
.zq_config = 0x0007190B,
|
||||||
.temp_alert_config = 0x00000000,
|
.temp_alert_config = 0x00000000,
|
||||||
.emif_ddr_phy_ctlr_1_init = 0x0E24400A,
|
.emif_ddr_phy_ctlr_1_init = 0x0024400B,
|
||||||
.emif_ddr_phy_ctlr_1 = 0x0E24400A,
|
.emif_ddr_phy_ctlr_1 = 0x0E24400B,
|
||||||
.emif_ddr_ext_phy_ctrl_1 = 0x10040100,
|
.emif_ddr_ext_phy_ctrl_1 = 0x10040100,
|
||||||
.emif_ddr_ext_phy_ctrl_2 = 0x00910091,
|
.emif_ddr_ext_phy_ctrl_2 = 0x00910091,
|
||||||
.emif_ddr_ext_phy_ctrl_3 = 0x00950095,
|
.emif_ddr_ext_phy_ctrl_3 = 0x00950095,
|
||||||
.emif_ddr_ext_phy_ctrl_4 = 0x009B009B,
|
.emif_ddr_ext_phy_ctrl_4 = 0x009B009B,
|
||||||
.emif_ddr_ext_phy_ctrl_5 = 0x009E009E,
|
.emif_ddr_ext_phy_ctrl_5 = 0x009E009E,
|
||||||
.emif_rd_wr_lvl_rmp_win = 0x00000000,
|
.emif_rd_wr_lvl_rmp_win = 0x00000000,
|
||||||
.emif_rd_wr_lvl_rmp_ctl = 0x00000000,
|
.emif_rd_wr_lvl_rmp_ctl = 0x80000000,
|
||||||
.emif_rd_wr_lvl_ctl = 0x00000000,
|
.emif_rd_wr_lvl_ctl = 0x00000000,
|
||||||
.emif_rd_wr_exec_thresh = 0x00000305
|
.emif_rd_wr_exec_thresh = 0x00000305
|
||||||
};
|
};
|
||||||
@ -171,18 +171,18 @@ const struct emif_regs emif_2_regs_ddr3_532_mhz_1cs_dra_es1 = {
|
|||||||
.sdram_tim1 = 0xCCCF36B3,
|
.sdram_tim1 = 0xCCCF36B3,
|
||||||
.sdram_tim2 = 0x308F7FDA,
|
.sdram_tim2 = 0x308F7FDA,
|
||||||
.sdram_tim3 = 0x027F88A8,
|
.sdram_tim3 = 0x027F88A8,
|
||||||
.read_idle_ctrl = 0x00050001,
|
.read_idle_ctrl = 0x00050000,
|
||||||
.zq_config = 0x0007190B,
|
.zq_config = 0x0007190B,
|
||||||
.temp_alert_config = 0x00000000,
|
.temp_alert_config = 0x00000000,
|
||||||
.emif_ddr_phy_ctlr_1_init = 0x0E24400A,
|
.emif_ddr_phy_ctlr_1_init = 0x0024400B,
|
||||||
.emif_ddr_phy_ctlr_1 = 0x0E24400A,
|
.emif_ddr_phy_ctlr_1 = 0x0E24400B,
|
||||||
.emif_ddr_ext_phy_ctrl_1 = 0x10040100,
|
.emif_ddr_ext_phy_ctrl_1 = 0x10040100,
|
||||||
.emif_ddr_ext_phy_ctrl_2 = 0x00910091,
|
.emif_ddr_ext_phy_ctrl_2 = 0x00910091,
|
||||||
.emif_ddr_ext_phy_ctrl_3 = 0x00950095,
|
.emif_ddr_ext_phy_ctrl_3 = 0x00950095,
|
||||||
.emif_ddr_ext_phy_ctrl_4 = 0x009B009B,
|
.emif_ddr_ext_phy_ctrl_4 = 0x009B009B,
|
||||||
.emif_ddr_ext_phy_ctrl_5 = 0x009E009E,
|
.emif_ddr_ext_phy_ctrl_5 = 0x009E009E,
|
||||||
.emif_rd_wr_lvl_rmp_win = 0x00000000,
|
.emif_rd_wr_lvl_rmp_win = 0x00000000,
|
||||||
.emif_rd_wr_lvl_rmp_ctl = 0x00000000,
|
.emif_rd_wr_lvl_rmp_ctl = 0x80000000,
|
||||||
.emif_rd_wr_lvl_ctl = 0x00000000,
|
.emif_rd_wr_lvl_ctl = 0x00000000,
|
||||||
.emif_rd_wr_exec_thresh = 0x00000305
|
.emif_rd_wr_exec_thresh = 0x00000305
|
||||||
};
|
};
|
||||||
@ -191,15 +191,15 @@ const struct emif_regs emif_1_regs_ddr3_666_mhz_1cs_dra_es1 = {
|
|||||||
.sdram_config_init = 0x61862B32,
|
.sdram_config_init = 0x61862B32,
|
||||||
.sdram_config = 0x61862B32,
|
.sdram_config = 0x61862B32,
|
||||||
.sdram_config2 = 0x08000000,
|
.sdram_config2 = 0x08000000,
|
||||||
.ref_ctrl = 0x0000493E,
|
.ref_ctrl = 0x0000514C,
|
||||||
.ref_ctrl_final = 0x0000144A,
|
.ref_ctrl_final = 0x0000144A,
|
||||||
.sdram_tim1 = 0xD113781C,
|
.sdram_tim1 = 0xD113781C,
|
||||||
.sdram_tim2 = 0x308F7FE3,
|
.sdram_tim2 = 0x305A7FDA,
|
||||||
.sdram_tim3 = 0x009F86A8,
|
.sdram_tim3 = 0x409F86A8,
|
||||||
.read_idle_ctrl = 0x00050000,
|
.read_idle_ctrl = 0x00050000,
|
||||||
.zq_config = 0x0007190B,
|
.zq_config = 0x5007190B,
|
||||||
.temp_alert_config = 0x00000000,
|
.temp_alert_config = 0x00000000,
|
||||||
.emif_ddr_phy_ctlr_1_init = 0x0E24400D,
|
.emif_ddr_phy_ctlr_1_init = 0x0024400D,
|
||||||
.emif_ddr_phy_ctlr_1 = 0x0E24400D,
|
.emif_ddr_phy_ctlr_1 = 0x0E24400D,
|
||||||
.emif_ddr_ext_phy_ctrl_1 = 0x10040100,
|
.emif_ddr_ext_phy_ctrl_1 = 0x10040100,
|
||||||
.emif_ddr_ext_phy_ctrl_2 = 0x00A400A4,
|
.emif_ddr_ext_phy_ctrl_2 = 0x00A400A4,
|
||||||
@ -207,7 +207,7 @@ const struct emif_regs emif_1_regs_ddr3_666_mhz_1cs_dra_es1 = {
|
|||||||
.emif_ddr_ext_phy_ctrl_4 = 0x00B000B0,
|
.emif_ddr_ext_phy_ctrl_4 = 0x00B000B0,
|
||||||
.emif_ddr_ext_phy_ctrl_5 = 0x00B000B0,
|
.emif_ddr_ext_phy_ctrl_5 = 0x00B000B0,
|
||||||
.emif_rd_wr_lvl_rmp_win = 0x00000000,
|
.emif_rd_wr_lvl_rmp_win = 0x00000000,
|
||||||
.emif_rd_wr_lvl_rmp_ctl = 0x00000000,
|
.emif_rd_wr_lvl_rmp_ctl = 0x80000000,
|
||||||
.emif_rd_wr_lvl_ctl = 0x00000000,
|
.emif_rd_wr_lvl_ctl = 0x00000000,
|
||||||
.emif_rd_wr_exec_thresh = 0x00000305
|
.emif_rd_wr_exec_thresh = 0x00000305
|
||||||
};
|
};
|
||||||
@ -421,8 +421,14 @@ const u32 ddr3_ext_phy_ctrl_const_base_es2[] = {
|
|||||||
0x0
|
0x0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Ext phy ctrl 1-35 regs */
|
||||||
const u32
|
const u32
|
||||||
dra_ddr3_ext_phy_ctrl_const_base_es1_emif1[] = {
|
dra_ddr3_ext_phy_ctrl_const_base_es1_emif1[] = {
|
||||||
|
0x10040100,
|
||||||
|
0x00910091,
|
||||||
|
0x00950095,
|
||||||
|
0x009B009B,
|
||||||
|
0x009E009E,
|
||||||
0x00980098,
|
0x00980098,
|
||||||
0x00340034,
|
0x00340034,
|
||||||
0x00350035,
|
0x00350035,
|
||||||
@ -441,17 +447,28 @@ dra_ddr3_ext_phy_ctrl_const_base_es1_emif1[] = {
|
|||||||
0x00500050,
|
0x00500050,
|
||||||
0x00000000,
|
0x00000000,
|
||||||
0x00600020,
|
0x00600020,
|
||||||
0x40010080,
|
0x40011080,
|
||||||
0x08102040,
|
0x08102040,
|
||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
0x0
|
0x0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Ext phy ctrl 1-35 regs */
|
||||||
const u32
|
const u32
|
||||||
dra_ddr3_ext_phy_ctrl_const_base_es1_emif2[] = {
|
dra_ddr3_ext_phy_ctrl_const_base_es1_emif2[] = {
|
||||||
|
0x10040100,
|
||||||
|
0x00910091,
|
||||||
|
0x00950095,
|
||||||
|
0x009B009B,
|
||||||
|
0x009E009E,
|
||||||
0x00980098,
|
0x00980098,
|
||||||
0x00330033,
|
0x00330033,
|
||||||
0x00330033,
|
0x00330033,
|
||||||
@ -470,17 +487,28 @@ dra_ddr3_ext_phy_ctrl_const_base_es1_emif2[] = {
|
|||||||
0x00500050,
|
0x00500050,
|
||||||
0x00000000,
|
0x00000000,
|
||||||
0x00600020,
|
0x00600020,
|
||||||
0x40010080,
|
0x40011080,
|
||||||
0x08102040,
|
0x08102040,
|
||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
0x0
|
0x0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Ext phy ctrl 1-35 regs */
|
||||||
const u32
|
const u32
|
||||||
dra_ddr3_ext_phy_ctrl_const_base_666MHz[] = {
|
dra_ddr3_ext_phy_ctrl_const_base_666MHz[] = {
|
||||||
|
0x10040100,
|
||||||
|
0x00A400A4,
|
||||||
|
0x00A900A9,
|
||||||
|
0x00B000B0,
|
||||||
|
0x00B000B0,
|
||||||
0x00A400A4,
|
0x00A400A4,
|
||||||
0x00390039,
|
0x00390039,
|
||||||
0x00320032,
|
0x00320032,
|
||||||
@ -505,6 +533,11 @@ dra_ddr3_ext_phy_ctrl_const_base_666MHz[] = {
|
|||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
0x0
|
0x0
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -562,7 +595,7 @@ void get_lpddr2_mr_regs(const struct lpddr2_mr_regs **regs)
|
|||||||
*regs = &mr_regs;
|
*regs = &mr_regs;
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_ext_phy_settings(u32 base, const struct emif_regs *regs)
|
static void do_ext_phy_settings_omap5(u32 base, const struct emif_regs *regs)
|
||||||
{
|
{
|
||||||
u32 *ext_phy_ctrl_base = 0;
|
u32 *ext_phy_ctrl_base = 0;
|
||||||
u32 *emif_ext_phy_ctrl_base = 0;
|
u32 *emif_ext_phy_ctrl_base = 0;
|
||||||
@ -601,6 +634,58 @@ void do_ext_phy_settings(u32 base, const struct emif_regs *regs)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void do_ext_phy_settings_dra7(u32 base, const struct emif_regs *regs)
|
||||||
|
{
|
||||||
|
struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
|
||||||
|
u32 *emif_ext_phy_ctrl_base = 0;
|
||||||
|
u32 emif_nr;
|
||||||
|
const u32 *ext_phy_ctrl_const_regs;
|
||||||
|
u32 i, hw_leveling, size;
|
||||||
|
|
||||||
|
emif_nr = (base == EMIF1_BASE) ? 1 : 2;
|
||||||
|
|
||||||
|
hw_leveling = regs->emif_rd_wr_lvl_rmp_ctl >> EMIF_REG_RDWRLVL_EN_SHIFT;
|
||||||
|
|
||||||
|
emif_ext_phy_ctrl_base = (u32 *)&(emif->emif_ddr_ext_phy_ctrl_1);
|
||||||
|
|
||||||
|
emif_get_ext_phy_ctrl_const_regs(emif_nr,
|
||||||
|
&ext_phy_ctrl_const_regs, &size);
|
||||||
|
|
||||||
|
writel(ext_phy_ctrl_const_regs[0], &emif_ext_phy_ctrl_base[0]);
|
||||||
|
writel(ext_phy_ctrl_const_regs[0], &emif_ext_phy_ctrl_base[1]);
|
||||||
|
|
||||||
|
if (!hw_leveling) {
|
||||||
|
/*
|
||||||
|
* Copy the predefined PHY register values
|
||||||
|
* in case of sw leveling
|
||||||
|
*/
|
||||||
|
for (i = 1; i < 25; i++) {
|
||||||
|
writel(ext_phy_ctrl_const_regs[i],
|
||||||
|
&emif_ext_phy_ctrl_base[i * 2]);
|
||||||
|
writel(ext_phy_ctrl_const_regs[i],
|
||||||
|
&emif_ext_phy_ctrl_base[i * 2 + 1]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Write the init value for HW levling to occur
|
||||||
|
*/
|
||||||
|
for (i = 21; i < 35; i++) {
|
||||||
|
writel(ext_phy_ctrl_const_regs[i],
|
||||||
|
&emif_ext_phy_ctrl_base[i * 2]);
|
||||||
|
writel(ext_phy_ctrl_const_regs[i],
|
||||||
|
&emif_ext_phy_ctrl_base[i * 2 + 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void do_ext_phy_settings(u32 base, const struct emif_regs *regs)
|
||||||
|
{
|
||||||
|
if (is_omap54xx())
|
||||||
|
do_ext_phy_settings_omap5(base, regs);
|
||||||
|
else
|
||||||
|
do_ext_phy_settings_dra7(base, regs);
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS
|
#ifndef CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS
|
||||||
static const struct lpddr2_ac_timings timings_jedec_532_mhz = {
|
static const struct lpddr2_ac_timings timings_jedec_532_mhz = {
|
||||||
.max_freq = 532000000,
|
.max_freq = 532000000,
|
||||||
|
@ -22,10 +22,9 @@
|
|||||||
*
|
*
|
||||||
* Startup Code (reset vector)
|
* Startup Code (reset vector)
|
||||||
*
|
*
|
||||||
* do important init only if we don't start from memory!
|
* Do important init only if we don't start from memory!
|
||||||
* setup Memory and board specific bits prior to relocation.
|
* Setup memory and board specific bits prior to relocation.
|
||||||
* relocate armboot to ram
|
* Relocate armboot to ram. Setup stack.
|
||||||
* setup stack
|
|
||||||
*
|
*
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
|
@ -45,11 +45,11 @@ static int gpio_init(void)
|
|||||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(23), SUNXI_GPIO_INPUT);
|
sunxi_gpio_set_cfgpin(SUNXI_GPB(23), SUNXI_GPIO_INPUT);
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_MACH_SUN8I)
|
#if defined(CONFIG_MACH_SUN8I)
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPF(2), SUN8I_GPF_UART0_TX);
|
sunxi_gpio_set_cfgpin(SUNXI_GPF(2), SUN8I_GPF_UART0);
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPF(4), SUN8I_GPF_UART0_RX);
|
sunxi_gpio_set_cfgpin(SUNXI_GPF(4), SUN8I_GPF_UART0);
|
||||||
#else
|
#else
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPF(2), SUNXI_GPF_UART0_TX);
|
sunxi_gpio_set_cfgpin(SUNXI_GPF(2), SUNXI_GPF_UART0);
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPF(4), SUNXI_GPF_UART0_RX);
|
sunxi_gpio_set_cfgpin(SUNXI_GPF(4), SUNXI_GPF_UART0);
|
||||||
#endif
|
#endif
|
||||||
sunxi_gpio_set_pull(SUNXI_GPF(4), 1);
|
sunxi_gpio_set_pull(SUNXI_GPF(4), 1);
|
||||||
#elif CONFIG_CONS_INDEX == 1 && (defined(CONFIG_MACH_SUN4I) || defined(CONFIG_MACH_SUN7I))
|
#elif CONFIG_CONS_INDEX == 1 && (defined(CONFIG_MACH_SUN4I) || defined(CONFIG_MACH_SUN7I))
|
||||||
@ -64,6 +64,10 @@ static int gpio_init(void)
|
|||||||
sunxi_gpio_set_cfgpin(SUNXI_GPH(20), SUN6I_GPH_UART0);
|
sunxi_gpio_set_cfgpin(SUNXI_GPH(20), SUN6I_GPH_UART0);
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPH(21), SUN6I_GPH_UART0);
|
sunxi_gpio_set_cfgpin(SUNXI_GPH(21), SUN6I_GPH_UART0);
|
||||||
sunxi_gpio_set_pull(SUNXI_GPH(21), SUNXI_GPIO_PULL_UP);
|
sunxi_gpio_set_pull(SUNXI_GPH(21), SUNXI_GPIO_PULL_UP);
|
||||||
|
#elif CONFIG_CONS_INDEX == 1 && defined(CONFIG_MACH_SUN8I_A33)
|
||||||
|
sunxi_gpio_set_cfgpin(SUNXI_GPB(0), SUN8I_A33_GPB_UART0);
|
||||||
|
sunxi_gpio_set_cfgpin(SUNXI_GPB(1), SUN8I_A33_GPB_UART0);
|
||||||
|
sunxi_gpio_set_pull(SUNXI_GPB(1), SUNXI_GPIO_PULL_UP);
|
||||||
#elif CONFIG_CONS_INDEX == 1 && defined(CONFIG_MACH_SUN9I)
|
#elif CONFIG_CONS_INDEX == 1 && defined(CONFIG_MACH_SUN9I)
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPH(12), SUN9I_GPH_UART0);
|
sunxi_gpio_set_cfgpin(SUNXI_GPH(12), SUN9I_GPH_UART0);
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPH(13), SUN9I_GPH_UART0);
|
sunxi_gpio_set_cfgpin(SUNXI_GPH(13), SUN9I_GPH_UART0);
|
||||||
@ -119,20 +123,11 @@ void s_init(void)
|
|||||||
#ifdef CONFIG_SPL_BUILD
|
#ifdef CONFIG_SPL_BUILD
|
||||||
/* The sunxi internal brom will try to loader external bootloader
|
/* The sunxi internal brom will try to loader external bootloader
|
||||||
* from mmc0, nand flash, mmc2.
|
* from mmc0, nand flash, mmc2.
|
||||||
*
|
* Unfortunately we can't check how SPL was loaded so assume
|
||||||
* Unfortunately we can't check how SPL was loaded so assume it's
|
* it's always the first SD/MMC controller
|
||||||
* always the first SD/MMC controller, unless it was explicitly
|
|
||||||
* stated that SPL is on nand flash.
|
|
||||||
*/
|
*/
|
||||||
u32 spl_boot_device(void)
|
u32 spl_boot_device(void)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_SPL_NAND_SUPPORT)
|
|
||||||
/*
|
|
||||||
* This is compile time configuration informing SPL, that it
|
|
||||||
* was loaded from nand flash.
|
|
||||||
*/
|
|
||||||
return BOOT_DEVICE_NAND;
|
|
||||||
#else
|
|
||||||
/*
|
/*
|
||||||
* When booting from the SD card, the "eGON.BT0" signature is expected
|
* When booting from the SD card, the "eGON.BT0" signature is expected
|
||||||
* to be found in memory at the address 0x0004 (see the "mksunxiboot"
|
* to be found in memory at the address 0x0004 (see the "mksunxiboot"
|
||||||
@ -153,7 +148,6 @@ u32 spl_boot_device(void)
|
|||||||
return BOOT_DEVICE_MMC1;
|
return BOOT_DEVICE_MMC1;
|
||||||
else
|
else
|
||||||
return BOOT_DEVICE_BOARD;
|
return BOOT_DEVICE_BOARD;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* No confirmation data available in SPL yet. Hardcode bootmode */
|
/* No confirmation data available in SPL yet. Hardcode bootmode */
|
||||||
@ -202,6 +196,7 @@ void reset_cpu(ulong addr)
|
|||||||
writel(WDT_CFG_RESET, &wdog->cfg);
|
writel(WDT_CFG_RESET, &wdog->cfg);
|
||||||
writel(WDT_MODE_EN, &wdog->mode);
|
writel(WDT_MODE_EN, &wdog->mode);
|
||||||
writel(WDT_CTRL_KEY | WDT_CTRL_RESTART, &wdog->ctl);
|
writel(WDT_CTRL_KEY | WDT_CTRL_RESTART, &wdog->ctl);
|
||||||
|
while (1) { }
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,11 +60,12 @@ int rsb_init(void)
|
|||||||
struct sunxi_rsb_reg * const rsb =
|
struct sunxi_rsb_reg * const rsb =
|
||||||
(struct sunxi_rsb_reg *)SUNXI_RSB_BASE;
|
(struct sunxi_rsb_reg *)SUNXI_RSB_BASE;
|
||||||
|
|
||||||
rsb_cfg_io();
|
|
||||||
|
|
||||||
/* Enable RSB and PIO clk, and de-assert their resets */
|
/* Enable RSB and PIO clk, and de-assert their resets */
|
||||||
prcm_apb0_enable(PRCM_APB0_GATE_PIO | PRCM_APB0_GATE_RSB);
|
prcm_apb0_enable(PRCM_APB0_GATE_PIO | PRCM_APB0_GATE_RSB);
|
||||||
|
|
||||||
|
/* Setup external pins */
|
||||||
|
rsb_cfg_io();
|
||||||
|
|
||||||
writel(RSB_CTRL_SOFT_RST, &rsb->ctrl);
|
writel(RSB_CTRL_SOFT_RST, &rsb->ctrl);
|
||||||
rsb_set_clk();
|
rsb_set_clk();
|
||||||
|
|
||||||
|
@ -128,7 +128,8 @@ dtb-$(CONFIG_MACH_SUN8I_A23) += \
|
|||||||
dtb-$(CONFIG_MACH_SUN8I_A33) += \
|
dtb-$(CONFIG_MACH_SUN8I_A33) += \
|
||||||
sun8i-a33-et-q8-v1.6.dtb \
|
sun8i-a33-et-q8-v1.6.dtb \
|
||||||
sun8i-a33-ga10h-v1.1.dtb \
|
sun8i-a33-ga10h-v1.1.dtb \
|
||||||
sun8i-a33-ippo-q8h-v1.2-lcd1024x600.dtb
|
sun8i-a33-ippo-q8h-v1.2.dtb \
|
||||||
|
sun8i-a33-sinlinx-sina33.dtb
|
||||||
dtb-$(CONFIG_MACH_SUN9I) += \
|
dtb-$(CONFIG_MACH_SUN9I) += \
|
||||||
sun9i-a80-optimus.dtb \
|
sun9i-a80-optimus.dtb \
|
||||||
sun9i-a80-cubieboard4.dtb
|
sun9i-a80-cubieboard4.dtb
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
dspiflash: at45db021d@0 {
|
dspiflash: at45db021d@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "spi-flash";
|
compatible = "atmel,dataflash";
|
||||||
spi-max-frequency = <16000000>;
|
spi-max-frequency = <16000000>;
|
||||||
spi-cpol;
|
spi-cpol;
|
||||||
spi-cpha;
|
spi-cpha;
|
||||||
|
@ -366,6 +366,16 @@
|
|||||||
allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
|
allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
mmc2_8bit_pins: mmc2_8bit {
|
||||||
|
allwinner,pins = "PC5", "PC6", "PC8",
|
||||||
|
"PC9", "PC10", "PC11",
|
||||||
|
"PC12", "PC13", "PC14",
|
||||||
|
"PC15";
|
||||||
|
allwinner,function = "mmc2";
|
||||||
|
allwinner,drive = <SUN4I_PINCTRL_30_MA>;
|
||||||
|
allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
|
||||||
|
};
|
||||||
|
|
||||||
i2c0_pins_a: i2c0@0 {
|
i2c0_pins_a: i2c0@0 {
|
||||||
allwinner,pins = "PH2", "PH3";
|
allwinner,pins = "PH2", "PH3";
|
||||||
allwinner,function = "i2c0";
|
allwinner,function = "i2c0";
|
||||||
|
129
arch/arm/dts/sun8i-a33-sinlinx-sina33.dts
Normal file
129
arch/arm/dts/sun8i-a33-sinlinx-sina33.dts
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 Chen-Yu Tsai
|
||||||
|
*
|
||||||
|
* Chen-Yu Tsai <wens@csie.org>
|
||||||
|
*
|
||||||
|
* This file is dual-licensed: you can use it either under the terms
|
||||||
|
* of the GPL or the X11 license, at your option. Note that this dual
|
||||||
|
* licensing only applies to this file, and not this project as a
|
||||||
|
* whole.
|
||||||
|
*
|
||||||
|
* a) This file is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This file is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* Or, alternatively,
|
||||||
|
*
|
||||||
|
* b) Permission is hereby granted, free of charge, to any person
|
||||||
|
* obtaining a copy of this software and associated documentation
|
||||||
|
* files (the "Software"), to deal in the Software without
|
||||||
|
* restriction, including without limitation the rights to use,
|
||||||
|
* copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
* sell copies of the Software, and to permit persons to whom the
|
||||||
|
* Software is furnished to do so, subject to the following
|
||||||
|
* conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/dts-v1/;
|
||||||
|
#include "sun8i-a33.dtsi"
|
||||||
|
#include "sunxi-common-regulators.dtsi"
|
||||||
|
|
||||||
|
#include <dt-bindings/gpio/gpio.h>
|
||||||
|
#include <dt-bindings/input/input.h>
|
||||||
|
#include <dt-bindings/pinctrl/sun4i-a10.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "Sinlinx SinA33";
|
||||||
|
compatible = "sinlinx,sina33", "allwinner,sun8i-a33";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
serial0 = &uart0;
|
||||||
|
};
|
||||||
|
|
||||||
|
chosen {
|
||||||
|
stdout-path = "serial0:115200n8";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&lradc {
|
||||||
|
vref-supply = <®_vcc3v0>;
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
button@200 {
|
||||||
|
label = "Volume Up";
|
||||||
|
linux,code = <KEY_VOLUMEUP>;
|
||||||
|
channel = <0>;
|
||||||
|
voltage = <191011>;
|
||||||
|
};
|
||||||
|
|
||||||
|
button@400 {
|
||||||
|
label = "Volume Down";
|
||||||
|
linux,code = <KEY_VOLUMEDOWN>;
|
||||||
|
channel = <0>;
|
||||||
|
voltage = <391304>;
|
||||||
|
};
|
||||||
|
|
||||||
|
button@600 {
|
||||||
|
label = "Home";
|
||||||
|
linux,code = <KEY_HOME>;
|
||||||
|
channel = <0>;
|
||||||
|
voltage = <600000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&mmc0 {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_sina33>;
|
||||||
|
vmmc-supply = <®_vcc3v0>;
|
||||||
|
bus-width = <4>;
|
||||||
|
cd-gpios = <&pio 1 4 GPIO_ACTIVE_HIGH>; /* PB4 */
|
||||||
|
cd-inverted;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&mmc2 {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&mmc2_8bit_pins>;
|
||||||
|
vmmc-supply = <®_vcc3v0>;
|
||||||
|
bus-width = <8>;
|
||||||
|
non-removable;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&mmc2_8bit_pins {
|
||||||
|
/* eMMC is missing pull-ups */
|
||||||
|
allwinner,pull = <SUN4I_PINCTRL_PULL_UP>;
|
||||||
|
};
|
||||||
|
|
||||||
|
&pio {
|
||||||
|
mmc0_cd_pin_sina33: mmc0_cd_pin@0 {
|
||||||
|
allwinner,pins = "PB4";
|
||||||
|
allwinner,function = "gpio_in";
|
||||||
|
allwinner,drive = <SUN4I_PINCTRL_10_MA>;
|
||||||
|
allwinner,pull = <SUN4I_PINCTRL_PULL_UP>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&uart0 {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&uart0_pins_b>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
@ -86,4 +86,12 @@
|
|||||||
compatible = "allwinner,sun8i-a33-pinctrl";
|
compatible = "allwinner,sun8i-a33-pinctrl";
|
||||||
interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
|
interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
<GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
|
<GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
|
||||||
|
uart0_pins_b: uart0@1 {
|
||||||
|
allwinner,pins = "PB0", "PB1";
|
||||||
|
allwinner,function = "uart0";
|
||||||
|
allwinner,drive = <SUN4I_PINCTRL_10_MA>;
|
||||||
|
allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
|
||||||
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* Copyright (C) 2015 Socionext Inc.
|
* Copyright (C) 2015 Socionext Inc.
|
||||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Device Tree Source for UniPhier PH1-LD4 SoC
|
* Device Tree Source for UniPhier PH1-LD4 SoC
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014-2015 Panasonic Corporation
|
* Copyright (C) 2014-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||||
* Copyright (C) 2015 Socionext Inc.
|
|
||||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/include/ "skeleton.dtsi"
|
/include/ "skeleton.dtsi"
|
||||||
@ -24,11 +22,26 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
clocks {
|
||||||
|
arm_timer_clk: arm_timer_clk {
|
||||||
|
#clock-cells = <0>;
|
||||||
|
compatible = "fixed-clock";
|
||||||
|
clock-frequency = <50000000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
soc {
|
soc {
|
||||||
compatible = "simple-bus";
|
compatible = "simple-bus";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
ranges;
|
ranges;
|
||||||
|
interrupt-parent = <&intc>;
|
||||||
|
|
||||||
|
extbus: extbus {
|
||||||
|
compatible = "simple-bus";
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
uart0: serial@54006800 {
|
uart0: serial@54006800 {
|
||||||
compatible = "socionext,uniphier-uart";
|
compatible = "socionext,uniphier-uart";
|
||||||
@ -94,6 +107,12 @@
|
|||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
system-bus-controller-misc@59800000 {
|
||||||
|
compatible = "socionext,uniphier-system-bus-controller-misc",
|
||||||
|
"syscon";
|
||||||
|
reg = <0x59800000 0x2000>;
|
||||||
|
};
|
||||||
|
|
||||||
usb0: usb@5a800100 {
|
usb0: usb@5a800100 {
|
||||||
compatible = "socionext,uniphier-ehci", "generic-ehci";
|
compatible = "socionext,uniphier-ehci", "generic-ehci";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
@ -112,6 +131,28 @@
|
|||||||
reg = <0x5a820100 0x100>;
|
reg = <0x5a820100 0x100>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
timer@60000200 {
|
||||||
|
compatible = "arm,cortex-a9-global-timer";
|
||||||
|
reg = <0x60000200 0x20>;
|
||||||
|
interrupts = <1 11 0x104>;
|
||||||
|
clocks = <&arm_timer_clk>;
|
||||||
|
};
|
||||||
|
|
||||||
|
timer@60000600 {
|
||||||
|
compatible = "arm,cortex-a9-twd-timer";
|
||||||
|
reg = <0x60000600 0x20>;
|
||||||
|
interrupts = <1 13 0x104>;
|
||||||
|
clocks = <&arm_timer_clk>;
|
||||||
|
};
|
||||||
|
|
||||||
|
intc: interrupt-controller@60001000 {
|
||||||
|
compatible = "arm,cortex-a9-gic";
|
||||||
|
#interrupt-cells = <3>;
|
||||||
|
interrupt-controller;
|
||||||
|
reg = <0x60001000 0x1000>,
|
||||||
|
<0x60000100 0x100>;
|
||||||
|
};
|
||||||
|
|
||||||
nand: nand@68000000 {
|
nand: nand@68000000 {
|
||||||
compatible = "denali,denali-nand-dt";
|
compatible = "denali,denali-nand-dt";
|
||||||
reg = <0x68000000 0x20>, <0x68100000 0x1000>;
|
reg = <0x68000000 0x20>, <0x68100000 0x1000>;
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* Copyright (C) 2015 Socionext Inc.
|
* Copyright (C) 2015 Socionext Inc.
|
||||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Device Tree Source for UniPhier PH1-Pro4 SoC
|
* Device Tree Source for UniPhier PH1-Pro4 SoC
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014-2015 Panasonic Corporation
|
* Copyright (C) 2014-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||||
* Copyright (C) 2015 Socionext Inc.
|
|
||||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/include/ "skeleton.dtsi"
|
/include/ "skeleton.dtsi"
|
||||||
@ -16,6 +14,7 @@
|
|||||||
cpus {
|
cpus {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
enable-method = "socionext,uniphier-smp";
|
||||||
|
|
||||||
cpu@0 {
|
cpu@0 {
|
||||||
device_type = "cpu";
|
device_type = "cpu";
|
||||||
@ -30,11 +29,26 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
clocks {
|
||||||
|
arm_timer_clk: arm_timer_clk {
|
||||||
|
#clock-cells = <0>;
|
||||||
|
compatible = "fixed-clock";
|
||||||
|
clock-frequency = <50000000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
soc {
|
soc {
|
||||||
compatible = "simple-bus";
|
compatible = "simple-bus";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
ranges;
|
ranges;
|
||||||
|
interrupt-parent = <&intc>;
|
||||||
|
|
||||||
|
extbus: extbus {
|
||||||
|
compatible = "simple-bus";
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
uart0: serial@54006800 {
|
uart0: serial@54006800 {
|
||||||
compatible = "socionext,uniphier-uart";
|
compatible = "socionext,uniphier-uart";
|
||||||
@ -120,6 +134,12 @@
|
|||||||
status = "ok";
|
status = "ok";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
system-bus-controller-misc@59800000 {
|
||||||
|
compatible = "socionext,uniphier-system-bus-controller-misc",
|
||||||
|
"syscon";
|
||||||
|
reg = <0x59800000 0x2000>;
|
||||||
|
};
|
||||||
|
|
||||||
usb2: usb@5a800100 {
|
usb2: usb@5a800100 {
|
||||||
compatible = "socionext,uniphier-ehci", "generic-ehci";
|
compatible = "socionext,uniphier-ehci", "generic-ehci";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
@ -144,6 +164,28 @@
|
|||||||
reg = <0x65c00000 0x100>;
|
reg = <0x65c00000 0x100>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
timer@60000200 {
|
||||||
|
compatible = "arm,cortex-a9-global-timer";
|
||||||
|
reg = <0x60000200 0x20>;
|
||||||
|
interrupts = <1 11 0x304>;
|
||||||
|
clocks = <&arm_timer_clk>;
|
||||||
|
};
|
||||||
|
|
||||||
|
timer@60000600 {
|
||||||
|
compatible = "arm,cortex-a9-twd-timer";
|
||||||
|
reg = <0x60000600 0x20>;
|
||||||
|
interrupts = <1 13 0x304>;
|
||||||
|
clocks = <&arm_timer_clk>;
|
||||||
|
};
|
||||||
|
|
||||||
|
intc: interrupt-controller@60001000 {
|
||||||
|
compatible = "arm,cortex-a9-gic";
|
||||||
|
#interrupt-cells = <3>;
|
||||||
|
interrupt-controller;
|
||||||
|
reg = <0x60001000 0x1000>,
|
||||||
|
<0x60000100 0x100>;
|
||||||
|
};
|
||||||
|
|
||||||
nand: nand@68000000 {
|
nand: nand@68000000 {
|
||||||
compatible = "denali,denali-nand-dt";
|
compatible = "denali,denali-nand-dt";
|
||||||
reg = <0x68000000 0x20>, <0x68100000 0x1000>;
|
reg = <0x68000000 0x20>, <0x68100000 0x1000>;
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* Copyright (C) 2015 Socionext Inc.
|
* Copyright (C) 2015 Socionext Inc.
|
||||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Device Tree Source for UniPhier PH1-sLD3 SoC
|
* Device Tree Source for UniPhier PH1-sLD3 SoC
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014-2015 Panasonic Corporation
|
* Copyright (C) 2014-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||||
* Copyright (C) 2015 Socionext Inc.
|
|
||||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/include/ "skeleton.dtsi"
|
/include/ "skeleton.dtsi"
|
||||||
@ -16,6 +14,7 @@
|
|||||||
cpus {
|
cpus {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
enable-method = "socionext,uniphier-smp";
|
||||||
|
|
||||||
cpu@0 {
|
cpu@0 {
|
||||||
device_type = "cpu";
|
device_type = "cpu";
|
||||||
@ -30,11 +29,48 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
clocks {
|
||||||
|
arm_timer_clk: arm_timer_clk {
|
||||||
|
#clock-cells = <0>;
|
||||||
|
compatible = "fixed-clock";
|
||||||
|
clock-frequency = <50000000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
soc {
|
soc {
|
||||||
compatible = "simple-bus";
|
compatible = "simple-bus";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
ranges;
|
ranges;
|
||||||
|
interrupt-parent = <&intc>;
|
||||||
|
|
||||||
|
extbus: extbus {
|
||||||
|
compatible = "simple-bus";
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
timer@20000200 {
|
||||||
|
compatible = "arm,cortex-a9-global-timer";
|
||||||
|
reg = <0x20000200 0x20>;
|
||||||
|
interrupts = <1 11 0x304>;
|
||||||
|
clocks = <&arm_timer_clk>;
|
||||||
|
};
|
||||||
|
|
||||||
|
timer@20000600 {
|
||||||
|
compatible = "arm,cortex-a9-twd-timer";
|
||||||
|
reg = <0x20000600 0x20>;
|
||||||
|
interrupts = <1 13 0x304>;
|
||||||
|
clocks = <&arm_timer_clk>;
|
||||||
|
};
|
||||||
|
|
||||||
|
intc: interrupt-controller@20001000 {
|
||||||
|
compatible = "arm,cortex-a9-gic";
|
||||||
|
#interrupt-cells = <3>;
|
||||||
|
interrupt-controller;
|
||||||
|
reg = <0x20001000 0x1000>,
|
||||||
|
<0x20000100 0x100>;
|
||||||
|
};
|
||||||
|
|
||||||
uart0: serial@54006800 {
|
uart0: serial@54006800 {
|
||||||
compatible = "socionext,uniphier-uart";
|
compatible = "socionext,uniphier-uart";
|
||||||
@ -93,6 +129,12 @@
|
|||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
system-bus-controller-misc@59800000 {
|
||||||
|
compatible = "socionext,uniphier-system-bus-controller-misc",
|
||||||
|
"syscon";
|
||||||
|
reg = <0x59800000 0x2000>;
|
||||||
|
};
|
||||||
|
|
||||||
usb0: usb@5a800100 {
|
usb0: usb@5a800100 {
|
||||||
compatible = "socionext,uniphier-ehci", "generic-ehci";
|
compatible = "socionext,uniphier-ehci", "generic-ehci";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* Copyright (C) 2015 Socionext Inc.
|
* Copyright (C) 2015 Socionext Inc.
|
||||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Device Tree Source for UniPhier PH1-sLD8 SoC
|
* Device Tree Source for UniPhier PH1-sLD8 SoC
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014-2015 Panasonic Corporation
|
* Copyright (C) 2014-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||||
* Copyright (C) 2015 Socionext Inc.
|
|
||||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/include/ "skeleton.dtsi"
|
/include/ "skeleton.dtsi"
|
||||||
@ -24,11 +22,26 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
clocks {
|
||||||
|
arm_timer_clk: arm_timer_clk {
|
||||||
|
#clock-cells = <0>;
|
||||||
|
compatible = "fixed-clock";
|
||||||
|
clock-frequency = <50000000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
soc {
|
soc {
|
||||||
compatible = "simple-bus";
|
compatible = "simple-bus";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
ranges;
|
ranges;
|
||||||
|
interrupt-parent = <&intc>;
|
||||||
|
|
||||||
|
extbus: extbus {
|
||||||
|
compatible = "simple-bus";
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
uart0: serial@54006800 {
|
uart0: serial@54006800 {
|
||||||
compatible = "socionext,uniphier-uart";
|
compatible = "socionext,uniphier-uart";
|
||||||
@ -94,6 +107,12 @@
|
|||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
system-bus-controller-misc@59800000 {
|
||||||
|
compatible = "socionext,uniphier-system-bus-controller-misc",
|
||||||
|
"syscon";
|
||||||
|
reg = <0x59800000 0x2000>;
|
||||||
|
};
|
||||||
|
|
||||||
usb0: usb@5a800100 {
|
usb0: usb@5a800100 {
|
||||||
compatible = "socionext,uniphier-ehci", "generic-ehci";
|
compatible = "socionext,uniphier-ehci", "generic-ehci";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
@ -112,6 +131,28 @@
|
|||||||
reg = <0x5a820100 0x100>;
|
reg = <0x5a820100 0x100>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
timer@60000200 {
|
||||||
|
compatible = "arm,cortex-a9-global-timer";
|
||||||
|
reg = <0x60000200 0x20>;
|
||||||
|
interrupts = <1 11 0x104>;
|
||||||
|
clocks = <&arm_timer_clk>;
|
||||||
|
};
|
||||||
|
|
||||||
|
timer@60000600 {
|
||||||
|
compatible = "arm,cortex-a9-twd-timer";
|
||||||
|
reg = <0x60000600 0x20>;
|
||||||
|
interrupts = <1 13 0x104>;
|
||||||
|
clocks = <&arm_timer_clk>;
|
||||||
|
};
|
||||||
|
|
||||||
|
intc: interrupt-controller@60001000 {
|
||||||
|
compatible = "arm,cortex-a9-gic";
|
||||||
|
#interrupt-cells = <3>;
|
||||||
|
interrupt-controller;
|
||||||
|
reg = <0x60001000 0x1000>,
|
||||||
|
<0x60000100 0x100>;
|
||||||
|
};
|
||||||
|
|
||||||
nand: nand@68000000 {
|
nand: nand@68000000 {
|
||||||
compatible = "denali,denali-nand-dt";
|
compatible = "denali,denali-nand-dt";
|
||||||
reg = <0x68000000 0x20>, <0x68100000 0x1000>;
|
reg = <0x68000000 0x20>, <0x68100000 0x1000>;
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Device Tree Source for UniPhier Reference Daughter Board
|
* Device Tree Source for UniPhier Reference Daughter Board
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014-2015 Panasonic Corporation
|
* Copyright (C) 2014-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||||
* Copyright (C) 2015 Socionext Inc.
|
|
||||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||||
*/
|
*/
|
||||||
|
|
||||||
&i2c0 {
|
&i2c0 {
|
||||||
|
@ -109,6 +109,32 @@
|
|||||||
interrupts = <0 50 4>;
|
interrupts = <0 50 4>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
spi0: spi@e0006000 {
|
||||||
|
compatible = "xlnx,zynq-spi";
|
||||||
|
reg = <0xe0006000 0x1000>;
|
||||||
|
status = "disabled";
|
||||||
|
interrupt-parent = <&intc>;
|
||||||
|
interrupts = <0 26 4>;
|
||||||
|
clocks = <&clkc 25>, <&clkc 34>;
|
||||||
|
clock-names = "ref_clk", "pclk";
|
||||||
|
spi-max-frequency = <166666700>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
spi1: spi@e0007000 {
|
||||||
|
compatible = "xlnx,zynq-spi";
|
||||||
|
reg = <0xe0007000 0x1000>;
|
||||||
|
status = "disabled";
|
||||||
|
interrupt-parent = <&intc>;
|
||||||
|
interrupts = <0 49 4>;
|
||||||
|
clocks = <&clkc 26>, <&clkc 35>;
|
||||||
|
clock-names = "ref_clk", "pclk";
|
||||||
|
spi-max-frequency = <166666700>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
gem0: ethernet@e000b000 {
|
gem0: ethernet@e000b000 {
|
||||||
compatible = "cdns,gem";
|
compatible = "cdns,gem";
|
||||||
reg = <0xe000b000 0x4000>;
|
reg = <0xe000b000 0x4000>;
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
aliases {
|
aliases {
|
||||||
serial0 = &uart1;
|
serial0 = &uart1;
|
||||||
|
spi1 = &spi1;
|
||||||
};
|
};
|
||||||
|
|
||||||
memory {
|
memory {
|
||||||
@ -21,3 +22,7 @@
|
|||||||
reg = <0 0x40000000>;
|
reg = <0 0x40000000>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&spi1 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
@ -167,6 +167,7 @@
|
|||||||
#define EXYNOS5420_USB_HOST_EHCI_BASE 0x12110000
|
#define EXYNOS5420_USB_HOST_EHCI_BASE 0x12110000
|
||||||
#define EXYNOS5420_MMC_BASE 0x12200000
|
#define EXYNOS5420_MMC_BASE 0x12200000
|
||||||
#define EXYNOS5420_SROMC_BASE 0x12250000
|
#define EXYNOS5420_SROMC_BASE 0x12250000
|
||||||
|
#define EXYNOS5420_USB3PHY_BASE 0x12500000
|
||||||
#define EXYNOS5420_UART_BASE 0x12C00000
|
#define EXYNOS5420_UART_BASE 0x12C00000
|
||||||
#define EXYNOS5420_I2C_BASE 0x12C60000
|
#define EXYNOS5420_I2C_BASE 0x12C60000
|
||||||
#define EXYNOS5420_I2C_8910_BASE 0x12E00000
|
#define EXYNOS5420_I2C_8910_BASE 0x12E00000
|
||||||
@ -187,7 +188,6 @@
|
|||||||
#define EXYNOS5420_FIMD_BASE DEVICE_NOT_AVAILABLE
|
#define EXYNOS5420_FIMD_BASE DEVICE_NOT_AVAILABLE
|
||||||
#define EXYNOS5420_ADC_BASE DEVICE_NOT_AVAILABLE
|
#define EXYNOS5420_ADC_BASE DEVICE_NOT_AVAILABLE
|
||||||
#define EXYNOS5420_MODEM_BASE DEVICE_NOT_AVAILABLE
|
#define EXYNOS5420_MODEM_BASE DEVICE_NOT_AVAILABLE
|
||||||
#define EXYNOS5420_USB3PHY_BASE DEVICE_NOT_AVAILABLE
|
|
||||||
#define EXYNOS5420_USB_HOST_XHCI_BASE DEVICE_NOT_AVAILABLE
|
#define EXYNOS5420_USB_HOST_XHCI_BASE DEVICE_NOT_AVAILABLE
|
||||||
|
|
||||||
|
|
||||||
|
83
arch/arm/include/asm/arch-omap5/dra7xx_iodelay.h
Normal file
83
arch/arm/include/asm/arch-omap5/dra7xx_iodelay.h
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* (C) Copyright 2015
|
||||||
|
* Texas Instruments Incorporated
|
||||||
|
*
|
||||||
|
* Lokesh Vutla <lokeshvutla@ti.com>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DRA7_IODELAY_H_
|
||||||
|
#define _DRA7_IODELAY_H_
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <asm/arch/sys_proto.h>
|
||||||
|
|
||||||
|
/* CONFIG_REG_0 */
|
||||||
|
#define CFG_REG_0_OFFSET 0xC
|
||||||
|
#define CFG_REG_ROM_READ_SHIFT 1
|
||||||
|
#define CFG_REG_ROM_READ_MASK (1 << 1)
|
||||||
|
#define CFG_REG_CALIB_STRT_SHIFT 0
|
||||||
|
#define CFG_REG_CALIB_STRT_MASK (1 << 0)
|
||||||
|
#define CFG_REG_CALIB_STRT 1
|
||||||
|
#define CFG_REG_CALIB_END 0
|
||||||
|
#define CFG_REG_ROM_READ_START (1 << 1)
|
||||||
|
#define CFG_REG_ROM_READ_END (0 << 1)
|
||||||
|
|
||||||
|
/* CONFIG_REG_2 */
|
||||||
|
#define CFG_REG_2_OFFSET 0x14
|
||||||
|
#define CFG_REG_REFCLK_PERIOD_SHIFT 0
|
||||||
|
#define CFG_REG_REFCLK_PERIOD_MASK (0xFFFF << 0)
|
||||||
|
#define CFG_REG_REFCLK_PERIOD 0x2EF
|
||||||
|
|
||||||
|
/* CONFIG_REG_8 */
|
||||||
|
#define CFG_REG_8_OFFSET 0x2C
|
||||||
|
#define CFG_IODELAY_UNLOCK_KEY 0x0000AAAA
|
||||||
|
#define CFG_IODELAY_LOCK_KEY 0x0000AAAB
|
||||||
|
|
||||||
|
/* CONFIG_REG_3/4 */
|
||||||
|
#define CFG_REG_3_OFFSET 0x18
|
||||||
|
#define CFG_REG_4_OFFSET 0x1C
|
||||||
|
#define CFG_REG_DLY_CNT_SHIFT 16
|
||||||
|
#define CFG_REG_DLY_CNT_MASK (0xFFFF << 16)
|
||||||
|
#define CFG_REG_REF_CNT_SHIFT 0
|
||||||
|
#define CFG_REG_REF_CNT_MASK (0xFFFF << 0)
|
||||||
|
|
||||||
|
/* CTRL_CORE_SMA_SW_0 */
|
||||||
|
#define CTRL_ISOLATE_SHIFT 2
|
||||||
|
#define CTRL_ISOLATE_MASK (1 << 2)
|
||||||
|
#define ISOLATE_IO 1
|
||||||
|
#define DEISOLATE_IO 0
|
||||||
|
|
||||||
|
/* PRM_IO_PMCTRL */
|
||||||
|
#define PMCTRL_ISOCLK_OVERRIDE_SHIFT 0
|
||||||
|
#define PMCTRL_ISOCLK_OVERRIDE_MASK (1 << 0)
|
||||||
|
#define PMCTRL_ISOCLK_STATUS_SHIFT 1
|
||||||
|
#define PMCTRL_ISOCLK_STATUS_MASK (1 << 1)
|
||||||
|
#define PMCTRL_ISOCLK_OVERRIDE_CTRL 1
|
||||||
|
#define PMCTRL_ISOCLK_NOT_OVERRIDE_CTRL 0
|
||||||
|
|
||||||
|
#define ERR_CALIBRATE_IODELAY 0x1
|
||||||
|
#define ERR_DEISOLATE_IO 0x2
|
||||||
|
#define ERR_ISOLATE_IO 0x4
|
||||||
|
#define ERR_UPDATE_DELAY 0x8
|
||||||
|
#define ERR_CPDE 0x3
|
||||||
|
#define ERR_FPDE 0x5
|
||||||
|
|
||||||
|
/* CFG_XXX */
|
||||||
|
#define CFG_X_SIGNATURE_SHIFT 12
|
||||||
|
#define CFG_X_SIGNATURE_MASK (0x3F << 12)
|
||||||
|
#define CFG_X_LOCK_SHIFT 10
|
||||||
|
#define CFG_X_LOCK_MASK (0x1 << 10)
|
||||||
|
#define CFG_X_COARSE_DLY_SHIFT 5
|
||||||
|
#define CFG_X_COARSE_DLY_MASK (0x1F << 5)
|
||||||
|
#define CFG_X_FINE_DLY_SHIFT 0
|
||||||
|
#define CFG_X_FINE_DLY_MASK (0x1F << 0)
|
||||||
|
#define CFG_X_SIGNATURE 0x29
|
||||||
|
#define CFG_X_LOCK 1
|
||||||
|
|
||||||
|
void __recalibrate_iodelay(struct pad_conf_entry const *pad, int npads,
|
||||||
|
struct iodelay_cfg_entry const *iodelay,
|
||||||
|
int niodelays);
|
||||||
|
|
||||||
|
#endif
|
@ -26,6 +26,21 @@
|
|||||||
#define WKEN (1 << 24)
|
#define WKEN (1 << 24)
|
||||||
#define WKDIS (0 << 24)
|
#define WKDIS (0 << 24)
|
||||||
|
|
||||||
|
#define PULL_ENA (0 << 16)
|
||||||
|
#define PULL_DIS (1 << 16)
|
||||||
|
#define PULL_UP (1 << 17)
|
||||||
|
#define INPUT_EN (1 << 18)
|
||||||
|
#define SLEWCONTROL (1 << 19)
|
||||||
|
|
||||||
|
/* Active pin states */
|
||||||
|
#define PIN_OUTPUT (0 | PULL_DIS)
|
||||||
|
#define PIN_OUTPUT_PULLUP (PULL_UP)
|
||||||
|
#define PIN_OUTPUT_PULLDOWN (0)
|
||||||
|
#define PIN_INPUT (INPUT_EN | PULL_DIS)
|
||||||
|
#define PIN_INPUT_SLEW (INPUT_EN | SLEWCONTROL)
|
||||||
|
#define PIN_INPUT_PULLUP (PULL_ENA | INPUT_EN | PULL_UP)
|
||||||
|
#define PIN_INPUT_PULLDOWN (PULL_ENA | INPUT_EN)
|
||||||
|
|
||||||
#define M0 0
|
#define M0 0
|
||||||
#define M1 1
|
#define M1 1
|
||||||
#define M2 2
|
#define M2 2
|
||||||
@ -43,6 +58,28 @@
|
|||||||
#define M14 14
|
#define M14 14
|
||||||
#define M15 15
|
#define M15 15
|
||||||
|
|
||||||
|
#define MODE_SELECT (1 << 8)
|
||||||
|
#define DELAYMODE_SHIFT 4
|
||||||
|
|
||||||
|
#define MANUAL_MODE MODE_SELECT
|
||||||
|
|
||||||
|
#define VIRTUAL_MODE0 (MODE_SELECT | (0x0 << DELAYMODE_SHIFT))
|
||||||
|
#define VIRTUAL_MODE1 (MODE_SELECT | (0x1 << DELAYMODE_SHIFT))
|
||||||
|
#define VIRTUAL_MODE2 (MODE_SELECT | (0x2 << DELAYMODE_SHIFT))
|
||||||
|
#define VIRTUAL_MODE3 (MODE_SELECT | (0x3 << DELAYMODE_SHIFT))
|
||||||
|
#define VIRTUAL_MODE4 (MODE_SELECT | (0x4 << DELAYMODE_SHIFT))
|
||||||
|
#define VIRTUAL_MODE5 (MODE_SELECT | (0x5 << DELAYMODE_SHIFT))
|
||||||
|
#define VIRTUAL_MODE6 (MODE_SELECT | (0x6 << DELAYMODE_SHIFT))
|
||||||
|
#define VIRTUAL_MODE7 (MODE_SELECT | (0x7 << DELAYMODE_SHIFT))
|
||||||
|
#define VIRTUAL_MODE8 (MODE_SELECT | (0x8 << DELAYMODE_SHIFT))
|
||||||
|
#define VIRTUAL_MODE9 (MODE_SELECT | (0x9 << DELAYMODE_SHIFT))
|
||||||
|
#define VIRTUAL_MODE10 (MODE_SELECT | (0xa << DELAYMODE_SHIFT))
|
||||||
|
#define VIRTUAL_MODE11 (MODE_SELECT | (0xb << DELAYMODE_SHIFT))
|
||||||
|
#define VIRTUAL_MODE12 (MODE_SELECT | (0xc << DELAYMODE_SHIFT))
|
||||||
|
#define VIRTUAL_MODE13 (MODE_SELECT | (0xd << DELAYMODE_SHIFT))
|
||||||
|
#define VIRTUAL_MODE14 (MODE_SELECT | (0xe << DELAYMODE_SHIFT))
|
||||||
|
#define VIRTUAL_MODE15 (MODE_SELECT | (0xf << DELAYMODE_SHIFT))
|
||||||
|
|
||||||
#define SAFE_MODE M15
|
#define SAFE_MODE M15
|
||||||
|
|
||||||
#define GPMC_AD0 0x000
|
#define GPMC_AD0 0x000
|
||||||
|
@ -216,27 +216,6 @@ struct s32ktimer {
|
|||||||
#define OMAP5_ABB_LDOVBBMPU_MUX_CTRL_MASK (0x1 << 10)
|
#define OMAP5_ABB_LDOVBBMPU_MUX_CTRL_MASK (0x1 << 10)
|
||||||
#define OMAP5_ABB_LDOVBBMPU_VSET_OUT_MASK (0x1f << 0)
|
#define OMAP5_ABB_LDOVBBMPU_VSET_OUT_MASK (0x1f << 0)
|
||||||
|
|
||||||
/* IO Delay module defines */
|
|
||||||
#define CFG_IO_DELAY_BASE 0x4844A000
|
|
||||||
#define CFG_IO_DELAY_LOCK (CFG_IO_DELAY_BASE + 0x02C)
|
|
||||||
|
|
||||||
/* CPSW IO Delay registers*/
|
|
||||||
#define CFG_RGMII0_TXCTL (CFG_IO_DELAY_BASE + 0x74C)
|
|
||||||
#define CFG_RGMII0_TXD0 (CFG_IO_DELAY_BASE + 0x758)
|
|
||||||
#define CFG_RGMII0_TXD1 (CFG_IO_DELAY_BASE + 0x764)
|
|
||||||
#define CFG_RGMII0_TXD2 (CFG_IO_DELAY_BASE + 0x770)
|
|
||||||
#define CFG_RGMII0_TXD3 (CFG_IO_DELAY_BASE + 0x77C)
|
|
||||||
#define CFG_VIN2A_D13 (CFG_IO_DELAY_BASE + 0xA7C)
|
|
||||||
#define CFG_VIN2A_D17 (CFG_IO_DELAY_BASE + 0xAAC)
|
|
||||||
#define CFG_VIN2A_D16 (CFG_IO_DELAY_BASE + 0xAA0)
|
|
||||||
#define CFG_VIN2A_D15 (CFG_IO_DELAY_BASE + 0xA94)
|
|
||||||
#define CFG_VIN2A_D14 (CFG_IO_DELAY_BASE + 0xA88)
|
|
||||||
|
|
||||||
#define CFG_IO_DELAY_UNLOCK_KEY 0x0000AAAA
|
|
||||||
#define CFG_IO_DELAY_LOCK_KEY 0x0000AAAB
|
|
||||||
#define CFG_IO_DELAY_ACCESS_PATTERN 0x00029000
|
|
||||||
#define CFG_IO_DELAY_LOCK_MASK 0x400
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
struct srcomp_params {
|
struct srcomp_params {
|
||||||
s8 divide_factor;
|
s8 divide_factor;
|
||||||
@ -255,9 +234,5 @@ struct ctrl_ioregs {
|
|||||||
u32 ctrl_ddr_ctrl_ext_0;
|
u32 ctrl_ddr_ctrl_ext_0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct io_delay {
|
|
||||||
u32 addr;
|
|
||||||
u32 dly;
|
|
||||||
};
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
#endif
|
#endif
|
||||||
|
@ -18,6 +18,18 @@
|
|||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Structure for Iodelay configuration registers.
|
||||||
|
* Theoretical max for g_delay is 21560 ps.
|
||||||
|
* Theoretical max for a_delay is 1/3rd of g_delay max.
|
||||||
|
* So using u16 for both a/g_delay.
|
||||||
|
*/
|
||||||
|
struct iodelay_cfg_entry {
|
||||||
|
u16 offset;
|
||||||
|
u16 a_delay;
|
||||||
|
u16 g_delay;
|
||||||
|
};
|
||||||
|
|
||||||
struct pad_conf_entry {
|
struct pad_conf_entry {
|
||||||
u32 offset;
|
u32 offset;
|
||||||
u32 val;
|
u32 val;
|
||||||
@ -32,6 +44,7 @@ void gpmc_init(void);
|
|||||||
void watchdog_init(void);
|
void watchdog_init(void);
|
||||||
u32 get_device_type(void);
|
u32 get_device_type(void);
|
||||||
void do_set_mux(u32 base, struct pad_conf_entry const *array, int size);
|
void do_set_mux(u32 base, struct pad_conf_entry const *array, int size);
|
||||||
|
void do_set_mux32(u32 base, struct pad_conf_entry const *array, int size);
|
||||||
void set_muxconf_regs_essential(void);
|
void set_muxconf_regs_essential(void);
|
||||||
u32 wait_on_value(u32, u32, void *, u32);
|
u32 wait_on_value(u32, u32, void *, u32);
|
||||||
void sdelay(unsigned long);
|
void sdelay(unsigned long);
|
||||||
|
@ -156,8 +156,7 @@ enum sunxi_gpio_number {
|
|||||||
#define SUN4I_GPB_UART0 2
|
#define SUN4I_GPB_UART0 2
|
||||||
#define SUN5I_GPB_UART0 2
|
#define SUN5I_GPB_UART0 2
|
||||||
#define SUN8I_GPB_UART2 2
|
#define SUN8I_GPB_UART2 2
|
||||||
|
#define SUN8I_A33_GPB_UART0 3
|
||||||
#define SUNXI_GPC_NAND 2
|
|
||||||
|
|
||||||
#define SUNXI_GPC_SDC2 3
|
#define SUNXI_GPC_SDC2 3
|
||||||
#define SUN6I_GPC_SDC3 4
|
#define SUN6I_GPC_SDC3 4
|
||||||
|
@ -1,67 +0,0 @@
|
|||||||
/*
|
|
||||||
* (C) Copyright 2015 Roy Spliet <rspliet@ultimaker.com>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _SUNXI_NAND_H
|
|
||||||
#define _SUNXI_NAND_H
|
|
||||||
|
|
||||||
#include <linux/types.h>
|
|
||||||
|
|
||||||
struct sunxi_nand
|
|
||||||
{
|
|
||||||
u32 ctl; /* 0x000 Configure and control */
|
|
||||||
u32 st; /* 0x004 Status information */
|
|
||||||
u32 intr; /* 0x008 Interrupt control */
|
|
||||||
u32 timing_ctl; /* 0x00C Timing control */
|
|
||||||
u32 timing_cfg; /* 0x010 Timing configure */
|
|
||||||
u32 addr_low; /* 0x014 Low word address */
|
|
||||||
u32 addr_high; /* 0x018 High word address */
|
|
||||||
u32 block_num; /* 0x01C Data block number */
|
|
||||||
u32 data_cnt; /* 0x020 Data counter for transfer */
|
|
||||||
u32 cmd; /* 0x024 NDFC commands */
|
|
||||||
u32 rcmd_set; /* 0x028 Read command set for vendor NAND mem */
|
|
||||||
u32 wcmd_set; /* 0x02C Write command set */
|
|
||||||
u32 io_data; /* 0x030 IO data */
|
|
||||||
u32 ecc_ctl; /* 0x034 ECC configure and control */
|
|
||||||
u32 ecc_st; /* 0x038 ECC status and operation info */
|
|
||||||
u32 efr; /* 0x03C Enhanced feature */
|
|
||||||
u32 err_cnt0; /* 0x040 Corrected error bit counter 0 */
|
|
||||||
u32 err_cnt1; /* 0x044 Corrected error bit counter 1 */
|
|
||||||
u32 user_data[16]; /* 0x050[16] User data field */
|
|
||||||
u32 efnand_st; /* 0x090 EFNAND status */
|
|
||||||
u32 res0[3];
|
|
||||||
u32 spare_area; /* 0x0A0 Spare area configure */
|
|
||||||
u32 pat_id; /* 0x0A4 Pattern ID register */
|
|
||||||
u32 rdata_sta_ctl; /* 0x0A8 Read data status control */
|
|
||||||
u32 rdata_sta_0; /* 0x0AC Read data status 0 */
|
|
||||||
u32 rdata_sta_1; /* 0x0B0 Read data status 1 */
|
|
||||||
u32 res1[3];
|
|
||||||
u32 mdma_addr; /* 0x0C0 MBUS DMA Address */
|
|
||||||
u32 mdma_cnt; /* 0x0C4 MBUS DMA data counter */
|
|
||||||
};
|
|
||||||
|
|
||||||
#define SUNXI_NAND_CTL_EN (1 << 0)
|
|
||||||
#define SUNXI_NAND_CTL_RST (1 << 1)
|
|
||||||
#define SUNXI_NAND_CTL_PAGE_SIZE(a) ((fls(a) - 11) << 8)
|
|
||||||
#define SUNXI_NAND_CTL_RAM_METHOD_DMA (1 << 14)
|
|
||||||
|
|
||||||
#define SUNXI_NAND_ST_CMD_INT (1 << 1)
|
|
||||||
#define SUNXI_NAND_ST_DMA_INT (1 << 2)
|
|
||||||
#define SUNXI_NAND_ST_FIFO_FULL (1 << 3)
|
|
||||||
|
|
||||||
#define SUNXI_NAND_CMD_ADDR_CYCLES(a) ((a - 1) << 16);
|
|
||||||
#define SUNXI_NAND_CMD_SEND_CMD1 (1 << 22)
|
|
||||||
#define SUNXI_NAND_CMD_WAIT_FLAG (1 << 23)
|
|
||||||
#define SUNXI_NAND_CMD_ORDER_INTERLEAVE 0
|
|
||||||
#define SUNXI_NAND_CMD_ORDER_SEQ (1 << 25)
|
|
||||||
|
|
||||||
#define SUNXI_NAND_ECC_CTL_ECC_EN (1 << 0)
|
|
||||||
#define SUNXI_NAND_ECC_CTL_PIPELINE (1 << 3)
|
|
||||||
#define SUNXI_NAND_ECC_CTL_BS_512B (1 << 5)
|
|
||||||
#define SUNXI_NAND_ECC_CTL_RND_EN (1 << 9)
|
|
||||||
#define SUNXI_NAND_ECC_CTL_MODE(a) ((a) << 12)
|
|
||||||
#define SUNXI_NAND_ECC_CTL_RND_SEED(a) ((a) << 16)
|
|
||||||
|
|
||||||
#endif /* _SUNXI_NAND_H */
|
|
@ -44,6 +44,8 @@
|
|||||||
#define EMIF_REG_DUAL_CLK_MODE_MASK (1 << 30)
|
#define EMIF_REG_DUAL_CLK_MODE_MASK (1 << 30)
|
||||||
#define EMIF_REG_FAST_INIT_SHIFT 29
|
#define EMIF_REG_FAST_INIT_SHIFT 29
|
||||||
#define EMIF_REG_FAST_INIT_MASK (1 << 29)
|
#define EMIF_REG_FAST_INIT_MASK (1 << 29)
|
||||||
|
#define EMIF_REG_LEVLING_TO_SHIFT 4
|
||||||
|
#define EMIF_REG_LEVELING_TO_MASK (7 << 4)
|
||||||
#define EMIF_REG_PHY_DLL_READY_SHIFT 2
|
#define EMIF_REG_PHY_DLL_READY_SHIFT 2
|
||||||
#define EMIF_REG_PHY_DLL_READY_MASK (1 << 2)
|
#define EMIF_REG_PHY_DLL_READY_MASK (1 << 2)
|
||||||
|
|
||||||
@ -509,6 +511,13 @@
|
|||||||
#define EMIF_REG_RDWRLVLINC_RMP_WIN_SHIFT 0
|
#define EMIF_REG_RDWRLVLINC_RMP_WIN_SHIFT 0
|
||||||
#define EMIF_REG_RDWRLVLINC_RMP_WIN_MASK (0x1FFF << 0)
|
#define EMIF_REG_RDWRLVLINC_RMP_WIN_MASK (0x1FFF << 0)
|
||||||
|
|
||||||
|
/* EMIF_PHY_CTRL_36 */
|
||||||
|
#define EMIF_REG_PHY_FIFO_WE_IN_MISALINED_CLR (1 << 8)
|
||||||
|
|
||||||
|
#define PHY_RDDQS_RATIO_REGS 5
|
||||||
|
#define PHY_FIFO_WE_SLAVE_RATIO_REGS 5
|
||||||
|
#define PHY_REG_WR_DQ_SLAVE_RATIO_REGS 10
|
||||||
|
|
||||||
/*Leveling Fields */
|
/*Leveling Fields */
|
||||||
#define DDR3_WR_LVL_INT 0x73
|
#define DDR3_WR_LVL_INT 0x73
|
||||||
#define DDR3_RD_LVL_INT 0x33
|
#define DDR3_RD_LVL_INT 0x33
|
||||||
@ -1200,12 +1209,10 @@ static inline u32 get_emif_rev(u32 base)
|
|||||||
* which is typically the case. So it is sufficient to get
|
* which is typically the case. So it is sufficient to get
|
||||||
* SDRAM type from EMIF1.
|
* SDRAM type from EMIF1.
|
||||||
*/
|
*/
|
||||||
static inline u32 emif_sdram_type(void)
|
static inline u32 emif_sdram_type(u32 sdram_config)
|
||||||
{
|
{
|
||||||
struct emif_reg_struct *emif = (struct emif_reg_struct *)EMIF1_BASE;
|
return (sdram_config & EMIF_REG_SDRAM_TYPE_MASK)
|
||||||
|
>> EMIF_REG_SDRAM_TYPE_SHIFT;
|
||||||
return (readl(&emif->emif_sdram_config) &
|
|
||||||
EMIF_REG_SDRAM_TYPE_MASK) >> EMIF_REG_SDRAM_TYPE_SHIFT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* assert macros */
|
/* assert macros */
|
||||||
@ -1235,6 +1242,5 @@ extern u32 *const T_den;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
void config_data_eye_leveling_samples(u32 emif_base);
|
void config_data_eye_leveling_samples(u32 emif_base);
|
||||||
u32 emif_sdram_type(void);
|
|
||||||
const struct read_write_regs *get_bug_regs(u32 *iterations);
|
const struct read_write_regs *get_bug_regs(u32 *iterations);
|
||||||
#endif
|
#endif
|
||||||
|
@ -313,6 +313,7 @@ struct prcm_regs {
|
|||||||
u32 prm_rstctrl;
|
u32 prm_rstctrl;
|
||||||
u32 prm_rstst;
|
u32 prm_rstst;
|
||||||
u32 prm_rsttime;
|
u32 prm_rsttime;
|
||||||
|
u32 prm_io_pmctrl;
|
||||||
u32 prm_vc_val_bypass;
|
u32 prm_vc_val_bypass;
|
||||||
u32 prm_vc_cfg_i2c_mode;
|
u32 prm_vc_cfg_i2c_mode;
|
||||||
u32 prm_vc_cfg_i2c_clk;
|
u32 prm_vc_cfg_i2c_clk;
|
||||||
@ -344,6 +345,10 @@ struct prcm_regs {
|
|||||||
/* GMAC Clk Ctrl */
|
/* GMAC Clk Ctrl */
|
||||||
u32 cm_gmac_gmac_clkctrl;
|
u32 cm_gmac_gmac_clkctrl;
|
||||||
u32 cm_gmac_clkstctrl;
|
u32 cm_gmac_clkstctrl;
|
||||||
|
|
||||||
|
/* IPU */
|
||||||
|
u32 cm_ipu_clkstctrl;
|
||||||
|
u32 cm_ipu_i2c5_clkctrl;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct omap_sys_ctrl_regs {
|
struct omap_sys_ctrl_regs {
|
||||||
@ -455,6 +460,8 @@ struct omap_sys_ctrl_regs {
|
|||||||
u32 control_efuse_12;
|
u32 control_efuse_12;
|
||||||
u32 control_efuse_13;
|
u32 control_efuse_13;
|
||||||
u32 control_padconf_wkup_base;
|
u32 control_padconf_wkup_base;
|
||||||
|
u32 iodelay_config_base;
|
||||||
|
u32 ctrl_core_sma_sw_0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct dpll_params {
|
struct dpll_params {
|
||||||
@ -583,6 +590,7 @@ s8 abb_setup_ldovbb(u32 fuse, u32 ldovbb);
|
|||||||
|
|
||||||
void usb_fake_mac_from_die_id(u32 *id);
|
void usb_fake_mac_from_die_id(u32 *id);
|
||||||
void usb_set_serial_num_from_die_id(u32 *id);
|
void usb_set_serial_num_from_die_id(u32 *id);
|
||||||
|
void recalibrate_iodelay(void);
|
||||||
|
|
||||||
void omap_smc1(u32 service, u32 val);
|
void omap_smc1(u32 service, u32 val);
|
||||||
|
|
||||||
@ -622,12 +630,19 @@ static inline u8 is_omap54xx(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define DRA7XX 0x07000000
|
#define DRA7XX 0x07000000
|
||||||
|
#define DRA72X 0x07200000
|
||||||
|
|
||||||
static inline u8 is_dra7xx(void)
|
static inline u8 is_dra7xx(void)
|
||||||
{
|
{
|
||||||
extern u32 *const omap_si_rev;
|
extern u32 *const omap_si_rev;
|
||||||
return ((*omap_si_rev & 0xFF000000) == DRA7XX);
|
return ((*omap_si_rev & 0xFF000000) == DRA7XX);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline u8 is_dra72x(void)
|
||||||
|
{
|
||||||
|
extern u32 *const omap_si_rev;
|
||||||
|
return (*omap_si_rev & 0xFFF00000) == DRA72X;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -49,8 +49,4 @@ typedef struct bd_info {
|
|||||||
#define IH_ARCH_DEFAULT IH_ARCH_ARM64
|
#define IH_ARCH_DEFAULT IH_ARCH_ARM64
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_USE_PRIVATE_LIBGCC) && defined(CONFIG_SYS_THUMB_BUILD)
|
|
||||||
#error Thumb build does not work with private libgcc.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _U_BOOT_H_ */
|
#endif /* _U_BOOT_H_ */
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
#ifdef __ARMEB__
|
#ifdef __ARMEB__
|
||||||
#define al r1
|
#define al r1
|
||||||
#define ah r0
|
#define ah r0
|
||||||
@ -13,9 +15,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
.globl __ashldi3
|
.globl __ashldi3
|
||||||
.globl __aeabi_llsl
|
|
||||||
__ashldi3:
|
__ashldi3:
|
||||||
__aeabi_llsl:
|
ENTRY(__aeabi_llsl)
|
||||||
|
|
||||||
subs r3, r2, #32
|
subs r3, r2, #32
|
||||||
rsb ip, r2, #32
|
rsb ip, r2, #32
|
||||||
@ -24,3 +25,4 @@ __aeabi_llsl:
|
|||||||
orrmi ah, ah, al, lsr ip
|
orrmi ah, ah, al, lsr ip
|
||||||
mov al, al, lsl r2
|
mov al, al, lsl r2
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
ENDPROC(__aeabi_llsl)
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
#ifdef __ARMEB__
|
#ifdef __ARMEB__
|
||||||
#define al r1
|
#define al r1
|
||||||
#define ah r0
|
#define ah r0
|
||||||
@ -13,9 +15,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
.globl __ashrdi3
|
.globl __ashrdi3
|
||||||
.globl __aeabi_lasr
|
|
||||||
__ashrdi3:
|
__ashrdi3:
|
||||||
__aeabi_lasr:
|
ENTRY(__aeabi_lasr)
|
||||||
|
|
||||||
subs r3, r2, #32
|
subs r3, r2, #32
|
||||||
rsb ip, r2, #32
|
rsb ip, r2, #32
|
||||||
@ -24,3 +25,4 @@ __aeabi_lasr:
|
|||||||
orrmi al, al, ah, lsl ip
|
orrmi al, al, ah, lsl ip
|
||||||
mov ah, ah, asr r2
|
mov ah, ah, asr r2
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
ENDPROC(__aeabi_lasr)
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
.macro ARM_DIV_BODY dividend, divisor, result, curbit
|
.macro ARM_DIV_BODY dividend, divisor, result, curbit
|
||||||
|
|
||||||
#if __LINUX_ARM_ARCH__ >= 5
|
#if __LINUX_ARM_ARCH__ >= 5
|
||||||
@ -95,9 +97,8 @@
|
|||||||
|
|
||||||
.align 5
|
.align 5
|
||||||
.globl __divsi3
|
.globl __divsi3
|
||||||
.globl __aeabi_idiv
|
|
||||||
__divsi3:
|
__divsi3:
|
||||||
__aeabi_idiv:
|
ENTRY(__aeabi_idiv)
|
||||||
cmp r1, #0
|
cmp r1, #0
|
||||||
eor ip, r0, r1 @ save the sign of the result.
|
eor ip, r0, r1 @ save the sign of the result.
|
||||||
beq Ldiv0
|
beq Ldiv0
|
||||||
@ -139,3 +140,4 @@ Ldiv0:
|
|||||||
bl __div0
|
bl __div0
|
||||||
mov r0, #0 @ About as wrong as it could be.
|
mov r0, #0 @ About as wrong as it could be.
|
||||||
ldr pc, [sp], #4
|
ldr pc, [sp], #4
|
||||||
|
ENDPROC(__aeabi_idiv)
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
#ifdef __ARMEB__
|
#ifdef __ARMEB__
|
||||||
#define al r1
|
#define al r1
|
||||||
#define ah r0
|
#define ah r0
|
||||||
@ -13,9 +15,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
.globl __lshrdi3
|
.globl __lshrdi3
|
||||||
.globl __aeabi_llsr
|
|
||||||
__lshrdi3:
|
__lshrdi3:
|
||||||
__aeabi_llsr:
|
ENTRY(__aeabi_llsr)
|
||||||
|
|
||||||
subs r3, r2, #32
|
subs r3, r2, #32
|
||||||
rsb ip, r2, #32
|
rsb ip, r2, #32
|
||||||
@ -24,3 +25,4 @@ __aeabi_llsr:
|
|||||||
orrmi al, al, ah, lsl ip
|
orrmi al, al, ah, lsl ip
|
||||||
mov ah, ah, lsr r2
|
mov ah, ah, lsr r2
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
ENDPROC(__aeabi_llsr)
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
.macro ARM_MOD_BODY dividend, divisor, order, spare
|
.macro ARM_MOD_BODY dividend, divisor, order, spare
|
||||||
|
|
||||||
#if __LINUX_ARM_ARCH__ >= 5
|
#if __LINUX_ARM_ARCH__ >= 5
|
||||||
@ -69,8 +71,7 @@
|
|||||||
.endm
|
.endm
|
||||||
|
|
||||||
.align 5
|
.align 5
|
||||||
.globl __modsi3
|
ENTRY(__modsi3)
|
||||||
__modsi3:
|
|
||||||
cmp r1, #0
|
cmp r1, #0
|
||||||
beq Ldiv0
|
beq Ldiv0
|
||||||
rsbmi r1, r1, #0 @ loops below use unsigned.
|
rsbmi r1, r1, #0 @ loops below use unsigned.
|
||||||
@ -88,7 +89,7 @@ __modsi3:
|
|||||||
10: cmp ip, #0
|
10: cmp ip, #0
|
||||||
rsbmi r0, r0, #0
|
rsbmi r0, r0, #0
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
ENDPROC(__modsi3)
|
||||||
|
|
||||||
Ldiv0:
|
Ldiv0:
|
||||||
|
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
/* # 1 "libgcc1.S" */
|
/* # 1 "libgcc1.S" */
|
||||||
@ libgcc1 routines for ARM cpu.
|
@ libgcc1 routines for ARM cpu.
|
||||||
@ Division routines, written by Richard Earnshaw, (rearnsha@armltd.co.uk)
|
@ Division routines, written by Richard Earnshaw, (rearnsha@armltd.co.uk)
|
||||||
@ -72,8 +74,7 @@ Ldiv0:
|
|||||||
ldmia sp!, {pc}
|
ldmia sp!, {pc}
|
||||||
.size __udivsi3 , . - __udivsi3
|
.size __udivsi3 , . - __udivsi3
|
||||||
|
|
||||||
.globl __aeabi_uidivmod
|
ENTRY(__aeabi_uidivmod)
|
||||||
__aeabi_uidivmod:
|
|
||||||
|
|
||||||
stmfd sp!, {r0, r1, ip, lr}
|
stmfd sp!, {r0, r1, ip, lr}
|
||||||
bl __aeabi_uidiv
|
bl __aeabi_uidiv
|
||||||
@ -81,9 +82,9 @@ __aeabi_uidivmod:
|
|||||||
mul r3, r0, r2
|
mul r3, r0, r2
|
||||||
sub r1, r1, r3
|
sub r1, r1, r3
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
ENDPROC(__aeabi_uidivmod)
|
||||||
|
|
||||||
.globl __aeabi_idivmod
|
ENTRY(__aeabi_idivmod)
|
||||||
__aeabi_idivmod:
|
|
||||||
|
|
||||||
stmfd sp!, {r0, r1, ip, lr}
|
stmfd sp!, {r0, r1, ip, lr}
|
||||||
bl __aeabi_idiv
|
bl __aeabi_idiv
|
||||||
@ -91,3 +92,4 @@ __aeabi_idivmod:
|
|||||||
mul r3, r0, r2
|
mul r3, r0, r2
|
||||||
sub r1, r1, r3
|
sub r1, r1, r3
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
ENDPROC(__aeabi_idivmod)
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
/* # 1 "libgcc1.S" */
|
/* # 1 "libgcc1.S" */
|
||||||
@ libgcc1 routines for ARM cpu.
|
@ libgcc1 routines for ARM cpu.
|
||||||
@ Division routines, written by Richard Earnshaw, (rearnsha@armltd.co.uk)
|
@ Division routines, written by Richard Earnshaw, (rearnsha@armltd.co.uk)
|
||||||
@ -11,10 +13,9 @@ curbit .req r3
|
|||||||
/* lr .req r14 */
|
/* lr .req r14 */
|
||||||
/* pc .req r15 */
|
/* pc .req r15 */
|
||||||
.text
|
.text
|
||||||
.globl __umodsi3
|
|
||||||
.type __umodsi3 ,function
|
.type __umodsi3 ,function
|
||||||
.align 0
|
.align 0
|
||||||
__umodsi3 :
|
ENTRY(__umodsi3)
|
||||||
cmp divisor, #0
|
cmp divisor, #0
|
||||||
beq Ldiv0
|
beq Ldiv0
|
||||||
mov curbit, #1
|
mov curbit, #1
|
||||||
@ -86,3 +87,4 @@ Ldiv0:
|
|||||||
/* # 456 "libgcc1.S" */
|
/* # 456 "libgcc1.S" */
|
||||||
/* # 500 "libgcc1.S" */
|
/* # 500 "libgcc1.S" */
|
||||||
/* # 580 "libgcc1.S" */
|
/* # 580 "libgcc1.S" */
|
||||||
|
ENDPROC(__umodsi3)
|
||||||
|
@ -15,9 +15,6 @@ config TARGET_RPI_2
|
|||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
config PHYS_TO_BUS
|
|
||||||
default y
|
|
||||||
|
|
||||||
config SYS_BOARD
|
config SYS_BOARD
|
||||||
default "rpi" if TARGET_RPI
|
default "rpi" if TARGET_RPI
|
||||||
default "rpi_2" if TARGET_RPI_2
|
default "rpi_2" if TARGET_RPI_2
|
||||||
|
@ -246,18 +246,18 @@ static inline u32 read_efuse_bootrom(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
inline int get_max_dev_speed(void)
|
|
||||||
{
|
|
||||||
return get_max_speed(read_efuse_bootrom() & 0xffff, dev_speeds);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef CONFIG_SOC_K2E
|
#ifndef CONFIG_SOC_K2E
|
||||||
inline int get_max_arm_speed(void)
|
inline int get_max_arm_speed(void)
|
||||||
{
|
{
|
||||||
return get_max_speed((read_efuse_bootrom() >> 16) & 0xffff, arm_speeds);
|
return get_max_speed(read_efuse_bootrom() & 0xffff, arm_speeds);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
inline int get_max_dev_speed(void)
|
||||||
|
{
|
||||||
|
return get_max_speed((read_efuse_bootrom() >> 16) & 0xffff, dev_speeds);
|
||||||
|
}
|
||||||
|
|
||||||
void pass_pll_pa_clk_enable(void)
|
void pass_pll_pa_clk_enable(void)
|
||||||
{
|
{
|
||||||
u32 reg;
|
u32 reg;
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <netdev.h>
|
#include <netdev.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
#include <asm/pl310.h>
|
||||||
#include <asm/arch/cpu.h>
|
#include <asm/arch/cpu.h>
|
||||||
#include <asm/arch/soc.h>
|
#include <asm/arch/soc.h>
|
||||||
|
|
||||||
@ -160,10 +161,17 @@ static void update_sdram_window_sizes(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_CPU_INIT
|
#ifdef CONFIG_ARCH_CPU_INIT
|
||||||
|
static void set_cbar(u32 addr)
|
||||||
|
{
|
||||||
|
asm("mcr p15, 4, %0, c15, c0" : : "r" (addr));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int arch_cpu_init(void)
|
int arch_cpu_init(void)
|
||||||
{
|
{
|
||||||
/* Linux expects the internal registers to be at 0xf1000000 */
|
/* Linux expects the internal registers to be at 0xf1000000 */
|
||||||
writel(SOC_REGS_PHY_BASE, INTREG_BASE_ADDR_REG);
|
writel(SOC_REGS_PHY_BASE, INTREG_BASE_ADDR_REG);
|
||||||
|
set_cbar(SOC_REGS_PHY_BASE + 0xC000);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We need to call mvebu_mbus_probe() before calling
|
* We need to call mvebu_mbus_probe() before calling
|
||||||
@ -240,6 +248,13 @@ int cpu_eth_init(bd_t *bis)
|
|||||||
#ifndef CONFIG_SYS_DCACHE_OFF
|
#ifndef CONFIG_SYS_DCACHE_OFF
|
||||||
void enable_caches(void)
|
void enable_caches(void)
|
||||||
{
|
{
|
||||||
|
struct pl310_regs *const pl310 =
|
||||||
|
(struct pl310_regs *)CONFIG_SYS_PL310_BASE;
|
||||||
|
|
||||||
|
/* First disable L2 cache - may still be enable from BootROM */
|
||||||
|
if (mvebu_soc_family() == MVEBU_SOC_A38X)
|
||||||
|
clrbits_le32(&pl310->pl310_ctrl, L2X0_CTRL_EN);
|
||||||
|
|
||||||
/* Avoid problem with e.g. neta ethernet driver */
|
/* Avoid problem with e.g. neta ethernet driver */
|
||||||
invalidate_dcache_all();
|
invalidate_dcache_all();
|
||||||
|
|
||||||
|
@ -21,18 +21,6 @@ endchoice
|
|||||||
config SYS_MALLOC_F_LEN
|
config SYS_MALLOC_F_LEN
|
||||||
default 0x1800
|
default 0x1800
|
||||||
|
|
||||||
config USE_PRIVATE_LIBGCC
|
|
||||||
default y
|
|
||||||
|
|
||||||
config DM_USB
|
|
||||||
default y
|
|
||||||
|
|
||||||
config SPL_DM
|
|
||||||
default y
|
|
||||||
|
|
||||||
config SPL_DISABLE_OF_CONTROL
|
|
||||||
default y
|
|
||||||
|
|
||||||
source "arch/arm/mach-tegra/tegra20/Kconfig"
|
source "arch/arm/mach-tegra/tegra20/Kconfig"
|
||||||
source "arch/arm/mach-tegra/tegra30/Kconfig"
|
source "arch/arm/mach-tegra/tegra30/Kconfig"
|
||||||
source "arch/arm/mach-tegra/tegra114/Kconfig"
|
source "arch/arm/mach-tegra/tegra114/Kconfig"
|
||||||
|
@ -34,6 +34,15 @@ int print_cpuinfo(void)
|
|||||||
case 0x29:
|
case 0x29:
|
||||||
puts("PH1-sLD8 (MN2WS0270)");
|
puts("PH1-sLD8 (MN2WS0270)");
|
||||||
break;
|
break;
|
||||||
|
case 0x2A:
|
||||||
|
puts("PH1-Pro5 (MN2WS0300)");
|
||||||
|
break;
|
||||||
|
case 0x2E:
|
||||||
|
puts("ProXstream2 (MN2WS0310)");
|
||||||
|
break;
|
||||||
|
case 0x2F:
|
||||||
|
puts("PH1-LD6b (MN2WS0320)");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
printf("Unknown Processor ID (0x%x)\n", revision);
|
printf("Unknown Processor ID (0x%x)\n", revision);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -8,9 +8,6 @@ config SYS_CPU
|
|||||||
default "mips32" if CPU_MIPS32_R1 || CPU_MIPS32_R2
|
default "mips32" if CPU_MIPS32_R1 || CPU_MIPS32_R2
|
||||||
default "mips64" if CPU_MIPS64_R1 || CPU_MIPS64_R2
|
default "mips64" if CPU_MIPS64_R1 || CPU_MIPS64_R2
|
||||||
|
|
||||||
config USE_PRIVATE_LIBGCC
|
|
||||||
default y
|
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "Target select"
|
prompt "Target select"
|
||||||
optional
|
optional
|
||||||
|
@ -125,9 +125,6 @@ config SYS_CPU
|
|||||||
default "sh3" if CPU_SH3
|
default "sh3" if CPU_SH3
|
||||||
default "sh4" if CPU_SH4
|
default "sh4" if CPU_SH4
|
||||||
|
|
||||||
config USE_PRIVATE_LIBGCC
|
|
||||||
default y
|
|
||||||
|
|
||||||
source "board/alphaproject/ap_sh4a_4a/Kconfig"
|
source "board/alphaproject/ap_sh4a_4a/Kconfig"
|
||||||
source "board/espt/Kconfig"
|
source "board/espt/Kconfig"
|
||||||
source "board/mpr2/Kconfig"
|
source "board/mpr2/Kconfig"
|
||||||
|
@ -4,12 +4,6 @@ menu "x86 architecture"
|
|||||||
config SYS_ARCH
|
config SYS_ARCH
|
||||||
default "x86"
|
default "x86"
|
||||||
|
|
||||||
config USE_PRIVATE_LIBGCC
|
|
||||||
default y
|
|
||||||
|
|
||||||
config SYS_VSNPRINTF
|
|
||||||
default y
|
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "Mainboard vendor"
|
prompt "Mainboard vendor"
|
||||||
default VENDOR_EMULATION
|
default VENDOR_EMULATION
|
||||||
@ -335,13 +329,4 @@ config PCIE_ECAM_BASE
|
|||||||
assigned to PCI devices - i.e. the memory and prefetch regions, as
|
assigned to PCI devices - i.e. the memory and prefetch regions, as
|
||||||
passed to pci_set_region().
|
passed to pci_set_region().
|
||||||
|
|
||||||
config BOOTSTAGE
|
|
||||||
default y
|
|
||||||
|
|
||||||
config BOOTSTAGE_REPORT
|
|
||||||
default y
|
|
||||||
|
|
||||||
config CMD_BOOTSTAGE
|
|
||||||
default y
|
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
@ -12,14 +12,6 @@ config SYS_CONFIG_NAME
|
|||||||
string
|
string
|
||||||
default "UCP1020"
|
default "UCP1020"
|
||||||
|
|
||||||
config SPI_FLASH
|
|
||||||
bool
|
|
||||||
default y
|
|
||||||
|
|
||||||
config SPI_PCI
|
|
||||||
bool
|
|
||||||
default y
|
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "Target image select"
|
prompt "Target image select"
|
||||||
|
|
||||||
|
@ -64,14 +64,21 @@ void lcdbacklight(int on)
|
|||||||
unsigned int pwmfrq = getenv_ulong("ds1_pwmfreq", 10, ~0UL);
|
unsigned int pwmfrq = getenv_ulong("ds1_pwmfreq", 10, ~0UL);
|
||||||
#endif
|
#endif
|
||||||
unsigned int tmp;
|
unsigned int tmp;
|
||||||
|
struct gptimer *timerhw;
|
||||||
struct gptimer *const timerhw = (struct gptimer *)DM_TIMER6_BASE;
|
|
||||||
|
|
||||||
if (on)
|
if (on)
|
||||||
bright = bright != ~0UL ? bright : 50;
|
bright = bright != ~0UL ? bright : 50;
|
||||||
else
|
else
|
||||||
bright = 0;
|
bright = 0;
|
||||||
|
|
||||||
|
switch (driver) {
|
||||||
|
case 2:
|
||||||
|
timerhw = (struct gptimer *)DM_TIMER5_BASE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
timerhw = (struct gptimer *)DM_TIMER6_BASE;
|
||||||
|
}
|
||||||
|
|
||||||
switch (driver) {
|
switch (driver) {
|
||||||
case 0: /* PMIC LED-Driver */
|
case 0: /* PMIC LED-Driver */
|
||||||
/* brightness level */
|
/* brightness level */
|
||||||
@ -83,7 +90,8 @@ void lcdbacklight(int on)
|
|||||||
bright != 0 ? 0x0A : 0x02,
|
bright != 0 ? 0x0A : 0x02,
|
||||||
0xFF);
|
0xFF);
|
||||||
break;
|
break;
|
||||||
case 1: /* PWM using timer6 */
|
case 1:
|
||||||
|
case 2: /* PWM using timer */
|
||||||
if (pwmfrq != ~0UL) {
|
if (pwmfrq != ~0UL) {
|
||||||
timerhw->tiocp_cfg = TCFG_RESET;
|
timerhw->tiocp_cfg = TCFG_RESET;
|
||||||
udelay(10);
|
udelay(10);
|
||||||
|
@ -5,4 +5,4 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0+
|
# SPDX-License-Identifier: GPL-2.0+
|
||||||
#
|
#
|
||||||
|
|
||||||
obj-y := highbank.o
|
obj-y := highbank.o ahci.o
|
||||||
|
218
board/highbank/ahci.c
Normal file
218
board/highbank/ahci.c
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012 Calxeda, Inc.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the Free
|
||||||
|
* Software Foundation; either version 2 of the License, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with
|
||||||
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <ahci.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
|
||||||
|
#define CPHY_MAP(dev, addr) ((((dev) & 0x1f) << 7) | (((addr) >> 9) & 0x7f))
|
||||||
|
#define CPHY_ADDR(base, dev, addr) ((base) | (((addr) & 0x1ff) << 2))
|
||||||
|
#define CPHY_BASE 0xfff58000
|
||||||
|
#define CPHY_WIDTH 0x1000
|
||||||
|
#define CPHY_DTE_XS 5
|
||||||
|
#define CPHY_MII 31
|
||||||
|
#define SERDES_CR_CTL 0x80a0
|
||||||
|
#define SERDES_CR_ADDR 0x80a1
|
||||||
|
#define SERDES_CR_DATA 0x80a2
|
||||||
|
#define CR_BUSY 0x0001
|
||||||
|
#define CR_START 0x0001
|
||||||
|
#define CR_WR_RDN 0x0002
|
||||||
|
#define CPHY_TX_INPUT_STS 0x2001
|
||||||
|
#define CPHY_RX_INPUT_STS 0x2002
|
||||||
|
#define CPHY_SATA_TX_OVERRIDE_BIT 0x8000
|
||||||
|
#define CPHY_SATA_RX_OVERRIDE_BIT 0x4000
|
||||||
|
#define CPHY_TX_INPUT_OVERRIDE 0x2004
|
||||||
|
#define CPHY_RX_INPUT_OVERRIDE 0x2005
|
||||||
|
#define SPHY_LANE 0x100
|
||||||
|
#define SPHY_HALF_RATE 0x0001
|
||||||
|
#define CPHY_SATA_DPLL_MODE 0x0700
|
||||||
|
#define CPHY_SATA_DPLL_SHIFT 8
|
||||||
|
#define CPHY_SATA_TX_ATTEN 0x1c00
|
||||||
|
#define CPHY_SATA_TX_ATTEN_SHIFT 10
|
||||||
|
|
||||||
|
#define HB_SREG_SATA_ATTEN 0xfff3cf24
|
||||||
|
|
||||||
|
#define SATA_PORT_BASE 0xffe08000
|
||||||
|
#define SATA_VERSIONR 0xf8
|
||||||
|
#define SATA_HB_VERSION 0x3332302a
|
||||||
|
|
||||||
|
static u32 __combo_phy_reg_read(u8 phy, u8 dev, u32 addr)
|
||||||
|
{
|
||||||
|
u32 data;
|
||||||
|
writel(CPHY_MAP(dev, addr), CPHY_BASE + 0x800 + CPHY_WIDTH * phy);
|
||||||
|
data = readl(CPHY_ADDR(CPHY_BASE + CPHY_WIDTH * phy, dev, addr));
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __combo_phy_reg_write(u8 phy, u8 dev, u32 addr, u32 data)
|
||||||
|
{
|
||||||
|
writel(CPHY_MAP(dev, addr), CPHY_BASE + 0x800 + CPHY_WIDTH * phy);
|
||||||
|
writel(data, CPHY_ADDR(CPHY_BASE + CPHY_WIDTH * phy, dev, addr));
|
||||||
|
}
|
||||||
|
|
||||||
|
static u32 combo_phy_read(u8 phy, u32 addr)
|
||||||
|
{
|
||||||
|
u8 dev = CPHY_DTE_XS;
|
||||||
|
if (phy == 5)
|
||||||
|
dev = CPHY_MII;
|
||||||
|
while (__combo_phy_reg_read(phy, dev, SERDES_CR_CTL) & CR_BUSY)
|
||||||
|
udelay(5);
|
||||||
|
__combo_phy_reg_write(phy, dev, SERDES_CR_ADDR, addr);
|
||||||
|
__combo_phy_reg_write(phy, dev, SERDES_CR_CTL, CR_START);
|
||||||
|
while (__combo_phy_reg_read(phy, dev, SERDES_CR_CTL) & CR_BUSY)
|
||||||
|
udelay(5);
|
||||||
|
return __combo_phy_reg_read(phy, dev, SERDES_CR_DATA);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void combo_phy_write(u8 phy, u32 addr, u32 data)
|
||||||
|
{
|
||||||
|
u8 dev = CPHY_DTE_XS;
|
||||||
|
if (phy == 5)
|
||||||
|
dev = CPHY_MII;
|
||||||
|
while (__combo_phy_reg_read(phy, dev, SERDES_CR_CTL) & CR_BUSY)
|
||||||
|
udelay(5);
|
||||||
|
__combo_phy_reg_write(phy, dev, SERDES_CR_ADDR, addr);
|
||||||
|
__combo_phy_reg_write(phy, dev, SERDES_CR_DATA, data);
|
||||||
|
__combo_phy_reg_write(phy, dev, SERDES_CR_CTL, CR_WR_RDN | CR_START);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cphy_spread_spectrum_override(u8 phy, u8 lane, u32 val)
|
||||||
|
{
|
||||||
|
u32 tmp;
|
||||||
|
tmp = combo_phy_read(phy, CPHY_RX_INPUT_STS + lane * SPHY_LANE);
|
||||||
|
tmp &= ~CPHY_SATA_RX_OVERRIDE_BIT;
|
||||||
|
combo_phy_write(phy, CPHY_RX_INPUT_OVERRIDE + lane * SPHY_LANE, tmp);
|
||||||
|
|
||||||
|
tmp |= CPHY_SATA_RX_OVERRIDE_BIT;
|
||||||
|
combo_phy_write(phy, CPHY_RX_INPUT_OVERRIDE + lane * SPHY_LANE, tmp);
|
||||||
|
|
||||||
|
tmp &= ~CPHY_SATA_DPLL_MODE;
|
||||||
|
tmp |= (val << CPHY_SATA_DPLL_SHIFT) & CPHY_SATA_DPLL_MODE;
|
||||||
|
combo_phy_write(phy, CPHY_RX_INPUT_OVERRIDE + lane * SPHY_LANE, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cphy_tx_attenuation_override(u8 phy, u8 lane)
|
||||||
|
{
|
||||||
|
u32 val;
|
||||||
|
u32 tmp;
|
||||||
|
u8 shift;
|
||||||
|
|
||||||
|
shift = ((phy == 5) ? 4 : lane) * 4;
|
||||||
|
|
||||||
|
val = (readl(HB_SREG_SATA_ATTEN) >> shift) & 0xf;
|
||||||
|
|
||||||
|
if (val & 0x8)
|
||||||
|
return;
|
||||||
|
|
||||||
|
tmp = combo_phy_read(phy, CPHY_TX_INPUT_STS + lane * SPHY_LANE);
|
||||||
|
tmp &= ~CPHY_SATA_TX_OVERRIDE_BIT;
|
||||||
|
combo_phy_write(phy, CPHY_TX_INPUT_OVERRIDE + lane * SPHY_LANE, tmp);
|
||||||
|
|
||||||
|
tmp |= CPHY_SATA_TX_OVERRIDE_BIT;
|
||||||
|
combo_phy_write(phy, CPHY_TX_INPUT_OVERRIDE + lane * SPHY_LANE, tmp);
|
||||||
|
|
||||||
|
tmp |= (val << CPHY_SATA_TX_ATTEN_SHIFT) & CPHY_SATA_TX_ATTEN;
|
||||||
|
combo_phy_write(phy, CPHY_TX_INPUT_OVERRIDE + lane * SPHY_LANE, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cphy_disable_port_overrides(u8 port)
|
||||||
|
{
|
||||||
|
u32 tmp;
|
||||||
|
u8 lane = 0, phy = 0;
|
||||||
|
|
||||||
|
if (port == 0)
|
||||||
|
phy = 5;
|
||||||
|
else if (port < 5)
|
||||||
|
lane = port - 1;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
tmp = combo_phy_read(phy, CPHY_RX_INPUT_STS + lane * SPHY_LANE);
|
||||||
|
tmp &= ~CPHY_SATA_RX_OVERRIDE_BIT;
|
||||||
|
combo_phy_write(phy, CPHY_RX_INPUT_OVERRIDE + lane * SPHY_LANE, tmp);
|
||||||
|
|
||||||
|
tmp = combo_phy_read(phy, CPHY_TX_INPUT_OVERRIDE + lane * SPHY_LANE);
|
||||||
|
tmp &= ~CPHY_SATA_TX_OVERRIDE_BIT;
|
||||||
|
combo_phy_write(phy, CPHY_TX_INPUT_OVERRIDE + lane * SPHY_LANE, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cphy_disable_overrides(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
u32 port_map;
|
||||||
|
|
||||||
|
port_map = readl(0xffe08000 + HOST_PORTS_IMPL);
|
||||||
|
for (i = 0; i < 5; i++) {
|
||||||
|
if (port_map & (1 << i))
|
||||||
|
cphy_disable_port_overrides(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cphy_override_lane(u8 port)
|
||||||
|
{
|
||||||
|
u32 tmp, k = 0;
|
||||||
|
u8 lane = 0, phy = 0;
|
||||||
|
|
||||||
|
if (port == 0)
|
||||||
|
phy = 5;
|
||||||
|
else if (port < 5)
|
||||||
|
lane = port - 1;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
do {
|
||||||
|
tmp = combo_phy_read(0, CPHY_RX_INPUT_STS +
|
||||||
|
lane * SPHY_LANE);
|
||||||
|
} while ((tmp & SPHY_HALF_RATE) && (k++ < 1000));
|
||||||
|
cphy_spread_spectrum_override(phy, lane, 3);
|
||||||
|
cphy_tx_attenuation_override(phy, lane);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define WAIT_MS_LINKUP 4
|
||||||
|
|
||||||
|
int ahci_link_up(struct ahci_probe_ent *probe_ent, int port)
|
||||||
|
{
|
||||||
|
u32 tmp;
|
||||||
|
int j = 0;
|
||||||
|
u8 *port_mmio = (u8 *)probe_ent->port[port].port_mmio;
|
||||||
|
u32 is_highbank = readl(SATA_PORT_BASE + SATA_VERSIONR) ==
|
||||||
|
SATA_HB_VERSION ? 1 : 0;
|
||||||
|
|
||||||
|
/* Bring up SATA link.
|
||||||
|
* SATA link bringup time is usually less than 1 ms; only very
|
||||||
|
* rarely has it taken between 1-2 ms. Never seen it above 2 ms.
|
||||||
|
*/
|
||||||
|
while (j < WAIT_MS_LINKUP) {
|
||||||
|
if (is_highbank && (j == 0)) {
|
||||||
|
cphy_disable_port_overrides(port);
|
||||||
|
writel(0x301, port_mmio + PORT_SCR_CTL);
|
||||||
|
udelay(1000);
|
||||||
|
writel(0x300, port_mmio + PORT_SCR_CTL);
|
||||||
|
udelay(1000);
|
||||||
|
cphy_override_lane(port);
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = readl(port_mmio + PORT_SCR_STAT);
|
||||||
|
if ((tmp & 0xf) == 0x3)
|
||||||
|
return 0;
|
||||||
|
udelay(1000);
|
||||||
|
j++;
|
||||||
|
|
||||||
|
if ((j == WAIT_MS_LINKUP) && (tmp & 0xf))
|
||||||
|
j = 0; /* retry phy reset */
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
@ -14,9 +14,11 @@
|
|||||||
|
|
||||||
#define HB_AHCI_BASE 0xffe08000
|
#define HB_AHCI_BASE 0xffe08000
|
||||||
|
|
||||||
|
#define HB_SCU_A9_PWR_STATUS 0xfff10008
|
||||||
#define HB_SREG_A9_PWR_REQ 0xfff3cf00
|
#define HB_SREG_A9_PWR_REQ 0xfff3cf00
|
||||||
#define HB_SREG_A9_BOOT_SRC_STAT 0xfff3cf04
|
#define HB_SREG_A9_BOOT_SRC_STAT 0xfff3cf04
|
||||||
#define HB_SREG_A9_PWRDOM_STAT 0xfff3cf20
|
#define HB_SREG_A9_PWRDOM_STAT 0xfff3cf20
|
||||||
|
#define HB_SREG_A15_PWR_CTRL 0xfff3c200
|
||||||
|
|
||||||
#define HB_PWR_SUSPEND 0
|
#define HB_PWR_SUSPEND 0
|
||||||
#define HB_PWR_SOFT_RESET 1
|
#define HB_PWR_SOFT_RESET 1
|
||||||
@ -27,8 +29,14 @@
|
|||||||
#define PWRDOM_STAT_PCI 0x40000000
|
#define PWRDOM_STAT_PCI 0x40000000
|
||||||
#define PWRDOM_STAT_EMMC 0x20000000
|
#define PWRDOM_STAT_EMMC 0x20000000
|
||||||
|
|
||||||
|
#define HB_SCU_A9_PWR_NORMAL 0
|
||||||
|
#define HB_SCU_A9_PWR_DORMANT 2
|
||||||
|
#define HB_SCU_A9_PWR_OFF 3
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
void cphy_disable_overrides(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Miscellaneous platform dependent initialisations
|
* Miscellaneous platform dependent initialisations
|
||||||
*/
|
*/
|
||||||
@ -56,6 +64,7 @@ void scsi_init(void)
|
|||||||
{
|
{
|
||||||
u32 reg = readl(HB_SREG_A9_PWRDOM_STAT);
|
u32 reg = readl(HB_SREG_A9_PWRDOM_STAT);
|
||||||
|
|
||||||
|
cphy_disable_overrides();
|
||||||
if (reg & PWRDOM_STAT_SATA) {
|
if (reg & PWRDOM_STAT_SATA) {
|
||||||
ahci_init((void __iomem *)HB_AHCI_BASE);
|
ahci_init((void __iomem *)HB_AHCI_BASE);
|
||||||
scsi_scan(1);
|
scsi_scan(1);
|
||||||
@ -111,9 +120,31 @@ int ft_board_setup(void *fdt, bd_t *bd)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int is_highbank(void)
|
||||||
|
{
|
||||||
|
uint32_t midr;
|
||||||
|
|
||||||
|
asm volatile ("mrc p15, 0, %0, c0, c0, 0\n" : "=r"(midr));
|
||||||
|
|
||||||
|
return (midr & 0xfff0) == 0xc090;
|
||||||
|
}
|
||||||
|
|
||||||
void reset_cpu(ulong addr)
|
void reset_cpu(ulong addr)
|
||||||
{
|
{
|
||||||
writel(HB_PWR_HARD_RESET, HB_SREG_A9_PWR_REQ);
|
writel(HB_PWR_HARD_RESET, HB_SREG_A9_PWR_REQ);
|
||||||
|
if (is_highbank())
|
||||||
|
writeb(HB_SCU_A9_PWR_OFF, HB_SCU_A9_PWR_STATUS);
|
||||||
|
else
|
||||||
|
writel(0x1, HB_SREG_A15_PWR_CTRL);
|
||||||
|
|
||||||
wfi();
|
wfi();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* turn off the override before transferring control to Linux, since Linux
|
||||||
|
* may not support spread spectrum.
|
||||||
|
*/
|
||||||
|
void arch_preboot_os(void)
|
||||||
|
{
|
||||||
|
cphy_disable_overrides();
|
||||||
|
}
|
||||||
|
6
board/quipos/cairo/MAINTAINERS
Normal file
6
board/quipos/cairo/MAINTAINERS
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
CAIRO BOARD
|
||||||
|
M: Albert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr>
|
||||||
|
S: Maintained
|
||||||
|
F: board/quipos/cairo/
|
||||||
|
F: include/configs/omap3_cairo.h
|
||||||
|
F: configs/cairo_defconfig
|
@ -24,8 +24,9 @@
|
|||||||
#include <asm/arch/sromc.h>
|
#include <asm/arch/sromc.h>
|
||||||
#include <lcd.h>
|
#include <lcd.h>
|
||||||
#include <i2c.h>
|
#include <i2c.h>
|
||||||
#include <samsung/misc.h>
|
|
||||||
#include <usb.h>
|
#include <usb.h>
|
||||||
|
#include <dwc3-uboot.h>
|
||||||
|
#include <samsung/misc.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
@ -378,5 +379,8 @@ void reset_misc(void)
|
|||||||
|
|
||||||
int board_usb_cleanup(int index, enum usb_init_type init)
|
int board_usb_cleanup(int index, enum usb_init_type init)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_USB_DWC3
|
||||||
|
dwc3_uboot_exit(index);
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
92
board/samsung/common/bootscripts/autoboot.cmd
Normal file
92
board/samsung/common/bootscripts/autoboot.cmd
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
# This is an example file to generate boot.scr - a boot script for U-Boot
|
||||||
|
# Generate boot.scr:
|
||||||
|
# ./tools/mkimage -c none -A arm -T script -d autoboot.cmd boot.scr
|
||||||
|
#
|
||||||
|
# It requires a list of environment variables to be defined before load:
|
||||||
|
# platform dependent: boardname, fdtfile, console
|
||||||
|
# system dependent: mmcbootdev, mmcbootpart, mmcrootdev, mmcrootpart, rootfstype
|
||||||
|
#
|
||||||
|
setenv fdtaddr "40800000"
|
||||||
|
setenv initrdname "uInitrd"
|
||||||
|
setenv initrdaddr "42000000"
|
||||||
|
setenv loaddtb "load mmc ${mmcbootdev}:${mmcbootpart} ${fdtaddr} ${fdtfile}"
|
||||||
|
setenv loadinitrd "load mmc ${mmcbootdev}:${mmcbootpart} ${initrdaddr} ${initrdname}"
|
||||||
|
setenv loadkernel "load mmc ${mmcbootdev}:${mmcbootpart} '${kerneladdr}' '${kernelname}'"
|
||||||
|
setenv kernel_args "setenv bootargs ${console} root=/dev/mmcblk${mmcrootdev}p${mmcrootpart} rootfstype=${rootfstype} rootwait ${opts}"
|
||||||
|
|
||||||
|
#### Routine: check_dtb - check that target.dtb exists on boot partition
|
||||||
|
setenv check_dtb "
|
||||||
|
if test -e mmc '${mmcbootdev}':'${mmcbootpart}' '${fdtfile}'; then
|
||||||
|
run loaddtb;
|
||||||
|
setenv fdt_addr ${fdtaddr};
|
||||||
|
else
|
||||||
|
echo Warning! Booting without DTB: '${fdtfile}'!;
|
||||||
|
setenv fdt_addr;
|
||||||
|
fi;"
|
||||||
|
|
||||||
|
#### Routine: check_ramdisk - check that uInitrd exists on boot partition
|
||||||
|
setenv check_ramdisk "
|
||||||
|
if test -e mmc '${mmcbootdev}':'${mmcbootpart}' '${initrdname}'; then
|
||||||
|
echo "Found ramdisk image.";
|
||||||
|
run loadinitrd;
|
||||||
|
setenv initrd_addr ${initrdaddr};
|
||||||
|
else
|
||||||
|
echo Warning! Booting without RAMDISK: '${initrdname}'!;
|
||||||
|
setenv initrd_addr -;
|
||||||
|
fi;"
|
||||||
|
|
||||||
|
#### Routine: boot_fit - check that env $boardname is set and boot proper config of ITB image
|
||||||
|
setenv setboot_fit "
|
||||||
|
if test -e '${boardname}'; then
|
||||||
|
setenv fdt_addr ;
|
||||||
|
setenv initrd_addr ;
|
||||||
|
setenv kerneladdr 0x42000000;
|
||||||
|
setenv kernelname Image.itb;
|
||||||
|
setenv itbcfg "\"#${boardname}\"";
|
||||||
|
setenv imgbootcmd bootm;
|
||||||
|
else
|
||||||
|
echo Warning! Variable: \$boardname is undefined!;
|
||||||
|
fi"
|
||||||
|
|
||||||
|
#### Routine: setboot_uimg - prepare env to boot uImage
|
||||||
|
setenv setboot_uimg "
|
||||||
|
setenv kerneladdr 0x40007FC0;
|
||||||
|
setenv kernelname uImage;
|
||||||
|
setenv itbcfg ;
|
||||||
|
setenv imgbootcmd bootm;
|
||||||
|
run check_dtb;
|
||||||
|
run check_ramdisk;"
|
||||||
|
|
||||||
|
#### Routine: setboot_zimg - prepare env to boot zImage
|
||||||
|
setenv setboot_zimg "
|
||||||
|
setenv kerneladdr 0x40007FC0;
|
||||||
|
setenv kernelname zImage;
|
||||||
|
setenv itbcfg ;
|
||||||
|
setenv imgbootcmd bootz;
|
||||||
|
run check_dtb;
|
||||||
|
run check_ramdisk;"
|
||||||
|
|
||||||
|
#### Routine: boot_img - boot the kernel after env setup
|
||||||
|
setenv boot_img "
|
||||||
|
run loadkernel;
|
||||||
|
run kernel_args;
|
||||||
|
'${imgbootcmd}' '${kerneladdr}${itbcfg}' '${initrd_addr}' '${fdt_addr}';"
|
||||||
|
|
||||||
|
#### Routine: autoboot - choose proper boot path
|
||||||
|
setenv autoboot "
|
||||||
|
if test -e mmc 0:${mmcbootpart} Image.itb; then
|
||||||
|
echo Found kernel image: Image.itb;
|
||||||
|
run setboot_fit;
|
||||||
|
run boot_img;
|
||||||
|
elif test -e mmc 0:${mmcbootpart} zImage; then
|
||||||
|
echo Found kernel image: zImage;
|
||||||
|
run setboot_zimg;
|
||||||
|
run boot_img;
|
||||||
|
elif test -e mmc 0:${mmcbootpart} uImage; then
|
||||||
|
echo Found kernel image: uImage;
|
||||||
|
run setboot_uimg;
|
||||||
|
run boot_img;
|
||||||
|
fi;"
|
||||||
|
|
||||||
|
#### Execute the defined autoboot macro
|
||||||
|
run autoboot
|
10
board/samsung/common/bootscripts/bootzimg.cmd
Normal file
10
board/samsung/common/bootscripts/bootzimg.cmd
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
setenv kernelname zImage;
|
||||||
|
setenv boot_kernel "setenv bootargs \"${console} root=/dev/mmcblk${mmcrootdev}p${mmcrootpart} rootfstype=${rootfstype} rootwait ${opts}\";
|
||||||
|
load mmc ${mmcbootdev}:${mmcbootpart} 0x40007FC0 '${kernelname}';
|
||||||
|
if load mmc ${mmcbootdev}:${mmcbootpart} 40800000 ${fdtfile}; then
|
||||||
|
bootz 0x40007FC0 - 40800000;
|
||||||
|
else
|
||||||
|
echo Warning! Booting without DTB: '${fdtfile}'!;
|
||||||
|
bootz 0x40007FC0 -;
|
||||||
|
fi;"
|
||||||
|
run boot_kernel;
|
@ -6,19 +6,25 @@
|
|||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <fdtdec.h>
|
#include <fdtdec.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
#include <asm/gpio.h>
|
||||||
|
#include <asm/arch/cpu.h>
|
||||||
|
#include <asm/arch/board.h>
|
||||||
|
#include <asm/arch/power.h>
|
||||||
|
#include <asm/arch/system.h>
|
||||||
|
#include <asm/arch/pinmux.h>
|
||||||
|
#include <asm/arch/dp_info.h>
|
||||||
|
#include <asm/arch/xhci-exynos.h>
|
||||||
|
#include <power/tps65090_pmic.h>
|
||||||
#include <i2c.h>
|
#include <i2c.h>
|
||||||
#include <lcd.h>
|
#include <lcd.h>
|
||||||
|
#include <mmc.h>
|
||||||
#include <parade.h>
|
#include <parade.h>
|
||||||
#include <spi.h>
|
#include <spi.h>
|
||||||
#include <errno.h>
|
#include <usb.h>
|
||||||
#include <asm/gpio.h>
|
#include <dwc3-uboot.h>
|
||||||
#include <asm/arch/board.h>
|
#include <samsung-usb-phy-uboot.h>
|
||||||
#include <asm/arch/cpu.h>
|
|
||||||
#include <asm/arch/pinmux.h>
|
|
||||||
#include <asm/arch/system.h>
|
|
||||||
#include <asm/arch/dp_info.h>
|
|
||||||
#include <power/tps65090_pmic.h>
|
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
@ -75,3 +81,63 @@ int board_get_revision(void)
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_USB_DWC3
|
||||||
|
static struct dwc3_device dwc3_device_data = {
|
||||||
|
.maximum_speed = USB_SPEED_SUPER,
|
||||||
|
.base = 0x12400000,
|
||||||
|
.dr_mode = USB_DR_MODE_PERIPHERAL,
|
||||||
|
.index = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
int usb_gadget_handle_interrupts(void)
|
||||||
|
{
|
||||||
|
dwc3_uboot_handle_interrupt(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int board_usb_init(int index, enum usb_init_type init)
|
||||||
|
{
|
||||||
|
struct exynos_usb3_phy *phy = (struct exynos_usb3_phy *)
|
||||||
|
samsung_get_base_usb3_phy();
|
||||||
|
|
||||||
|
if (!phy) {
|
||||||
|
error("usb3 phy not supported");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_usbdrd_phy_ctrl(POWER_USB_DRD_PHY_CTRL_EN);
|
||||||
|
exynos5_usb3_phy_init(phy);
|
||||||
|
|
||||||
|
return dwc3_uboot_init(&dwc3_device_data);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SET_DFU_ALT_INFO
|
||||||
|
char *get_dfu_alt_system(char *interface, char *devstr)
|
||||||
|
{
|
||||||
|
return getenv("dfu_alt_system");
|
||||||
|
}
|
||||||
|
|
||||||
|
char *get_dfu_alt_boot(char *interface, char *devstr)
|
||||||
|
{
|
||||||
|
struct mmc *mmc;
|
||||||
|
char *alt_boot;
|
||||||
|
int dev_num;
|
||||||
|
|
||||||
|
dev_num = simple_strtoul(devstr, NULL, 10);
|
||||||
|
|
||||||
|
mmc = find_mmc_device(dev_num);
|
||||||
|
if (!mmc)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (mmc_init(mmc))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (IS_SD(mmc))
|
||||||
|
alt_boot = CONFIG_DFU_ALT_BOOT_SD;
|
||||||
|
else
|
||||||
|
alt_boot = CONFIG_DFU_ALT_BOOT_EMMC;
|
||||||
|
|
||||||
|
return alt_boot;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@ -75,8 +75,9 @@ int board_init(void)
|
|||||||
i2c_set_bus_num(0);
|
i2c_set_bus_num(0);
|
||||||
if (read_eeprom() < 0)
|
if (read_eeprom() < 0)
|
||||||
puts("Could not get board ID.\n");
|
puts("Could not get board ID.\n");
|
||||||
|
#ifdef CONFIG_MACH_TYPE
|
||||||
gd->bd->bi_arch_number = CONFIG_MACH_TYPE;
|
gd->bd->bi_arch_number = CONFIG_MACH_TYPE;
|
||||||
|
#endif
|
||||||
gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
|
gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
|
||||||
|
|
||||||
#ifdef CONFIG_FACTORYSET
|
#ifdef CONFIG_FACTORYSET
|
||||||
@ -102,21 +103,29 @@ const struct dpll_params *get_dpll_ddr_params(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_SPL_BUILD
|
#ifndef CONFIG_SPL_BUILD
|
||||||
|
|
||||||
|
#define MAX_NR_LEDS 10
|
||||||
|
#define MAX_PIN_NUMBER 128
|
||||||
|
#define STARTUP 0
|
||||||
|
|
||||||
#if defined(BOARD_DFU_BUTTON_GPIO)
|
#if defined(BOARD_DFU_BUTTON_GPIO)
|
||||||
/*
|
unsigned char get_button_state(char * const envname, unsigned char def)
|
||||||
* This command returns the status of the user button on
|
|
||||||
* Input - none
|
|
||||||
* Returns - 1 if button is held down
|
|
||||||
* 0 if button is not held down
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
do_userbutton(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
||||||
{
|
{
|
||||||
int button = 0;
|
int button = 0;
|
||||||
int gpio;
|
int gpio;
|
||||||
|
char *ptr_env;
|
||||||
|
|
||||||
gpio = BOARD_DFU_BUTTON_GPIO;
|
/* If button is not found we take default */
|
||||||
gpio_request(gpio, "DFU");
|
ptr_env = getenv(envname);
|
||||||
|
if (NULL == ptr_env) {
|
||||||
|
gpio = def;
|
||||||
|
} else {
|
||||||
|
gpio = (unsigned char)simple_strtoul(ptr_env, NULL, 0);
|
||||||
|
if (gpio > MAX_PIN_NUMBER)
|
||||||
|
gpio = def;
|
||||||
|
}
|
||||||
|
|
||||||
|
gpio_request(gpio, "");
|
||||||
gpio_direction_input(gpio);
|
gpio_direction_input(gpio);
|
||||||
if (gpio_get_value(gpio))
|
if (gpio_get_value(gpio))
|
||||||
button = 1;
|
button = 1;
|
||||||
@ -127,6 +136,20 @@ do_userbutton(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||||||
|
|
||||||
return button;
|
return button;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* This command returns the status of the user button on
|
||||||
|
* Input - none
|
||||||
|
* Returns - 1 if button is held down
|
||||||
|
* 0 if button is not held down
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
do_userbutton(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
|
{
|
||||||
|
int button = 0;
|
||||||
|
button = get_button_state("button_dfu0", BOARD_DFU_BUTTON_GPIO);
|
||||||
|
button |= get_button_state("button_dfu1", BOARD_DFU_BUTTON_GPIO);
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
U_BOOT_CMD(
|
U_BOOT_CMD(
|
||||||
dfubutton, CONFIG_SYS_MAXARGS, 1, do_userbutton,
|
dfubutton, CONFIG_SYS_MAXARGS, 1, do_userbutton,
|
||||||
@ -134,46 +157,6 @@ U_BOOT_CMD(
|
|||||||
""
|
""
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* This command sets led
|
|
||||||
* Input - name of led
|
|
||||||
* value of led
|
|
||||||
* Returns - 1 if input does not match
|
|
||||||
* 0 if led was set
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
do_setled(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
||||||
{
|
|
||||||
int gpio = 0;
|
|
||||||
if (argc != 3)
|
|
||||||
goto exit;
|
|
||||||
#if defined(BOARD_STATUS_LED)
|
|
||||||
if (!strcmp(argv[1], "stat"))
|
|
||||||
gpio = BOARD_STATUS_LED;
|
|
||||||
#endif
|
|
||||||
#if defined(BOARD_DFU_BUTTON_LED)
|
|
||||||
if (!strcmp(argv[1], "dfu"))
|
|
||||||
gpio = BOARD_DFU_BUTTON_LED;
|
|
||||||
#endif
|
|
||||||
/* If argument does not mach exit */
|
|
||||||
if (gpio == 0)
|
|
||||||
goto exit;
|
|
||||||
gpio_request(gpio, "");
|
|
||||||
gpio_direction_output(gpio, 1);
|
|
||||||
if (!strcmp(argv[2], "1"))
|
|
||||||
gpio_set_value(gpio, 1);
|
|
||||||
else
|
|
||||||
gpio_set_value(gpio, 0);
|
|
||||||
return 0;
|
|
||||||
exit:
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
U_BOOT_CMD(
|
|
||||||
led, CONFIG_SYS_MAXARGS, 2, do_setled,
|
|
||||||
"Set led on or off",
|
|
||||||
"dfu val - set dfu led\nled stat val - set status led"
|
|
||||||
);
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
do_usertestwdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
do_usertestwdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
@ -189,4 +172,95 @@ U_BOOT_CMD(
|
|||||||
"Sends U-Boot into infinite loop",
|
"Sends U-Boot into infinite loop",
|
||||||
""
|
""
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get led gpios from env and set them.
|
||||||
|
* The led define in environment need to need to be of the form ledN=NN,S0,S1
|
||||||
|
* where N is an unsigned integer from 0 to 9 and S0 and S1 is 0 or 1. S0
|
||||||
|
* defines the startup state of the led, S1 the special state of the led when
|
||||||
|
* it enters e.g. dfu mode.
|
||||||
|
*/
|
||||||
|
void set_env_gpios(unsigned char state)
|
||||||
|
{
|
||||||
|
char *ptr_env;
|
||||||
|
char str_tmp[5]; /* must contain "ledX"*/
|
||||||
|
char num[1];
|
||||||
|
unsigned char i, idx, pos1, pos2, ccount;
|
||||||
|
unsigned char gpio_n, gpio_s0, gpio_s1;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_NR_LEDS; i++) {
|
||||||
|
strcpy(str_tmp, "led");
|
||||||
|
sprintf(num, "%d", i);
|
||||||
|
strcat(str_tmp, num);
|
||||||
|
|
||||||
|
/* If env var is not found we stop */
|
||||||
|
ptr_env = getenv(str_tmp);
|
||||||
|
if (NULL == ptr_env)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Find sperators position */
|
||||||
|
pos1 = 0;
|
||||||
|
pos2 = 0;
|
||||||
|
ccount = 0;
|
||||||
|
for (idx = 0; ptr_env[idx] != '\0'; idx++) {
|
||||||
|
if (ptr_env[idx] == ',') {
|
||||||
|
if (ccount++ < 1)
|
||||||
|
pos1 = idx;
|
||||||
|
else
|
||||||
|
pos2 = idx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Bad led description skip this definition */
|
||||||
|
if (pos2 <= pos1 || ccount > 2)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Get pin number and request gpio */
|
||||||
|
memset(str_tmp, 0, sizeof(str_tmp));
|
||||||
|
strncpy(str_tmp, ptr_env, pos1*sizeof(char));
|
||||||
|
gpio_n = (unsigned char)simple_strtoul(str_tmp, NULL, 0);
|
||||||
|
|
||||||
|
/* Invalid gpio number skip definition */
|
||||||
|
if (gpio_n > MAX_PIN_NUMBER)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
gpio_request(gpio_n, "");
|
||||||
|
|
||||||
|
if (state == STARTUP) {
|
||||||
|
/* get pin state 0 and set */
|
||||||
|
memset(str_tmp, 0, sizeof(str_tmp));
|
||||||
|
strncpy(str_tmp, ptr_env+pos1+1,
|
||||||
|
(pos2-pos1-1)*sizeof(char));
|
||||||
|
gpio_s0 = (unsigned char)simple_strtoul(str_tmp, NULL,
|
||||||
|
0);
|
||||||
|
|
||||||
|
gpio_direction_output(gpio_n, gpio_s0);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* get pin state 1 and set */
|
||||||
|
memset(str_tmp, 0, sizeof(str_tmp));
|
||||||
|
strcpy(str_tmp, ptr_env+pos2+1);
|
||||||
|
gpio_s1 = (unsigned char)simple_strtoul(str_tmp, NULL,
|
||||||
|
0);
|
||||||
|
gpio_direction_output(gpio_n, gpio_s1);
|
||||||
|
}
|
||||||
|
} /* loop through defined led in environment */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_board_led(cmd_tbl_t *cmdtp, int flag, int argc,
|
||||||
|
char *const argv[])
|
||||||
|
{
|
||||||
|
if (argc != 2)
|
||||||
|
return CMD_RET_USAGE;
|
||||||
|
if ((unsigned char)simple_strtoul(argv[1], NULL, 0) == STARTUP)
|
||||||
|
set_env_gpios(0);
|
||||||
|
else
|
||||||
|
set_env_gpios(1);
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
U_BOOT_CMD(
|
||||||
|
draco_led, CONFIG_SYS_MAXARGS, 2, do_board_led,
|
||||||
|
"Set LEDs defined in environment",
|
||||||
|
"<0|1>"
|
||||||
|
);
|
||||||
#endif /* !CONFIG_SPL_BUILD */
|
#endif /* !CONFIG_SPL_BUILD */
|
||||||
|
@ -14,7 +14,7 @@ config SYS_CONFIG_NAME
|
|||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if TARGET_DXR2
|
if TARGET_THUBAN
|
||||||
|
|
||||||
config SYS_BOARD
|
config SYS_BOARD
|
||||||
default "draco"
|
default "draco"
|
||||||
@ -26,6 +26,22 @@ config SYS_SOC
|
|||||||
default "am33xx"
|
default "am33xx"
|
||||||
|
|
||||||
config SYS_CONFIG_NAME
|
config SYS_CONFIG_NAME
|
||||||
default "dxr2"
|
default "thuban"
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
if TARGET_RASTABAN
|
||||||
|
|
||||||
|
config SYS_BOARD
|
||||||
|
default "draco"
|
||||||
|
|
||||||
|
config SYS_VENDOR
|
||||||
|
default "siemens"
|
||||||
|
|
||||||
|
config SYS_SOC
|
||||||
|
default "am33xx"
|
||||||
|
|
||||||
|
config SYS_CONFIG_NAME
|
||||||
|
default "rastaban"
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
@ -4,5 +4,7 @@ S: Maintained
|
|||||||
F: board/siemens/draco/
|
F: board/siemens/draco/
|
||||||
F: include/configs/draco.h
|
F: include/configs/draco.h
|
||||||
F: configs/draco_defconfig
|
F: configs/draco_defconfig
|
||||||
F: include/configs/dxr2.h
|
F: include/configs/thuban.h
|
||||||
F: configs/dxr2_defconfig
|
F: configs/thuban_defconfig
|
||||||
|
F: include/configs/rastaban.h
|
||||||
|
F: configs/rastaban_defconfig
|
||||||
|
@ -43,7 +43,7 @@ static struct draco_baseboard_id __attribute__((section(".data"))) settings;
|
|||||||
/* Default@303MHz-i0 */
|
/* Default@303MHz-i0 */
|
||||||
const struct ddr3_data ddr3_default = {
|
const struct ddr3_data ddr3_default = {
|
||||||
0x33524444, 0x56312e35, 0x0080, 0x0000, 0x003A, 0x003F, 0x009F,
|
0x33524444, 0x56312e35, 0x0080, 0x0000, 0x003A, 0x003F, 0x009F,
|
||||||
0x0079, 0x0888A39B, 0x26247FDA, 0x501F821F, 0x00100206, 0x61A44A32,
|
0x0079, 0x0888A39B, 0x26517FDA, 0x501F84EF, 0x00100206, 0x61A44A32,
|
||||||
0x0000093B, 0x0000014A,
|
0x0000093B, 0x0000014A,
|
||||||
"default name @303MHz \0",
|
"default name @303MHz \0",
|
||||||
"default marking \0",
|
"default marking \0",
|
||||||
@ -71,8 +71,8 @@ static void print_ddr3_timings(void)
|
|||||||
printf("clock:\t\t%d MHz\n", DDR_PLL_FREQ);
|
printf("clock:\t\t%d MHz\n", DDR_PLL_FREQ);
|
||||||
printf("device:\t\t%s\n", settings.ddr3.manu_name);
|
printf("device:\t\t%s\n", settings.ddr3.manu_name);
|
||||||
printf("marking:\t%s\n", settings.ddr3.manu_marking);
|
printf("marking:\t%s\n", settings.ddr3.manu_marking);
|
||||||
printf("timing parameters\n");
|
printf("%-20s, %-8s, %-8s, %-4s\n", "timing parameters", "eeprom",
|
||||||
printf("diff\teeprom\tdefault\n");
|
"default", "diff");
|
||||||
PRINTARGS(magic);
|
PRINTARGS(magic);
|
||||||
PRINTARGS(version);
|
PRINTARGS(version);
|
||||||
PRINTARGS(ddr3_sratio);
|
PRINTARGS(ddr3_sratio);
|
||||||
@ -96,9 +96,12 @@ static void print_ddr3_timings(void)
|
|||||||
|
|
||||||
static void print_chip_data(void)
|
static void print_chip_data(void)
|
||||||
{
|
{
|
||||||
|
struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
|
||||||
|
dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev);
|
||||||
printf("\nCPU BOARD\n");
|
printf("\nCPU BOARD\n");
|
||||||
printf("device: \t'%s'\n", settings.chip.sdevname);
|
printf("device: \t'%s'\n", settings.chip.sdevname);
|
||||||
printf("hw version: \t'%s'\n", settings.chip.shwver);
|
printf("hw version: \t'%s'\n", settings.chip.shwver);
|
||||||
|
printf("max freq: \t%d MHz\n", dpll_mpu_opp100.m);
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_SPL_BUILD */
|
#endif /* CONFIG_SPL_BUILD */
|
||||||
|
|
||||||
@ -193,6 +196,11 @@ struct ctrl_ioregs draco_ddr3_ioregs = {
|
|||||||
|
|
||||||
config_ddr(DDR_PLL_FREQ, &draco_ddr3_ioregs, &draco_ddr3_data,
|
config_ddr(DDR_PLL_FREQ, &draco_ddr3_ioregs, &draco_ddr3_data,
|
||||||
&draco_ddr3_cmd_ctrl_data, &draco_ddr3_emif_reg_data, 0);
|
&draco_ddr3_cmd_ctrl_data, &draco_ddr3_emif_reg_data, 0);
|
||||||
|
|
||||||
|
/* For Samsung 2Gbit RAM we need this delay otherwise config fails after
|
||||||
|
* soft reset.
|
||||||
|
*/
|
||||||
|
udelay(2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spl_siemens_board_init(void)
|
static void spl_siemens_board_init(void)
|
||||||
@ -201,6 +209,26 @@ static void spl_siemens_board_init(void)
|
|||||||
}
|
}
|
||||||
#endif /* if def CONFIG_SPL_BUILD */
|
#endif /* if def CONFIG_SPL_BUILD */
|
||||||
|
|
||||||
|
#ifdef CONFIG_BOARD_LATE_INIT
|
||||||
|
int board_late_init(void)
|
||||||
|
{
|
||||||
|
omap_nand_switch_ecc(1, 8);
|
||||||
|
#ifdef CONFIG_FACTORYSET
|
||||||
|
/* Set ASN in environment*/
|
||||||
|
if (factory_dat.asn[0] != 0) {
|
||||||
|
setenv("dtb_name", (char *)factory_dat.asn);
|
||||||
|
} else {
|
||||||
|
/* dtb suffix gets added in load script */
|
||||||
|
setenv("dtb_name", "am335x-draco");
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
setenv("dtb_name", "am335x-draco");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
|
#if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
|
||||||
(defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
|
(defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
|
||||||
static void cpsw_control(int enabled)
|
static void cpsw_control(int enabled)
|
||||||
@ -280,13 +308,4 @@ U_BOOT_CMD(
|
|||||||
#endif /* #if defined(CONFIG_DRIVER_TI_CPSW) */
|
#endif /* #if defined(CONFIG_DRIVER_TI_CPSW) */
|
||||||
#endif /* #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) */
|
#endif /* #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) */
|
||||||
|
|
||||||
#ifdef CONFIG_BOARD_LATE_INIT
|
|
||||||
int board_late_init(void)
|
|
||||||
{
|
|
||||||
omap_nand_switch_ecc(1, 8);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "../common/board.c"
|
#include "../common/board.c"
|
||||||
|
@ -16,9 +16,13 @@
|
|||||||
#ifndef _BOARD_H_
|
#ifndef _BOARD_H_
|
||||||
#define _BOARD_H_
|
#define _BOARD_H_
|
||||||
|
|
||||||
#define PARGS3(x) settings.ddr3.x-ddr3_default.x, \
|
#define PARGS(x) #x , /* Parameter Name */ \
|
||||||
settings.ddr3.x, ddr3_default.x
|
settings.ddr3.x, /* EEPROM Value */ \
|
||||||
#define PRINTARGS(y) printf("%x, %8x, %8x : "#y"\n", PARGS3(y))
|
ddr3_default.x, /* Default Value */ \
|
||||||
|
settings.ddr3.x-ddr3_default.x /* Difference */
|
||||||
|
|
||||||
|
#define PRINTARGS(y) printf("%-20s, %8x, %8x, %4d\n", PARGS(y))
|
||||||
|
|
||||||
#define MAGIC_CHIP 0x50494843
|
#define MAGIC_CHIP 0x50494843
|
||||||
|
|
||||||
/* Automatic generated definition */
|
/* Automatic generated definition */
|
||||||
@ -69,4 +73,7 @@ void enable_uart4_pin_mux(void);
|
|||||||
void enable_uart5_pin_mux(void);
|
void enable_uart5_pin_mux(void);
|
||||||
void enable_i2c0_pin_mux(void);
|
void enable_i2c0_pin_mux(void);
|
||||||
void enable_board_pin_mux(void);
|
void enable_board_pin_mux(void);
|
||||||
|
|
||||||
|
/* Forwared declaration, defined in common board.c */
|
||||||
|
void set_env_gpios(unsigned char state);
|
||||||
#endif
|
#endif
|
||||||
|
@ -60,7 +60,7 @@ static struct module_pin_mux nand_pin_mux[] = {
|
|||||||
|
|
||||||
static struct module_pin_mux gpios_pin_mux[] = {
|
static struct module_pin_mux gpios_pin_mux[] = {
|
||||||
/* DFU button GPIO0_27*/
|
/* DFU button GPIO0_27*/
|
||||||
{OFFSET(gpmc_ad11), (MODE(7) | PULLUDEN | RXACTIVE)},
|
{OFFSET(gpmc_ad11), (MODE(7) | PULLUDEN | PULLUP_EN | RXACTIVE)},
|
||||||
{OFFSET(gpmc_csn3), MODE(7) }, /* LED0 GPIO2_0 */
|
{OFFSET(gpmc_csn3), MODE(7) }, /* LED0 GPIO2_0 */
|
||||||
{OFFSET(emu0), MODE(7)}, /* LED1 GPIO3_7 */
|
{OFFSET(emu0), MODE(7)}, /* LED1 GPIO3_7 */
|
||||||
/* Triacs in HW Rev 2 */
|
/* Triacs in HW Rev 2 */
|
||||||
@ -222,7 +222,7 @@ static struct module_pin_mux gpios_pin_mux[] = {
|
|||||||
{OFFSET(vrefp), MODE(7) | RXACTIVE | PULLUDDIS},
|
{OFFSET(vrefp), MODE(7) | RXACTIVE | PULLUDDIS},
|
||||||
{OFFSET(vrefn), MODE(7) | RXACTIVE | PULLUDDIS},
|
{OFFSET(vrefn), MODE(7) | RXACTIVE | PULLUDDIS},
|
||||||
/* nRST for SMSC LAN9303 switch - GPIO2_24 */
|
/* nRST for SMSC LAN9303 switch - GPIO2_24 */
|
||||||
{OFFSET(lcd_pclk), MODE(7) }, /* LAN9303 nRST */
|
{OFFSET(lcd_pclk), MODE(7) | PULLUDEN | PULLUP_EN }, /* LAN9303 nRST */
|
||||||
{-1},
|
{-1},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -280,18 +280,6 @@ config MMC_SUNXI_SLOT_EXTRA
|
|||||||
slot or emmc on mmc1 - mmc3. Setting this to 1, 2 or 3 will enable
|
slot or emmc on mmc1 - mmc3. Setting this to 1, 2 or 3 will enable
|
||||||
support for this.
|
support for this.
|
||||||
|
|
||||||
config SPL_NAND_SUPPORT
|
|
||||||
bool "SPL/NAND mode support"
|
|
||||||
depends on SPL
|
|
||||||
default n
|
|
||||||
---help---
|
|
||||||
This enables support for booting from NAND internal
|
|
||||||
memory. U-Boot SPL doesn't detect where is it load from,
|
|
||||||
therefore this option is needed to properly load image from
|
|
||||||
flash. Option also disables MMC functionality on U-Boot due to
|
|
||||||
initialization errors encountered, when both controllers are
|
|
||||||
enabled.
|
|
||||||
|
|
||||||
config USB0_VBUS_PIN
|
config USB0_VBUS_PIN
|
||||||
string "Vbus enable pin for usb0 (otg)"
|
string "Vbus enable pin for usb0 (otg)"
|
||||||
default ""
|
default ""
|
||||||
@ -566,25 +554,4 @@ config GMAC_TX_DELAY
|
|||||||
---help---
|
---help---
|
||||||
Set the GMAC Transmit Clock Delay Chain value.
|
Set the GMAC Transmit Clock Delay Chain value.
|
||||||
|
|
||||||
config SYS_MALLOC_CLEAR_ON_INIT
|
|
||||||
default n
|
|
||||||
|
|
||||||
config NETDEVICES
|
|
||||||
default y
|
|
||||||
|
|
||||||
config DM_ETH
|
|
||||||
default y
|
|
||||||
|
|
||||||
config DM_SERIAL
|
|
||||||
default y
|
|
||||||
|
|
||||||
config DM_USB
|
|
||||||
default y if !USB_MUSB_SUNXI
|
|
||||||
|
|
||||||
config CMD_SETEXPR
|
|
||||||
default y
|
|
||||||
|
|
||||||
config CMD_NET
|
|
||||||
default y
|
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
@ -162,6 +162,12 @@ M: Siarhei Siamashka <siarhei.siamashka@gmail.com>
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
F: configs/MSI_Primo81_defconfig
|
F: configs/MSI_Primo81_defconfig
|
||||||
|
|
||||||
|
SINLINX SINA33 BOARD
|
||||||
|
M: Chen-Yu Tsai <wens@csie.org>
|
||||||
|
S: Maintained
|
||||||
|
F: configs/Sinlinx_SinA33_defconfig
|
||||||
|
W: http://linux-sunxi.org/Sinlinx_SinA33
|
||||||
|
|
||||||
TZX-Q8-713B7 BOARD
|
TZX-Q8-713B7 BOARD
|
||||||
M: Paul Kocialkowski <contact@paulk.fr>
|
M: Paul Kocialkowski <contact@paulk.fr>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -22,9 +22,6 @@
|
|||||||
#ifdef CONFIG_AXP221_POWER
|
#ifdef CONFIG_AXP221_POWER
|
||||||
#include <axp221.h>
|
#include <axp221.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_NAND_SUNXI
|
|
||||||
#include <nand.h>
|
|
||||||
#endif
|
|
||||||
#include <asm/arch/clock.h>
|
#include <asm/arch/clock.h>
|
||||||
#include <asm/arch/cpu.h>
|
#include <asm/arch/cpu.h>
|
||||||
#include <asm/arch/display.h>
|
#include <asm/arch/display.h>
|
||||||
@ -318,21 +315,6 @@ int board_mmc_init(bd_t *bis)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_NAND
|
|
||||||
void board_nand_init(void)
|
|
||||||
{
|
|
||||||
unsigned int pin;
|
|
||||||
static u8 ports[] = CONFIG_NAND_SUNXI_GPC_PORTS;
|
|
||||||
|
|
||||||
/* Configure AHB muxes to connect output pins with NAND controller */
|
|
||||||
for (pin = 0; pin < 16; pin++)
|
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPC(pin), SUNXI_GPC_NAND);
|
|
||||||
|
|
||||||
for (pin = 0; pin < ARRAY_SIZE(ports); pin++)
|
|
||||||
sunxi_gpio_set_cfgpin(SUNXI_GPC(ports[pin]), SUNXI_GPC_NAND);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void i2c_init_board(void)
|
void i2c_init_board(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_I2C0_ENABLE
|
#ifdef CONFIG_I2C0_ENABLE
|
||||||
|
@ -4,3 +4,4 @@ S: Maintained
|
|||||||
F: board/synopsys/axs101/
|
F: board/synopsys/axs101/
|
||||||
F: include/configs/axs101.h
|
F: include/configs/axs101.h
|
||||||
F: configs/axs101_defconfig
|
F: configs/axs101_defconfig
|
||||||
|
F: configs/axs103_defconfig
|
||||||
|
@ -56,3 +56,33 @@ int board_early_init_f(void)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ISA_ARCV2
|
||||||
|
#define RESET_VECTOR_ADDR 0x0
|
||||||
|
|
||||||
|
void smp_set_core_boot_addr(unsigned long addr, int corenr)
|
||||||
|
{
|
||||||
|
/* All cores have reset vector pointing to 0 */
|
||||||
|
writel(addr, (void __iomem *)RESET_VECTOR_ADDR);
|
||||||
|
|
||||||
|
/* Make sure other cores see written value in memory */
|
||||||
|
flush_dcache_range(RESET_VECTOR_ADDR, RESET_VECTOR_ADDR + sizeof(int));
|
||||||
|
}
|
||||||
|
|
||||||
|
void smp_kick_all_cpus(void)
|
||||||
|
{
|
||||||
|
/* CPU start CREG */
|
||||||
|
#define AXC003_CREG_CPU_START 0xF0001400
|
||||||
|
|
||||||
|
/* Bits positions in CPU start CREG */
|
||||||
|
#define BITS_START 0
|
||||||
|
#define BITS_POLARITY 8
|
||||||
|
#define BITS_CORE_SEL 9
|
||||||
|
#define BITS_MULTICORE 12
|
||||||
|
|
||||||
|
#define CMD (1 << BITS_MULTICORE) | (1 << BITS_CORE_SEL) | \
|
||||||
|
(1 << BITS_POLARITY) | (1 << BITS_START)
|
||||||
|
|
||||||
|
writel(CMD, (void __iomem *)AXC003_CREG_CPU_START);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@ -5,3 +5,5 @@ F: board/ti/am43xx/
|
|||||||
F: include/configs/am43xx_evm.h
|
F: include/configs/am43xx_evm.h
|
||||||
F: configs/am43xx_evm_defconfig
|
F: configs/am43xx_evm_defconfig
|
||||||
F: configs/am43xx_evm_qspiboot_defconfig
|
F: configs/am43xx_evm_qspiboot_defconfig
|
||||||
|
F: configs/am43xx_evm_ethboot_defconfig
|
||||||
|
F: configs/am43xx_evm_usbhost_boot_defconfig
|
||||||
|
@ -148,6 +148,29 @@ static const struct dpll_params idk_dpll_ddr = {
|
|||||||
400, 23, 1, -1, 2, -1, -1
|
400, 23, 1, -1, 2, -1, -1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const u32 ext_phy_ctrl_const_base_lpddr2[] = {
|
||||||
|
0x00500050,
|
||||||
|
0x00350035,
|
||||||
|
0x00350035,
|
||||||
|
0x00350035,
|
||||||
|
0x00350035,
|
||||||
|
0x00350035,
|
||||||
|
0x00000000,
|
||||||
|
0x00000000,
|
||||||
|
0x00000000,
|
||||||
|
0x00000000,
|
||||||
|
0x00000000,
|
||||||
|
0x00000000,
|
||||||
|
0x00000000,
|
||||||
|
0x00000000,
|
||||||
|
0x00000000,
|
||||||
|
0x00000000,
|
||||||
|
0x00000000,
|
||||||
|
0x00000000,
|
||||||
|
0x40001000,
|
||||||
|
0x08102040
|
||||||
|
};
|
||||||
|
|
||||||
const struct ctrl_ioregs ioregs_lpddr2 = {
|
const struct ctrl_ioregs ioregs_lpddr2 = {
|
||||||
.cm0ioctl = LPDDR2_ADDRCTRL_IOCTRL_VALUE,
|
.cm0ioctl = LPDDR2_ADDRCTRL_IOCTRL_VALUE,
|
||||||
.cm1ioctl = LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
|
.cm1ioctl = LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
|
||||||
@ -318,6 +341,16 @@ static const struct emif_regs ddr3_idk_emif_regs_400Mhz = {
|
|||||||
.emif_cos_config = 0x00ffffff
|
.emif_cos_config = 0x00ffffff
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
|
||||||
|
{
|
||||||
|
if (board_is_eposevm()) {
|
||||||
|
*regs = ext_phy_ctrl_const_base_lpddr2;
|
||||||
|
*size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* get_sys_clk_index : returns the index of the sys_clk read from
|
* get_sys_clk_index : returns the index of the sys_clk read from
|
||||||
* ctrl status register. This value is either
|
* ctrl status register. This value is either
|
||||||
|
@ -14,7 +14,10 @@
|
|||||||
#include <usb.h>
|
#include <usb.h>
|
||||||
#include <asm/omap_common.h>
|
#include <asm/omap_common.h>
|
||||||
#include <asm/emif.h>
|
#include <asm/emif.h>
|
||||||
|
#include <asm/gpio.h>
|
||||||
|
#include <asm/arch/gpio.h>
|
||||||
#include <asm/arch/clock.h>
|
#include <asm/arch/clock.h>
|
||||||
|
#include <asm/arch/dra7xx_iodelay.h>
|
||||||
#include <asm/arch/sys_proto.h>
|
#include <asm/arch/sys_proto.h>
|
||||||
#include <asm/arch/mmc_host_def.h>
|
#include <asm/arch/mmc_host_def.h>
|
||||||
#include <asm/arch/sata.h>
|
#include <asm/arch/sata.h>
|
||||||
@ -29,6 +32,9 @@
|
|||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
/* GPIO 7_11 */
|
||||||
|
#define GPIO_DDR_VTT_EN 203
|
||||||
|
|
||||||
const struct omap_sysinfo sysinfo = {
|
const struct omap_sysinfo sysinfo = {
|
||||||
"Board: BeagleBoard x15\n"
|
"Board: BeagleBoard x15\n"
|
||||||
};
|
};
|
||||||
@ -52,23 +58,29 @@ static const struct emif_regs beagle_x15_emif1_ddr3_532mhz_emif_regs = {
|
|||||||
.sdram_tim1 = 0xceef266b,
|
.sdram_tim1 = 0xceef266b,
|
||||||
.sdram_tim2 = 0x328f7fda,
|
.sdram_tim2 = 0x328f7fda,
|
||||||
.sdram_tim3 = 0x027f88a8,
|
.sdram_tim3 = 0x027f88a8,
|
||||||
.read_idle_ctrl = 0x00050001,
|
.read_idle_ctrl = 0x00050000,
|
||||||
.zq_config = 0x0007190b,
|
.zq_config = 0x0007190b,
|
||||||
.temp_alert_config = 0x00000000,
|
.temp_alert_config = 0x00000000,
|
||||||
.emif_ddr_phy_ctlr_1_init = 0x0e24400a,
|
.emif_ddr_phy_ctlr_1_init = 0x0024400b,
|
||||||
.emif_ddr_phy_ctlr_1 = 0x0e24400a,
|
.emif_ddr_phy_ctlr_1 = 0x0e24400b,
|
||||||
.emif_ddr_ext_phy_ctrl_1 = 0x10040100,
|
.emif_ddr_ext_phy_ctrl_1 = 0x10040100,
|
||||||
.emif_ddr_ext_phy_ctrl_2 = 0x00740074,
|
.emif_ddr_ext_phy_ctrl_2 = 0x00740074,
|
||||||
.emif_ddr_ext_phy_ctrl_3 = 0x00780078,
|
.emif_ddr_ext_phy_ctrl_3 = 0x00780078,
|
||||||
.emif_ddr_ext_phy_ctrl_4 = 0x007c007c,
|
.emif_ddr_ext_phy_ctrl_4 = 0x007c007c,
|
||||||
.emif_ddr_ext_phy_ctrl_5 = 0x007b007b,
|
.emif_ddr_ext_phy_ctrl_5 = 0x007b007b,
|
||||||
.emif_rd_wr_lvl_rmp_win = 0x00000000,
|
.emif_rd_wr_lvl_rmp_win = 0x00000000,
|
||||||
.emif_rd_wr_lvl_rmp_ctl = 0x00000000,
|
.emif_rd_wr_lvl_rmp_ctl = 0x80000000,
|
||||||
.emif_rd_wr_lvl_ctl = 0x00000000,
|
.emif_rd_wr_lvl_ctl = 0x00000000,
|
||||||
.emif_rd_wr_exec_thresh = 0x00000305
|
.emif_rd_wr_exec_thresh = 0x00000305
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Ext phy ctrl regs 1-35 */
|
||||||
static const u32 beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs[] = {
|
static const u32 beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs[] = {
|
||||||
|
0x10040100,
|
||||||
|
0x00740074,
|
||||||
|
0x00780078,
|
||||||
|
0x007c007c,
|
||||||
|
0x007b007b,
|
||||||
0x00800080,
|
0x00800080,
|
||||||
0x00360036,
|
0x00360036,
|
||||||
0x00340034,
|
0x00340034,
|
||||||
@ -90,14 +102,19 @@ static const u32 beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs[] = {
|
|||||||
|
|
||||||
0x00000000,
|
0x00000000,
|
||||||
0x00600020,
|
0x00600020,
|
||||||
0x40010080,
|
0x40011080,
|
||||||
0x08102040,
|
0x08102040,
|
||||||
|
|
||||||
0x00400040,
|
0x00400040,
|
||||||
0x00400040,
|
0x00400040,
|
||||||
0x00400040,
|
0x00400040,
|
||||||
0x00400040,
|
0x00400040,
|
||||||
0x00400040
|
0x00400040,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct emif_regs beagle_x15_emif2_ddr3_532mhz_emif_regs = {
|
static const struct emif_regs beagle_x15_emif2_ddr3_532mhz_emif_regs = {
|
||||||
@ -109,23 +126,28 @@ static const struct emif_regs beagle_x15_emif2_ddr3_532mhz_emif_regs = {
|
|||||||
.sdram_tim1 = 0xceef266b,
|
.sdram_tim1 = 0xceef266b,
|
||||||
.sdram_tim2 = 0x328f7fda,
|
.sdram_tim2 = 0x328f7fda,
|
||||||
.sdram_tim3 = 0x027f88a8,
|
.sdram_tim3 = 0x027f88a8,
|
||||||
.read_idle_ctrl = 0x00050001,
|
.read_idle_ctrl = 0x00050000,
|
||||||
.zq_config = 0x0007190b,
|
.zq_config = 0x0007190b,
|
||||||
.temp_alert_config = 0x00000000,
|
.temp_alert_config = 0x00000000,
|
||||||
.emif_ddr_phy_ctlr_1_init = 0x0e24400a,
|
.emif_ddr_phy_ctlr_1_init = 0x0024400b,
|
||||||
.emif_ddr_phy_ctlr_1 = 0x0e24400a,
|
.emif_ddr_phy_ctlr_1 = 0x0e24400b,
|
||||||
.emif_ddr_ext_phy_ctrl_1 = 0x10040100,
|
.emif_ddr_ext_phy_ctrl_1 = 0x10040100,
|
||||||
.emif_ddr_ext_phy_ctrl_2 = 0x00820082,
|
.emif_ddr_ext_phy_ctrl_2 = 0x00820082,
|
||||||
.emif_ddr_ext_phy_ctrl_3 = 0x008b008b,
|
.emif_ddr_ext_phy_ctrl_3 = 0x008b008b,
|
||||||
.emif_ddr_ext_phy_ctrl_4 = 0x00800080,
|
.emif_ddr_ext_phy_ctrl_4 = 0x00800080,
|
||||||
.emif_ddr_ext_phy_ctrl_5 = 0x007e007e,
|
.emif_ddr_ext_phy_ctrl_5 = 0x007e007e,
|
||||||
.emif_rd_wr_lvl_rmp_win = 0x00000000,
|
.emif_rd_wr_lvl_rmp_win = 0x00000000,
|
||||||
.emif_rd_wr_lvl_rmp_ctl = 0x00000000,
|
.emif_rd_wr_lvl_rmp_ctl = 0x80000000,
|
||||||
.emif_rd_wr_lvl_ctl = 0x00000000,
|
.emif_rd_wr_lvl_ctl = 0x00000000,
|
||||||
.emif_rd_wr_exec_thresh = 0x00000305
|
.emif_rd_wr_exec_thresh = 0x00000305
|
||||||
};
|
};
|
||||||
|
|
||||||
static const u32 beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs[] = {
|
static const u32 beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs[] = {
|
||||||
|
0x10040100,
|
||||||
|
0x00820082,
|
||||||
|
0x008b008b,
|
||||||
|
0x00800080,
|
||||||
|
0x007e007e,
|
||||||
0x00800080,
|
0x00800080,
|
||||||
0x00370037,
|
0x00370037,
|
||||||
0x00390039,
|
0x00390039,
|
||||||
@ -145,14 +167,19 @@ static const u32 beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs[] = {
|
|||||||
|
|
||||||
0x00000000,
|
0x00000000,
|
||||||
0x00600020,
|
0x00600020,
|
||||||
0x40010080,
|
0x40011080,
|
||||||
0x08102040,
|
0x08102040,
|
||||||
|
|
||||||
0x00400040,
|
0x00400040,
|
||||||
0x00400040,
|
0x00400040,
|
||||||
0x00400040,
|
0x00400040,
|
||||||
0x00400040,
|
0x00400040,
|
||||||
0x00400040
|
0x00400040,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0
|
||||||
};
|
};
|
||||||
|
|
||||||
void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
|
void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
|
||||||
@ -240,24 +267,21 @@ int board_late_init(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_set_mux32(u32 base,
|
|
||||||
struct pad_conf_entry const *array, int size)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
struct pad_conf_entry *pad = (struct pad_conf_entry *)array;
|
|
||||||
|
|
||||||
for (i = 0; i < size; i++, pad++)
|
|
||||||
writel(pad->val, base + pad->offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_muxconf_regs_essential(void)
|
void set_muxconf_regs_essential(void)
|
||||||
{
|
{
|
||||||
do_set_mux32((*ctrl)->control_padconf_core_base,
|
do_set_mux32((*ctrl)->control_padconf_core_base,
|
||||||
core_padconf_array_essential,
|
early_padconf, ARRAY_SIZE(early_padconf));
|
||||||
sizeof(core_padconf_array_essential) /
|
|
||||||
sizeof(struct pad_conf_entry));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_IODELAY_RECALIBRATION
|
||||||
|
void recalibrate_iodelay(void)
|
||||||
|
{
|
||||||
|
__recalibrate_iodelay(core_padconf_array_essential,
|
||||||
|
ARRAY_SIZE(core_padconf_array_essential),
|
||||||
|
iodelay_cfg_array, ARRAY_SIZE(iodelay_cfg_array));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC)
|
#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC)
|
||||||
int board_mmc_init(bd_t *bis)
|
int board_mmc_init(bd_t *bis)
|
||||||
{
|
{
|
||||||
@ -385,3 +409,21 @@ int board_eth_init(bd_t *bis)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_BOARD_EARLY_INIT_F
|
||||||
|
/* VTT regulator enable */
|
||||||
|
static inline void vtt_regulator_enable(void)
|
||||||
|
{
|
||||||
|
if (omap_hw_init_context() == OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
|
||||||
|
gpio_direction_output(GPIO_DDR_VTT_EN, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int board_early_init_f(void)
|
||||||
|
{
|
||||||
|
vtt_regulator_enable();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@ -13,43 +13,318 @@
|
|||||||
#include <asm/arch/mux_dra7xx.h>
|
#include <asm/arch/mux_dra7xx.h>
|
||||||
|
|
||||||
const struct pad_conf_entry core_padconf_array_essential[] = {
|
const struct pad_conf_entry core_padconf_array_essential[] = {
|
||||||
{MMC1_CLK, (IEN | PTU | PDIS | M0)}, /* MMC1_CLK */
|
{GPMC_AD0, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_ad0.vin3a_d0 */
|
||||||
{MMC1_CMD, (IEN | PTU | PDIS | M0)}, /* MMC1_CMD */
|
{GPMC_AD1, (M2 | PIN_INPUT_PULLUP | MANUAL_MODE)}, /* gpmc_ad1.vin3a_d1 */
|
||||||
{MMC1_DAT0, (IEN | PTU | PDIS | M0)}, /* MMC1_DAT0 */
|
{GPMC_AD2, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_ad2.vin3a_d2 */
|
||||||
{MMC1_DAT1, (IEN | PTU | PDIS | M0)}, /* MMC1_DAT1 */
|
{GPMC_AD3, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_ad3.vin3a_d3 */
|
||||||
{MMC1_DAT2, (IEN | PTU | PDIS | M0)}, /* MMC1_DAT2 */
|
{GPMC_AD4, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_ad4.vin3a_d4 */
|
||||||
{MMC1_DAT3, (IEN | PTU | PDIS | M0)}, /* MMC1_DAT3 */
|
{GPMC_AD5, (M2 | PIN_INPUT_PULLUP | MANUAL_MODE)}, /* gpmc_ad5.vin3a_d5 */
|
||||||
{MMC1_SDCD, (FSC | IEN | PTU | PDIS | M0)}, /* MMC1_SDCD */
|
{GPMC_AD6, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_ad6.vin3a_d6 */
|
||||||
{MMC1_SDWP, (FSC | IEN | PTD | PEN | M14)}, /* MMC1_SDWP */
|
{GPMC_AD7, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_ad7.vin3a_d7 */
|
||||||
{GPMC_A19, (IEN | PTU | PDIS | M1)}, /* mmc2_dat4 */
|
{GPMC_AD8, (M2 | PIN_INPUT_PULLUP | MANUAL_MODE)}, /* gpmc_ad8.vin3a_d8 */
|
||||||
{GPMC_A20, (IEN | PTU | PDIS | M1)}, /* mmc2_dat5 */
|
{GPMC_AD9, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_ad9.vin3a_d9 */
|
||||||
{GPMC_A21, (IEN | PTU | PDIS | M1)}, /* mmc2_dat6 */
|
{GPMC_AD10, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_ad10.vin3a_d10 */
|
||||||
{GPMC_A22, (IEN | PTU | PDIS | M1)}, /* mmc2_dat7 */
|
{GPMC_AD11, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_ad11.vin3a_d11 */
|
||||||
{GPMC_A23, (IEN | PTU | PDIS | M1)}, /* mmc2_clk */
|
{GPMC_AD12, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_ad12.vin3a_d12 */
|
||||||
{GPMC_A24, (IEN | PTU | PDIS | M1)}, /* mmc2_dat0 */
|
{GPMC_AD13, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_ad13.vin3a_d13 */
|
||||||
{GPMC_A25, (IEN | PTU | PDIS | M1)}, /* mmc2_dat1 */
|
{GPMC_AD14, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_ad14.vin3a_d14 */
|
||||||
{GPMC_A26, (IEN | PTU | PDIS | M1)}, /* mmc2_dat2 */
|
{GPMC_AD15, (M2 | PIN_INPUT_PULLUP | MANUAL_MODE)}, /* gpmc_ad15.vin3a_d15 */
|
||||||
{GPMC_A27, (IEN | PTU | PDIS | M1)}, /* mmc2_dat3 */
|
{GPMC_A0, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_a0.vin3a_d16 */
|
||||||
{GPMC_CS1, (IEN | PTU | PDIS | M1)}, /* mmm2_cmd */
|
{GPMC_A1, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_a1.vin3a_d17 */
|
||||||
{UART2_CTSN, (FSC | IEN | PTU | PDIS | M2)}, /* uart2_ctsn.uart3_rxd */
|
{GPMC_A2, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_a2.vin3a_d18 */
|
||||||
{UART2_RTSN, (FSC | IEN | PTU | PDIS | M1)}, /* uart2_rtsn.uart3_txd */
|
{GPMC_A3, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_a3.vin3a_d19 */
|
||||||
{I2C1_SDA, (IEN | PTU | PDIS | M0)}, /* I2C1_SDA */
|
{GPMC_A4, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_a4.vin3a_d20 */
|
||||||
{I2C1_SCL, (IEN | PTU | PDIS | M0)}, /* I2C1_SCL */
|
{GPMC_A5, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_a5.vin3a_d21 */
|
||||||
{MDIO_MCLK, (PTU | PEN | M0)}, /* MDIO_MCLK */
|
{GPMC_A6, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_a6.vin3a_d22 */
|
||||||
{MDIO_D, (IEN | PTU | PEN | M0)}, /* MDIO_D */
|
{GPMC_A7, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_a7.vin3a_d23 */
|
||||||
{RGMII0_TXC, (M0) },
|
{GPMC_A8, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_a8.vin3a_hsync0 */
|
||||||
{RGMII0_TXCTL, (M0) },
|
{GPMC_A9, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_a9.vin3a_vsync0 */
|
||||||
{RGMII0_TXD3, (M0) },
|
{GPMC_A10, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_a10.vin3a_de0 */
|
||||||
{RGMII0_TXD2, (M0) },
|
{GPMC_A11, (M2 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* gpmc_a11.vin3a_fld0 */
|
||||||
{RGMII0_TXD1, (M0) },
|
{GPMC_A12, (M14 | PIN_INPUT_PULLUP)}, /* gpmc_a12.gpio2_2 */
|
||||||
{RGMII0_TXD0, (M0) },
|
{GPMC_A13, (M14 | PIN_INPUT_PULLDOWN)}, /* gpmc_a13.gpio2_3 */
|
||||||
{RGMII0_RXC, (IEN | M0) },
|
{GPMC_A14, (M14 | PIN_INPUT_PULLUP)}, /* gpmc_a14.gpio2_4 */
|
||||||
{RGMII0_RXCTL, (IEN | M0) },
|
{GPMC_A15, (M14 | PIN_INPUT_PULLDOWN)}, /* gpmc_a15.gpio2_5 */
|
||||||
{RGMII0_RXD3, (IEN | M0) },
|
{GPMC_A16, (M14 | PIN_INPUT_PULLDOWN)}, /* gpmc_a16.gpio2_6 */
|
||||||
{RGMII0_RXD2, (IEN | M0) },
|
{GPMC_A17, (M14 | PIN_INPUT_PULLDOWN)}, /* gpmc_a17.gpio2_7 */
|
||||||
{RGMII0_RXD1, (IEN | M0) },
|
{GPMC_A18, (M14 | PIN_INPUT_PULLUP)}, /* gpmc_a18.gpio2_8 */
|
||||||
{RGMII0_RXD0, (IEN | M0) },
|
{GPMC_A19, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a19.mmc2_dat4 */
|
||||||
{USB1_DRVVBUS, (M0 | FSC) },
|
{GPMC_A20, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a20.mmc2_dat5 */
|
||||||
{SPI1_CS1, (PEN | IDIS | M14) }, /* GPIO7_11 */
|
{GPMC_A21, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a21.mmc2_dat6 */
|
||||||
|
{GPMC_A22, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a22.mmc2_dat7 */
|
||||||
|
{GPMC_A23, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a23.mmc2_clk */
|
||||||
|
{GPMC_A24, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a24.mmc2_dat0 */
|
||||||
|
{GPMC_A25, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a25.mmc2_dat1 */
|
||||||
|
{GPMC_A26, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a26.mmc2_dat2 */
|
||||||
|
{GPMC_A27, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a27.mmc2_dat3 */
|
||||||
|
{GPMC_CS1, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_cs1.mmc2_cmd */
|
||||||
|
{GPMC_CS0, (M14 | PIN_INPUT_PULLDOWN)}, /* gpmc_cs0.gpio2_19 */
|
||||||
|
{GPMC_CS2, (M14 | PIN_INPUT_PULLUP)}, /* gpmc_cs2.gpio2_20 */
|
||||||
|
{GPMC_CS3, (M2 | PIN_INPUT_PULLDOWN)}, /* gpmc_cs3.vin3a_clk0 */
|
||||||
|
{GPMC_CLK, (M9 | PIN_INPUT_PULLDOWN)}, /* gpmc_clk.dma_evt1 */
|
||||||
|
{GPMC_ADVN_ALE, (M14 | PIN_INPUT_PULLUP)}, /* gpmc_advn_ale.gpio2_23 */
|
||||||
|
{GPMC_OEN_REN, (M14 | PIN_INPUT_PULLUP)}, /* gpmc_oen_ren.gpio2_24 */
|
||||||
|
{GPMC_WEN, (M14 | PIN_INPUT_PULLUP)}, /* gpmc_wen.gpio2_25 */
|
||||||
|
{GPMC_BEN0, (M9 | PIN_INPUT_PULLDOWN)}, /* gpmc_ben0.dma_evt3 */
|
||||||
|
{GPMC_BEN1, (M9 | PIN_INPUT_PULLDOWN)}, /* gpmc_ben1.dma_evt4 */
|
||||||
|
{GPMC_WAIT0, (M14 | PIN_INPUT_PULLUP)}, /* gpmc_wait0.gpio2_28 */
|
||||||
|
{VIN1B_CLK1, (M14 | PIN_INPUT_SLEW)}, /* vin1b_clk1.gpio2_31 */
|
||||||
|
{VIN1A_D2, (M14 | PIN_INPUT_PULLDOWN)}, /* vin1a_d2.gpio3_6 */
|
||||||
|
{VIN1A_D3, (M14 | PIN_INPUT_PULLDOWN)}, /* vin1a_d3.gpio3_7 */
|
||||||
|
{VIN1A_D4, (M14 | PIN_INPUT_PULLDOWN)}, /* vin1a_d4.gpio3_8 */
|
||||||
|
{VIN1A_D5, (M14 | PIN_INPUT_PULLDOWN)}, /* vin1a_d5.gpio3_9 */
|
||||||
|
{VIN1A_D6, (M14 | PIN_INPUT_PULLDOWN)}, /* vin1a_d6.gpio3_10 */
|
||||||
|
{VIN1A_D7, (M14 | PIN_INPUT_PULLDOWN)}, /* vin1a_d7.gpio3_11 */
|
||||||
|
{VIN1A_D8, (M14 | PIN_INPUT_PULLDOWN)}, /* vin1a_d8.gpio3_12 */
|
||||||
|
{VIN1A_D10, (M14 | PIN_INPUT_PULLDOWN)}, /* vin1a_d10.gpio3_14 */
|
||||||
|
{VIN1A_D11, (M14 | PIN_INPUT_PULLDOWN)}, /* vin1a_d11.gpio3_15 */
|
||||||
|
{VIN1A_D12, (M14 | PIN_INPUT_PULLDOWN)}, /* vin1a_d12.gpio3_16 */
|
||||||
|
{VIN1A_D14, (M14 | PIN_INPUT_PULLDOWN)}, /* vin1a_d14.gpio3_18 */
|
||||||
|
{VIN1A_D16, (M14 | PIN_INPUT_PULLDOWN)}, /* vin1a_d16.gpio3_20 */
|
||||||
|
{VIN1A_D19, (M14 | PIN_INPUT_PULLDOWN)}, /* vin1a_d19.gpio3_23 */
|
||||||
|
{VIN1A_D20, (M14 | PIN_INPUT_PULLDOWN)}, /* vin1a_d20.gpio3_24 */
|
||||||
|
{VIN1A_D21, (M0 | PIN_INPUT_PULLDOWN)}, /* vin1a_d21.vin1a_d21 */
|
||||||
|
{VIN1A_D22, (M14 | PIN_INPUT_PULLDOWN)}, /* vin1a_d22.gpio3_26 */
|
||||||
|
{VIN2A_CLK0, (M14 | PIN_INPUT_PULLDOWN)}, /* vin2a_clk0.gpio3_28 */
|
||||||
|
{VIN2A_DE0, (M14 | PIN_INPUT_PULLDOWN)}, /* vin2a_de0.gpio3_29 */
|
||||||
|
{VIN2A_FLD0, (M14 | PIN_INPUT_PULLDOWN)}, /* vin2a_fld0.gpio3_30 */
|
||||||
|
{VIN2A_HSYNC0, (M11 | PIN_INPUT_PULLDOWN)}, /* vin2a_hsync0.pr1_uart0_cts_n */
|
||||||
|
{VIN2A_VSYNC0, (M11 | PIN_INPUT_PULLUP)}, /* vin2a_vsync0.pr1_uart0_rts_n */
|
||||||
|
{VIN2A_D0, (M11 | PIN_INPUT_PULLDOWN)}, /* vin2a_d0.pr1_uart0_rxd */
|
||||||
|
{VIN2A_D1, (M11 | PIN_INPUT_PULLDOWN)}, /* vin2a_d1.pr1_uart0_txd */
|
||||||
|
{VIN2A_D2, (M8 | PIN_INPUT_PULLDOWN)}, /* vin2a_d2.uart10_rxd */
|
||||||
|
{VIN2A_D3, (M8 | PIN_INPUT_PULLDOWN)}, /* vin2a_d3.uart10_txd */
|
||||||
|
{VIN2A_D4, (M8 | PIN_INPUT_PULLDOWN)}, /* vin2a_d4.uart10_ctsn */
|
||||||
|
{VIN2A_D5, (M8 | PIN_INPUT_PULLDOWN)}, /* vin2a_d5.uart10_rtsn */
|
||||||
|
{VIN2A_D6, (M14 | PIN_INPUT_PULLDOWN)}, /* vin2a_d6.gpio4_7 */
|
||||||
|
{VIN2A_D7, (M14 | PIN_INPUT_PULLDOWN)}, /* vin2a_d7.gpio4_8 */
|
||||||
|
{VIN2A_D8, (M14 | PIN_INPUT_PULLDOWN)}, /* vin2a_d8.gpio4_9 */
|
||||||
|
{VIN2A_D9, (M14 | PIN_INPUT_PULLDOWN)}, /* vin2a_d9.gpio4_10 */
|
||||||
|
{VIN2A_D10, (M10 | PIN_INPUT_PULLDOWN)}, /* vin2a_d10.ehrpwm2B */
|
||||||
|
{VIN2A_D11, (M10 | PIN_INPUT_PULLDOWN)}, /* vin2a_d11.ehrpwm2_tripzone_input */
|
||||||
|
{VIN2A_D12, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d12.rgmii1_txc */
|
||||||
|
{VIN2A_D13, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d13.rgmii1_txctl */
|
||||||
|
{VIN2A_D14, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d14.rgmii1_txd3 */
|
||||||
|
{VIN2A_D15, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d15.rgmii1_txd2 */
|
||||||
|
{VIN2A_D16, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d16.rgmii1_txd1 */
|
||||||
|
{VIN2A_D17, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d17.rgmii1_txd0 */
|
||||||
|
{VIN2A_D18, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d18.rgmii1_rxc */
|
||||||
|
{VIN2A_D19, (M3 | PIN_INPUT_PULLUP | MANUAL_MODE)}, /* vin2a_d19.rgmii1_rxctl */
|
||||||
|
{VIN2A_D20, (M3 | PIN_INPUT_PULLUP | MANUAL_MODE)}, /* vin2a_d20.rgmii1_rxd3 */
|
||||||
|
{VIN2A_D21, (M3 | PIN_INPUT_PULLUP | MANUAL_MODE)}, /* vin2a_d21.rgmii1_rxd2 */
|
||||||
|
{VIN2A_D22, (M3 | PIN_INPUT_PULLUP | MANUAL_MODE)}, /* vin2a_d22.rgmii1_rxd1 */
|
||||||
|
{VIN2A_D23, (M3 | PIN_INPUT_PULLUP | MANUAL_MODE)}, /* vin2a_d23.rgmii1_rxd0 */
|
||||||
|
{VOUT1_CLK, (M0 | PIN_OUTPUT)}, /* vout1_clk.vout1_clk */
|
||||||
|
{VOUT1_DE, (M0 | PIN_OUTPUT)}, /* vout1_de.vout1_de */
|
||||||
|
{VOUT1_FLD, (M14 | PIN_INPUT)}, /* vout1_fld.gpio4_21 */
|
||||||
|
{VOUT1_HSYNC, (M0 | PIN_OUTPUT)}, /* vout1_hsync.vout1_hsync */
|
||||||
|
{VOUT1_VSYNC, (M0 | PIN_OUTPUT)}, /* vout1_vsync.vout1_vsync */
|
||||||
|
{VOUT1_D0, (M0 | PIN_OUTPUT)}, /* vout1_d0.vout1_d0 */
|
||||||
|
{VOUT1_D1, (M0 | PIN_OUTPUT)}, /* vout1_d1.vout1_d1 */
|
||||||
|
{VOUT1_D2, (M0 | PIN_OUTPUT)}, /* vout1_d2.vout1_d2 */
|
||||||
|
{VOUT1_D3, (M0 | PIN_OUTPUT)}, /* vout1_d3.vout1_d3 */
|
||||||
|
{VOUT1_D4, (M0 | PIN_OUTPUT)}, /* vout1_d4.vout1_d4 */
|
||||||
|
{VOUT1_D5, (M0 | PIN_OUTPUT)}, /* vout1_d5.vout1_d5 */
|
||||||
|
{VOUT1_D6, (M0 | PIN_OUTPUT)}, /* vout1_d6.vout1_d6 */
|
||||||
|
{VOUT1_D7, (M0 | PIN_OUTPUT)}, /* vout1_d7.vout1_d7 */
|
||||||
|
{VOUT1_D8, (M0 | PIN_OUTPUT)}, /* vout1_d8.vout1_d8 */
|
||||||
|
{VOUT1_D9, (M0 | PIN_OUTPUT)}, /* vout1_d9.vout1_d9 */
|
||||||
|
{VOUT1_D10, (M0 | PIN_OUTPUT)}, /* vout1_d10.vout1_d10 */
|
||||||
|
{VOUT1_D11, (M0 | PIN_OUTPUT)}, /* vout1_d11.vout1_d11 */
|
||||||
|
{VOUT1_D12, (M0 | PIN_OUTPUT)}, /* vout1_d12.vout1_d12 */
|
||||||
|
{VOUT1_D13, (M0 | PIN_OUTPUT)}, /* vout1_d13.vout1_d13 */
|
||||||
|
{VOUT1_D14, (M0 | PIN_OUTPUT)}, /* vout1_d14.vout1_d14 */
|
||||||
|
{VOUT1_D15, (M0 | PIN_OUTPUT)}, /* vout1_d15.vout1_d15 */
|
||||||
|
{VOUT1_D16, (M0 | PIN_OUTPUT)}, /* vout1_d16.vout1_d16 */
|
||||||
|
{VOUT1_D17, (M0 | PIN_OUTPUT)}, /* vout1_d17.vout1_d17 */
|
||||||
|
{VOUT1_D18, (M0 | PIN_OUTPUT)}, /* vout1_d18.vout1_d18 */
|
||||||
|
{VOUT1_D19, (M0 | PIN_OUTPUT)}, /* vout1_d19.vout1_d19 */
|
||||||
|
{VOUT1_D20, (M0 | PIN_OUTPUT)}, /* vout1_d20.vout1_d20 */
|
||||||
|
{VOUT1_D21, (M0 | PIN_OUTPUT)}, /* vout1_d21.vout1_d21 */
|
||||||
|
{VOUT1_D22, (M0 | PIN_OUTPUT)}, /* vout1_d22.vout1_d22 */
|
||||||
|
{VOUT1_D23, (M0 | PIN_OUTPUT)}, /* vout1_d23.vout1_d23 */
|
||||||
|
{MDIO_MCLK, (M0 | PIN_INPUT_PULLUP)}, /* mdio_mclk.mdio_mclk */
|
||||||
|
{MDIO_D, (M0 | PIN_INPUT_PULLUP)}, /* mdio_d.mdio_d */
|
||||||
|
{RMII_MHZ_50_CLK, (M14 | PIN_INPUT_PULLUP)}, /* RMII_MHZ_50_CLK.gpio5_17 */
|
||||||
|
{UART3_RXD, (M14 | PIN_INPUT_PULLDOWN)}, /* uart3_rxd.gpio5_18 */
|
||||||
|
{UART3_TXD, (M14 | PIN_INPUT_PULLDOWN)}, /* uart3_txd.gpio5_19 */
|
||||||
|
{RGMII0_TXC, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_txc.rgmii0_txc */
|
||||||
|
{RGMII0_TXCTL, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_txctl.rgmii0_txctl */
|
||||||
|
{RGMII0_TXD3, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_txd3.rgmii0_txd3 */
|
||||||
|
{RGMII0_TXD2, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_txd2.rgmii0_txd2 */
|
||||||
|
{RGMII0_TXD1, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_txd1.rgmii0_txd1 */
|
||||||
|
{RGMII0_TXD0, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_txd0.rgmii0_txd0 */
|
||||||
|
{RGMII0_RXC, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_rxc.rgmii0_rxc */
|
||||||
|
{RGMII0_RXCTL, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_rxctl.rgmii0_rxctl */
|
||||||
|
{RGMII0_RXD3, (M0 | PIN_INPUT_PULLUP | MANUAL_MODE)}, /* rgmii0_rxd3.rgmii0_rxd3 */
|
||||||
|
{RGMII0_RXD2, (M0 | PIN_INPUT_PULLUP | MANUAL_MODE)}, /* rgmii0_rxd2.rgmii0_rxd2 */
|
||||||
|
{RGMII0_RXD1, (M0 | PIN_INPUT_PULLUP | MANUAL_MODE)}, /* rgmii0_rxd1.rgmii0_rxd1 */
|
||||||
|
{RGMII0_RXD0, (M0 | PIN_INPUT_PULLUP | MANUAL_MODE)}, /* rgmii0_rxd0.rgmii0_rxd0 */
|
||||||
|
{USB1_DRVVBUS, (M0 | PIN_INPUT_SLEW)}, /* usb1_drvvbus.usb1_drvvbus */
|
||||||
|
{USB2_DRVVBUS, (M0 | PIN_INPUT_SLEW)}, /* usb2_drvvbus.usb2_drvvbus */
|
||||||
|
{GPIO6_14, (M10 | PIN_INPUT_PULLUP)}, /* gpio6_14.timer1 */
|
||||||
|
{GPIO6_15, (M10 | PIN_INPUT_PULLUP)}, /* gpio6_15.timer2 */
|
||||||
|
{GPIO6_16, (M10 | PIN_INPUT_PULLUP)}, /* gpio6_16.timer3 */
|
||||||
|
{XREF_CLK0, (M9 | PIN_INPUT_PULLDOWN)}, /* xref_clk0.clkout2 */
|
||||||
|
{XREF_CLK1, (M14 | PIN_INPUT_PULLDOWN)}, /* xref_clk1.gpio6_18 */
|
||||||
|
{XREF_CLK2, (M14 | PIN_INPUT_PULLDOWN)}, /* xref_clk2.gpio6_19 */
|
||||||
|
{XREF_CLK3, (M9 | PIN_INPUT_PULLDOWN)}, /* xref_clk3.clkout3 */
|
||||||
|
{MCASP1_ACLKX, (M10 | PIN_INPUT_PULLUP)}, /* mcasp1_aclkx.i2c3_sda */
|
||||||
|
{MCASP1_FSX, (M10 | PIN_INPUT_PULLUP)}, /* mcasp1_fsx.i2c3_scl */
|
||||||
|
{MCASP1_ACLKR, (M10 | PIN_INPUT_PULLUP)}, /* mcasp1_aclkr.i2c4_sda */
|
||||||
|
{MCASP1_FSR, (M10 | PIN_INPUT_PULLUP)}, /* mcasp1_fsr.i2c4_scl */
|
||||||
|
{MCASP1_AXR0, (M10 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* mcasp1_axr0.i2c5_sda */
|
||||||
|
{MCASP1_AXR1, (M10 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* mcasp1_axr1.i2c5_scl */
|
||||||
|
{MCASP1_AXR2, (M14 | PIN_INPUT_PULLDOWN)}, /* mcasp1_axr2.gpio5_4 */
|
||||||
|
{MCASP1_AXR3, (M14 | PIN_INPUT_PULLDOWN)}, /* mcasp1_axr3.gpio5_5 */
|
||||||
|
{MCASP1_AXR4, (M14 | PIN_INPUT_PULLDOWN)}, /* mcasp1_axr4.gpio5_6 */
|
||||||
|
{MCASP1_AXR5, (M14 | PIN_INPUT_PULLDOWN)}, /* mcasp1_axr5.gpio5_7 */
|
||||||
|
{MCASP1_AXR6, (M14 | PIN_INPUT_PULLDOWN)}, /* mcasp1_axr6.gpio5_8 */
|
||||||
|
{MCASP1_AXR7, (M14 | PIN_INPUT_PULLDOWN)}, /* mcasp1_axr7.gpio5_9 */
|
||||||
|
{MCASP1_AXR8, (M14 | PIN_INPUT_SLEW)}, /* mcasp1_axr8.gpio5_10 */
|
||||||
|
{MCASP1_AXR9, (M14 | PIN_INPUT_SLEW)}, /* mcasp1_axr9.gpio5_11 */
|
||||||
|
{MCASP1_AXR10, (M14 | PIN_INPUT_SLEW)}, /* mcasp1_axr10.gpio5_12 */
|
||||||
|
{MCASP1_AXR11, (M14 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* mcasp1_axr11.gpio4_17 */
|
||||||
|
{MCASP1_AXR12, (M1 | PIN_INPUT_SLEW)}, /* mcasp1_axr12.mcasp7_axr0 */
|
||||||
|
{MCASP1_AXR13, (M1 | PIN_INPUT_SLEW)}, /* mcasp1_axr13.mcasp7_axr1 */
|
||||||
|
{MCASP1_AXR14, (M1 | PIN_INPUT_SLEW)}, /* mcasp1_axr14.mcasp7_aclkx */
|
||||||
|
{MCASP1_AXR15, (M1 | PIN_INPUT_SLEW)}, /* mcasp1_axr15.mcasp7_fsx */
|
||||||
|
{MCASP2_ACLKX, (M0 | PIN_INPUT_PULLDOWN)}, /* mcasp2_aclkx.mcasp2_aclkx */
|
||||||
|
{MCASP2_FSX, (M0 | PIN_INPUT_SLEW)}, /* mcasp2_fsx.mcasp2_fsx */
|
||||||
|
{MCASP2_ACLKR, (M0 | PIN_INPUT_PULLDOWN)}, /* mcasp2_aclkr.mcasp2_aclkr */
|
||||||
|
{MCASP2_FSR, (M0 | PIN_INPUT_PULLDOWN)}, /* mcasp2_fsr.mcasp2_fsr */
|
||||||
|
{MCASP2_AXR0, (M0 | PIN_INPUT_PULLDOWN)}, /* mcasp2_axr0.mcasp2_axr0 */
|
||||||
|
{MCASP2_AXR1, (M0 | PIN_INPUT_PULLDOWN)}, /* mcasp2_axr1.mcasp2_axr1 */
|
||||||
|
{MCASP2_AXR2, (M0 | PIN_INPUT_SLEW)}, /* mcasp2_axr2.mcasp2_axr2 */
|
||||||
|
{MCASP2_AXR3, (M0 | PIN_INPUT_SLEW)}, /* mcasp2_axr3.mcasp2_axr3 */
|
||||||
|
{MCASP2_AXR4, (M0 | PIN_INPUT_PULLDOWN)}, /* mcasp2_axr4.mcasp2_axr4 */
|
||||||
|
{MCASP2_AXR5, (M0 | PIN_INPUT_PULLDOWN)}, /* mcasp2_axr5.mcasp2_axr5 */
|
||||||
|
{MCASP2_AXR6, (M0 | PIN_INPUT_PULLDOWN)}, /* mcasp2_axr6.mcasp2_axr6 */
|
||||||
|
{MCASP2_AXR7, (M0 | PIN_INPUT_PULLDOWN)}, /* mcasp2_axr7.mcasp2_axr7 */
|
||||||
|
{MCASP3_ACLKX, (M0 | PIN_INPUT_PULLDOWN)}, /* mcasp3_aclkx.mcasp3_aclkx */
|
||||||
|
{MCASP3_FSX, (M0 | PIN_INPUT_PULLDOWN)}, /* mcasp3_fsx.mcasp3_fsx */
|
||||||
|
{MCASP3_AXR0, (M0 | PIN_INPUT_PULLDOWN)}, /* mcasp3_axr0.mcasp3_axr0 */
|
||||||
|
{MCASP3_AXR1, (M0 | PIN_INPUT_PULLDOWN)}, /* mcasp3_axr1.mcasp3_axr1 */
|
||||||
|
{MCASP4_ACLKX, (M3 | PIN_INPUT_PULLDOWN)}, /* mcasp4_aclkx.uart8_rxd */
|
||||||
|
{MCASP4_FSX, (M3 | PIN_INPUT_PULLDOWN)}, /* mcasp4_fsx.uart8_txd */
|
||||||
|
{MCASP4_AXR0, (M3 | PIN_INPUT_PULLDOWN)}, /* mcasp4_axr0.uart8_ctsn */
|
||||||
|
{MCASP4_AXR1, (M3 | PIN_INPUT_PULLUP)}, /* mcasp4_axr1.uart8_rtsn */
|
||||||
|
{MCASP5_ACLKX, (M3 | PIN_INPUT_PULLDOWN)}, /* mcasp5_aclkx.uart9_rxd */
|
||||||
|
{MCASP5_FSX, (M3 | PIN_INPUT_PULLDOWN)}, /* mcasp5_fsx.uart9_txd */
|
||||||
|
{MCASP5_AXR0, (M3 | PIN_INPUT_PULLDOWN)}, /* mcasp5_axr0.uart9_ctsn */
|
||||||
|
{MCASP5_AXR1, (M3 | PIN_INPUT_PULLUP)}, /* mcasp5_axr1.uart9_rtsn */
|
||||||
|
{MMC1_CLK, (M0 | PIN_INPUT_PULLUP)}, /* mmc1_clk.mmc1_clk */
|
||||||
|
{MMC1_CMD, (M0 | PIN_INPUT_PULLUP)}, /* mmc1_cmd.mmc1_cmd */
|
||||||
|
{MMC1_DAT0, (M0 | PIN_INPUT_PULLUP)}, /* mmc1_dat0.mmc1_dat0 */
|
||||||
|
{MMC1_DAT1, (M0 | PIN_INPUT_PULLUP)}, /* mmc1_dat1.mmc1_dat1 */
|
||||||
|
{MMC1_DAT2, (M0 | PIN_INPUT_PULLUP)}, /* mmc1_dat2.mmc1_dat2 */
|
||||||
|
{MMC1_DAT3, (M0 | PIN_INPUT_PULLUP)}, /* mmc1_dat3.mmc1_dat3 */
|
||||||
|
{MMC1_SDCD, (M0 | PIN_INPUT_PULLUP)}, /* mmc1_sdcd.mmc1_sdcd */
|
||||||
|
{MMC1_SDWP, (M14 | PIN_OUTPUT)}, /* mmc1_sdwp.gpio6_28 */
|
||||||
|
{GPIO6_10, (M10 | PIN_INPUT_PULLDOWN)}, /* gpio6_10.ehrpwm2A */
|
||||||
|
{GPIO6_11, (M14 | PIN_INPUT_PULLUP)}, /* gpio6_11.gpio6_11 */
|
||||||
|
{MMC3_CLK, (M0 | PIN_INPUT_PULLUP)}, /* mmc3_clk.mmc3_clk */
|
||||||
|
{MMC3_CMD, (M0 | PIN_INPUT_PULLUP)}, /* mmc3_cmd.mmc3_cmd */
|
||||||
|
{MMC3_DAT0, (M0 | PIN_INPUT_PULLUP)}, /* mmc3_dat0.mmc3_dat0 */
|
||||||
|
{MMC3_DAT1, (M0 | PIN_INPUT_PULLUP)}, /* mmc3_dat1.mmc3_dat1 */
|
||||||
|
{MMC3_DAT2, (M0 | PIN_INPUT_PULLUP)}, /* mmc3_dat2.mmc3_dat2 */
|
||||||
|
{MMC3_DAT3, (M0 | PIN_INPUT_PULLUP)}, /* mmc3_dat3.mmc3_dat3 */
|
||||||
|
{MMC3_DAT4, (M1 | PIN_INPUT_PULLDOWN)}, /* mmc3_dat4.spi4_sclk */
|
||||||
|
{MMC3_DAT5, (M1 | PIN_INPUT_PULLDOWN)}, /* mmc3_dat5.spi4_d1 */
|
||||||
|
{MMC3_DAT6, (M1 | PIN_INPUT_PULLDOWN)}, /* mmc3_dat6.spi4_d0 */
|
||||||
|
{MMC3_DAT7, (M1 | PIN_INPUT_PULLUP)}, /* mmc3_dat7.spi4_cs0 */
|
||||||
|
{SPI1_SCLK, (M14 | PIN_INPUT_PULLDOWN)}, /* spi1_sclk.gpio7_7 */
|
||||||
|
{SPI1_D1, (M14 | PIN_INPUT_PULLDOWN)}, /* spi1_d1.gpio7_8 */
|
||||||
|
{SPI1_D0, (M14 | PIN_INPUT_PULLDOWN)}, /* spi1_d0.gpio7_9 */
|
||||||
|
{SPI1_CS0, (M14 | PIN_OUTPUT)}, /* spi1_cs0.gpio7_10 */
|
||||||
|
{SPI1_CS1, (M14 | PIN_OUTPUT_PULLUP)}, /* spi1_cs1.gpio7_11 */
|
||||||
|
{SPI1_CS2, (M14 | PIN_INPUT_PULLDOWN)}, /* spi1_cs2.gpio7_12 */
|
||||||
|
{SPI1_CS3, (M6 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* spi1_cs3.hdmi1_cec */
|
||||||
|
{SPI2_SCLK, (M14 | PIN_INPUT_PULLDOWN)}, /* spi2_sclk.gpio7_14 */
|
||||||
|
{SPI2_D1, (M14 | PIN_INPUT_PULLDOWN)}, /* spi2_d1.gpio7_15 */
|
||||||
|
{SPI2_D0, (M14 | PIN_INPUT_PULLUP)}, /* spi2_d0.gpio7_16 */
|
||||||
|
{SPI2_CS0, (M14 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* spi2_cs0.gpio7_17 */
|
||||||
|
{DCAN1_TX, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* dcan1_tx.dcan1_tx */
|
||||||
|
{DCAN1_RX, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* dcan1_rx.dcan1_rx */
|
||||||
|
{UART1_RXD, (M0 | PIN_INPUT_SLEW)}, /* uart1_rxd.uart1_rxd */
|
||||||
|
{UART1_TXD, (M0 | PIN_INPUT_SLEW)}, /* uart1_txd.uart1_txd */
|
||||||
|
{UART1_CTSN, (M15 | PIN_INPUT_PULLDOWN)}, /* uart1_ctsn.Driveroff */
|
||||||
|
{UART2_RXD, (M15 | PIN_INPUT_PULLDOWN)}, /* N/A.Driveroff */
|
||||||
|
{UART2_TXD, (M15 | PIN_INPUT_PULLDOWN)}, /* uart2_txd.Driveroff */
|
||||||
|
{UART2_CTSN, (M2 | PIN_INPUT_SLEW)}, /* uart2_ctsn.uart3_rxd */
|
||||||
|
{UART2_RTSN, (M1 | PIN_INPUT_SLEW)}, /* uart2_rtsn.uart3_txd */
|
||||||
|
{I2C2_SDA, (M1 | PIN_INPUT)}, /* i2c2_sda.hdmi1_ddc_scl */
|
||||||
|
{I2C2_SCL, (M1 | PIN_INPUT)}, /* i2c2_scl.hdmi1_ddc_sda */
|
||||||
|
{WAKEUP0, (M0 | PIN_OUTPUT_PULLUP)}, /* Wakeup0.Wakeup0 */
|
||||||
|
{WAKEUP1, (M0 | PIN_OUTPUT_PULLDOWN)}, /* Wakeup1.Wakeup1 */
|
||||||
|
{WAKEUP2, (M0 | PIN_OUTPUT_PULLDOWN)}, /* Wakeup2.Wakeup2 */
|
||||||
|
{WAKEUP3, (M0 | PIN_OUTPUT_PULLUP)}, /* Wakeup3.Wakeup3 */
|
||||||
|
{ON_OFF, (M1 | PIN_OUTPUT_PULLUP)}, /* on_off.on_off */
|
||||||
|
{RTC_PORZ, (M0 | PIN_OUTPUT_PULLDOWN)}, /* rtc_porz.rtc_porz */
|
||||||
|
{RTCK, (M0 | PIN_INPUT_PULLDOWN)}, /* rtck.rtck */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const struct pad_conf_entry early_padconf[] = {
|
||||||
|
{UART2_CTSN, (M2 | PIN_INPUT_SLEW)}, /* uart2_ctsn.uart3_rxd */
|
||||||
|
{UART2_RTSN, (M1 | PIN_INPUT_SLEW)}, /* uart2_rtsn.uart3_txd */
|
||||||
|
{I2C1_SDA, (PIN_INPUT_PULLUP | M0)}, /* I2C1_SDA */
|
||||||
|
{I2C1_SCL, (PIN_INPUT_PULLUP | M0)}, /* I2C1_SCL */
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_IODELAY_RECALIBRATION
|
||||||
|
const struct iodelay_cfg_entry iodelay_cfg_array[] = {
|
||||||
|
{0x0114, 2980, 0}, /* CFG_GPMC_A0_IN */
|
||||||
|
{0x0120, 2648, 0}, /* CFG_GPMC_A10_IN */
|
||||||
|
{0x012C, 2918, 0}, /* CFG_GPMC_A11_IN */
|
||||||
|
{0x0198, 2917, 0}, /* CFG_GPMC_A1_IN */
|
||||||
|
{0x0204, 3156, 178}, /* CFG_GPMC_A2_IN */
|
||||||
|
{0x0210, 3109, 246}, /* CFG_GPMC_A3_IN */
|
||||||
|
{0x021C, 3142, 100}, /* CFG_GPMC_A4_IN */
|
||||||
|
{0x0228, 3084, 33}, /* CFG_GPMC_A5_IN */
|
||||||
|
{0x0234, 2778, 0}, /* CFG_GPMC_A6_IN */
|
||||||
|
{0x0240, 3110, 0}, /* CFG_GPMC_A7_IN */
|
||||||
|
{0x024C, 2874, 0}, /* CFG_GPMC_A8_IN */
|
||||||
|
{0x0258, 3072, 0}, /* CFG_GPMC_A9_IN */
|
||||||
|
{0x0264, 2466, 0}, /* CFG_GPMC_AD0_IN */
|
||||||
|
{0x0270, 2523, 0}, /* CFG_GPMC_AD10_IN */
|
||||||
|
{0x027C, 2453, 0}, /* CFG_GPMC_AD11_IN */
|
||||||
|
{0x0288, 2285, 0}, /* CFG_GPMC_AD12_IN */
|
||||||
|
{0x0294, 2206, 0}, /* CFG_GPMC_AD13_IN */
|
||||||
|
{0x02A0, 1898, 0}, /* CFG_GPMC_AD14_IN */
|
||||||
|
{0x02AC, 2473, 0}, /* CFG_GPMC_AD15_IN */
|
||||||
|
{0x02B8, 2307, 0}, /* CFG_GPMC_AD1_IN */
|
||||||
|
{0x02C4, 2691, 0}, /* CFG_GPMC_AD2_IN */
|
||||||
|
{0x02D0, 2384, 0}, /* CFG_GPMC_AD3_IN */
|
||||||
|
{0x02DC, 2462, 0}, /* CFG_GPMC_AD4_IN */
|
||||||
|
{0x02E8, 2335, 0}, /* CFG_GPMC_AD5_IN */
|
||||||
|
{0x02F4, 2370, 0}, /* CFG_GPMC_AD6_IN */
|
||||||
|
{0x0300, 2389, 0}, /* CFG_GPMC_AD7_IN */
|
||||||
|
{0x030C, 2672, 0}, /* CFG_GPMC_AD8_IN */
|
||||||
|
{0x0318, 2334, 0}, /* CFG_GPMC_AD9_IN */
|
||||||
|
{0x06F0, 480, 0}, /* CFG_RGMII0_RXC_IN */
|
||||||
|
{0x06FC, 111, 1641}, /* CFG_RGMII0_RXCTL_IN */
|
||||||
|
{0x0708, 272, 1116}, /* CFG_RGMII0_RXD0_IN */
|
||||||
|
{0x0714, 243, 1260}, /* CFG_RGMII0_RXD1_IN */
|
||||||
|
{0x0720, 0, 1614}, /* CFG_RGMII0_RXD2_IN */
|
||||||
|
{0x072C, 105, 1673}, /* CFG_RGMII0_RXD3_IN */
|
||||||
|
{0x0740, 531, 120}, /* CFG_RGMII0_TXC_OUT */
|
||||||
|
{0x074C, 11, 60}, /* CFG_RGMII0_TXCTL_OUT */
|
||||||
|
{0x0758, 7, 120}, /* CFG_RGMII0_TXD0_OUT */
|
||||||
|
{0x0764, 0, 0}, /* CFG_RGMII0_TXD1_OUT */
|
||||||
|
{0x0770, 276, 120}, /* CFG_RGMII0_TXD2_OUT */
|
||||||
|
{0x077C, 440, 120}, /* CFG_RGMII0_TXD3_OUT */
|
||||||
|
{0x0A70, 1551, 115}, /* CFG_VIN2A_D12_OUT */
|
||||||
|
{0x0A7C, 816, 0}, /* CFG_VIN2A_D13_OUT */
|
||||||
|
{0x0A88, 876, 0}, /* CFG_VIN2A_D14_OUT */
|
||||||
|
{0x0A94, 312, 0}, /* CFG_VIN2A_D15_OUT */
|
||||||
|
{0x0AA0, 58, 0}, /* CFG_VIN2A_D16_OUT */
|
||||||
|
{0x0AAC, 0, 0}, /* CFG_VIN2A_D17_OUT */
|
||||||
|
{0x0AB0, 702, 0}, /* CFG_VIN2A_D18_IN */
|
||||||
|
{0x0ABC, 136, 976}, /* CFG_VIN2A_D19_IN */
|
||||||
|
{0x0AD4, 210, 1357}, /* CFG_VIN2A_D20_IN */
|
||||||
|
{0x0AE0, 189, 1462}, /* CFG_VIN2A_D21_IN */
|
||||||
|
{0x0AEC, 232, 1278}, /* CFG_VIN2A_D22_IN */
|
||||||
|
{0x0AF8, 0, 1397}, /* CFG_VIN2A_D23_IN */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
#endif /* _MUX_DATA_BEAGLE_X15_H_ */
|
#endif /* _MUX_DATA_BEAGLE_X15_H_ */
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include <usb.h>
|
#include <usb.h>
|
||||||
#include <linux/usb/gadget.h>
|
#include <linux/usb/gadget.h>
|
||||||
#include <asm/arch/gpio.h>
|
#include <asm/arch/gpio.h>
|
||||||
|
#include <asm/arch/dra7xx_iodelay.h>
|
||||||
#include <asm/arch/sys_proto.h>
|
#include <asm/arch/sys_proto.h>
|
||||||
#include <asm/arch/mmc_host_def.h>
|
#include <asm/arch/mmc_host_def.h>
|
||||||
#include <asm/arch/sata.h>
|
#include <asm/arch/sata.h>
|
||||||
@ -40,43 +41,6 @@ const struct omap_sysinfo sysinfo = {
|
|||||||
"Board: DRA7xx\n"
|
"Board: DRA7xx\n"
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* Adjust I/O delays on the Tx control and data lines of each MAC port. This
|
|
||||||
* is a workaround in order to work properly with the DP83865 PHYs on the EVM.
|
|
||||||
* In 3COM RGMII mode this PHY applies it's own internal clock delay, so we
|
|
||||||
* essentially need to counteract the DRA7xx internal delay, and we do this
|
|
||||||
* by delaying the control and data lines. If not using this PHY, you probably
|
|
||||||
* don't need to do this stuff!
|
|
||||||
*/
|
|
||||||
static void dra7xx_adj_io_delay(const struct io_delay *io_dly)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
u32 reg_val;
|
|
||||||
u32 delta;
|
|
||||||
u32 coarse;
|
|
||||||
u32 fine;
|
|
||||||
|
|
||||||
writel(CFG_IO_DELAY_UNLOCK_KEY, CFG_IO_DELAY_LOCK);
|
|
||||||
|
|
||||||
while(io_dly[i].addr) {
|
|
||||||
writel(CFG_IO_DELAY_ACCESS_PATTERN & ~CFG_IO_DELAY_LOCK_MASK,
|
|
||||||
io_dly[i].addr);
|
|
||||||
delta = io_dly[i].dly;
|
|
||||||
reg_val = readl(io_dly[i].addr) & 0x3ff;
|
|
||||||
coarse = ((reg_val >> 5) & 0x1F) + ((delta >> 5) & 0x1F);
|
|
||||||
coarse = (coarse > 0x1F) ? (0x1F) : (coarse);
|
|
||||||
fine = (reg_val & 0x1F) + (delta & 0x1F);
|
|
||||||
fine = (fine > 0x1F) ? (0x1F) : (fine);
|
|
||||||
reg_val = CFG_IO_DELAY_ACCESS_PATTERN |
|
|
||||||
CFG_IO_DELAY_LOCK_MASK |
|
|
||||||
((coarse << 5) | (fine));
|
|
||||||
writel(reg_val, io_dly[i].addr);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
writel(CFG_IO_DELAY_LOCK_KEY, CFG_IO_DELAY_LOCK);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief board_init
|
* @brief board_init
|
||||||
*
|
*
|
||||||
@ -107,24 +71,29 @@ int board_late_init(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_set_mux32(u32 base,
|
|
||||||
struct pad_conf_entry const *array, int size)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
struct pad_conf_entry *pad = (struct pad_conf_entry *)array;
|
|
||||||
|
|
||||||
for (i = 0; i < size; i++, pad++)
|
|
||||||
writel(pad->val, base + pad->offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_muxconf_regs_essential(void)
|
void set_muxconf_regs_essential(void)
|
||||||
{
|
{
|
||||||
do_set_mux32((*ctrl)->control_padconf_core_base,
|
do_set_mux32((*ctrl)->control_padconf_core_base,
|
||||||
core_padconf_array_essential,
|
early_padconf, ARRAY_SIZE(early_padconf));
|
||||||
sizeof(core_padconf_array_essential) /
|
|
||||||
sizeof(struct pad_conf_entry));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_IODELAY_RECALIBRATION
|
||||||
|
void recalibrate_iodelay(void)
|
||||||
|
{
|
||||||
|
if (is_dra72x()) {
|
||||||
|
__recalibrate_iodelay(core_padconf_array_essential,
|
||||||
|
ARRAY_SIZE(core_padconf_array_essential),
|
||||||
|
iodelay_cfg_array,
|
||||||
|
ARRAY_SIZE(iodelay_cfg_array));
|
||||||
|
} else {
|
||||||
|
__recalibrate_iodelay(dra74x_core_padconf_array,
|
||||||
|
ARRAY_SIZE(dra74x_core_padconf_array),
|
||||||
|
dra742_iodelay_cfg_array,
|
||||||
|
ARRAY_SIZE(dra742_iodelay_cfg_array));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC)
|
#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC)
|
||||||
int board_mmc_init(bd_t *bis)
|
int board_mmc_init(bd_t *bis)
|
||||||
{
|
{
|
||||||
@ -257,19 +226,6 @@ int spl_start_uboot(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_DRIVER_TI_CPSW
|
#ifdef CONFIG_DRIVER_TI_CPSW
|
||||||
|
|
||||||
/* Delay value to add to calibrated value */
|
|
||||||
#define RGMII0_TXCTL_DLY_VAL ((0x3 << 5) + 0x8)
|
|
||||||
#define RGMII0_TXD0_DLY_VAL ((0x3 << 5) + 0x8)
|
|
||||||
#define RGMII0_TXD1_DLY_VAL ((0x3 << 5) + 0x2)
|
|
||||||
#define RGMII0_TXD2_DLY_VAL ((0x4 << 5) + 0x0)
|
|
||||||
#define RGMII0_TXD3_DLY_VAL ((0x4 << 5) + 0x0)
|
|
||||||
#define VIN2A_D13_DLY_VAL ((0x3 << 5) + 0x8)
|
|
||||||
#define VIN2A_D17_DLY_VAL ((0x3 << 5) + 0x8)
|
|
||||||
#define VIN2A_D16_DLY_VAL ((0x3 << 5) + 0x2)
|
|
||||||
#define VIN2A_D15_DLY_VAL ((0x4 << 5) + 0x0)
|
|
||||||
#define VIN2A_D14_DLY_VAL ((0x4 << 5) + 0x0)
|
|
||||||
|
|
||||||
extern u32 *const omap_si_rev;
|
extern u32 *const omap_si_rev;
|
||||||
|
|
||||||
static void cpsw_control(int enabled)
|
static void cpsw_control(int enabled)
|
||||||
@ -317,22 +273,6 @@ int board_eth_init(bd_t *bis)
|
|||||||
uint8_t mac_addr[6];
|
uint8_t mac_addr[6];
|
||||||
uint32_t mac_hi, mac_lo;
|
uint32_t mac_hi, mac_lo;
|
||||||
uint32_t ctrl_val;
|
uint32_t ctrl_val;
|
||||||
const struct io_delay io_dly[] = {
|
|
||||||
{CFG_RGMII0_TXCTL, RGMII0_TXCTL_DLY_VAL},
|
|
||||||
{CFG_RGMII0_TXD0, RGMII0_TXD0_DLY_VAL},
|
|
||||||
{CFG_RGMII0_TXD1, RGMII0_TXD1_DLY_VAL},
|
|
||||||
{CFG_RGMII0_TXD2, RGMII0_TXD2_DLY_VAL},
|
|
||||||
{CFG_RGMII0_TXD3, RGMII0_TXD3_DLY_VAL},
|
|
||||||
{CFG_VIN2A_D13, VIN2A_D13_DLY_VAL},
|
|
||||||
{CFG_VIN2A_D17, VIN2A_D17_DLY_VAL},
|
|
||||||
{CFG_VIN2A_D16, VIN2A_D16_DLY_VAL},
|
|
||||||
{CFG_VIN2A_D15, VIN2A_D15_DLY_VAL},
|
|
||||||
{CFG_VIN2A_D14, VIN2A_D14_DLY_VAL},
|
|
||||||
{0}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Adjust IO delay for RGMII tx path */
|
|
||||||
dra7xx_adj_io_delay(io_dly);
|
|
||||||
|
|
||||||
/* try reading mac address from efuse */
|
/* try reading mac address from efuse */
|
||||||
mac_lo = readl((*ctrl)->control_core_mac_id_0_lo);
|
mac_lo = readl((*ctrl)->control_core_mac_id_0_lo);
|
||||||
|
@ -76,30 +76,30 @@ const struct pad_conf_entry core_padconf_array_essential[] = {
|
|||||||
{I2C1_SCL, (IEN | PTU | PDIS | M0)}, /* I2C1_SCL */
|
{I2C1_SCL, (IEN | PTU | PDIS | M0)}, /* I2C1_SCL */
|
||||||
{MDIO_MCLK, (PTU | PEN | M0)}, /* MDIO_MCLK */
|
{MDIO_MCLK, (PTU | PEN | M0)}, /* MDIO_MCLK */
|
||||||
{MDIO_D, (IEN | PTU | PEN | M0)}, /* MDIO_D */
|
{MDIO_D, (IEN | PTU | PEN | M0)}, /* MDIO_D */
|
||||||
{RGMII0_TXC, (M0) },
|
{RGMII0_TXC, (PIN_OUTPUT | MANUAL_MODE | M0) },
|
||||||
{RGMII0_TXCTL, (M0) },
|
{RGMII0_TXCTL, (PIN_OUTPUT | MANUAL_MODE | M0) },
|
||||||
{RGMII0_TXD3, (M0) },
|
{RGMII0_TXD3, (PIN_OUTPUT | MANUAL_MODE | M0) },
|
||||||
{RGMII0_TXD2, (M0) },
|
{RGMII0_TXD2, (PIN_OUTPUT | MANUAL_MODE | M0) },
|
||||||
{RGMII0_TXD1, (M0) },
|
{RGMII0_TXD1, (PIN_OUTPUT | MANUAL_MODE | M0) },
|
||||||
{RGMII0_TXD0, (M0) },
|
{RGMII0_TXD0, (PIN_OUTPUT | MANUAL_MODE | M0) },
|
||||||
{RGMII0_RXC, (IEN | M0) },
|
{RGMII0_RXC, (PIN_INPUT | MANUAL_MODE | M0) },
|
||||||
{RGMII0_RXCTL, (IEN | M0) },
|
{RGMII0_RXCTL, (PIN_INPUT | MANUAL_MODE | M0) },
|
||||||
{RGMII0_RXD3, (IEN | M0) },
|
{RGMII0_RXD3, (PIN_INPUT | MANUAL_MODE | M0) },
|
||||||
{RGMII0_RXD2, (IEN | M0) },
|
{RGMII0_RXD2, (PIN_INPUT | MANUAL_MODE | M0) },
|
||||||
{RGMII0_RXD1, (IEN | M0) },
|
{RGMII0_RXD1, (PIN_INPUT | MANUAL_MODE | M0) },
|
||||||
{RGMII0_RXD0, (IEN | M0) },
|
{RGMII0_RXD0, (PIN_INPUT | MANUAL_MODE | M0) },
|
||||||
{VIN2A_D12, (M3) },
|
{VIN2A_D12, (PIN_OUTPUT | MANUAL_MODE | M3) },
|
||||||
{VIN2A_D13, (M3) },
|
{VIN2A_D13, (PIN_OUTPUT | MANUAL_MODE | M3) },
|
||||||
{VIN2A_D14, (M3) },
|
{VIN2A_D14, (PIN_OUTPUT | MANUAL_MODE | M3) },
|
||||||
{VIN2A_D15, (M3) },
|
{VIN2A_D15, (PIN_OUTPUT | MANUAL_MODE | M3) },
|
||||||
{VIN2A_D16, (M3) },
|
{VIN2A_D16, (PIN_OUTPUT | MANUAL_MODE | M3) },
|
||||||
{VIN2A_D17, (M3) },
|
{VIN2A_D17, (PIN_OUTPUT | MANUAL_MODE | M3) },
|
||||||
{VIN2A_D18, (IEN | M3)},
|
{VIN2A_D18, (PIN_INPUT | MANUAL_MODE | M3)},
|
||||||
{VIN2A_D19, (IEN | M3)},
|
{VIN2A_D19, (PIN_INPUT | MANUAL_MODE | M3)},
|
||||||
{VIN2A_D20, (IEN | M3)},
|
{VIN2A_D20, (PIN_INPUT | MANUAL_MODE | M3)},
|
||||||
{VIN2A_D21, (IEN | M3)},
|
{VIN2A_D21, (PIN_INPUT | MANUAL_MODE | M3)},
|
||||||
{VIN2A_D22, (IEN | M3)},
|
{VIN2A_D22, (PIN_INPUT | MANUAL_MODE | M3)},
|
||||||
{VIN2A_D23, (IEN | M3)},
|
{VIN2A_D23, (PIN_INPUT | MANUAL_MODE | M3)},
|
||||||
#if defined(CONFIG_NAND) || defined(CONFIG_NOR)
|
#if defined(CONFIG_NAND) || defined(CONFIG_NOR)
|
||||||
/* NAND / NOR pin-mux */
|
/* NAND / NOR pin-mux */
|
||||||
{GPMC_AD0 , M0 | IEN | PDIS}, /* GPMC_AD0 */
|
{GPMC_AD0 , M0 | IEN | PDIS}, /* GPMC_AD0 */
|
||||||
@ -141,4 +141,296 @@ const struct pad_conf_entry core_padconf_array_essential[] = {
|
|||||||
{USB2_DRVVBUS, (M0 | IEN | FSC) },
|
{USB2_DRVVBUS, (M0 | IEN | FSC) },
|
||||||
{SPI1_CS1, (PEN | IDIS | M14) },
|
{SPI1_CS1, (PEN | IDIS | M14) },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const struct pad_conf_entry early_padconf[] = {
|
||||||
|
#if (CONFIG_CONS_INDEX == 1)
|
||||||
|
{UART1_RXD, (PIN_INPUT_SLEW | M0)}, /* UART1_RXD */
|
||||||
|
{UART1_TXD, (PIN_INPUT_SLEW | M0)}, /* UART1_TXD */
|
||||||
|
#elif (CONFIG_CONS_INDEX == 3)
|
||||||
|
{UART3_RXD, (PIN_INPUT_SLEW | M0)}, /* UART3_RXD */
|
||||||
|
{UART3_TXD, (PIN_INPUT_SLEW | M0)}, /* UART3_TXD */
|
||||||
|
#endif
|
||||||
|
{I2C1_SDA, (PIN_INPUT | M0)}, /* I2C1_SDA */
|
||||||
|
{I2C1_SCL, (PIN_INPUT | M0)}, /* I2C1_SCL */
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_IODELAY_RECALIBRATION
|
||||||
|
const struct iodelay_cfg_entry iodelay_cfg_array[] = {
|
||||||
|
{0x6F0, 359, 0}, /* RGMMI0_RXC_IN */
|
||||||
|
{0x6FC, 129, 1896}, /* RGMMI0_RXCTL_IN */
|
||||||
|
{0x708, 80, 1391}, /* RGMMI0_RXD0_IN */
|
||||||
|
{0x714, 196, 1522}, /* RGMMI0_RXD1_IN */
|
||||||
|
{0x720, 40, 1860}, /* RGMMI0_RXD2_IN */
|
||||||
|
{0x72C, 0, 1956}, /* RGMMI0_RXD3_IN */
|
||||||
|
{0x740, 0, 220}, /* RGMMI0_TXC_OUT */
|
||||||
|
{0x74C, 1820, 180}, /* RGMMI0_TXCTL_OUT */
|
||||||
|
{0x758, 1740, 440}, /* RGMMI0_TXD0_OUT */
|
||||||
|
{0x764, 1740, 240}, /* RGMMI0_TXD1_OUT */
|
||||||
|
{0x770, 1680, 380}, /* RGMMI0_TXD2_OUT */
|
||||||
|
{0x77C, 1740, 440}, /* RGMMI0_TXD3_OUT */
|
||||||
|
/* These values are for using RGMII1 configuration on VIN2a_x pins. */
|
||||||
|
{0xAB0, 596, 0}, /* CFG_VIN2A_D18_IN */
|
||||||
|
{0xABC, 314, 980}, /* CFG_VIN2A_D19_IN */
|
||||||
|
{0xAD4, 241, 1536}, /* CFG_VIN2A_D20_IN */
|
||||||
|
{0xAE0, 103, 1689}, /* CFG_VIN2A_D21_IN */
|
||||||
|
{0xAEC, 161, 1563}, /* CFG_VIN2A_D22_IN */
|
||||||
|
{0xAF8, 0, 1613}, /* CFG_VIN2A_D23_IN */
|
||||||
|
{0xA70, 0, 200}, /* CFG_VIN2A_D12_OUT */
|
||||||
|
{0xA7C, 1560, 140}, /* CFG_VIN2A_D13_OUT */
|
||||||
|
{0xA88, 1700, 0}, /* CFG_VIN2A_D14_OUT */
|
||||||
|
{0xA94, 1260, 0}, /* CFG_VIN2A_D15_OUT */
|
||||||
|
{0xAA0, 1400, 0}, /* CFG_VIN2A_D16_OUT */
|
||||||
|
{0xAAC, 1290, 0}, /* CFG_VIN2A_D17_OUT */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const struct pad_conf_entry dra74x_core_padconf_array[] = {
|
||||||
|
{GPMC_AD0, (M3 | PIN_INPUT)}, /* gpmc_ad0.vout3_d0 */
|
||||||
|
{GPMC_AD1, (M3 | PIN_INPUT)}, /* gpmc_ad1.vout3_d1 */
|
||||||
|
{GPMC_AD2, (M3 | PIN_INPUT)}, /* gpmc_ad2.vout3_d2 */
|
||||||
|
{GPMC_AD3, (M3 | PIN_INPUT)}, /* gpmc_ad3.vout3_d3 */
|
||||||
|
{GPMC_AD4, (M3 | PIN_INPUT)}, /* gpmc_ad4.vout3_d4 */
|
||||||
|
{GPMC_AD5, (M3 | PIN_INPUT)}, /* gpmc_ad5.vout3_d5 */
|
||||||
|
{GPMC_AD6, (M3 | PIN_INPUT)}, /* gpmc_ad6.vout3_d6 */
|
||||||
|
{GPMC_AD7, (M3 | PIN_INPUT)}, /* gpmc_ad7.vout3_d7 */
|
||||||
|
{GPMC_AD8, (M3 | PIN_INPUT)}, /* gpmc_ad8.vout3_d8 */
|
||||||
|
{GPMC_AD9, (M3 | PIN_INPUT)}, /* gpmc_ad9.vout3_d9 */
|
||||||
|
{GPMC_AD10, (M3 | PIN_INPUT)}, /* gpmc_ad10.vout3_d10 */
|
||||||
|
{GPMC_AD11, (M3 | PIN_INPUT)}, /* gpmc_ad11.vout3_d11 */
|
||||||
|
{GPMC_AD12, (M3 | PIN_INPUT)}, /* gpmc_ad12.vout3_d12 */
|
||||||
|
{GPMC_AD13, (M3 | PIN_INPUT)}, /* gpmc_ad13.vout3_d13 */
|
||||||
|
{GPMC_AD14, (M3 | PIN_INPUT)}, /* gpmc_ad14.vout3_d14 */
|
||||||
|
{GPMC_AD15, (M3 | PIN_INPUT)}, /* gpmc_ad15.vout3_d15 */
|
||||||
|
{GPMC_A0, (M3 | PIN_INPUT_PULLDOWN)}, /* gpmc_a0.vout3_d16 */
|
||||||
|
{GPMC_A1, (M3 | PIN_INPUT_PULLDOWN)}, /* gpmc_a1.vout3_d17 */
|
||||||
|
{GPMC_A2, (M3 | PIN_INPUT_PULLDOWN)}, /* gpmc_a2.vout3_d18 */
|
||||||
|
{GPMC_A3, (M3 | PIN_INPUT_PULLDOWN)}, /* gpmc_a3.vout3_d19 */
|
||||||
|
{GPMC_A4, (M3 | PIN_INPUT_PULLDOWN)}, /* gpmc_a4.vout3_d20 */
|
||||||
|
{GPMC_A5, (M3 | PIN_INPUT_PULLDOWN)}, /* gpmc_a5.vout3_d21 */
|
||||||
|
{GPMC_A6, (M3 | PIN_INPUT_PULLDOWN)}, /* gpmc_a6.vout3_d22 */
|
||||||
|
{GPMC_A7, (M3 | PIN_INPUT_PULLDOWN)}, /* gpmc_a7.vout3_d23 */
|
||||||
|
{GPMC_A8, (M3 | PIN_INPUT_PULLDOWN)}, /* gpmc_a8.vout3_hsync */
|
||||||
|
{GPMC_A9, (M3 | PIN_INPUT_PULLDOWN)}, /* gpmc_a9.vout3_vsync */
|
||||||
|
{GPMC_A10, (M3 | PIN_INPUT_PULLDOWN)}, /* gpmc_a10.vout3_de */
|
||||||
|
{GPMC_A11, (M14 | PIN_INPUT_PULLDOWN)}, /* gpmc_a11.gpio2_1 */
|
||||||
|
{GPMC_A13, (M1 | PIN_INPUT_PULLDOWN)}, /* gpmc_a13.qspi1_rtclk */
|
||||||
|
{GPMC_A14, (M1 | PIN_INPUT_PULLDOWN)}, /* gpmc_a14.qspi1_d3 */
|
||||||
|
{GPMC_A15, (M1 | PIN_INPUT_PULLDOWN)}, /* gpmc_a15.qspi1_d2 */
|
||||||
|
{GPMC_A16, (M1 | PIN_INPUT_PULLDOWN)}, /* gpmc_a16.qspi1_d0 */
|
||||||
|
{GPMC_A17, (M1 | PIN_INPUT_PULLDOWN)}, /* gpmc_a17.qspi1_d1 */
|
||||||
|
{GPMC_A18, (M1 | PIN_INPUT_PULLDOWN)}, /* gpmc_a18.qspi1_sclk */
|
||||||
|
{GPMC_A19, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a19.mmc2_dat4 */
|
||||||
|
{GPMC_A20, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a20.mmc2_dat5 */
|
||||||
|
{GPMC_A21, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a21.mmc2_dat6 */
|
||||||
|
{GPMC_A22, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a22.mmc2_dat7 */
|
||||||
|
{GPMC_A23, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a23.mmc2_clk */
|
||||||
|
{GPMC_A24, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a24.mmc2_dat0 */
|
||||||
|
{GPMC_A25, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a25.mmc2_dat1 */
|
||||||
|
{GPMC_A26, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a26.mmc2_dat2 */
|
||||||
|
{GPMC_A27, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_a27.mmc2_dat3 */
|
||||||
|
{GPMC_CS1, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_cs1.mmc2_cmd */
|
||||||
|
{GPMC_CS2, (M1 | PIN_INPUT_PULLUP)}, /* gpmc_cs2.qspi1_cs0 */
|
||||||
|
{GPMC_CS3, (M3 | PIN_INPUT_PULLUP)}, /* gpmc_cs3.vout3_clk */
|
||||||
|
{VIN1A_CLK0, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_clk0.vin1a_clk0 */
|
||||||
|
{VIN1A_DE0, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_de0.vin1a_de0 */
|
||||||
|
{VIN1A_FLD0, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_fld0.vin1a_fld0 */
|
||||||
|
{VIN1A_HSYNC0, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_hsync0.vin1a_hsync0 */
|
||||||
|
{VIN1A_VSYNC0, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_vsync0.vin1a_vsync0 */
|
||||||
|
{VIN1A_D0, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d0.vin1a_d0 */
|
||||||
|
{VIN1A_D1, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d1.vin1a_d1 */
|
||||||
|
{VIN1A_D2, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d2.vin1a_d2 */
|
||||||
|
{VIN1A_D3, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d3.vin1a_d3 */
|
||||||
|
{VIN1A_D4, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d4.vin1a_d4 */
|
||||||
|
{VIN1A_D5, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d5.vin1a_d5 */
|
||||||
|
{VIN1A_D6, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d6.vin1a_d6 */
|
||||||
|
{VIN1A_D7, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d7.vin1a_d7 */
|
||||||
|
{VIN1A_D8, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d8.vin1a_d8 */
|
||||||
|
{VIN1A_D9, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d9.vin1a_d9 */
|
||||||
|
{VIN1A_D10, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d10.vin1a_d10 */
|
||||||
|
{VIN1A_D11, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d11.vin1a_d11 */
|
||||||
|
{VIN1A_D12, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d12.vin1a_d12 */
|
||||||
|
{VIN1A_D13, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d13.vin1a_d13 */
|
||||||
|
{VIN1A_D14, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d14.vin1a_d14 */
|
||||||
|
{VIN1A_D15, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d15.vin1a_d15 */
|
||||||
|
{VIN1A_D16, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d16.vin1a_d16 */
|
||||||
|
{VIN1A_D17, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d17.vin1a_d17 */
|
||||||
|
{VIN1A_D18, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d18.vin1a_d18 */
|
||||||
|
{VIN1A_D19, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d19.vin1a_d19 */
|
||||||
|
{VIN1A_D20, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d20.vin1a_d20 */
|
||||||
|
{VIN1A_D21, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d21.vin1a_d21 */
|
||||||
|
{VIN1A_D22, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d22.vin1a_d22 */
|
||||||
|
{VIN1A_D23, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin1a_d23.vin1a_d23 */
|
||||||
|
{VIN2A_D12, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d12.rgmii1_txc */
|
||||||
|
{VIN2A_D13, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d13.rgmii1_txctl */
|
||||||
|
{VIN2A_D14, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d14.rgmii1_txd3 */
|
||||||
|
{VIN2A_D15, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d15.rgmii1_txd2 */
|
||||||
|
{VIN2A_D16, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d16.rgmii1_txd1 */
|
||||||
|
{VIN2A_D17, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d17.rgmii1_txd0 */
|
||||||
|
{VIN2A_D18, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d18.rgmii1_rxc */
|
||||||
|
{VIN2A_D19, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d19.rgmii1_rxctl */
|
||||||
|
{VIN2A_D20, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d20.rgmii1_rxd3 */
|
||||||
|
{VIN2A_D21, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d21.rgmii1_rxd2 */
|
||||||
|
{VIN2A_D22, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d22.rgmii1_rxd1 */
|
||||||
|
{VIN2A_D23, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vin2a_d23.rgmii1_rxd0 */
|
||||||
|
{VOUT1_CLK, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_clk.vout1_clk */
|
||||||
|
{VOUT1_DE, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_de.vout1_de */
|
||||||
|
{VOUT1_HSYNC, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_hsync.vout1_hsync */
|
||||||
|
{VOUT1_VSYNC, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_vsync.vout1_vsync */
|
||||||
|
{VOUT1_D0, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d0.vout1_d0 */
|
||||||
|
{VOUT1_D1, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d1.vout1_d1 */
|
||||||
|
{VOUT1_D2, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d2.vout1_d2 */
|
||||||
|
{VOUT1_D3, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d3.vout1_d3 */
|
||||||
|
{VOUT1_D4, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d4.vout1_d4 */
|
||||||
|
{VOUT1_D5, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d5.vout1_d5 */
|
||||||
|
{VOUT1_D6, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d6.vout1_d6 */
|
||||||
|
{VOUT1_D7, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d7.vout1_d7 */
|
||||||
|
{VOUT1_D8, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d8.vout1_d8 */
|
||||||
|
{VOUT1_D9, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d9.vout1_d9 */
|
||||||
|
{VOUT1_D10, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d10.vout1_d10 */
|
||||||
|
{VOUT1_D11, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d11.vout1_d11 */
|
||||||
|
{VOUT1_D12, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d12.vout1_d12 */
|
||||||
|
{VOUT1_D13, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d13.vout1_d13 */
|
||||||
|
{VOUT1_D14, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d14.vout1_d14 */
|
||||||
|
{VOUT1_D15, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d15.vout1_d15 */
|
||||||
|
{VOUT1_D16, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d16.vout1_d16 */
|
||||||
|
{VOUT1_D17, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d17.vout1_d17 */
|
||||||
|
{VOUT1_D18, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d18.vout1_d18 */
|
||||||
|
{VOUT1_D19, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d19.vout1_d19 */
|
||||||
|
{VOUT1_D20, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d20.vout1_d20 */
|
||||||
|
{VOUT1_D21, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d21.vout1_d21 */
|
||||||
|
{VOUT1_D22, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d22.vout1_d22 */
|
||||||
|
{VOUT1_D23, (M0 | PIN_INPUT_PULLDOWN)}, /* vout1_d23.vout1_d23 */
|
||||||
|
{MDIO_MCLK, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* mdio_mclk.mdio_mclk */
|
||||||
|
{MDIO_D, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* mdio_d.mdio_d */
|
||||||
|
{RGMII0_TXC, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_txc.rgmii0_txc */
|
||||||
|
{RGMII0_TXCTL, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_txctl.rgmii0_txctl */
|
||||||
|
{RGMII0_TXD3, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_txd3.rgmii0_txd3 */
|
||||||
|
{RGMII0_TXD2, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_txd2.rgmii0_txd2 */
|
||||||
|
{RGMII0_TXD1, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_txd1.rgmii0_txd1 */
|
||||||
|
{RGMII0_TXD0, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_txd0.rgmii0_txd0 */
|
||||||
|
{RGMII0_RXC, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_rxc.rgmii0_rxc */
|
||||||
|
{RGMII0_RXCTL, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_rxctl.rgmii0_rxctl */
|
||||||
|
{RGMII0_RXD3, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_rxd3.rgmii0_rxd3 */
|
||||||
|
{RGMII0_RXD2, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_rxd2.rgmii0_rxd2 */
|
||||||
|
{RGMII0_RXD1, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_rxd1.rgmii0_rxd1 */
|
||||||
|
{RGMII0_RXD0, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* rgmii0_rxd0.rgmii0_rxd0 */
|
||||||
|
{USB1_DRVVBUS, (M0 | PIN_INPUT_SLEW)}, /* usb1_drvvbus.usb1_drvvbus */
|
||||||
|
{USB2_DRVVBUS, (M0 | PIN_INPUT_SLEW)}, /* usb2_drvvbus.usb2_drvvbus */
|
||||||
|
{GPIO6_14, (M9 | PIN_INPUT_PULLUP)}, /* gpio6_14.i2c3_sda */
|
||||||
|
{GPIO6_15, (M9 | PIN_INPUT_PULLUP)}, /* gpio6_15.i2c3_scl */
|
||||||
|
{GPIO6_16, (M14 | PIN_INPUT_PULLUP)}, /* gpio6_16.gpio6_16 */
|
||||||
|
{XREF_CLK2, (M5 | PIN_INPUT_PULLDOWN)}, /* xref_clk2.atl_clk2 */
|
||||||
|
{MCASP1_ACLKX, (M0 | PIN_INPUT_PULLDOWN)}, /* mcasp1_aclkx.mcasp1_aclkx */
|
||||||
|
{MCASP1_FSX, (M0 | PIN_INPUT_SLEW)}, /* mcasp1_fsx.mcasp1_fsx */
|
||||||
|
{MCASP1_AXR0, (M0 | PIN_INPUT_SLEW | VIRTUAL_MODE15)}, /* mcasp1_axr0.mcasp1_axr0 */
|
||||||
|
{MCASP1_AXR1, (M0 | PIN_INPUT_SLEW)}, /* mcasp1_axr1.mcasp1_axr1 */
|
||||||
|
{MCASP1_AXR2, (M14 | PIN_INPUT_PULLDOWN)}, /* mcasp1_axr2.gpio5_4 */
|
||||||
|
{MCASP1_AXR3, (M14 | PIN_INPUT_PULLDOWN)}, /* mcasp1_axr3.gpio5_5 */
|
||||||
|
{MCASP1_AXR4, (M14 | PIN_INPUT_PULLDOWN)}, /* mcasp1_axr4.gpio5_6 */
|
||||||
|
{MCASP1_AXR5, (M14 | PIN_INPUT_PULLDOWN)}, /* mcasp1_axr5.gpio5_7 */
|
||||||
|
{MCASP1_AXR6, (M14 | PIN_INPUT_PULLDOWN)}, /* mcasp1_axr6.gpio5_8 */
|
||||||
|
{MCASP1_AXR7, (M14 | PIN_INPUT_PULLDOWN)}, /* mcasp1_axr7.gpio5_9 */
|
||||||
|
{MCASP1_AXR12, (M1 | PIN_INPUT_SLEW | VIRTUAL_MODE10)}, /* mcasp1_axr12.mcasp7_axr0 */
|
||||||
|
{MCASP1_AXR13, (M1 | PIN_INPUT_SLEW)}, /* mcasp1_axr13.mcasp7_axr1 */
|
||||||
|
{MCASP1_AXR14, (M1 | PIN_INPUT_SLEW | VIRTUAL_MODE10)}, /* mcasp1_axr14.mcasp7_aclkx */
|
||||||
|
{MCASP1_AXR15, (M1 | PIN_INPUT_SLEW | VIRTUAL_MODE10)}, /* mcasp1_axr15.mcasp7_fsx */
|
||||||
|
{MCASP2_ACLKR, (M0 | PIN_INPUT_PULLDOWN)}, /* mcasp2_aclkr.mcasp2_aclkr */
|
||||||
|
{MCASP3_ACLKX, (M0 | PIN_INPUT_PULLDOWN)}, /* mcasp3_aclkx.mcasp3_aclkx */
|
||||||
|
{MCASP3_FSX, (M0 | PIN_INPUT_SLEW)}, /* mcasp3_fsx.mcasp3_fsx */
|
||||||
|
{MCASP3_AXR0, (M0 | PIN_INPUT_SLEW)}, /* mcasp3_axr0.mcasp3_axr0 */
|
||||||
|
{MCASP3_AXR1, (M0 | PIN_INPUT_SLEW | VIRTUAL_MODE6)}, /* mcasp3_axr1.mcasp3_axr1 */
|
||||||
|
{MMC1_CLK, (M0 | PIN_INPUT_PULLUP)}, /* mmc1_clk.mmc1_clk */
|
||||||
|
{MMC1_CMD, (M0 | PIN_INPUT_PULLUP)}, /* mmc1_cmd.mmc1_cmd */
|
||||||
|
{MMC1_DAT0, (M0 | PIN_INPUT_PULLUP)}, /* mmc1_dat0.mmc1_dat0 */
|
||||||
|
{MMC1_DAT1, (M0 | PIN_INPUT_PULLUP)}, /* mmc1_dat1.mmc1_dat1 */
|
||||||
|
{MMC1_DAT2, (M0 | PIN_INPUT_PULLUP)}, /* mmc1_dat2.mmc1_dat2 */
|
||||||
|
{MMC1_DAT3, (M0 | PIN_INPUT_PULLUP)}, /* mmc1_dat3.mmc1_dat3 */
|
||||||
|
{MMC1_SDCD, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* mmc1_sdcd.mmc1_sdcd */
|
||||||
|
{MMC1_SDWP, (M14 | PIN_INPUT_SLEW)}, /* mmc1_sdwp.gpio6_28 */
|
||||||
|
{GPIO6_11, (M14 | PIN_INPUT_PULLUP)}, /* gpio6_11.gpio6_11 */
|
||||||
|
{SPI1_SCLK, (M0 | PIN_INPUT_PULLDOWN)}, /* spi1_sclk.spi1_sclk */
|
||||||
|
{SPI1_D1, (M0 | PIN_INPUT_PULLDOWN)}, /* spi1_d1.spi1_d1 */
|
||||||
|
{SPI1_D0, (M0 | PIN_INPUT_PULLDOWN)}, /* spi1_d0.spi1_d0 */
|
||||||
|
{SPI1_CS0, (M0 | PIN_INPUT_PULLUP)}, /* spi1_cs0.spi1_cs0 */
|
||||||
|
{SPI1_CS1, (M14 | PIN_OUTPUT)}, /* spi1_cs1.gpio7_11 */
|
||||||
|
{SPI1_CS2, (M14 | PIN_INPUT_PULLDOWN)}, /* spi1_cs2.gpio7_12 */
|
||||||
|
{SPI1_CS3, (M6 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* spi1_cs3.hdmi1_cec */
|
||||||
|
{SPI2_SCLK, (M1 | PIN_INPUT_PULLDOWN)}, /* spi2_sclk.uart3_rxd */
|
||||||
|
{SPI2_D1, (M1 | PIN_INPUT_SLEW)}, /* spi2_d1.uart3_txd */
|
||||||
|
{SPI2_D0, (M1 | PIN_INPUT_SLEW)}, /* spi2_d0.uart3_ctsn */
|
||||||
|
{SPI2_CS0, (M1 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* spi2_cs0.uart3_rtsn */
|
||||||
|
{DCAN1_TX, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* dcan1_tx.dcan1_tx */
|
||||||
|
{DCAN1_RX, (M14 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* dcan1_rx.gpio1_15 */
|
||||||
|
{UART1_RXD, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* uart1_rxd.uart1_rxd */
|
||||||
|
{UART1_TXD, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* uart1_txd.uart1_txd */
|
||||||
|
{UART1_CTSN, (M3 | PIN_INPUT_PULLUP)}, /* uart1_ctsn.mmc4_clk */
|
||||||
|
{UART1_RTSN, (M3 | PIN_INPUT_PULLUP)}, /* uart1_rtsn.mmc4_cmd */
|
||||||
|
{UART2_RXD, (M3 | PIN_INPUT_PULLUP)}, /* N/A.mmc4_dat0 */
|
||||||
|
{UART2_TXD, (M3 | PIN_INPUT_PULLUP)}, /* uart2_txd.mmc4_dat1 */
|
||||||
|
{UART2_CTSN, (M3 | PIN_INPUT_PULLUP)}, /* uart2_ctsn.mmc4_dat2 */
|
||||||
|
{UART2_RTSN, (M3 | PIN_INPUT_PULLUP)}, /* uart2_rtsn.mmc4_dat3 */
|
||||||
|
{I2C2_SDA, (M0 | PIN_INPUT_PULLUP)}, /* i2c2_sda.i2c2_sda */
|
||||||
|
{I2C2_SCL, (M0 | PIN_INPUT_PULLUP)}, /* i2c2_scl.i2c2_scl */
|
||||||
|
{WAKEUP0, (M1 | PIN_OUTPUT)}, /* Wakeup0.dcan1_rx */
|
||||||
|
{WAKEUP2, (M14 | PIN_OUTPUT)}, /* Wakeup2.gpio1_2 */
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_IODELAY_RECALIBRATION
|
||||||
|
const struct iodelay_cfg_entry dra742_iodelay_cfg_array[] = {
|
||||||
|
{0x06F0, 480, 0}, /* CFG_RGMII0_RXC_IN */
|
||||||
|
{0x06FC, 111, 1641}, /* CFG_RGMII0_RXCTL_IN */
|
||||||
|
{0x0708, 272, 1116}, /* CFG_RGMII0_RXD0_IN */
|
||||||
|
{0x0714, 243, 1260}, /* CFG_RGMII0_RXD1_IN */
|
||||||
|
{0x0720, 0, 1614}, /* CFG_RGMII0_RXD2_IN */
|
||||||
|
{0x072C, 105, 1673}, /* CFG_RGMII0_RXD3_IN */
|
||||||
|
{0x0740, 0, 0}, /* CFG_RGMII0_TXC_OUT */
|
||||||
|
{0x074C, 1560, 120}, /* CFG_RGMII0_TXCTL_OUT */
|
||||||
|
{0x0758, 1570, 120}, /* CFG_RGMII0_TXD0_OUT */
|
||||||
|
{0x0764, 1500, 120}, /* CFG_RGMII0_TXD1_OUT */
|
||||||
|
{0x0770, 1775, 120}, /* CFG_RGMII0_TXD2_OUT */
|
||||||
|
{0x077C, 1875, 120}, /* CFG_RGMII0_TXD3_OUT */
|
||||||
|
{0x08D0, 0, 0}, /* CFG_VIN1A_CLK0_IN */
|
||||||
|
{0x08DC, 2600, 0}, /* CFG_VIN1A_D0_IN */
|
||||||
|
{0x08E8, 2652, 46}, /* CFG_VIN1A_D10_IN */
|
||||||
|
{0x08F4, 2541, 0}, /* CFG_VIN1A_D11_IN */
|
||||||
|
{0x0900, 2603, 574}, /* CFG_VIN1A_D12_IN */
|
||||||
|
{0x090C, 2548, 443}, /* CFG_VIN1A_D13_IN */
|
||||||
|
{0x0918, 2624, 598}, /* CFG_VIN1A_D14_IN */
|
||||||
|
{0x0924, 2535, 1027}, /* CFG_VIN1A_D15_IN */
|
||||||
|
{0x0930, 2526, 818}, /* CFG_VIN1A_D16_IN */
|
||||||
|
{0x093C, 2623, 797}, /* CFG_VIN1A_D17_IN */
|
||||||
|
{0x0948, 2578, 888}, /* CFG_VIN1A_D18_IN */
|
||||||
|
{0x0954, 2574, 1008}, /* CFG_VIN1A_D19_IN */
|
||||||
|
{0x0960, 2527, 123}, /* CFG_VIN1A_D1_IN */
|
||||||
|
{0x096C, 2577, 737}, /* CFG_VIN1A_D20_IN */
|
||||||
|
{0x0978, 2627, 616}, /* CFG_VIN1A_D21_IN */
|
||||||
|
{0x0984, 2573, 777}, /* CFG_VIN1A_D22_IN */
|
||||||
|
{0x0990, 2730, 67}, /* CFG_VIN1A_D23_IN */
|
||||||
|
{0x099C, 2509, 303}, /* CFG_VIN1A_D2_IN */
|
||||||
|
{0x09A8, 2494, 267}, /* CFG_VIN1A_D3_IN */
|
||||||
|
{0x09B4, 2474, 0}, /* CFG_VIN1A_D4_IN */
|
||||||
|
{0x09C0, 2556, 181}, /* CFG_VIN1A_D5_IN */
|
||||||
|
{0x09CC, 2516, 195}, /* CFG_VIN1A_D6_IN */
|
||||||
|
{0x09D8, 2589, 210}, /* CFG_VIN1A_D7_IN */
|
||||||
|
{0x09E4, 2624, 75}, /* CFG_VIN1A_D8_IN */
|
||||||
|
{0x09F0, 2704, 14}, /* CFG_VIN1A_D9_IN */
|
||||||
|
{0x09FC, 2469, 55}, /* CFG_VIN1A_DE0_IN */
|
||||||
|
{0x0A08, 2557, 264}, /* CFG_VIN1A_FLD0_IN */
|
||||||
|
{0x0A14, 2465, 269}, /* CFG_VIN1A_HSYNC0_IN */
|
||||||
|
{0x0A20, 2411, 348}, /* CFG_VIN1A_VSYNC0_IN */
|
||||||
|
{0x0A70, 150, 0}, /* CFG_VIN2A_D12_OUT */
|
||||||
|
{0x0A7C, 1500, 0}, /* CFG_VIN2A_D13_OUT */
|
||||||
|
{0x0A88, 1600, 0}, /* CFG_VIN2A_D14_OUT */
|
||||||
|
{0x0A94, 900, 0}, /* CFG_VIN2A_D15_OUT */
|
||||||
|
{0x0AA0, 680, 0}, /* CFG_VIN2A_D16_OUT */
|
||||||
|
{0x0AAC, 500, 0}, /* CFG_VIN2A_D17_OUT */
|
||||||
|
{0x0AB0, 702, 0}, /* CFG_VIN2A_D18_IN */
|
||||||
|
{0x0ABC, 136, 976}, /* CFG_VIN2A_D19_IN */
|
||||||
|
{0x0AD4, 210, 1357}, /* CFG_VIN2A_D20_IN */
|
||||||
|
{0x0AE0, 189, 1462}, /* CFG_VIN2A_D21_IN */
|
||||||
|
{0x0AEC, 232, 1278}, /* CFG_VIN2A_D22_IN */
|
||||||
|
{0x0AF8, 0, 1397}, /* CFG_VIN2A_D23_IN */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _MUX_DATA_DRA7XX_H_ */
|
#endif /* _MUX_DATA_DRA7XX_H_ */
|
||||||
|
24
board/vscom/baltos/Kconfig
Normal file
24
board/vscom/baltos/Kconfig
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
if TARGET_AM335X_BALTOS
|
||||||
|
|
||||||
|
config SYS_BOARD
|
||||||
|
default "baltos"
|
||||||
|
|
||||||
|
config SYS_VENDOR
|
||||||
|
default "vscom"
|
||||||
|
|
||||||
|
config SYS_SOC
|
||||||
|
default "am33xx"
|
||||||
|
|
||||||
|
config SYS_CONFIG_NAME
|
||||||
|
default "baltos"
|
||||||
|
|
||||||
|
config CONS_INDEX
|
||||||
|
int "UART used for console"
|
||||||
|
range 1 6
|
||||||
|
default 1
|
||||||
|
help
|
||||||
|
The AM335x SoC has a total of 6 UARTs (UART0 to UART5 as referenced
|
||||||
|
in documentation, etc) available to it. Depending on your specific
|
||||||
|
board you may want something other than UART0.
|
||||||
|
|
||||||
|
endif
|
6
board/vscom/baltos/MAINTAINERS
Normal file
6
board/vscom/baltos/MAINTAINERS
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
BALTOS BOARD
|
||||||
|
M: Yegor Yefremov <yegorslists@googlemail.com>
|
||||||
|
S: Maintained
|
||||||
|
F: board/vscom/baltos/
|
||||||
|
F: include/configs/baltos.h
|
||||||
|
F: configs/am335x_baltos_defconfig
|
13
board/vscom/baltos/Makefile
Normal file
13
board/vscom/baltos/Makefile
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#
|
||||||
|
# Makefile
|
||||||
|
#
|
||||||
|
# Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-2.0+
|
||||||
|
#
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_SKIP_LOWLEVEL_INIT),)
|
||||||
|
obj-y := mux.o
|
||||||
|
endif
|
||||||
|
|
||||||
|
obj-y += board.o
|
1
board/vscom/baltos/README
Normal file
1
board/vscom/baltos/README
Normal file
@ -0,0 +1 @@
|
|||||||
|
BSP for VScom OnRISC Balios family devices, like Balios iR 5221.
|
474
board/vscom/baltos/board.c
Normal file
474
board/vscom/baltos/board.c
Normal file
@ -0,0 +1,474 @@
|
|||||||
|
/*
|
||||||
|
* board.c
|
||||||
|
*
|
||||||
|
* Board functions for TI AM335X based boards
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <spl.h>
|
||||||
|
#include <asm/arch/cpu.h>
|
||||||
|
#include <asm/arch/hardware.h>
|
||||||
|
#include <asm/arch/omap.h>
|
||||||
|
#include <asm/arch/ddr_defs.h>
|
||||||
|
#include <asm/arch/clock.h>
|
||||||
|
#include <asm/arch/gpio.h>
|
||||||
|
#include <asm/arch/mmc_host_def.h>
|
||||||
|
#include <asm/arch/sys_proto.h>
|
||||||
|
#include <asm/arch/mem.h>
|
||||||
|
#include <asm/arch/mux.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/emif.h>
|
||||||
|
#include <asm/gpio.h>
|
||||||
|
#include <i2c.h>
|
||||||
|
#include <miiphy.h>
|
||||||
|
#include <cpsw.h>
|
||||||
|
#include <power/tps65217.h>
|
||||||
|
#include <power/tps65910.h>
|
||||||
|
#include <environment.h>
|
||||||
|
#include <watchdog.h>
|
||||||
|
#include "board.h"
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
/* GPIO that controls power to DDR on EVM-SK */
|
||||||
|
#define GPIO_DDR_VTT_EN 7
|
||||||
|
#define DIP_S1 44
|
||||||
|
|
||||||
|
static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
|
||||||
|
|
||||||
|
static int baltos_set_console(void)
|
||||||
|
{
|
||||||
|
int val, i, dips = 0;
|
||||||
|
char buf[7];
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
sprintf(buf, "dip_s%d", i + 1);
|
||||||
|
|
||||||
|
if (gpio_request(DIP_S1 + i, buf)) {
|
||||||
|
printf("failed to export GPIO %d\n", DIP_S1 + i);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gpio_direction_input(DIP_S1 + i)) {
|
||||||
|
printf("failed to set GPIO %d direction\n", DIP_S1 + i);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
val = gpio_get_value(DIP_S1 + i);
|
||||||
|
dips |= val << i;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("DIPs: 0x%1x\n", (~dips) & 0xf);
|
||||||
|
|
||||||
|
if ((dips & 0xf) == 0xe)
|
||||||
|
setenv("console", "ttyUSB0,115200n8");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int read_eeprom(BSP_VS_HWPARAM *header)
|
||||||
|
{
|
||||||
|
i2c_set_bus_num(1);
|
||||||
|
|
||||||
|
/* Check if baseboard eeprom is available */
|
||||||
|
if (i2c_probe(CONFIG_SYS_I2C_EEPROM_ADDR)) {
|
||||||
|
puts("Could not probe the EEPROM; something fundamentally "
|
||||||
|
"wrong on the I2C bus.\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read the eeprom using i2c */
|
||||||
|
if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 1, (uchar *)header,
|
||||||
|
sizeof(BSP_VS_HWPARAM))) {
|
||||||
|
puts("Could not read the EEPROM; something fundamentally"
|
||||||
|
" wrong on the I2C bus.\n");
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (header->Magic != 0xDEADBEEF) {
|
||||||
|
|
||||||
|
printf("Incorrect magic number (0x%x) in EEPROM\n",
|
||||||
|
header->Magic);
|
||||||
|
|
||||||
|
/* fill default values */
|
||||||
|
header->SystemId = 211;
|
||||||
|
header->MAC1[0] = 0x00;
|
||||||
|
header->MAC1[1] = 0x00;
|
||||||
|
header->MAC1[2] = 0x00;
|
||||||
|
header->MAC1[3] = 0x00;
|
||||||
|
header->MAC1[4] = 0x00;
|
||||||
|
header->MAC1[5] = 0x01;
|
||||||
|
|
||||||
|
header->MAC2[0] = 0x00;
|
||||||
|
header->MAC2[1] = 0x00;
|
||||||
|
header->MAC2[2] = 0x00;
|
||||||
|
header->MAC2[3] = 0x00;
|
||||||
|
header->MAC2[4] = 0x00;
|
||||||
|
header->MAC2[5] = 0x02;
|
||||||
|
|
||||||
|
header->MAC3[0] = 0x00;
|
||||||
|
header->MAC3[1] = 0x00;
|
||||||
|
header->MAC3[2] = 0x00;
|
||||||
|
header->MAC3[3] = 0x00;
|
||||||
|
header->MAC3[4] = 0x00;
|
||||||
|
header->MAC3[5] = 0x03;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(CONFIG_SPL_BUILD) || defined(CONFIG_NOR_BOOT)
|
||||||
|
|
||||||
|
static const struct ddr_data ddr3_baltos_data = {
|
||||||
|
.datardsratio0 = MT41K256M16HA125E_RD_DQS,
|
||||||
|
.datawdsratio0 = MT41K256M16HA125E_WR_DQS,
|
||||||
|
.datafwsratio0 = MT41K256M16HA125E_PHY_FIFO_WE,
|
||||||
|
.datawrsratio0 = MT41K256M16HA125E_PHY_WR_DATA,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct cmd_control ddr3_baltos_cmd_ctrl_data = {
|
||||||
|
.cmd0csratio = MT41K256M16HA125E_RATIO,
|
||||||
|
.cmd0iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
|
||||||
|
|
||||||
|
.cmd1csratio = MT41K256M16HA125E_RATIO,
|
||||||
|
.cmd1iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
|
||||||
|
|
||||||
|
.cmd2csratio = MT41K256M16HA125E_RATIO,
|
||||||
|
.cmd2iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct emif_regs ddr3_baltos_emif_reg_data = {
|
||||||
|
.sdram_config = MT41K256M16HA125E_EMIF_SDCFG,
|
||||||
|
.ref_ctrl = MT41K256M16HA125E_EMIF_SDREF,
|
||||||
|
.sdram_tim1 = MT41K256M16HA125E_EMIF_TIM1,
|
||||||
|
.sdram_tim2 = MT41K256M16HA125E_EMIF_TIM2,
|
||||||
|
.sdram_tim3 = MT41K256M16HA125E_EMIF_TIM3,
|
||||||
|
.zq_config = MT41K256M16HA125E_ZQ_CFG,
|
||||||
|
.emif_ddr_phy_ctlr_1 = MT41K256M16HA125E_EMIF_READ_LATENCY,
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_SPL_OS_BOOT
|
||||||
|
int spl_start_uboot(void)
|
||||||
|
{
|
||||||
|
/* break into full u-boot on 'c' */
|
||||||
|
return (serial_tstc() && serial_getc() == 'c');
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define OSC (V_OSCK/1000000)
|
||||||
|
const struct dpll_params dpll_ddr = {
|
||||||
|
266, OSC-1, 1, -1, -1, -1, -1};
|
||||||
|
const struct dpll_params dpll_ddr_evm_sk = {
|
||||||
|
303, OSC-1, 1, -1, -1, -1, -1};
|
||||||
|
const struct dpll_params dpll_ddr_baltos = {
|
||||||
|
400, OSC-1, 1, -1, -1, -1, -1};
|
||||||
|
|
||||||
|
void am33xx_spl_board_init(void)
|
||||||
|
{
|
||||||
|
int mpu_vdd;
|
||||||
|
int sil_rev;
|
||||||
|
|
||||||
|
/* Get the frequency */
|
||||||
|
dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The GP EVM, IDK and EVM SK use a TPS65910 PMIC. For all
|
||||||
|
* MPU frequencies we support we use a CORE voltage of
|
||||||
|
* 1.1375V. For MPU voltage we need to switch based on
|
||||||
|
* the frequency we are running at.
|
||||||
|
*/
|
||||||
|
i2c_set_bus_num(1);
|
||||||
|
|
||||||
|
if (i2c_probe(TPS65910_CTRL_I2C_ADDR)) {
|
||||||
|
puts("i2c: cannot access TPS65910\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Depending on MPU clock and PG we will need a different
|
||||||
|
* VDD to drive at that speed.
|
||||||
|
*/
|
||||||
|
sil_rev = readl(&cdev->deviceid) >> 28;
|
||||||
|
mpu_vdd = am335x_get_tps65910_mpu_vdd(sil_rev,
|
||||||
|
dpll_mpu_opp100.m);
|
||||||
|
|
||||||
|
/* Tell the TPS65910 to use i2c */
|
||||||
|
tps65910_set_i2c_control();
|
||||||
|
|
||||||
|
/* First update MPU voltage. */
|
||||||
|
if (tps65910_voltage_update(MPU, mpu_vdd))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Second, update the CORE voltage. */
|
||||||
|
if (tps65910_voltage_update(CORE, TPS65910_OP_REG_SEL_1_1_3))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Set CORE Frequencies to OPP100 */
|
||||||
|
do_setup_dpll(&dpll_core_regs, &dpll_core_opp100);
|
||||||
|
|
||||||
|
/* Set MPU Frequency to what we detected now that voltages are set */
|
||||||
|
do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100);
|
||||||
|
|
||||||
|
writel(0x000010ff, PRM_DEVICE_INST + 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct dpll_params *get_dpll_ddr_params(void)
|
||||||
|
{
|
||||||
|
enable_i2c1_pin_mux();
|
||||||
|
i2c_set_bus_num(1);
|
||||||
|
|
||||||
|
return &dpll_ddr_baltos;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_uart_mux_conf(void)
|
||||||
|
{
|
||||||
|
enable_uart0_pin_mux();
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_mux_conf_regs(void)
|
||||||
|
{
|
||||||
|
enable_board_pin_mux();
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct ctrl_ioregs ioregs_baltos = {
|
||||||
|
.cm0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
|
||||||
|
.cm1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
|
||||||
|
.cm2ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
|
||||||
|
.dt0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
|
||||||
|
.dt1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
|
||||||
|
};
|
||||||
|
|
||||||
|
void sdram_init(void)
|
||||||
|
{
|
||||||
|
gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
|
||||||
|
gpio_direction_output(GPIO_DDR_VTT_EN, 1);
|
||||||
|
|
||||||
|
config_ddr(400, &ioregs_baltos,
|
||||||
|
&ddr3_baltos_data,
|
||||||
|
&ddr3_baltos_cmd_ctrl_data,
|
||||||
|
&ddr3_baltos_emif_reg_data, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Basic board specific setup. Pinmux has been handled already.
|
||||||
|
*/
|
||||||
|
int board_init(void)
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_HW_WATCHDOG)
|
||||||
|
hw_watchdog_init();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
|
||||||
|
#if defined(CONFIG_NOR) || defined(CONFIG_NAND)
|
||||||
|
gpmc_init();
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ft_board_setup(void *blob, bd_t *bd)
|
||||||
|
{
|
||||||
|
int node, ret;
|
||||||
|
unsigned char mac_addr[6];
|
||||||
|
BSP_VS_HWPARAM header;
|
||||||
|
|
||||||
|
/* get production data */
|
||||||
|
if (read_eeprom(&header))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* setup MAC1 */
|
||||||
|
mac_addr[0] = header.MAC1[0];
|
||||||
|
mac_addr[1] = header.MAC1[1];
|
||||||
|
mac_addr[2] = header.MAC1[2];
|
||||||
|
mac_addr[3] = header.MAC1[3];
|
||||||
|
mac_addr[4] = header.MAC1[4];
|
||||||
|
mac_addr[5] = header.MAC1[5];
|
||||||
|
|
||||||
|
|
||||||
|
node = fdt_path_offset(blob, "/ocp/ethernet/slave@4a100200");
|
||||||
|
if (node < 0) {
|
||||||
|
printf("no /soc/fman/ethernet path offset\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = fdt_setprop(blob, node, "mac-address", &mac_addr, 6);
|
||||||
|
if (ret) {
|
||||||
|
printf("error setting local-mac-address property\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* setup MAC2 */
|
||||||
|
mac_addr[0] = header.MAC2[0];
|
||||||
|
mac_addr[1] = header.MAC2[1];
|
||||||
|
mac_addr[2] = header.MAC2[2];
|
||||||
|
mac_addr[3] = header.MAC2[3];
|
||||||
|
mac_addr[4] = header.MAC2[4];
|
||||||
|
mac_addr[5] = header.MAC2[5];
|
||||||
|
|
||||||
|
node = fdt_path_offset(blob, "/ocp/ethernet/slave@4a100300");
|
||||||
|
if (node < 0) {
|
||||||
|
printf("no /soc/fman/ethernet path offset\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = fdt_setprop(blob, node, "mac-address", &mac_addr, 6);
|
||||||
|
if (ret) {
|
||||||
|
printf("error setting local-mac-address property\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\nFDT was successfully setup\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct module_pin_mux dip_pin_mux[] = {
|
||||||
|
{OFFSET(gpmc_ad12), (MODE(7) | RXACTIVE )}, /* GPIO1_12 */
|
||||||
|
{OFFSET(gpmc_ad13), (MODE(7) | RXACTIVE )}, /* GPIO1_13 */
|
||||||
|
{OFFSET(gpmc_ad14), (MODE(7) | RXACTIVE )}, /* GPIO1_14 */
|
||||||
|
{OFFSET(gpmc_ad15), (MODE(7) | RXACTIVE )}, /* GPIO1_15 */
|
||||||
|
{-1},
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_BOARD_LATE_INIT
|
||||||
|
int board_late_init(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
|
||||||
|
BSP_VS_HWPARAM header;
|
||||||
|
char model[4];
|
||||||
|
|
||||||
|
/* get production data */
|
||||||
|
if (read_eeprom(&header)) {
|
||||||
|
sprintf(model, "211");
|
||||||
|
} else {
|
||||||
|
sprintf(model, "%d", header.SystemId);
|
||||||
|
if (header.SystemId == 215) {
|
||||||
|
configure_module_pin_mux(dip_pin_mux);
|
||||||
|
baltos_set_console();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setenv("board_name", model);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
|
||||||
|
(defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
|
||||||
|
static void cpsw_control(int enabled)
|
||||||
|
{
|
||||||
|
/* VTP can be added here */
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct cpsw_slave_data cpsw_slaves[] = {
|
||||||
|
{
|
||||||
|
.slave_reg_ofs = 0x208,
|
||||||
|
.sliver_reg_ofs = 0xd80,
|
||||||
|
.phy_addr = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.slave_reg_ofs = 0x308,
|
||||||
|
.sliver_reg_ofs = 0xdc0,
|
||||||
|
.phy_addr = 7,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct cpsw_platform_data cpsw_data = {
|
||||||
|
.mdio_base = CPSW_MDIO_BASE,
|
||||||
|
.cpsw_base = CPSW_BASE,
|
||||||
|
.mdio_div = 0xff,
|
||||||
|
.channels = 8,
|
||||||
|
.cpdma_reg_ofs = 0x800,
|
||||||
|
.slaves = 2,
|
||||||
|
.slave_data = cpsw_slaves,
|
||||||
|
.active_slave = 1,
|
||||||
|
.ale_reg_ofs = 0xd00,
|
||||||
|
.ale_entries = 1024,
|
||||||
|
.host_port_reg_ofs = 0x108,
|
||||||
|
.hw_stats_reg_ofs = 0x900,
|
||||||
|
.bd_ram_ofs = 0x2000,
|
||||||
|
.mac_control = (1 << 5),
|
||||||
|
.control = cpsw_control,
|
||||||
|
.host_port_num = 0,
|
||||||
|
.version = CPSW_CTRL_VERSION_2,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ((defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT)) \
|
||||||
|
&& defined(CONFIG_SPL_BUILD)) || \
|
||||||
|
((defined(CONFIG_DRIVER_TI_CPSW) || \
|
||||||
|
defined(CONFIG_USB_ETHER) && defined(CONFIG_MUSB_GADGET)) && \
|
||||||
|
!defined(CONFIG_SPL_BUILD))
|
||||||
|
int board_eth_init(bd_t *bis)
|
||||||
|
{
|
||||||
|
int rv, n = 0;
|
||||||
|
uint8_t mac_addr[6];
|
||||||
|
uint32_t mac_hi, mac_lo;
|
||||||
|
__maybe_unused struct am335x_baseboard_id header;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note here that we're using CPSW1 since that has a 1Gbit PHY while
|
||||||
|
* CSPW0 has a 100Mbit PHY.
|
||||||
|
*
|
||||||
|
* On product, CPSW1 maps to port labeled WAN.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* try reading mac address from efuse */
|
||||||
|
mac_lo = readl(&cdev->macid1l);
|
||||||
|
mac_hi = readl(&cdev->macid1h);
|
||||||
|
mac_addr[0] = mac_hi & 0xFF;
|
||||||
|
mac_addr[1] = (mac_hi & 0xFF00) >> 8;
|
||||||
|
mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
|
||||||
|
mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
|
||||||
|
mac_addr[4] = mac_lo & 0xFF;
|
||||||
|
mac_addr[5] = (mac_lo & 0xFF00) >> 8;
|
||||||
|
|
||||||
|
#if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
|
||||||
|
(defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
|
||||||
|
if (!getenv("ethaddr")) {
|
||||||
|
printf("<ethaddr> not set. Validating first E-fuse MAC\n");
|
||||||
|
|
||||||
|
if (is_valid_ethaddr(mac_addr))
|
||||||
|
eth_setenv_enetaddr("ethaddr", mac_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_DRIVER_TI_CPSW
|
||||||
|
writel((GMII1_SEL_RMII | GMII2_SEL_RGMII | RGMII2_IDMODE), &cdev->miisel);
|
||||||
|
cpsw_slaves[1].phy_if = PHY_INTERFACE_MODE_RGMII;
|
||||||
|
rv = cpsw_register(&cpsw_data);
|
||||||
|
if (rv < 0)
|
||||||
|
printf("Error %d registering CPSW switch\n", rv);
|
||||||
|
else
|
||||||
|
n += rv;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* CPSW RGMII Internal Delay Mode is not supported in all PVT
|
||||||
|
* operating points. So we must set the TX clock delay feature
|
||||||
|
* in the AR8051 PHY. Since we only support a single ethernet
|
||||||
|
* device in U-Boot, we only do this for the first instance.
|
||||||
|
*/
|
||||||
|
#define AR8051_PHY_DEBUG_ADDR_REG 0x1d
|
||||||
|
#define AR8051_PHY_DEBUG_DATA_REG 0x1e
|
||||||
|
#define AR8051_DEBUG_RGMII_CLK_DLY_REG 0x5
|
||||||
|
#define AR8051_RGMII_TX_CLK_DLY 0x100
|
||||||
|
const char *devname;
|
||||||
|
devname = miiphy_get_current_dev();
|
||||||
|
|
||||||
|
miiphy_write(devname, 0x7, AR8051_PHY_DEBUG_ADDR_REG,
|
||||||
|
AR8051_DEBUG_RGMII_CLK_DLY_REG);
|
||||||
|
miiphy_write(devname, 0x7, AR8051_PHY_DEBUG_DATA_REG,
|
||||||
|
AR8051_RGMII_TX_CLK_DLY);
|
||||||
|
#endif
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
#endif
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user