14c425570SMasahiro Yamada /*
2*f6e7f07cSMasahiro Yamada  * Copyright (C) 2014-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
34c425570SMasahiro Yamada  *
44c425570SMasahiro Yamada  * SPDX-License-Identifier:	GPL-2.0+
54c425570SMasahiro Yamada  */
64c425570SMasahiro Yamada 
74c425570SMasahiro Yamada #include <common.h>
84c425570SMasahiro Yamada #include <spl.h>
94c425570SMasahiro Yamada #include <nand.h>
10*f6e7f07cSMasahiro Yamada #include <linux/io.h>
114c425570SMasahiro Yamada #include <../drivers/mtd/nand/denali.h>
124c425570SMasahiro Yamada 
134c425570SMasahiro Yamada static void nand_denali_wp_disable(void)
144c425570SMasahiro Yamada {
154c425570SMasahiro Yamada #ifdef CONFIG_NAND_DENALI
164c425570SMasahiro Yamada 	/*
174c425570SMasahiro Yamada 	 * Since the boot rom enables the write protection for NAND boot mode,
184c425570SMasahiro Yamada 	 * it must be disabled somewhere for "nand write", "nand erase", etc.
194c425570SMasahiro Yamada 	 * The workaround is here to not disturb the Denali NAND controller
204c425570SMasahiro Yamada 	 * driver just for a really SoC-specific thing.
214c425570SMasahiro Yamada 	 */
224c425570SMasahiro Yamada 	void __iomem *denali_reg = (void __iomem *)CONFIG_SYS_NAND_REGS_BASE;
234c425570SMasahiro Yamada 
244c425570SMasahiro Yamada 	writel(WRITE_PROTECT__FLAG, denali_reg + WRITE_PROTECT);
254c425570SMasahiro Yamada #endif
264c425570SMasahiro Yamada }
274c425570SMasahiro Yamada 
284c425570SMasahiro Yamada int board_late_init(void)
294c425570SMasahiro Yamada {
304c425570SMasahiro Yamada 	puts("MODE:  ");
314c425570SMasahiro Yamada 
324c425570SMasahiro Yamada 	switch (spl_boot_device()) {
334c425570SMasahiro Yamada 	case BOOT_DEVICE_MMC1:
344c425570SMasahiro Yamada 		printf("eMMC Boot\n");
354c425570SMasahiro Yamada 		setenv("bootmode", "emmcboot");
364c425570SMasahiro Yamada 		break;
374c425570SMasahiro Yamada 	case BOOT_DEVICE_NAND:
384c425570SMasahiro Yamada 		printf("NAND Boot\n");
394c425570SMasahiro Yamada 		setenv("bootmode", "nandboot");
404c425570SMasahiro Yamada 		nand_denali_wp_disable();
414c425570SMasahiro Yamada 		break;
424c425570SMasahiro Yamada 	case BOOT_DEVICE_NOR:
434c425570SMasahiro Yamada 		printf("NOR Boot\n");
444c425570SMasahiro Yamada 		setenv("bootmode", "norboot");
454c425570SMasahiro Yamada 		break;
464c425570SMasahiro Yamada 	default:
474c425570SMasahiro Yamada 		printf("Unsupported Boot Mode\n");
484c425570SMasahiro Yamada 		return -1;
494c425570SMasahiro Yamada 	}
504c425570SMasahiro Yamada 
514c425570SMasahiro Yamada 	return 0;
524c425570SMasahiro Yamada }
53