Home | History | Annotate | Download | only in edb93xx
      1 // SPDX-License-Identifier: GPL-2.0+
      2 /*
      3  * Board initialization for EP93xx
      4  *
      5  * Copyright (C) 2013
      6  * Sergey Kostanbaev <sergey.kostanbaev <at> fairwaves.ru>
      7  *
      8  * Copyright (C) 2009
      9  * Matthias Kaehlcke <matthias <at> kaehlcke.net>
     10  *
     11  * (C) Copyright 2002 2003
     12  * Network Audio Technologies, Inc. <www.netaudiotech.com>
     13  * Adam Bezanson <bezanson <at> netaudiotech.com>
     14  */
     15 
     16 #include <config.h>
     17 #include <common.h>
     18 #include <netdev.h>
     19 #include <asm/io.h>
     20 #include <asm/mach-types.h>
     21 #include <asm/arch/ep93xx.h>
     22 
     23 DECLARE_GLOBAL_DATA_PTR;
     24 
     25 /*
     26  * usb_div: 4, nbyp2: 1, pll2_en: 1
     27  * pll2_x1: 368640000.000000, pll2_x2ip: 15360000.000000,
     28  * pll2_x2: 384000000.000000, pll2_out: 192000000.000000
     29  */
     30 #define CLKSET2_VAL	(23 << SYSCON_CLKSET_PLL_X2IPD_SHIFT |	\
     31 			24 << SYSCON_CLKSET_PLL_X2FBD2_SHIFT |	\
     32 			24 << SYSCON_CLKSET_PLL_X1FBD1_SHIFT |	\
     33 			1 << SYSCON_CLKSET_PLL_PS_SHIFT |	\
     34 			SYSCON_CLKSET2_PLL2_EN |		\
     35 			SYSCON_CLKSET2_NBYP2 |			\
     36 			3 << SYSCON_CLKSET2_USB_DIV_SHIFT)
     37 
     38 #define SMC_BCR6_VALUE	(2 << SMC_BCR_IDCY_SHIFT | 5 << SMC_BCR_WST1_SHIFT | \
     39 			SMC_BCR_BLE | 2 << SMC_BCR_WST2_SHIFT | \
     40 			1 << SMC_BCR_MW_SHIFT)
     41 
     42 /* delay execution before timers are initialized */
     43 static inline void early_udelay(uint32_t usecs)
     44 {
     45 	/* loop takes 4 cycles at 5.0ns (fastest case, running at 200MHz) */
     46 	register uint32_t loops = (usecs * 1000) / 20;
     47 
     48 	__asm__ volatile ("1:\n"
     49 			"subs %0, %1, #1\n"
     50 			"bne 1b" : "=r" (loops) : "0" (loops));
     51 }
     52 
     53 #ifndef CONFIG_EP93XX_NO_FLASH_CFG
     54 static void flash_cfg(void)
     55 {
     56 	struct smc_regs *smc = (struct smc_regs *)SMC_BASE;
     57 
     58 	writel(SMC_BCR6_VALUE, &smc->bcr6);
     59 }
     60 #else
     61 #define flash_cfg()
     62 #endif
     63 
     64 int board_init(void)
     65 {
     66 	/*
     67 	 * Setup PLL2, PPL1 has been set during lowlevel init
     68 	 */
     69 	struct syscon_regs *syscon = (struct syscon_regs *)SYSCON_BASE;
     70 	writel(CLKSET2_VAL, &syscon->clkset2);
     71 
     72 	/*
     73 	 * the user's guide recommends to wait at least 1 ms for PLL2 to
     74 	 * stabilize
     75 	 */
     76 	early_udelay(1000);
     77 
     78 	/* Go to Async mode */
     79 	__asm__ volatile ("mrc p15, 0, r0, c1, c0, 0");
     80 	__asm__ volatile ("orr r0, r0, #0xc0000000");
     81 	__asm__ volatile ("mcr p15, 0, r0, c1, c0, 0");
     82 
     83 	icache_enable();
     84 
     85 #ifdef USE_920T_MMU
     86 	dcache_enable();
     87 #endif
     88 
     89 	/* Machine number, as defined in linux/arch/arm/tools/mach-types */
     90 	gd->bd->bi_arch_number = CONFIG_MACH_TYPE;
     91 
     92 	/* adress of boot parameters */
     93 	gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
     94 
     95 	/* We have a console */
     96 	gd->have_console = 1;
     97 
     98 	enable_interrupts();
     99 
    100 	flash_cfg();
    101 
    102 	green_led_on();
    103 	red_led_off();
    104 
    105 	return 0;
    106 }
    107 
    108 int board_early_init_f(void)
    109 {
    110 	/*
    111 	 * set UARTBAUD bit to drive UARTs with 14.7456MHz instead of
    112 	 * 14.7456/2 MHz
    113 	 */
    114 	struct syscon_regs *syscon = (struct syscon_regs *)SYSCON_BASE;
    115 	writel(SYSCON_PWRCNT_UART_BAUD, &syscon->pwrcnt);
    116 	return 0;
    117 }
    118 
    119 int board_eth_init(bd_t *bd)
    120 {
    121 	return ep93xx_eth_initialize(0, MAC_BASE);
    122 }
    123 
    124 static void dram_fill_bank_addr(unsigned dram_addr_mask, unsigned dram_bank_cnt,
    125 				unsigned dram_bank_base[CONFIG_NR_DRAM_BANKS])
    126 {
    127 	if (dram_bank_cnt == 1) {
    128 		dram_bank_base[0] = PHYS_SDRAM_1;
    129 	} else {
    130 		/* Table lookup for holes in address space. Maximum memory
    131 		 * for the single SDCS may be up to 256Mb. We start scanning
    132 		 * banks from 1Mb, so it could be up to 128 banks theoretically.
    133 		 * We need at maximum 7 bits for the loockup, 8 slots is
    134 		 * enough for the worst case.
    135 		 */
    136 		unsigned tbl[8];
    137 		unsigned i = dram_bank_cnt / 2;
    138 		unsigned j = 0x00100000; /* 1 Mb */
    139 		unsigned *ptbl = tbl;
    140 		do {
    141 			while (!(dram_addr_mask & j)) {
    142 				j <<= 1;
    143 			}
    144 			*ptbl++ = j;
    145 			j <<= 1;
    146 			i >>= 1;
    147 		} while (i != 0);
    148 
    149 		for (i = dram_bank_cnt, j = 0;
    150 		     (i != 0) && (j < CONFIG_NR_DRAM_BANKS); --i, ++j) {
    151 			unsigned addr = PHYS_SDRAM_1;
    152 			unsigned k;
    153 			unsigned bit;
    154 
    155 			for (k = 0, bit = 1; k < 8; k++, bit <<= 1) {
    156 				if (bit & j)
    157 					addr |= tbl[k];
    158 			}
    159 
    160 			dram_bank_base[j] = addr;
    161 		}
    162 	}
    163 }
    164 
    165 /* called in board_init_f (before relocation) */
    166 static unsigned dram_init_banksize_int(int print)
    167 {
    168 	/*
    169 	 * Collect information of banks that has been filled during lowlevel
    170 	 * initialization
    171 	 */
    172 	unsigned i;
    173 	unsigned dram_bank_base[CONFIG_NR_DRAM_BANKS];
    174 	unsigned dram_total = 0;
    175 	unsigned dram_bank_size = *(unsigned *)
    176 				  (PHYS_SDRAM_1 | UBOOT_MEMORYCNF_BANK_SIZE);
    177 	unsigned dram_addr_mask = *(unsigned *)
    178 				  (PHYS_SDRAM_1 | UBOOT_MEMORYCNF_BANK_MASK);
    179 	unsigned dram_bank_cnt = *(unsigned *)
    180 				 (PHYS_SDRAM_1 | UBOOT_MEMORYCNF_BANK_COUNT);
    181 
    182 	dram_fill_bank_addr(dram_addr_mask, dram_bank_cnt, dram_bank_base);
    183 
    184 	for (i = 0; i < dram_bank_cnt; i++) {
    185 		gd->bd->bi_dram[i].start = dram_bank_base[i];
    186 		gd->bd->bi_dram[i].size = dram_bank_size;
    187 		dram_total += dram_bank_size;
    188 	}
    189 	for (; i < CONFIG_NR_DRAM_BANKS; i++) {
    190 		gd->bd->bi_dram[i].start = 0;
    191 		gd->bd->bi_dram[i].size = 0;
    192 	}
    193 
    194 	if (print) {
    195 		printf("DRAM mask: %08x\n", dram_addr_mask);
    196 		printf("DRAM total %u banks:\n", dram_bank_cnt);
    197 		printf("bank          base-address          size\n");
    198 
    199 		if (dram_bank_cnt > CONFIG_NR_DRAM_BANKS) {
    200 			printf("WARNING! UBoot was configured for %u banks,\n"
    201 				"but %u has been found. "
    202 				"Supressing extra memory banks\n",
    203 				 CONFIG_NR_DRAM_BANKS, dram_bank_cnt);
    204 			dram_bank_cnt = CONFIG_NR_DRAM_BANKS;
    205 		}
    206 
    207 		for (i = 0; i < dram_bank_cnt; i++) {
    208 			printf("  %u             %08x            %08x\n",
    209 			       i, dram_bank_base[i], dram_bank_size);
    210 		}
    211 		printf("  ------------------------------------------\n"
    212 			"Total                              %9d\n\n",
    213 			dram_total);
    214 	}
    215 
    216 	return dram_total;
    217 }
    218 
    219 int dram_init_banksize(void)
    220 {
    221 	dram_init_banksize_int(0);
    222 
    223 	return 0;
    224 }
    225 
    226 /* called in board_init_f (before relocation) */
    227 int dram_init(void)
    228 {
    229 	struct syscon_regs *syscon = (struct syscon_regs *)SYSCON_BASE;
    230 	unsigned sec_id = readl(SECURITY_EXTENSIONID);
    231 	unsigned chip_id = readl(&syscon->chipid);
    232 
    233 	printf("CPU: Cirrus Logic ");
    234 	switch (sec_id & 0x000001FE) {
    235 	case 0x00000008:
    236 		printf("EP9301");
    237 		break;
    238 	case 0x00000004:
    239 		printf("EP9307");
    240 		break;
    241 	case 0x00000002:
    242 		printf("EP931x");
    243 		break;
    244 	case 0x00000000:
    245 		printf("EP9315");
    246 		break;
    247 	default:
    248 		printf("<unknown>");
    249 		break;
    250 	}
    251 
    252 	printf(" - Rev. ");
    253 	switch (chip_id & 0xF0000000) {
    254 	case 0x00000000:
    255 		printf("A");
    256 		break;
    257 	case 0x10000000:
    258 		printf("B");
    259 		break;
    260 	case 0x20000000:
    261 		printf("C");
    262 		break;
    263 	case 0x30000000:
    264 		printf("D0");
    265 		break;
    266 	case 0x40000000:
    267 		printf("D1");
    268 		break;
    269 	case 0x50000000:
    270 		printf("E0");
    271 		break;
    272 	case 0x60000000:
    273 		printf("E1");
    274 		break;
    275 	case 0x70000000:
    276 		printf("E2");
    277 		break;
    278 	default:
    279 		printf("?");
    280 		break;
    281 	}
    282 	printf(" (SecExtID=%.8x/ChipID=%.8x)\n", sec_id, chip_id);
    283 
    284 	gd->ram_size = dram_init_banksize_int(1);
    285 	return 0;
    286 }
    287