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