1bd39050cSMarek Vasut /*
2bd39050cSMarek Vasut * board/renesas/ulcb/ulcb.c
3bd39050cSMarek Vasut * This file is ULCB board support.
4bd39050cSMarek Vasut *
5bd39050cSMarek Vasut * Copyright (C) 2017 Renesas Electronics Corporation
6bd39050cSMarek Vasut *
7bd39050cSMarek Vasut * SPDX-License-Identifier: GPL-2.0+
8bd39050cSMarek Vasut */
9bd39050cSMarek Vasut
10bd39050cSMarek Vasut #include <common.h>
11bd39050cSMarek Vasut #include <malloc.h>
12bd39050cSMarek Vasut #include <netdev.h>
13bd39050cSMarek Vasut #include <dm.h>
14bd39050cSMarek Vasut #include <dm/platform_data/serial_sh.h>
15bd39050cSMarek Vasut #include <asm/processor.h>
16bd39050cSMarek Vasut #include <asm/mach-types.h>
17bd39050cSMarek Vasut #include <asm/io.h>
18bd39050cSMarek Vasut #include <linux/errno.h>
19bd39050cSMarek Vasut #include <asm/arch/sys_proto.h>
20bd39050cSMarek Vasut #include <asm/gpio.h>
21bd39050cSMarek Vasut #include <asm/arch/gpio.h>
22bd39050cSMarek Vasut #include <asm/arch/rmobile.h>
23bd39050cSMarek Vasut #include <asm/arch/rcar-mstp.h>
24bd39050cSMarek Vasut #include <asm/arch/sh_sdhi.h>
25bd39050cSMarek Vasut #include <i2c.h>
26bd39050cSMarek Vasut #include <mmc.h>
27bd39050cSMarek Vasut
28bd39050cSMarek Vasut DECLARE_GLOBAL_DATA_PTR;
29bd39050cSMarek Vasut
30bd39050cSMarek Vasut #define CPGWPCR 0xE6150904
31bd39050cSMarek Vasut #define CPGWPR 0xE615090C
32bd39050cSMarek Vasut
33bd39050cSMarek Vasut #define CLK2MHZ(clk) (clk / 1000 / 1000)
s_init(void)34bd39050cSMarek Vasut void s_init(void)
35bd39050cSMarek Vasut {
36bd39050cSMarek Vasut struct rcar_rwdt *rwdt = (struct rcar_rwdt *)RWDT_BASE;
37bd39050cSMarek Vasut struct rcar_swdt *swdt = (struct rcar_swdt *)SWDT_BASE;
38bd39050cSMarek Vasut
39bd39050cSMarek Vasut /* Watchdog init */
40bd39050cSMarek Vasut writel(0xA5A5A500, &rwdt->rwtcsra);
41bd39050cSMarek Vasut writel(0xA5A5A500, &swdt->swtcsra);
42bd39050cSMarek Vasut
43bd39050cSMarek Vasut writel(0xA5A50000, CPGWPCR);
44bd39050cSMarek Vasut writel(0xFFFFFFFF, CPGWPR);
45bd39050cSMarek Vasut }
46bd39050cSMarek Vasut
47bd39050cSMarek Vasut #define GSX_MSTP112 BIT(12) /* 3DG */
48bd39050cSMarek Vasut #define TMU0_MSTP125 BIT(25) /* secure */
49bd39050cSMarek Vasut #define TMU1_MSTP124 BIT(24) /* non-secure */
50bd39050cSMarek Vasut #define SCIF2_MSTP310 BIT(10) /* SCIF2 */
51bd39050cSMarek Vasut #define ETHERAVB_MSTP812 BIT(12)
52bd39050cSMarek Vasut #define DVFS_MSTP926 BIT(26)
53bd39050cSMarek Vasut #define SD0_MSTP314 BIT(14)
54bd39050cSMarek Vasut #define SD1_MSTP313 BIT(13)
55bd39050cSMarek Vasut #define SD2_MSTP312 BIT(12) /* either MMC0 */
56bd39050cSMarek Vasut
57bd39050cSMarek Vasut #define SD0CKCR 0xE6150074
58bd39050cSMarek Vasut #define SD1CKCR 0xE6150078
59bd39050cSMarek Vasut #define SD2CKCR 0xE6150268
60bd39050cSMarek Vasut #define SD3CKCR 0xE615026C
61bd39050cSMarek Vasut
board_early_init_f(void)62bd39050cSMarek Vasut int board_early_init_f(void)
63bd39050cSMarek Vasut {
64bd39050cSMarek Vasut /* TMU0,1 */ /* which use ? */
65bd39050cSMarek Vasut mstp_clrbits_le32(MSTPSR1, SMSTPCR1, TMU0_MSTP125 | TMU1_MSTP124);
66bd39050cSMarek Vasut /* SCIF2 */
67bd39050cSMarek Vasut mstp_clrbits_le32(MSTPSR3, SMSTPCR3, SCIF2_MSTP310);
68bd39050cSMarek Vasut /* EHTERAVB */
69bd39050cSMarek Vasut mstp_clrbits_le32(MSTPSR8, SMSTPCR8, ETHERAVB_MSTP812);
70bd39050cSMarek Vasut /* eMMC */
71bd39050cSMarek Vasut mstp_clrbits_le32(MSTPSR3, SMSTPCR3, SD1_MSTP313 | SD2_MSTP312);
72bd39050cSMarek Vasut /* SDHI0 */
73bd39050cSMarek Vasut mstp_clrbits_le32(MSTPSR3, SMSTPCR3, SD0_MSTP314);
74bd39050cSMarek Vasut
75*183f5fd3SMarek Vasut writel(1, SD0CKCR);
76*183f5fd3SMarek Vasut writel(1, SD1CKCR);
77*183f5fd3SMarek Vasut writel(1, SD2CKCR);
78*183f5fd3SMarek Vasut writel(1, SD3CKCR);
79bd39050cSMarek Vasut
80bd39050cSMarek Vasut #if defined(CONFIG_SYS_I2C) && defined(CONFIG_SYS_I2C_SH)
81bd39050cSMarek Vasut /* DVFS for reset */
82bd39050cSMarek Vasut mstp_clrbits_le32(MSTPSR9, SMSTPCR9, DVFS_MSTP926);
83bd39050cSMarek Vasut #endif
84bd39050cSMarek Vasut return 0;
85bd39050cSMarek Vasut }
86bd39050cSMarek Vasut
87bd39050cSMarek Vasut /* SYSC */
88bd39050cSMarek Vasut /* R/- 32 Power status register 2(3DG) */
89bd39050cSMarek Vasut #define SYSC_PWRSR2 0xE6180100
90bd39050cSMarek Vasut /* -/W 32 Power resume control register 2 (3DG) */
91bd39050cSMarek Vasut #define SYSC_PWRONCR2 0xE618010C
92bd39050cSMarek Vasut
board_init(void)93bd39050cSMarek Vasut int board_init(void)
94bd39050cSMarek Vasut {
95bd39050cSMarek Vasut /* adress of boot parameters */
96bd39050cSMarek Vasut gd->bd->bi_boot_params = CONFIG_SYS_TEXT_BASE + 0x50000;
97bd39050cSMarek Vasut
98bd39050cSMarek Vasut /* Init PFC controller */
99bd39050cSMarek Vasut #if defined(CONFIG_R8A7795)
100bd39050cSMarek Vasut r8a7795_pinmux_init();
101bd39050cSMarek Vasut #elif defined(CONFIG_R8A7796)
102bd39050cSMarek Vasut r8a7796_pinmux_init();
103bd39050cSMarek Vasut #endif
104bd39050cSMarek Vasut
105bd39050cSMarek Vasut /* USB1 pull-up */
106bd39050cSMarek Vasut setbits_le32(PFC_PUEN6, PUEN_USB1_OVC | PUEN_USB1_PWEN);
107bd39050cSMarek Vasut
1083158b6f6SMarek Vasut #ifdef CONFIG_RENESAS_RAVB
109bd39050cSMarek Vasut /* EtherAVB Enable */
110bd39050cSMarek Vasut /* GPSR2 */
111bd39050cSMarek Vasut gpio_request(GPIO_GFN_AVB_AVTP_CAPTURE_A, NULL);
112bd39050cSMarek Vasut gpio_request(GPIO_GFN_AVB_AVTP_MATCH_A, NULL);
113bd39050cSMarek Vasut gpio_request(GPIO_GFN_AVB_LINK, NULL);
114bd39050cSMarek Vasut gpio_request(GPIO_GFN_AVB_PHY_INT, NULL);
115bd39050cSMarek Vasut gpio_request(GPIO_GFN_AVB_MAGIC, NULL);
116bd39050cSMarek Vasut gpio_request(GPIO_GFN_AVB_MDC, NULL);
117bd39050cSMarek Vasut
118bd39050cSMarek Vasut /* IPSR0 */
119bd39050cSMarek Vasut gpio_request(GPIO_IFN_AVB_MDC, NULL);
120bd39050cSMarek Vasut gpio_request(GPIO_IFN_AVB_MAGIC, NULL);
121bd39050cSMarek Vasut gpio_request(GPIO_IFN_AVB_PHY_INT, NULL);
122bd39050cSMarek Vasut gpio_request(GPIO_IFN_AVB_LINK, NULL);
123bd39050cSMarek Vasut gpio_request(GPIO_IFN_AVB_AVTP_MATCH_A, NULL);
124bd39050cSMarek Vasut gpio_request(GPIO_IFN_AVB_AVTP_CAPTURE_A, NULL);
125bd39050cSMarek Vasut /* IPSR1 */
126bd39050cSMarek Vasut gpio_request(GPIO_FN_AVB_AVTP_PPS, NULL);
127bd39050cSMarek Vasut /* IPSR2 */
128bd39050cSMarek Vasut gpio_request(GPIO_FN_AVB_AVTP_MATCH_B, NULL);
129bd39050cSMarek Vasut /* IPSR3 */
130bd39050cSMarek Vasut gpio_request(GPIO_FN_AVB_AVTP_CAPTURE_B, NULL);
131bd39050cSMarek Vasut
132bd39050cSMarek Vasut /* AVB_PHY_RST */
133bd39050cSMarek Vasut gpio_request(GPIO_GP_2_10, NULL);
134bd39050cSMarek Vasut gpio_direction_output(GPIO_GP_2_10, 0);
135bd39050cSMarek Vasut mdelay(20);
136bd39050cSMarek Vasut gpio_set_value(GPIO_GP_2_10, 1);
137bd39050cSMarek Vasut udelay(1);
138bd39050cSMarek Vasut #endif
139bd39050cSMarek Vasut
1408212f563SMarek Vasut #ifdef CONFIG_MMC
141bd39050cSMarek Vasut /* SDHI0 */
142bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD0_DAT0, NULL);
143bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD0_DAT1, NULL);
144bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD0_DAT2, NULL);
145bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD0_DAT3, NULL);
146bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD0_CLK, NULL);
147bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD0_CMD, NULL);
148bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD0_CD, NULL);
149bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD0_WP, NULL);
150bd39050cSMarek Vasut
151bd39050cSMarek Vasut gpio_request(GPIO_GP_5_2, NULL);
152bd39050cSMarek Vasut gpio_request(GPIO_GP_5_1, NULL);
153bd39050cSMarek Vasut gpio_direction_output(GPIO_GP_5_2, 1); /* power on */
154bd39050cSMarek Vasut gpio_direction_output(GPIO_GP_5_1, 1); /* 1: 3.3V, 0: 1.8V */
155bd39050cSMarek Vasut
156bd39050cSMarek Vasut /* SDHI1/SDHI2 eMMC */
157bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD1_DAT0, NULL);
158bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD1_DAT1, NULL);
159bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD1_DAT2, NULL);
160bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD1_DAT3, NULL);
161bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD2_DAT0, NULL);
162bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD2_DAT1, NULL);
163bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD2_DAT2, NULL);
164bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD2_DAT3, NULL);
165bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD2_CLK, NULL);
166bd39050cSMarek Vasut #if defined(CONFIG_R8A7795)
167bd39050cSMarek Vasut gpio_request(GPIO_GFN_SD2_CMD, NULL);
168bd39050cSMarek Vasut #elif defined(CONFIG_R8A7796)
169bd39050cSMarek Vasut gpio_request(GPIO_FN_SD2_CMD, NULL);
170bd39050cSMarek Vasut #else
171bd39050cSMarek Vasut #error Only R8A7795 and R87796 is supported
172bd39050cSMarek Vasut #endif
173bd39050cSMarek Vasut gpio_request(GPIO_GP_5_3, NULL);
174bd39050cSMarek Vasut gpio_request(GPIO_GP_5_9, NULL);
175bd39050cSMarek Vasut gpio_direction_output(GPIO_GP_5_3, 0); /* 1: 3.3V, 0: 1.8V */
176bd39050cSMarek Vasut gpio_direction_output(GPIO_GP_5_9, 0); /* 1: 3.3V, 0: 1.8V */
1778212f563SMarek Vasut #endif
178bd39050cSMarek Vasut
1796f380854SMarek Vasut return 0;
180bd39050cSMarek Vasut }
181bd39050cSMarek Vasut
dram_init(void)182bd39050cSMarek Vasut int dram_init(void)
183bd39050cSMarek Vasut {
184bd39050cSMarek Vasut gd->ram_size = PHYS_SDRAM_1_SIZE;
185bd39050cSMarek Vasut #if (CONFIG_NR_DRAM_BANKS >= 2)
186bd39050cSMarek Vasut gd->ram_size += PHYS_SDRAM_2_SIZE;
187bd39050cSMarek Vasut #endif
188bd39050cSMarek Vasut #if (CONFIG_NR_DRAM_BANKS >= 3)
189bd39050cSMarek Vasut gd->ram_size += PHYS_SDRAM_3_SIZE;
190bd39050cSMarek Vasut #endif
191bd39050cSMarek Vasut #if (CONFIG_NR_DRAM_BANKS >= 4)
192bd39050cSMarek Vasut gd->ram_size += PHYS_SDRAM_4_SIZE;
193bd39050cSMarek Vasut #endif
194bd39050cSMarek Vasut
195bd39050cSMarek Vasut return 0;
196bd39050cSMarek Vasut }
197bd39050cSMarek Vasut
dram_init_banksize(void)198bd39050cSMarek Vasut int dram_init_banksize(void)
199bd39050cSMarek Vasut {
200bd39050cSMarek Vasut gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
201bd39050cSMarek Vasut gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
202bd39050cSMarek Vasut #if (CONFIG_NR_DRAM_BANKS >= 2)
203bd39050cSMarek Vasut gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
204bd39050cSMarek Vasut gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE;
205bd39050cSMarek Vasut #endif
206bd39050cSMarek Vasut #if (CONFIG_NR_DRAM_BANKS >= 3)
207bd39050cSMarek Vasut gd->bd->bi_dram[2].start = PHYS_SDRAM_3;
208bd39050cSMarek Vasut gd->bd->bi_dram[2].size = PHYS_SDRAM_3_SIZE;
209bd39050cSMarek Vasut #endif
210bd39050cSMarek Vasut #if (CONFIG_NR_DRAM_BANKS >= 4)
211bd39050cSMarek Vasut gd->bd->bi_dram[3].start = PHYS_SDRAM_4;
212bd39050cSMarek Vasut gd->bd->bi_dram[3].size = PHYS_SDRAM_4_SIZE;
213bd39050cSMarek Vasut #endif
214bd39050cSMarek Vasut return 0;
215bd39050cSMarek Vasut }
216bd39050cSMarek Vasut
217bd39050cSMarek Vasut const struct rmobile_sysinfo sysinfo = {
218bd39050cSMarek Vasut CONFIG_RCAR_BOARD_STRING
219bd39050cSMarek Vasut };
220