common: Drop net.h from common header
[oweals/u-boot.git] / arch / arm / cpu / pxa / pxa2xx.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2002
4  * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
5  * Marius Groeger <mgroeger@sysgo.de>
6  *
7  * (C) Copyright 2002
8  * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
9  * Alex Zuepke <azu@sysgo.de>
10  */
11
12 #include <common.h>
13 #include <cpu_func.h>
14 #include <irq_func.h>
15 #include <asm/arch/pxa-regs.h>
16 #include <asm/cache.h>
17 #include <asm/io.h>
18 #include <asm/system.h>
19 #include <command.h>
20
21 /* Flush I/D-cache */
22 static void cache_flush(void)
23 {
24         unsigned long i = 0;
25
26         asm ("mcr p15, 0, %0, c7, c5, 0" : : "r" (i));
27 }
28
29 int cleanup_before_linux(void)
30 {
31         /*
32          * This function is called just before we call Linux. It prepares
33          * the processor for Linux by just disabling everything that can
34          * disturb booting Linux.
35          */
36
37         disable_interrupts();
38         icache_disable();
39         dcache_disable();
40         cache_flush();
41
42         return 0;
43 }
44
45 inline void writelrb(uint32_t val, uint32_t addr)
46 {
47         writel(val, addr);
48         asm volatile("" : : : "memory");
49         readl(addr);
50         asm volatile("" : : : "memory");
51 }
52
53 void pxa2xx_dram_init(void)
54 {
55         uint32_t tmp;
56         int i;
57         /*
58          * 1) Initialize Asynchronous static memory controller
59          */
60
61         writelrb(CONFIG_SYS_MSC0_VAL, MSC0);
62         writelrb(CONFIG_SYS_MSC1_VAL, MSC1);
63         writelrb(CONFIG_SYS_MSC2_VAL, MSC2);
64         /*
65          * 2) Initialize Card Interface
66          */
67
68         /* MECR: Memory Expansion Card Register */
69         writelrb(CONFIG_SYS_MECR_VAL, MECR);
70         /* MCMEM0: Card Interface slot 0 timing */
71         writelrb(CONFIG_SYS_MCMEM0_VAL, MCMEM0);
72         /* MCMEM1: Card Interface slot 1 timing */
73         writelrb(CONFIG_SYS_MCMEM1_VAL, MCMEM1);
74         /* MCATT0: Card Interface Attribute Space Timing, slot 0 */
75         writelrb(CONFIG_SYS_MCATT0_VAL, MCATT0);
76         /* MCATT1: Card Interface Attribute Space Timing, slot 1 */
77         writelrb(CONFIG_SYS_MCATT1_VAL, MCATT1);
78         /* MCIO0: Card Interface I/O Space Timing, slot 0 */
79         writelrb(CONFIG_SYS_MCIO0_VAL, MCIO0);
80         /* MCIO1: Card Interface I/O Space Timing, slot 1 */
81         writelrb(CONFIG_SYS_MCIO1_VAL, MCIO1);
82
83         /*
84          * 3) Configure Fly-By DMA register
85          */
86
87         writelrb(CONFIG_SYS_FLYCNFG_VAL, FLYCNFG);
88
89         /*
90          * 4) Initialize Timing for Sync Memory (SDCLK0)
91          */
92
93         /*
94          * Before accessing MDREFR we need a valid DRI field, so we set
95          * this to power on defaults + DRI field.
96          */
97
98         /* Read current MDREFR config and zero out DRI */
99         tmp = readl(MDREFR) & ~0xfff;
100         /* Add user-specified DRI */
101         tmp |= CONFIG_SYS_MDREFR_VAL & 0xfff;
102         /* Configure important bits */
103         tmp |= MDREFR_K0RUN | MDREFR_SLFRSH;
104         tmp &= ~(MDREFR_APD | MDREFR_E1PIN);
105
106         /* Write MDREFR back */
107         writelrb(tmp, MDREFR);
108
109         /*
110          * 5) Initialize Synchronous Static Memory (Flash/Peripherals)
111          */
112
113         /* Initialize SXCNFG register. Assert the enable bits.
114          *
115          * Write SXMRS to cause an MRS command to all enabled banks of
116          * synchronous static memory. Note that SXLCR need not be written
117          * at this time.
118          */
119         writelrb(CONFIG_SYS_SXCNFG_VAL, SXCNFG);
120
121         /*
122          * 6) Initialize SDRAM
123          */
124
125         writelrb(CONFIG_SYS_MDREFR_VAL & ~MDREFR_SLFRSH, MDREFR);
126         writelrb(CONFIG_SYS_MDREFR_VAL | MDREFR_E1PIN, MDREFR);
127
128         /*
129          * 7) Write MDCNFG with MDCNFG:DEx deasserted (set to 0), to configure
130          *    but not enable each SDRAM partition pair.
131          */
132
133         writelrb(CONFIG_SYS_MDCNFG_VAL &
134                 ~(MDCNFG_DE0 | MDCNFG_DE1 | MDCNFG_DE2 | MDCNFG_DE3), MDCNFG);
135
136         /* Wait for the clock to the SDRAMs to stabilize, 100..200 usec. */
137         writel(0, OSCR);
138         while (readl(OSCR) < 0x300)
139                 asm volatile("" : : : "memory");
140
141         /*
142          * 8) Trigger a number (usually 8) refresh cycles by attempting
143          *    non-burst read or write accesses to disabled SDRAM, as commonly
144          *    specified in the power up sequence documented in SDRAM data
145          *    sheets. The address(es) used for this purpose must not be
146          *    cacheable.
147          */
148         for (i = 9; i >= 0; i--) {
149                 writel(i, 0xa0000000);
150                 asm volatile("" : : : "memory");
151         }
152         /*
153          * 9) Write MDCNFG with enable bits asserted (MDCNFG:DEx set to 1).
154          */
155
156         tmp = CONFIG_SYS_MDCNFG_VAL &
157                 (MDCNFG_DE0 | MDCNFG_DE1 | MDCNFG_DE2 | MDCNFG_DE3);
158         tmp |= readl(MDCNFG);
159         writelrb(tmp, MDCNFG);
160
161         /*
162          * 10) Write MDMRS.
163          */
164
165         writelrb(CONFIG_SYS_MDMRS_VAL, MDMRS);
166
167         /*
168          * 11) Enable APD
169          */
170
171         if (CONFIG_SYS_MDREFR_VAL & MDREFR_APD) {
172                 tmp = readl(MDREFR);
173                 tmp |= MDREFR_APD;
174                 writelrb(tmp, MDREFR);
175         }
176 }
177
178 void pxa_gpio_setup(void)
179 {
180         writel(CONFIG_SYS_GPSR0_VAL, GPSR0);
181         writel(CONFIG_SYS_GPSR1_VAL, GPSR1);
182         writel(CONFIG_SYS_GPSR2_VAL, GPSR2);
183 #if defined(CONFIG_CPU_PXA27X)
184         writel(CONFIG_SYS_GPSR3_VAL, GPSR3);
185 #endif
186
187         writel(CONFIG_SYS_GPCR0_VAL, GPCR0);
188         writel(CONFIG_SYS_GPCR1_VAL, GPCR1);
189         writel(CONFIG_SYS_GPCR2_VAL, GPCR2);
190 #if defined(CONFIG_CPU_PXA27X)
191         writel(CONFIG_SYS_GPCR3_VAL, GPCR3);
192 #endif
193
194         writel(CONFIG_SYS_GPDR0_VAL, GPDR0);
195         writel(CONFIG_SYS_GPDR1_VAL, GPDR1);
196         writel(CONFIG_SYS_GPDR2_VAL, GPDR2);
197 #if defined(CONFIG_CPU_PXA27X)
198         writel(CONFIG_SYS_GPDR3_VAL, GPDR3);
199 #endif
200
201         writel(CONFIG_SYS_GAFR0_L_VAL, GAFR0_L);
202         writel(CONFIG_SYS_GAFR0_U_VAL, GAFR0_U);
203         writel(CONFIG_SYS_GAFR1_L_VAL, GAFR1_L);
204         writel(CONFIG_SYS_GAFR1_U_VAL, GAFR1_U);
205         writel(CONFIG_SYS_GAFR2_L_VAL, GAFR2_L);
206         writel(CONFIG_SYS_GAFR2_U_VAL, GAFR2_U);
207 #if defined(CONFIG_CPU_PXA27X)
208         writel(CONFIG_SYS_GAFR3_L_VAL, GAFR3_L);
209         writel(CONFIG_SYS_GAFR3_U_VAL, GAFR3_U);
210 #endif
211
212         writel(CONFIG_SYS_PSSR_VAL, PSSR);
213 }
214
215 void pxa_interrupt_setup(void)
216 {
217         writel(0, ICLR);
218         writel(0, ICMR);
219 #if defined(CONFIG_CPU_PXA27X)
220         writel(0, ICLR2);
221         writel(0, ICMR2);
222 #endif
223 }
224
225 void pxa_clock_setup(void)
226 {
227         writel(CONFIG_SYS_CKEN, CKEN);
228         writel(CONFIG_SYS_CCCR, CCCR);
229         asm volatile("mcr       p14, 0, %0, c6, c0, 0" : : "r"(0x0b));
230
231         /* enable the 32Khz oscillator for RTC and PowerManager */
232         writel(OSCC_OON, OSCC);
233         while (!(readl(OSCC) & OSCC_OOK))
234                 asm volatile("" : : : "memory");
235 }
236
237 void pxa_wakeup(void)
238 {
239         uint32_t rcsr;
240
241         rcsr = readl(RCSR);
242         writel(rcsr & (RCSR_GPR | RCSR_SMR | RCSR_WDR | RCSR_HWR), RCSR);
243
244         /* Wakeup */
245         if (rcsr & RCSR_SMR) {
246                 writel(PSSR_PH, PSSR);
247                 pxa2xx_dram_init();
248                 icache_disable();
249                 dcache_disable();
250                 asm volatile("mov       pc, %0" : : "r"(readl(PSPR)));
251         }
252 }
253
254 int arch_cpu_init(void)
255 {
256         pxa_gpio_setup();
257         pxa_wakeup();
258         pxa_interrupt_setup();
259         pxa_clock_setup();
260         return 0;
261 }
262
263 void i2c_clk_enable(void)
264 {
265         /* Set the global I2C clock on */
266         writel(readl(CKEN) | CKEN14_I2C, CKEN);
267 }
268
269 void __attribute__((weak)) reset_cpu(ulong ignored) __attribute__((noreturn));
270
271 void reset_cpu(ulong ignored)
272 {
273         uint32_t tmp;
274
275         setbits_le32(OWER, OWER_WME);
276
277         tmp = readl(OSCR);
278         tmp += 0x1000;
279         writel(tmp, OSMR3);
280         writel(MDREFR_SLFRSH, MDREFR);
281
282         for (;;)
283                 ;
284 }
285
286 void enable_caches(void)
287 {
288 #if !CONFIG_IS_ENABLED(SYS_ICACHE_OFF)
289         icache_enable();
290 #endif
291 #if !CONFIG_IS_ENABLED(SYS_DCACHE_OFF)
292         dcache_enable();
293 #endif
294 }