xref: /rk3399_rockchip-uboot/board/renesas/gose/gose.c (revision 35affd7a2ff9a77b9946bf93b616228fcf218d60)
16a994e5bSNobuhiro Iwamatsu /*
26a994e5bSNobuhiro Iwamatsu  * board/renesas/gose/gose.c
36a994e5bSNobuhiro Iwamatsu  *
46a994e5bSNobuhiro Iwamatsu  * Copyright (C) 2014 Renesas Electronics Corporation
56a994e5bSNobuhiro Iwamatsu  *
66a994e5bSNobuhiro Iwamatsu  * SPDX-License-Identifier: GPL-2.0
76a994e5bSNobuhiro Iwamatsu  */
86a994e5bSNobuhiro Iwamatsu 
96a994e5bSNobuhiro Iwamatsu #include <common.h>
106a994e5bSNobuhiro Iwamatsu #include <malloc.h>
119d86e48eSNobuhiro Iwamatsu #include <dm.h>
129d86e48eSNobuhiro Iwamatsu #include <dm/platform_data/serial_sh.h>
136a994e5bSNobuhiro Iwamatsu #include <asm/processor.h>
146a994e5bSNobuhiro Iwamatsu #include <asm/mach-types.h>
156a994e5bSNobuhiro Iwamatsu #include <asm/io.h>
161221ce45SMasahiro Yamada #include <linux/errno.h>
176a994e5bSNobuhiro Iwamatsu #include <asm/arch/sys_proto.h>
186a994e5bSNobuhiro Iwamatsu #include <asm/gpio.h>
196a994e5bSNobuhiro Iwamatsu #include <asm/arch/rmobile.h>
2044e1eebfSNobuhiro Iwamatsu #include <asm/arch/rcar-mstp.h>
21e2abab69SNobuhiro Iwamatsu #include <asm/arch/sh_sdhi.h>
22f0261243SNobuhiro Iwamatsu #include <netdev.h>
23f0261243SNobuhiro Iwamatsu #include <miiphy.h>
246a994e5bSNobuhiro Iwamatsu #include <i2c.h>
256a994e5bSNobuhiro Iwamatsu #include "qos.h"
266a994e5bSNobuhiro Iwamatsu 
276a994e5bSNobuhiro Iwamatsu DECLARE_GLOBAL_DATA_PTR;
286a994e5bSNobuhiro Iwamatsu 
296a994e5bSNobuhiro Iwamatsu #define CLK2MHZ(clk)	(clk / 1000 / 1000)
s_init(void)306a994e5bSNobuhiro Iwamatsu void s_init(void)
316a994e5bSNobuhiro Iwamatsu {
326a994e5bSNobuhiro Iwamatsu 	struct rcar_rwdt *rwdt = (struct rcar_rwdt *)RWDT_BASE;
336a994e5bSNobuhiro Iwamatsu 	struct rcar_swdt *swdt = (struct rcar_swdt *)SWDT_BASE;
346a994e5bSNobuhiro Iwamatsu 	u32 stc;
356a994e5bSNobuhiro Iwamatsu 
366a994e5bSNobuhiro Iwamatsu 	/* Watchdog init */
376a994e5bSNobuhiro Iwamatsu 	writel(0xA5A5A500, &rwdt->rwtcsra);
386a994e5bSNobuhiro Iwamatsu 	writel(0xA5A5A500, &swdt->swtcsra);
396a994e5bSNobuhiro Iwamatsu 
406a994e5bSNobuhiro Iwamatsu 	/* CPU frequency setting. Set to 1.5GHz */
416a994e5bSNobuhiro Iwamatsu 	stc = ((1500 / CLK2MHZ(CONFIG_SYS_CLK_FREQ)) - 1) << PLL0_STC_BIT;
426a994e5bSNobuhiro Iwamatsu 	clrsetbits_le32(PLL0CR, PLL0_STC_MASK, stc);
436a994e5bSNobuhiro Iwamatsu 
446a994e5bSNobuhiro Iwamatsu 	/* QoS */
456a994e5bSNobuhiro Iwamatsu 	qos_init();
466a994e5bSNobuhiro Iwamatsu }
476a994e5bSNobuhiro Iwamatsu 
486a994e5bSNobuhiro Iwamatsu #define TMU0_MSTP125	(1 << 25)
496a994e5bSNobuhiro Iwamatsu #define SCIF0_MSTP721	(1 << 21)
50f0261243SNobuhiro Iwamatsu #define ETHER_MSTP813	(1 << 13)
51f0261243SNobuhiro Iwamatsu 
52e2abab69SNobuhiro Iwamatsu #define SDHI0_MSTP314	(1 << 14)
53e2abab69SNobuhiro Iwamatsu #define SDHI1_MSTP312	(1 << 12)
54e2abab69SNobuhiro Iwamatsu #define SDHI2_MSTP311	(1 << 11)
55e2abab69SNobuhiro Iwamatsu 
56e2abab69SNobuhiro Iwamatsu #define SD1CKCR		0xE6150078
57e2abab69SNobuhiro Iwamatsu #define SD2CKCR		0xE615026C
58e2abab69SNobuhiro Iwamatsu #define SD_97500KHZ	0x7
59e2abab69SNobuhiro Iwamatsu 
board_early_init_f(void)606a994e5bSNobuhiro Iwamatsu int board_early_init_f(void)
616a994e5bSNobuhiro Iwamatsu {
626a994e5bSNobuhiro Iwamatsu 	/* TMU0 */
636a994e5bSNobuhiro Iwamatsu 	mstp_clrbits_le32(MSTPSR1, SMSTPCR1, TMU0_MSTP125);
646a994e5bSNobuhiro Iwamatsu 
656a994e5bSNobuhiro Iwamatsu 	/* SCIF0 */
666a994e5bSNobuhiro Iwamatsu 	mstp_clrbits_le32(MSTPSR7, SMSTPCR7, SCIF0_MSTP721);
676a994e5bSNobuhiro Iwamatsu 
68f0261243SNobuhiro Iwamatsu 	/* ETHER */
69f0261243SNobuhiro Iwamatsu 	mstp_clrbits_le32(MSTPSR8, SMSTPCR8, ETHER_MSTP813);
70f0261243SNobuhiro Iwamatsu 
71e2abab69SNobuhiro Iwamatsu 	/* SDHI */
72e2abab69SNobuhiro Iwamatsu 	mstp_clrbits_le32(MSTPSR3, SMSTPCR3,
73e2abab69SNobuhiro Iwamatsu 			  SDHI0_MSTP314 | SDHI1_MSTP312 | SDHI2_MSTP311);
74e2abab69SNobuhiro Iwamatsu 	writel(SD_97500KHZ, SD1CKCR);
75e2abab69SNobuhiro Iwamatsu 	writel(SD_97500KHZ, SD2CKCR);
76e2abab69SNobuhiro Iwamatsu 
776a994e5bSNobuhiro Iwamatsu 	return 0;
786a994e5bSNobuhiro Iwamatsu }
796a994e5bSNobuhiro Iwamatsu 
80f0261243SNobuhiro Iwamatsu #define PUPR5		0xE6060114
81f0261243SNobuhiro Iwamatsu #define PUPR5_ETH	0x3FFC0000
82f0261243SNobuhiro Iwamatsu #define PUPR5_ETH_MAGIC	(1 << 27)
83f0261243SNobuhiro Iwamatsu 
board_init(void)846a994e5bSNobuhiro Iwamatsu int board_init(void)
856a994e5bSNobuhiro Iwamatsu {
866a994e5bSNobuhiro Iwamatsu 	/* adress of boot parameters */
875a290250SNobuhiro Iwamatsu 	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
886a994e5bSNobuhiro Iwamatsu 
896a994e5bSNobuhiro Iwamatsu 	/* Init PFC controller */
906a994e5bSNobuhiro Iwamatsu 	r8a7793_pinmux_init();
916a994e5bSNobuhiro Iwamatsu 
92f0261243SNobuhiro Iwamatsu 	/* ETHER Enable */
93f0261243SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_CRS_DV, NULL);
94f0261243SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_RX_ER, NULL);
95f0261243SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_RXD0, NULL);
96f0261243SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_RXD1, NULL);
97f0261243SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_LINK, NULL);
98f0261243SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_REFCLK, NULL);
99f0261243SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_MDIO, NULL);
100f0261243SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_TXD1, NULL);
101f0261243SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_TX_EN, NULL);
102f0261243SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_TXD0, NULL);
103f0261243SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_MDC, NULL);
104f0261243SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_IRQ0, NULL);
105f0261243SNobuhiro Iwamatsu 
106f0261243SNobuhiro Iwamatsu 	mstp_clrbits_le32(PUPR5, PUPR5, PUPR5_ETH & ~PUPR5_ETH_MAGIC);
107f0261243SNobuhiro Iwamatsu 	gpio_request(GPIO_GP_5_22, NULL); /* PHY_RST */
108f0261243SNobuhiro Iwamatsu 	mstp_clrbits_le32(PUPR5, PUPR5, PUPR5_ETH_MAGIC);
109f0261243SNobuhiro Iwamatsu 
110f0261243SNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_5_22, 0);
111f0261243SNobuhiro Iwamatsu 	mdelay(20);
112f0261243SNobuhiro Iwamatsu 	gpio_set_value(GPIO_GP_5_22, 1);
113f0261243SNobuhiro Iwamatsu 	udelay(1);
114f0261243SNobuhiro Iwamatsu 
1156a994e5bSNobuhiro Iwamatsu 	return 0;
1166a994e5bSNobuhiro Iwamatsu }
1176a994e5bSNobuhiro Iwamatsu 
118f0261243SNobuhiro Iwamatsu #define CXR24 0xEE7003C0 /* MAC address high register */
119f0261243SNobuhiro Iwamatsu #define CXR25 0xEE7003C8 /* MAC address low register */
120f0261243SNobuhiro Iwamatsu 
board_eth_init(bd_t * bis)121f0261243SNobuhiro Iwamatsu int board_eth_init(bd_t *bis)
122f0261243SNobuhiro Iwamatsu {
123f0261243SNobuhiro Iwamatsu 	int ret = -ENODEV;
124f0261243SNobuhiro Iwamatsu 	u32 val;
125f0261243SNobuhiro Iwamatsu 	unsigned char enetaddr[6];
126f0261243SNobuhiro Iwamatsu 
127f0261243SNobuhiro Iwamatsu #ifdef CONFIG_SH_ETHER
128f0261243SNobuhiro Iwamatsu 	ret = sh_eth_initialize(bis);
129*35affd7aSSimon Glass 	if (!eth_env_get_enetaddr("ethaddr", enetaddr))
130f0261243SNobuhiro Iwamatsu 		return ret;
131f0261243SNobuhiro Iwamatsu 
132f0261243SNobuhiro Iwamatsu 	/* Set Mac address */
133f0261243SNobuhiro Iwamatsu 	val = enetaddr[0] << 24 | enetaddr[1] << 16 |
134f0261243SNobuhiro Iwamatsu 	    enetaddr[2] << 8 | enetaddr[3];
135f0261243SNobuhiro Iwamatsu 	writel(val, CXR24);
136f0261243SNobuhiro Iwamatsu 
137f0261243SNobuhiro Iwamatsu 	val = enetaddr[4] << 8 | enetaddr[5];
138f0261243SNobuhiro Iwamatsu 	writel(val, CXR25);
139f0261243SNobuhiro Iwamatsu #endif
140f0261243SNobuhiro Iwamatsu 
141f0261243SNobuhiro Iwamatsu 	return ret;
142f0261243SNobuhiro Iwamatsu }
143f0261243SNobuhiro Iwamatsu 
board_mmc_init(bd_t * bis)144e2abab69SNobuhiro Iwamatsu int board_mmc_init(bd_t *bis)
145e2abab69SNobuhiro Iwamatsu {
146e2abab69SNobuhiro Iwamatsu 	int ret = -ENODEV;
147e2abab69SNobuhiro Iwamatsu 
148e2abab69SNobuhiro Iwamatsu #ifdef CONFIG_SH_SDHI
149e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_DATA0, NULL);
150e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_DATA1, NULL);
151e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_DATA2, NULL);
152e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_DATA3, NULL);
153e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_CLK, NULL);
154e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_CMD, NULL);
155e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_CD, NULL);
156e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD2_DATA0, NULL);
157e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD2_DATA1, NULL);
158e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD2_DATA2, NULL);
159e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD2_DATA3, NULL);
160e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD2_CLK, NULL);
161e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD2_CMD, NULL);
162e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD2_CD, NULL);
163e2abab69SNobuhiro Iwamatsu 
164e2abab69SNobuhiro Iwamatsu 	/* SDHI 0 */
165e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_GP_7_17, NULL);
166e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_GP_2_12, NULL);
167e2abab69SNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_7_17, 1); /* power on */
168e2abab69SNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_2_12, 1); /* 1: 3.3V, 0: 1.8V */
169e2abab69SNobuhiro Iwamatsu 
170e2abab69SNobuhiro Iwamatsu 	ret = sh_sdhi_init(CONFIG_SYS_SH_SDHI0_BASE, 0,
171e2abab69SNobuhiro Iwamatsu 			   SH_SDHI_QUIRK_16BIT_BUF);
172e2abab69SNobuhiro Iwamatsu 	if (ret)
173e2abab69SNobuhiro Iwamatsu 		return ret;
174e2abab69SNobuhiro Iwamatsu 
175e2abab69SNobuhiro Iwamatsu 	/* SDHI 1 */
176e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_GP_7_18, NULL);
177e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_GP_2_13, NULL);
178e2abab69SNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_7_18, 1); /* power on */
179e2abab69SNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_2_13, 1); /* 1: 3.3V, 0: 1.8V */
180e2abab69SNobuhiro Iwamatsu 
181e2abab69SNobuhiro Iwamatsu 	ret = sh_sdhi_init(CONFIG_SYS_SH_SDHI1_BASE, 1, 0);
182e2abab69SNobuhiro Iwamatsu 	if (ret)
183e2abab69SNobuhiro Iwamatsu 		return ret;
184e2abab69SNobuhiro Iwamatsu 
185e2abab69SNobuhiro Iwamatsu 	/* SDHI 2 */
186e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_GP_7_19, NULL);
187e2abab69SNobuhiro Iwamatsu 	gpio_request(GPIO_GP_2_26, NULL);
188e2abab69SNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_7_19, 1); /* power on */
189e2abab69SNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_2_26, 1); /* 1: 3.3V, 0: 1.8V */
190e2abab69SNobuhiro Iwamatsu 
191e2abab69SNobuhiro Iwamatsu 	ret = sh_sdhi_init(CONFIG_SYS_SH_SDHI2_BASE, 2, 0);
192e2abab69SNobuhiro Iwamatsu #endif
193e2abab69SNobuhiro Iwamatsu 	return ret;
194e2abab69SNobuhiro Iwamatsu }
195e2abab69SNobuhiro Iwamatsu 
dram_init(void)1966a994e5bSNobuhiro Iwamatsu int dram_init(void)
1976a994e5bSNobuhiro Iwamatsu {
1986a994e5bSNobuhiro Iwamatsu 	gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
1996a994e5bSNobuhiro Iwamatsu 
2006a994e5bSNobuhiro Iwamatsu 	return 0;
2016a994e5bSNobuhiro Iwamatsu }
2026a994e5bSNobuhiro Iwamatsu 
2036a994e5bSNobuhiro Iwamatsu const struct rmobile_sysinfo sysinfo = {
2041cc95f6eSNobuhiro Iwamatsu 	CONFIG_ARCH_RMOBILE_BOARD_STRING
2056a994e5bSNobuhiro Iwamatsu };
2066a994e5bSNobuhiro Iwamatsu 
reset_cpu(ulong addr)2076a994e5bSNobuhiro Iwamatsu void reset_cpu(ulong addr)
2086a994e5bSNobuhiro Iwamatsu {
2096a994e5bSNobuhiro Iwamatsu 	u8 val;
2106a994e5bSNobuhiro Iwamatsu 
2116a994e5bSNobuhiro Iwamatsu 	i2c_set_bus_num(2); /* PowerIC connected to ch2 */
2126a994e5bSNobuhiro Iwamatsu 	i2c_read(CONFIG_SYS_I2C_POWERIC_ADDR, 0x13, 1, &val, 1);
2136a994e5bSNobuhiro Iwamatsu 	val |= 0x02;
2146a994e5bSNobuhiro Iwamatsu 	i2c_write(CONFIG_SYS_I2C_POWERIC_ADDR, 0x13, 1, &val, 1);
2156a994e5bSNobuhiro Iwamatsu }
2169d86e48eSNobuhiro Iwamatsu 
2179d86e48eSNobuhiro Iwamatsu static const struct sh_serial_platdata serial_platdata = {
2189d86e48eSNobuhiro Iwamatsu 	.base = SCIF0_BASE,
2199d86e48eSNobuhiro Iwamatsu 	.type = PORT_SCIF,
2209d86e48eSNobuhiro Iwamatsu 	.clk = 14745600,
2219d86e48eSNobuhiro Iwamatsu 	.clk_mode = EXT_CLK,
2229d86e48eSNobuhiro Iwamatsu };
2239d86e48eSNobuhiro Iwamatsu 
2249d86e48eSNobuhiro Iwamatsu U_BOOT_DEVICE(gose_serials) = {
2259d86e48eSNobuhiro Iwamatsu 	.name = "serial_sh",
2269d86e48eSNobuhiro Iwamatsu 	.platdata = &serial_platdata,
2279d86e48eSNobuhiro Iwamatsu };
228