GK SDK 源码库: XMIPCLinuxV100R005C00SPC030 (kernel/tools/open_source excluded)
This commit is contained in:
@@ -0,0 +1,140 @@
|
||||
if ARCH_DAVINCI
|
||||
|
||||
choice
|
||||
prompt "DaVinci board select"
|
||||
optional
|
||||
|
||||
config TARGET_DA850EVM
|
||||
bool "DA850 EVM board"
|
||||
select MACH_DAVINCI_DA850_EVM
|
||||
select SOC_DA850
|
||||
select SUPPORT_SPL
|
||||
|
||||
config TARGET_OMAPL138_LCDK
|
||||
bool "OMAPL138 LCDK"
|
||||
select SOC_DA8XX
|
||||
select SUPPORT_SPL
|
||||
select SPL_BOARD_INIT
|
||||
|
||||
config TARGET_LEGOEV3
|
||||
bool "LEGO MINDSTORMS EV3"
|
||||
select MACH_DAVINCI_DA850_EVM
|
||||
select SOC_DA850
|
||||
|
||||
endchoice
|
||||
|
||||
config SYS_SOC
|
||||
default "davinci"
|
||||
|
||||
config DA850_LOWLEVEL
|
||||
bool "Enable Lowlevel DA850 initialization"
|
||||
depends on SOC_DA850
|
||||
|
||||
config SYS_DA850_PLL_INIT
|
||||
bool
|
||||
|
||||
config SYS_DA850_DDR_INIT
|
||||
bool
|
||||
|
||||
config SOC_DA850
|
||||
bool
|
||||
select SOC_DA8XX
|
||||
|
||||
config SOC_DA8XX
|
||||
bool
|
||||
select SYS_DA850_DDR_INIT if SUPPORT_SPL || DA850_LOWLEVEL
|
||||
select SYS_DA850_PLL_INIT if SUPPORT_SPL || DA850_LOWLEVEL
|
||||
|
||||
config MACH_DAVINCI_DA850_EVM
|
||||
bool
|
||||
|
||||
if SYS_DA850_PLL_INIT
|
||||
comment "DA850 PLL Initialization Parameters"
|
||||
|
||||
config SYS_DV_CLKMODE
|
||||
int "PLLCTL Clock Mode"
|
||||
default 0
|
||||
help
|
||||
Set PLLCTL Clock Mode bit as External Clock or On Chip oscillator
|
||||
|
||||
config SYS_DA850_PLL0_POSTDIV
|
||||
int "PLLC0 PLL Post-Divider"
|
||||
default 1
|
||||
help
|
||||
Value written to PLLC0 PLL Post-Divider Control Register
|
||||
|
||||
config SYS_DA850_PLL0_PLLDIV1
|
||||
hex "PLLC0 Divider 1"
|
||||
default 0x8000
|
||||
help
|
||||
Value written to PLLC0 Divider 1 register
|
||||
|
||||
config SYS_DA850_PLL0_PLLDIV2
|
||||
hex "PLLC0 Divider 2"
|
||||
default 0x8001
|
||||
help
|
||||
Value written to PLLC0 Divider 2 register
|
||||
|
||||
config SYS_DA850_PLL0_PLLDIV3
|
||||
hex "PLLC0 Divider 3"
|
||||
default 0x8002
|
||||
help
|
||||
Value written to PLLC0 Divider 3 register
|
||||
|
||||
config SYS_DA850_PLL0_PLLDIV4
|
||||
hex "PLLC0 Divider 4"
|
||||
default 0x8003
|
||||
help
|
||||
Value written to PLLC0 Divider 4 register
|
||||
|
||||
config SYS_DA850_PLL0_PLLDIV5
|
||||
hex "PLLC0 Divider 5"
|
||||
default 0x8002
|
||||
help
|
||||
Value written to PLLC0 Divider 5 register
|
||||
|
||||
config SYS_DA850_PLL0_PLLDIV6
|
||||
hex "PLLC0 Divider 6"
|
||||
default 0x8000
|
||||
help
|
||||
Value written to PLLC0 Divider 6 register
|
||||
|
||||
config SYS_DA850_PLL0_PLLDIV7
|
||||
hex "PLLC0 Divider 7"
|
||||
default 0x8005
|
||||
help
|
||||
Value written to PLLC0 Divider 7 register
|
||||
|
||||
config SYS_DA850_PLL1_POSTDIV
|
||||
hex "PLLC1 PLL Post-Divider"
|
||||
default 1
|
||||
help
|
||||
Value written to PLLC1 PLL Post-Divider Control Register
|
||||
|
||||
config SYS_DA850_PLL1_PLLDIV1
|
||||
hex "PLLC1 Divider 2"
|
||||
default 0x8000
|
||||
help
|
||||
Value written to PLLC1 Divider 1 register
|
||||
|
||||
config SYS_DA850_PLL1_PLLDIV2
|
||||
hex "PLLC1 Divider 2"
|
||||
default 0x8001
|
||||
help
|
||||
Value written to PLLC1 Divider 2 register
|
||||
|
||||
config SYS_DA850_PLL1_PLLDIV3
|
||||
hex "PLLC1 Divider 3"
|
||||
default 0x8002
|
||||
help
|
||||
Value written to PLLC1 Divider 3 register
|
||||
|
||||
endif
|
||||
|
||||
source "board/davinci/da8xxevm/Kconfig"
|
||||
source "board/lego/ev3/Kconfig"
|
||||
|
||||
config SPL_LDSCRIPT
|
||||
default "board/$(BOARDDIR)/u-boot-spl-da850evm.lds"
|
||||
|
||||
endif
|
||||
@@ -0,0 +1,20 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
# (C) Copyright 2000-2006
|
||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
#
|
||||
# Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
|
||||
|
||||
obj-y += cpu.o misc.o timer.o psc.o pinmux.o reset.o
|
||||
obj-$(CONFIG_DA850_LOWLEVEL) += da850_lowlevel.o
|
||||
obj-$(CONFIG_SOC_DM355) += dm355.o
|
||||
obj-$(CONFIG_SOC_DM365) += dm365.o
|
||||
obj-$(CONFIG_SOC_DM644X) += dm644x.o
|
||||
obj-$(CONFIG_SOC_DM646X) += dm646x.o
|
||||
obj-$(CONFIG_SOC_DA850) += da850_pinmux.o
|
||||
|
||||
ifdef CONFIG_SPL_BUILD
|
||||
obj-$(CONFIG_SPL_FRAMEWORK) += spl.o
|
||||
obj-$(CONFIG_SOC_DM365) += dm365_lowlevel.o
|
||||
obj-$(CONFIG_SOC_DA8XX) += da850_lowlevel.o
|
||||
endif
|
||||
@@ -0,0 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
# Copyright (C) 2012, Texas Instruments, Incorporated - http://www.ti.com/
|
||||
ifndef CONFIG_SPL_BUILD
|
||||
ALL-$(CONFIG_SPL_FRAMEWORK) += u-boot.ais
|
||||
endif
|
||||
@@ -0,0 +1,91 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Copyright (C) 2004 Texas Instruments.
|
||||
* Copyright (C) 2009 David Brownell
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
/* offsets from PLL controller base */
|
||||
#define PLLC_PLLCTL 0x100
|
||||
#define PLLC_PLLM 0x110
|
||||
#define PLLC_PREDIV 0x114
|
||||
#define PLLC_PLLDIV1 0x118
|
||||
#define PLLC_PLLDIV2 0x11c
|
||||
#define PLLC_PLLDIV3 0x120
|
||||
#define PLLC_POSTDIV 0x128
|
||||
#define PLLC_BPDIV 0x12c
|
||||
#define PLLC_PLLDIV4 0x160
|
||||
#define PLLC_PLLDIV5 0x164
|
||||
#define PLLC_PLLDIV6 0x168
|
||||
#define PLLC_PLLDIV7 0x16c
|
||||
#define PLLC_PLLDIV8 0x170
|
||||
#define PLLC_PLLDIV9 0x174
|
||||
|
||||
unsigned int sysdiv[9] = {
|
||||
PLLC_PLLDIV1, PLLC_PLLDIV2, PLLC_PLLDIV3, PLLC_PLLDIV4, PLLC_PLLDIV5,
|
||||
PLLC_PLLDIV6, PLLC_PLLDIV7, PLLC_PLLDIV8, PLLC_PLLDIV9
|
||||
};
|
||||
|
||||
int clk_get(enum davinci_clk_ids id)
|
||||
{
|
||||
int pre_div;
|
||||
int pllm;
|
||||
int post_div;
|
||||
int pll_out;
|
||||
unsigned int pll_base;
|
||||
|
||||
pll_out = CONFIG_SYS_OSCIN_FREQ;
|
||||
|
||||
if (id == DAVINCI_AUXCLK_CLKID)
|
||||
goto out;
|
||||
|
||||
if ((id >> 16) == 1)
|
||||
pll_base = (unsigned int)davinci_pllc1_regs;
|
||||
else
|
||||
pll_base = (unsigned int)davinci_pllc0_regs;
|
||||
|
||||
id &= 0xFFFF;
|
||||
|
||||
/*
|
||||
* Lets keep this simple. Combining operations can result in
|
||||
* unexpected approximations
|
||||
*/
|
||||
pre_div = (readl(pll_base + PLLC_PREDIV) &
|
||||
DAVINCI_PLLC_DIV_MASK) + 1;
|
||||
pllm = readl(pll_base + PLLC_PLLM) + 1;
|
||||
|
||||
pll_out /= pre_div;
|
||||
pll_out *= pllm;
|
||||
|
||||
if (id == DAVINCI_PLLM_CLKID)
|
||||
goto out;
|
||||
|
||||
post_div = (readl(pll_base + PLLC_POSTDIV) &
|
||||
DAVINCI_PLLC_DIV_MASK) + 1;
|
||||
|
||||
pll_out /= post_div;
|
||||
|
||||
if (id == DAVINCI_PLLC_CLKID)
|
||||
goto out;
|
||||
|
||||
pll_out /= (readl(pll_base + sysdiv[id - 1]) &
|
||||
DAVINCI_PLLC_DIV_MASK) + 1;
|
||||
|
||||
out:
|
||||
return pll_out;
|
||||
}
|
||||
|
||||
int set_cpu_clk_info(void)
|
||||
{
|
||||
gd->bd->bi_arm_freq = clk_get(DAVINCI_ARM_CLKID) / 1000000;
|
||||
/* DDR PHY uses an x2 input clock */
|
||||
gd->bd->bi_ddr_freq = cpu_is_da830() ? 0 :
|
||||
(clk_get(DAVINCI_DDR_CLKID) / 1000000);
|
||||
gd->bd->bi_dsp_freq = 0;
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,312 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* SoC-specific lowlevel code for DA850
|
||||
*
|
||||
* Copyright (C) 2011
|
||||
* Heiko Schocher, DENX Software Engineering, hs@denx.de.
|
||||
*/
|
||||
#include <common.h>
|
||||
#include <nand.h>
|
||||
#include <ns16550.h>
|
||||
#include <post.h>
|
||||
#include <asm/arch/da850_lowlevel.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/davinci_misc.h>
|
||||
#include <asm/arch/ddr2_defs.h>
|
||||
#include <asm/ti-common/davinci_nand.h>
|
||||
#include <asm/arch/pll_defs.h>
|
||||
|
||||
void davinci_enable_uart0(void)
|
||||
{
|
||||
lpsc_on(DAVINCI_LPSC_UART0);
|
||||
|
||||
/* Bringup UART0 out of reset */
|
||||
REG(UART0_PWREMU_MGMT) = 0x00006001;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_SYS_DA850_PLL_INIT)
|
||||
static void da850_waitloop(unsigned long loopcnt)
|
||||
{
|
||||
unsigned long i;
|
||||
|
||||
for (i = 0; i < loopcnt; i++)
|
||||
asm(" NOP");
|
||||
}
|
||||
|
||||
static int da850_pll_init(struct davinci_pllc_regs *reg, unsigned long pllmult)
|
||||
{
|
||||
if (reg == davinci_pllc0_regs)
|
||||
/* Unlock PLL registers. */
|
||||
clrbits_le32(&davinci_syscfg_regs->cfgchip0, PLL_MASTER_LOCK);
|
||||
|
||||
/*
|
||||
* Set PLLENSRC '0',bit 5, PLL Enable(PLLEN) selection is controlled
|
||||
* through MMR
|
||||
*/
|
||||
clrbits_le32(®->pllctl, PLLCTL_PLLENSRC);
|
||||
/* PLLCTL.EXTCLKSRC bit 9 should be left at 0 for Freon */
|
||||
clrbits_le32(®->pllctl, PLLCTL_EXTCLKSRC);
|
||||
|
||||
/* Set PLLEN=0 => PLL BYPASS MODE */
|
||||
clrbits_le32(®->pllctl, PLLCTL_PLLEN);
|
||||
|
||||
da850_waitloop(150);
|
||||
|
||||
if (reg == davinci_pllc0_regs) {
|
||||
/*
|
||||
* Select the Clock Mode bit 8 as External Clock or On Chip
|
||||
* Oscilator
|
||||
*/
|
||||
dv_maskbits(®->pllctl, ~PLLCTL_RES_9);
|
||||
setbits_le32(®->pllctl,
|
||||
(CONFIG_SYS_DV_CLKMODE << PLLCTL_CLOCK_MODE_SHIFT));
|
||||
}
|
||||
|
||||
/* Clear PLLRST bit to reset the PLL */
|
||||
clrbits_le32(®->pllctl, PLLCTL_PLLRST);
|
||||
|
||||
/* Disable the PLL output */
|
||||
setbits_le32(®->pllctl, PLLCTL_PLLDIS);
|
||||
|
||||
/* PLL initialization sequence */
|
||||
/*
|
||||
* Power up the PLL- PWRDN bit set to 0 to bring the PLL out of
|
||||
* power down bit
|
||||
*/
|
||||
clrbits_le32(®->pllctl, PLLCTL_PLLPWRDN);
|
||||
|
||||
/* Enable the PLL from Disable Mode PLLDIS bit to 0 */
|
||||
clrbits_le32(®->pllctl, PLLCTL_PLLDIS);
|
||||
|
||||
#if defined(CONFIG_SYS_DA850_PLL0_PREDIV)
|
||||
/* program the prediv */
|
||||
if (reg == davinci_pllc0_regs && CONFIG_SYS_DA850_PLL0_PREDIV)
|
||||
writel((PLL_DIVEN | CONFIG_SYS_DA850_PLL0_PREDIV),
|
||||
®->prediv);
|
||||
#endif
|
||||
|
||||
/* Program the required multiplier value in PLLM */
|
||||
writel(pllmult, ®->pllm);
|
||||
|
||||
/* program the postdiv */
|
||||
if (reg == davinci_pllc0_regs)
|
||||
writel((PLL_POSTDEN | CONFIG_SYS_DA850_PLL0_POSTDIV),
|
||||
®->postdiv);
|
||||
else
|
||||
writel((PLL_POSTDEN | CONFIG_SYS_DA850_PLL1_POSTDIV),
|
||||
®->postdiv);
|
||||
|
||||
/*
|
||||
* Check for the GOSTAT bit in PLLSTAT to clear to 0 to indicate that
|
||||
* no GO operation is currently in progress
|
||||
*/
|
||||
while ((readl(®->pllstat) & PLLCMD_GOSTAT) == PLLCMD_GOSTAT)
|
||||
;
|
||||
|
||||
if (reg == davinci_pllc0_regs) {
|
||||
writel(CONFIG_SYS_DA850_PLL0_PLLDIV1, ®->plldiv1);
|
||||
writel(CONFIG_SYS_DA850_PLL0_PLLDIV2, ®->plldiv2);
|
||||
writel(CONFIG_SYS_DA850_PLL0_PLLDIV3, ®->plldiv3);
|
||||
writel(CONFIG_SYS_DA850_PLL0_PLLDIV4, ®->plldiv4);
|
||||
writel(CONFIG_SYS_DA850_PLL0_PLLDIV5, ®->plldiv5);
|
||||
writel(CONFIG_SYS_DA850_PLL0_PLLDIV6, ®->plldiv6);
|
||||
writel(CONFIG_SYS_DA850_PLL0_PLLDIV7, ®->plldiv7);
|
||||
} else {
|
||||
writel(CONFIG_SYS_DA850_PLL1_PLLDIV1, ®->plldiv1);
|
||||
writel(CONFIG_SYS_DA850_PLL1_PLLDIV2, ®->plldiv2);
|
||||
writel(CONFIG_SYS_DA850_PLL1_PLLDIV3, ®->plldiv3);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the GOSET bit in PLLCMD to 1 to initiate a new divider
|
||||
* transition.
|
||||
*/
|
||||
setbits_le32(®->pllcmd, PLLCMD_GOSTAT);
|
||||
|
||||
/*
|
||||
* Wait for the GOSTAT bit in PLLSTAT to clear to 0
|
||||
* (completion of phase alignment).
|
||||
*/
|
||||
while ((readl(®->pllstat) & PLLCMD_GOSTAT) == PLLCMD_GOSTAT)
|
||||
;
|
||||
|
||||
/* Wait for PLL to reset properly. See PLL spec for PLL reset time */
|
||||
da850_waitloop(200);
|
||||
|
||||
/* Set the PLLRST bit in PLLCTL to 1 to bring the PLL out of reset */
|
||||
setbits_le32(®->pllctl, PLLCTL_PLLRST);
|
||||
|
||||
/* Wait for PLL to lock. See PLL spec for PLL lock time */
|
||||
da850_waitloop(2400);
|
||||
|
||||
/*
|
||||
* Set the PLLEN bit in PLLCTL to 1 to remove the PLL from bypass
|
||||
* mode
|
||||
*/
|
||||
setbits_le32(®->pllctl, PLLCTL_PLLEN);
|
||||
|
||||
|
||||
/*
|
||||
* clear EMIFA and EMIFB clock source settings, let them
|
||||
* run off SYSCLK
|
||||
*/
|
||||
if (reg == davinci_pllc0_regs)
|
||||
dv_maskbits(&davinci_syscfg_regs->cfgchip3,
|
||||
~(PLL_SCSCFG3_DIV45PENA | PLL_SCSCFG3_EMA_CLKSRC));
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_SYS_DA850_PLL_INIT */
|
||||
|
||||
#if defined(CONFIG_SYS_DA850_DDR_INIT)
|
||||
static int da850_ddr_setup(void)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
||||
/* Enable the Clock to DDR2/mDDR */
|
||||
lpsc_on(DAVINCI_LPSC_DDR_EMIF);
|
||||
|
||||
tmp = readl(&davinci_syscfg1_regs->vtpio_ctl);
|
||||
if ((tmp & VTP_POWERDWN) == VTP_POWERDWN) {
|
||||
/* Begin VTP Calibration */
|
||||
clrbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_POWERDWN);
|
||||
clrbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_LOCK);
|
||||
setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_CLKRZ);
|
||||
clrbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_CLKRZ);
|
||||
setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_CLKRZ);
|
||||
|
||||
/* Polling READY bit to see when VTP calibration is done */
|
||||
tmp = readl(&davinci_syscfg1_regs->vtpio_ctl);
|
||||
while ((tmp & VTP_READY) != VTP_READY)
|
||||
tmp = readl(&davinci_syscfg1_regs->vtpio_ctl);
|
||||
|
||||
setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_LOCK);
|
||||
setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_POWERDWN);
|
||||
}
|
||||
setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_IOPWRDWN);
|
||||
writel(CONFIG_SYS_DA850_DDR2_DDRPHYCR, &dv_ddr2_regs_ctrl->ddrphycr);
|
||||
|
||||
if (CONFIG_SYS_DA850_DDR2_SDBCR & (1 << DV_DDR_SDCR_DDR2EN_SHIFT)) {
|
||||
/* DDR2 */
|
||||
clrbits_le32(&davinci_syscfg1_regs->ddr_slew,
|
||||
(1 << DDR_SLEW_DDR_PDENA_BIT) |
|
||||
(1 << DDR_SLEW_CMOSEN_BIT));
|
||||
} else {
|
||||
/* MOBILE DDR */
|
||||
setbits_le32(&davinci_syscfg1_regs->ddr_slew,
|
||||
(1 << DDR_SLEW_DDR_PDENA_BIT) |
|
||||
(1 << DDR_SLEW_CMOSEN_BIT));
|
||||
}
|
||||
|
||||
/*
|
||||
* SDRAM Configuration Register (SDCR):
|
||||
* First set the BOOTUNLOCK bit to make configuration bits
|
||||
* writeable.
|
||||
*/
|
||||
setbits_le32(&dv_ddr2_regs_ctrl->sdbcr, DV_DDR_BOOTUNLOCK);
|
||||
|
||||
/*
|
||||
* Write the new value of these bits and clear BOOTUNLOCK.
|
||||
* At the same time, set the TIMUNLOCK bit to allow changing
|
||||
* the timing registers
|
||||
*/
|
||||
tmp = CONFIG_SYS_DA850_DDR2_SDBCR;
|
||||
tmp &= ~DV_DDR_BOOTUNLOCK;
|
||||
tmp |= DV_DDR_TIMUNLOCK;
|
||||
writel(tmp, &dv_ddr2_regs_ctrl->sdbcr);
|
||||
|
||||
/* write memory configuration and timing */
|
||||
if (!(CONFIG_SYS_DA850_DDR2_SDBCR & (1 << DV_DDR_SDCR_DDR2EN_SHIFT))) {
|
||||
/* MOBILE DDR only*/
|
||||
writel(CONFIG_SYS_DA850_DDR2_SDBCR2,
|
||||
&dv_ddr2_regs_ctrl->sdbcr2);
|
||||
}
|
||||
writel(CONFIG_SYS_DA850_DDR2_SDTIMR, &dv_ddr2_regs_ctrl->sdtimr);
|
||||
writel(CONFIG_SYS_DA850_DDR2_SDTIMR2, &dv_ddr2_regs_ctrl->sdtimr2);
|
||||
|
||||
/* clear the TIMUNLOCK bit and write the value of the CL field */
|
||||
tmp &= ~DV_DDR_TIMUNLOCK;
|
||||
writel(tmp, &dv_ddr2_regs_ctrl->sdbcr);
|
||||
|
||||
/*
|
||||
* LPMODEN and MCLKSTOPEN must be set!
|
||||
* Without this bits set, PSC don;t switch states !!
|
||||
*/
|
||||
writel(CONFIG_SYS_DA850_DDR2_SDRCR |
|
||||
(1 << DV_DDR_SRCR_LPMODEN_SHIFT) |
|
||||
(1 << DV_DDR_SRCR_MCLKSTOPEN_SHIFT),
|
||||
&dv_ddr2_regs_ctrl->sdrcr);
|
||||
|
||||
/* SyncReset the Clock to EMIF3A SDRAM */
|
||||
lpsc_syncreset(DAVINCI_LPSC_DDR_EMIF);
|
||||
/* Enable the Clock to EMIF3A SDRAM */
|
||||
lpsc_on(DAVINCI_LPSC_DDR_EMIF);
|
||||
|
||||
/* disable self refresh */
|
||||
clrbits_le32(&dv_ddr2_regs_ctrl->sdrcr,
|
||||
DV_DDR_SDRCR_LPMODEN | DV_DDR_SDRCR_MCLKSTOPEN);
|
||||
writel(CONFIG_SYS_DA850_DDR2_PBBPR, &dv_ddr2_regs_ctrl->pbbpr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_SYS_DA850_DDR_INIT */
|
||||
|
||||
__attribute__((weak))
|
||||
void board_gpio_init(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int arch_cpu_init(void)
|
||||
{
|
||||
/* Unlock kick registers */
|
||||
writel(DV_SYSCFG_KICK0_UNLOCK, &davinci_syscfg_regs->kick0);
|
||||
writel(DV_SYSCFG_KICK1_UNLOCK, &davinci_syscfg_regs->kick1);
|
||||
|
||||
dv_maskbits(&davinci_syscfg_regs->suspsrc,
|
||||
CONFIG_SYS_DA850_SYSCFG_SUSPSRC);
|
||||
|
||||
/* configure pinmux settings */
|
||||
if (davinci_configure_pin_mux_items(pinmuxes, pinmuxes_size))
|
||||
return 1;
|
||||
|
||||
#if defined(CONFIG_SYS_DA850_PLL_INIT)
|
||||
/* PLL setup */
|
||||
da850_pll_init(davinci_pllc0_regs, CONFIG_SYS_DA850_PLL0_PLLM);
|
||||
da850_pll_init(davinci_pllc1_regs, CONFIG_SYS_DA850_PLL1_PLLM);
|
||||
#endif
|
||||
/* setup CSn config */
|
||||
#if defined(CONFIG_SYS_DA850_CS2CFG)
|
||||
writel(CONFIG_SYS_DA850_CS2CFG, &davinci_emif_regs->ab1cr);
|
||||
#endif
|
||||
#if defined(CONFIG_SYS_DA850_CS3CFG)
|
||||
writel(CONFIG_SYS_DA850_CS3CFG, &davinci_emif_regs->ab2cr);
|
||||
#endif
|
||||
|
||||
da8xx_configure_lpsc_items(lpsc, lpsc_size);
|
||||
|
||||
/* GPIO setup */
|
||||
board_gpio_init();
|
||||
|
||||
#if !CONFIG_IS_ENABLED(DM_SERIAL)
|
||||
NS16550_init((NS16550_t)(CONFIG_SYS_NS16550_COM1),
|
||||
CONFIG_SYS_NS16550_CLK / 16 / CONFIG_BAUDRATE);
|
||||
#endif
|
||||
/*
|
||||
* Fix Power and Emulation Management Register
|
||||
* see sprufw3a.pdf page 37 Table 24
|
||||
*/
|
||||
writel((DAVINCI_UART_PWREMU_MGMT_FREE | DAVINCI_UART_PWREMU_MGMT_URRST |
|
||||
DAVINCI_UART_PWREMU_MGMT_UTRST),
|
||||
#if (CONFIG_SYS_NS16550_COM1 == DAVINCI_UART0_BASE)
|
||||
&davinci_uart0_ctrl_regs->pwremu_mgmt);
|
||||
#else
|
||||
&davinci_uart2_ctrl_regs->pwremu_mgmt);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SYS_DA850_DDR_INIT)
|
||||
da850_ddr_setup();
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,190 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Pinmux configurations for the DA850 SoCs
|
||||
*
|
||||
* Copyright (C) 2011 OMICRON electronics GmbH
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/arch/davinci_misc.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/pinmux_defs.h>
|
||||
|
||||
/* SPI pin muxer settings */
|
||||
const struct pinmux_config spi0_pins_base[] = {
|
||||
{ pinmux(3), 1, 0 }, /* SPI0_CLK */
|
||||
{ pinmux(3), 1, 2 }, /* SPI0_SOMI */
|
||||
{ pinmux(3), 1, 3 }, /* SPI0_SIMO */
|
||||
};
|
||||
|
||||
const struct pinmux_config spi0_pins_scs0[] = {
|
||||
{ pinmux(4), 1, 1 }, /* SPI0_SCS[0] */
|
||||
};
|
||||
|
||||
const struct pinmux_config spi1_pins_base[] = {
|
||||
{ pinmux(5), 1, 2 }, /* SPI1_CLK */
|
||||
{ pinmux(5), 1, 4 }, /* SPI1_SOMI */
|
||||
{ pinmux(5), 1, 5 }, /* SPI1_SIMO */
|
||||
};
|
||||
|
||||
const struct pinmux_config spi1_pins_scs0[] = {
|
||||
{ pinmux(5), 1, 1 }, /* SPI1_SCS[0] */
|
||||
};
|
||||
|
||||
/* UART pin muxer settings */
|
||||
const struct pinmux_config uart0_pins_txrx[] = {
|
||||
{ pinmux(3), 2, 4 }, /* UART0_RXD */
|
||||
{ pinmux(3), 2, 5 }, /* UART0_TXD */
|
||||
};
|
||||
|
||||
const struct pinmux_config uart0_pins_rtscts[] = {
|
||||
{ pinmux(3), 2, 6 },
|
||||
{ pinmux(3), 2, 7 },
|
||||
};
|
||||
|
||||
const struct pinmux_config uart1_pins_txrx[] = {
|
||||
{ pinmux(4), 2, 6 }, /* UART1_RXD */
|
||||
{ pinmux(4), 2, 7 }, /* UART1_TXD */
|
||||
};
|
||||
|
||||
const struct pinmux_config uart2_pins_txrx[] = {
|
||||
{ pinmux(4), 2, 4 }, /* UART2_RXD */
|
||||
{ pinmux(4), 2, 5 }, /* UART2_TXD */
|
||||
};
|
||||
|
||||
const struct pinmux_config uart2_pins_rtscts[] = {
|
||||
{ pinmux(0), 4, 6 }, /* UART2_RTS */
|
||||
{ pinmux(0), 4, 7 }, /* UART2_CTS */
|
||||
};
|
||||
|
||||
/* EMAC pin muxer settings*/
|
||||
const struct pinmux_config emac_pins_rmii[] = {
|
||||
{ pinmux(14), 8, 2 }, /* RMII_TXD[1] */
|
||||
{ pinmux(14), 8, 3 }, /* RMII_TXD[0] */
|
||||
{ pinmux(14), 8, 4 }, /* RMII_TXEN */
|
||||
{ pinmux(14), 8, 5 }, /* RMII_RXD[1] */
|
||||
{ pinmux(14), 8, 6 }, /* RMII_RXD[0] */
|
||||
{ pinmux(14), 8, 7 }, /* RMII_RXER */
|
||||
{ pinmux(15), 0, 0 }, /* RMII_MHz_50_CLK */
|
||||
{ pinmux(15), 8, 1 }, /* RMII_CRS_DV */
|
||||
};
|
||||
|
||||
const struct pinmux_config emac_pins_mii[] = {
|
||||
{ pinmux(2), 8, 1 }, /* MII_TXEN */
|
||||
{ pinmux(2), 8, 2 }, /* MII_TXCLK */
|
||||
{ pinmux(2), 8, 3 }, /* MII_COL */
|
||||
{ pinmux(2), 8, 4 }, /* MII_TXD[3] */
|
||||
{ pinmux(2), 8, 5 }, /* MII_TXD[2] */
|
||||
{ pinmux(2), 8, 6 }, /* MII_TXD[1] */
|
||||
{ pinmux(2), 8, 7 }, /* MII_TXD[0] */
|
||||
{ pinmux(3), 8, 0 }, /* MII_RXCLK */
|
||||
{ pinmux(3), 8, 1 }, /* MII_RXDV */
|
||||
{ pinmux(3), 8, 2 }, /* MII_RXER */
|
||||
{ pinmux(3), 8, 3 }, /* MII_CRS */
|
||||
{ pinmux(3), 8, 4 }, /* MII_RXD[3] */
|
||||
{ pinmux(3), 8, 5 }, /* MII_RXD[2] */
|
||||
{ pinmux(3), 8, 6 }, /* MII_RXD[1] */
|
||||
{ pinmux(3), 8, 7 }, /* MII_RXD[0] */
|
||||
};
|
||||
|
||||
const struct pinmux_config emac_pins_mdio[] = {
|
||||
{ pinmux(4), 8, 0 }, /* MDIO_CLK */
|
||||
{ pinmux(4), 8, 1 }, /* MDIO_D */
|
||||
};
|
||||
|
||||
/* I2C pin muxer settings */
|
||||
const struct pinmux_config i2c0_pins[] = {
|
||||
{ pinmux(4), 2, 2 }, /* I2C0_SCL */
|
||||
{ pinmux(4), 2, 3 }, /* I2C0_SDA */
|
||||
};
|
||||
|
||||
const struct pinmux_config i2c1_pins[] = {
|
||||
{ pinmux(4), 4, 4 }, /* I2C1_SCL */
|
||||
{ pinmux(4), 4, 5 }, /* I2C1_SDA */
|
||||
};
|
||||
|
||||
/* EMIFA pin muxer settings */
|
||||
const struct pinmux_config emifa_pins_cs2[] = {
|
||||
{ pinmux(7), 1, 0 }, /* EMA_CS2 */
|
||||
};
|
||||
|
||||
const struct pinmux_config emifa_pins_cs3[] = {
|
||||
{ pinmux(7), 1, 1 }, /* EMA_CS[3] */
|
||||
};
|
||||
|
||||
const struct pinmux_config emifa_pins_cs4[] = {
|
||||
{ pinmux(7), 1, 2 }, /* EMA_CS[4] */
|
||||
};
|
||||
|
||||
const struct pinmux_config emifa_pins_nand[] = {
|
||||
{ pinmux(7), 1, 4 }, /* EMA_WE */
|
||||
{ pinmux(7), 1, 5 }, /* EMA_OE */
|
||||
{ pinmux(9), 1, 0 }, /* EMA_D[7] */
|
||||
{ pinmux(9), 1, 1 }, /* EMA_D[6] */
|
||||
{ pinmux(9), 1, 2 }, /* EMA_D[5] */
|
||||
{ pinmux(9), 1, 3 }, /* EMA_D[4] */
|
||||
{ pinmux(9), 1, 4 }, /* EMA_D[3] */
|
||||
{ pinmux(9), 1, 5 }, /* EMA_D[2] */
|
||||
{ pinmux(9), 1, 6 }, /* EMA_D[1] */
|
||||
{ pinmux(9), 1, 7 }, /* EMA_D[0] */
|
||||
{ pinmux(12), 1, 5 }, /* EMA_A[2] */
|
||||
{ pinmux(12), 1, 6 }, /* EMA_A[1] */
|
||||
};
|
||||
|
||||
/* NOR pin muxer settings */
|
||||
const struct pinmux_config emifa_pins_nor[] = {
|
||||
{ pinmux(5), 1, 6 }, /* EMA_BA[1] */
|
||||
{ pinmux(6), 1, 6 }, /* EMA_WAIT[1] */
|
||||
{ pinmux(7), 1, 4 }, /* EMA_WE */
|
||||
{ pinmux(7), 1, 5 }, /* EMA_OE */
|
||||
{ pinmux(8), 1, 0 }, /* EMA_D[15] */
|
||||
{ pinmux(8), 1, 1 }, /* EMA_D[14] */
|
||||
{ pinmux(8), 1, 2 }, /* EMA_D[13] */
|
||||
{ pinmux(8), 1, 3 }, /* EMA_D[12] */
|
||||
{ pinmux(8), 1, 4 }, /* EMA_D[11] */
|
||||
{ pinmux(8), 1, 5 }, /* EMA_D[10] */
|
||||
{ pinmux(8), 1, 6 }, /* EMA_D[9] */
|
||||
{ pinmux(8), 1, 7 }, /* EMA_D[8] */
|
||||
{ pinmux(9), 1, 0 }, /* EMA_D[7] */
|
||||
{ pinmux(9), 1, 1 }, /* EMA_D[6] */
|
||||
{ pinmux(9), 1, 2 }, /* EMA_D[5] */
|
||||
{ pinmux(9), 1, 3 }, /* EMA_D[4] */
|
||||
{ pinmux(9), 1, 4 }, /* EMA_D[3] */
|
||||
{ pinmux(9), 1, 5 }, /* EMA_D[2] */
|
||||
{ pinmux(9), 1, 6 }, /* EMA_D[1] */
|
||||
{ pinmux(9), 1, 7 }, /* EMA_D[0] */
|
||||
{ pinmux(10), 1, 1 }, /* EMA_A[22] */
|
||||
{ pinmux(10), 1, 2 }, /* EMA_A[21] */
|
||||
{ pinmux(10), 1, 3 }, /* EMA_A[20] */
|
||||
{ pinmux(10), 1, 4 }, /* EMA_A[19] */
|
||||
{ pinmux(10), 1, 5 }, /* EMA_A[18] */
|
||||
{ pinmux(10), 1, 6 }, /* EMA_A[17] */
|
||||
{ pinmux(10), 1, 7 }, /* EMA_A[16] */
|
||||
{ pinmux(11), 1, 0 }, /* EMA_A[15] */
|
||||
{ pinmux(11), 1, 1 }, /* EMA_A[14] */
|
||||
{ pinmux(11), 1, 2 }, /* EMA_A[13] */
|
||||
{ pinmux(11), 1, 3 }, /* EMA_A[12] */
|
||||
{ pinmux(11), 1, 4 }, /* EMA_A[11] */
|
||||
{ pinmux(11), 1, 5 }, /* EMA_A[10] */
|
||||
{ pinmux(11), 1, 6 }, /* EMA_A[9] */
|
||||
{ pinmux(11), 1, 7 }, /* EMA_A[8] */
|
||||
{ pinmux(12), 1, 0 }, /* EMA_A[7] */
|
||||
{ pinmux(12), 1, 1 }, /* EMA_A[6] */
|
||||
{ pinmux(12), 1, 2 }, /* EMA_A[5] */
|
||||
{ pinmux(12), 1, 3 }, /* EMA_A[4] */
|
||||
{ pinmux(12), 1, 4 }, /* EMA_A[3] */
|
||||
{ pinmux(12), 1, 5 }, /* EMA_A[2] */
|
||||
{ pinmux(12), 1, 6 }, /* EMA_A[1] */
|
||||
{ pinmux(12), 1, 7 }, /* EMA_A[0] */
|
||||
};
|
||||
|
||||
/* MMC0 pin muxer settings */
|
||||
const struct pinmux_config mmc0_pins[] = {
|
||||
{ pinmux(10), 2, 0 }, /* MMCSD0_CLK */
|
||||
{ pinmux(10), 2, 1 }, /* MMCSD0_CMD */
|
||||
{ pinmux(10), 2, 2 }, /* MMCSD0_DAT_0 */
|
||||
{ pinmux(10), 2, 3 }, /* MMCSD0_DAT_1 */
|
||||
{ pinmux(10), 2, 4 }, /* MMCSD0_DAT_2 */
|
||||
{ pinmux(10), 2, 5 }, /* MMCSD0_DAT_3 */
|
||||
/* DA850 supports only 4-bit mode, remaining pins are not configured */
|
||||
};
|
||||
@@ -0,0 +1,35 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2011
|
||||
* Heiko Schocher, DENX Software Engineering, hs@denx.de.
|
||||
*/
|
||||
#ifndef _DV_AINTC_DEFS_H_
|
||||
#define _DV_AINTC_DEFS_H_
|
||||
|
||||
struct dv_aintc_regs {
|
||||
unsigned int fiq0; /* 0x00 */
|
||||
unsigned int fiq1; /* 0x04 */
|
||||
unsigned int irq0; /* 0x08 */
|
||||
unsigned int irq1; /* 0x0c */
|
||||
unsigned int fiqentry; /* 0x10 */
|
||||
unsigned int irqentry; /* 0x14 */
|
||||
unsigned int eint0; /* 0x18 */
|
||||
unsigned int eint1; /* 0x1c */
|
||||
unsigned int intctl; /* 0x20 */
|
||||
unsigned int eabase; /* 0x24 */
|
||||
unsigned char rsvd0[8]; /* 0x28 */
|
||||
unsigned int intpri0; /* 0x30 */
|
||||
unsigned int intpri1; /* 0x34 */
|
||||
unsigned int intpri2; /* 0x38 */
|
||||
unsigned int intpri3; /* 0x3c */
|
||||
unsigned int intpri4; /* 0x40 */
|
||||
unsigned int intpri5; /* 0x44 */
|
||||
unsigned int intpri6; /* 0x48 */
|
||||
unsigned int intpri7; /* 0x4c */
|
||||
};
|
||||
|
||||
#define dv_aintc_regs ((struct dv_aintc_regs *)DAVINCI_ARM_INTC_BASE)
|
||||
|
||||
#define DV_AINTC_INTCTL_IDMODE (1 << 2)
|
||||
|
||||
#endif /* _DV_AINTC_DEFS_H_ */
|
||||
@@ -0,0 +1,34 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* SoC-specific lowlevel code for DA850
|
||||
*
|
||||
* Copyright (C) 2011
|
||||
* Heiko Schocher, DENX Software Engineering, hs@denx.de.
|
||||
*/
|
||||
#ifndef __DA850_LOWLEVEL_H
|
||||
#define __DA850_LOWLEVEL_H
|
||||
|
||||
#include <asm/arch/pinmux_defs.h>
|
||||
|
||||
/* pinmux_resource[] vector is defined in the board specific file */
|
||||
extern const struct pinmux_resource pinmuxes[];
|
||||
extern const int pinmuxes_size;
|
||||
|
||||
extern const struct lpsc_resource lpsc[];
|
||||
extern const int lpsc_size;
|
||||
|
||||
/* NOR Boot Configuration Word Field Descriptions */
|
||||
#define DA850_NORBOOT_COPY_XK(X) ((X - 1) << 8)
|
||||
#define DA850_NORBOOT_METHOD_DIRECT (1 << 4)
|
||||
#define DA850_NORBOOT_16BIT (1 << 0)
|
||||
|
||||
#define dv_maskbits(addr, val) \
|
||||
writel((readl(addr) & val), addr)
|
||||
|
||||
void da850_lpc_transition(unsigned char pscnum, unsigned char module,
|
||||
unsigned char domain, unsigned char state);
|
||||
void da850_psc_init(void);
|
||||
void da850_pinmux_ctl(unsigned long offset, unsigned long mask,
|
||||
unsigned long value);
|
||||
|
||||
#endif /* #ifndef __DA850_LOWLEVEL_H */
|
||||
@@ -0,0 +1,89 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* da8xx-usb.h -- TI's DA8xx platform specific usb wrapper definitions.
|
||||
*
|
||||
* Author: Ajay Kumar Gupta <ajay.gupta@ti.com>
|
||||
*
|
||||
* Based on drivers/usb/musb/davinci.h
|
||||
*
|
||||
* Copyright (C) 2009 Texas Instruments Incorporated
|
||||
*/
|
||||
#ifndef __DA8XX_MUSB_H__
|
||||
#define __DA8XX_MUSB_H__
|
||||
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/gpio.h>
|
||||
|
||||
/* Base address of da8xx usb0 wrapper */
|
||||
#define DA8XX_USB_OTG_BASE 0x01E00000
|
||||
|
||||
/* Base address of da8xx musb core */
|
||||
#define DA8XX_USB_OTG_CORE_BASE (DA8XX_USB_OTG_BASE + 0x400)
|
||||
|
||||
/* Timeout for DA8xx usb module */
|
||||
#define DA8XX_USB_OTG_TIMEOUT 0x3FFFFFF
|
||||
|
||||
/*
|
||||
* DA8xx platform USB wrapper register overlay.
|
||||
*/
|
||||
struct da8xx_usb_regs {
|
||||
dv_reg revision;
|
||||
dv_reg control;
|
||||
dv_reg status;
|
||||
dv_reg emulation;
|
||||
dv_reg mode;
|
||||
dv_reg autoreq;
|
||||
dv_reg srpfixtime;
|
||||
dv_reg teardown;
|
||||
dv_reg intsrc;
|
||||
dv_reg intsrc_set;
|
||||
dv_reg intsrc_clr;
|
||||
dv_reg intmsk;
|
||||
dv_reg intmsk_set;
|
||||
dv_reg intmsk_clr;
|
||||
dv_reg intsrcmsk;
|
||||
dv_reg eoi;
|
||||
dv_reg intvector;
|
||||
dv_reg grndis_size[4];
|
||||
};
|
||||
|
||||
#define da8xx_usb_regs ((struct da8xx_usb_regs *)DA8XX_USB_OTG_BASE)
|
||||
|
||||
/* DA8XX interrupt bits definitions */
|
||||
#define DA8XX_USB_TX_ENDPTS_MASK 0x1f /* ep0 + 4 tx */
|
||||
#define DA8XX_USB_RX_ENDPTS_MASK 0x1e /* 4 rx */
|
||||
#define DA8XX_USB_TXINT_SHIFT 0
|
||||
#define DA8XX_USB_RXINT_SHIFT 8
|
||||
|
||||
#define DA8XX_USB_USBINT_MASK 0x01ff0000 /* 8 Mentor, DRVVBUS */
|
||||
#define DA8XX_USB_TXINT_MASK \
|
||||
(DA8XX_USB_TX_ENDPTS_MASK << DA8XX_USB_TXINT_SHIFT)
|
||||
#define DA8XX_USB_RXINT_MASK \
|
||||
(DA8XX_USB_RX_ENDPTS_MASK << DA8XX_USB_RXINT_SHIFT)
|
||||
|
||||
/* DA8xx CFGCHIP2 (USB 2.0 PHY Control) register bits */
|
||||
#define CFGCHIP2_PHYCLKGD (1 << 17)
|
||||
#define CFGCHIP2_VBUSSENSE (1 << 16)
|
||||
#define CFGCHIP2_RESET (1 << 15)
|
||||
#define CFGCHIP2_OTGMODE (3 << 13)
|
||||
#define CFGCHIP2_NO_OVERRIDE (0 << 13)
|
||||
#define CFGCHIP2_FORCE_HOST (1 << 13)
|
||||
#define CFGCHIP2_FORCE_DEVICE (2 << 13)
|
||||
#define CFGCHIP2_FORCE_HOST_VBUS_LOW (3 << 13)
|
||||
#define CFGCHIP2_USB1PHYCLKMUX (1 << 12)
|
||||
#define CFGCHIP2_USB2PHYCLKMUX (1 << 11)
|
||||
#define CFGCHIP2_PHYPWRDN (1 << 10)
|
||||
#define CFGCHIP2_OTGPWRDN (1 << 9)
|
||||
#define CFGCHIP2_DATPOL (1 << 8)
|
||||
#define CFGCHIP2_USB1SUSPENDM (1 << 7)
|
||||
#define CFGCHIP2_PHY_PLLON (1 << 6) /* override PLL suspend */
|
||||
#define CFGCHIP2_SESENDEN (1 << 5) /* Vsess_end comparator */
|
||||
#define CFGCHIP2_VBDTCTEN (1 << 4) /* Vbus comparator */
|
||||
#define CFGCHIP2_REFFREQ (0xf << 0)
|
||||
#define CFGCHIP2_REFFREQ_12MHZ (1 << 0)
|
||||
#define CFGCHIP2_REFFREQ_24MHZ (2 << 0)
|
||||
#define CFGCHIP2_REFFREQ_48MHZ (3 << 0)
|
||||
|
||||
#define DA8XX_USB_VBUS_GPIO (1 << 15)
|
||||
|
||||
#endif /* __DA8XX_MUSB_H__ */
|
||||
@@ -0,0 +1,50 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2008 Lyrtech <www.lyrtech.com>
|
||||
*/
|
||||
|
||||
#ifndef __MISC_H
|
||||
#define __MISC_H
|
||||
|
||||
#include <asm/arch/hardware.h>
|
||||
|
||||
/* pin muxer definitions */
|
||||
#define PIN_MUX_NUM_FIELDS 8 /* Per register */
|
||||
#define PIN_MUX_FIELD_SIZE 4 /* n in bits */
|
||||
#define PIN_MUX_FIELD_MASK ((1 << PIN_MUX_FIELD_SIZE) - 1)
|
||||
|
||||
/* pin definition */
|
||||
struct pinmux_config {
|
||||
dv_reg *mux; /* Address of mux register */
|
||||
unsigned char value; /* Value to set in field */
|
||||
unsigned char field; /* field number */
|
||||
};
|
||||
|
||||
/* pin table definition */
|
||||
struct pinmux_resource {
|
||||
const struct pinmux_config *pins;
|
||||
const int n_pins;
|
||||
};
|
||||
|
||||
#define PINMUX_ITEM(item) { \
|
||||
.pins = item, \
|
||||
.n_pins = ARRAY_SIZE(item) \
|
||||
}
|
||||
|
||||
struct lpsc_resource {
|
||||
const int lpsc_no;
|
||||
};
|
||||
|
||||
int dvevm_read_mac_address(uint8_t *buf);
|
||||
void davinci_sync_env_enetaddr(uint8_t *rom_enetaddr);
|
||||
int davinci_configure_pin_mux(const struct pinmux_config *pins, int n_pins);
|
||||
int davinci_configure_pin_mux_items(const struct pinmux_resource *item,
|
||||
int n_items);
|
||||
#if defined(CONFIG_DRIVER_TI_EMAC)
|
||||
void davinci_emac_mii_mode_sel(int mode_sel);
|
||||
#endif
|
||||
void irq_init(void);
|
||||
int da8xx_configure_lpsc_items(const struct lpsc_resource *item,
|
||||
const int n_items);
|
||||
|
||||
#endif /* __MISC_H */
|
||||
@@ -0,0 +1,83 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2011
|
||||
* Heiko Schocher, DENX Software Engineering, hs@denx.de.
|
||||
*/
|
||||
#ifndef _DV_DDR2_DEFS_H_
|
||||
#define _DV_DDR2_DEFS_H_
|
||||
|
||||
/*
|
||||
* DDR2 Memory Ctrl Register structure
|
||||
* See sprueh7d.pdf for more details.
|
||||
*/
|
||||
struct dv_ddr2_regs_ctrl {
|
||||
unsigned char rsvd0[4]; /* 0x00 */
|
||||
unsigned int sdrstat; /* 0x04 */
|
||||
unsigned int sdbcr; /* 0x08 */
|
||||
unsigned int sdrcr; /* 0x0C */
|
||||
unsigned int sdtimr; /* 0x10 */
|
||||
unsigned int sdtimr2; /* 0x14 */
|
||||
unsigned char rsvd1[4]; /* 0x18 */
|
||||
unsigned int sdbcr2; /* 0x1C */
|
||||
unsigned int pbbpr; /* 0x20 */
|
||||
unsigned char rsvd2[156]; /* 0x24 */
|
||||
unsigned int irr; /* 0xC0 */
|
||||
unsigned int imr; /* 0xC4 */
|
||||
unsigned int imsr; /* 0xC8 */
|
||||
unsigned int imcr; /* 0xCC */
|
||||
unsigned char rsvd3[20]; /* 0xD0 */
|
||||
unsigned int ddrphycr; /* 0xE4 */
|
||||
unsigned int ddrphycr2; /* 0xE8 */
|
||||
unsigned char rsvd4[4]; /* 0xEC */
|
||||
};
|
||||
|
||||
#define DV_DDR_PHY_PWRDNEN 0x40
|
||||
#define DV_DDR_PHY_EXT_STRBEN 0x80
|
||||
#define DV_DDR_PHY_RD_LATENCY_SHIFT 0
|
||||
|
||||
#define DV_DDR_SDTMR1_RFC_SHIFT 25
|
||||
#define DV_DDR_SDTMR1_RP_SHIFT 22
|
||||
#define DV_DDR_SDTMR1_RCD_SHIFT 19
|
||||
#define DV_DDR_SDTMR1_WR_SHIFT 16
|
||||
#define DV_DDR_SDTMR1_RAS_SHIFT 11
|
||||
#define DV_DDR_SDTMR1_RC_SHIFT 6
|
||||
#define DV_DDR_SDTMR1_RRD_SHIFT 3
|
||||
#define DV_DDR_SDTMR1_WTR_SHIFT 0
|
||||
|
||||
#define DV_DDR_SDTMR2_RASMAX_SHIFT 27
|
||||
#define DV_DDR_SDTMR2_XP_SHIFT 25
|
||||
#define DV_DDR_SDTMR2_ODT_SHIFT 23
|
||||
#define DV_DDR_SDTMR2_XSNR_SHIFT 16
|
||||
#define DV_DDR_SDTMR2_XSRD_SHIFT 8
|
||||
#define DV_DDR_SDTMR2_RTP_SHIFT 5
|
||||
#define DV_DDR_SDTMR2_CKE_SHIFT 0
|
||||
|
||||
#define DV_DDR_SDCR_DDR2TERM1_SHIFT 27
|
||||
#define DV_DDR_SDCR_IBANK_POS_SHIFT 26
|
||||
#define DV_DDR_SDCR_MSDRAMEN_SHIFT 25
|
||||
#define DV_DDR_SDCR_DDRDRIVE1_SHIFT 24
|
||||
#define DV_DDR_SDCR_BOOTUNLOCK_SHIFT 23
|
||||
#define DV_DDR_SDCR_DDR_DDQS_SHIFT 22
|
||||
#define DV_DDR_SDCR_DDR2EN_SHIFT 20
|
||||
#define DV_DDR_SDCR_DDRDRIVE0_SHIFT 18
|
||||
#define DV_DDR_SDCR_DDREN_SHIFT 17
|
||||
#define DV_DDR_SDCR_SDRAMEN_SHIFT 16
|
||||
#define DV_DDR_SDCR_TIMUNLOCK_SHIFT 15
|
||||
#define DV_DDR_SDCR_BUS_WIDTH_SHIFT 14
|
||||
#define DV_DDR_SDCR_CL_SHIFT 9
|
||||
#define DV_DDR_SDCR_IBANK_SHIFT 4
|
||||
#define DV_DDR_SDCR_PAGESIZE_SHIFT 0
|
||||
|
||||
#define DV_DDR_SDRCR_LPMODEN (1 << 31)
|
||||
#define DV_DDR_SDRCR_MCLKSTOPEN (1 << 30)
|
||||
|
||||
#define DV_DDR_SRCR_LPMODEN_SHIFT 31
|
||||
#define DV_DDR_SRCR_MCLKSTOPEN_SHIFT 30
|
||||
|
||||
#define DV_DDR_BOOTUNLOCK (1 << DV_DDR_SDCR_BOOTUNLOCK_SHIFT)
|
||||
#define DV_DDR_TIMUNLOCK (1 << DV_DDR_SDCR_TIMUNLOCK_SHIFT)
|
||||
|
||||
#define dv_ddr2_regs_ctrl \
|
||||
((struct dv_ddr2_regs_ctrl *)DAVINCI_DDR_EMIF_CTRL_BASE)
|
||||
|
||||
#endif /* _DV_DDR2_DEFS_H_ */
|
||||
@@ -0,0 +1,24 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* SoC-specific lowlevel code for tms320dm365 and similar chips
|
||||
*
|
||||
* Copyright (C) 2011
|
||||
* Heiko Schocher, DENX Software Engineering, hs@denx.de.
|
||||
*/
|
||||
#ifndef __DM365_LOWLEVEL_H
|
||||
#define __DM365_LOWLEVEL_H
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
void dm365_waitloop(unsigned long loopcnt);
|
||||
int dm365_pll1_init(unsigned long pllmult, unsigned long prediv);
|
||||
int dm365_pll2_init(unsigned long pllm, unsigned long prediv);
|
||||
int dm365_ddr_setup(void);
|
||||
void dm365_psc_init(void);
|
||||
void dm365_pinmux_ctl(unsigned long offset, unsigned long mask,
|
||||
unsigned long value);
|
||||
void dm36x_lowlevel_init(ulong bootflag);
|
||||
|
||||
#endif /* #ifndef __DM365_LOWLEVEL_H */
|
||||
@@ -0,0 +1,37 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
|
||||
*
|
||||
* Based on:
|
||||
*
|
||||
* ----------------------------------------------------------------------------
|
||||
*
|
||||
* dm644x_emac.h
|
||||
*
|
||||
* TI DaVinci (DM644X) EMAC peripheral driver header for DV-EVM
|
||||
*
|
||||
* Copyright (C) 2005 Texas Instruments.
|
||||
*
|
||||
* ----------------------------------------------------------------------------
|
||||
*
|
||||
* Modifications:
|
||||
* ver. 1.0: Sep 2005, TI PSP Team - Created EMAC version for uBoot.
|
||||
*/
|
||||
|
||||
#ifndef _DM644X_EMAC_H_
|
||||
#define _DM644X_EMAC_H_
|
||||
|
||||
#include <asm/arch/hardware.h>
|
||||
|
||||
#define EMAC_BASE_ADDR DAVINCI_EMAC_CNTRL_REGS_BASE
|
||||
#define EMAC_WRAPPER_BASE_ADDR DAVINCI_EMAC_WRAPPER_CNTRL_REGS_BASE
|
||||
#define EMAC_WRAPPER_RAM_ADDR DAVINCI_EMAC_WRAPPER_RAM_BASE
|
||||
#define EMAC_MDIO_BASE_ADDR DAVINCI_MDIO_CNTRL_REGS_BASE
|
||||
#define DAVINCI_EMAC_VERSION2
|
||||
|
||||
/* MDIO module input frequency */
|
||||
#define EMAC_MDIO_BUS_FREQ clk_get(DAVINCI_MDIO_CLKID)
|
||||
/* MDIO clock output frequency */
|
||||
#define EMAC_MDIO_CLOCK_FREQ 2000000 /* 2.0 MHz */
|
||||
|
||||
#endif /* _DM644X_EMAC_H_ */
|
||||
@@ -0,0 +1,30 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2009 Texas Instruments Incorporated
|
||||
*/
|
||||
#ifndef _GPIO_DEFS_H_
|
||||
#define _GPIO_DEFS_H_
|
||||
|
||||
#define DAVINCI_GPIO_BINTEN 0x01E26008
|
||||
#define DAVINCI_GPIO_BANK01 0x01E26010
|
||||
#define DAVINCI_GPIO_BANK23 0x01E26038
|
||||
#define DAVINCI_GPIO_BANK45 0x01E26060
|
||||
#define DAVINCI_GPIO_BANK67 0x01E26088
|
||||
#define DAVINCI_GPIO_BANK8 0x01E260B0
|
||||
|
||||
#define davinci_gpio_bank01 ((struct davinci_gpio *)DAVINCI_GPIO_BANK01)
|
||||
#define davinci_gpio_bank23 ((struct davinci_gpio *)DAVINCI_GPIO_BANK23)
|
||||
#define davinci_gpio_bank45 ((struct davinci_gpio *)DAVINCI_GPIO_BANK45)
|
||||
#define davinci_gpio_bank67 ((struct davinci_gpio *)DAVINCI_GPIO_BANK67)
|
||||
#define davinci_gpio_bank8 ((struct davinci_gpio *)DAVINCI_GPIO_BANK8)
|
||||
|
||||
#ifndef CONFIG_DM_GPIO
|
||||
#define gpio_status() gpio_info()
|
||||
#endif
|
||||
#define GPIO_NAME_SIZE 20
|
||||
#define MAX_NUM_GPIOS 144
|
||||
#define GPIO_BANK(gp) (davinci_gpio_bank01 + ((gp) >> 5))
|
||||
|
||||
void gpio_info(void);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,415 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
|
||||
*
|
||||
* Based on:
|
||||
*
|
||||
* -------------------------------------------------------------------------
|
||||
*
|
||||
* linux/include/asm-arm/arch-davinci/hardware.h
|
||||
*
|
||||
* Copyright (C) 2006 Texas Instruments.
|
||||
*/
|
||||
#ifndef __ASM_ARCH_HARDWARE_H
|
||||
#define __ASM_ARCH_HARDWARE_H
|
||||
|
||||
#include <linux/sizes.h>
|
||||
|
||||
#define REG(addr) (*(volatile unsigned int *)(addr))
|
||||
#define REG_P(addr) ((volatile unsigned int *)(addr))
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
typedef volatile unsigned int dv_reg;
|
||||
typedef volatile unsigned int * dv_reg_p;
|
||||
#endif
|
||||
|
||||
#define DAVINCI_UART0_BASE 0x01c42000
|
||||
#define DAVINCI_UART1_BASE 0x01d0c000
|
||||
#define DAVINCI_UART2_BASE 0x01d0d000
|
||||
#define DAVINCI_I2C0_BASE 0x01c22000
|
||||
#define DAVINCI_I2C1_BASE 0x01e28000
|
||||
#define DAVINCI_TIMER0_BASE 0x01c20000
|
||||
#define DAVINCI_TIMER1_BASE 0x01c21000
|
||||
#define DAVINCI_WDOG_BASE 0x01c21000
|
||||
#define DAVINCI_RTC_BASE 0x01c23000
|
||||
#define DAVINCI_PLL_CNTRL0_BASE 0x01c11000
|
||||
#define DAVINCI_PLL_CNTRL1_BASE 0x01e1a000
|
||||
#define DAVINCI_PSC0_BASE 0x01c10000
|
||||
#define DAVINCI_PSC1_BASE 0x01e27000
|
||||
#define DAVINCI_SPI0_BASE 0x01c41000
|
||||
#define DAVINCI_USB_OTG_BASE 0x01e00000
|
||||
#define DAVINCI_SPI1_BASE (cpu_is_da830() ? \
|
||||
0x01e12000 : 0x01f0e000)
|
||||
#define DAVINCI_GPIO_BASE 0x01e26000
|
||||
#define DAVINCI_EMAC_CNTRL_REGS_BASE 0x01e23000
|
||||
#define DAVINCI_EMAC_WRAPPER_CNTRL_REGS_BASE 0x01e22000
|
||||
#define DAVINCI_EMAC_WRAPPER_RAM_BASE 0x01e20000
|
||||
#define DAVINCI_MDIO_CNTRL_REGS_BASE 0x01e24000
|
||||
#define DAVINCI_SYSCFG1_BASE 0x01e2c000
|
||||
#define DAVINCI_MMC_SD0_BASE 0x01c40000
|
||||
#define DAVINCI_MMC_SD1_BASE 0x01e1b000
|
||||
#define DAVINCI_TIMER2_BASE 0x01f0c000
|
||||
#define DAVINCI_TIMER3_BASE 0x01f0d000
|
||||
#define DAVINCI_ASYNC_EMIF_CNTRL_BASE 0x68000000
|
||||
#define DAVINCI_ASYNC_EMIF_DATA_CE0_BASE 0x40000000
|
||||
#define DAVINCI_ASYNC_EMIF_DATA_CE2_BASE 0x60000000
|
||||
#define DAVINCI_ASYNC_EMIF_DATA_CE3_BASE 0x62000000
|
||||
#define DAVINCI_ASYNC_EMIF_DATA_CE4_BASE 0x64000000
|
||||
#define DAVINCI_ASYNC_EMIF_DATA_CE5_BASE 0x66000000
|
||||
#define DAVINCI_DDR_EMIF_CTRL_BASE 0xb0000000
|
||||
#define DAVINCI_DDR_EMIF_DATA_BASE 0xc0000000
|
||||
#define DAVINCI_INTC_BASE 0xfffee000
|
||||
#define DAVINCI_BOOTCFG_BASE 0x01c14000
|
||||
#define DAVINCI_LCD_CNTL_BASE 0x01e13000
|
||||
#define DAVINCI_L3CBARAM_BASE 0x80000000
|
||||
#define JTAG_ID_REG (DAVINCI_BOOTCFG_BASE + 0x18)
|
||||
#define CHIP_REV_ID_REG (DAVINCI_BOOTCFG_BASE + 0x24)
|
||||
#define HOST1CFG (DAVINCI_BOOTCFG_BASE + 0x44)
|
||||
#define PSC0_MDCTL (DAVINCI_PSC0_BASE + 0xa00)
|
||||
|
||||
#define GPIO_BANK0_REG_DIR_ADDR (DAVINCI_GPIO_BASE + 0x10)
|
||||
#define GPIO_BANK0_REG_OPDATA_ADDR (DAVINCI_GPIO_BASE + 0x14)
|
||||
#define GPIO_BANK0_REG_SET_ADDR (DAVINCI_GPIO_BASE + 0x18)
|
||||
#define GPIO_BANK0_REG_CLR_ADDR (DAVINCI_GPIO_BASE + 0x1c)
|
||||
#define GPIO_BANK2_REG_DIR_ADDR (DAVINCI_GPIO_BASE + 0x38)
|
||||
#define GPIO_BANK2_REG_OPDATA_ADDR (DAVINCI_GPIO_BASE + 0x3c)
|
||||
#define GPIO_BANK2_REG_SET_ADDR (DAVINCI_GPIO_BASE + 0x40)
|
||||
#define GPIO_BANK2_REG_CLR_ADDR (DAVINCI_GPIO_BASE + 0x44)
|
||||
#define GPIO_BANK6_REG_DIR_ADDR (DAVINCI_GPIO_BASE + 0x88)
|
||||
#define GPIO_BANK6_REG_OPDATA_ADDR (DAVINCI_GPIO_BASE + 0x8c)
|
||||
#define GPIO_BANK6_REG_SET_ADDR (DAVINCI_GPIO_BASE + 0x90)
|
||||
#define GPIO_BANK6_REG_CLR_ADDR (DAVINCI_GPIO_BASE + 0x94)
|
||||
|
||||
/* Power and Sleep Controller (PSC) Domains */
|
||||
#define DAVINCI_GPSC_ARMDOMAIN 0
|
||||
#define DAVINCI_GPSC_DSPDOMAIN 1
|
||||
|
||||
#define DAVINCI_LPSC_TPCC 0
|
||||
#define DAVINCI_LPSC_TPTC0 1
|
||||
#define DAVINCI_LPSC_TPTC1 2
|
||||
#define DAVINCI_LPSC_AEMIF 3
|
||||
#define DAVINCI_LPSC_SPI0 4
|
||||
#define DAVINCI_LPSC_MMC_SD 5
|
||||
#define DAVINCI_LPSC_AINTC 6
|
||||
#define DAVINCI_LPSC_ARM_RAM_ROM 7
|
||||
#define DAVINCI_LPSC_SECCTL_KEYMGR 8
|
||||
#define DAVINCI_LPSC_UART0 9
|
||||
#define DAVINCI_LPSC_SCR0 10
|
||||
#define DAVINCI_LPSC_SCR1 11
|
||||
#define DAVINCI_LPSC_SCR2 12
|
||||
#define DAVINCI_LPSC_DMAX 13
|
||||
#define DAVINCI_LPSC_ARM 14
|
||||
#define DAVINCI_LPSC_GEM 15
|
||||
|
||||
/* for LPSCs in PSC1, offset from 32 for differentiation */
|
||||
#define DAVINCI_LPSC_PSC1_BASE 32
|
||||
#define DAVINCI_LPSC_USB20 (DAVINCI_LPSC_PSC1_BASE + 1)
|
||||
#define DAVINCI_LPSC_USB11 (DAVINCI_LPSC_PSC1_BASE + 2)
|
||||
#define DAVINCI_LPSC_GPIO (DAVINCI_LPSC_PSC1_BASE + 3)
|
||||
#define DAVINCI_LPSC_UHPI (DAVINCI_LPSC_PSC1_BASE + 4)
|
||||
#define DAVINCI_LPSC_EMAC (DAVINCI_LPSC_PSC1_BASE + 5)
|
||||
#define DAVINCI_LPSC_DDR_EMIF (DAVINCI_LPSC_PSC1_BASE + 6)
|
||||
#define DAVINCI_LPSC_McASP0 (DAVINCI_LPSC_PSC1_BASE + 7)
|
||||
#define DAVINCI_LPSC_SPI1 (DAVINCI_LPSC_PSC1_BASE + 10)
|
||||
#define DAVINCI_LPSC_I2C1 (DAVINCI_LPSC_PSC1_BASE + 11)
|
||||
#define DAVINCI_LPSC_UART1 (DAVINCI_LPSC_PSC1_BASE + 12)
|
||||
#define DAVINCI_LPSC_UART2 (DAVINCI_LPSC_PSC1_BASE + 13)
|
||||
#define DAVINCI_LPSC_LCDC (DAVINCI_LPSC_PSC1_BASE + 16)
|
||||
#define DAVINCI_LPSC_ePWM (DAVINCI_LPSC_PSC1_BASE + 17)
|
||||
#define DAVINCI_LPSC_MMCSD1 (DAVINCI_LPSC_PSC1_BASE + 18)
|
||||
#define DAVINCI_LPSC_eCAP (DAVINCI_LPSC_PSC1_BASE + 20)
|
||||
#define DAVINCI_LPSC_L3_CBA_RAM (DAVINCI_LPSC_PSC1_BASE + 31)
|
||||
|
||||
/* DA830-specific peripherals */
|
||||
#define DAVINCI_LPSC_McASP1 (DAVINCI_LPSC_PSC1_BASE + 8)
|
||||
#define DAVINCI_LPSC_McASP2 (DAVINCI_LPSC_PSC1_BASE + 9)
|
||||
#define DAVINCI_LPSC_eQEP (DAVINCI_LPSC_PSC1_BASE + 21)
|
||||
#define DAVINCI_LPSC_SCR8 (DAVINCI_LPSC_PSC1_BASE + 24)
|
||||
#define DAVINCI_LPSC_SCR7 (DAVINCI_LPSC_PSC1_BASE + 25)
|
||||
#define DAVINCI_LPSC_SCR12 (DAVINCI_LPSC_PSC1_BASE + 26)
|
||||
|
||||
/* DA850-specific peripherals */
|
||||
#define DAVINCI_LPSC_TPCC1 (DAVINCI_LPSC_PSC1_BASE + 0)
|
||||
#define DAVINCI_LPSC_SATA (DAVINCI_LPSC_PSC1_BASE + 8)
|
||||
#define DAVINCI_LPSC_VPIF (DAVINCI_LPSC_PSC1_BASE + 9)
|
||||
#define DAVINCI_LPSC_McBSP0 (DAVINCI_LPSC_PSC1_BASE + 14)
|
||||
#define DAVINCI_LPSC_McBSP1 (DAVINCI_LPSC_PSC1_BASE + 15)
|
||||
#define DAVINCI_LPSC_MMC_SD1 (DAVINCI_LPSC_PSC1_BASE + 18)
|
||||
#define DAVINCI_LPSC_uPP (DAVINCI_LPSC_PSC1_BASE + 19)
|
||||
#define DAVINCI_LPSC_TPTC2 (DAVINCI_LPSC_PSC1_BASE + 21)
|
||||
#define DAVINCI_LPSC_SCR_F0 (DAVINCI_LPSC_PSC1_BASE + 24)
|
||||
#define DAVINCI_LPSC_SCR_F1 (DAVINCI_LPSC_PSC1_BASE + 25)
|
||||
#define DAVINCI_LPSC_SCR_F2 (DAVINCI_LPSC_PSC1_BASE + 26)
|
||||
#define DAVINCI_LPSC_SCR_F6 (DAVINCI_LPSC_PSC1_BASE + 27)
|
||||
#define DAVINCI_LPSC_SCR_F7 (DAVINCI_LPSC_PSC1_BASE + 28)
|
||||
#define DAVINCI_LPSC_SCR_F8 (DAVINCI_LPSC_PSC1_BASE + 29)
|
||||
#define DAVINCI_LPSC_BR_F7 (DAVINCI_LPSC_PSC1_BASE + 30)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
void lpsc_on(unsigned int id);
|
||||
void lpsc_syncreset(unsigned int id);
|
||||
void lpsc_disable(unsigned int id);
|
||||
void dsp_on(void);
|
||||
|
||||
void davinci_enable_uart0(void);
|
||||
void davinci_enable_emac(void);
|
||||
void davinci_enable_i2c(void);
|
||||
void davinci_errata_workarounds(void);
|
||||
|
||||
#define PSC_ENABLE 0x3
|
||||
#define PSC_DISABLE 0x2
|
||||
#define PSC_SYNCRESET 0x1
|
||||
#define PSC_SWRSTDISABLE 0x0
|
||||
|
||||
#define PSC_PSC0_MODULE_ID_CNT 16
|
||||
#define PSC_PSC1_MODULE_ID_CNT 32
|
||||
|
||||
#define UART0_PWREMU_MGMT (0x01c42030)
|
||||
|
||||
struct davinci_psc_regs {
|
||||
dv_reg revid;
|
||||
dv_reg rsvd0[71];
|
||||
dv_reg ptcmd;
|
||||
dv_reg rsvd1;
|
||||
dv_reg ptstat;
|
||||
dv_reg rsvd2[437];
|
||||
union {
|
||||
struct {
|
||||
dv_reg mdstat[PSC_PSC0_MODULE_ID_CNT];
|
||||
dv_reg rsvd3[112];
|
||||
dv_reg mdctl[PSC_PSC0_MODULE_ID_CNT];
|
||||
} psc0;
|
||||
struct {
|
||||
dv_reg mdstat[PSC_PSC1_MODULE_ID_CNT];
|
||||
dv_reg rsvd3[96];
|
||||
dv_reg mdctl[PSC_PSC1_MODULE_ID_CNT];
|
||||
} psc1;
|
||||
};
|
||||
};
|
||||
|
||||
#define davinci_psc0_regs ((struct davinci_psc_regs *)DAVINCI_PSC0_BASE)
|
||||
#define davinci_psc1_regs ((struct davinci_psc_regs *)DAVINCI_PSC1_BASE)
|
||||
|
||||
#define PSC_MDSTAT_STATE 0x3f
|
||||
#define PSC_MDCTL_NEXT 0x07
|
||||
|
||||
struct davinci_pllc_regs {
|
||||
dv_reg revid;
|
||||
dv_reg rsvd1[56];
|
||||
dv_reg rstype;
|
||||
dv_reg rsvd2[6];
|
||||
dv_reg pllctl;
|
||||
dv_reg ocsel;
|
||||
dv_reg rsvd3[2];
|
||||
dv_reg pllm;
|
||||
dv_reg prediv;
|
||||
dv_reg plldiv1;
|
||||
dv_reg plldiv2;
|
||||
dv_reg plldiv3;
|
||||
dv_reg oscdiv;
|
||||
dv_reg postdiv;
|
||||
dv_reg rsvd4[3];
|
||||
dv_reg pllcmd;
|
||||
dv_reg pllstat;
|
||||
dv_reg alnctl;
|
||||
dv_reg dchange;
|
||||
dv_reg cken;
|
||||
dv_reg ckstat;
|
||||
dv_reg systat;
|
||||
dv_reg rsvd5[3];
|
||||
dv_reg plldiv4;
|
||||
dv_reg plldiv5;
|
||||
dv_reg plldiv6;
|
||||
dv_reg plldiv7;
|
||||
dv_reg rsvd6[32];
|
||||
dv_reg emucnt0;
|
||||
dv_reg emucnt1;
|
||||
};
|
||||
|
||||
#define davinci_pllc0_regs ((struct davinci_pllc_regs *)DAVINCI_PLL_CNTRL0_BASE)
|
||||
#define davinci_pllc1_regs ((struct davinci_pllc_regs *)DAVINCI_PLL_CNTRL1_BASE)
|
||||
#define DAVINCI_PLLC_DIV_MASK 0x1f
|
||||
|
||||
/*
|
||||
* A clock ID is a 32-bit number where bit 16 represents the PLL controller
|
||||
* (clear is PLLC0, set is PLLC1) and the low 16 bits represent the divisor,
|
||||
* counting from 1. Clock IDs may be passed to clk_get().
|
||||
*/
|
||||
|
||||
/* flags to select PLL controller */
|
||||
#define DAVINCI_PLLC0_FLAG (0)
|
||||
#define DAVINCI_PLLC1_FLAG (1 << 16)
|
||||
|
||||
enum davinci_clk_ids {
|
||||
/*
|
||||
* Clock IDs for PLL outputs. Each may be switched on/off
|
||||
* independently, and each may map to one or more peripherals.
|
||||
*/
|
||||
DAVINCI_PLL0_SYSCLK2 = DAVINCI_PLLC0_FLAG | 2,
|
||||
DAVINCI_PLL0_SYSCLK4 = DAVINCI_PLLC0_FLAG | 4,
|
||||
DAVINCI_PLL0_SYSCLK6 = DAVINCI_PLLC0_FLAG | 6,
|
||||
DAVINCI_PLL1_SYSCLK1 = DAVINCI_PLLC1_FLAG | 1,
|
||||
DAVINCI_PLL1_SYSCLK2 = DAVINCI_PLLC1_FLAG | 2,
|
||||
|
||||
/* map peripherals to clock IDs */
|
||||
DAVINCI_ARM_CLKID = DAVINCI_PLL0_SYSCLK6,
|
||||
DAVINCI_DDR_CLKID = DAVINCI_PLL1_SYSCLK1,
|
||||
DAVINCI_MDIO_CLKID = DAVINCI_PLL0_SYSCLK4,
|
||||
DAVINCI_MMC_CLKID = DAVINCI_PLL0_SYSCLK2,
|
||||
DAVINCI_SPI0_CLKID = DAVINCI_PLL0_SYSCLK2,
|
||||
DAVINCI_MMCSD_CLKID = DAVINCI_PLL0_SYSCLK2,
|
||||
|
||||
/* special clock ID - output of PLL multiplier */
|
||||
DAVINCI_PLLM_CLKID = 0x0FF,
|
||||
|
||||
/* special clock ID - output of PLL post divisor */
|
||||
DAVINCI_PLLC_CLKID = 0x100,
|
||||
|
||||
/* special clock ID - PLL bypass */
|
||||
DAVINCI_AUXCLK_CLKID = 0x101,
|
||||
};
|
||||
|
||||
#define DAVINCI_UART2_CLKID (cpu_is_da830() ? DAVINCI_PLL0_SYSCLK2 \
|
||||
: get_async3_src())
|
||||
|
||||
#define DAVINCI_SPI1_CLKID (cpu_is_da830() ? DAVINCI_PLL0_SYSCLK2 \
|
||||
: get_async3_src())
|
||||
|
||||
int clk_get(enum davinci_clk_ids id);
|
||||
|
||||
/* Boot config */
|
||||
struct davinci_syscfg_regs {
|
||||
dv_reg revid;
|
||||
dv_reg rsvd[7];
|
||||
dv_reg bootcfg;
|
||||
dv_reg chiprevidr;
|
||||
dv_reg rsvd2[4];
|
||||
dv_reg kick0;
|
||||
dv_reg kick1;
|
||||
dv_reg rsvd1[52];
|
||||
dv_reg mstpri[3];
|
||||
dv_reg rsvd3;
|
||||
dv_reg pinmux[20];
|
||||
dv_reg suspsrc;
|
||||
dv_reg chipsig;
|
||||
dv_reg chipsig_clr;
|
||||
dv_reg cfgchip0;
|
||||
dv_reg cfgchip1;
|
||||
dv_reg cfgchip2;
|
||||
dv_reg cfgchip3;
|
||||
dv_reg cfgchip4;
|
||||
};
|
||||
|
||||
#define davinci_syscfg_regs \
|
||||
((struct davinci_syscfg_regs *)DAVINCI_BOOTCFG_BASE)
|
||||
|
||||
enum {
|
||||
DAVINCI_NAND8_BOOT = 0b001110,
|
||||
DAVINCI_NAND16_BOOT = 0b010000,
|
||||
DAVINCI_SD_OR_MMC_BOOT = 0b011100,
|
||||
DAVINCI_MMC_ONLY_BOOT = 0b111100,
|
||||
DAVINCI_SPI0_FLASH_BOOT = 0b001010,
|
||||
DAVINCI_SPI1_FLASH_BOOT = 0b001100,
|
||||
};
|
||||
|
||||
#define pinmux(x) (&davinci_syscfg_regs->pinmux[x])
|
||||
|
||||
/* Emulation suspend bits */
|
||||
#define DAVINCI_SYSCFG_SUSPSRC_EMAC (1 << 5)
|
||||
#define DAVINCI_SYSCFG_SUSPSRC_I2C (1 << 16)
|
||||
#define DAVINCI_SYSCFG_SUSPSRC_SPI0 (1 << 21)
|
||||
#define DAVINCI_SYSCFG_SUSPSRC_SPI1 (1 << 22)
|
||||
#define DAVINCI_SYSCFG_SUSPSRC_UART0 (1 << 18)
|
||||
#define DAVINCI_SYSCFG_SUSPSRC_UART1 (1 << 19)
|
||||
#define DAVINCI_SYSCFG_SUSPSRC_UART2 (1 << 20)
|
||||
#define DAVINCI_SYSCFG_SUSPSRC_TIMER0 (1 << 27)
|
||||
|
||||
struct davinci_syscfg1_regs {
|
||||
dv_reg vtpio_ctl;
|
||||
dv_reg ddr_slew;
|
||||
dv_reg deepsleep;
|
||||
dv_reg pupd_ena;
|
||||
dv_reg pupd_sel;
|
||||
dv_reg rxactive;
|
||||
dv_reg pwrdwn;
|
||||
};
|
||||
|
||||
#define davinci_syscfg1_regs \
|
||||
((struct davinci_syscfg1_regs *)DAVINCI_SYSCFG1_BASE)
|
||||
|
||||
#define DDR_SLEW_CMOSEN_BIT 4
|
||||
#define DDR_SLEW_DDR_PDENA_BIT 5
|
||||
|
||||
#define VTP_POWERDWN (1 << 6)
|
||||
#define VTP_LOCK (1 << 7)
|
||||
#define VTP_CLKRZ (1 << 13)
|
||||
#define VTP_READY (1 << 15)
|
||||
#define VTP_IOPWRDWN (1 << 14)
|
||||
|
||||
#define DV_SYSCFG_KICK0_UNLOCK 0x83e70b13
|
||||
#define DV_SYSCFG_KICK1_UNLOCK 0x95a4f1e0
|
||||
|
||||
/* Interrupt controller */
|
||||
struct davinci_aintc_regs {
|
||||
dv_reg revid;
|
||||
dv_reg cr;
|
||||
dv_reg dummy0[2];
|
||||
dv_reg ger;
|
||||
dv_reg dummy1[219];
|
||||
dv_reg ecr1;
|
||||
dv_reg ecr2;
|
||||
dv_reg ecr3;
|
||||
dv_reg dummy2[1117];
|
||||
dv_reg hier;
|
||||
};
|
||||
|
||||
#define davinci_aintc_regs ((struct davinci_aintc_regs *)DAVINCI_INTC_BASE)
|
||||
|
||||
struct davinci_uart_ctrl_regs {
|
||||
dv_reg revid1;
|
||||
dv_reg revid2;
|
||||
dv_reg pwremu_mgmt;
|
||||
dv_reg mdr;
|
||||
};
|
||||
|
||||
#define DAVINCI_UART_CTRL_BASE 0x28
|
||||
#define DAVINCI_UART0_CTRL_ADDR (DAVINCI_UART0_BASE + DAVINCI_UART_CTRL_BASE)
|
||||
#define DAVINCI_UART1_CTRL_ADDR (DAVINCI_UART1_BASE + DAVINCI_UART_CTRL_BASE)
|
||||
#define DAVINCI_UART2_CTRL_ADDR (DAVINCI_UART2_BASE + DAVINCI_UART_CTRL_BASE)
|
||||
|
||||
#define davinci_uart0_ctrl_regs \
|
||||
((struct davinci_uart_ctrl_regs *)DAVINCI_UART0_CTRL_ADDR)
|
||||
#define davinci_uart1_ctrl_regs \
|
||||
((struct davinci_uart_ctrl_regs *)DAVINCI_UART1_CTRL_ADDR)
|
||||
#define davinci_uart2_ctrl_regs \
|
||||
((struct davinci_uart_ctrl_regs *)DAVINCI_UART2_CTRL_ADDR)
|
||||
|
||||
/* UART PWREMU_MGMT definitions */
|
||||
#define DAVINCI_UART_PWREMU_MGMT_FREE (1 << 0)
|
||||
#define DAVINCI_UART_PWREMU_MGMT_URRST (1 << 13)
|
||||
#define DAVINCI_UART_PWREMU_MGMT_UTRST (1 << 14)
|
||||
|
||||
static inline int cpu_is_da830(void)
|
||||
{
|
||||
unsigned int jtag_id = REG(JTAG_ID_REG);
|
||||
unsigned short part_no = (jtag_id >> 12) & 0xffff;
|
||||
|
||||
return ((part_no == 0xb7df) ? 1 : 0);
|
||||
}
|
||||
static inline int cpu_is_da850(void)
|
||||
{
|
||||
unsigned int jtag_id = REG(JTAG_ID_REG);
|
||||
unsigned short part_no = (jtag_id >> 12) & 0xffff;
|
||||
|
||||
return ((part_no == 0xb7d1) ? 1 : 0);
|
||||
}
|
||||
|
||||
static inline enum davinci_clk_ids get_async3_src(void)
|
||||
{
|
||||
return (REG(&davinci_syscfg_regs->cfgchip3) & 0x10) ?
|
||||
DAVINCI_PLL1_SYSCLK2 : DAVINCI_PLL0_SYSCLK2;
|
||||
}
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#endif /* __ASM_ARCH_HARDWARE_H */
|
||||
@@ -0,0 +1,13 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2004-2014
|
||||
* Texas Instruments, <www.ti.com>
|
||||
*
|
||||
* Some changes copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
|
||||
*/
|
||||
#ifndef _I2C_DEFS_H_
|
||||
#define _I2C_DEFS_H_
|
||||
|
||||
#define I2C_BASE 0x01c22000
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,56 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Pinmux configurations for the DAxxx SoCs
|
||||
*
|
||||
* Copyright (C) 2011 OMICRON electronics GmbH
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_PINMUX_DEFS_H
|
||||
#define __ASM_ARCH_PINMUX_DEFS_H
|
||||
|
||||
#include <asm/arch/davinci_misc.h>
|
||||
#include <config.h>
|
||||
|
||||
/* SPI0 pin muxer settings */
|
||||
extern const struct pinmux_config spi0_pins_base[3];
|
||||
extern const struct pinmux_config spi0_pins_scs0[1];
|
||||
extern const struct pinmux_config spi0_pins_ena[1];
|
||||
|
||||
/* SPI1 pin muxer settings */
|
||||
extern const struct pinmux_config spi1_pins_base[3];
|
||||
extern const struct pinmux_config spi1_pins_scs0[1];
|
||||
|
||||
/* UART pin muxer settings */
|
||||
extern const struct pinmux_config uart0_pins_txrx[2];
|
||||
extern const struct pinmux_config uart0_pins_rtscts[2];
|
||||
extern const struct pinmux_config uart1_pins_txrx[2];
|
||||
extern const struct pinmux_config uart2_pins_txrx[2];
|
||||
extern const struct pinmux_config uart2_pins_rtscts[2];
|
||||
|
||||
/* EMAC pin muxer settings*/
|
||||
extern const struct pinmux_config emac_pins_rmii[8];
|
||||
extern const struct pinmux_config emac_pins_rmii_clk_source[1];
|
||||
extern const struct pinmux_config emac_pins_mii[15];
|
||||
extern const struct pinmux_config emac_pins_mdio[2];
|
||||
|
||||
/* I2C pin muxer settings */
|
||||
extern const struct pinmux_config i2c0_pins[2];
|
||||
extern const struct pinmux_config i2c1_pins[2];
|
||||
|
||||
/* EMIFA pin muxer settings */
|
||||
extern const struct pinmux_config emifa_pins[40];
|
||||
extern const struct pinmux_config emifa_pins_cs0[1];
|
||||
extern const struct pinmux_config emifa_pins_cs2[1];
|
||||
extern const struct pinmux_config emifa_pins_cs3[1];
|
||||
extern const struct pinmux_config emifa_pins_cs4[1];
|
||||
extern const struct pinmux_config emifa_pins_nand[12];
|
||||
extern const struct pinmux_config emifa_pins_nor[43];
|
||||
|
||||
/* USB pin mux setting */
|
||||
extern const struct pinmux_config usb_pins[1];
|
||||
|
||||
/* MMC pin muxer settings */
|
||||
extern const struct pinmux_config mmc0_pins_8bit[10];
|
||||
extern const struct pinmux_config mmc0_pins[6];
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,82 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2011
|
||||
* Heiko Schocher, DENX Software Engineering, hs@denx.de.
|
||||
*/
|
||||
#ifndef _DV_PLL_DEFS_H_
|
||||
#define _DV_PLL_DEFS_H_
|
||||
|
||||
struct dv_pll_regs {
|
||||
unsigned int pid; /* 0x00 */
|
||||
unsigned char rsvd0[224]; /* 0x04 */
|
||||
unsigned int rstype; /* 0xe4 */
|
||||
unsigned char rsvd1[24]; /* 0xe8 */
|
||||
unsigned int pllctl; /* 0x100 */
|
||||
unsigned char rsvd2[4]; /* 0x104 */
|
||||
unsigned int secctl; /* 0x108 */
|
||||
unsigned int rv; /* 0x10c */
|
||||
unsigned int pllm; /* 0x110 */
|
||||
unsigned int prediv; /* 0x114 */
|
||||
unsigned int plldiv1; /* 0x118 */
|
||||
unsigned int plldiv2; /* 0x11c */
|
||||
unsigned int plldiv3; /* 0x120 */
|
||||
unsigned int oscdiv1; /* 0x124 */
|
||||
unsigned int postdiv; /* 0x128 */
|
||||
unsigned int bpdiv; /* 0x12c */
|
||||
unsigned char rsvd5[8]; /* 0x130 */
|
||||
unsigned int pllcmd; /* 0x138 */
|
||||
unsigned int pllstat; /* 0x13c */
|
||||
unsigned int alnctl; /* 0x140 */
|
||||
unsigned int dchange; /* 0x144 */
|
||||
unsigned int cken; /* 0x148 */
|
||||
unsigned int ckstat; /* 0x14c */
|
||||
unsigned int systat; /* 0x150 */
|
||||
unsigned char rsvd6[12]; /* 0x154 */
|
||||
unsigned int plldiv4; /* 0x160 */
|
||||
unsigned int plldiv5; /* 0x164 */
|
||||
unsigned int plldiv6; /* 0x168 */
|
||||
unsigned int plldiv7; /* 0x16C */
|
||||
unsigned int plldiv8; /* 0x170 */
|
||||
unsigned int plldiv9; /* 0x174 */
|
||||
};
|
||||
|
||||
#define PLL_MASTER_LOCK (1 << 4)
|
||||
|
||||
#define PLLCTL_CLOCK_MODE_SHIFT 8
|
||||
#define PLLCTL_PLLEN (1 << 0)
|
||||
#define PLLCTL_PLLPWRDN (1 << 1)
|
||||
#define PLLCTL_PLLRST (1 << 3)
|
||||
#define PLLCTL_PLLDIS (1 << 4)
|
||||
#define PLLCTL_PLLENSRC (1 << 5)
|
||||
#define PLLCTL_RES_9 (1 << 8)
|
||||
#define PLLCTL_EXTCLKSRC (1 << 9)
|
||||
|
||||
#define PLL_DIVEN (1 << 15)
|
||||
#define PLL_POSTDEN PLL_DIVEN
|
||||
|
||||
#define PLL_SCSCFG3_DIV45PENA (1 << 2)
|
||||
#define PLL_SCSCFG3_EMA_CLKSRC (1 << 1)
|
||||
|
||||
#define PLL_RSTYPE_POR (1 << 0)
|
||||
#define PLL_RSTYPE_XWRST (1 << 1)
|
||||
|
||||
#define PLLSECCTL_TINITZ (1 << 16)
|
||||
#define PLLSECCTL_TENABLE (1 << 17)
|
||||
#define PLLSECCTL_TENABLEDIV (1 << 18)
|
||||
#define PLLSECCTL_STOPMODE (1 << 22)
|
||||
|
||||
#define PLLCMD_GOSET (1 << 0)
|
||||
#define PLLCMD_GOSTAT (1 << 0)
|
||||
|
||||
#define PLL0_LOCK 0x07000000
|
||||
#define PLL1_LOCK 0x07000000
|
||||
|
||||
#define dv_pll0_regs ((struct dv_pll_regs *)DAVINCI_PLL_CNTRL0_BASE)
|
||||
#define dv_pll1_regs ((struct dv_pll_regs *)DAVINCI_PLL_CNTRL1_BASE)
|
||||
|
||||
#define ARM_PLLDIV (offsetof(struct dv_pll_regs, plldiv2))
|
||||
#define DDR_PLLDIV (offsetof(struct dv_pll_regs, plldiv7))
|
||||
#define SPI_PLLDIV (offsetof(struct dv_pll_regs, plldiv4))
|
||||
|
||||
unsigned int davinci_clk_get(unsigned int div);
|
||||
#endif /* _DV_PLL_DEFS_H_ */
|
||||
@@ -0,0 +1,69 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2011
|
||||
* Heiko Schocher, DENX Software Engineering, hs@denx.de.
|
||||
*/
|
||||
#ifndef _DV_PSC_DEFS_H_
|
||||
#define _DV_PSC_DEFS_H_
|
||||
|
||||
/*
|
||||
* Power/Sleep Ctrl Register structure
|
||||
* See sprufb3.pdf, Chapter 7
|
||||
*/
|
||||
struct dv_psc_regs {
|
||||
unsigned int pid; /* 0x000 */
|
||||
unsigned char rsvd0[16]; /* 0x004 */
|
||||
unsigned char rsvd1[4]; /* 0x014 */
|
||||
unsigned int inteval; /* 0x018 */
|
||||
unsigned char rsvd2[36]; /* 0x01C */
|
||||
unsigned int merrpr0; /* 0x040 */
|
||||
unsigned int merrpr1; /* 0x044 */
|
||||
unsigned char rsvd3[8]; /* 0x048 */
|
||||
unsigned int merrcr0; /* 0x050 */
|
||||
unsigned int merrcr1; /* 0x054 */
|
||||
unsigned char rsvd4[8]; /* 0x058 */
|
||||
unsigned int perrpr; /* 0x060 */
|
||||
unsigned char rsvd5[4]; /* 0x064 */
|
||||
unsigned int perrcr; /* 0x068 */
|
||||
unsigned char rsvd6[4]; /* 0x06C */
|
||||
unsigned int epcpr; /* 0x070 */
|
||||
unsigned char rsvd7[4]; /* 0x074 */
|
||||
unsigned int epccr; /* 0x078 */
|
||||
unsigned char rsvd8[144]; /* 0x07C */
|
||||
unsigned char rsvd9[20]; /* 0x10C */
|
||||
unsigned int ptcmd; /* 0x120 */
|
||||
unsigned char rsvd10[4]; /* 0x124 */
|
||||
unsigned int ptstat; /* 0x128 */
|
||||
unsigned char rsvd11[212]; /* 0x12C */
|
||||
unsigned int pdstat0; /* 0x200 */
|
||||
unsigned int pdstat1; /* 0x204 */
|
||||
unsigned char rsvd12[248]; /* 0x208 */
|
||||
unsigned int pdctl0; /* 0x300 */
|
||||
unsigned int pdctl1; /* 0x304 */
|
||||
unsigned char rsvd13[536]; /* 0x308 */
|
||||
unsigned int mckout0; /* 0x520 */
|
||||
unsigned int mckout1; /* 0x524 */
|
||||
unsigned char rsvd14[728]; /* 0x528 */
|
||||
unsigned int mdstat[52]; /* 0x800 */
|
||||
unsigned char rsvd15[304]; /* 0x8D0 */
|
||||
unsigned int mdctl[52]; /* 0xA00 */
|
||||
};
|
||||
|
||||
/* PSC constants */
|
||||
#define EMURSTIE_MASK (0x00000200)
|
||||
|
||||
#define PD0 (0)
|
||||
|
||||
#define PSC_ENABLE (0x3)
|
||||
#define PSC_DISABLE (0x2)
|
||||
#define PSC_SYNCRESET (0x1)
|
||||
#define PSC_SWRSTDISABLE (0x0)
|
||||
|
||||
#define PSC_GOSTAT (1 << 0)
|
||||
#define PSC_MD_STATE_MSK (0x1f)
|
||||
|
||||
#define PSC_CMD_GO (1 << 0)
|
||||
|
||||
#define dv_psc_regs ((struct dv_psc_regs *)DAVINCI_PWR_SLEEP_CNTRL_BASE)
|
||||
|
||||
#endif /* _DV_PSC_DEFS_H_ */
|
||||
@@ -0,0 +1,157 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Davinci MMC Controller Defines - Based on Linux davinci_mmc.c
|
||||
*
|
||||
* Copyright (C) 2010 Texas Instruments Incorporated
|
||||
*/
|
||||
|
||||
#ifndef _SDMMC_DEFS_H_
|
||||
#define _SDMMC_DEFS_H_
|
||||
|
||||
#include <asm/arch/hardware.h>
|
||||
|
||||
/* MMC Control Reg fields */
|
||||
#define MMCCTL_DATRST (1 << 0)
|
||||
#define MMCCTL_CMDRST (1 << 1)
|
||||
#define MMCCTL_WIDTH_4_BIT (1 << 2)
|
||||
#define MMCCTL_DATEG_DISABLED (0 << 6)
|
||||
#define MMCCTL_DATEG_RISING (1 << 6)
|
||||
#define MMCCTL_DATEG_FALLING (2 << 6)
|
||||
#define MMCCTL_DATEG_BOTH (3 << 6)
|
||||
#define MMCCTL_PERMDR_LE (0 << 9)
|
||||
#define MMCCTL_PERMDR_BE (1 << 9)
|
||||
#define MMCCTL_PERMDX_LE (0 << 10)
|
||||
#define MMCCTL_PERMDX_BE (1 << 10)
|
||||
|
||||
/* MMC Clock Control Reg fields */
|
||||
#define MMCCLK_CLKEN (1 << 8)
|
||||
#define MMCCLK_CLKRT_MASK (0xFF << 0)
|
||||
|
||||
/* MMC Status Reg0 fields */
|
||||
#define MMCST0_DATDNE (1 << 0)
|
||||
#define MMCST0_BSYDNE (1 << 1)
|
||||
#define MMCST0_RSPDNE (1 << 2)
|
||||
#define MMCST0_TOUTRD (1 << 3)
|
||||
#define MMCST0_TOUTRS (1 << 4)
|
||||
#define MMCST0_CRCWR (1 << 5)
|
||||
#define MMCST0_CRCRD (1 << 6)
|
||||
#define MMCST0_CRCRS (1 << 7)
|
||||
#define MMCST0_DXRDY (1 << 9)
|
||||
#define MMCST0_DRRDY (1 << 10)
|
||||
#define MMCST0_DATED (1 << 11)
|
||||
#define MMCST0_TRNDNE (1 << 12)
|
||||
|
||||
#define MMCST0_ERR_MASK (0x00F8)
|
||||
|
||||
/* MMC Status Reg1 fields */
|
||||
#define MMCST1_BUSY (1 << 0)
|
||||
#define MMCST1_CLKSTP (1 << 1)
|
||||
#define MMCST1_DXEMP (1 << 2)
|
||||
#define MMCST1_DRFUL (1 << 3)
|
||||
#define MMCST1_DAT3ST (1 << 4)
|
||||
#define MMCST1_FIFOEMP (1 << 5)
|
||||
#define MMCST1_FIFOFUL (1 << 6)
|
||||
|
||||
/* MMC INT Mask Reg fields */
|
||||
#define MMCIM_EDATDNE (1 << 0)
|
||||
#define MMCIM_EBSYDNE (1 << 1)
|
||||
#define MMCIM_ERSPDNE (1 << 2)
|
||||
#define MMCIM_ETOUTRD (1 << 3)
|
||||
#define MMCIM_ETOUTRS (1 << 4)
|
||||
#define MMCIM_ECRCWR (1 << 5)
|
||||
#define MMCIM_ECRCRD (1 << 6)
|
||||
#define MMCIM_ECRCRS (1 << 7)
|
||||
#define MMCIM_EDXRDY (1 << 9)
|
||||
#define MMCIM_EDRRDY (1 << 10)
|
||||
#define MMCIM_EDATED (1 << 11)
|
||||
#define MMCIM_ETRNDNE (1 << 12)
|
||||
|
||||
#define MMCIM_MASKALL (0xFFFFFFFF)
|
||||
|
||||
/* MMC Resp Tout Reg fields */
|
||||
#define MMCTOR_TOR_MASK (0xFF) /* dont write to reg, | it */
|
||||
#define MMCTOR_TOD_20_16_SHIFT (8)
|
||||
|
||||
/* MMC Data Read Tout Reg fields */
|
||||
#define MMCTOD_TOD_0_15_MASK (0xFFFF)
|
||||
|
||||
/* MMC Block len Reg fields */
|
||||
#define MMCBLEN_BLEN_MASK (0xFFF)
|
||||
|
||||
/* MMC Num Blocks Reg fields */
|
||||
#define MMCNBLK_NBLK_MASK (0xFFFF)
|
||||
#define MMCNBLK_NBLK_MAX (0xFFFF)
|
||||
|
||||
/* MMC Num Blocks Counter Reg fields */
|
||||
#define MMCNBLC_NBLC_MASK (0xFFFF)
|
||||
|
||||
/* MMC Cmd Reg fields */
|
||||
#define MMCCMD_CMD_MASK (0x3F)
|
||||
#define MMCCMD_PPLEN (1 << 7)
|
||||
#define MMCCMD_BSYEXP (1 << 8)
|
||||
#define MMCCMD_RSPFMT_NONE (0 << 9)
|
||||
#define MMCCMD_RSPFMT_R1567 (1 << 9)
|
||||
#define MMCCMD_RSPFMT_R2 (2 << 9)
|
||||
#define MMCCMD_RSPFMT_R3 (3 << 9)
|
||||
#define MMCCMD_DTRW (1 << 11)
|
||||
#define MMCCMD_STRMTP (1 << 12)
|
||||
#define MMCCMD_WDATX (1 << 13)
|
||||
#define MMCCMD_INITCK (1 << 14)
|
||||
#define MMCCMD_DCLR (1 << 15)
|
||||
#define MMCCMD_DMATRIG (1 << 16)
|
||||
|
||||
/* FIFO control Reg fields */
|
||||
#define MMCFIFOCTL_FIFORST (1 << 0)
|
||||
#define MMCFIFOCTL_FIFODIR (1 << 1)
|
||||
#define MMCFIFOCTL_FIFOLEV (1 << 2)
|
||||
#define MMCFIFOCTL_ACCWD_4 (0 << 3) /* access width of 4 bytes */
|
||||
#define MMCFIFOCTL_ACCWD_3 (1 << 3) /* access width of 3 bytes */
|
||||
#define MMCFIFOCTL_ACCWD_2 (2 << 3) /* access width of 2 bytes */
|
||||
#define MMCFIFOCTL_ACCWD_1 (3 << 3) /* access width of 1 byte */
|
||||
|
||||
/* Davinci MMC Register definitions */
|
||||
struct davinci_mmc_regs {
|
||||
dv_reg mmcctl;
|
||||
dv_reg mmcclk;
|
||||
dv_reg mmcst0;
|
||||
dv_reg mmcst1;
|
||||
dv_reg mmcim;
|
||||
dv_reg mmctor;
|
||||
dv_reg mmctod;
|
||||
dv_reg mmcblen;
|
||||
dv_reg mmcnblk;
|
||||
dv_reg mmcnblc;
|
||||
dv_reg mmcdrr;
|
||||
dv_reg mmcdxr;
|
||||
dv_reg mmccmd;
|
||||
dv_reg mmcarghl;
|
||||
dv_reg mmcrsp01;
|
||||
dv_reg mmcrsp23;
|
||||
dv_reg mmcrsp45;
|
||||
dv_reg mmcrsp67;
|
||||
dv_reg mmcdrsp;
|
||||
dv_reg mmcetok;
|
||||
dv_reg mmccidx;
|
||||
dv_reg mmcckc;
|
||||
dv_reg mmctorc;
|
||||
dv_reg mmctodc;
|
||||
dv_reg mmcblnc;
|
||||
dv_reg sdioctl;
|
||||
dv_reg sdiost0;
|
||||
dv_reg sdioien;
|
||||
dv_reg sdioist;
|
||||
dv_reg mmcfifoctl;
|
||||
};
|
||||
|
||||
/* Davinci MMC board definitions */
|
||||
struct davinci_mmc {
|
||||
struct davinci_mmc_regs *reg_base; /* Register base address */
|
||||
uint input_clk; /* Input clock to MMC controller */
|
||||
uint host_caps; /* Host capabilities */
|
||||
uint voltages; /* Host supported voltages */
|
||||
struct mmc_config cfg;
|
||||
};
|
||||
|
||||
int davinci_mmc_init(bd_t *bis, struct davinci_mmc *host);
|
||||
|
||||
#endif /* _SDMMC_DEFS_H */
|
||||
@@ -0,0 +1,43 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2011 DENX Software Engineering GmbH
|
||||
* Heiko Schocher <hs@denx.de>
|
||||
*/
|
||||
#ifndef _TIMER_DEFS_H_
|
||||
#define _TIMER_DEFS_H_
|
||||
|
||||
struct davinci_timer {
|
||||
u_int32_t pid12;
|
||||
u_int32_t emumgt;
|
||||
u_int32_t na1;
|
||||
u_int32_t na2;
|
||||
u_int32_t tim12;
|
||||
u_int32_t tim34;
|
||||
u_int32_t prd12;
|
||||
u_int32_t prd34;
|
||||
u_int32_t tcr;
|
||||
u_int32_t tgcr;
|
||||
u_int32_t wdtcr;
|
||||
};
|
||||
|
||||
#define DV_TIMER_TCR_ENAMODE_MASK 3
|
||||
|
||||
#define DV_TIMER_TCR_ENAMODE12_SHIFT 6
|
||||
#define DV_TIMER_TCR_CLKSRC12_SHIFT 8
|
||||
#define DV_TIMER_TCR_READRSTMODE12_SHIFT 10
|
||||
#define DV_TIMER_TCR_CAPMODE12_SHIFT 11
|
||||
#define DV_TIMER_TCR_CAPVTMODE12_SHIFT 12
|
||||
#define DV_TIMER_TCR_ENAMODE34_SHIFT 22
|
||||
#define DV_TIMER_TCR_CLKSRC34_SHIFT 24
|
||||
#define DV_TIMER_TCR_READRSTMODE34_SHIFT 26
|
||||
#define DV_TIMER_TCR_CAPMODE34_SHIFT 27
|
||||
#define DV_TIMER_TCR_CAPEVTMODE12_SHIFT 28
|
||||
|
||||
#define DV_WDT_ENABLE_SYS_RESET 0x00020000
|
||||
#define DV_WDT_TRIGGER_SYS_RESET 0x00020002
|
||||
|
||||
#ifdef CONFIG_HW_WATCHDOG
|
||||
void davinci_hw_watchdog_enable(void);
|
||||
void davinci_hw_watchdog_reset(void);
|
||||
#endif
|
||||
#endif /* _TIMER_DEFS_H_ */
|
||||
@@ -0,0 +1,135 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Miscelaneous DaVinci functions.
|
||||
*
|
||||
* Copyright (C) 2009 Nick Thompson, GE Fanuc Ltd, <nick.thompson@gefanuc.com>
|
||||
* Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
|
||||
* Copyright (C) 2008 Lyrtech <www.lyrtech.com>
|
||||
* Copyright (C) 2004 Texas Instruments.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <env.h>
|
||||
#include <i2c.h>
|
||||
#include <net.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/davinci_misc.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
int dram_init(void)
|
||||
{
|
||||
/* dram_init must store complete ramsize in gd->ram_size */
|
||||
gd->ram_size = get_ram_size(
|
||||
(void *)CONFIG_SYS_SDRAM_BASE,
|
||||
CONFIG_MAX_RAM_BANK_SIZE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dram_init_banksize(void)
|
||||
{
|
||||
gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
|
||||
gd->bd->bi_dram[0].size = gd->ram_size;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DRIVER_TI_EMAC
|
||||
/*
|
||||
* Read ethernet MAC address from EEPROM for DVEVM compatible boards.
|
||||
* Returns 1 if found, 0 otherwise.
|
||||
*/
|
||||
int dvevm_read_mac_address(uint8_t *buf)
|
||||
{
|
||||
#ifdef CONFIG_SYS_I2C_EEPROM_ADDR
|
||||
/* Read MAC address. */
|
||||
if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0x7F00,
|
||||
CONFIG_SYS_I2C_EEPROM_ADDR_LEN, (uint8_t *) &buf[0], 6))
|
||||
goto i2cerr;
|
||||
|
||||
/* Check that MAC address is valid. */
|
||||
if (!is_valid_ethaddr(buf))
|
||||
goto err;
|
||||
|
||||
return 1; /* Found */
|
||||
|
||||
i2cerr:
|
||||
printf("Read from EEPROM @ 0x%02x failed\n",
|
||||
CONFIG_SYS_I2C_EEPROM_ADDR);
|
||||
err:
|
||||
#endif /* CONFIG_SYS_I2C_EEPROM_ADDR */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the mii mode as MII or RMII
|
||||
*/
|
||||
void davinci_emac_mii_mode_sel(int mode_sel)
|
||||
{
|
||||
int val;
|
||||
|
||||
val = readl(&davinci_syscfg_regs->cfgchip3);
|
||||
if (mode_sel == 0)
|
||||
val &= ~(1 << 8);
|
||||
else
|
||||
val |= (1 << 8);
|
||||
writel(val, &davinci_syscfg_regs->cfgchip3);
|
||||
}
|
||||
|
||||
/*
|
||||
* If there is no MAC address in the environment, then it will be initialized
|
||||
* (silently) from the value in the EEPROM.
|
||||
*/
|
||||
void davinci_sync_env_enetaddr(uint8_t *rom_enetaddr)
|
||||
{
|
||||
uint8_t env_enetaddr[6];
|
||||
int ret;
|
||||
|
||||
ret = eth_env_get_enetaddr_by_index("eth", 0, env_enetaddr);
|
||||
if (!ret) {
|
||||
/*
|
||||
* There is no MAC address in the environment, so we
|
||||
* initialize it from the value in the EEPROM.
|
||||
*/
|
||||
debug("### Setting environment from EEPROM MAC address = "
|
||||
"\"%pM\"\n",
|
||||
env_enetaddr);
|
||||
ret = !eth_env_set_enetaddr("ethaddr", rom_enetaddr);
|
||||
}
|
||||
if (!ret)
|
||||
printf("Failed to set mac address from EEPROM: %d\n", ret);
|
||||
}
|
||||
#endif /* CONFIG_DRIVER_TI_EMAC */
|
||||
|
||||
void irq_init(void)
|
||||
{
|
||||
/*
|
||||
* Mask all IRQs by clearing the global enable and setting
|
||||
* the enable clear for all the 90 interrupts.
|
||||
*/
|
||||
writel(0, &davinci_aintc_regs->ger);
|
||||
|
||||
writel(0, &davinci_aintc_regs->hier);
|
||||
|
||||
writel(0xffffffff, &davinci_aintc_regs->ecr1);
|
||||
writel(0xffffffff, &davinci_aintc_regs->ecr2);
|
||||
writel(0xffffffff, &davinci_aintc_regs->ecr3);
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable PSC for various peripherals.
|
||||
*/
|
||||
int da8xx_configure_lpsc_items(const struct lpsc_resource *item,
|
||||
const int n_items)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n_items; i++)
|
||||
lpsc_on(item[i].lpsc_no);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* DaVinci pinmux functions.
|
||||
*
|
||||
* Copyright (C) 2009 Nick Thompson, GE Fanuc Ltd, <nick.thompson@gefanuc.com>
|
||||
* Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
|
||||
* Copyright (C) 2008 Lyrtech <www.lyrtech.com>
|
||||
* Copyright (C) 2004 Texas Instruments.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/davinci_misc.h>
|
||||
|
||||
/*
|
||||
* Change the setting of a pin multiplexer field.
|
||||
*
|
||||
* Takes an array of pinmux settings similar to:
|
||||
*
|
||||
* struct pinmux_config uart_pins[] = {
|
||||
* { &davinci_syscfg_regs->pinmux[8], 2, 7 },
|
||||
* { &davinci_syscfg_regs->pinmux[9], 2, 0 }
|
||||
* };
|
||||
*
|
||||
* Stepping through the array, each pinmux[n] register has the given value
|
||||
* set in the pin mux field specified.
|
||||
*
|
||||
* The number of pins in the array must be passed (ARRAY_SIZE can provide
|
||||
* this value conveniently).
|
||||
*
|
||||
* Returns 0 if all field numbers and values are in the correct range,
|
||||
* else returns -1.
|
||||
*/
|
||||
int davinci_configure_pin_mux(const struct pinmux_config *pins,
|
||||
const int n_pins)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* check for invalid pinmux values */
|
||||
for (i = 0; i < n_pins; i++) {
|
||||
if (pins[i].field >= PIN_MUX_NUM_FIELDS ||
|
||||
(pins[i].value & ~PIN_MUX_FIELD_MASK) != 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* configure the pinmuxes */
|
||||
for (i = 0; i < n_pins; i++) {
|
||||
const int offset = pins[i].field * PIN_MUX_FIELD_SIZE;
|
||||
const unsigned int value = pins[i].value << offset;
|
||||
const unsigned int mask = PIN_MUX_FIELD_MASK << offset;
|
||||
const dv_reg *mux = pins[i].mux;
|
||||
|
||||
writel(value | (readl(mux) & (~mask)), mux);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Configure multiple pinmux resources.
|
||||
*
|
||||
* Takes an pinmux_resource array of pinmux_config and pin counts:
|
||||
*
|
||||
* const struct pinmux_resource pinmuxes[] = {
|
||||
* PINMUX_ITEM(uart_pins),
|
||||
* PINMUX_ITEM(i2c_pins),
|
||||
* };
|
||||
*
|
||||
* The number of items in the array must be passed (ARRAY_SIZE can provide
|
||||
* this value conveniently).
|
||||
*
|
||||
* Each item entry is configured in the defined order. If configuration
|
||||
* of any item fails, -1 is returned and none of the following items are
|
||||
* configured. On success, 0 is returned.
|
||||
*/
|
||||
int davinci_configure_pin_mux_items(const struct pinmux_resource *item,
|
||||
const int n_items)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n_items; i++) {
|
||||
if (davinci_configure_pin_mux(item[i].pins,
|
||||
item[i].n_pins) != 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Power and Sleep Controller (PSC) functions.
|
||||
*
|
||||
* Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
|
||||
* Copyright (C) 2008 Lyrtech <www.lyrtech.com>
|
||||
* Copyright (C) 2004 Texas Instruments.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
/*
|
||||
* The PSC manages three inputs to a "module" which may be a peripheral or
|
||||
* CPU. Those inputs are the module's: clock; reset signal; and sometimes
|
||||
* its power domain. For our purposes, we only care whether clock and power
|
||||
* are active, and the module is out of reset.
|
||||
*
|
||||
* DaVinci chips may include two separate power domains: "Always On" and "DSP".
|
||||
* Chips without a DSP generally have only one domain.
|
||||
*
|
||||
* The "Always On" power domain is always on when the chip is on, and is
|
||||
* powered by the VDD pins (on DM644X). The majority of DaVinci modules
|
||||
* lie within the "Always On" power domain.
|
||||
*
|
||||
* A separate domain called the "DSP" domain houses the C64x+ and other video
|
||||
* hardware such as VICP. In some chips, the "DSP" domain is not always on.
|
||||
* The "DSP" power domain is powered by the CVDDDSP pins (on DM644X).
|
||||
*/
|
||||
|
||||
/* Works on Always On power domain only (no PD argument) */
|
||||
static void lpsc_transition(unsigned int id, unsigned int state)
|
||||
{
|
||||
dv_reg_p mdstat, mdctl, ptstat, ptcmd;
|
||||
struct davinci_psc_regs *psc_regs;
|
||||
|
||||
if (id < DAVINCI_LPSC_PSC1_BASE) {
|
||||
if (id >= PSC_PSC0_MODULE_ID_CNT)
|
||||
return;
|
||||
psc_regs = davinci_psc0_regs;
|
||||
mdstat = &psc_regs->psc0.mdstat[id];
|
||||
mdctl = &psc_regs->psc0.mdctl[id];
|
||||
} else {
|
||||
id -= DAVINCI_LPSC_PSC1_BASE;
|
||||
if (id >= PSC_PSC1_MODULE_ID_CNT)
|
||||
return;
|
||||
psc_regs = davinci_psc1_regs;
|
||||
mdstat = &psc_regs->psc1.mdstat[id];
|
||||
mdctl = &psc_regs->psc1.mdctl[id];
|
||||
}
|
||||
ptstat = &psc_regs->ptstat;
|
||||
ptcmd = &psc_regs->ptcmd;
|
||||
|
||||
while (readl(ptstat) & 0x01)
|
||||
continue;
|
||||
|
||||
if ((readl(mdstat) & PSC_MDSTAT_STATE) == state)
|
||||
return; /* Already in that state */
|
||||
|
||||
writel((readl(mdctl) & ~PSC_MDCTL_NEXT) | state, mdctl);
|
||||
writel(0x01, ptcmd);
|
||||
|
||||
while (readl(ptstat) & 0x01)
|
||||
continue;
|
||||
while ((readl(mdstat) & PSC_MDSTAT_STATE) != state)
|
||||
continue;
|
||||
}
|
||||
|
||||
void lpsc_on(unsigned int id)
|
||||
{
|
||||
lpsc_transition(id, 0x03);
|
||||
}
|
||||
|
||||
void lpsc_syncreset(unsigned int id)
|
||||
{
|
||||
lpsc_transition(id, 0x01);
|
||||
}
|
||||
|
||||
void lpsc_disable(unsigned int id)
|
||||
{
|
||||
lpsc_transition(id, 0x0);
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Processor reset using WDT.
|
||||
*
|
||||
* Copyright (C) 2012 Dmitry Bondar <bond@inmys.ru>
|
||||
* Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/timer_defs.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
|
||||
void reset_cpu(unsigned long a)
|
||||
{
|
||||
struct davinci_timer *const wdttimer =
|
||||
(struct davinci_timer *)DAVINCI_WDOG_BASE;
|
||||
writel(0x08, &wdttimer->tgcr);
|
||||
writel(readl(&wdttimer->tgcr) | 0x03, &wdttimer->tgcr);
|
||||
writel(0, &wdttimer->tim12);
|
||||
writel(0, &wdttimer->tim34);
|
||||
writel(0, &wdttimer->prd12);
|
||||
writel(0, &wdttimer->prd34);
|
||||
writel(readl(&wdttimer->tcr) | 0x40, &wdttimer->tcr);
|
||||
writel(readl(&wdttimer->wdtcr) | 0x4000, &wdttimer->wdtcr);
|
||||
writel(0xa5c64000, &wdttimer->wdtcr);
|
||||
writel(0xda7e4000, &wdttimer->wdtcr);
|
||||
writel(0x4000, &wdttimer->wdtcr);
|
||||
while (1)
|
||||
/*nothing*/;
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Copyright (C) 2011
|
||||
* Heiko Schocher, DENX Software Engineering, hs@denx.de.
|
||||
*/
|
||||
#include <common.h>
|
||||
#include <config.h>
|
||||
#include <spl.h>
|
||||
#include <asm/u-boot.h>
|
||||
#include <asm/utils.h>
|
||||
#include <nand.h>
|
||||
#include <asm/arch/dm365_lowlevel.h>
|
||||
#include <ns16550.h>
|
||||
#include <malloc.h>
|
||||
#include <spi_flash.h>
|
||||
#include <mmc.h>
|
||||
|
||||
#ifndef CONFIG_SPL_LIBCOMMON_SUPPORT
|
||||
void puts(const char *str)
|
||||
{
|
||||
while (*str)
|
||||
putc(*str++);
|
||||
}
|
||||
|
||||
void putc(char c)
|
||||
{
|
||||
if (c == '\n')
|
||||
NS16550_putc((NS16550_t)(CONFIG_SYS_NS16550_COM1), '\r');
|
||||
|
||||
NS16550_putc((NS16550_t)(CONFIG_SYS_NS16550_COM1), c);
|
||||
}
|
||||
#endif /* CONFIG_SPL_LIBCOMMON_SUPPORT */
|
||||
|
||||
void board_init_f(ulong dummy)
|
||||
{
|
||||
arch_cpu_init();
|
||||
|
||||
spl_early_init();
|
||||
|
||||
preloader_console_init();
|
||||
}
|
||||
|
||||
u32 spl_boot_device(void)
|
||||
{
|
||||
switch (davinci_syscfg_regs->bootcfg) {
|
||||
#ifdef CONFIG_SPL_NAND_SUPPORT
|
||||
case DAVINCI_NAND8_BOOT:
|
||||
case DAVINCI_NAND16_BOOT:
|
||||
return BOOT_DEVICE_NAND;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SPL_MMC_SUPPORT
|
||||
case DAVINCI_SD_OR_MMC_BOOT:
|
||||
case DAVINCI_MMC_ONLY_BOOT:
|
||||
return BOOT_DEVICE_MMC1;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SPL_SPI_FLASH_SUPPORT
|
||||
case DAVINCI_SPI0_FLASH_BOOT:
|
||||
case DAVINCI_SPI1_FLASH_BOOT:
|
||||
return BOOT_DEVICE_SPI;
|
||||
#endif
|
||||
|
||||
default:
|
||||
puts("Unknown boot device\n");
|
||||
hang();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2003
|
||||
* Texas Instruments <www.ti.com>
|
||||
*
|
||||
* (C) Copyright 2002
|
||||
* Sysgo Real-Time Solutions, GmbH <www.elinos.com>
|
||||
* Marius Groeger <mgroeger@sysgo.de>
|
||||
*
|
||||
* (C) Copyright 2002
|
||||
* Sysgo Real-Time Solutions, GmbH <www.elinos.com>
|
||||
* Alex Zuepke <azu@sysgo.de>
|
||||
*
|
||||
* (C) Copyright 2002-2004
|
||||
* Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
|
||||
*
|
||||
* (C) Copyright 2004
|
||||
* Philippe Robin, ARM Ltd. <philippe.robin@arm.com>
|
||||
*
|
||||
* Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <time.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/timer_defs.h>
|
||||
#include <div64.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
static struct davinci_timer * const timer =
|
||||
(struct davinci_timer *)CONFIG_SYS_TIMERBASE;
|
||||
|
||||
#define TIMER_LOAD_VAL 0xffffffff
|
||||
|
||||
#define TIM_CLK_DIV 16
|
||||
|
||||
int timer_init(void)
|
||||
{
|
||||
/* We are using timer34 in unchained 32-bit mode, full speed */
|
||||
writel(0x0, &timer->tcr);
|
||||
writel(0x0, &timer->tgcr);
|
||||
writel(0x06 | ((TIM_CLK_DIV - 1) << 8), &timer->tgcr);
|
||||
writel(0x0, &timer->tim34);
|
||||
writel(TIMER_LOAD_VAL, &timer->prd34);
|
||||
writel(2 << 22, &timer->tcr);
|
||||
gd->arch.timer_rate_hz = CONFIG_SYS_HZ_CLOCK / TIM_CLK_DIV;
|
||||
gd->arch.timer_reset_value = 0;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the current 64 bit timer tick count
|
||||
*/
|
||||
unsigned long long get_ticks(void)
|
||||
{
|
||||
unsigned long now = readl(&timer->tim34);
|
||||
|
||||
/* increment tbu if tbl has rolled over */
|
||||
if (now < gd->arch.tbl)
|
||||
gd->arch.tbu++;
|
||||
gd->arch.tbl = now;
|
||||
|
||||
return (((unsigned long long)gd->arch.tbu) << 32) | gd->arch.tbl;
|
||||
}
|
||||
|
||||
ulong get_timer(ulong base)
|
||||
{
|
||||
unsigned long long timer_diff;
|
||||
|
||||
timer_diff = get_ticks() - gd->arch.timer_reset_value;
|
||||
|
||||
return lldiv(timer_diff,
|
||||
(gd->arch.timer_rate_hz / CONFIG_SYS_HZ)) - base;
|
||||
}
|
||||
|
||||
void __udelay(unsigned long usec)
|
||||
{
|
||||
unsigned long long endtime;
|
||||
|
||||
endtime = lldiv((unsigned long long)usec * gd->arch.timer_rate_hz,
|
||||
1000000UL);
|
||||
endtime += get_ticks();
|
||||
|
||||
while (get_ticks() < endtime)
|
||||
;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function is derived from PowerPC code (timebase clock frequency).
|
||||
* On ARM it returns the number of timer ticks per second.
|
||||
*/
|
||||
ulong get_tbclk(void)
|
||||
{
|
||||
return gd->arch.timer_rate_hz;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HW_WATCHDOG
|
||||
static struct davinci_timer * const wdttimer =
|
||||
(struct davinci_timer *)CONFIG_SYS_WDTTIMERBASE;
|
||||
|
||||
/*
|
||||
* See prufw2.pdf for using Timer as a WDT
|
||||
*/
|
||||
void davinci_hw_watchdog_enable(void)
|
||||
{
|
||||
writel(0x0, &wdttimer->tcr);
|
||||
writel(0x0, &wdttimer->tgcr);
|
||||
/* TIMMODE = 2h */
|
||||
writel(0x08 | 0x03 | ((TIM_CLK_DIV - 1) << 8), &wdttimer->tgcr);
|
||||
writel(CONFIG_SYS_WDT_PERIOD_LOW, &wdttimer->prd12);
|
||||
writel(CONFIG_SYS_WDT_PERIOD_HIGH, &wdttimer->prd34);
|
||||
writel(2 << 22, &wdttimer->tcr);
|
||||
writel(0x0, &wdttimer->tim12);
|
||||
writel(0x0, &wdttimer->tim34);
|
||||
/* set WDEN bit, WDKEY 0xa5c6 */
|
||||
writel(0xa5c64000, &wdttimer->wdtcr);
|
||||
/* clear counter register */
|
||||
writel(0xda7e4000, &wdttimer->wdtcr);
|
||||
}
|
||||
|
||||
void davinci_hw_watchdog_reset(void)
|
||||
{
|
||||
writel(0xa5c64000, &wdttimer->wdtcr);
|
||||
writel(0xda7e4000, &wdttimer->wdtcr);
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user