xref: /rk3399_rockchip-uboot/board/renesas/alt/alt.c (revision 35affd7a2ff9a77b9946bf93b616228fcf218d60)
1cff2f5f0SNobuhiro Iwamatsu /*
2cff2f5f0SNobuhiro Iwamatsu  * board/renesas/alt/alt.c
3cff2f5f0SNobuhiro Iwamatsu  *
4cae72042SMitsuhiro Kimura  * Copyright (C) 2014, 2015 Renesas Electronics Corporation
5cff2f5f0SNobuhiro Iwamatsu  *
6cff2f5f0SNobuhiro Iwamatsu  * SPDX-License-Identifier: GPL-2.0
7cff2f5f0SNobuhiro Iwamatsu  */
8cff2f5f0SNobuhiro Iwamatsu 
9cff2f5f0SNobuhiro Iwamatsu #include <common.h>
10cff2f5f0SNobuhiro Iwamatsu #include <malloc.h>
119e116f64SNobuhiro Iwamatsu #include <dm.h>
129e116f64SNobuhiro Iwamatsu #include <dm/platform_data/serial_sh.h>
13cff2f5f0SNobuhiro Iwamatsu #include <asm/processor.h>
14cff2f5f0SNobuhiro Iwamatsu #include <asm/mach-types.h>
15cff2f5f0SNobuhiro Iwamatsu #include <asm/io.h>
161221ce45SMasahiro Yamada #include <linux/errno.h>
17cff2f5f0SNobuhiro Iwamatsu #include <asm/arch/sys_proto.h>
18cff2f5f0SNobuhiro Iwamatsu #include <asm/gpio.h>
19cff2f5f0SNobuhiro Iwamatsu #include <asm/arch/rmobile.h>
2044e1eebfSNobuhiro Iwamatsu #include <asm/arch/rcar-mstp.h>
212b8c0814SNobuhiro Iwamatsu #include <asm/arch/mmc.h>
2225f9613fSNobuhiro Iwamatsu #include <asm/arch/sh_sdhi.h>
23cff2f5f0SNobuhiro Iwamatsu #include <netdev.h>
24cff2f5f0SNobuhiro Iwamatsu #include <miiphy.h>
25cff2f5f0SNobuhiro Iwamatsu #include <i2c.h>
26cff2f5f0SNobuhiro Iwamatsu #include <div64.h>
27cff2f5f0SNobuhiro Iwamatsu #include "qos.h"
28cff2f5f0SNobuhiro Iwamatsu 
29cff2f5f0SNobuhiro Iwamatsu DECLARE_GLOBAL_DATA_PTR;
30cff2f5f0SNobuhiro Iwamatsu 
31cff2f5f0SNobuhiro Iwamatsu #define CLK2MHZ(clk)	(clk / 1000 / 1000)
s_init(void)32cff2f5f0SNobuhiro Iwamatsu void s_init(void)
33cff2f5f0SNobuhiro Iwamatsu {
34cff2f5f0SNobuhiro Iwamatsu 	struct rcar_rwdt *rwdt = (struct rcar_rwdt *)RWDT_BASE;
35cff2f5f0SNobuhiro Iwamatsu 	struct rcar_swdt *swdt = (struct rcar_swdt *)SWDT_BASE;
36cff2f5f0SNobuhiro Iwamatsu 
37cff2f5f0SNobuhiro Iwamatsu 	/* Watchdog init */
38cff2f5f0SNobuhiro Iwamatsu 	writel(0xA5A5A500, &rwdt->rwtcsra);
39cff2f5f0SNobuhiro Iwamatsu 	writel(0xA5A5A500, &swdt->swtcsra);
40cff2f5f0SNobuhiro Iwamatsu 
41cff2f5f0SNobuhiro Iwamatsu 	/* QoS */
42cff2f5f0SNobuhiro Iwamatsu 	qos_init();
43cff2f5f0SNobuhiro Iwamatsu }
44cff2f5f0SNobuhiro Iwamatsu 
45cff2f5f0SNobuhiro Iwamatsu #define TMU0_MSTP125	(1 << 25)
460e429bdfSNobuhiro Iwamatsu #define SCIF2_MSTP719	(1 << 19)
47cff2f5f0SNobuhiro Iwamatsu #define ETHER_MSTP813	(1 << 13)
4892ef38eeSNobuhiro Iwamatsu #define IIC1_MSTP323	(1 << 23)
492b8c0814SNobuhiro Iwamatsu #define MMC0_MSTP315	(1 << 15)
5025f9613fSNobuhiro Iwamatsu #define SDHI0_MSTP314	(1 << 14)
5125f9613fSNobuhiro Iwamatsu #define SDHI1_MSTP312	(1 << 12)
5225f9613fSNobuhiro Iwamatsu 
5325f9613fSNobuhiro Iwamatsu #define SD1CKCR		0xE6150078
5425f9613fSNobuhiro Iwamatsu #define SD1_97500KHZ	0x7
5592ef38eeSNobuhiro Iwamatsu 
board_early_init_f(void)56cff2f5f0SNobuhiro Iwamatsu int board_early_init_f(void)
57cff2f5f0SNobuhiro Iwamatsu {
58cff2f5f0SNobuhiro Iwamatsu 	/* TMU */
59cff2f5f0SNobuhiro Iwamatsu 	mstp_clrbits_le32(MSTPSR1, SMSTPCR1, TMU0_MSTP125);
60cff2f5f0SNobuhiro Iwamatsu 
610e429bdfSNobuhiro Iwamatsu 	/* SCIF2 */
620e429bdfSNobuhiro Iwamatsu 	mstp_clrbits_le32(MSTPSR7, SMSTPCR7, SCIF2_MSTP719);
63cff2f5f0SNobuhiro Iwamatsu 
64cff2f5f0SNobuhiro Iwamatsu 	/* ETHER */
65cff2f5f0SNobuhiro Iwamatsu 	mstp_clrbits_le32(MSTPSR8, SMSTPCR8, ETHER_MSTP813);
66cff2f5f0SNobuhiro Iwamatsu 
6792ef38eeSNobuhiro Iwamatsu 	/* IIC1 / sh-i2c ch1 */
6892ef38eeSNobuhiro Iwamatsu 	mstp_clrbits_le32(MSTPSR3, SMSTPCR3, IIC1_MSTP323);
6992ef38eeSNobuhiro Iwamatsu 
702b8c0814SNobuhiro Iwamatsu #ifdef CONFIG_SH_MMCIF
712b8c0814SNobuhiro Iwamatsu 	/* MMC */
722b8c0814SNobuhiro Iwamatsu 	mstp_clrbits_le32(MSTPSR3, SMSTPCR3, MMC0_MSTP315);
732b8c0814SNobuhiro Iwamatsu #endif
7425f9613fSNobuhiro Iwamatsu 
7525f9613fSNobuhiro Iwamatsu #ifdef CONFIG_SH_SDHI
7625f9613fSNobuhiro Iwamatsu 	/* SDHI0, 1 */
7725f9613fSNobuhiro Iwamatsu 	mstp_clrbits_le32(MSTPSR3, SMSTPCR3, SDHI0_MSTP314 | SDHI1_MSTP312);
7825f9613fSNobuhiro Iwamatsu 
7925f9613fSNobuhiro Iwamatsu 	/*
8025f9613fSNobuhiro Iwamatsu 	 * SD0 clock is set to 97.5MHz by default.
8125f9613fSNobuhiro Iwamatsu 	 * Set SD1 to the 97.5MHz as well.
8225f9613fSNobuhiro Iwamatsu 	 */
8325f9613fSNobuhiro Iwamatsu 	writel(SD1_97500KHZ, SD1CKCR);
8425f9613fSNobuhiro Iwamatsu #endif
85cff2f5f0SNobuhiro Iwamatsu 	return 0;
86cff2f5f0SNobuhiro Iwamatsu }
87cff2f5f0SNobuhiro Iwamatsu 
board_init(void)88cff2f5f0SNobuhiro Iwamatsu int board_init(void)
89cff2f5f0SNobuhiro Iwamatsu {
90cff2f5f0SNobuhiro Iwamatsu 	/* adress of boot parameters */
914772684cSNobuhiro Iwamatsu 	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
92cff2f5f0SNobuhiro Iwamatsu 
93cff2f5f0SNobuhiro Iwamatsu 	/* Init PFC controller */
94cff2f5f0SNobuhiro Iwamatsu 	r8a7794_pinmux_init();
95cff2f5f0SNobuhiro Iwamatsu 
96cff2f5f0SNobuhiro Iwamatsu 	/* Ether Enable */
97cae72042SMitsuhiro Kimura #if defined(CONFIG_R8A7794_ETHERNET_B)
98cae72042SMitsuhiro Kimura 	gpio_request(GPIO_FN_ETH_CRS_DV_B, NULL);
99cae72042SMitsuhiro Kimura 	gpio_request(GPIO_FN_ETH_RX_ER_B, NULL);
100cae72042SMitsuhiro Kimura 	gpio_request(GPIO_FN_ETH_RXD0_B, NULL);
101cae72042SMitsuhiro Kimura 	gpio_request(GPIO_FN_ETH_RXD1_B, NULL);
102cae72042SMitsuhiro Kimura 	gpio_request(GPIO_FN_ETH_LINK_B, NULL);
103cae72042SMitsuhiro Kimura 	gpio_request(GPIO_FN_ETH_REFCLK_B, NULL);
104cae72042SMitsuhiro Kimura 	gpio_request(GPIO_FN_ETH_MDIO_B, NULL);
105cae72042SMitsuhiro Kimura 	gpio_request(GPIO_FN_ETH_TXD1_B, NULL);
106cae72042SMitsuhiro Kimura 	gpio_request(GPIO_FN_ETH_TX_EN_B, NULL);
107cae72042SMitsuhiro Kimura 	gpio_request(GPIO_FN_ETH_MAGIC_B, NULL);
108cae72042SMitsuhiro Kimura 	gpio_request(GPIO_FN_ETH_TXD0_B, NULL);
109cae72042SMitsuhiro Kimura 	gpio_request(GPIO_FN_ETH_MDC_B, NULL);
110cae72042SMitsuhiro Kimura #else
111cff2f5f0SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_CRS_DV, NULL);
112cff2f5f0SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_RX_ER, NULL);
113cff2f5f0SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_RXD0, NULL);
114cff2f5f0SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_RXD1, NULL);
115cff2f5f0SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_LINK, NULL);
116cff2f5f0SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_REFCLK, NULL);
117cff2f5f0SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_MDIO, NULL);
118cff2f5f0SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_TXD1, NULL);
119cff2f5f0SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_TX_EN, NULL);
120cff2f5f0SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_MAGIC, NULL);
121cff2f5f0SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_TXD0, NULL);
122cff2f5f0SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_ETH_MDC, NULL);
123cae72042SMitsuhiro Kimura #endif
124cff2f5f0SNobuhiro Iwamatsu 	gpio_request(GPIO_FN_IRQ8, NULL);
125cff2f5f0SNobuhiro Iwamatsu 
126cff2f5f0SNobuhiro Iwamatsu 	/* PHY reset */
127cff2f5f0SNobuhiro Iwamatsu 	gpio_request(GPIO_GP_1_24, NULL);
128cff2f5f0SNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_1_24, 0);
129cff2f5f0SNobuhiro Iwamatsu 	mdelay(20);
130cff2f5f0SNobuhiro Iwamatsu 	gpio_set_value(GPIO_GP_1_24, 1);
131cff2f5f0SNobuhiro Iwamatsu 	udelay(1);
132cff2f5f0SNobuhiro Iwamatsu 
133cff2f5f0SNobuhiro Iwamatsu 	return 0;
134cff2f5f0SNobuhiro Iwamatsu }
135cff2f5f0SNobuhiro Iwamatsu 
136cff2f5f0SNobuhiro Iwamatsu #define CXR24 0xEE7003C0 /* MAC address high register */
137cff2f5f0SNobuhiro Iwamatsu #define CXR25 0xEE7003C8 /* MAC address low register */
board_eth_init(bd_t * bis)138cff2f5f0SNobuhiro Iwamatsu int board_eth_init(bd_t *bis)
139cff2f5f0SNobuhiro Iwamatsu {
140cff2f5f0SNobuhiro Iwamatsu #ifdef CONFIG_SH_ETHER
141cff2f5f0SNobuhiro Iwamatsu 	int ret = -ENODEV;
142cff2f5f0SNobuhiro Iwamatsu 	u32 val;
143cff2f5f0SNobuhiro Iwamatsu 	unsigned char enetaddr[6];
144cff2f5f0SNobuhiro Iwamatsu 
145cff2f5f0SNobuhiro Iwamatsu 	ret = sh_eth_initialize(bis);
146*35affd7aSSimon Glass 	if (!eth_env_get_enetaddr("ethaddr", enetaddr))
147cff2f5f0SNobuhiro Iwamatsu 		return ret;
148cff2f5f0SNobuhiro Iwamatsu 
149cff2f5f0SNobuhiro Iwamatsu 	/* Set Mac address */
150cff2f5f0SNobuhiro Iwamatsu 	val = enetaddr[0] << 24 | enetaddr[1] << 16 |
151cff2f5f0SNobuhiro Iwamatsu 		enetaddr[2] << 8 | enetaddr[3];
152cff2f5f0SNobuhiro Iwamatsu 	writel(val, CXR24);
153cff2f5f0SNobuhiro Iwamatsu 
154cff2f5f0SNobuhiro Iwamatsu 	val = enetaddr[4] << 8 | enetaddr[5];
155cff2f5f0SNobuhiro Iwamatsu 	writel(val, CXR25);
156cff2f5f0SNobuhiro Iwamatsu 
157cff2f5f0SNobuhiro Iwamatsu 	return ret;
158cff2f5f0SNobuhiro Iwamatsu #else
159cff2f5f0SNobuhiro Iwamatsu 	return 0;
160cff2f5f0SNobuhiro Iwamatsu #endif
161cff2f5f0SNobuhiro Iwamatsu }
162cff2f5f0SNobuhiro Iwamatsu 
board_mmc_init(bd_t * bis)1632b8c0814SNobuhiro Iwamatsu int board_mmc_init(bd_t *bis)
1642b8c0814SNobuhiro Iwamatsu {
16525f9613fSNobuhiro Iwamatsu 	int ret = -ENODEV;
1662b8c0814SNobuhiro Iwamatsu 
1672b8c0814SNobuhiro Iwamatsu #ifdef CONFIG_SH_MMCIF
1682b8c0814SNobuhiro Iwamatsu 	gpio_request(GPIO_GP_4_31, NULL);
1692b8c0814SNobuhiro Iwamatsu 	gpio_set_value(GPIO_GP_4_31, 1);
1702b8c0814SNobuhiro Iwamatsu 
1712b8c0814SNobuhiro Iwamatsu 	ret = mmcif_mmc_init();
1722b8c0814SNobuhiro Iwamatsu #endif
17325f9613fSNobuhiro Iwamatsu 
17425f9613fSNobuhiro Iwamatsu #ifdef CONFIG_SH_SDHI
17525f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_DATA0, NULL);
17625f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_DATA1, NULL);
17725f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_DATA2, NULL);
17825f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_DATA3, NULL);
17925f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_CLK, NULL);
18025f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_CMD, NULL);
18125f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD0_CD, NULL);
18225f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD1_DATA0, NULL);
18325f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD1_DATA1, NULL);
18425f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD1_DATA2, NULL);
18525f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD1_DATA3, NULL);
18625f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD1_CLK, NULL);
18725f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD1_CMD, NULL);
18825f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_FN_SD1_CD, NULL);
18925f9613fSNobuhiro Iwamatsu 
19025f9613fSNobuhiro Iwamatsu 	/* SDHI 0 */
19125f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_GP_2_26, NULL);
19225f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_GP_2_29, NULL);
19325f9613fSNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_2_26, 1);
19425f9613fSNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_2_29, 1);
19525f9613fSNobuhiro Iwamatsu 
19625f9613fSNobuhiro Iwamatsu 	ret = sh_sdhi_init(CONFIG_SYS_SH_SDHI0_BASE, 0,
19725f9613fSNobuhiro Iwamatsu 			   SH_SDHI_QUIRK_16BIT_BUF);
19825f9613fSNobuhiro Iwamatsu 	if (ret)
19925f9613fSNobuhiro Iwamatsu 		return ret;
20025f9613fSNobuhiro Iwamatsu 
20125f9613fSNobuhiro Iwamatsu 	/* SDHI 1 */
20225f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_GP_4_26, NULL);
20325f9613fSNobuhiro Iwamatsu 	gpio_request(GPIO_GP_4_29, NULL);
20425f9613fSNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_4_26, 1);
20525f9613fSNobuhiro Iwamatsu 	gpio_direction_output(GPIO_GP_4_29, 1);
20625f9613fSNobuhiro Iwamatsu 
20725f9613fSNobuhiro Iwamatsu 	ret = sh_sdhi_init(CONFIG_SYS_SH_SDHI1_BASE, 1, 0);
20825f9613fSNobuhiro Iwamatsu #endif
2092b8c0814SNobuhiro Iwamatsu 	return ret;
2102b8c0814SNobuhiro Iwamatsu }
2112b8c0814SNobuhiro Iwamatsu 
dram_init(void)212cff2f5f0SNobuhiro Iwamatsu int dram_init(void)
213cff2f5f0SNobuhiro Iwamatsu {
214cff2f5f0SNobuhiro Iwamatsu 	gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
215cff2f5f0SNobuhiro Iwamatsu 
216cff2f5f0SNobuhiro Iwamatsu 	return 0;
217cff2f5f0SNobuhiro Iwamatsu }
218cff2f5f0SNobuhiro Iwamatsu 
219cff2f5f0SNobuhiro Iwamatsu const struct rmobile_sysinfo sysinfo = {
2201cc95f6eSNobuhiro Iwamatsu 	CONFIG_ARCH_RMOBILE_BOARD_STRING
221cff2f5f0SNobuhiro Iwamatsu };
222cff2f5f0SNobuhiro Iwamatsu 
reset_cpu(ulong addr)223cff2f5f0SNobuhiro Iwamatsu void reset_cpu(ulong addr)
224cff2f5f0SNobuhiro Iwamatsu {
225cff2f5f0SNobuhiro Iwamatsu 	u8 val;
226cff2f5f0SNobuhiro Iwamatsu 
227f063b32cSNobuhiro Iwamatsu 	i2c_set_bus_num(1); /* PowerIC connected to ch1 */
228cff2f5f0SNobuhiro Iwamatsu 	i2c_read(CONFIG_SYS_I2C_POWERIC_ADDR, 0x13, 1, &val, 1);
229cff2f5f0SNobuhiro Iwamatsu 	val |= 0x02;
230cff2f5f0SNobuhiro Iwamatsu 	i2c_write(CONFIG_SYS_I2C_POWERIC_ADDR, 0x13, 1, &val, 1);
231cff2f5f0SNobuhiro Iwamatsu }
2329e116f64SNobuhiro Iwamatsu 
2339e116f64SNobuhiro Iwamatsu static const struct sh_serial_platdata serial_platdata = {
2349e116f64SNobuhiro Iwamatsu 	.base = SCIF2_BASE,
2359e116f64SNobuhiro Iwamatsu 	.type = PORT_SCIF,
2369e116f64SNobuhiro Iwamatsu 	.clk = 14745600,
2379e116f64SNobuhiro Iwamatsu 	.clk_mode = EXT_CLK,
2389e116f64SNobuhiro Iwamatsu };
2399e116f64SNobuhiro Iwamatsu 
2409e116f64SNobuhiro Iwamatsu U_BOOT_DEVICE(alt_serials) = {
2419e116f64SNobuhiro Iwamatsu 	.name = "serial_sh",
2429e116f64SNobuhiro Iwamatsu 	.platdata = &serial_platdata,
2439e116f64SNobuhiro Iwamatsu };
244