14c425570SMasahiro Yamada /* 2f6e7f07cSMasahiro 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> 98ea4f49aSMasahiro Yamada #include <libfdt.h> 104c425570SMasahiro Yamada #include <nand.h> 11f6e7f07cSMasahiro Yamada #include <linux/io.h> 124c425570SMasahiro Yamada #include <../drivers/mtd/nand/denali.h> 134c425570SMasahiro Yamada 14fec48163SMasahiro Yamada #include "boot-mode/boot-device.h" 15fec48163SMasahiro Yamada 164c425570SMasahiro Yamada static void nand_denali_wp_disable(void) 174c425570SMasahiro Yamada { 184c425570SMasahiro Yamada #ifdef CONFIG_NAND_DENALI 194c425570SMasahiro Yamada /* 204c425570SMasahiro Yamada * Since the boot rom enables the write protection for NAND boot mode, 214c425570SMasahiro Yamada * it must be disabled somewhere for "nand write", "nand erase", etc. 224c425570SMasahiro Yamada * The workaround is here to not disturb the Denali NAND controller 234c425570SMasahiro Yamada * driver just for a really SoC-specific thing. 244c425570SMasahiro Yamada */ 254c425570SMasahiro Yamada void __iomem *denali_reg = (void __iomem *)CONFIG_SYS_NAND_REGS_BASE; 264c425570SMasahiro Yamada 274c425570SMasahiro Yamada writel(WRITE_PROTECT__FLAG, denali_reg + WRITE_PROTECT); 284c425570SMasahiro Yamada #endif 294c425570SMasahiro Yamada } 304c425570SMasahiro Yamada 31881aa5a7SMasahiro Yamada #define VENDOR_PREFIX "socionext," 32881aa5a7SMasahiro Yamada #define DTB_FILE_PREFIX "uniphier-" 338ea4f49aSMasahiro Yamada 34881aa5a7SMasahiro Yamada static int uniphier_set_fdt_file(void) 358ea4f49aSMasahiro Yamada { 368ea4f49aSMasahiro Yamada DECLARE_GLOBAL_DATA_PTR; 37881aa5a7SMasahiro Yamada const char *compat; 38881aa5a7SMasahiro Yamada char dtb_name[256]; 39881aa5a7SMasahiro Yamada int buf_len = 256; 40881aa5a7SMasahiro Yamada int ret; 418ea4f49aSMasahiro Yamada 42881aa5a7SMasahiro Yamada ret = fdt_get_string(gd->fdt_blob, 0, "compatible", &compat); 43881aa5a7SMasahiro Yamada if (ret) 44881aa5a7SMasahiro Yamada return -EINVAL; 45881aa5a7SMasahiro Yamada 46881aa5a7SMasahiro Yamada if (strncmp(compat, VENDOR_PREFIX, strlen(VENDOR_PREFIX))) 47881aa5a7SMasahiro Yamada return -EINVAL; 48881aa5a7SMasahiro Yamada 49881aa5a7SMasahiro Yamada compat += strlen(VENDOR_PREFIX); 50881aa5a7SMasahiro Yamada 51881aa5a7SMasahiro Yamada strncat(dtb_name, DTB_FILE_PREFIX, buf_len); 52881aa5a7SMasahiro Yamada buf_len -= strlen(DTB_FILE_PREFIX); 53881aa5a7SMasahiro Yamada 54881aa5a7SMasahiro Yamada strncat(dtb_name, compat, buf_len); 55881aa5a7SMasahiro Yamada buf_len -= strlen(compat); 56881aa5a7SMasahiro Yamada 57881aa5a7SMasahiro Yamada strncat(dtb_name, ".dtb", buf_len); 58881aa5a7SMasahiro Yamada 59*80630dadSMasahiro Yamada return setenv("fdt_file", dtb_name); 608ea4f49aSMasahiro Yamada } 618ea4f49aSMasahiro Yamada 624c425570SMasahiro Yamada int board_late_init(void) 634c425570SMasahiro Yamada { 644c425570SMasahiro Yamada puts("MODE: "); 654c425570SMasahiro Yamada 66fec48163SMasahiro Yamada switch (spl_boot_device_raw()) { 674c425570SMasahiro Yamada case BOOT_DEVICE_MMC1: 684c425570SMasahiro Yamada printf("eMMC Boot\n"); 694c425570SMasahiro Yamada setenv("bootmode", "emmcboot"); 704c425570SMasahiro Yamada break; 714c425570SMasahiro Yamada case BOOT_DEVICE_NAND: 724c425570SMasahiro Yamada printf("NAND Boot\n"); 734c425570SMasahiro Yamada setenv("bootmode", "nandboot"); 744c425570SMasahiro Yamada nand_denali_wp_disable(); 754c425570SMasahiro Yamada break; 764c425570SMasahiro Yamada case BOOT_DEVICE_NOR: 774c425570SMasahiro Yamada printf("NOR Boot\n"); 784c425570SMasahiro Yamada setenv("bootmode", "norboot"); 794c425570SMasahiro Yamada break; 80fec48163SMasahiro Yamada case BOOT_DEVICE_USB: 81fec48163SMasahiro Yamada printf("USB Boot\n"); 82fec48163SMasahiro Yamada setenv("bootmode", "usbboot"); 83fec48163SMasahiro Yamada break; 844c425570SMasahiro Yamada default: 85d90b9745SMasahiro Yamada printf("Unknown\n"); 86d90b9745SMasahiro Yamada break; 874c425570SMasahiro Yamada } 884c425570SMasahiro Yamada 89881aa5a7SMasahiro Yamada if (uniphier_set_fdt_file()) 90881aa5a7SMasahiro Yamada printf("fdt_file environment was not set correctly\n"); 918ea4f49aSMasahiro Yamada 924c425570SMasahiro Yamada return 0; 934c425570SMasahiro Yamada } 94