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