2 * Copyright (C) 2012-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
4 * SPDX-License-Identifier: GPL-2.0+
9 #include <mach/board.h>
11 #define MICRO_SUPPORT_CARD_RESET \
12 ((CONFIG_SUPPORT_CARD_BASE) + 0x000D0034)
13 #define MICRO_SUPPORT_CARD_REVISION \
14 ((CONFIG_SUPPORT_CARD_BASE) + 0x000D00E0)
16 * 0: reset deassert, 1: reset
18 * bit[0]: LAN, I2C, LED
21 void support_card_reset_deassert(void)
23 writel(0, MICRO_SUPPORT_CARD_RESET);
26 void support_card_reset(void)
28 writel(3, MICRO_SUPPORT_CARD_RESET);
31 static int support_card_show_revision(void)
35 revision = readl(MICRO_SUPPORT_CARD_REVISION);
36 printf("(CPLD version %d.%d)\n", revision >> 4, revision & 0xf);
40 int check_support_card(void)
42 printf("SC: Micro Support Card ");
43 return support_card_show_revision();
46 void support_card_init(void)
49 * After power on, we need to keep the LAN controller in reset state
50 * for a while. (200 usec)
51 * Fortunately, enough wait time is already inserted in pll_init()
52 * function. So we do not have to wait here.
54 support_card_reset_deassert();
57 #if defined(CONFIG_SMC911X)
60 int board_eth_init(bd_t *bis)
62 return smc911x_initialize(0, CONFIG_SMC911X_BASE);
66 #if !defined(CONFIG_SYS_NO_FLASH)
68 #include <mtd/cfi_flash.h>
69 #include <mach/sbc-regs.h>
76 static int mem_is_flash(const struct memory_bank *mem)
84 /* just in case, use the tail of the memory bank */
85 scratch_addr = map_physmem(mem->base + mem->size - sizeof(u32) * loop,
86 sizeof(u32) * loop, MAP_NOCACHE);
88 for (i = 0; i < loop; i++, scratch_addr++) {
89 saved_value = readl(scratch_addr);
90 writel(~saved_value, scratch_addr);
91 if (readl(scratch_addr) != saved_value) {
92 /* We assume no memory or SRAM here. */
93 writel(saved_value, scratch_addr);
99 unmap_physmem(scratch_addr, MAP_NOCACHE);
104 /* {address, size} */
105 static const struct memory_bank memory_banks[] = {
106 {0x42000000, 0x01f00000},
109 static const struct memory_bank
110 *flash_banks_list[CONFIG_SYS_MAX_FLASH_BANKS_DETECT];
112 phys_addr_t cfi_flash_bank_addr(int i)
114 return flash_banks_list[i]->base;
117 unsigned long cfi_flash_bank_size(int i)
119 return flash_banks_list[i]->size;
122 static void detect_num_flash_banks(void)
124 const struct memory_bank *memory_bank, *end;
126 cfi_flash_num_flash_banks = 0;
128 memory_bank = memory_banks;
129 end = memory_bank + ARRAY_SIZE(memory_banks);
131 for (; memory_bank < end; memory_bank++) {
132 if (cfi_flash_num_flash_banks >=
133 CONFIG_SYS_MAX_FLASH_BANKS_DETECT)
136 if (mem_is_flash(memory_bank)) {
137 flash_banks_list[cfi_flash_num_flash_banks] =
140 debug("flash bank found: base = 0x%lx, size = 0x%lx\n",
141 memory_bank->base, memory_bank->size);
142 cfi_flash_num_flash_banks++;
146 debug("number of flash banks: %d\n", cfi_flash_num_flash_banks);
148 #else /* CONFIG_SYS_NO_FLASH */
149 void detect_num_flash_banks(void)
152 #endif /* CONFIG_SYS_NO_FLASH */
154 void support_card_late_init(void)
156 detect_num_flash_banks();