Wolfgang Denk | 72a087e | 2006-10-24 14:27:35 +0200 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2005-2006 Atmel Corporation |
| 3 | * |
Wolfgang Denk | 1a45966 | 2013-07-08 09:37:19 +0200 | [diff] [blame] | 4 | * SPDX-License-Identifier: GPL-2.0+ |
Wolfgang Denk | 72a087e | 2006-10-24 14:27:35 +0200 | [diff] [blame] | 5 | */ |
| 6 | #include <common.h> |
| 7 | #include <command.h> |
| 8 | |
| 9 | #include <asm/io.h> |
| 10 | #include <asm/sections.h> |
| 11 | #include <asm/sysreg.h> |
| 12 | |
Haavard Skinnemoen | df548d3 | 2006-11-19 18:06:53 +0100 | [diff] [blame] | 13 | #include <asm/arch/clk.h> |
Andreas Bießmann | 5d73bc7 | 2010-11-04 23:15:30 +0000 | [diff] [blame] | 14 | #include <asm/arch/hardware.h> |
Wolfgang Denk | 72a087e | 2006-10-24 14:27:35 +0200 | [diff] [blame] | 15 | |
| 16 | #include "hsmc3.h" |
Haavard Skinnemoen | df548d3 | 2006-11-19 18:06:53 +0100 | [diff] [blame] | 17 | |
| 18 | /* Sanity checks */ |
Jean-Christophe PLAGNIOL-VILLARD | 6d0f6bc | 2008-10-16 15:01:15 +0200 | [diff] [blame] | 19 | #if (CONFIG_SYS_CLKDIV_CPU > CONFIG_SYS_CLKDIV_HSB) \ |
| 20 | || (CONFIG_SYS_CLKDIV_HSB > CONFIG_SYS_CLKDIV_PBA) \ |
| 21 | || (CONFIG_SYS_CLKDIV_HSB > CONFIG_SYS_CLKDIV_PBB) |
Haavard Skinnemoen | df548d3 | 2006-11-19 18:06:53 +0100 | [diff] [blame] | 22 | # error Constraint fCPU >= fHSB >= fPB{A,B} violated |
| 23 | #endif |
Jean-Christophe PLAGNIOL-VILLARD | 6d0f6bc | 2008-10-16 15:01:15 +0200 | [diff] [blame] | 24 | #if defined(CONFIG_PLL) && ((CONFIG_SYS_PLL0_MUL < 1) || (CONFIG_SYS_PLL0_DIV < 1)) |
Haavard Skinnemoen | df548d3 | 2006-11-19 18:06:53 +0100 | [diff] [blame] | 25 | # error Invalid PLL multiplier and/or divider |
| 26 | #endif |
Wolfgang Denk | 72a087e | 2006-10-24 14:27:35 +0200 | [diff] [blame] | 27 | |
| 28 | DECLARE_GLOBAL_DATA_PTR; |
| 29 | |
| 30 | int cpu_init(void) |
| 31 | { |
Wolfgang Denk | 72a087e | 2006-10-24 14:27:35 +0200 | [diff] [blame] | 32 | extern void _evba(void); |
Wolfgang Denk | 72a087e | 2006-10-24 14:27:35 +0200 | [diff] [blame] | 33 | |
Simon Glass | 3d0f8c8 | 2012-12-13 20:49:10 +0000 | [diff] [blame] | 34 | gd->arch.cpu_hz = CONFIG_SYS_OSC0_HZ; |
Wolfgang Denk | 72a087e | 2006-10-24 14:27:35 +0200 | [diff] [blame] | 35 | |
Haavard Skinnemoen | df548d3 | 2006-11-19 18:06:53 +0100 | [diff] [blame] | 36 | /* TODO: Move somewhere else, but needs to be run before we |
| 37 | * increase the clock frequency. */ |
| 38 | hsmc3_writel(MODE0, 0x00031103); |
| 39 | hsmc3_writel(CYCLE0, 0x000c000d); |
| 40 | hsmc3_writel(PULSE0, 0x0b0a0906); |
| 41 | hsmc3_writel(SETUP0, 0x00010002); |
Wolfgang Denk | 72a087e | 2006-10-24 14:27:35 +0200 | [diff] [blame] | 42 | |
Haavard Skinnemoen | 3ace252 | 2008-05-02 15:21:40 +0200 | [diff] [blame] | 43 | clk_init(); |
Wolfgang Denk | 72a087e | 2006-10-24 14:27:35 +0200 | [diff] [blame] | 44 | |
Haavard Skinnemoen | 3ace252 | 2008-05-02 15:21:40 +0200 | [diff] [blame] | 45 | /* Update the CPU speed according to the PLL configuration */ |
Simon Glass | 3d0f8c8 | 2012-12-13 20:49:10 +0000 | [diff] [blame] | 46 | gd->arch.cpu_hz = get_cpu_clk_rate(); |
Haavard Skinnemoen | 3ace252 | 2008-05-02 15:21:40 +0200 | [diff] [blame] | 47 | |
| 48 | /* Set up the exception handler table and enable exceptions */ |
Wolfgang Denk | 72a087e | 2006-10-24 14:27:35 +0200 | [diff] [blame] | 49 | sysreg_write(EVBA, (unsigned long)&_evba); |
| 50 | asm volatile("csrf %0" : : "i"(SYSREG_EM_OFFSET)); |
Wolfgang Denk | 72a087e | 2006-10-24 14:27:35 +0200 | [diff] [blame] | 51 | |
Wolfgang Denk | 72a087e | 2006-10-24 14:27:35 +0200 | [diff] [blame] | 52 | return 0; |
| 53 | } |
| 54 | |
| 55 | void prepare_to_boot(void) |
| 56 | { |
| 57 | /* Flush both caches and the write buffer */ |
| 58 | asm volatile("cache %0[4], 010\n\t" |
| 59 | "cache %0[0], 000\n\t" |
| 60 | "sync 0" : : "r"(0) : "memory"); |
| 61 | } |
| 62 | |
Wolfgang Denk | 54841ab | 2010-06-28 22:00:46 +0200 | [diff] [blame] | 63 | int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
Wolfgang Denk | 72a087e | 2006-10-24 14:27:35 +0200 | [diff] [blame] | 64 | { |
| 65 | /* This will reset the CPU core, caches, MMU and all internal busses */ |
| 66 | __builtin_mtdr(8, 1 << 13); /* set DC:DBE */ |
| 67 | __builtin_mtdr(8, 1 << 30); /* set DC:RES */ |
| 68 | |
| 69 | /* Flush the pipeline before we declare it a failure */ |
| 70 | asm volatile("sub pc, pc, -4"); |
| 71 | |
| 72 | return -1; |
| 73 | } |