xref: /rk3399_rockchip-uboot/board/renesas/lager/lager.c (revision 35affd7a2ff9a77b9946bf93b616228fcf218d60)
1f4ec4522SNobuhiro Iwamatsu /*
2f4ec4522SNobuhiro Iwamatsu  * board/renesas/lager/lager.c
3f4ec4522SNobuhiro Iwamatsu  *     This file is lager board support.
4f4ec4522SNobuhiro Iwamatsu  *
5f4ec4522SNobuhiro Iwamatsu  * Copyright (C) 2013 Renesas Electronics Corporation
6f4ec4522SNobuhiro Iwamatsu  * Copyright (C) 2013 Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
7f4ec4522SNobuhiro Iwamatsu  *
8f4ec4522SNobuhiro Iwamatsu  * SPDX-License-Identifier: GPL-2.0
9f4ec4522SNobuhiro Iwamatsu  */
10f4ec4522SNobuhiro Iwamatsu 
11f4ec4522SNobuhiro Iwamatsu #include <common.h>
12f4ec4522SNobuhiro Iwamatsu #include <malloc.h>
13f4ec4522SNobuhiro Iwamatsu #include <netdev.h>
14cf839572SNobuhiro Iwamatsu #include <dm.h>
15cf839572SNobuhiro Iwamatsu #include <dm/platform_data/serial_sh.h>
16f4ec4522SNobuhiro Iwamatsu #include <asm/processor.h>
17f4ec4522SNobuhiro Iwamatsu #include <asm/mach-types.h>
18f4ec4522SNobuhiro Iwamatsu #include <asm/io.h>
191221ce45SMasahiro Yamada #include <linux/errno.h>
20f4ec4522SNobuhiro Iwamatsu #include <asm/arch/sys_proto.h>
21f4ec4522SNobuhiro Iwamatsu #include <asm/gpio.h>
22f4ec4522SNobuhiro Iwamatsu #include <asm/arch/rmobile.h>
2344e1eebfSNobuhiro Iwamatsu #include <asm/arch/rcar-mstp.h>
24d7916b1dSNobuhiro Iwamatsu #include <asm/arch/mmc.h>
25acdfecbbSNobuhiro Iwamatsu #include <asm/arch/sh_sdhi.h>
2623565c6bSNobuhiro Iwamatsu #include <miiphy.h>
27b9986be0SNobuhiro Iwamatsu #include <i2c.h>
28d7916b1dSNobuhiro Iwamatsu #include <mmc.h>
29f4ec4522SNobuhiro Iwamatsu #include "qos.h"
30f4ec4522SNobuhiro Iwamatsu 
31f4ec4522SNobuhiro Iwamatsu DECLARE_GLOBAL_DATA_PTR;
32f4ec4522SNobuhiro Iwamatsu 
332c2c6ba6SNobuhiro Iwamatsu #define CLK2MHZ(clk)	(clk / 1000 / 1000)
s_init(void)34f4ec4522SNobuhiro Iwamatsu void s_init(void)
35f4ec4522SNobuhiro Iwamatsu {
36dc535e10SNobuhiro Iwamatsu 	struct rcar_rwdt *rwdt = (struct rcar_rwdt *)RWDT_BASE;
37dc535e10SNobuhiro Iwamatsu 	struct rcar_swdt *swdt = (struct rcar_swdt *)SWDT_BASE;
38f4ec4522SNobuhiro Iwamatsu 
39f4ec4522SNobuhiro Iwamatsu 	/* Watchdog init */
40f4ec4522SNobuhiro Iwamatsu 	writel(0xA5A5A500, &rwdt->rwtcsra);
41f4ec4522SNobuhiro Iwamatsu 	writel(0xA5A5A500, &swdt->swtcsra);
42f4ec4522SNobuhiro Iwamatsu 
432c2c6ba6SNobuhiro Iwamatsu 	/* CPU frequency setting. Set to 1.4GHz */
44f212a8abSNobuhiro Iwamatsu 	if (rmobile_get_cpu_rev_integer() >= R8A7790_CUT_ES2X) {
45d8659c6dSNobuhiro Iwamatsu 		u32 stat = 0;
46f212a8abSNobuhiro Iwamatsu 		u32 stc = ((1400 / CLK2MHZ(CONFIG_SYS_CLK_FREQ)) - 1)
47f212a8abSNobuhiro Iwamatsu 			<< PLL0_STC_BIT;
482c2c6ba6SNobuhiro Iwamatsu 		clrsetbits_le32(PLL0CR, PLL0_STC_MASK, stc);
49d8659c6dSNobuhiro Iwamatsu 
50d8659c6dSNobuhiro Iwamatsu 		do {
51d8659c6dSNobuhiro Iwamatsu 			stat = readl(PLLECR) & PLL0ST;
52d8659c6dSNobuhiro Iwamatsu 		} while (stat == 0x0);
53f212a8abSNobuhiro Iwamatsu 	}
542c2c6ba6SNobuhiro Iwamatsu 
55f4ec4522SNobuhiro Iwamatsu 	/* QoS(Quality-of-Service) Init */
56f4ec4522SNobuhiro Iwamatsu 	qos_init();
57f4ec4522SNobuhiro Iwamatsu }
58f4ec4522SNobuhiro Iwamatsu 
59f4ec4522SNobuhiro Iwamatsu #define TMU0_MSTP125	(1 << 25)
60f4ec4522SNobuhiro Iwamatsu #define SCIF0_MSTP721	(1 << 21)
6123565c6bSNobuhiro Iwamatsu #define ETHER_MSTP813	(1 << 13)
62d7916b1dSNobuhiro Iwamatsu #define MMC1_MSTP305    (1 << 5)
6323565c6bSNobuhiro Iwamatsu 
64acdfecbbSNobuhiro Iwamatsu #define MSTPSR3		0xE6150048
65acdfecbbSNobuhiro Iwamatsu #define SMSTPCR3	0xE615013C
66acdfecbbSNobuhiro Iwamatsu #define SDHI0_MSTP314	(1 << 14)
67acdfecbbSNobuhiro Iwamatsu #define SDHI1_MSTP313	(1 << 13)
68acdfecbbSNobuhiro Iwamatsu #define SDHI2_MSTP312	(1 << 12)
69acdfecbbSNobuhiro Iwamatsu 
70acdfecbbSNobuhiro Iwamatsu #define SD2CKCR		0xE6150078
71acdfecbbSNobuhiro Iwamatsu #define SD2_97500KHZ	0x7
72acdfecbbSNobuhiro Iwamatsu 
board_early_init_f(void)73f4ec4522SNobuhiro Iwamatsu int board_early_init_f(void)
74f4ec4522SNobuhiro Iwamatsu {
75f4ec4522SNobuhiro Iwamatsu 	/* TMU0 */
76f4ec4522SNobuhiro Iwamatsu 	mstp_clrbits_le32(MSTPSR1, SMSTPCR1, TMU0_MSTP125);
77f4ec4522SNobuhiro Iwamatsu 	/* SCIF0 */
78f4ec4522SNobuhiro Iwamatsu 	mstp_clrbits_le32(MSTPSR7, SMSTPCR7, SCIF0_MSTP721);
7923565c6bSNobuhiro Iwamatsu 	/* ETHER */
8023565c6bSNobuhiro Iwamatsu 	mstp_clrbits_le32(MSTPSR8, SMSTPCR8, ETHER_MSTP813);
81d7916b1dSNobuhiro Iwamatsu 	/* eMMC */
82d7916b1dSNobuhiro Iwamatsu 	mstp_clrbits_le32(MSTPSR3, SMSTPCR3, MMC1_MSTP305);
83acdfecbbSNobuhiro Iwamatsu 	/* SDHI0, 2 */
84acdfecbbSNobuhiro Iwamatsu 	mstp_clrbits_le32(MSTPSR3, SMSTPCR3, SDHI0_MSTP314 | SDHI2_MSTP312);
85acdfecbbSNobuhiro Iwamatsu 
86acdfecbbSNobuhiro Iwamatsu 	/*
87acdfecbbSNobuhiro Iwamatsu 	 * SD0 clock is set to 97.5MHz by default.
88acdfecbbSNobuhiro Iwamatsu 	 * Set SD2 to the 97.5MHz as well.
89acdfecbbSNobuhiro Iwamatsu 	 */
90acdfecbbSNobuhiro Iwamatsu 	writel(SD2_97500KHZ, SD2CKCR);
9123565c6bSNobuhiro Iwamatsu 
92f4ec4522SNobuhiro Iwamatsu 	return 0;
93f4ec4522SNobuhiro Iwamatsu }
94f4ec4522SNobuhiro Iwamatsu 
95f4ec4522SNobuhiro Iwamatsu DECLARE_GLOBAL_DATA_PTR;
board_init(void)96f4ec4522SNobuhiro Iwamatsu int board_init(void)
97f4ec4522SNobuhiro Iwamatsu {
98f4ec4522SNobuhiro Iwamatsu 	/* adress of boot parameters */
99eeb266abSNobuhiro Iwamatsu 	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
100f4ec4522SNobuhiro Iwamatsu 
101f4ec4522SNobuhiro Iwamatsu 	/* Init PFC controller */
102f4ec4522SNobuhiro Iwamatsu 	r8a7790_pinmux_init();
103f4ec4522SNobuhiro Iwamatsu 
10423565c6bSNobuhiro Iwamatsu 	/* ETHER Enable */
10523565c6bSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_CRS_DV, NULL);
10623565c6bSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_RX_ER, NULL);
10723565c6bSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_RXD0, NULL);
10823565c6bSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_RXD1, NULL);
10923565c6bSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_LINK, NULL);
11023565c6bSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_REF_CLK, NULL);
11123565c6bSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_MDIO, NULL);
11223565c6bSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_TXD1, NULL);
11323565c6bSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_TX_EN, NULL);
11423565c6bSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_MAGIC, NULL);
11523565c6bSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_TXD0, NULL);
11623565c6bSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_MDC, NULL);
11723565c6bSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_IRQ0, NULL);
11823565c6bSNobuhiro Iwamatsu 
11923565c6bSNobuhiro Iwamatsu 	gpio_request(GPIO_GP_5_31, NULL);	/* PHY_RST */
12023565c6bSNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_5_31, 0);
12123565c6bSNobuhiro Iwamatsu 	mdelay(20);
12223565c6bSNobuhiro Iwamatsu 	gpio_set_value(GPIO_GP_5_31, 1);
12323565c6bSNobuhiro Iwamatsu 	udelay(1);
12423565c6bSNobuhiro Iwamatsu 
12523565c6bSNobuhiro Iwamatsu 	return 0;
12623565c6bSNobuhiro Iwamatsu }
12723565c6bSNobuhiro Iwamatsu 
12823565c6bSNobuhiro Iwamatsu #define CXR24 0xEE7003C0 /* MAC address high register */
12923565c6bSNobuhiro Iwamatsu #define CXR25 0xEE7003C8 /* MAC address low register */
board_eth_init(bd_t * bis)13023565c6bSNobuhiro Iwamatsu int board_eth_init(bd_t *bis)
13123565c6bSNobuhiro Iwamatsu {
13223565c6bSNobuhiro Iwamatsu 	int ret = -ENODEV;
13323565c6bSNobuhiro Iwamatsu 
13423565c6bSNobuhiro Iwamatsu #ifdef CONFIG_SH_ETHER
13523565c6bSNobuhiro Iwamatsu 	u32 val;
13623565c6bSNobuhiro Iwamatsu 	unsigned char enetaddr[6];
13723565c6bSNobuhiro Iwamatsu 
13823565c6bSNobuhiro Iwamatsu 	ret = sh_eth_initialize(bis);
139*35affd7aSSimon Glass 	if (!eth_env_get_enetaddr("ethaddr", enetaddr))
14023565c6bSNobuhiro Iwamatsu 		return ret;
14123565c6bSNobuhiro Iwamatsu 
14223565c6bSNobuhiro Iwamatsu 	/* Set Mac address */
14323565c6bSNobuhiro Iwamatsu 	val = enetaddr[0] << 24 | enetaddr[1] << 16 |
14423565c6bSNobuhiro Iwamatsu 	    enetaddr[2] << 8 | enetaddr[3];
14523565c6bSNobuhiro Iwamatsu 	writel(val, CXR24);
14623565c6bSNobuhiro Iwamatsu 
14723565c6bSNobuhiro Iwamatsu 	val = enetaddr[4] << 8 | enetaddr[5];
14823565c6bSNobuhiro Iwamatsu 	writel(val, CXR25);
14923565c6bSNobuhiro Iwamatsu 
15023565c6bSNobuhiro Iwamatsu #endif
15123565c6bSNobuhiro Iwamatsu 
15223565c6bSNobuhiro Iwamatsu 	return ret;
15323565c6bSNobuhiro Iwamatsu }
15423565c6bSNobuhiro Iwamatsu 
15523565c6bSNobuhiro Iwamatsu /* lager has KSZ8041NL/RNL */
15623565c6bSNobuhiro Iwamatsu #define PHY_CONTROL1	0x1E
15723565c6bSNobuhiro Iwamatsu #define PHY_LED_MODE	0xC0000
15823565c6bSNobuhiro Iwamatsu #define PHY_LED_MODE_ACK	0x4000
board_phy_config(struct phy_device * phydev)15923565c6bSNobuhiro Iwamatsu int board_phy_config(struct phy_device *phydev)
16023565c6bSNobuhiro Iwamatsu {
16123565c6bSNobuhiro Iwamatsu 	int ret = phy_read(phydev, MDIO_DEVAD_NONE, PHY_CONTROL1);
16223565c6bSNobuhiro Iwamatsu 	ret &= ~PHY_LED_MODE;
16323565c6bSNobuhiro Iwamatsu 	ret |= PHY_LED_MODE_ACK;
16423565c6bSNobuhiro Iwamatsu 	ret = phy_write(phydev, MDIO_DEVAD_NONE, PHY_CONTROL1, (u16)ret);
16523565c6bSNobuhiro Iwamatsu 
166f4ec4522SNobuhiro Iwamatsu 	return 0;
167f4ec4522SNobuhiro Iwamatsu }
168f4ec4522SNobuhiro Iwamatsu 
board_mmc_init(bd_t * bis)169d7916b1dSNobuhiro Iwamatsu int board_mmc_init(bd_t *bis)
170d7916b1dSNobuhiro Iwamatsu {
171acdfecbbSNobuhiro Iwamatsu 	int ret = -ENODEV;
172d7916b1dSNobuhiro Iwamatsu 
173d7916b1dSNobuhiro Iwamatsu #ifdef CONFIG_SH_MMCIF
174d7916b1dSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_MMC1_D0, NULL);
175d7916b1dSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_MMC1_D1, NULL);
176d7916b1dSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_MMC1_D2, NULL);
177d7916b1dSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_MMC1_D3, NULL);
178d7916b1dSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_MMC1_D4, NULL);
179d7916b1dSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_MMC1_D5, NULL);
180d7916b1dSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_MMC1_D6, NULL);
181d7916b1dSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_MMC1_D7, NULL);
182d7916b1dSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_MMC1_CLK, NULL);
183d7916b1dSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_MMC1_CMD, NULL);
184d7916b1dSNobuhiro Iwamatsu 
185d7916b1dSNobuhiro Iwamatsu 	ret = mmcif_mmc_init();
186d7916b1dSNobuhiro Iwamatsu #endif
187acdfecbbSNobuhiro Iwamatsu 
188acdfecbbSNobuhiro Iwamatsu #ifdef CONFIG_SH_SDHI
189acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_DAT0, NULL);
190acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_DAT1, NULL);
191acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_DAT2, NULL);
192acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_DAT3, NULL);
193acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_CLK, NULL);
194acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_CMD, NULL);
195acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_CD, NULL);
196acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD2_DAT0, NULL);
197acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD2_DAT1, NULL);
198acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD2_DAT2, NULL);
199acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD2_DAT3, NULL);
200acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD2_CLK, NULL);
201acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD2_CMD, NULL);
202acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD2_CD, NULL);
203acdfecbbSNobuhiro Iwamatsu 
204acdfecbbSNobuhiro Iwamatsu 	/*
205acdfecbbSNobuhiro Iwamatsu 	 * SDHI 0
206acdfecbbSNobuhiro Iwamatsu 	 * need JP3 set to pin-1 side on board.
207acdfecbbSNobuhiro Iwamatsu 	 */
208acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_GP_5_24, NULL);
209acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_GP_5_29, NULL);
210acdfecbbSNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_5_24, 1);	/* power on */
211acdfecbbSNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_5_29, 1);	/* 1: 3.3V, 0: 1.8V */
212acdfecbbSNobuhiro Iwamatsu 
213acdfecbbSNobuhiro Iwamatsu 	ret = sh_sdhi_init(CONFIG_SYS_SH_SDHI0_BASE, 0,
214acdfecbbSNobuhiro Iwamatsu 			   SH_SDHI_QUIRK_16BIT_BUF);
215acdfecbbSNobuhiro Iwamatsu 	if (ret)
216acdfecbbSNobuhiro Iwamatsu 		return ret;
217acdfecbbSNobuhiro Iwamatsu 
218acdfecbbSNobuhiro Iwamatsu 	/* SDHI 2 */
219acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_GP_5_25, NULL);
220acdfecbbSNobuhiro Iwamatsu 	gpio_request(GPIO_GP_5_30, NULL);
221acdfecbbSNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_5_25, 1);	/* power on */
222acdfecbbSNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_5_30, 1);	/* 1: 3.3V, 0: 1.8V */
223acdfecbbSNobuhiro Iwamatsu 
224acdfecbbSNobuhiro Iwamatsu 	ret = sh_sdhi_init(CONFIG_SYS_SH_SDHI2_BASE, 2, 0);
225acdfecbbSNobuhiro Iwamatsu #endif
226d7916b1dSNobuhiro Iwamatsu 	return ret;
227d7916b1dSNobuhiro Iwamatsu }
228d7916b1dSNobuhiro Iwamatsu 
229d7916b1dSNobuhiro Iwamatsu 
dram_init(void)230f4ec4522SNobuhiro Iwamatsu int dram_init(void)
231f4ec4522SNobuhiro Iwamatsu {
232f4ec4522SNobuhiro Iwamatsu 	gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
233f4ec4522SNobuhiro Iwamatsu 
234f4ec4522SNobuhiro Iwamatsu 	return 0;
235f4ec4522SNobuhiro Iwamatsu }
236f4ec4522SNobuhiro Iwamatsu 
237f4ec4522SNobuhiro Iwamatsu const struct rmobile_sysinfo sysinfo = {
2381cc95f6eSNobuhiro Iwamatsu 	CONFIG_ARCH_RMOBILE_BOARD_STRING
239f4ec4522SNobuhiro Iwamatsu };
240f4ec4522SNobuhiro Iwamatsu 
reset_cpu(ulong addr)241f4ec4522SNobuhiro Iwamatsu void reset_cpu(ulong addr)
242f4ec4522SNobuhiro Iwamatsu {
243b9986be0SNobuhiro Iwamatsu 	u8 val;
244b9986be0SNobuhiro Iwamatsu 
245b9986be0SNobuhiro Iwamatsu 	i2c_set_bus_num(3); /* PowerIC connected to ch3 */
246b9986be0SNobuhiro Iwamatsu 	i2c_init(400000, 0);
247b9986be0SNobuhiro Iwamatsu 	i2c_read(CONFIG_SYS_I2C_POWERIC_ADDR, 0x13, 1, &val, 1);
248b9986be0SNobuhiro Iwamatsu 	val |= 0x02;
249b9986be0SNobuhiro Iwamatsu 	i2c_write(CONFIG_SYS_I2C_POWERIC_ADDR, 0x13, 1, &val, 1);
250f4ec4522SNobuhiro Iwamatsu }
251cf839572SNobuhiro Iwamatsu 
252cf839572SNobuhiro Iwamatsu static const struct sh_serial_platdata serial_platdata = {
253cf839572SNobuhiro Iwamatsu 	.base = SCIF0_BASE,
254cf839572SNobuhiro Iwamatsu 	.type = PORT_SCIF,
255cf839572SNobuhiro Iwamatsu 	.clk = 14745600,
256cf839572SNobuhiro Iwamatsu 	.clk_mode = EXT_CLK,
257cf839572SNobuhiro Iwamatsu };
258cf839572SNobuhiro Iwamatsu 
259cf839572SNobuhiro Iwamatsu U_BOOT_DEVICE(lager_serials) = {
260cf839572SNobuhiro Iwamatsu 	.name = "serial_sh",
261cf839572SNobuhiro Iwamatsu 	.platdata = &serial_platdata,
262cf839572SNobuhiro Iwamatsu };
263