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