diff options
Diffstat (limited to 'board/synopsys/iot_devkit/iot_devkit.c')
-rw-r--r-- | board/synopsys/iot_devkit/iot_devkit.c | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/board/synopsys/iot_devkit/iot_devkit.c b/board/synopsys/iot_devkit/iot_devkit.c index c185d5cdb5c..f8838fb3ce8 100644 --- a/board/synopsys/iot_devkit/iot_devkit.c +++ b/board/synopsys/iot_devkit/iot_devkit.c @@ -17,6 +17,7 @@ DECLARE_GLOBAL_DATA_PTR; #define AHBCKDIV (void *)(SYSCON_BASE + 0x04) #define APBCKDIV (void *)(SYSCON_BASE + 0x08) #define APBCKEN (void *)(SYSCON_BASE + 0x0C) +#define RESET_REG (void *)(SYSCON_BASE + 0x18) #define CLKSEL (void *)(SYSCON_BASE + 0x24) #define CLKSTAT (void *)(SYSCON_BASE + 0x28) #define PLLCON (void *)(SYSCON_BASE + 0x2C) @@ -67,6 +68,14 @@ static int set_cpu_freq(unsigned int clk) writel((readl(PLLCON) & PLL_MASK_2) | 0x200191, PLLCON); break; + case 136: + writel(readl(PLLCON) & PLL_MASK_0, PLLCON); + /* pll_off=1, M=17, N=1, OD=1, PLL_OUT_CLK=136M */ + writel((readl(PLLCON) & PLL_MASK_1) | 0x100111, PLLCON); + /* pll_off=0, M=17, N=1, OD=1, PLL_OUT_CLK=136M */ + writel((readl(PLLCON) & PLL_MASK_2) | 0x100111, PLLCON); + break; + case 144: writel(readl(PLLCON) & PLL_MASK_0, PLLCON); /* pll_off=1, M=18, N=1, OD=1, PLL_OUT_CLK=144M */ @@ -99,7 +108,7 @@ extern u8 __ram_end[]; */ int mach_cpu_init(void) { - int offset, freq; + int offset; /* Don't relocate U-Boot */ gd->flags |= GD_FLG_SKIP_RELOC; @@ -120,12 +129,12 @@ int mach_cpu_init(void) if (offset < 0) return offset; - freq = fdtdec_get_int(gd->fdt_blob, offset, "clock-frequency", 0); - if (!freq) + gd->cpu_clk = fdtdec_get_int(gd->fdt_blob, offset, "clock-frequency", 0); + if (!gd->cpu_clk) return -EINVAL; /* If CPU freq > 100 MHz, divide eFLASH clock by 2 */ - if (freq > 100000000) { + if (gd->cpu_clk > 100000000) { u32 reg = readl(AHBCKDIV); reg &= ~(0xF << 8); @@ -133,7 +142,7 @@ int mach_cpu_init(void) writel(reg, AHBCKDIV); } - return set_cpu_freq(freq); + return set_cpu_freq(gd->cpu_clk); } #define ARC_PERIPHERAL_BASE 0xF0000000 @@ -161,8 +170,32 @@ int board_mmc_init(bd_t *bis) return 0; } +int board_mmc_getcd(struct mmc *mmc) +{ + struct dwmci_host *host = mmc->priv; + + return !(dwmci_readl(host, DWMCI_CDETECT) & 1); +} + +#define IOTDK_RESET_SEQ 0x55AA6699 + +void reset_cpu(ulong addr) +{ + writel(IOTDK_RESET_SEQ, RESET_REG); +} + int checkboard(void) { puts("Board: Synopsys IoT Development Kit\n"); return 0; }; + +#ifdef CONFIG_DISPLAY_CPUINFO +int print_cpuinfo(void) +{ + char mhz[8]; + + printf("CPU: ARC EM9D at %s MHz\n", strmhz(mhz, gd->cpu_clk)); + return 0; +} +#endif /* CONFIG_DISPLAY_CPUINFO */ |