121871138SVladimir Barinov /* 221871138SVladimir Barinov * board/renesas/stout/stout.c 321871138SVladimir Barinov * This file is Stout board support. 421871138SVladimir Barinov * 521871138SVladimir Barinov * Copyright (C) 2015 Renesas Electronics Europe GmbH 621871138SVladimir Barinov * Copyright (C) 2015 Renesas Electronics Corporation 721871138SVladimir Barinov * Copyright (C) 2015 Cogent Embedded, Inc. 821871138SVladimir Barinov * 921871138SVladimir Barinov * SPDX-License-Identifier: GPL-2.0 1021871138SVladimir Barinov */ 1121871138SVladimir Barinov 1221871138SVladimir Barinov #include <common.h> 1321871138SVladimir Barinov #include <malloc.h> 1421871138SVladimir Barinov #include <netdev.h> 1521871138SVladimir Barinov #include <dm.h> 1621871138SVladimir Barinov #include <dm/platform_data/serial_sh.h> 179925f1dbSAlex Kiernan #include <environment.h> 1821871138SVladimir Barinov #include <asm/processor.h> 1921871138SVladimir Barinov #include <asm/mach-types.h> 2021871138SVladimir Barinov #include <asm/io.h> 211221ce45SMasahiro Yamada #include <linux/errno.h> 2221871138SVladimir Barinov #include <asm/arch/sys_proto.h> 2321871138SVladimir Barinov #include <asm/gpio.h> 2421871138SVladimir Barinov #include <asm/arch/rmobile.h> 2521871138SVladimir Barinov #include <asm/arch/rcar-mstp.h> 2621871138SVladimir Barinov #include <asm/arch/mmc.h> 2721871138SVladimir Barinov #include <asm/arch/sh_sdhi.h> 2821871138SVladimir Barinov #include <miiphy.h> 2921871138SVladimir Barinov #include <i2c.h> 3021871138SVladimir Barinov #include <mmc.h> 3121871138SVladimir Barinov #include "qos.h" 3221871138SVladimir Barinov #include "cpld.h" 3321871138SVladimir Barinov 3421871138SVladimir Barinov DECLARE_GLOBAL_DATA_PTR; 3521871138SVladimir Barinov 3621871138SVladimir Barinov #define CLK2MHZ(clk) (clk / 1000 / 1000) 3721871138SVladimir Barinov void s_init(void) 3821871138SVladimir Barinov { 3921871138SVladimir Barinov struct rcar_rwdt *rwdt = (struct rcar_rwdt *)RWDT_BASE; 4021871138SVladimir Barinov struct rcar_swdt *swdt = (struct rcar_swdt *)SWDT_BASE; 4121871138SVladimir Barinov 4221871138SVladimir Barinov /* Watchdog init */ 4321871138SVladimir Barinov writel(0xA5A5A500, &rwdt->rwtcsra); 4421871138SVladimir Barinov writel(0xA5A5A500, &swdt->swtcsra); 4521871138SVladimir Barinov 4621871138SVladimir Barinov /* CPU frequency setting. Set to 1.4GHz */ 4721871138SVladimir Barinov if (rmobile_get_cpu_rev_integer() >= R8A7790_CUT_ES2X) { 4821871138SVladimir Barinov u32 stat = 0; 4921871138SVladimir Barinov u32 stc = ((1400 / CLK2MHZ(CONFIG_SYS_CLK_FREQ)) - 1) 5021871138SVladimir Barinov << PLL0_STC_BIT; 5121871138SVladimir Barinov clrsetbits_le32(PLL0CR, PLL0_STC_MASK, stc); 5221871138SVladimir Barinov 5321871138SVladimir Barinov do { 5421871138SVladimir Barinov stat = readl(PLLECR) & PLL0ST; 5521871138SVladimir Barinov } while (stat == 0x0); 5621871138SVladimir Barinov } 5721871138SVladimir Barinov 5821871138SVladimir Barinov /* QoS(Quality-of-Service) Init */ 5921871138SVladimir Barinov qos_init(); 6021871138SVladimir Barinov } 6121871138SVladimir Barinov 62ec7113fbSMarek Vasut #define TMU0_MSTP125 BIT(25) 6321871138SVladimir Barinov 6421871138SVladimir Barinov #define SD2CKCR 0xE6150078 6521871138SVladimir Barinov #define SD2_97500KHZ 0x7 6621871138SVladimir Barinov 6721871138SVladimir Barinov int board_early_init_f(void) 6821871138SVladimir Barinov { 6921871138SVladimir Barinov /* TMU0 */ 7021871138SVladimir Barinov mstp_clrbits_le32(MSTPSR1, SMSTPCR1, TMU0_MSTP125); 7121871138SVladimir Barinov 7221871138SVladimir Barinov /* 7321871138SVladimir Barinov * SD0 clock is set to 97.5MHz by default. 7421871138SVladimir Barinov * Set SD2 to the 97.5MHz as well. 7521871138SVladimir Barinov */ 7621871138SVladimir Barinov writel(SD2_97500KHZ, SD2CKCR); 7721871138SVladimir Barinov 7821871138SVladimir Barinov return 0; 7921871138SVladimir Barinov } 8021871138SVladimir Barinov 81ec7113fbSMarek Vasut #define ETHERNET_PHY_RESET 123 /* GPIO 3 31 */ 82ec7113fbSMarek Vasut 8321871138SVladimir Barinov int board_init(void) 8421871138SVladimir Barinov { 8521871138SVladimir Barinov /* adress of boot parameters */ 8621871138SVladimir Barinov gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; 8721871138SVladimir Barinov 8821871138SVladimir Barinov cpld_init(); 8921871138SVladimir Barinov 90ec7113fbSMarek Vasut /* Force ethernet PHY out of reset */ 91ec7113fbSMarek Vasut gpio_request(ETHERNET_PHY_RESET, "phy_reset"); 92ec7113fbSMarek Vasut gpio_direction_output(ETHERNET_PHY_RESET, 0); 9321871138SVladimir Barinov mdelay(20); 94ec7113fbSMarek Vasut gpio_direction_output(ETHERNET_PHY_RESET, 1); 9521871138SVladimir Barinov 9621871138SVladimir Barinov return 0; 9721871138SVladimir Barinov } 9821871138SVladimir Barinov 99ec7113fbSMarek Vasut int dram_init(void) 10021871138SVladimir Barinov { 101ec7113fbSMarek Vasut if (fdtdec_setup_memory_size() != 0) 102ec7113fbSMarek Vasut return -EINVAL; 10321871138SVladimir Barinov 104ec7113fbSMarek Vasut return 0; 105ec7113fbSMarek Vasut } 10621871138SVladimir Barinov 107ec7113fbSMarek Vasut int dram_init_banksize(void) 108ec7113fbSMarek Vasut { 109ec7113fbSMarek Vasut fdtdec_setup_memory_banksize(); 11021871138SVladimir Barinov 111ec7113fbSMarek Vasut return 0; 11221871138SVladimir Barinov } 11321871138SVladimir Barinov 11421871138SVladimir Barinov /* Stout has KSZ8041NL/RNL */ 11521871138SVladimir Barinov #define PHY_CONTROL1 0x1E 11621871138SVladimir Barinov #define PHY_LED_MODE 0xC0000 11721871138SVladimir Barinov #define PHY_LED_MODE_ACK 0x4000 11821871138SVladimir Barinov int board_phy_config(struct phy_device *phydev) 11921871138SVladimir Barinov { 12021871138SVladimir Barinov int ret = phy_read(phydev, MDIO_DEVAD_NONE, PHY_CONTROL1); 12121871138SVladimir Barinov ret &= ~PHY_LED_MODE; 12221871138SVladimir Barinov ret |= PHY_LED_MODE_ACK; 12321871138SVladimir Barinov ret = phy_write(phydev, MDIO_DEVAD_NONE, PHY_CONTROL1, (u16)ret); 12421871138SVladimir Barinov 12521871138SVladimir Barinov return 0; 12621871138SVladimir Barinov } 12721871138SVladimir Barinov 12821871138SVladimir Barinov const struct rmobile_sysinfo sysinfo = { 1291cc95f6eSNobuhiro Iwamatsu CONFIG_ARCH_RMOBILE_BOARD_STRING 13021871138SVladimir Barinov }; 131*a3c159b9SMarek Vasut 132*a3c159b9SMarek Vasut enum env_location env_get_location(enum env_operation op, int prio) 133*a3c159b9SMarek Vasut { 134*a3c159b9SMarek Vasut const u32 load_magic = 0xb33fc0de; 135*a3c159b9SMarek Vasut 136*a3c159b9SMarek Vasut /* Block environment access if loaded using JTAG */ 137*a3c159b9SMarek Vasut if ((readl(CONFIG_SPL_TEXT_BASE + 0x24) == load_magic) && 138*a3c159b9SMarek Vasut (op != ENVOP_INIT)) 139*a3c159b9SMarek Vasut return ENVL_UNKNOWN; 140*a3c159b9SMarek Vasut 141*a3c159b9SMarek Vasut if (prio) 142*a3c159b9SMarek Vasut return ENVL_UNKNOWN; 143*a3c159b9SMarek Vasut 144*a3c159b9SMarek Vasut return ENVL_SPI_FLASH; 145*a3c159b9SMarek Vasut } 146