uboot/arch/arm/mach-omap2/hwinit-common.c
<<
>>
Prefs
   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/system.h>
  22
  23DECLARE_GLOBAL_DATA_PTR;
  24
  25void do_set_mux(u32 base, struct pad_conf_entry const *array, int size)
  26{
  27        int i;
  28        struct pad_conf_entry *pad = (struct pad_conf_entry *) array;
  29
  30        for (i = 0; i < size; i++, pad++)
  31                writew(pad->val, base + pad->offset);
  32}
  33
  34static void set_mux_conf_regs(void)
  35{
  36        switch (omap_hw_init_context()) {
  37        case OMAP_INIT_CONTEXT_SPL:
  38                set_muxconf_regs();
  39                break;
  40        case OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL:
  41                break;
  42        case OMAP_INIT_CONTEXT_UBOOT_FROM_NOR:
  43        case OMAP_INIT_CONTEXT_UBOOT_AFTER_CH:
  44                set_muxconf_regs();
  45                break;
  46        }
  47}
  48
  49u32 cortex_rev(void)
  50{
  51
  52        unsigned int rev;
  53
  54        /* Read Main ID Register (MIDR) */
  55        asm ("mrc p15, 0, %0, c0, c0, 0" : "=r" (rev));
  56
  57        return rev;
  58}
  59
  60static void omap_rev_string(void)
  61{
  62        u32 omap_rev = omap_revision();
  63        u32 soc_variant = (omap_rev & 0xF0000000) >> 28;
  64        u32 omap_variant = (omap_rev & 0xFFFF0000) >> 16;
  65        u32 major_rev = (omap_rev & 0x00000F00) >> 8;
  66        u32 minor_rev = (omap_rev & 0x000000F0) >> 4;
  67
  68        const char *sec_s;
  69
  70        switch (get_device_type()) {
  71        case TST_DEVICE:
  72                sec_s = "TST";
  73                break;
  74        case EMU_DEVICE:
  75                sec_s = "EMU";
  76                break;
  77        case HS_DEVICE:
  78                sec_s = "HS";
  79                break;
  80        case GP_DEVICE:
  81                sec_s = "GP";
  82                break;
  83        default:
  84                sec_s = "?";
  85        }
  86
  87        if (soc_variant)
  88                printf("OMAP");
  89        else
  90                printf("DRA");
  91        printf("%x-%s ES%x.%x\n", omap_variant, sec_s, major_rev, minor_rev);
  92}
  93
  94#ifdef CONFIG_SPL_BUILD
  95void spl_display_print(void)
  96{
  97        omap_rev_string();
  98}
  99#endif
 100
 101void __weak srcomp_enable(void)
 102{
 103}
 104
 105/**
 106 * do_board_detect() - Detect board description
 107 *
 108 * Function to detect board description. This is expected to be
 109 * overridden in the SoC family board file where desired.
 110 */
 111void __weak do_board_detect(void)
 112{
 113}
 114
 115/**
 116 * vcores_init() - Assign omap_vcores based on board
 117 *
 118 * Function to pick the vcores based on board. This is expected to be
 119 * overridden in the SoC family board file where desired.
 120 */
 121void __weak vcores_init(void)
 122{
 123}
 124
 125void s_init(void)
 126{
 127}
 128
 129/**
 130 * early_system_init - Does Early system initialization.
 131 *
 132 * Does early system init of watchdog, muxing,  andclocks
 133 * Watchdog disable is done always. For the rest what gets done
 134 * depends on the boot mode in which this function is executed when
 135 *   1. SPL running from SRAM
 136 *   2. U-Boot running from FLASH
 137 *   3. U-Boot loaded to SDRAM by SPL
 138 *   4. U-Boot loaded to SDRAM by ROM code using the
 139 *      Configuration Header feature
 140 * Please have a look at the respective functions to see what gets
 141 * done in each of these cases
 142 * This function is called with SRAM stack.
 143 */
 144void early_system_init(void)
 145{
 146        init_omap_revision();
 147        hw_data_init();
 148
 149#ifdef CONFIG_SPL_BUILD
 150        if (warm_reset())
 151                force_emif_self_refresh();
 152#endif
 153        watchdog_init();
 154        set_mux_conf_regs();
 155#ifdef CONFIG_SPL_BUILD
 156        srcomp_enable();
 157        do_io_settings();
 158#endif
 159        setup_early_clocks();
 160        do_board_detect();
 161        vcores_init();
 162        prcm_init();
 163}
 164
 165#ifdef CONFIG_SPL_BUILD
 166void board_init_f(ulong dummy)
 167{
 168        early_system_init();
 169#ifdef CONFIG_BOARD_EARLY_INIT_F
 170        board_early_init_f();
 171#endif
 172        /* For regular u-boot sdram_init() is called from dram_init() */
 173        sdram_init();
 174}
 175#endif
 176
 177int arch_cpu_init_dm(void)
 178{
 179        early_system_init();
 180        return 0;
 181}
 182
 183/*
 184 * Routine: wait_for_command_complete
 185 * Description: Wait for posting to finish on watchdog
 186 */
 187void wait_for_command_complete(struct watchdog *wd_base)
 188{
 189        int pending = 1;
 190        do {
 191                pending = readl(&wd_base->wwps);
 192        } while (pending);
 193}
 194
 195/*
 196 * Routine: watchdog_init
 197 * Description: Shut down watch dogs
 198 */
 199void watchdog_init(void)
 200{
 201        struct watchdog *wd2_base = (struct watchdog *)WDT2_BASE;
 202
 203        writel(WD_UNLOCK1, &wd2_base->wspr);
 204        wait_for_command_complete(wd2_base);
 205        writel(WD_UNLOCK2, &wd2_base->wspr);
 206}
 207
 208
 209/*
 210 * This function finds the SDRAM size available in the system
 211 * based on DMM section configurations
 212 * This is needed because the size of memory installed may be
 213 * different on different versions of the board
 214 */
 215u32 omap_sdram_size(void)
 216{
 217        u32 section, i, valid;
 218        u64 sdram_start = 0, sdram_end = 0, addr,
 219            size, total_size = 0, trap_size = 0, trap_start = 0;
 220
 221        for (i = 0; i < 4; i++) {
 222                section = __raw_readl(DMM_BASE + i*4);
 223                valid = (section & EMIF_SDRC_ADDRSPC_MASK) >>
 224                        (EMIF_SDRC_ADDRSPC_SHIFT);
 225                addr = section & EMIF_SYS_ADDR_MASK;
 226
 227                /* See if the address is valid */
 228                if ((addr >= TI_ARMV7_DRAM_ADDR_SPACE_START) &&
 229                    (addr < TI_ARMV7_DRAM_ADDR_SPACE_END)) {
 230                        size = ((section & EMIF_SYS_SIZE_MASK) >>
 231                                   EMIF_SYS_SIZE_SHIFT);
 232                        size = 1 << size;
 233                        size *= SZ_16M;
 234
 235                        if (valid != DMM_SDRC_ADDR_SPC_INVALID) {
 236                                if (!sdram_start || (addr < sdram_start))
 237                                        sdram_start = addr;
 238                                if (!sdram_end || ((addr + size) > sdram_end))
 239                                        sdram_end = addr + size;
 240                        } else {
 241                                trap_size = size;
 242                                trap_start = addr;
 243                        }
 244                }
 245        }
 246
 247        if ((trap_start >= sdram_start) && (trap_start < sdram_end))
 248                total_size = (sdram_end - sdram_start) - (trap_size);
 249        else
 250                total_size = sdram_end - sdram_start;
 251
 252        return total_size;
 253}
 254
 255
 256/*
 257 * Routine: dram_init
 258 * Description: sets uboots idea of sdram size
 259 */
 260int dram_init(void)
 261{
 262        sdram_init();
 263        gd->ram_size = omap_sdram_size();
 264        return 0;
 265}
 266
 267/*
 268 * Print board information
 269 */
 270int checkboard(void)
 271{
 272        puts(sysinfo.board_string);
 273        return 0;
 274}
 275
 276/*
 277 *  get_device_type(): tell if GP/HS/EMU/TST
 278 */
 279u32 get_device_type(void)
 280{
 281        return (readl((*ctrl)->control_status) &
 282                                      (DEVICE_TYPE_MASK)) >> DEVICE_TYPE_SHIFT;
 283}
 284
 285#if defined(CONFIG_DISPLAY_CPUINFO)
 286/*
 287 * Print CPU information
 288 */
 289int print_cpuinfo(void)
 290{
 291        puts("CPU  : ");
 292        omap_rev_string();
 293
 294        return 0;
 295}
 296#endif
 297