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