xref: /OK3568_Linux_fs/u-boot/arch/arm/mach-uniphier/board_late_init.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2014      Panasonic Corporation
3*4882a593Smuzhiyun  * Copyright (C) 2015-2016 Socionext Inc.
4*4882a593Smuzhiyun  *   Author: Masahiro Yamada <yamada.masahiro@socionext.com>
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <common.h>
10*4882a593Smuzhiyun #include <spl.h>
11*4882a593Smuzhiyun #include <linux/libfdt.h>
12*4882a593Smuzhiyun #include <nand.h>
13*4882a593Smuzhiyun #include <linux/io.h>
14*4882a593Smuzhiyun #include <linux/printk.h>
15*4882a593Smuzhiyun #include <../drivers/mtd/nand/raw/denali.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include "init.h"
18*4882a593Smuzhiyun 
nand_denali_wp_disable(void)19*4882a593Smuzhiyun static void nand_denali_wp_disable(void)
20*4882a593Smuzhiyun {
21*4882a593Smuzhiyun #ifdef CONFIG_NAND_DENALI
22*4882a593Smuzhiyun 	/*
23*4882a593Smuzhiyun 	 * Since the boot rom enables the write protection for NAND boot mode,
24*4882a593Smuzhiyun 	 * it must be disabled somewhere for "nand write", "nand erase", etc.
25*4882a593Smuzhiyun 	 * The workaround is here to not disturb the Denali NAND controller
26*4882a593Smuzhiyun 	 * driver just for a really SoC-specific thing.
27*4882a593Smuzhiyun 	 */
28*4882a593Smuzhiyun 	void __iomem *denali_reg = (void __iomem *)CONFIG_SYS_NAND_REGS_BASE;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 	writel(WRITE_PROTECT__FLAG, denali_reg + WRITE_PROTECT);
31*4882a593Smuzhiyun #endif
32*4882a593Smuzhiyun }
33*4882a593Smuzhiyun 
uniphier_set_fdt_file(void)34*4882a593Smuzhiyun static int uniphier_set_fdt_file(void)
35*4882a593Smuzhiyun {
36*4882a593Smuzhiyun 	DECLARE_GLOBAL_DATA_PTR;
37*4882a593Smuzhiyun 	const char *compat;
38*4882a593Smuzhiyun 	char dtb_name[256];
39*4882a593Smuzhiyun 	int buf_len = sizeof(dtb_name);
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun 	if (env_get("fdt_file"))
42*4882a593Smuzhiyun 		return 0;	/* do nothing if it is already set */
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 	compat = fdt_stringlist_get(gd->fdt_blob, 0, "compatible", 0, NULL);
45*4882a593Smuzhiyun 	if (!compat)
46*4882a593Smuzhiyun 		return -EINVAL;
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	/* rip off the vendor prefix "socionext,"  */
49*4882a593Smuzhiyun 	compat = strchr(compat, ',');
50*4882a593Smuzhiyun 	if (!compat)
51*4882a593Smuzhiyun 		return -EINVAL;
52*4882a593Smuzhiyun 	compat++;
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 	strncpy(dtb_name, compat, buf_len);
55*4882a593Smuzhiyun 	buf_len -= strlen(compat);
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	strncat(dtb_name, ".dtb", buf_len);
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 	return env_set("fdt_file", dtb_name);
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun 
board_late_init(void)62*4882a593Smuzhiyun int board_late_init(void)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun 	puts("MODE:  ");
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	switch (uniphier_boot_device_raw()) {
67*4882a593Smuzhiyun 	case BOOT_DEVICE_MMC1:
68*4882a593Smuzhiyun 		printf("eMMC Boot");
69*4882a593Smuzhiyun 		env_set("bootmode", "emmcboot");
70*4882a593Smuzhiyun 		break;
71*4882a593Smuzhiyun 	case BOOT_DEVICE_NAND:
72*4882a593Smuzhiyun 		printf("NAND Boot");
73*4882a593Smuzhiyun 		env_set("bootmode", "nandboot");
74*4882a593Smuzhiyun 		nand_denali_wp_disable();
75*4882a593Smuzhiyun 		break;
76*4882a593Smuzhiyun 	case BOOT_DEVICE_NOR:
77*4882a593Smuzhiyun 		printf("NOR Boot");
78*4882a593Smuzhiyun 		env_set("bootmode", "norboot");
79*4882a593Smuzhiyun 		break;
80*4882a593Smuzhiyun 	case BOOT_DEVICE_USB:
81*4882a593Smuzhiyun 		printf("USB Boot");
82*4882a593Smuzhiyun 		env_set("bootmode", "usbboot");
83*4882a593Smuzhiyun 		break;
84*4882a593Smuzhiyun 	default:
85*4882a593Smuzhiyun 		printf("Unknown");
86*4882a593Smuzhiyun 		break;
87*4882a593Smuzhiyun 	}
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun 	if (uniphier_have_internal_stm())
90*4882a593Smuzhiyun 		printf(" (STM: %s)",
91*4882a593Smuzhiyun 		       uniphier_boot_from_backend() ? "OFF" : "ON");
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 	printf("\n");
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun 	if (uniphier_set_fdt_file())
96*4882a593Smuzhiyun 		printf("fdt_file environment was not set correctly\n");
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	return 0;
99*4882a593Smuzhiyun }
100