xref: /rk3399_rockchip-uboot/arch/arm/mach-at91/spl.c (revision b7b24a7a3cd74bb165d28a2959ed9143e3648fbf)
162011840SMasahiro Yamada /*
262011840SMasahiro Yamada  * Copyright (C) 2013 Atmel Corporation
362011840SMasahiro Yamada  *		      Bo Shen <voice.shen@atmel.com>
462011840SMasahiro Yamada  *
562011840SMasahiro Yamada  * SPDX-License-Identifier:	GPL-2.0+
662011840SMasahiro Yamada  */
762011840SMasahiro Yamada 
862011840SMasahiro Yamada #include <common.h>
962011840SMasahiro Yamada #include <asm/io.h>
1062011840SMasahiro Yamada #include <asm/arch/at91_common.h>
1162011840SMasahiro Yamada #include <asm/arch/at91_wdt.h>
1262011840SMasahiro Yamada #include <asm/arch/clk.h>
1362011840SMasahiro Yamada #include <spl.h>
1462011840SMasahiro Yamada 
1562011840SMasahiro Yamada #if defined(CONFIG_AT91SAM9_WATCHDOG)
at91_disable_wdt(void)1662011840SMasahiro Yamada void at91_disable_wdt(void) { }
1762011840SMasahiro Yamada #else
at91_disable_wdt(void)1862011840SMasahiro Yamada void at91_disable_wdt(void)
1962011840SMasahiro Yamada {
2062011840SMasahiro Yamada 	struct at91_wdt *wdt = (struct at91_wdt *)ATMEL_BASE_WDT;
2162011840SMasahiro Yamada 
2262011840SMasahiro Yamada 	writel(AT91_WDT_MR_WDDIS, &wdt->mr);
2362011840SMasahiro Yamada }
2462011840SMasahiro Yamada #endif
2562011840SMasahiro Yamada 
261c24f13fSMarek Vasut #if defined(CONFIG_SAMA5D2) || defined(CONFIG_SAMA5D3) || \
271c24f13fSMarek Vasut     defined(CONFIG_SAMA5D4)
281c24f13fSMarek Vasut #include <asm/arch/sama5_boot.h>
29bb0c63a5SMarek Vasut struct {
30bb0c63a5SMarek Vasut 	u32	r4;
31bb0c63a5SMarek Vasut } bootrom_stash __attribute__((section(".data")));
32bb0c63a5SMarek Vasut 
spl_boot_device(void)33bb0c63a5SMarek Vasut u32 spl_boot_device(void)
34bb0c63a5SMarek Vasut {
351c24f13fSMarek Vasut 	u32 dev = (bootrom_stash.r4 >> ATMEL_SAMA5_BOOT_FROM_OFF) &
361c24f13fSMarek Vasut 		  ATMEL_SAMA5_BOOT_FROM_MASK;
371c24f13fSMarek Vasut 	u32 off = (bootrom_stash.r4 >> ATMEL_SAMA5_BOOT_DEV_ID_OFF) &
381c24f13fSMarek Vasut 		  ATMEL_SAMA5_BOOT_DEV_ID_MASK;
39bb0c63a5SMarek Vasut 
40bb0c63a5SMarek Vasut #if defined(CONFIG_SYS_USE_MMC)
411c24f13fSMarek Vasut 	if (dev == ATMEL_SAMA5_BOOT_FROM_MCI) {
42*c00d7c33SWenyou Yang #if defined(CONFIG_SPL_OF_CONTROL)
43*c00d7c33SWenyou Yang 		return BOOT_DEVICE_MMC1;
44*c00d7c33SWenyou Yang #else
45bb0c63a5SMarek Vasut 		if (off == 0)
46bb0c63a5SMarek Vasut 			return BOOT_DEVICE_MMC1;
47bb0c63a5SMarek Vasut 		if (off == 1)
48bb0c63a5SMarek Vasut 			return BOOT_DEVICE_MMC2;
49bb0c63a5SMarek Vasut 		printf("ERROR: MMC controller %i not present!\n", dev);
50bb0c63a5SMarek Vasut 		hang();
51*c00d7c33SWenyou Yang #endif
52bb0c63a5SMarek Vasut 	}
53bb0c63a5SMarek Vasut #endif
54bb0c63a5SMarek Vasut 
55bb0c63a5SMarek Vasut #if defined(CONFIG_SYS_USE_SERIALFLASH) || defined(CONFIG_SYS_USE_SPIFLASH)
561c24f13fSMarek Vasut 	if (dev == ATMEL_SAMA5_BOOT_FROM_SPI)
57bb0c63a5SMarek Vasut 		return BOOT_DEVICE_SPI;
58bb0c63a5SMarek Vasut #endif
59bb0c63a5SMarek Vasut 
60*c00d7c33SWenyou Yang 	if (dev == ATMEL_SAMA5_BOOT_FROM_SMC)
61*c00d7c33SWenyou Yang 		return BOOT_DEVICE_NAND;
62*c00d7c33SWenyou Yang 
631c24f13fSMarek Vasut 	if (dev == ATMEL_SAMA5_BOOT_FROM_SAMBA)
641c24f13fSMarek Vasut 		return BOOT_DEVICE_USB;
651c24f13fSMarek Vasut 
66bb0c63a5SMarek Vasut 	printf("ERROR: SMC/TWI/QSPI boot device not supported!\n"
67bb0c63a5SMarek Vasut 	       "       Boot device %i, controller number %i\n", dev, off);
68bb0c63a5SMarek Vasut 
69bb0c63a5SMarek Vasut 	return BOOT_DEVICE_NONE;
70bb0c63a5SMarek Vasut }
71bb0c63a5SMarek Vasut #else
spl_boot_device(void)7262011840SMasahiro Yamada u32 spl_boot_device(void)
7362011840SMasahiro Yamada {
7462011840SMasahiro Yamada #ifdef CONFIG_SYS_USE_MMC
7562011840SMasahiro Yamada 	return BOOT_DEVICE_MMC1;
7662011840SMasahiro Yamada #elif CONFIG_SYS_USE_NANDFLASH
7762011840SMasahiro Yamada 	return BOOT_DEVICE_NAND;
78d85e8914SBo Shen #elif CONFIG_SYS_USE_SERIALFLASH || CONFIG_SYS_USE_SPIFLASH
7962011840SMasahiro Yamada 	return BOOT_DEVICE_SPI;
8062011840SMasahiro Yamada #endif
8162011840SMasahiro Yamada 	return BOOT_DEVICE_NONE;
8262011840SMasahiro Yamada }
83bb0c63a5SMarek Vasut #endif
8462011840SMasahiro Yamada 
spl_boot_mode(const u32 boot_device)852b1cdafaSMarek Vasut u32 spl_boot_mode(const u32 boot_device)
8662011840SMasahiro Yamada {
87968ebdf1SMarek Vasut 	switch (boot_device) {
8862011840SMasahiro Yamada #ifdef CONFIG_SYS_USE_MMC
8962011840SMasahiro Yamada 	case BOOT_DEVICE_MMC1:
90bb0c63a5SMarek Vasut 	case BOOT_DEVICE_MMC2:
9162011840SMasahiro Yamada 		return MMCSD_MODE_FS;
9262011840SMasahiro Yamada 		break;
9362011840SMasahiro Yamada #endif
9462011840SMasahiro Yamada 	case BOOT_DEVICE_NONE:
9562011840SMasahiro Yamada 	default:
9662011840SMasahiro Yamada 		hang();
9762011840SMasahiro Yamada 	}
9862011840SMasahiro Yamada }
99