diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2014-04-04 10:06:14 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2014-04-04 10:06:14 +0200 |
commit | 712b555f6cd07cfe3a1c26dc804134d006bf929d (patch) | |
tree | 467fa1b174608e19540f40fb8d462ec3976025e8 /arch | |
parent | a5a82ca2cd84d3a730025bed7414b35f041750b6 (diff) | |
parent | e32abecf6d7bad20ff83d61887b7be7bfa55d8ae (diff) | |
download | barebox-712b555f6cd07cfe3a1c26dc804134d006bf929d.tar.gz barebox-712b555f6cd07cfe3a1c26dc804134d006bf929d.tar.xz |
Merge branch 'for-next/davinci'
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/Kconfig | 7 | ||||
-rw-r--r-- | arch/arm/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/boards/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/boards/virt2real/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/boards/virt2real/board.c | 27 | ||||
-rw-r--r-- | arch/arm/boards/virt2real/lowlevel.c | 34 | ||||
-rw-r--r-- | arch/arm/boards/virt2real/virt2real.dox | 41 | ||||
-rw-r--r-- | arch/arm/configs/virt2real_defconfig | 49 | ||||
-rw-r--r-- | arch/arm/dts/dm365.dtsi | 28 | ||||
-rw-r--r-- | arch/arm/dts/virt2real.dts | 35 | ||||
-rw-r--r-- | arch/arm/include/asm/memory.h | 7 | ||||
-rw-r--r-- | arch/arm/mach-arm.dox | 2 | ||||
-rw-r--r-- | arch/arm/mach-davinci/Kconfig | 16 | ||||
-rw-r--r-- | arch/arm/mach-davinci/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/mach-davinci/include/mach/debug_ll.h | 42 | ||||
-rw-r--r-- | arch/arm/mach-davinci/include/mach/hardware.h | 29 | ||||
-rw-r--r-- | arch/arm/mach-davinci/include/mach/serial.h | 20 | ||||
-rw-r--r-- | arch/arm/mach-davinci/include/mach/time.h | 20 | ||||
-rw-r--r-- | arch/arm/mach-davinci/mach-davinci.dox | 7 | ||||
-rw-r--r-- | arch/arm/mach-davinci/time.c | 209 |
20 files changed, 577 insertions, 0 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 21f90121cd..3754646235 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -54,6 +54,12 @@ config ARCH_CLPS711X select GPIOLIB select MFD_SYSCON +config ARCH_DAVINCI + bool "TI Davinci" + select CPU_ARM926T + select HAS_DEBUG_LL + select GPIOLIB + config ARCH_EP93XX bool "Cirrus Logic EP93xx" select CPU_ARM920T @@ -188,6 +194,7 @@ source arch/arm/cpu/Kconfig source arch/arm/mach-at91/Kconfig source arch/arm/mach-bcm2835/Kconfig source arch/arm/mach-clps711x/Kconfig +source arch/arm/mach-davinci/Kconfig source arch/arm/mach-ep93xx/Kconfig source arch/arm/mach-highbank/Kconfig source arch/arm/mach-imx/Kconfig diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 2bbba35a67..c1bd836d9f 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -54,6 +54,7 @@ AFLAGS += -include asm/unified.h -msoft-float $(AFLAGS_THUMB2) machine-$(CONFIG_ARCH_AT91) := at91 machine-$(CONFIG_ARCH_BCM2835) := bcm2835 machine-$(CONFIG_ARCH_CLPS711X) := clps711x +machine-$(CONFIG_ARCH_DAVINCI) := davinci machine-$(CONFIG_ARCH_EP93XX) := ep93xx machine-$(CONFIG_ARCH_HIGHBANK) := highbank machine-$(CONFIG_ARCH_IMX) := imx diff --git a/arch/arm/boards/Makefile b/arch/arm/boards/Makefile index ac85093d75..16742d9138 100644 --- a/arch/arm/boards/Makefile +++ b/arch/arm/boards/Makefile @@ -99,5 +99,6 @@ obj-$(CONFIG_MACH_USB_A9263) += usb-a926x/ obj-$(CONFIG_MACH_USB_A9G20) += usb-a926x/ obj-$(CONFIG_MACH_VERSATILEPB) += versatile/ obj-$(CONFIG_MACH_VEXPRESS) += vexpress/ +obj-$(CONFIG_MACH_VIRT2REAL) += virt2real/ obj-$(CONFIG_MACH_ZEDBOARD) += avnet-zedboard/ obj-$(CONFIG_MACH_VARISCITE_MX6) += variscite-mx6/ diff --git a/arch/arm/boards/virt2real/Makefile b/arch/arm/boards/virt2real/Makefile new file mode 100644 index 0000000000..b2f44bba1b --- /dev/null +++ b/arch/arm/boards/virt2real/Makefile @@ -0,0 +1 @@ +obj-y += lowlevel.o board.o diff --git a/arch/arm/boards/virt2real/board.c b/arch/arm/boards/virt2real/board.c new file mode 100644 index 0000000000..b7f72171bb --- /dev/null +++ b/arch/arm/boards/virt2real/board.c @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2014 Antony Pavlov <antonynpavlov@gmail.com> + * + * This file is part of barebox. + * 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 version 2 + * as published by the Free Software Foundation. + * + * 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. + * + */ + +#include <common.h> +#include <init.h> + +static int hostname_init(void) +{ + barebox_set_hostname("virt2real"); + + return 0; +} +core_initcall(hostname_init); diff --git a/arch/arm/boards/virt2real/lowlevel.c b/arch/arm/boards/virt2real/lowlevel.c new file mode 100644 index 0000000000..3c90d78678 --- /dev/null +++ b/arch/arm/boards/virt2real/lowlevel.c @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2014 Antony Pavlov <antonynpavlov@gmail.com> + * + * This file is part of barebox. + * 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 version 2 + * as published by the Free Software Foundation. + * + * 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. + * + */ + +#define __LOWLEVEL_INIT__ + +#include <common.h> +#include <asm/barebox-arm.h> +#include <asm/barebox-arm-head.h> +#include <init.h> +#include <sizes.h> + +#define VIRT2REAL_SRAM_BASE 0x82000000 +#define VIRT2REAL_SRAM_SIZE SZ_16M + +void __naked __bare_init barebox_arm_reset_vector(void) +{ + arm_cpu_lowlevel_init(); + + barebox_arm_entry(VIRT2REAL_SRAM_BASE, VIRT2REAL_SRAM_SIZE, 0); +} diff --git a/arch/arm/boards/virt2real/virt2real.dox b/arch/arm/boards/virt2real/virt2real.dox new file mode 100644 index 0000000000..fc383216ec --- /dev/null +++ b/arch/arm/boards/virt2real/virt2real.dox @@ -0,0 +1,41 @@ +/** @page virt2real virt2real board + +virt2real is a is a miniature board for creation of WiFi +or internet controllable smart devices. + +The board has +@li TI DaVinchi DM365 running at 300 MHz +@li 128 MiB DDR2 SDRAM; +@li 256 MiB NAND Flash Memory; +@li 2 x UART serial interfaces; +@li 2 x Ethernet interfaces; +@li 1 x USB interface; +@li microSD card slot. + +The board uses U-Boot as bootloader. + +Barebox mini-howto: + +1. Connect to the boards's UART0 (115200 8N1); +Use J2.2 (GND), J2.4 (UART0_TXD), J2.6(UART0_RXD) pins. + +2. Turn board's power on; + +3. Wait 'Hit any key to stop autoboot' prompt and press the space key. + +4. Upload barebox.bin via Ymodem +@verbatim + virt2real ># loady +@endverbatim + +5. Run barebox +@verbatim + virt2real ># go 0x82000000 +@endverbatim + +virt2real links: +@li http://virt2real.com/ +@li http://wiki.virt2real.ru/ +@li https://github.com/virt2real + +*/ diff --git a/arch/arm/configs/virt2real_defconfig b/arch/arm/configs/virt2real_defconfig new file mode 100644 index 0000000000..a81d18b25b --- /dev/null +++ b/arch/arm/configs/virt2real_defconfig @@ -0,0 +1,49 @@ +CONFIG_BUILTIN_DTB=y +CONFIG_BUILTIN_DTB_NAME="virt2real" +CONFIG_ARCH_DAVINCI=y +CONFIG_AEABI=y +CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y +CONFIG_TEXT_BASE=0x82300000 +CONFIG_MALLOC_SIZE=0x200000 +CONFIG_MALLOC_TLSF=y +CONFIG_PROMPT="virt2real: " +CONFIG_LONGHELP=y +CONFIG_GLOB=y +CONFIG_HUSH_FANCY_PROMPT=y +CONFIG_CMDLINE_EDITING=y +CONFIG_AUTO_COMPLETE=y +CONFIG_MENU=y +CONFIG_PASSWORD=y +CONFIG_PARTITION=y +CONFIG_CMD_EDIT=y +CONFIG_CMD_SLEEP=y +CONFIG_CMD_EXPORT=y +CONFIG_CMD_PRINTENV=y +CONFIG_CMD_READLINE=y +CONFIG_CMD_ECHO_E=y +CONFIG_CMD_LOADB=y +CONFIG_CMD_LOADY=y +CONFIG_CMD_MEMINFO=y +CONFIG_CMD_IOMEM=y +CONFIG_CMD_MM=y +# CONFIG_CMD_BOOTM is not set +# CONFIG_CMD_BOOTU is not set +CONFIG_CMD_RESET=y +CONFIG_CMD_GO=y +CONFIG_CMD_OFTREE=y +CONFIG_CMD_OF_PROPERTY=y +CONFIG_CMD_OF_NODE=y +CONFIG_CMD_TIMEOUT=y +CONFIG_CMD_PARTITION=y +CONFIG_CMD_GPIO=y +CONFIG_CMD_UNCOMPRESS=y +CONFIG_CMD_LED=y +CONFIG_OFDEVICE=y +CONFIG_OF_BAREBOX_DRIVERS=y +CONFIG_DRIVER_SERIAL_NS16550=y +# CONFIG_SPI is not set +CONFIG_LED=y +CONFIG_LED_GPIO=y +CONFIG_LED_GPIO_OF=y +CONFIG_SHA1=y +CONFIG_SHA256=y diff --git a/arch/arm/dts/dm365.dtsi b/arch/arm/dts/dm365.dtsi new file mode 100644 index 0000000000..ea69007fa8 --- /dev/null +++ b/arch/arm/dts/dm365.dtsi @@ -0,0 +1,28 @@ +#include "skeleton.dtsi" + +/ { + soc { + compatible = "simple-bus"; + model = "TI TMS320DM365"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0x0 0x01c00000 0x400000>; + + serial0: serial@1c20000 { + compatible = "ns16550a"; + reg = <0x20000 0x400>; + reg-shift = <2>; + clock-frequency = <24000000>; + status = "disabled"; + }; + + gpio: gpio@1c67000 { + compatible = "ti,dm6441-gpio"; + gpio-controller; + reg = <0x67000 0x800>; + #gpio-cells = <2>; + ti,ngpio = <107>; + status = "disabled"; + }; + }; +}; diff --git a/arch/arm/dts/virt2real.dts b/arch/arm/dts/virt2real.dts new file mode 100644 index 0000000000..09aec1f722 --- /dev/null +++ b/arch/arm/dts/virt2real.dts @@ -0,0 +1,35 @@ +/dts-v1/; + +#include "dm365.dtsi" + +/ { + model = "virt2real"; + + memory { + reg = <0x82000000 0x01000000>; + }; + + soc { + serial0: serial@1c20000 { + status = "okay"; + }; + + gpio: gpio@1c67000 { + status = "okay"; + }; + }; + + leds { + compatible = "gpio-leds"; + + green_led { + label = "green-led"; + gpios = <&gpio 73 0>; + }; + + red_led { + label = "red-led"; + gpios = <&gpio 74 0>; + }; + }; +}; diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index 28afaa39e4..52114d0c4e 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h @@ -3,6 +3,13 @@ #include <memory.h> +#include <linux/const.h> +/* + * Allow for constants defined here to be used from assembly code + * by prepending the UL suffix only with actual C code compilation. + */ +#define UL(x) _AC(x, UL) + static inline void arm_add_mem_device(const char* name, resource_size_t start, resource_size_t size) { diff --git a/arch/arm/mach-arm.dox b/arch/arm/mach-arm.dox index 758df3f541..1d2de48df2 100644 --- a/arch/arm/mach-arm.dox +++ b/arch/arm/mach-arm.dox @@ -54,6 +54,8 @@ For details on specific architectures: @subsection mach_arm_omap_info OMAP CPUs +@li @subpage dev_davinci_arch + @li @subpage dev_omap_arch @subsection mach_arm_s3c24xx_info S3C24XX CPUs diff --git a/arch/arm/mach-davinci/Kconfig b/arch/arm/mach-davinci/Kconfig new file mode 100644 index 0000000000..3165d5086d --- /dev/null +++ b/arch/arm/mach-davinci/Kconfig @@ -0,0 +1,16 @@ +if ARCH_DAVINCI + +config ARCH_TEXT_BASE + hex + default 0x82000000 + +choice + prompt "Davinci Board type" + +config MACH_VIRT2REAL + bool "Virt2Real" + select HAVE_DEFAULT_ENVIRONMENT_NEW + +endchoice + +endif diff --git a/arch/arm/mach-davinci/Makefile b/arch/arm/mach-davinci/Makefile new file mode 100644 index 0000000000..b96d4146f6 --- /dev/null +++ b/arch/arm/mach-davinci/Makefile @@ -0,0 +1 @@ +obj-y += time.o diff --git a/arch/arm/mach-davinci/include/mach/debug_ll.h b/arch/arm/mach-davinci/include/mach/debug_ll.h new file mode 100644 index 0000000000..587f408cf8 --- /dev/null +++ b/arch/arm/mach-davinci/include/mach/debug_ll.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2014 Antony Pavlov <antonynpavlov@gmail.com> + * + * This file is part of barebox. + * 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 version 2 + * as published by the Free Software Foundation. + * + * 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. + * + */ + +/** @file + * This File contains declaration for early output support + */ +#ifndef __INCLUDE_ARCH_DEBUG_LL_H__ +#define __INCLUDE_ARCH_DEBUG_LL_H__ + +#include <asm/io.h> +#include <mach/serial.h> + +#define DEBUG_LL_UART_ADDR DAVINCI_UART0_BASE +#define DEBUG_LL_UART_RSHFT 2 + +#define rbr (0 << DEBUG_LL_UART_RSHFT) +#define lsr (5 << DEBUG_LL_UART_RSHFT) +#define LSR_THRE 0x20 /* Xmit holding register empty */ + +static inline void PUTC_LL(char ch) +{ + while (!(__raw_readb(DEBUG_LL_UART_ADDR + lsr) & LSR_THRE)) + ; + + __raw_writeb(ch, DEBUG_LL_UART_ADDR + rbr); +} + +#endif /* __INCLUDE_ARCH_DEBUG_LL_H__ */ diff --git a/arch/arm/mach-davinci/include/mach/hardware.h b/arch/arm/mach-davinci/include/mach/hardware.h new file mode 100644 index 0000000000..ea9f481844 --- /dev/null +++ b/arch/arm/mach-davinci/include/mach/hardware.h @@ -0,0 +1,29 @@ +/* + * Hardware definitions common to all DaVinci family processors + * + * Author: Kevin Hilman, Deep Root Systems, LLC + * + * 2007 (c) Deep Root Systems, LLC. This file is licensed under + * the terms of the GNU General Public License version 2. This program + * is licensed "as is" without any warranty of any kind, whether express + * or implied. + */ +#ifndef __ASM_ARCH_HARDWARE_H +#define __ASM_ARCH_HARDWARE_H + +#include <asm/memory.h> + +/* + * Before you add anything to this file: + * + * This header is for defines common to ALL DaVinci family chips. + * Anything that is chip specific should go in <chipname>.h, + * and the chip/board init code should then explicitly include + * <chipname>.h + */ +/* + * I/O mapping + */ +#define IO_PHYS UL(0x01c00000) + +#endif /* __ASM_ARCH_HARDWARE_H */ diff --git a/arch/arm/mach-davinci/include/mach/serial.h b/arch/arm/mach-davinci/include/mach/serial.h new file mode 100644 index 0000000000..bc7449f3d7 --- /dev/null +++ b/arch/arm/mach-davinci/include/mach/serial.h @@ -0,0 +1,20 @@ +/* + * DaVinci serial device definitions + * + * Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com> + * + * 2007 (c) MontaVista Software, Inc. This file is licensed under + * the terms of the GNU General Public License version 2. This program + * is licensed "as is" without any warranty of any kind, whether express + * or implied. + */ +#ifndef __ASM_ARCH_SERIAL_H +#define __ASM_ARCH_SERIAL_H + +#include <mach/hardware.h> + +#define DAVINCI_UART0_BASE (IO_PHYS + 0x20000) +#define DAVINCI_UART1_BASE (IO_PHYS + 0x20400) +#define DAVINCI_UART2_BASE (IO_PHYS + 0x20800) + +#endif /* __ASM_ARCH_SERIAL_H */ diff --git a/arch/arm/mach-davinci/include/mach/time.h b/arch/arm/mach-davinci/include/mach/time.h new file mode 100644 index 0000000000..34781b6ec5 --- /dev/null +++ b/arch/arm/mach-davinci/include/mach/time.h @@ -0,0 +1,20 @@ +/* + * Local header file for DaVinci time code. + * + * Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com> + * + * 2007 (c) MontaVista Software, Inc. This file is licensed under + * the terms of the GNU General Public License version 2. This program + * is licensed "as is" without any warranty of any kind, whether express + * or implied. + */ +#ifndef __ARCH_ARM_MACH_DAVINCI_TIME_H +#define __ARCH_ARM_MACH_DAVINCI_TIME_H + +#include <mach/hardware.h> + +#define DAVINCI_TIMER0_BASE (IO_PHYS + 0x21400) +#define DAVINCI_TIMER1_BASE (IO_PHYS + 0x21800) +#define DAVINCI_WDOG_BASE (IO_PHYS + 0x21C00) + +#endif /* __ARCH_ARM_MACH_DAVINCI_TIME_H */ diff --git a/arch/arm/mach-davinci/mach-davinci.dox b/arch/arm/mach-davinci/mach-davinci.dox new file mode 100644 index 0000000000..789eacc42a --- /dev/null +++ b/arch/arm/mach-davinci/mach-davinci.dox @@ -0,0 +1,7 @@ +/** @page dev_davinci_arch TI DaVinci in barebox + +@section davinci_boards DaVinci-based boards + +@li @subpage virt2real + +*/ diff --git a/arch/arm/mach-davinci/time.c b/arch/arm/mach-davinci/time.c new file mode 100644 index 0000000000..60f0d192a3 --- /dev/null +++ b/arch/arm/mach-davinci/time.c @@ -0,0 +1,209 @@ +/* + * DaVinci timer subsystem + * + * Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com> + * + * 2007 (c) MontaVista Software, Inc. This file is licensed under + * the terms of the GNU General Public License version 2. This program + * is licensed "as is" without any warranty of any kind, whether express + * or implied. + */ + +#include <common.h> +#include <io.h> +#include <init.h> +#include <clock.h> + +#include <mach/time.h> + +/* Timer register offsets */ +#define PID12 0x0 +#define TIM12 0x10 +#define TIM34 0x14 +#define PRD12 0x18 +#define PRD34 0x1c +#define TCR 0x20 +#define TGCR 0x24 +#define WDTCR 0x28 + +/* Timer register bitfields */ +#define TCR_ENAMODE_DISABLE 0x0 +#define TCR_ENAMODE_ONESHOT 0x1 +#define TCR_ENAMODE_PERIODIC 0x2 +#define TCR_ENAMODE_MASK 0x3 + +#define TGCR_TIMMODE_SHIFT 2 +#define TGCR_TIMMODE_64BIT_GP 0x0 +#define TGCR_TIMMODE_32BIT_UNCHAINED 0x1 +#define TGCR_TIMMODE_64BIT_WDOG 0x2 +#define TGCR_TIMMODE_32BIT_CHAINED 0x3 + +#define TGCR_TIM12RS_SHIFT 0 +#define TGCR_TIM34RS_SHIFT 1 +#define TGCR_RESET 0x0 +#define TGCR_UNRESET 0x1 +#define TGCR_RESET_MASK 0x3 + +#define WDTCR_WDEN_SHIFT 14 +#define WDTCR_WDEN_DISABLE 0x0 +#define WDTCR_WDEN_ENABLE 0x1 +#define WDTCR_WDKEY_SHIFT 16 +#define WDTCR_WDKEY_SEQ0 0xa5c6 +#define WDTCR_WDKEY_SEQ1 0xda7e + +#define DAVINCI_TIMER_CLOCK 24000000 + +struct timer_s { + void __iomem *base; + unsigned long tim_off; + unsigned long prd_off; + unsigned long enamode_shift; +}; + +static struct timer_s timers[] = { + { + .base = IOMEM(DAVINCI_TIMER0_BASE), + .enamode_shift = 6, + .tim_off = TIM12, + .prd_off = PRD12, + }, + { + .base = IOMEM(DAVINCI_TIMER0_BASE), + .enamode_shift = 22, + .tim_off = TIM34, + .prd_off = PRD34, + }, + { + .base = IOMEM(DAVINCI_TIMER1_BASE), + .enamode_shift = 6, + .tim_off = TIM12, + .prd_off = PRD12, + }, + { + .base = IOMEM(DAVINCI_TIMER1_BASE), + .enamode_shift = 22, + .tim_off = TIM34, + .prd_off = PRD34, + }, +}; + +static struct timer_s *t = &timers[0]; + +static uint64_t davinci_cs_read(void) +{ + return (uint64_t)__raw_readl(t->base + t->tim_off); +} + +static struct clocksource davinci_cs = { + .read = davinci_cs_read, + .mask = CLOCKSOURCE_MASK(32), +}; + +static int timer32_config(struct timer_s *t) +{ + u32 tcr; + + tcr = __raw_readl(t->base + TCR); + + /* disable timer */ + tcr &= ~(TCR_ENAMODE_MASK << t->enamode_shift); + __raw_writel(tcr, t->base + TCR); + + /* reset counter to zero, set new period */ + __raw_writel(0, t->base + t->tim_off); + __raw_writel(0xffffffff, t->base + t->prd_off); + + /* Set enable mode for periodic timer */ + tcr |= TCR_ENAMODE_PERIODIC << t->enamode_shift; + + __raw_writel(tcr, t->base + TCR); + + return 0; +} + +/* Global init of 64-bit timer as a whole */ +static void __init timer_init(void __iomem *base) +{ + u32 tgcr; + + /* Disabled, Internal clock source */ + __raw_writel(0, base + TCR); + + /* reset both timers, no pre-scaler for timer34 */ + tgcr = 0; + __raw_writel(tgcr, base + TGCR); + + /* Set both timers to unchained 32-bit */ + tgcr = TGCR_TIMMODE_32BIT_UNCHAINED << TGCR_TIMMODE_SHIFT; + __raw_writel(tgcr, base + TGCR); + + /* Unreset timers */ + tgcr |= (TGCR_UNRESET << TGCR_TIM12RS_SHIFT) | + (TGCR_UNRESET << TGCR_TIM34RS_SHIFT); + __raw_writel(tgcr, base + TGCR); + + /* Init both counters to zero */ + __raw_writel(0, base + TIM12); + __raw_writel(0, base + TIM34); +} + +static int clocksource_init(void) +{ + clocks_calc_mult_shift(&davinci_cs.mult, &davinci_cs.shift, + DAVINCI_TIMER_CLOCK, NSEC_PER_SEC, 10); + + init_clock(&davinci_cs); + + timer_init(IOMEM(DAVINCI_TIMER0_BASE)); + timer_init(IOMEM(DAVINCI_TIMER1_BASE)); + + timer32_config(t); + + return 0; +} +core_initcall(clocksource_init); + +/* reset board using watchdog timer */ +void __noreturn reset_cpu(ulong addr) +{ + u32 tgcr, wdtcr; + void __iomem *base; + + base = IOMEM(DAVINCI_WDOG_BASE); + + /* disable, internal clock source */ + __raw_writel(0, base + TCR); + + /* reset timer, set mode to 64-bit watchdog, and unreset */ + tgcr = 0; + __raw_writel(tgcr, base + TGCR); + tgcr = TGCR_TIMMODE_64BIT_WDOG << TGCR_TIMMODE_SHIFT; + tgcr |= (TGCR_UNRESET << TGCR_TIM12RS_SHIFT) | + (TGCR_UNRESET << TGCR_TIM34RS_SHIFT); + __raw_writel(tgcr, base + TGCR); + + /* clear counter and period regs */ + __raw_writel(0, base + TIM12); + __raw_writel(0, base + TIM34); + __raw_writel(0, base + PRD12); + __raw_writel(0, base + PRD34); + + /* put watchdog in pre-active state */ + wdtcr = __raw_readl(base + WDTCR); + wdtcr = (WDTCR_WDKEY_SEQ0 << WDTCR_WDKEY_SHIFT) | + (WDTCR_WDEN_ENABLE << WDTCR_WDEN_SHIFT); + __raw_writel(wdtcr, base + WDTCR); + + /* put watchdog in active state */ + wdtcr = (WDTCR_WDKEY_SEQ1 << WDTCR_WDKEY_SHIFT) | + (WDTCR_WDEN_ENABLE << WDTCR_WDEN_SHIFT); + __raw_writel(wdtcr, base + WDTCR); + + /* write an invalid value to the WDKEY field to trigger + * a watchdog reset */ + wdtcr = 0x00004000; + __raw_writel(wdtcr, base + WDTCR); + + unreachable(); +} +EXPORT_SYMBOL(reset_cpu); |