184ad6884SPeter Tyser /* 284ad6884SPeter Tyser * (C) Copyright 2002 384ad6884SPeter Tyser * Sysgo Real-Time Solutions, GmbH <www.elinos.com> 484ad6884SPeter Tyser * Marius Groeger <mgroeger@sysgo.de> 584ad6884SPeter Tyser * 684ad6884SPeter Tyser * (C) Copyright 2002 784ad6884SPeter Tyser * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> 884ad6884SPeter Tyser * 91a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 1084ad6884SPeter Tyser */ 1184ad6884SPeter Tyser 1284ad6884SPeter Tyser /* 1384ad6884SPeter Tyser * CPU specific code 1484ad6884SPeter Tyser */ 1584ad6884SPeter Tyser 1684ad6884SPeter Tyser #include <common.h> 1784ad6884SPeter Tyser #include <command.h> 1884ad6884SPeter Tyser #include <asm/system.h> 19*cd6cc344SAlbert ARIBAUD #include <asm/io.h> 2084ad6884SPeter Tyser 2184ad6884SPeter Tyser static void cache_flush(void); 2284ad6884SPeter Tyser 2384ad6884SPeter Tyser int cleanup_before_linux (void) 2484ad6884SPeter Tyser { 2584ad6884SPeter Tyser /* 2684ad6884SPeter Tyser * this function is called just before we call linux 2784ad6884SPeter Tyser * it prepares the processor for linux 2884ad6884SPeter Tyser * 2984ad6884SPeter Tyser * we turn off caches etc ... 3084ad6884SPeter Tyser */ 3184ad6884SPeter Tyser 3284ad6884SPeter Tyser disable_interrupts (); 3384ad6884SPeter Tyser 3484ad6884SPeter Tyser /* ARM926E-S needs the protection unit enabled for the icache to have 3584ad6884SPeter Tyser * been enabled - left for possible later use 3684ad6884SPeter Tyser * should turn off the protection unit as well.... 3784ad6884SPeter Tyser */ 3884ad6884SPeter Tyser /* turn off I/D-cache */ 3984ad6884SPeter Tyser icache_disable(); 4084ad6884SPeter Tyser dcache_disable(); 4184ad6884SPeter Tyser /* flush I/D-cache */ 4284ad6884SPeter Tyser cache_flush(); 4384ad6884SPeter Tyser 4484ad6884SPeter Tyser return 0; 4584ad6884SPeter Tyser } 4684ad6884SPeter Tyser 4784ad6884SPeter Tyser /* flush I/D-cache */ 4884ad6884SPeter Tyser static void cache_flush (void) 4984ad6884SPeter Tyser { 5084ad6884SPeter Tyser unsigned long i = 0; 5184ad6884SPeter Tyser 5284ad6884SPeter Tyser asm ("mcr p15, 0, %0, c7, c5, 0": :"r" (i)); 5384ad6884SPeter Tyser asm ("mcr p15, 0, %0, c7, c6, 0": :"r" (i)); 5484ad6884SPeter Tyser } 55*cd6cc344SAlbert ARIBAUD 56*cd6cc344SAlbert ARIBAUD #ifndef CONFIG_INTEGRATOR 57*cd6cc344SAlbert ARIBAUD 58*cd6cc344SAlbert ARIBAUD __attribute__((noreturn)) void reset_cpu(ulong addr __attribute__((unused))) 59*cd6cc344SAlbert ARIBAUD { 60*cd6cc344SAlbert ARIBAUD writew(0x0, 0xfffece10); 61*cd6cc344SAlbert ARIBAUD writew(0x8, 0xfffece10); 62*cd6cc344SAlbert ARIBAUD for (;;) 63*cd6cc344SAlbert ARIBAUD ; 64*cd6cc344SAlbert ARIBAUD } 65*cd6cc344SAlbert ARIBAUD 66*cd6cc344SAlbert ARIBAUD #endif /* #ifdef CONFIG_INTEGRATOR */ 67