xref: /openbmc/u-boot/board/renesas/stout/stout.c (revision a3c159b9)
121871138SVladimir Barinov /*
221871138SVladimir Barinov  * board/renesas/stout/stout.c
321871138SVladimir Barinov  *     This file is Stout board support.
421871138SVladimir Barinov  *
521871138SVladimir Barinov  * Copyright (C) 2015 Renesas Electronics Europe GmbH
621871138SVladimir Barinov  * Copyright (C) 2015 Renesas Electronics Corporation
721871138SVladimir Barinov  * Copyright (C) 2015 Cogent Embedded, Inc.
821871138SVladimir Barinov  *
921871138SVladimir Barinov  * SPDX-License-Identifier: GPL-2.0
1021871138SVladimir Barinov  */
1121871138SVladimir Barinov 
1221871138SVladimir Barinov #include <common.h>
1321871138SVladimir Barinov #include <malloc.h>
1421871138SVladimir Barinov #include <netdev.h>
1521871138SVladimir Barinov #include <dm.h>
1621871138SVladimir Barinov #include <dm/platform_data/serial_sh.h>
179925f1dbSAlex Kiernan #include <environment.h>
1821871138SVladimir Barinov #include <asm/processor.h>
1921871138SVladimir Barinov #include <asm/mach-types.h>
2021871138SVladimir Barinov #include <asm/io.h>
211221ce45SMasahiro Yamada #include <linux/errno.h>
2221871138SVladimir Barinov #include <asm/arch/sys_proto.h>
2321871138SVladimir Barinov #include <asm/gpio.h>
2421871138SVladimir Barinov #include <asm/arch/rmobile.h>
2521871138SVladimir Barinov #include <asm/arch/rcar-mstp.h>
2621871138SVladimir Barinov #include <asm/arch/mmc.h>
2721871138SVladimir Barinov #include <asm/arch/sh_sdhi.h>
2821871138SVladimir Barinov #include <miiphy.h>
2921871138SVladimir Barinov #include <i2c.h>
3021871138SVladimir Barinov #include <mmc.h>
3121871138SVladimir Barinov #include "qos.h"
3221871138SVladimir Barinov #include "cpld.h"
3321871138SVladimir Barinov 
3421871138SVladimir Barinov DECLARE_GLOBAL_DATA_PTR;
3521871138SVladimir Barinov 
3621871138SVladimir Barinov #define CLK2MHZ(clk)	(clk / 1000 / 1000)
3721871138SVladimir Barinov void s_init(void)
3821871138SVladimir Barinov {
3921871138SVladimir Barinov 	struct rcar_rwdt *rwdt = (struct rcar_rwdt *)RWDT_BASE;
4021871138SVladimir Barinov 	struct rcar_swdt *swdt = (struct rcar_swdt *)SWDT_BASE;
4121871138SVladimir Barinov 
4221871138SVladimir Barinov 	/* Watchdog init */
4321871138SVladimir Barinov 	writel(0xA5A5A500, &rwdt->rwtcsra);
4421871138SVladimir Barinov 	writel(0xA5A5A500, &swdt->swtcsra);
4521871138SVladimir Barinov 
4621871138SVladimir Barinov 	/* CPU frequency setting. Set to 1.4GHz */
4721871138SVladimir Barinov 	if (rmobile_get_cpu_rev_integer() >= R8A7790_CUT_ES2X) {
4821871138SVladimir Barinov 		u32 stat = 0;
4921871138SVladimir Barinov 		u32 stc = ((1400 / CLK2MHZ(CONFIG_SYS_CLK_FREQ)) - 1)
5021871138SVladimir Barinov 			<< PLL0_STC_BIT;
5121871138SVladimir Barinov 		clrsetbits_le32(PLL0CR, PLL0_STC_MASK, stc);
5221871138SVladimir Barinov 
5321871138SVladimir Barinov 		do {
5421871138SVladimir Barinov 			stat = readl(PLLECR) & PLL0ST;
5521871138SVladimir Barinov 		} while (stat == 0x0);
5621871138SVladimir Barinov 	}
5721871138SVladimir Barinov 
5821871138SVladimir Barinov 	/* QoS(Quality-of-Service) Init */
5921871138SVladimir Barinov 	qos_init();
6021871138SVladimir Barinov }
6121871138SVladimir Barinov 
62ec7113fbSMarek Vasut #define TMU0_MSTP125	BIT(25)
6321871138SVladimir Barinov 
6421871138SVladimir Barinov #define SD2CKCR		0xE6150078
6521871138SVladimir Barinov #define SD2_97500KHZ	0x7
6621871138SVladimir Barinov 
6721871138SVladimir Barinov int board_early_init_f(void)
6821871138SVladimir Barinov {
6921871138SVladimir Barinov 	/* TMU0 */
7021871138SVladimir Barinov 	mstp_clrbits_le32(MSTPSR1, SMSTPCR1, TMU0_MSTP125);
7121871138SVladimir Barinov 
7221871138SVladimir Barinov 	/*
7321871138SVladimir Barinov 	 * SD0 clock is set to 97.5MHz by default.
7421871138SVladimir Barinov 	 * Set SD2 to the 97.5MHz as well.
7521871138SVladimir Barinov 	 */
7621871138SVladimir Barinov 	writel(SD2_97500KHZ, SD2CKCR);
7721871138SVladimir Barinov 
7821871138SVladimir Barinov 	return 0;
7921871138SVladimir Barinov }
8021871138SVladimir Barinov 
81ec7113fbSMarek Vasut #define ETHERNET_PHY_RESET	123	/* GPIO 3 31 */
82ec7113fbSMarek Vasut 
8321871138SVladimir Barinov int board_init(void)
8421871138SVladimir Barinov {
8521871138SVladimir Barinov 	/* adress of boot parameters */
8621871138SVladimir Barinov 	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
8721871138SVladimir Barinov 
8821871138SVladimir Barinov 	cpld_init();
8921871138SVladimir Barinov 
90ec7113fbSMarek Vasut 	/* Force ethernet PHY out of reset */
91ec7113fbSMarek Vasut 	gpio_request(ETHERNET_PHY_RESET, "phy_reset");
92ec7113fbSMarek Vasut 	gpio_direction_output(ETHERNET_PHY_RESET, 0);
9321871138SVladimir Barinov 	mdelay(20);
94ec7113fbSMarek Vasut 	gpio_direction_output(ETHERNET_PHY_RESET, 1);
9521871138SVladimir Barinov 
9621871138SVladimir Barinov 	return 0;
9721871138SVladimir Barinov }
9821871138SVladimir Barinov 
99ec7113fbSMarek Vasut int dram_init(void)
10021871138SVladimir Barinov {
101ec7113fbSMarek Vasut 	if (fdtdec_setup_memory_size() != 0)
102ec7113fbSMarek Vasut 		return -EINVAL;
10321871138SVladimir Barinov 
104ec7113fbSMarek Vasut 	return 0;
105ec7113fbSMarek Vasut }
10621871138SVladimir Barinov 
107ec7113fbSMarek Vasut int dram_init_banksize(void)
108ec7113fbSMarek Vasut {
109ec7113fbSMarek Vasut 	fdtdec_setup_memory_banksize();
11021871138SVladimir Barinov 
111ec7113fbSMarek Vasut 	return 0;
11221871138SVladimir Barinov }
11321871138SVladimir Barinov 
11421871138SVladimir Barinov /* Stout has KSZ8041NL/RNL */
11521871138SVladimir Barinov #define PHY_CONTROL1		0x1E
11621871138SVladimir Barinov #define PHY_LED_MODE		0xC0000
11721871138SVladimir Barinov #define PHY_LED_MODE_ACK	0x4000
11821871138SVladimir Barinov int board_phy_config(struct phy_device *phydev)
11921871138SVladimir Barinov {
12021871138SVladimir Barinov 	int ret = phy_read(phydev, MDIO_DEVAD_NONE, PHY_CONTROL1);
12121871138SVladimir Barinov 	ret &= ~PHY_LED_MODE;
12221871138SVladimir Barinov 	ret |= PHY_LED_MODE_ACK;
12321871138SVladimir Barinov 	ret = phy_write(phydev, MDIO_DEVAD_NONE, PHY_CONTROL1, (u16)ret);
12421871138SVladimir Barinov 
12521871138SVladimir Barinov 	return 0;
12621871138SVladimir Barinov }
12721871138SVladimir Barinov 
12821871138SVladimir Barinov const struct rmobile_sysinfo sysinfo = {
1291cc95f6eSNobuhiro Iwamatsu 	CONFIG_ARCH_RMOBILE_BOARD_STRING
13021871138SVladimir Barinov };
131*a3c159b9SMarek Vasut 
132*a3c159b9SMarek Vasut enum env_location env_get_location(enum env_operation op, int prio)
133*a3c159b9SMarek Vasut {
134*a3c159b9SMarek Vasut 	const u32 load_magic = 0xb33fc0de;
135*a3c159b9SMarek Vasut 
136*a3c159b9SMarek Vasut 	/* Block environment access if loaded using JTAG */
137*a3c159b9SMarek Vasut 	if ((readl(CONFIG_SPL_TEXT_BASE + 0x24) == load_magic) &&
138*a3c159b9SMarek Vasut 	    (op != ENVOP_INIT))
139*a3c159b9SMarek Vasut 		return ENVL_UNKNOWN;
140*a3c159b9SMarek Vasut 
141*a3c159b9SMarek Vasut 	if (prio)
142*a3c159b9SMarek Vasut 		return ENVL_UNKNOWN;
143*a3c159b9SMarek Vasut 
144*a3c159b9SMarek Vasut 	return ENVL_SPI_FLASH;
145*a3c159b9SMarek Vasut }
146