1983e3700STom Rini /* 2983e3700STom Rini * board.c 3983e3700STom Rini * 4983e3700STom Rini * Common board functions for AM33XX based boards 5983e3700STom Rini * 6983e3700STom Rini * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/ 7983e3700STom Rini * 8983e3700STom Rini * SPDX-License-Identifier: GPL-2.0+ 9983e3700STom Rini */ 10983e3700STom Rini 11983e3700STom Rini #include <common.h> 12983e3700STom Rini #include <dm.h> 13*878d8856SLokesh Vutla #include <debug_uart.h> 14983e3700STom Rini #include <errno.h> 15983e3700STom Rini #include <ns16550.h> 16983e3700STom Rini #include <spl.h> 17983e3700STom Rini #include <asm/arch/cpu.h> 18983e3700STom Rini #include <asm/arch/hardware.h> 19983e3700STom Rini #include <asm/arch/omap.h> 20983e3700STom Rini #include <asm/arch/ddr_defs.h> 21983e3700STom Rini #include <asm/arch/clock.h> 22983e3700STom Rini #include <asm/arch/gpio.h> 23983e3700STom Rini #include <asm/arch/mem.h> 24983e3700STom Rini #include <asm/arch/mmc_host_def.h> 25983e3700STom Rini #include <asm/arch/sys_proto.h> 26983e3700STom Rini #include <asm/io.h> 27983e3700STom Rini #include <asm/emif.h> 28983e3700STom Rini #include <asm/gpio.h> 29983e3700STom Rini #include <i2c.h> 30983e3700STom Rini #include <miiphy.h> 31983e3700STom Rini #include <cpsw.h> 32983e3700STom Rini #include <linux/errno.h> 33983e3700STom Rini #include <linux/compiler.h> 34983e3700STom Rini #include <linux/usb/ch9.h> 35983e3700STom Rini #include <linux/usb/gadget.h> 36983e3700STom Rini #include <linux/usb/musb.h> 37983e3700STom Rini #include <asm/omap_musb.h> 38983e3700STom Rini #include <asm/davinci_rtc.h> 39983e3700STom Rini 40983e3700STom Rini DECLARE_GLOBAL_DATA_PTR; 41983e3700STom Rini 42983e3700STom Rini #if !CONFIG_IS_ENABLED(OF_CONTROL) 43983e3700STom Rini static const struct ns16550_platdata am33xx_serial[] = { 4417fa0326SHeiko Schocher { .base = CONFIG_SYS_NS16550_COM1, .reg_shift = 2, 4517fa0326SHeiko Schocher .clock = CONFIG_SYS_NS16550_CLK, .fcr = UART_FCR_DEFVAL, }, 46983e3700STom Rini # ifdef CONFIG_SYS_NS16550_COM2 4717fa0326SHeiko Schocher { .base = CONFIG_SYS_NS16550_COM2, .reg_shift = 2, 4817fa0326SHeiko Schocher .clock = CONFIG_SYS_NS16550_CLK, .fcr = UART_FCR_DEFVAL, }, 49983e3700STom Rini # ifdef CONFIG_SYS_NS16550_COM3 5017fa0326SHeiko Schocher { .base = CONFIG_SYS_NS16550_COM3, .reg_shift = 2, 5117fa0326SHeiko Schocher .clock = CONFIG_SYS_NS16550_CLK, .fcr = UART_FCR_DEFVAL, }, 5217fa0326SHeiko Schocher { .base = CONFIG_SYS_NS16550_COM4, .reg_shift = 2, 5317fa0326SHeiko Schocher .clock = CONFIG_SYS_NS16550_CLK, .fcr = UART_FCR_DEFVAL, }, 5417fa0326SHeiko Schocher { .base = CONFIG_SYS_NS16550_COM5, .reg_shift = 2, 5517fa0326SHeiko Schocher .clock = CONFIG_SYS_NS16550_CLK, .fcr = UART_FCR_DEFVAL, }, 5617fa0326SHeiko Schocher { .base = CONFIG_SYS_NS16550_COM6, .reg_shift = 2, 5717fa0326SHeiko Schocher .clock = CONFIG_SYS_NS16550_CLK, .fcr = UART_FCR_DEFVAL, }, 58983e3700STom Rini # endif 59983e3700STom Rini # endif 60983e3700STom Rini }; 61983e3700STom Rini 62983e3700STom Rini U_BOOT_DEVICES(am33xx_uarts) = { 63983e3700STom Rini { "ns16550_serial", &am33xx_serial[0] }, 64983e3700STom Rini # ifdef CONFIG_SYS_NS16550_COM2 65983e3700STom Rini { "ns16550_serial", &am33xx_serial[1] }, 66983e3700STom Rini # ifdef CONFIG_SYS_NS16550_COM3 67983e3700STom Rini { "ns16550_serial", &am33xx_serial[2] }, 68983e3700STom Rini { "ns16550_serial", &am33xx_serial[3] }, 69983e3700STom Rini { "ns16550_serial", &am33xx_serial[4] }, 70983e3700STom Rini { "ns16550_serial", &am33xx_serial[5] }, 71983e3700STom Rini # endif 72983e3700STom Rini # endif 73983e3700STom Rini }; 74983e3700STom Rini 75983e3700STom Rini #ifdef CONFIG_DM_GPIO 76983e3700STom Rini static const struct omap_gpio_platdata am33xx_gpio[] = { 77983e3700STom Rini { 0, AM33XX_GPIO0_BASE }, 78983e3700STom Rini { 1, AM33XX_GPIO1_BASE }, 79983e3700STom Rini { 2, AM33XX_GPIO2_BASE }, 80983e3700STom Rini { 3, AM33XX_GPIO3_BASE }, 81983e3700STom Rini #ifdef CONFIG_AM43XX 82983e3700STom Rini { 4, AM33XX_GPIO4_BASE }, 83983e3700STom Rini { 5, AM33XX_GPIO5_BASE }, 84983e3700STom Rini #endif 85983e3700STom Rini }; 86983e3700STom Rini 87983e3700STom Rini U_BOOT_DEVICES(am33xx_gpios) = { 88983e3700STom Rini { "gpio_omap", &am33xx_gpio[0] }, 89983e3700STom Rini { "gpio_omap", &am33xx_gpio[1] }, 90983e3700STom Rini { "gpio_omap", &am33xx_gpio[2] }, 91983e3700STom Rini { "gpio_omap", &am33xx_gpio[3] }, 92983e3700STom Rini #ifdef CONFIG_AM43XX 93983e3700STom Rini { "gpio_omap", &am33xx_gpio[4] }, 94983e3700STom Rini { "gpio_omap", &am33xx_gpio[5] }, 95983e3700STom Rini #endif 96983e3700STom Rini }; 97983e3700STom Rini #endif 98983e3700STom Rini #endif 99983e3700STom Rini 100983e3700STom Rini #ifndef CONFIG_DM_GPIO 101983e3700STom Rini static const struct gpio_bank gpio_bank_am33xx[] = { 102983e3700STom Rini { (void *)AM33XX_GPIO0_BASE }, 103983e3700STom Rini { (void *)AM33XX_GPIO1_BASE }, 104983e3700STom Rini { (void *)AM33XX_GPIO2_BASE }, 105983e3700STom Rini { (void *)AM33XX_GPIO3_BASE }, 106983e3700STom Rini #ifdef CONFIG_AM43XX 107983e3700STom Rini { (void *)AM33XX_GPIO4_BASE }, 108983e3700STom Rini { (void *)AM33XX_GPIO5_BASE }, 109983e3700STom Rini #endif 110983e3700STom Rini }; 111983e3700STom Rini 112983e3700STom Rini const struct gpio_bank *const omap_gpio_bank = gpio_bank_am33xx; 113983e3700STom Rini #endif 114983e3700STom Rini 115d5abcf94SJean-Jacques Hiblot #if defined(CONFIG_MMC_OMAP_HS) 116983e3700STom Rini int cpu_mmc_init(bd_t *bis) 117983e3700STom Rini { 118983e3700STom Rini int ret; 119983e3700STom Rini 120983e3700STom Rini ret = omap_mmc_init(0, 0, 0, -1, -1); 121983e3700STom Rini if (ret) 122983e3700STom Rini return ret; 123983e3700STom Rini 124983e3700STom Rini return omap_mmc_init(1, 0, 0, -1, -1); 125983e3700STom Rini } 126983e3700STom Rini #endif 127983e3700STom Rini 128983e3700STom Rini /* AM33XX has two MUSB controllers which can be host or gadget */ 129983e3700STom Rini #if (defined(CONFIG_USB_MUSB_GADGET) || defined(CONFIG_USB_MUSB_HOST)) && \ 13019570221SMugunthan V N (defined(CONFIG_AM335X_USB0) || defined(CONFIG_AM335X_USB1)) && \ 13119570221SMugunthan V N (!defined(CONFIG_DM_USB)) 132983e3700STom Rini static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE; 133983e3700STom Rini 134983e3700STom Rini /* USB 2.0 PHY Control */ 135983e3700STom Rini #define CM_PHY_PWRDN (1 << 0) 136983e3700STom Rini #define CM_PHY_OTG_PWRDN (1 << 1) 137983e3700STom Rini #define OTGVDET_EN (1 << 19) 138983e3700STom Rini #define OTGSESSENDEN (1 << 20) 139983e3700STom Rini 140983e3700STom Rini static void am33xx_usb_set_phy_power(u8 on, u32 *reg_addr) 141983e3700STom Rini { 142983e3700STom Rini if (on) { 143983e3700STom Rini clrsetbits_le32(reg_addr, CM_PHY_PWRDN | CM_PHY_OTG_PWRDN, 144983e3700STom Rini OTGVDET_EN | OTGSESSENDEN); 145983e3700STom Rini } else { 146983e3700STom Rini clrsetbits_le32(reg_addr, 0, CM_PHY_PWRDN | CM_PHY_OTG_PWRDN); 147983e3700STom Rini } 148983e3700STom Rini } 149983e3700STom Rini 150983e3700STom Rini static struct musb_hdrc_config musb_config = { 151983e3700STom Rini .multipoint = 1, 152983e3700STom Rini .dyn_fifo = 1, 153983e3700STom Rini .num_eps = 16, 154983e3700STom Rini .ram_bits = 12, 155983e3700STom Rini }; 156983e3700STom Rini 157983e3700STom Rini #ifdef CONFIG_AM335X_USB0 1581cac34ceSMugunthan V N static void am33xx_otg0_set_phy_power(struct udevice *dev, u8 on) 159983e3700STom Rini { 160983e3700STom Rini am33xx_usb_set_phy_power(on, &cdev->usb_ctrl0); 161983e3700STom Rini } 162983e3700STom Rini 163983e3700STom Rini struct omap_musb_board_data otg0_board_data = { 164983e3700STom Rini .set_phy_power = am33xx_otg0_set_phy_power, 165983e3700STom Rini }; 166983e3700STom Rini 167983e3700STom Rini static struct musb_hdrc_platform_data otg0_plat = { 168983e3700STom Rini .mode = CONFIG_AM335X_USB0_MODE, 169983e3700STom Rini .config = &musb_config, 170983e3700STom Rini .power = 50, 171983e3700STom Rini .platform_ops = &musb_dsps_ops, 172983e3700STom Rini .board_data = &otg0_board_data, 173983e3700STom Rini }; 174983e3700STom Rini #endif 175983e3700STom Rini 176983e3700STom Rini #ifdef CONFIG_AM335X_USB1 1771cac34ceSMugunthan V N static void am33xx_otg1_set_phy_power(struct udevice *dev, u8 on) 178983e3700STom Rini { 179983e3700STom Rini am33xx_usb_set_phy_power(on, &cdev->usb_ctrl1); 180983e3700STom Rini } 181983e3700STom Rini 182983e3700STom Rini struct omap_musb_board_data otg1_board_data = { 183983e3700STom Rini .set_phy_power = am33xx_otg1_set_phy_power, 184983e3700STom Rini }; 185983e3700STom Rini 186983e3700STom Rini static struct musb_hdrc_platform_data otg1_plat = { 187983e3700STom Rini .mode = CONFIG_AM335X_USB1_MODE, 188983e3700STom Rini .config = &musb_config, 189983e3700STom Rini .power = 50, 190983e3700STom Rini .platform_ops = &musb_dsps_ops, 191983e3700STom Rini .board_data = &otg1_board_data, 192983e3700STom Rini }; 193983e3700STom Rini #endif 194983e3700STom Rini #endif 195983e3700STom Rini 196983e3700STom Rini int arch_misc_init(void) 197983e3700STom Rini { 19819570221SMugunthan V N #ifndef CONFIG_DM_USB 199983e3700STom Rini #ifdef CONFIG_AM335X_USB0 200983e3700STom Rini musb_register(&otg0_plat, &otg0_board_data, 201983e3700STom Rini (void *)USB0_OTG_BASE); 202983e3700STom Rini #endif 203983e3700STom Rini #ifdef CONFIG_AM335X_USB1 204983e3700STom Rini musb_register(&otg1_plat, &otg1_board_data, 205983e3700STom Rini (void *)USB1_OTG_BASE); 206983e3700STom Rini #endif 2073aec2648SMugunthan V N #else 2083aec2648SMugunthan V N struct udevice *dev; 2093aec2648SMugunthan V N int ret; 2103aec2648SMugunthan V N 2113aec2648SMugunthan V N ret = uclass_first_device(UCLASS_MISC, &dev); 2123aec2648SMugunthan V N if (ret || !dev) 2133aec2648SMugunthan V N return ret; 214ba7916c7SMugunthan V N 215ba7916c7SMugunthan V N #if defined(CONFIG_DM_ETH) && defined(CONFIG_USB_ETHER) 216ba7916c7SMugunthan V N ret = usb_ether_init(); 217ba7916c7SMugunthan V N if (ret) { 218ba7916c7SMugunthan V N error("USB ether init failed\n"); 219ba7916c7SMugunthan V N return ret; 220ba7916c7SMugunthan V N } 221ba7916c7SMugunthan V N #endif 22219570221SMugunthan V N #endif 223983e3700STom Rini return 0; 224983e3700STom Rini } 225983e3700STom Rini 226983e3700STom Rini #ifndef CONFIG_SKIP_LOWLEVEL_INIT 227983e3700STom Rini /* 228983e3700STom Rini * In the case of non-SPL based booting we'll want to call these 229983e3700STom Rini * functions a tiny bit later as it will require gd to be set and cleared 230983e3700STom Rini * and that's not true in s_init in this case so we cannot do it there. 231983e3700STom Rini */ 232983e3700STom Rini int board_early_init_f(void) 233983e3700STom Rini { 234983e3700STom Rini prcm_init(); 235983e3700STom Rini set_mux_conf_regs(); 236983e3700STom Rini 237983e3700STom Rini return 0; 238983e3700STom Rini } 239983e3700STom Rini 240983e3700STom Rini /* 241983e3700STom Rini * This function is the place to do per-board things such as ramp up the 242983e3700STom Rini * MPU clock frequency. 243983e3700STom Rini */ 244983e3700STom Rini __weak void am33xx_spl_board_init(void) 245983e3700STom Rini { 246983e3700STom Rini } 247983e3700STom Rini 248983e3700STom Rini #if defined(CONFIG_SPL_AM33XX_ENABLE_RTC32K_OSC) 249983e3700STom Rini static void rtc32k_enable(void) 250983e3700STom Rini { 251983e3700STom Rini struct davinci_rtc *rtc = (struct davinci_rtc *)RTC_BASE; 252983e3700STom Rini 253983e3700STom Rini /* 254983e3700STom Rini * Unlock the RTC's registers. For more details please see the 255983e3700STom Rini * RTC_SS section of the TRM. In order to unlock we need to 256983e3700STom Rini * write these specific values (keys) in this order. 257983e3700STom Rini */ 258983e3700STom Rini writel(RTC_KICK0R_WE, &rtc->kick0r); 259983e3700STom Rini writel(RTC_KICK1R_WE, &rtc->kick1r); 260983e3700STom Rini 261983e3700STom Rini /* Enable the RTC 32K OSC by setting bits 3 and 6. */ 262983e3700STom Rini writel((1 << 3) | (1 << 6), &rtc->osc); 263983e3700STom Rini } 264983e3700STom Rini #endif 265983e3700STom Rini 266983e3700STom Rini static void uart_soft_reset(void) 267983e3700STom Rini { 268983e3700STom Rini struct uart_sys *uart_base = (struct uart_sys *)DEFAULT_UART_BASE; 269983e3700STom Rini u32 regval; 270983e3700STom Rini 271983e3700STom Rini regval = readl(&uart_base->uartsyscfg); 272983e3700STom Rini regval |= UART_RESET; 273983e3700STom Rini writel(regval, &uart_base->uartsyscfg); 274983e3700STom Rini while ((readl(&uart_base->uartsyssts) & 275983e3700STom Rini UART_CLK_RUNNING_MASK) != UART_CLK_RUNNING_MASK) 276983e3700STom Rini ; 277983e3700STom Rini 278983e3700STom Rini /* Disable smart idle */ 279983e3700STom Rini regval = readl(&uart_base->uartsyscfg); 280983e3700STom Rini regval |= UART_SMART_IDLE_EN; 281983e3700STom Rini writel(regval, &uart_base->uartsyscfg); 282983e3700STom Rini } 283983e3700STom Rini 284983e3700STom Rini static void watchdog_disable(void) 285983e3700STom Rini { 286983e3700STom Rini struct wd_timer *wdtimer = (struct wd_timer *)WDT_BASE; 287983e3700STom Rini 288983e3700STom Rini writel(0xAAAA, &wdtimer->wdtwspr); 289983e3700STom Rini while (readl(&wdtimer->wdtwwps) != 0x0) 290983e3700STom Rini ; 291983e3700STom Rini writel(0x5555, &wdtimer->wdtwspr); 292983e3700STom Rini while (readl(&wdtimer->wdtwwps) != 0x0) 293983e3700STom Rini ; 294983e3700STom Rini } 295983e3700STom Rini 296983e3700STom Rini void s_init(void) 297983e3700STom Rini { 298983e3700STom Rini } 299983e3700STom Rini 300983e3700STom Rini void early_system_init(void) 301983e3700STom Rini { 302983e3700STom Rini /* 303983e3700STom Rini * The ROM will only have set up sufficient pinmux to allow for the 304983e3700STom Rini * first 4KiB NOR to be read, we must finish doing what we know of 305983e3700STom Rini * the NOR mux in this space in order to continue. 306983e3700STom Rini */ 307983e3700STom Rini #ifdef CONFIG_NOR_BOOT 308983e3700STom Rini enable_norboot_pin_mux(); 309983e3700STom Rini #endif 310983e3700STom Rini watchdog_disable(); 311983e3700STom Rini set_uart_mux_conf(); 312983e3700STom Rini setup_early_clocks(); 313983e3700STom Rini uart_soft_reset(); 314*878d8856SLokesh Vutla #ifdef CONFIG_DEBUG_UART_OMAP 315*878d8856SLokesh Vutla debug_uart_init(); 316*878d8856SLokesh Vutla #endif 317983e3700STom Rini #ifdef CONFIG_TI_I2C_BOARD_DETECT 318983e3700STom Rini do_board_detect(); 319983e3700STom Rini #endif 320983e3700STom Rini #if defined(CONFIG_SPL_AM33XX_ENABLE_RTC32K_OSC) 321983e3700STom Rini /* Enable RTC32K clock */ 322983e3700STom Rini rtc32k_enable(); 323983e3700STom Rini #endif 324983e3700STom Rini } 325983e3700STom Rini 326983e3700STom Rini #ifdef CONFIG_SPL_BUILD 327983e3700STom Rini void board_init_f(ulong dummy) 328983e3700STom Rini { 329983e3700STom Rini early_system_init(); 330983e3700STom Rini board_early_init_f(); 331983e3700STom Rini sdram_init(); 33286282798SLokesh Vutla /* dram_init must store complete ramsize in gd->ram_size */ 33386282798SLokesh Vutla gd->ram_size = get_ram_size( 33486282798SLokesh Vutla (void *)CONFIG_SYS_SDRAM_BASE, 33586282798SLokesh Vutla CONFIG_MAX_RAM_BANK_SIZE); 336983e3700STom Rini } 337983e3700STom Rini #endif 338983e3700STom Rini 339983e3700STom Rini #endif 340983e3700STom Rini 341983e3700STom Rini int arch_cpu_init_dm(void) 342983e3700STom Rini { 343983e3700STom Rini #ifndef CONFIG_SKIP_LOWLEVEL_INIT 344983e3700STom Rini early_system_init(); 345983e3700STom Rini #endif 346983e3700STom Rini return 0; 347983e3700STom Rini } 348