diff options
| author | Matthias Kaehlcke <matthias@kaehlcke.net> | 2010-02-01 21:29:39 +0100 | 
|---|---|---|
| committer | Tom Rix <Tom.Rix@windriver.com> | 2010-02-12 12:31:54 -0600 | 
| commit | fcfb632bd1e9de645b015cf73a78183c299743d8 (patch) | |
| tree | 2d222c8cb01a8172ff6f4b0d2c61679acc21a3a9 | |
| parent | cf3c142ee4be0f077f8b84593f1b24b35d14039e (diff) | |
| download | olio-uboot-2014.01-fcfb632bd1e9de645b015cf73a78183c299743d8.tar.xz olio-uboot-2014.01-fcfb632bd1e9de645b015cf73a78183c299743d8.zip | |
ARM: Add support for EP93xx SoCs
Add support for the Cirrus EP93xx platform
Signed-off-by: Matthias Kaehlcke <matthias@kaehlcke.net>
Acked-by: Tom <Tom.Rix@windriver.com>
| -rw-r--r-- | cpu/arm920t/ep93xx/Makefile | 56 | ||||
| -rw-r--r-- | cpu/arm920t/ep93xx/cpu.c | 51 | ||||
| -rw-r--r-- | cpu/arm920t/ep93xx/led.c | 101 | ||||
| -rw-r--r-- | cpu/arm920t/ep93xx/lowlevel_init.S | 65 | ||||
| -rw-r--r-- | cpu/arm920t/ep93xx/speed.c | 110 | ||||
| -rw-r--r-- | cpu/arm920t/ep93xx/timer.c | 168 | ||||
| -rw-r--r-- | cpu/arm920t/ep93xx/u-boot.lds | 59 | ||||
| -rw-r--r-- | include/asm-arm/arch-ep93xx/ep93xx.h | 595 | ||||
| -rw-r--r-- | include/common.h | 3 | 
9 files changed, 1207 insertions, 1 deletions
| diff --git a/cpu/arm920t/ep93xx/Makefile b/cpu/arm920t/ep93xx/Makefile new file mode 100644 index 000000000..30e12af81 --- /dev/null +++ b/cpu/arm920t/ep93xx/Makefile @@ -0,0 +1,56 @@ +# +# Cirrus Logic EP93xx CPU-specific Makefile +# +# Copyright (C) 2009 Matthias Kaehlcke <matthias@kaehlcke.net> +# +# Copyright (C) 2004, 2005 +# Cory T. Tusar, Videon Central, Inc., <ctusar@videon-central.com> +# +# Copyright (C) 2006 +# Dominic Rath <Dominic.Rath@gmx.de> +# +# Based on an original Makefile, which is +# +# (C) Copyright 2000, 2001, 2002 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this project. +# +# 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 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. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 675 Mass Ave, Cambridge, MA 02139, USA. +# +include $(TOPDIR)/config.mk + +LIB = $(obj)lib$(SOC).a + +COBJS   = cpu.o led.o speed.o timer.o +SOBJS   = lowlevel_init.o + +SRCS    := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS    := $(addprefix $(obj),$(SOBJS) $(COBJS)) + +all:    $(obj).depend $(LIB) + +$(LIB): $(OBJS) +	$(AR) $(ARFLAGS) $@ $(OBJS) + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### + diff --git a/cpu/arm920t/ep93xx/cpu.c b/cpu/arm920t/ep93xx/cpu.c new file mode 100644 index 000000000..1abb9c6fa --- /dev/null +++ b/cpu/arm920t/ep93xx/cpu.c @@ -0,0 +1,51 @@ +/* + * Cirrus Logic EP93xx CPU-specific support. + * + * Copyright (C) 2009 Matthias Kaehlcke <matthias@kaehlcke.net> + * + * Copyright (C) 2004, 2005 + * Cory T. Tusar, Videon Central, Inc., <ctusar@videon-central.com> + * + * See file CREDITS for list of people who contributed to this project. + * + * 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 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. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <common.h> +#include <asm/arch/ep93xx.h> +#include <asm/io.h> + +/* We reset the CPU by generating a 1-->0 transition on DeviceCfg bit 31. */ +extern void reset_cpu(ulong addr) +{ +	struct syscon_regs *syscon = (struct syscon_regs *)SYSCON_BASE; +	uint32_t value; + +	/* Unlock DeviceCfg and set SWRST */ +	writel(0xAA, &syscon->sysswlock); +	value = readl(&syscon->devicecfg); +	value |= SYSCON_DEVICECFG_SWRST; +	writel(value, &syscon->devicecfg); + +	/* Unlock DeviceCfg and clear SWRST */ +	writel(0xAA, &syscon->sysswlock); +	value = readl(&syscon->devicecfg); +	value &= ~SYSCON_DEVICECFG_SWRST; +	writel(value, &syscon->devicecfg); + +	/* Dying... */ +	while (1) +		; /* noop */ +} diff --git a/cpu/arm920t/ep93xx/led.c b/cpu/arm920t/ep93xx/led.c new file mode 100644 index 000000000..7e2c89775 --- /dev/null +++ b/cpu/arm920t/ep93xx/led.c @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2010, 2009 Matthias Kaehlcke <matthias@kaehlcke.net> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <asm/io.h> +#include <asm/arch/ep93xx.h> +#include <config.h> +#include <status_led.h> + +static uint8_t saved_state[2] = {STATUS_LED_OFF, STATUS_LED_OFF}; +static uint32_t gpio_pin[2] = {1 << STATUS_LED_GREEN, +			       1 << STATUS_LED_RED}; + +inline void switch_LED_on(uint8_t led) +{ +	register struct gpio_regs *gpio = (struct gpio_regs *)GPIO_BASE; + +	writel(readl(&gpio->pedr) | gpio_pin[led], &gpio->pedr); +	saved_state[led] = STATUS_LED_ON; +} + +inline void switch_LED_off(uint8_t led) +{ +	register struct gpio_regs *gpio = (struct gpio_regs *)GPIO_BASE; + +	writel(readl(&gpio->pedr) & ~gpio_pin[led], &gpio->pedr); +	saved_state[led] = STATUS_LED_OFF; +} + +void red_LED_on(void) +{ +	switch_LED_on(STATUS_LED_RED); +} + +void red_LED_off(void) +{ +	switch_LED_off(STATUS_LED_RED); +} + +void green_LED_on(void) +{ +	switch_LED_on(STATUS_LED_GREEN); +} + +void green_LED_off(void) +{ +	switch_LED_off(STATUS_LED_GREEN); +} + +void __led_init(led_id_t mask, int state) +{ +	__led_set(mask, state); +} + +void __led_toggle(led_id_t mask) +{ +	if (STATUS_LED_RED == mask) { +		if (STATUS_LED_ON == saved_state[STATUS_LED_RED]) +			red_LED_off(); +		else +			red_LED_on(); +	} else if (STATUS_LED_GREEN == mask) { +		if (STATUS_LED_ON == saved_state[STATUS_LED_GREEN]) +			green_LED_off(); +		else +			green_LED_on(); +	} +} + +void __led_set(led_id_t mask, int state) +{ +	if (STATUS_LED_RED == mask) { +		if (STATUS_LED_ON == state) +			red_LED_on(); +		else +			red_LED_off(); +	} else if (STATUS_LED_GREEN == mask) { +		if (STATUS_LED_ON == state) +			green_LED_on(); +		else +			green_LED_off(); +	} +} diff --git a/cpu/arm920t/ep93xx/lowlevel_init.S b/cpu/arm920t/ep93xx/lowlevel_init.S new file mode 100644 index 000000000..a20ec894b --- /dev/null +++ b/cpu/arm920t/ep93xx/lowlevel_init.S @@ -0,0 +1,65 @@ +/* + * Low-level initialization for EP93xx + * + * Copyright (C) 2009 Matthias Kaehlcke <matthias@kaehlcke.net> + * + * Copyright (C) 2006 Dominic Rath <Dominic.Rath@gmx.de> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <version.h> +#include <asm/arch/ep93xx.h> + +.globl lowlevel_init +lowlevel_init: +	/* backup return address */ +	ldr r1, =SYSCON_SCRATCH0 +	str lr, [r1] + +	/* Turn on both LEDs */ +	bl red_LED_on +	bl green_LED_on + +	/* Configure flash wait states before we switch to the PLL */ +	bl flash_cfg + +	/* Set up PLL */ +	bl pll_cfg + +	/* Turn off the Green LED and leave the Red LED on */ +	bl green_LED_off + +	/* Setup SDRAM */ +	bl sdram_cfg + +	/* Turn on Green LED, Turn off the Red LED */ +	bl green_LED_on +	bl red_LED_off + +	/* FIXME: we use async mode for now */ +	mrc p15, 0, r0, c1, c0, 0 +	orr r0, r0, #0xc0000000 +	mcr p15, 0, r0, c1, c0, 0 + +	/* restore return address */ +	ldr r1, =SYSCON_SCRATCH0 +	ldr lr, [r1] + +	mov pc, lr diff --git a/cpu/arm920t/ep93xx/speed.c b/cpu/arm920t/ep93xx/speed.c new file mode 100644 index 000000000..c83a3bb91 --- /dev/null +++ b/cpu/arm920t/ep93xx/speed.c @@ -0,0 +1,110 @@ +/* + * Cirrus Logic EP93xx PLL support. + * + * Copyright (C) 2009 Matthias Kaehlcke <matthias@kaehlcke.net> + * + * See file CREDITS for list of people who contributed to this project. + * + * 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 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. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <common.h> +#include <asm/arch/ep93xx.h> +#include <asm/io.h> +#include <div64.h> + +/* + * CONFIG_SYS_CLK_FREQ should be defined as the input frequency of the PLL. + * + * get_FCLK(), get_HCLK(), get_PCLK() and get_UCLK() return the clock of + * the specified bus in HZ. + */ + +/* + * return the PLL output frequency + * + * PLL rate = CONFIG_SYS_CLK_FREQ * (X1FBD + 1) * (X2FBD + 1) + * / (X2IPD + 1) / 2^PS + */ +static ulong get_PLLCLK(uint32_t *pllreg) +{ +	uint8_t i; +	const uint32_t clkset = readl(pllreg); +	uint64_t rate = CONFIG_SYS_CLK_FREQ; +	rate *= ((clkset >> SYSCON_CLKSET_PLL_X1FBD1_SHIFT) & 0x1f) + 1; +	rate *= ((clkset >> SYSCON_CLKSET_PLL_X2FBD2_SHIFT) & 0x3f) + 1; +	do_div(rate, (clkset  & 0x1f) + 1);			/* X2IPD */ +	for (i = 0; i < ((clkset >> SYSCON_CLKSET_PLL_PS_SHIFT) & 3); i++) +		rate >>= 1; + +	return (ulong)rate; +} + +/* return FCLK frequency */ +ulong get_FCLK() +{ +	const uint8_t fclk_divisors[] = { 1, 2, 4, 8, 16, 1, 1, 1 }; +	struct syscon_regs *syscon = (struct syscon_regs *)SYSCON_BASE; + +	const uint32_t clkset1 = readl(&syscon->clkset1); +	const uint8_t fclk_div = +		fclk_divisors[(clkset1 >> SYSCON_CLKSET1_FCLK_DIV_SHIFT) & 7]; +	const ulong fclk_rate = get_PLLCLK(&syscon->clkset1) / fclk_div; + +	return fclk_rate; +} + +/* return HCLK frequency */ +ulong get_HCLK(void) +{ +	const uint8_t hclk_divisors[] = { 1, 2, 4, 5, 6, 8, 16, 32 }; +	struct syscon_regs *syscon = (struct syscon_regs *)SYSCON_BASE; + +	const uint32_t clkset1 = readl(&syscon->clkset1); +	const uint8_t hclk_div = +		hclk_divisors[(clkset1 >> SYSCON_CLKSET1_HCLK_DIV_SHIFT) & 7]; +	const ulong hclk_rate = get_PLLCLK(&syscon->clkset1) / hclk_div; + +	return hclk_rate; +} + +/* return PCLK frequency */ +ulong get_PCLK(void) +{ +	const uint8_t pclk_divisors[] = { 1, 2, 4, 8 }; +	struct syscon_regs *syscon = (struct syscon_regs *)SYSCON_BASE; + +	const uint32_t clkset1 = readl(&syscon->clkset1); +	const uint8_t pclk_div = +		pclk_divisors[(clkset1 >> SYSCON_CLKSET1_PCLK_DIV_SHIFT) & 3]; +	const ulong pclk_rate = get_HCLK() / pclk_div; + +	return pclk_rate; +} + +/* return UCLK frequency */ +ulong get_UCLK(void) +{ +	struct syscon_regs *syscon = (struct syscon_regs *)SYSCON_BASE; +	ulong uclk_rate; + +	const uint32_t value = readl(&syscon->pwrcnt); +	if (value & SYSCON_PWRCNT_UART_BAUD) +		uclk_rate = CONFIG_SYS_CLK_FREQ; +	else +		uclk_rate = CONFIG_SYS_CLK_FREQ / 2; + +	return uclk_rate; +} diff --git a/cpu/arm920t/ep93xx/timer.c b/cpu/arm920t/ep93xx/timer.c new file mode 100644 index 000000000..6d969d930 --- /dev/null +++ b/cpu/arm920t/ep93xx/timer.c @@ -0,0 +1,168 @@ +/* + * Cirrus Logic EP93xx timer support. + * + * Copyright (C) 2009, 2010 + * Matthias Kaehlcke <matthias@kaehlcke.net> + * + * Copyright (C) 2004, 2005 + * Cory T. Tusar, Videon Central, Inc., <ctusar@videon-central.com> + * + * Based on the original intr.c Cirrus Logic EP93xx Rev D. interrupt support, + * author unknown. + * + * See file CREDITS for list of people who contributed to this project. + * + * 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 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. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <common.h> +#include <linux/types.h> +#include <asm/arch/ep93xx.h> +#include <asm/io.h> + +#define TIMER_CLKSEL	(1 << 3) +#define TIMER_MODE	(1 << 6) +#define TIMER_ENABLE	(1 << 7) + +#define TIMER_FREQ	508469 +#define TIMER_LOAD_VAL	(TIMER_FREQ / CONFIG_SYS_HZ) + +static ulong timestamp; +static ulong lastdec; + +static inline unsigned long clk_to_systicks(unsigned long clk_ticks) +{ +	unsigned long sys_ticks = (clk_ticks * CONFIG_SYS_HZ) / TIMER_FREQ; + +	return sys_ticks; +} + +static inline unsigned long usecs_to_ticks(unsigned long usecs) +{ +	unsigned long ticks; + +	if (usecs >= 1000) { +		ticks = usecs / 1000; +		ticks *= (TIMER_LOAD_VAL * CONFIG_SYS_HZ); +		ticks /= 1000; +	} else { +		ticks = usecs * TIMER_LOAD_VAL * CONFIG_SYS_HZ; +		ticks /= (1000 * 1000); +	} + +	return ticks; +} + +static inline unsigned long read_timer(void) +{ +	struct timer_regs *timer = (struct timer_regs *)TIMER_BASE; + +	return readl(&timer->timer3.value); +} + +/* + * timer without interrupts + */ +unsigned long long get_ticks(void) +{ +	const unsigned long now = read_timer(); + +	if (lastdec >= now) { +		/* normal mode */ +		timestamp += lastdec - now; +	} else { +		/* we have an overflow ... */ +		timestamp += lastdec + TIMER_LOAD_VAL - now; +	} + +	lastdec = now; + +	return timestamp; +} + +unsigned long get_timer_masked(void) +{ +	return clk_to_systicks(get_ticks()); +} + +unsigned long get_timer(unsigned long base) +{ +	return get_timer_masked() - base; +} + +void reset_timer_masked(void) +{ +	lastdec = read_timer(); +	timestamp = 0; +} + +void reset_timer(void) +{ +	reset_timer_masked(); +} + +void set_timer(unsigned long t) +{ +	timestamp = t; +} + +void __udelay(unsigned long usec) +{ +	const unsigned long ticks = usecs_to_ticks(usec); +	const unsigned long target = clk_to_systicks(ticks) + get_timer(0); + +	while (get_timer_masked() < target) +		/* noop */; +} + +void udelay_masked(unsigned long usec) +{ +	const unsigned long ticks = usecs_to_ticks(usec); +	const unsigned long target = clk_to_systicks(ticks) + get_timer(0); + +	reset_timer_masked(); + +	while (get_timer_masked() < target) +		/* noop */; +} + +int timer_init(void) +{ +	struct timer_regs *timer = (struct timer_regs *)TIMER_BASE; + +	/* use timer 3 with 508KHz and free running */ +	writel(TIMER_CLKSEL, &timer->timer3.control); + +	/* auto load, manual update of Timer 3 */ +	lastdec = TIMER_LOAD_VAL; +	writel(TIMER_LOAD_VAL, &timer->timer3.load); + +	/* Enable the timer and periodic mode */ +	writel(TIMER_ENABLE | TIMER_MODE | TIMER_CLKSEL, +		&timer->timer3.control); + +	reset_timer_masked(); + +	return 0; +} + +/* + * This function is derived from PowerPC code (timebase clock frequency). + * On ARM it returns the number of timer ticks per second. + */ +unsigned long get_tbclk(void) +{ +	return CONFIG_SYS_HZ; +} diff --git a/cpu/arm920t/ep93xx/u-boot.lds b/cpu/arm920t/ep93xx/u-boot.lds new file mode 100644 index 000000000..737c9d8c1 --- /dev/null +++ b/cpu/arm920t/ep93xx/u-boot.lds @@ -0,0 +1,59 @@ +/* + * (C) Copyright 2002 + * Gary Jennejohn, DENX Software Engineering, <gj@denx.de> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) +ENTRY(_start) +SECTIONS +{ +	. = 0x00000000; + +	. = ALIGN(4); +	.text      : +	{ +	  cpu/arm920t/start.o	(.text) +		/* the EP93xx expects to find the pattern 'CRUS' at 0x1000 */ +	  . = 0x1000; +	  LONG(0x53555243) +	  *(.text) +	} + +	. = ALIGN(4); +	.rodata : { *(.rodata) } + +	. = ALIGN(4); +	.data : { *(.data) } + +	. = ALIGN(4); +	.got : { *(.got) } + +	. = .; +	__u_boot_cmd_start = .; +	.u_boot_cmd : { *(.u_boot_cmd) } +	__u_boot_cmd_end = .; + +	. = ALIGN(4); +	__bss_start = .; +	.bss : { *(.bss) } +	_end = .; +} diff --git a/include/asm-arm/arch-ep93xx/ep93xx.h b/include/asm-arm/arch-ep93xx/ep93xx.h new file mode 100644 index 000000000..6cafe54fb --- /dev/null +++ b/include/asm-arm/arch-ep93xx/ep93xx.h @@ -0,0 +1,595 @@ +/* + * Cirrus Logic EP93xx register definitions. + * + * Copyright (C) 2009 + * Matthias Kaehlcke <matthias@kaehlcke.net> + * + * Copyright (C) 2006 + * Dominic Rath <Dominic.Rath@gmx.de> + * + * Copyright (C) 2004, 2005 + * Cory T. Tusar, Videon Central, Inc., <ctusar@videon-central.com> + * + * Based in large part on linux/include/asm-arm/arch-ep93xx/regmap.h, which is + * + * Copyright (C) 2004 Ray Lehtiniemi + * Copyright (C) 2003 Cirrus Logic, Inc + * Copyright (C) 1999 ARM Limited. + * + * See file CREDITS for list of people who contributed to this project. + * + * 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 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. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define EP93XX_AHB_BASE			0x80000000 +#define EP93XX_APB_BASE			0x80800000 + +/* + * 0x80000000 - 0x8000FFFF: DMA + */ +#define DMA_OFFSET			0x000000 +#define DMA_BASE			(EP93XX_AHB_BASE | DMA_OFFSET) + +#ifndef __ASSEMBLY__ +struct dma_channel { +	uint32_t control; +	uint32_t interrupt; +	uint32_t ppalloc; +	uint32_t status; +	uint32_t reserved0; +	uint32_t remain; +	uint32_t reserved1[2]; +	uint32_t maxcnt0; +	uint32_t base0; +	uint32_t current0; +	uint32_t reserved2; +	uint32_t maxcnt1; +	uint32_t base1; +	uint32_t current1; +	uint32_t reserved3; +}; + +struct dma_regs { +	struct dma_channel m2p_channel_0; +	struct dma_channel m2p_channel_1; +	struct dma_channel m2p_channel_2; +	struct dma_channel m2p_channel_3; +	struct dma_channel m2m_channel_0; +	struct dma_channel m2m_channel_1; +	struct dma_channel reserved0[2]; +	struct dma_channel m2p_channel_5; +	struct dma_channel m2p_channel_4; +	struct dma_channel m2p_channel_7; +	struct dma_channel m2p_channel_6; +	struct dma_channel m2p_channel_9; +	struct dma_channel m2p_channel_8; +	uint32_t channel_arbitration; +	uint32_t reserved[15]; +	uint32_t global_interrupt; +}; +#endif + +/* + * 0x80010000 - 0x8001FFFF: Ethernet MAC + */ +#define MAC_OFFSET			0x010000 +#define MAC_BASE			(EP93XX_AHB_BASE | MAC_OFFSET) + +#ifndef __ASSEMBLY__ +struct mac_queue { +	uint32_t badd; +	union { /* deal with half-word aligned registers */ +		uint32_t blen; +		union { +			uint16_t filler; +			uint16_t curlen; +		}; +	}; +	uint32_t curadd; +}; + +struct mac_regs { +	uint32_t rxctl; +	uint32_t txctl; +	uint32_t testctl; +	uint32_t reserved0; +	uint32_t miicmd; +	uint32_t miidata; +	uint32_t miists; +	uint32_t reserved1; +	uint32_t selfctl; +	uint32_t inten; +	uint32_t intstsp; +	uint32_t intstsc; +	uint32_t reserved2[2]; +	uint32_t diagad; +	uint32_t diagdata; +	uint32_t gt; +	uint32_t fct; +	uint32_t fcf; +	uint32_t afp; +	union { +		struct { +			uint32_t indad; +			uint32_t indad_upper; +		}; +		uint32_t hashtbl; +	}; +	uint32_t reserved3[2]; +	uint32_t giintsts; +	uint32_t giintmsk; +	uint32_t giintrosts; +	uint32_t giintfrc; +	uint32_t txcollcnt; +	uint32_t rxmissnct; +	uint32_t rxruntcnt; +	uint32_t reserved4; +	uint32_t bmctl; +	uint32_t bmsts; +	uint32_t rxbca; +	uint32_t reserved5; +	struct mac_queue rxdq; +	uint32_t rxdqenq; +	struct mac_queue rxstsq; +	uint32_t rxstsqenq; +	struct mac_queue txdq; +	uint32_t txdqenq; +	struct mac_queue txstsq; +	uint32_t reserved6; +	uint32_t rxbufthrshld; +	uint32_t txbufthrshld; +	uint32_t rxststhrshld; +	uint32_t txststhrshld; +	uint32_t rxdthrshld; +	uint32_t txdthrshld; +	uint32_t maxfrmlen; +	uint32_t maxhdrlen; +}; +#endif + +#define SELFCTL_RWP		(1 << 7) +#define SELFCTL_GPO0		(1 << 5) +#define SELFCTL_PUWE		(1 << 4) +#define SELFCTL_PDWE		(1 << 3) +#define SELFCTL_MIIL		(1 << 2) +#define SELFCTL_RESET		(1 << 0) + +#define INTSTS_RWI		(1 << 30) +#define INTSTS_RXMI		(1 << 29) +#define INTSTS_RXBI		(1 << 28) +#define INTSTS_RXSQI		(1 << 27) +#define INTSTS_TXLEI		(1 << 26) +#define INTSTS_ECIE		(1 << 25) +#define INTSTS_TXUHI		(1 << 24) +#define INTSTS_MOI		(1 << 18) +#define INTSTS_TXCOI		(1 << 17) +#define INTSTS_RXROI		(1 << 16) +#define INTSTS_MIII		(1 << 12) +#define INTSTS_PHYI		(1 << 11) +#define INTSTS_TI		(1 << 10) +#define INTSTS_AHBE		(1 << 8) +#define INTSTS_OTHER		(1 << 4) +#define INTSTS_TXSQ		(1 << 3) +#define INTSTS_RXSQ		(1 << 2) + +#define BMCTL_MT		(1 << 13) +#define BMCTL_TT		(1 << 12) +#define BMCTL_UNH		(1 << 11) +#define BMCTL_TXCHR		(1 << 10) +#define BMCTL_TXDIS		(1 << 9) +#define BMCTL_TXEN		(1 << 8) +#define BMCTL_EH2		(1 << 6) +#define BMCTL_EH1		(1 << 5) +#define BMCTL_EEOB		(1 << 4) +#define BMCTL_RXCHR		(1 << 2) +#define BMCTL_RXDIS		(1 << 1) +#define BMCTL_RXEN		(1 << 0) + +#define BMSTS_TXACT		(1 << 7) +#define BMSTS_TP		(1 << 4) +#define BMSTS_RXACT		(1 << 3) +#define BMSTS_QID_MASK		0x07 +#define BMSTS_QID_RXDATA	0x00 +#define BMSTS_QID_TXDATA	0x01 +#define BMSTS_QID_RXSTS		0x02 +#define BMSTS_QID_TXSTS		0x03 +#define BMSTS_QID_RXDESC	0x04 +#define BMSTS_QID_TXDESC	0x05 + +#define AFP_MASK		0x07 +#define AFP_IAPRIMARY		0x00 +#define AFP_IASECONDARY1	0x01 +#define AFP_IASECONDARY2	0x02 +#define AFP_IASECONDARY3	0x03 +#define AFP_TX			0x06 +#define AFP_HASH		0x07 + +#define RXCTL_PAUSEA		(1 << 20) +#define RXCTL_RXFCE1		(1 << 19) +#define RXCTL_RXFCE0		(1 << 18) +#define RXCTL_BCRC		(1 << 17) +#define RXCTL_SRXON		(1 << 16) +#define RXCTL_RCRCA		(1 << 13) +#define RXCTL_RA		(1 << 12) +#define RXCTL_PA		(1 << 11) +#define RXCTL_BA		(1 << 10) +#define RXCTL_MA		(1 << 9) +#define RXCTL_IAHA		(1 << 8) +#define RXCTL_IA3		(1 << 3) +#define RXCTL_IA2		(1 << 2) +#define RXCTL_IA1		(1 << 1) +#define RXCTL_IA0		(1 << 0) + +#define TXCTL_DEFDIS		(1 << 7) +#define TXCTL_MBE		(1 << 6) +#define TXCTL_ICRC		(1 << 5) +#define TXCTL_TPD		(1 << 4) +#define TXCTL_OCOLL		(1 << 3) +#define TXCTL_SP		(1 << 2) +#define TXCTL_PB		(1 << 1) +#define TXCTL_STXON		(1 << 0) + +#define MIICMD_REGAD_MASK	(0x001F) +#define MIICMD_PHYAD_MASK	(0x03E0) +#define MIICMD_OPCODE_MASK	(0xC000) +#define MIICMD_PHYAD_8950	(0x0000) +#define MIICMD_OPCODE_READ	(0x8000) +#define MIICMD_OPCODE_WRITE	(0x4000) + +#define MIISTS_BUSY		(1 << 0) + +/* + * 0x80020000 - 0x8002FFFF: USB OHCI + */ +#define USB_OFFSET			0x020000 +#define USB_BASE			(EP93XX_AHB_BASE | USB_OFFSET) + +/* + * 0x80030000 - 0x8003FFFF: Raster engine + */ +#if (defined(CONFIG_EP9307) || defined(CONFIG_EP9312) || defined(CONFIG_EP9315)) +#define RASTER_OFFSET			0x030000 +#define RASTER_BASE			(EP93XX_AHB_BASE | RASTER_OFFSET) +#endif + +/* + * 0x80040000 - 0x8004FFFF: Graphics accelerator + */ +#if defined(CONFIG_EP9315) +#define GFX_OFFSET			0x040000 +#define GFX_BASE			(EP93XX_AHB_BASE | GFX_OFFSET) +#endif + +/* + * 0x80050000 - 0x8005FFFF: Reserved + */ + +/* + * 0x80060000 - 0x8006FFFF: SDRAM controller + */ +#define SDRAM_OFFSET			0x060000 +#define SDRAM_BASE			(EP93XX_AHB_BASE | SDRAM_OFFSET) + +#ifndef __ASSEMBLY__ +struct sdram_regs { +	uint32_t reserved; +	uint32_t glconfig; +	uint32_t refrshtimr; +	uint32_t bootsts; +	uint32_t devcfg0; +	uint32_t devcfg1; +	uint32_t devcfg2; +	uint32_t devcfg3; +}; +#endif + +#define SDRAM_DEVCFG_EXTBUSWIDTH	(1 << 2) +#define SDRAM_DEVCFG_BANKCOUNT		(1 << 3) +#define SDRAM_DEVCFG_SROMLL		(1 << 5) +#define SDRAM_DEVCFG_CASLAT_2		0x00010000 +#define SDRAM_DEVCFG_RASTOCAS_2		0x00200000 + +#define GLCONFIG_INIT			(1 << 0) +#define GLCONFIG_MRS			(1 << 1) +#define GLCONFIG_SMEMBUSY		(1 << 5) +#define GLCONFIG_LCR			(1 << 6) +#define GLCONFIG_REARBEN		(1 << 7) +#define GLCONFIG_CLKSHUTDOWN		(1 << 30) +#define GLCONFIG_CKE			(1 << 31) + +/* + * 0x80070000 - 0x8007FFFF: Reserved + */ + +/* + * 0x80080000 - 0x8008FFFF: SRAM controller & PCMCIA + */ +#define SMC_OFFSET			0x080000 +#define SMC_BASE			(EP93XX_AHB_BASE | SMC_OFFSET) + +#ifndef __ASSEMBLY__ +struct smc_regs { +	uint32_t bcr0; +	uint32_t bcr1; +	uint32_t bcr2; +	uint32_t bcr3; +	uint32_t reserved0[2]; +	uint32_t bcr6; +	uint32_t bcr7; +#if defined(CONFIG_EP9315) +	uint32_t pcattribute; +	uint32_t pccommon; +	uint32_t pcio; +	uint32_t reserved1[5]; +	uint32_t pcmciactrl; +#endif +}; +#endif + +#define SMC_BCR_IDCY_SHIFT	0 +#define SMC_BCR_WST1_SHIFT	5 +#define SMC_BCR_BLE		(1 << 10) +#define SMC_BCR_WST2_SHIFT	11 +#define SMC_BCR_MW_SHIFT	28 + +/* + * 0x80090000 - 0x8009FFFF: Boot ROM + */ + +/* + * 0x800A0000 - 0x800AFFFF: IDE interface + */ + +/* + * 0x800B0000 - 0x800BFFFF: VIC1 + */ + +/* + * 0x800C0000 - 0x800CFFFF: VIC2 + */ + +/* + * 0x800D0000 - 0x800FFFFF: Reserved + */ + +/* + * 0x80800000 - 0x8080FFFF: Reserved + */ + +/* + * 0x80810000 - 0x8081FFFF: Timers + */ +#define TIMER_OFFSET		0x010000 +#define TIMER_BASE		(EP93XX_APB_BASE | TIMER_OFFSET) + +#ifndef __ASSEMBLY__ +struct timer { +	uint32_t load; +	uint32_t value; +	uint32_t control; +	uint32_t clear; +}; + +struct timer4 { +	uint32_t value_low; +	uint32_t value_high; +}; + +struct timer_regs { +	struct timer timer1; +	uint32_t reserved0[4]; +	struct timer timer2; +	uint32_t reserved1[12]; +	struct timer4 timer4; +	uint32_t reserved2[6]; +	struct timer timer3; +}; +#endif + +/* + * 0x80820000 - 0x8082FFFF: I2S + */ +#define I2S_OFFSET		0x020000 +#define I2S_BASE		(EP93XX_APB_BASE | I2S_OFFSET) + +/* + * 0x80830000 - 0x8083FFFF: Security + */ +#define SECURITY_OFFSET		0x030000 +#define SECURITY_BASE		(EP93XX_APB_BASE | SECURITY_OFFSET) + +#define EXTENSIONID		(SECURITY_BASE + 0x2714) + +/* + * 0x80840000 - 0x8084FFFF: GPIO + */ +#define GPIO_OFFSET		0x040000 +#define GPIO_BASE		(EP93XX_APB_BASE | GPIO_OFFSET) + +#ifndef __ASSEMBLY__ +struct gpio_int { +	uint32_t inttype1; +	uint32_t inttype2; +	uint32_t eoi; +	uint32_t inten; +	uint32_t intsts; +	uint32_t rawintsts; +	uint32_t db; +}; + +struct gpio_regs { +	uint32_t padr; +	uint32_t pbdr; +	uint32_t pcdr; +	uint32_t pddr; +	uint32_t paddr; +	uint32_t pbddr; +	uint32_t pcddr; +	uint32_t pdddr; +	uint32_t pedr; +	uint32_t peddr; +	uint32_t reserved0[2]; +	uint32_t pfdr; +	uint32_t pfddr; +	uint32_t pgdr; +	uint32_t pgddr; +	uint32_t phdr; +	uint32_t phddr; +	uint32_t reserved1; +	uint32_t finttype1; +	uint32_t finttype2; +	uint32_t reserved2; +	struct gpio_int pfint; +	uint32_t reserved3[10]; +	struct gpio_int paint; +	struct gpio_int pbint; +	uint32_t eedrive; +}; +#endif + +/* + * 0x80850000 - 0x8087FFFF: Reserved + */ + +/* + * 0x80880000 - 0x8088FFFF: AAC + */ +#define AAC_OFFSET		0x080000 +#define AAC_BASE		(EP93XX_APB_BASE | AAC_OFFSET) + +/* + * 0x80890000 - 0x8089FFFF: Reserved + */ + +/* + * 0x808A0000 - 0x808AFFFF: SPI + */ +#define SPI_OFFSET		0x0A0000 +#define SPI_BASE		(EP93XX_APB_BASE | SPI_OFFSET) + +/* + * 0x808B0000 - 0x808BFFFF: IrDA + */ +#define IRDA_OFFSET		0x0B0000 +#define IRDA_BASE		(EP93XX_APB_BASE | IRDA_OFFSET) + +/* + * 0x808C0000 - 0x808CFFFF: UART1 + */ +#define UART1_OFFSET		0x0C0000 +#define UART1_BASE		(EP93XX_APB_BASE | UART1_OFFSET) + +/* + * 0x808D0000 - 0x808DFFFF: UART2 + */ +#define UART2_OFFSET		0x0D0000 +#define UART2_BASE		(EP93XX_APB_BASE | UART2_OFFSET) + +/* + * 0x808E0000 - 0x808EFFFF: UART3 + */ +#define UART3_OFFSET		0x0E0000 +#define UART3_BASE		(EP93XX_APB_BASE | UART3_OFFSET) + +/* + * 0x808F0000 - 0x808FFFFF: Key Matrix + */ +#define KEY_OFFSET		0x0F0000 +#define KEY_BASE		(EP93XX_APB_BASE | KEY_OFFSET) + +/* + * 0x80900000 - 0x8090FFFF: Touchscreen + */ +#define TOUCH_OFFSET		0x900000 +#define TOUCH_BASE		(EP93XX_APB_BASE | TOUCH_OFFSET) + +/* + * 0x80910000 - 0x8091FFFF: Pulse Width Modulation + */ +#define PWM_OFFSET		0x910000 +#define PWM_BASE		(EP93XX_APB_BASE | PWM_OFFSET) + +/* + * 0x80920000 - 0x8092FFFF: Real time clock + */ +#define RTC_OFFSET		0x920000 +#define RTC_BASE		(EP93XX_APB_BASE | RTC_OFFSET) + +/* + * 0x80930000 - 0x8093FFFF: Syscon + */ +#define SYSCON_OFFSET		0x930000 +#define SYSCON_BASE		(EP93XX_APB_BASE | SYSCON_OFFSET) + +#ifndef __ASSEMBLY__ +struct syscon_regs { +	uint32_t pwrsts; +	uint32_t pwrcnt; +	uint32_t halt; +	uint32_t stby; +	uint32_t reserved0[2]; +	uint32_t teoi; +	uint32_t stfclr; +	uint32_t clkset1; +	uint32_t clkset2; +	uint32_t reserved1[6]; +	uint32_t scratch0; +	uint32_t scratch1; +	uint32_t reserved2[2]; +	uint32_t apbwait; +	uint32_t bustmstrarb; +	uint32_t bootmodeclr; +	uint32_t reserved3[9]; +	uint32_t devicecfg; +	uint32_t vidclkdiv; +	uint32_t mirclkdiv; +	uint32_t i2sclkdiv; +	uint32_t keytchclkdiv; +	uint32_t chipid; +	uint32_t syscfg; +	uint32_t reserved4[8]; +	uint32_t sysswlock; +}; +#else +#define SYSCON_SCRATCH0		(SYSCON_BASE + 0x0040) +#endif + +#define SYSCON_PWRCNT_UART_BAUD			(1 << 29) + +#define SYSCON_CLKSET_PLL_X2IPD_SHIFT		0 +#define SYSCON_CLKSET_PLL_X2FBD2_SHIFT		5 +#define SYSCON_CLKSET_PLL_X1FBD1_SHIFT		11 +#define SYSCON_CLKSET_PLL_PS_SHIFT		16 +#define SYSCON_CLKSET1_PCLK_DIV_SHIFT		18 +#define SYSCON_CLKSET1_HCLK_DIV_SHIFT		20 +#define SYSCON_CLKSET1_NBYP1			(1 << 23) +#define SYSCON_CLKSET1_FCLK_DIV_SHIFT		25 + +#define SYSCON_CLKSET2_PLL2_EN			(1 << 18) +#define SYSCON_CLKSET2_NBYP2			(1 << 19) +#define SYSCON_CLKSET2_USB_DIV_SHIFT		28 + +#define SYSCON_CHIPID_REV_MASK			0xF0000000 +#define SYSCON_DEVICECFG_SWRST			(1 << 31) + +/* + * 0x80930000 - 0x8093FFFF: Watchdog Timer + */ +#define WATCHDOG_OFFSET		0x940000 +#define WATCHDOG_BASE		(EP93XX_APB_BASE | WATCHDOG_OFFSET) + +/* + * 0x80950000 - 0x9000FFFF: Reserved + */ diff --git a/include/common.h b/include/common.h index 0ae5abc6c..a133e3479 100644 --- a/include/common.h +++ b/include/common.h @@ -507,7 +507,8 @@ ulong	get_PCI_freq (void);  #endif  #if defined(CONFIG_S3C24X0) || \      defined(CONFIG_LH7A40X) || \ -    defined(CONFIG_S3C6400) +    defined(CONFIG_S3C6400) || \ +    defined(CONFIG_EP93XX)  ulong	get_FCLK (void);  ulong	get_HCLK (void);  ulong	get_PCLK (void); |