14c425570SMasahiro Yamada /* 2*40749d5aSMasahiro Yamada * Copyright (C) 2014 Panasonic Corporation 3*40749d5aSMasahiro Yamada * Copyright (C) 2015-2016 Socionext Inc. 4*40749d5aSMasahiro Yamada * Author: Masahiro Yamada <yamada.masahiro@socionext.com> 54c425570SMasahiro Yamada * 64c425570SMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 74c425570SMasahiro Yamada */ 84c425570SMasahiro Yamada 94c425570SMasahiro Yamada #include <common.h> 104c425570SMasahiro Yamada #include <spl.h> 118ea4f49aSMasahiro Yamada #include <libfdt.h> 124c425570SMasahiro Yamada #include <nand.h> 13f6e7f07cSMasahiro Yamada #include <linux/io.h> 144c425570SMasahiro Yamada #include <../drivers/mtd/nand/denali.h> 154c425570SMasahiro Yamada 16fec48163SMasahiro Yamada #include "boot-mode/boot-device.h" 17fec48163SMasahiro Yamada 184c425570SMasahiro Yamada static void nand_denali_wp_disable(void) 194c425570SMasahiro Yamada { 204c425570SMasahiro Yamada #ifdef CONFIG_NAND_DENALI 214c425570SMasahiro Yamada /* 224c425570SMasahiro Yamada * Since the boot rom enables the write protection for NAND boot mode, 234c425570SMasahiro Yamada * it must be disabled somewhere for "nand write", "nand erase", etc. 244c425570SMasahiro Yamada * The workaround is here to not disturb the Denali NAND controller 254c425570SMasahiro Yamada * driver just for a really SoC-specific thing. 264c425570SMasahiro Yamada */ 274c425570SMasahiro Yamada void __iomem *denali_reg = (void __iomem *)CONFIG_SYS_NAND_REGS_BASE; 284c425570SMasahiro Yamada 294c425570SMasahiro Yamada writel(WRITE_PROTECT__FLAG, denali_reg + WRITE_PROTECT); 304c425570SMasahiro Yamada #endif 314c425570SMasahiro Yamada } 324c425570SMasahiro Yamada 33881aa5a7SMasahiro Yamada static int uniphier_set_fdt_file(void) 348ea4f49aSMasahiro Yamada { 358ea4f49aSMasahiro Yamada DECLARE_GLOBAL_DATA_PTR; 36881aa5a7SMasahiro Yamada const char *compat; 37881aa5a7SMasahiro Yamada char dtb_name[256]; 38*40749d5aSMasahiro Yamada int buf_len = sizeof(dtb_name); 398ea4f49aSMasahiro Yamada 404565a74dSMasahiro Yamada if (getenv("fdt_file")) 414565a74dSMasahiro Yamada return 0; /* do nothing if it is already set */ 424565a74dSMasahiro Yamada 43b02e4044SSimon Glass compat = fdt_stringlist_get(gd->fdt_blob, 0, "compatible", 0, NULL); 44b02e4044SSimon Glass if (!compat) 45881aa5a7SMasahiro Yamada return -EINVAL; 46881aa5a7SMasahiro Yamada 47*40749d5aSMasahiro Yamada /* rip off the vendor prefix "socionext," */ 48*40749d5aSMasahiro Yamada compat = strchr(compat, ','); 49*40749d5aSMasahiro Yamada if (!compat) 50881aa5a7SMasahiro Yamada return -EINVAL; 51*40749d5aSMasahiro Yamada compat++; 52881aa5a7SMasahiro Yamada 53*40749d5aSMasahiro Yamada strncpy(dtb_name, compat, buf_len); 54881aa5a7SMasahiro Yamada buf_len -= strlen(compat); 55881aa5a7SMasahiro Yamada 56881aa5a7SMasahiro Yamada strncat(dtb_name, ".dtb", buf_len); 57881aa5a7SMasahiro Yamada 5880630dadSMasahiro Yamada return setenv("fdt_file", dtb_name); 598ea4f49aSMasahiro Yamada } 608ea4f49aSMasahiro Yamada 614c425570SMasahiro Yamada int board_late_init(void) 624c425570SMasahiro Yamada { 634c425570SMasahiro Yamada puts("MODE: "); 644c425570SMasahiro Yamada 65fec48163SMasahiro Yamada switch (spl_boot_device_raw()) { 664c425570SMasahiro Yamada case BOOT_DEVICE_MMC1: 674c425570SMasahiro Yamada printf("eMMC Boot\n"); 684c425570SMasahiro Yamada setenv("bootmode", "emmcboot"); 694c425570SMasahiro Yamada break; 704c425570SMasahiro Yamada case BOOT_DEVICE_NAND: 714c425570SMasahiro Yamada printf("NAND Boot\n"); 724c425570SMasahiro Yamada setenv("bootmode", "nandboot"); 734c425570SMasahiro Yamada nand_denali_wp_disable(); 744c425570SMasahiro Yamada break; 754c425570SMasahiro Yamada case BOOT_DEVICE_NOR: 764c425570SMasahiro Yamada printf("NOR Boot\n"); 774c425570SMasahiro Yamada setenv("bootmode", "norboot"); 784c425570SMasahiro Yamada break; 79fec48163SMasahiro Yamada case BOOT_DEVICE_USB: 80fec48163SMasahiro Yamada printf("USB Boot\n"); 81fec48163SMasahiro Yamada setenv("bootmode", "usbboot"); 82fec48163SMasahiro Yamada break; 834c425570SMasahiro Yamada default: 84d90b9745SMasahiro Yamada printf("Unknown\n"); 85d90b9745SMasahiro Yamada break; 864c425570SMasahiro Yamada } 874c425570SMasahiro Yamada 88881aa5a7SMasahiro Yamada if (uniphier_set_fdt_file()) 89881aa5a7SMasahiro Yamada printf("fdt_file environment was not set correctly\n"); 908ea4f49aSMasahiro Yamada 914c425570SMasahiro Yamada return 0; 924c425570SMasahiro Yamada } 93