]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - arch/arm/cpu/armv7/omap-common/hwinit-common.c
arm: rmobile: lager: Remove NOR-Flash support from boards.cfg
[karo-tx-uboot.git] / arch / arm / cpu / armv7 / omap-common / hwinit-common.c
1 /*
2  *
3  * Common functions for OMAP4/5 based boards
4  *
5  * (C) Copyright 2010
6  * Texas Instruments, <www.ti.com>
7  *
8  * Author :
9  *      Aneesh V        <aneesh@ti.com>
10  *      Steve Sakoman   <steve@sakoman.com>
11  *
12  * SPDX-License-Identifier:     GPL-2.0+
13  */
14 #include <common.h>
15 #include <spl.h>
16 #include <asm/arch/sys_proto.h>
17 #include <linux/sizes.h>
18 #include <asm/emif.h>
19 #include <asm/omap_common.h>
20 #include <linux/compiler.h>
21 #include <asm/cache.h>
22 #include <asm/system.h>
23
24 #define ARMV7_DCACHE_WRITEBACK  0xe
25 #define ARMV7_DOMAIN_CLIENT     1
26 #define ARMV7_DOMAIN_MASK       (0x3 << 0)
27
28 DECLARE_GLOBAL_DATA_PTR;
29
30 void do_set_mux(u32 base, struct pad_conf_entry const *array, int size)
31 {
32         int i;
33         struct pad_conf_entry *pad = (struct pad_conf_entry *) array;
34
35         for (i = 0; i < size; i++, pad++)
36                 writew(pad->val, base + pad->offset);
37 }
38
39 static void set_mux_conf_regs(void)
40 {
41         switch (omap_hw_init_context()) {
42         case OMAP_INIT_CONTEXT_SPL:
43                 set_muxconf_regs_essential();
44                 break;
45         case OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL:
46                 break;
47         case OMAP_INIT_CONTEXT_UBOOT_FROM_NOR:
48         case OMAP_INIT_CONTEXT_UBOOT_AFTER_CH:
49                 set_muxconf_regs_essential();
50                 break;
51         }
52 }
53
54 u32 cortex_rev(void)
55 {
56
57         unsigned int rev;
58
59         /* Read Main ID Register (MIDR) */
60         asm ("mrc p15, 0, %0, c0, c0, 0" : "=r" (rev));
61
62         return rev;
63 }
64
65 static void omap_rev_string(void)
66 {
67         u32 omap_rev = omap_revision();
68         u32 soc_variant = (omap_rev & 0xF0000000) >> 28;
69         u32 omap_variant = (omap_rev & 0xFFFF0000) >> 16;
70         u32 major_rev = (omap_rev & 0x00000F00) >> 8;
71         u32 minor_rev = (omap_rev & 0x000000F0) >> 4;
72
73         if (soc_variant)
74                 printf("OMAP");
75         else
76                 printf("DRA");
77         printf("%x ES%x.%x\n", omap_variant, major_rev,
78                minor_rev);
79 }
80
81 #ifdef CONFIG_SPL_BUILD
82 void spl_display_print(void)
83 {
84         omap_rev_string();
85 }
86 #endif
87
88 void __weak srcomp_enable(void)
89 {
90 }
91
92 #ifdef CONFIG_ARCH_CPU_INIT
93 /*
94  * SOC specific cpu init
95  */
96 int arch_cpu_init(void)
97 {
98         save_omap_boot_params();
99         return 0;
100 }
101 #endif /* CONFIG_ARCH_CPU_INIT */
102
103 /*
104  * Routine: s_init
105  * Description: Does early system init of watchdog, muxing,  andclocks
106  * Watchdog disable is done always. For the rest what gets done
107  * depends on the boot mode in which this function is executed
108  *   1. s_init of SPL running from SRAM
109  *   2. s_init of U-Boot running from FLASH
110  *   3. s_init of U-Boot loaded to SDRAM by SPL
111  *   4. s_init of U-Boot loaded to SDRAM by ROM code using the
112  *      Configuration Header feature
113  * Please have a look at the respective functions to see what gets
114  * done in each of these cases
115  * This function is called with SRAM stack.
116  */
117 void s_init(void)
118 {
119         /*
120          * Save the boot parameters passed from romcode.
121          * We cannot delay the saving further than this,
122          * to prevent overwrites.
123          */
124 #ifdef CONFIG_SPL_BUILD
125         save_omap_boot_params();
126 #endif
127         init_omap_revision();
128         hw_data_init();
129
130 #ifdef CONFIG_SPL_BUILD
131         if (warm_reset() && (omap_revision() <= OMAP5430_ES1_0))
132                 force_emif_self_refresh();
133 #endif
134         watchdog_init();
135         set_mux_conf_regs();
136 #ifdef CONFIG_SPL_BUILD
137         srcomp_enable();
138         setup_clocks_for_console();
139
140         gd = &gdata;
141
142         preloader_console_init();
143         do_io_settings();
144 #endif
145         prcm_init();
146 #ifdef CONFIG_SPL_BUILD
147         /* For regular u-boot sdram_init() is called from dram_init() */
148         sdram_init();
149 #endif
150 }
151
152 /*
153  * Routine: wait_for_command_complete
154  * Description: Wait for posting to finish on watchdog
155  */
156 void wait_for_command_complete(struct watchdog *wd_base)
157 {
158         int pending = 1;
159         do {
160                 pending = readl(&wd_base->wwps);
161         } while (pending);
162 }
163
164 /*
165  * Routine: watchdog_init
166  * Description: Shut down watch dogs
167  */
168 void watchdog_init(void)
169 {
170         struct watchdog *wd2_base = (struct watchdog *)WDT2_BASE;
171
172         writel(WD_UNLOCK1, &wd2_base->wspr);
173         wait_for_command_complete(wd2_base);
174         writel(WD_UNLOCK2, &wd2_base->wspr);
175 }
176
177
178 /*
179  * This function finds the SDRAM size available in the system
180  * based on DMM section configurations
181  * This is needed because the size of memory installed may be
182  * different on different versions of the board
183  */
184 u32 omap_sdram_size(void)
185 {
186         u32 section, i, valid;
187         u64 sdram_start = 0, sdram_end = 0, addr,
188             size, total_size = 0, trap_size = 0, trap_start = 0;
189
190         for (i = 0; i < 4; i++) {
191                 section = __raw_readl(DMM_BASE + i*4);
192                 valid = (section & EMIF_SDRC_ADDRSPC_MASK) >>
193                         (EMIF_SDRC_ADDRSPC_SHIFT);
194                 addr = section & EMIF_SYS_ADDR_MASK;
195
196                 /* See if the address is valid */
197                 if ((addr >= TI_ARMV7_DRAM_ADDR_SPACE_START) &&
198                     (addr < TI_ARMV7_DRAM_ADDR_SPACE_END)) {
199                         size = ((section & EMIF_SYS_SIZE_MASK) >>
200                                    EMIF_SYS_SIZE_SHIFT);
201                         size = 1 << size;
202                         size *= SZ_16M;
203
204                         if (valid != DMM_SDRC_ADDR_SPC_INVALID) {
205                                 if (!sdram_start || (addr < sdram_start))
206                                         sdram_start = addr;
207                                 if (!sdram_end || ((addr + size) > sdram_end))
208                                         sdram_end = addr + size;
209                         } else {
210                                 trap_size = size;
211                                 trap_start = addr;
212                         }
213                 }
214         }
215
216         if ((trap_start >= sdram_start) && (trap_start < sdram_end))
217                 total_size = (sdram_end - sdram_start) - (trap_size);
218         else
219                 total_size = sdram_end - sdram_start;
220
221         return total_size;
222 }
223
224
225 /*
226  * Routine: dram_init
227  * Description: sets uboots idea of sdram size
228  */
229 int dram_init(void)
230 {
231         sdram_init();
232         gd->ram_size = omap_sdram_size();
233         return 0;
234 }
235
236 /*
237  * Print board information
238  */
239 int checkboard(void)
240 {
241         puts(sysinfo.board_string);
242         return 0;
243 }
244
245 /*
246  *  get_device_type(): tell if GP/HS/EMU/TST
247  */
248 u32 get_device_type(void)
249 {
250         return (readl((*ctrl)->control_status) &
251                                       (DEVICE_TYPE_MASK)) >> DEVICE_TYPE_SHIFT;
252 }
253
254 #if defined(CONFIG_DISPLAY_CPUINFO)
255 /*
256  * Print CPU information
257  */
258 int print_cpuinfo(void)
259 {
260         puts("CPU  : ");
261         omap_rev_string();
262
263         return 0;
264 }
265 #endif
266
267 #ifndef CONFIG_SYS_DCACHE_OFF
268 void enable_caches(void)
269 {
270         /* Enable D-cache. I-cache is already enabled in start.S */
271         dcache_enable();
272 }
273
274 void dram_bank_mmu_setup(int bank)
275 {
276         bd_t *bd = gd->bd;
277         int     i;
278
279         u32 start = bd->bi_dram[bank].start >> 20;
280         u32 size = bd->bi_dram[bank].size >> 20;
281         u32 end = start + size;
282
283         debug("%s: bank: %d\n", __func__, bank);
284         for (i = start; i < end; i++)
285                 set_section_dcache(i, ARMV7_DCACHE_WRITEBACK);
286
287 }
288
289 void arm_init_domains(void)
290 {
291         u32 reg;
292
293         reg = get_dacr();
294         /*
295         * Set DOMAIN to client access so that all permissions
296         * set in pagetables are validated by the mmu.
297         */
298         reg &= ~ARMV7_DOMAIN_MASK;
299         reg |= ARMV7_DOMAIN_CLIENT;
300         set_dacr(reg);
301 }
302 #endif