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