14c425570SMasahiro Yamada /* 240749d5aSMasahiro Yamada * Copyright (C) 2014 Panasonic Corporation 340749d5aSMasahiro Yamada * Copyright (C) 2015-2016 Socionext Inc. 440749d5aSMasahiro 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> 11*b08c8c48SMasahiro Yamada #include <linux/libfdt.h> 124c425570SMasahiro Yamada #include <nand.h> 13dd74b945SMasahiro Yamada #include <stdio.h> 14f6e7f07cSMasahiro Yamada #include <linux/io.h> 15dd74b945SMasahiro Yamada #include <linux/printk.h> 164c425570SMasahiro Yamada #include <../drivers/mtd/nand/denali.h> 174c425570SMasahiro Yamada 18784548efSMasahiro Yamada #include "init.h" 19fec48163SMasahiro Yamada 204c425570SMasahiro Yamada static void nand_denali_wp_disable(void) 214c425570SMasahiro Yamada { 224c425570SMasahiro Yamada #ifdef CONFIG_NAND_DENALI 234c425570SMasahiro Yamada /* 244c425570SMasahiro Yamada * Since the boot rom enables the write protection for NAND boot mode, 254c425570SMasahiro Yamada * it must be disabled somewhere for "nand write", "nand erase", etc. 264c425570SMasahiro Yamada * The workaround is here to not disturb the Denali NAND controller 274c425570SMasahiro Yamada * driver just for a really SoC-specific thing. 284c425570SMasahiro Yamada */ 294c425570SMasahiro Yamada void __iomem *denali_reg = (void __iomem *)CONFIG_SYS_NAND_REGS_BASE; 304c425570SMasahiro Yamada 314c425570SMasahiro Yamada writel(WRITE_PROTECT__FLAG, denali_reg + WRITE_PROTECT); 324c425570SMasahiro Yamada #endif 334c425570SMasahiro Yamada } 344c425570SMasahiro Yamada 35881aa5a7SMasahiro Yamada static int uniphier_set_fdt_file(void) 368ea4f49aSMasahiro Yamada { 378ea4f49aSMasahiro Yamada DECLARE_GLOBAL_DATA_PTR; 38881aa5a7SMasahiro Yamada const char *compat; 39881aa5a7SMasahiro Yamada char dtb_name[256]; 4040749d5aSMasahiro Yamada int buf_len = sizeof(dtb_name); 418ea4f49aSMasahiro Yamada 4200caae6dSSimon Glass if (env_get("fdt_file")) 434565a74dSMasahiro Yamada return 0; /* do nothing if it is already set */ 444565a74dSMasahiro Yamada 45b02e4044SSimon Glass compat = fdt_stringlist_get(gd->fdt_blob, 0, "compatible", 0, NULL); 46b02e4044SSimon Glass if (!compat) 47881aa5a7SMasahiro Yamada return -EINVAL; 48881aa5a7SMasahiro Yamada 4940749d5aSMasahiro Yamada /* rip off the vendor prefix "socionext," */ 5040749d5aSMasahiro Yamada compat = strchr(compat, ','); 5140749d5aSMasahiro Yamada if (!compat) 52881aa5a7SMasahiro Yamada return -EINVAL; 5340749d5aSMasahiro Yamada compat++; 54881aa5a7SMasahiro Yamada 5540749d5aSMasahiro Yamada strncpy(dtb_name, compat, buf_len); 56881aa5a7SMasahiro Yamada buf_len -= strlen(compat); 57881aa5a7SMasahiro Yamada 58881aa5a7SMasahiro Yamada strncat(dtb_name, ".dtb", buf_len); 59881aa5a7SMasahiro Yamada 60382bee57SSimon Glass return env_set("fdt_file", dtb_name); 618ea4f49aSMasahiro Yamada } 628ea4f49aSMasahiro Yamada 634c425570SMasahiro Yamada int board_late_init(void) 644c425570SMasahiro Yamada { 654c425570SMasahiro Yamada puts("MODE: "); 664c425570SMasahiro Yamada 67784548efSMasahiro Yamada switch (uniphier_boot_device_raw()) { 684c425570SMasahiro Yamada case BOOT_DEVICE_MMC1: 6963754842SMasahiro Yamada printf("eMMC Boot"); 70382bee57SSimon Glass env_set("bootmode", "emmcboot"); 714c425570SMasahiro Yamada break; 724c425570SMasahiro Yamada case BOOT_DEVICE_NAND: 7363754842SMasahiro Yamada printf("NAND Boot"); 74382bee57SSimon Glass env_set("bootmode", "nandboot"); 754c425570SMasahiro Yamada nand_denali_wp_disable(); 764c425570SMasahiro Yamada break; 774c425570SMasahiro Yamada case BOOT_DEVICE_NOR: 7863754842SMasahiro Yamada printf("NOR Boot"); 79382bee57SSimon Glass env_set("bootmode", "norboot"); 804c425570SMasahiro Yamada break; 81fec48163SMasahiro Yamada case BOOT_DEVICE_USB: 8263754842SMasahiro Yamada printf("USB Boot"); 83382bee57SSimon Glass env_set("bootmode", "usbboot"); 84fec48163SMasahiro Yamada break; 854c425570SMasahiro Yamada default: 8663754842SMasahiro Yamada printf("Unknown"); 87d90b9745SMasahiro Yamada break; 884c425570SMasahiro Yamada } 894c425570SMasahiro Yamada 9063754842SMasahiro Yamada if (uniphier_have_internal_stm()) 9163754842SMasahiro Yamada printf(" (STM: %s)", 9263754842SMasahiro Yamada uniphier_boot_from_backend() ? "OFF" : "ON"); 9363754842SMasahiro Yamada 9463754842SMasahiro Yamada printf("\n"); 9563754842SMasahiro Yamada 96881aa5a7SMasahiro Yamada if (uniphier_set_fdt_file()) 97dd74b945SMasahiro Yamada pr_warn("fdt_file environment was not set correctly\n"); 988ea4f49aSMasahiro Yamada 994c425570SMasahiro Yamada return 0; 1004c425570SMasahiro Yamada } 101