xref: /rk3399_rockchip-uboot/board/renesas/silk/silk.c (revision 35affd7a2ff9a77b9946bf93b616228fcf218d60)
13b7f0e10SVladimir Barinov /*
23b7f0e10SVladimir Barinov  * board/renesas/silk/silk.c
33b7f0e10SVladimir Barinov  *
43b7f0e10SVladimir Barinov  * Copyright (C) 2015 Renesas Electronics Corporation
53b7f0e10SVladimir Barinov  * Copyright (C) 2015 Cogent Embedded, Inc.
63b7f0e10SVladimir Barinov  *
73b7f0e10SVladimir Barinov  * SPDX-License-Identifier: GPL-2.0
83b7f0e10SVladimir Barinov  */
93b7f0e10SVladimir Barinov 
103b7f0e10SVladimir Barinov #include <common.h>
113b7f0e10SVladimir Barinov #include <malloc.h>
123cfab108SNobuhiro Iwamatsu #include <dm.h>
133cfab108SNobuhiro Iwamatsu #include <dm/platform_data/serial_sh.h>
143b7f0e10SVladimir Barinov #include <asm/processor.h>
153b7f0e10SVladimir Barinov #include <asm/mach-types.h>
163b7f0e10SVladimir Barinov #include <asm/io.h>
171221ce45SMasahiro Yamada #include <linux/errno.h>
183b7f0e10SVladimir Barinov #include <asm/arch/sys_proto.h>
193b7f0e10SVladimir Barinov #include <asm/gpio.h>
203b7f0e10SVladimir Barinov #include <asm/arch/rmobile.h>
213b7f0e10SVladimir Barinov #include <asm/arch/rcar-mstp.h>
223b7f0e10SVladimir Barinov #include <asm/arch/mmc.h>
23275ec28eSVladimir Barinov #include <asm/arch/sh_sdhi.h>
243b7f0e10SVladimir Barinov #include <netdev.h>
253b7f0e10SVladimir Barinov #include <miiphy.h>
263b7f0e10SVladimir Barinov #include <i2c.h>
273b7f0e10SVladimir Barinov #include <div64.h>
283b7f0e10SVladimir Barinov #include "qos.h"
293b7f0e10SVladimir Barinov 
303b7f0e10SVladimir Barinov DECLARE_GLOBAL_DATA_PTR;
313b7f0e10SVladimir Barinov 
323b7f0e10SVladimir Barinov #define CLK2MHZ(clk)	(clk / 1000 / 1000)
s_init(void)333b7f0e10SVladimir Barinov void s_init(void)
343b7f0e10SVladimir Barinov {
353b7f0e10SVladimir Barinov 	struct rcar_rwdt *rwdt = (struct rcar_rwdt *)RWDT_BASE;
363b7f0e10SVladimir Barinov 	struct rcar_swdt *swdt = (struct rcar_swdt *)SWDT_BASE;
373b7f0e10SVladimir Barinov 
383b7f0e10SVladimir Barinov 	/* Watchdog init */
393b7f0e10SVladimir Barinov 	writel(0xA5A5A500, &rwdt->rwtcsra);
403b7f0e10SVladimir Barinov 	writel(0xA5A5A500, &swdt->swtcsra);
413b7f0e10SVladimir Barinov 
423b7f0e10SVladimir Barinov 	/* QoS */
433b7f0e10SVladimir Barinov 	qos_init();
443b7f0e10SVladimir Barinov }
453b7f0e10SVladimir Barinov 
463b7f0e10SVladimir Barinov #define TMU0_MSTP125	(1 << 25)
473b7f0e10SVladimir Barinov #define SCIF2_MSTP719	(1 << 19)
483b7f0e10SVladimir Barinov #define ETHER_MSTP813	(1 << 13)
493b7f0e10SVladimir Barinov #define IIC1_MSTP323	(1 << 23)
503b7f0e10SVladimir Barinov #define MMC0_MSTP315	(1 << 15)
51275ec28eSVladimir Barinov #define SDHI1_MSTP312	(1 << 12)
52275ec28eSVladimir Barinov 
53275ec28eSVladimir Barinov #define SD1CKCR		0xE6150078
54275ec28eSVladimir Barinov #define SD1_97500KHZ	0x7
553b7f0e10SVladimir Barinov 
board_early_init_f(void)563b7f0e10SVladimir Barinov int board_early_init_f(void)
573b7f0e10SVladimir Barinov {
583b7f0e10SVladimir Barinov 	/* TMU */
593b7f0e10SVladimir Barinov 	mstp_clrbits_le32(MSTPSR1, SMSTPCR1, TMU0_MSTP125);
603b7f0e10SVladimir Barinov 
613b7f0e10SVladimir Barinov 	/* SCIF2 */
623b7f0e10SVladimir Barinov 	mstp_clrbits_le32(MSTPSR7, SMSTPCR7, SCIF2_MSTP719);
633b7f0e10SVladimir Barinov 
643b7f0e10SVladimir Barinov 	/* ETHER */
653b7f0e10SVladimir Barinov 	mstp_clrbits_le32(MSTPSR8, SMSTPCR8, ETHER_MSTP813);
663b7f0e10SVladimir Barinov 
673b7f0e10SVladimir Barinov 	/* IIC1 / sh-i2c ch1 */
683b7f0e10SVladimir Barinov 	mstp_clrbits_le32(MSTPSR3, SMSTPCR3, IIC1_MSTP323);
693b7f0e10SVladimir Barinov 
703b7f0e10SVladimir Barinov #ifdef CONFIG_SH_MMCIF
713b7f0e10SVladimir Barinov 	/* MMC */
723b7f0e10SVladimir Barinov 	mstp_clrbits_le32(MSTPSR3, SMSTPCR3, MMC0_MSTP315);
733b7f0e10SVladimir Barinov #endif
74275ec28eSVladimir Barinov 
75275ec28eSVladimir Barinov #ifdef CONFIG_SH_SDHI
76275ec28eSVladimir Barinov 	/* SDHI1 */
77275ec28eSVladimir Barinov 	mstp_clrbits_le32(MSTPSR3, SMSTPCR3, SDHI1_MSTP312);
78275ec28eSVladimir Barinov 
79275ec28eSVladimir Barinov 	/*
80275ec28eSVladimir Barinov 	 * Set SD1 to the 97.5MHz
81275ec28eSVladimir Barinov 	 */
82275ec28eSVladimir Barinov 	writel(SD1_97500KHZ, SD1CKCR);
83275ec28eSVladimir Barinov #endif
843b7f0e10SVladimir Barinov 	return 0;
853b7f0e10SVladimir Barinov }
863b7f0e10SVladimir Barinov 
87add4ec4dSVladimir Barinov /* LSI pin pull-up control */
88add4ec4dSVladimir Barinov #define PUPR3		0xe606010C
89add4ec4dSVladimir Barinov #define PUPR3_ETH	0x006FF800
90add4ec4dSVladimir Barinov #define PUPR1		0xe6060104
91add4ec4dSVladimir Barinov #define PUPR1_DREQ0_N	(1 << 20)
board_init(void)923b7f0e10SVladimir Barinov int board_init(void)
933b7f0e10SVladimir Barinov {
943b7f0e10SVladimir Barinov 	/* adress of boot parameters */
953b7f0e10SVladimir Barinov 	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
963b7f0e10SVladimir Barinov 
973b7f0e10SVladimir Barinov 	/* Init PFC controller */
983b7f0e10SVladimir Barinov 	r8a7794_pinmux_init();
993b7f0e10SVladimir Barinov 
1003b7f0e10SVladimir Barinov 	/* Ether Enable */
1013b7f0e10SVladimir Barinov 	gpio_request(GPIO_FN_ETH_CRS_DV, NULL);
1023b7f0e10SVladimir Barinov 	gpio_request(GPIO_FN_ETH_RX_ER, NULL);
1033b7f0e10SVladimir Barinov 	gpio_request(GPIO_FN_ETH_RXD0, NULL);
1043b7f0e10SVladimir Barinov 	gpio_request(GPIO_FN_ETH_RXD1, NULL);
1053b7f0e10SVladimir Barinov 	gpio_request(GPIO_FN_ETH_LINK, NULL);
1063b7f0e10SVladimir Barinov 	gpio_request(GPIO_FN_ETH_REFCLK, NULL);
1073b7f0e10SVladimir Barinov 	gpio_request(GPIO_FN_ETH_MDIO, NULL);
1083b7f0e10SVladimir Barinov 	gpio_request(GPIO_FN_ETH_TXD1, NULL);
1093b7f0e10SVladimir Barinov 	gpio_request(GPIO_FN_ETH_TX_EN, NULL);
1103b7f0e10SVladimir Barinov 	gpio_request(GPIO_FN_ETH_MAGIC, NULL);
1113b7f0e10SVladimir Barinov 	gpio_request(GPIO_FN_ETH_TXD0, NULL);
1123b7f0e10SVladimir Barinov 	gpio_request(GPIO_FN_ETH_MDC, NULL);
1133b7f0e10SVladimir Barinov 	gpio_request(GPIO_FN_IRQ8, NULL);
1143b7f0e10SVladimir Barinov 
1153b7f0e10SVladimir Barinov 	/* PHY reset */
116add4ec4dSVladimir Barinov 	mstp_clrbits_le32(PUPR3, PUPR3, PUPR3_ETH);
1173b7f0e10SVladimir Barinov 	gpio_request(GPIO_GP_1_24, NULL);
118add4ec4dSVladimir Barinov 	mstp_clrbits_le32(PUPR1, PUPR1, PUPR1_DREQ0_N);
119add4ec4dSVladimir Barinov 
1203b7f0e10SVladimir Barinov 	gpio_direction_output(GPIO_GP_1_24, 0);
1213b7f0e10SVladimir Barinov 	mdelay(20);
1223b7f0e10SVladimir Barinov 	gpio_set_value(GPIO_GP_1_24, 1);
1233b7f0e10SVladimir Barinov 	udelay(1);
1243b7f0e10SVladimir Barinov 
1253b7f0e10SVladimir Barinov 	return 0;
1263b7f0e10SVladimir Barinov }
1273b7f0e10SVladimir Barinov 
1283b7f0e10SVladimir Barinov #define CXR24 0xEE7003C0 /* MAC address high register */
1293b7f0e10SVladimir Barinov #define CXR25 0xEE7003C8 /* MAC address low register */
board_eth_init(bd_t * bis)1303b7f0e10SVladimir Barinov int board_eth_init(bd_t *bis)
1313b7f0e10SVladimir Barinov {
1323b7f0e10SVladimir Barinov #ifdef CONFIG_SH_ETHER
1333b7f0e10SVladimir Barinov 	int ret = -ENODEV;
1343b7f0e10SVladimir Barinov 	u32 val;
1353b7f0e10SVladimir Barinov 	unsigned char enetaddr[6];
1363b7f0e10SVladimir Barinov 
1373b7f0e10SVladimir Barinov 	ret = sh_eth_initialize(bis);
138*35affd7aSSimon Glass 	if (!eth_env_get_enetaddr("ethaddr", enetaddr))
1393b7f0e10SVladimir Barinov 		return ret;
1403b7f0e10SVladimir Barinov 
1413b7f0e10SVladimir Barinov 	/* Set Mac address */
1423b7f0e10SVladimir Barinov 	val = enetaddr[0] << 24 | enetaddr[1] << 16 |
1433b7f0e10SVladimir Barinov 		enetaddr[2] << 8 | enetaddr[3];
1443b7f0e10SVladimir Barinov 	writel(val, CXR24);
1453b7f0e10SVladimir Barinov 
1463b7f0e10SVladimir Barinov 	val = enetaddr[4] << 8 | enetaddr[5];
1473b7f0e10SVladimir Barinov 	writel(val, CXR25);
1483b7f0e10SVladimir Barinov 
1493b7f0e10SVladimir Barinov 	return ret;
1503b7f0e10SVladimir Barinov #else
1513b7f0e10SVladimir Barinov 	return 0;
1523b7f0e10SVladimir Barinov #endif
1533b7f0e10SVladimir Barinov }
1543b7f0e10SVladimir Barinov 
board_mmc_init(bd_t * bis)1553b7f0e10SVladimir Barinov int board_mmc_init(bd_t *bis)
1563b7f0e10SVladimir Barinov {
157275ec28eSVladimir Barinov 	int ret = -ENODEV;
1583b7f0e10SVladimir Barinov 
1593b7f0e10SVladimir Barinov #ifdef CONFIG_SH_MMCIF
1603b7f0e10SVladimir Barinov 	/* MMC0 */
1613b7f0e10SVladimir Barinov 	gpio_request(GPIO_GP_4_31, NULL);
162313ff58eSVladimir Barinov 	gpio_direction_output(GPIO_GP_4_31, 1);
1633b7f0e10SVladimir Barinov 
1643b7f0e10SVladimir Barinov 	ret = mmcif_mmc_init();
1653b7f0e10SVladimir Barinov #endif
166275ec28eSVladimir Barinov 
167275ec28eSVladimir Barinov #ifdef CONFIG_SH_SDHI
168275ec28eSVladimir Barinov 	gpio_request(GPIO_FN_SD1_DATA0, NULL);
169275ec28eSVladimir Barinov 	gpio_request(GPIO_FN_SD1_DATA1, NULL);
170275ec28eSVladimir Barinov 	gpio_request(GPIO_FN_SD1_DATA2, NULL);
171275ec28eSVladimir Barinov 	gpio_request(GPIO_FN_SD1_DATA3, NULL);
172275ec28eSVladimir Barinov 	gpio_request(GPIO_FN_SD1_CLK, NULL);
173275ec28eSVladimir Barinov 	gpio_request(GPIO_FN_SD1_CMD, NULL);
174275ec28eSVladimir Barinov 	gpio_request(GPIO_FN_SD1_CD, NULL);
175275ec28eSVladimir Barinov 
176275ec28eSVladimir Barinov 	/* SDHI 1 */
177275ec28eSVladimir Barinov 	gpio_request(GPIO_GP_4_26, NULL);
178275ec28eSVladimir Barinov 	gpio_request(GPIO_GP_4_29, NULL);
179275ec28eSVladimir Barinov 	gpio_direction_output(GPIO_GP_4_26, 1);
180275ec28eSVladimir Barinov 	gpio_direction_output(GPIO_GP_4_29, 1);
181275ec28eSVladimir Barinov 
182275ec28eSVladimir Barinov 	ret = sh_sdhi_init(CONFIG_SYS_SH_SDHI1_BASE, 1, 0);
183275ec28eSVladimir Barinov #endif
1843b7f0e10SVladimir Barinov 	return ret;
1853b7f0e10SVladimir Barinov }
1863b7f0e10SVladimir Barinov 
dram_init(void)1873b7f0e10SVladimir Barinov int dram_init(void)
1883b7f0e10SVladimir Barinov {
1893b7f0e10SVladimir Barinov 	gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
1903b7f0e10SVladimir Barinov 
1913b7f0e10SVladimir Barinov 	return 0;
1923b7f0e10SVladimir Barinov }
1933b7f0e10SVladimir Barinov 
1943b7f0e10SVladimir Barinov const struct rmobile_sysinfo sysinfo = {
1951cc95f6eSNobuhiro Iwamatsu 	CONFIG_ARCH_RMOBILE_BOARD_STRING
1963b7f0e10SVladimir Barinov };
1973b7f0e10SVladimir Barinov 
reset_cpu(ulong addr)1983b7f0e10SVladimir Barinov void reset_cpu(ulong addr)
1993b7f0e10SVladimir Barinov {
2003b7f0e10SVladimir Barinov 	u8 val;
2013b7f0e10SVladimir Barinov 
2023b7f0e10SVladimir Barinov 	i2c_set_bus_num(1); /* PowerIC connected to ch1 */
2033b7f0e10SVladimir Barinov 	i2c_read(CONFIG_SYS_I2C_POWERIC_ADDR, 0x13, 1, &val, 1);
2043b7f0e10SVladimir Barinov 	val |= 0x02;
2053b7f0e10SVladimir Barinov 	i2c_write(CONFIG_SYS_I2C_POWERIC_ADDR, 0x13, 1, &val, 1);
2063b7f0e10SVladimir Barinov }
2073cfab108SNobuhiro Iwamatsu 
2083cfab108SNobuhiro Iwamatsu static const struct sh_serial_platdata serial_platdata = {
2093cfab108SNobuhiro Iwamatsu 	.base = SCIF2_BASE,
2103cfab108SNobuhiro Iwamatsu 	.type = PORT_SCIF,
2113cfab108SNobuhiro Iwamatsu 	.clk = 14745600,
2123cfab108SNobuhiro Iwamatsu 	.clk_mode = EXT_CLK,
2133cfab108SNobuhiro Iwamatsu };
2143cfab108SNobuhiro Iwamatsu 
21580069b7eSVladimir Barinov U_BOOT_DEVICE(silk_serials) = {
2163cfab108SNobuhiro Iwamatsu 	.name = "serial_sh",
2173cfab108SNobuhiro Iwamatsu 	.platdata = &serial_platdata,
2183cfab108SNobuhiro Iwamatsu };
219