1 /*
2  * Copyright (C) 2014-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
3  *
4  * SPDX-License-Identifier:	GPL-2.0+
5  */
6 
7 #include <common.h>
8 #include <spl.h>
9 #include <nand.h>
10 #include <linux/io.h>
11 #include <../drivers/mtd/nand/denali.h>
12 
13 static void nand_denali_wp_disable(void)
14 {
15 #ifdef CONFIG_NAND_DENALI
16 	/*
17 	 * Since the boot rom enables the write protection for NAND boot mode,
18 	 * it must be disabled somewhere for "nand write", "nand erase", etc.
19 	 * The workaround is here to not disturb the Denali NAND controller
20 	 * driver just for a really SoC-specific thing.
21 	 */
22 	void __iomem *denali_reg = (void __iomem *)CONFIG_SYS_NAND_REGS_BASE;
23 
24 	writel(WRITE_PROTECT__FLAG, denali_reg + WRITE_PROTECT);
25 #endif
26 }
27 
28 int board_late_init(void)
29 {
30 	puts("MODE:  ");
31 
32 	switch (spl_boot_device()) {
33 	case BOOT_DEVICE_MMC1:
34 		printf("eMMC Boot\n");
35 		setenv("bootmode", "emmcboot");
36 		break;
37 	case BOOT_DEVICE_NAND:
38 		printf("NAND Boot\n");
39 		setenv("bootmode", "nandboot");
40 		nand_denali_wp_disable();
41 		break;
42 	case BOOT_DEVICE_NOR:
43 		printf("NOR Boot\n");
44 		setenv("bootmode", "norboot");
45 		break;
46 	default:
47 		printf("Unsupported Boot Mode\n");
48 		return -1;
49 	}
50 
51 	return 0;
52 }
53