]> git.sur5r.net Git - u-boot/blob - cpu/pxa/cpu.c
arm: update co-processor 15 access
[u-boot] / cpu / pxa / cpu.c
1 /*
2  * (C) Copyright 2002
3  * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
4  * Marius Groeger <mgroeger@sysgo.de>
5  *
6  * (C) Copyright 2002
7  * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
8  * Alex Zuepke <azu@sysgo.de>
9  *
10  * See file CREDITS for list of people who contributed to this
11  * project.
12  *
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License as
15  * published by the Free Software Foundation; either version 2 of
16  * the License, or (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
26  * MA 02111-1307 USA
27  */
28
29 /*
30  * CPU specific code
31  */
32
33 #include <common.h>
34 #include <command.h>
35 #include <asm/arch/pxa-regs.h>
36 #include <asm/system.h>
37
38 #ifdef CONFIG_USE_IRQ
39 DECLARE_GLOBAL_DATA_PTR;
40 #endif
41
42 int cpu_init (void)
43 {
44         /*
45          * setup up stacks if necessary
46          */
47 #ifdef CONFIG_USE_IRQ
48         IRQ_STACK_START = _armboot_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE - 4;
49         FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ;
50 #endif
51         return 0;
52 }
53
54 int cleanup_before_linux (void)
55 {
56         /*
57          * this function is called just before we call linux
58          * it prepares the processor for linux
59          *
60          * just disable everything that can disturb booting linux
61          */
62
63         unsigned long i;
64
65         disable_interrupts ();
66
67         /* turn off I-cache */
68         asm ("mrc p15, 0, %0, c1, c0, 0":"=r" (i));
69         i &= ~0x1000;
70         asm ("mcr p15, 0, %0, c1, c0, 0": :"r" (i));
71
72         /* flush I-cache */
73         asm ("mcr p15, 0, %0, c7, c5, 0": :"r" (i));
74
75         return (0);
76 }
77
78 int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
79 {
80         printf ("resetting ...\n");
81
82         udelay (50000);                         /* wait 50 ms */
83         disable_interrupts ();
84         reset_cpu (0);
85
86         /*NOTREACHED*/
87         return (0);
88 }
89
90 /* cache_bit must be either CR_I or CR_C */
91 static void cache_enable(uint32_t cache_bit)
92 {
93         uint32_t reg;
94
95         reg = get_cr(); /* get control reg. */
96         cp_delay();
97         set_cr(reg | cache_bit);
98 }
99
100 /* cache_bit must be either CR_I or CR_C */
101 static void cache_disable(uint32_t cache_bit)
102 {
103         uint32_t reg;
104
105         reg = get_cr();
106         cp_delay();
107         set_cr(reg & ~cache_bit);
108 }
109
110 void icache_enable(void)
111 {
112         cache_enable(CR_I);
113 }
114
115 void icache_disable(void)
116 {
117         cache_disable(CR_I);
118 }
119
120 int icache_status(void)
121 {
122         return (get_cr() & CR_I) != 0;
123 }
124
125 /* we will never enable dcache, because we have to setup MMU first */
126 void dcache_enable (void)
127 {
128         return;
129 }
130
131 void dcache_disable (void)
132 {
133         return;
134 }
135
136 int dcache_status (void)
137 {
138         return 0;                                       /* always off */
139 }
140
141 #ifndef CONFIG_CPU_MONAHANS
142 void set_GPIO_mode(int gpio_mode)
143 {
144         int gpio = gpio_mode & GPIO_MD_MASK_NR;
145         int fn = (gpio_mode & GPIO_MD_MASK_FN) >> 8;
146         int gafr;
147
148         if (gpio_mode & GPIO_MD_MASK_DIR)
149         {
150                 GPDR(gpio) |= GPIO_bit(gpio);
151         }
152         else
153         {
154                 GPDR(gpio) &= ~GPIO_bit(gpio);
155         }
156         gafr = GAFR(gpio) & ~(0x3 << (((gpio) & 0xf)*2));
157         GAFR(gpio) = gafr |  (fn  << (((gpio) & 0xf)*2));
158 }
159 #endif /* CONFIG_CPU_MONAHANS */