]> git.sur5r.net Git - u-boot/blob - arch/arm/cpu/armv7/omap4/board.c
omap4: cleanup pin mux data
[u-boot] / arch / arm / cpu / armv7 / omap4 / board.c
1 /*
2  *
3  * Common functions for OMAP4 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  * See file CREDITS for list of people who contributed to this
13  * project.
14  *
15  * This program is free software; you can redistribute it and/or
16  * modify it under the terms of the GNU General Public License as
17  * published by the Free Software Foundation; either version 2 of
18  * the License, or (at your option) any later version.
19  *
20  * This program is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with this program; if not, write to the Free Software
27  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
28  * MA 02111-1307 USA
29  */
30 #include <common.h>
31 #include <asm/arch/cpu.h>
32 #include <asm/arch/sys_proto.h>
33 #include <asm/sizes.h>
34 #include "omap4_mux_data.h"
35
36 DECLARE_GLOBAL_DATA_PTR;
37
38 void do_set_mux(u32 base, struct pad_conf_entry const *array, int size)
39 {
40         int i;
41         struct pad_conf_entry *pad = (struct pad_conf_entry *) array;
42
43         for (i = 0; i < size; i++, pad++)
44                 writew(pad->val, base + pad->offset);
45 }
46
47 static void set_muxconf_regs_essential(void)
48 {
49         do_set_mux(CONTROL_PADCONF_CORE, core_padconf_array_essential,
50                    sizeof(core_padconf_array_essential) /
51                    sizeof(struct pad_conf_entry));
52
53         do_set_mux(CONTROL_PADCONF_WKUP, wkup_padconf_array_essential,
54                    sizeof(wkup_padconf_array_essential) /
55                    sizeof(struct pad_conf_entry));
56 }
57
58 static void set_mux_conf_regs(void)
59 {
60         switch (omap4_hw_init_context()) {
61         case OMAP_INIT_CONTEXT_SPL:
62                 set_muxconf_regs_essential();
63                 break;
64         case OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL:
65                 set_muxconf_regs_non_essential();
66                 break;
67         case OMAP_INIT_CONTEXT_UBOOT_FROM_NOR:
68         case OMAP_INIT_CONTEXT_UBOOT_AFTER_CH:
69                 set_muxconf_regs_essential();
70                 set_muxconf_regs_non_essential();
71                 break;
72         }
73 }
74
75 /*
76  * Routine: s_init
77  * Description: Does early system init of watchdog, muxing,  andclocks
78  * Watchdog disable is done always. For the rest what gets done
79  * depends on the boot mode in which this function is executed
80  *   1. s_init of SPL running from SRAM
81  *   2. s_init of U-Boot running from FLASH
82  *   3. s_init of U-Boot loaded to SDRAM by SPL
83  *   4. s_init of U-Boot loaded to SDRAM by ROM code using the
84  *      Configuration Header feature
85  * Please have a look at the respective functions to see what gets
86  * done in each of these cases
87  * This function is called with SRAM stack.
88  */
89 void s_init(void)
90 {
91         watchdog_init();
92         set_mux_conf_regs();
93 }
94
95 /*
96  * Routine: wait_for_command_complete
97  * Description: Wait for posting to finish on watchdog
98  */
99 void wait_for_command_complete(struct watchdog *wd_base)
100 {
101         int pending = 1;
102         do {
103                 pending = readl(&wd_base->wwps);
104         } while (pending);
105 }
106
107 /*
108  * Routine: watchdog_init
109  * Description: Shut down watch dogs
110  */
111 void watchdog_init(void)
112 {
113         struct watchdog *wd2_base = (struct watchdog *)WDT2_BASE;
114
115         writel(WD_UNLOCK1, &wd2_base->wspr);
116         wait_for_command_complete(wd2_base);
117         writel(WD_UNLOCK2, &wd2_base->wspr);
118 }
119
120
121 /*
122  * This function finds the SDRAM size available in the system
123  * based on DMM section configurations
124  * This is needed because the size of memory installed may be
125  * different on different versions of the board
126  */
127 u32 sdram_size(void)
128 {
129         u32 section, i, total_size = 0, size, addr;
130         for (i = 0; i < 4; i++) {
131                 section = __raw_readl(DMM_LISA_MAP_BASE + i*4);
132                 addr = section & DMM_LISA_MAP_SYS_ADDR_MASK;
133                 /* See if the address is valid */
134                 if ((addr >= OMAP44XX_DRAM_ADDR_SPACE_START) &&
135                     (addr < OMAP44XX_DRAM_ADDR_SPACE_END)) {
136                         size    = ((section & DMM_LISA_MAP_SYS_SIZE_MASK) >>
137                                     DMM_LISA_MAP_SYS_SIZE_SHIFT);
138                         size    = 1 << size;
139                         size    *= SZ_16M;
140                         total_size += size;
141                 }
142         }
143         return total_size;
144 }
145
146
147 /*
148  * Routine: dram_init
149  * Description: sets uboots idea of sdram size
150  */
151 int dram_init(void)
152 {
153
154         gd->ram_size = sdram_size();
155
156         return 0;
157 }
158
159 /*
160  * Print board information
161  */
162 int checkboard(void)
163 {
164         puts(sysinfo.board_string);
165         return 0;
166 }
167
168 /*
169 * This function is called by start_armboot. You can reliably use static
170 * data. Any boot-time function that require static data should be
171 * called from here
172 */
173 int arch_cpu_init(void)
174 {
175         return 0;
176 }
177
178 #ifndef CONFIG_SYS_L2CACHE_OFF
179 void v7_outer_cache_enable(void)
180 {
181         set_pl310_ctrl_reg(1);
182 }
183
184 void v7_outer_cache_disable(void)
185 {
186         set_pl310_ctrl_reg(0);
187 }
188 #endif