1c0dcece7SHeiko Schocher /* 2c0dcece7SHeiko Schocher * Common board functions for siemens AM335X based boards 3c0dcece7SHeiko Schocher * (C) Copyright 2013 Siemens Schweiz AG 4c0dcece7SHeiko Schocher * (C) Heiko Schocher, DENX Software Engineering, hs@denx.de. 5c0dcece7SHeiko Schocher * 6c0dcece7SHeiko Schocher * Based on: 7c0dcece7SHeiko Schocher * U-Boot file:/board/ti/am335x/board.c 8c0dcece7SHeiko Schocher * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/ 9c0dcece7SHeiko Schocher * 10c0dcece7SHeiko Schocher * SPDX-License-Identifier: GPL-2.0+ 11c0dcece7SHeiko Schocher */ 12c0dcece7SHeiko Schocher 13c0dcece7SHeiko Schocher #include <common.h> 14c0dcece7SHeiko Schocher #include <errno.h> 15c0dcece7SHeiko Schocher #include <spl.h> 16c0dcece7SHeiko Schocher #include <asm/arch/cpu.h> 17c0dcece7SHeiko Schocher #include <asm/arch/hardware.h> 18c0dcece7SHeiko Schocher #include <asm/arch/omap.h> 19c0dcece7SHeiko Schocher #include <asm/arch/ddr_defs.h> 20c0dcece7SHeiko Schocher #include <asm/arch/clock.h> 21c0dcece7SHeiko Schocher #include <asm/arch/gpio.h> 22c0dcece7SHeiko Schocher #include <asm/arch/mmc_host_def.h> 23c0dcece7SHeiko Schocher #include <asm/arch/sys_proto.h> 24c0dcece7SHeiko Schocher #include <asm/io.h> 25c0dcece7SHeiko Schocher #include <asm/emif.h> 26c0dcece7SHeiko Schocher #include <asm/gpio.h> 27c0dcece7SHeiko Schocher #include <i2c.h> 28c0dcece7SHeiko Schocher #include <miiphy.h> 29c0dcece7SHeiko Schocher #include <cpsw.h> 30c0dcece7SHeiko Schocher #include <watchdog.h> 31c0dcece7SHeiko Schocher #include "../common/factoryset.h" 32c0dcece7SHeiko Schocher 33c0dcece7SHeiko Schocher DECLARE_GLOBAL_DATA_PTR; 34c0dcece7SHeiko Schocher 35c0dcece7SHeiko Schocher #ifdef CONFIG_SPL_BUILD 36c0dcece7SHeiko Schocher void set_uart_mux_conf(void) 37c0dcece7SHeiko Schocher { 38c0dcece7SHeiko Schocher enable_uart0_pin_mux(); 39c0dcece7SHeiko Schocher } 40c0dcece7SHeiko Schocher 41c0dcece7SHeiko Schocher void set_mux_conf_regs(void) 42c0dcece7SHeiko Schocher { 43c0dcece7SHeiko Schocher /* Initalize the board header */ 44c0dcece7SHeiko Schocher enable_i2c0_pin_mux(); 45*6789e84eSHeiko Schocher i2c_set_bus_num(0); 46c0dcece7SHeiko Schocher if (read_eeprom() < 0) 47c0dcece7SHeiko Schocher puts("Could not get board ID.\n"); 48c0dcece7SHeiko Schocher 49c0dcece7SHeiko Schocher enable_board_pin_mux(); 50c0dcece7SHeiko Schocher } 51c0dcece7SHeiko Schocher 52c0dcece7SHeiko Schocher void sdram_init(void) 53c0dcece7SHeiko Schocher { 54c0dcece7SHeiko Schocher spl_siemens_board_init(); 55c0dcece7SHeiko Schocher board_init_ddr(); 56c0dcece7SHeiko Schocher 57c0dcece7SHeiko Schocher return; 58c0dcece7SHeiko Schocher } 59c0dcece7SHeiko Schocher #endif /* #ifdef CONFIG_SPL_BUILD */ 60c0dcece7SHeiko Schocher 61c0dcece7SHeiko Schocher #ifndef CONFIG_SPL_BUILD 62c0dcece7SHeiko Schocher /* 63c0dcece7SHeiko Schocher * Basic board specific setup. Pinmux has been handled already. 64c0dcece7SHeiko Schocher */ 65c0dcece7SHeiko Schocher int board_init(void) 66c0dcece7SHeiko Schocher { 67c0dcece7SHeiko Schocher #if defined(CONFIG_HW_WATCHDOG) 68c0dcece7SHeiko Schocher hw_watchdog_init(); 69c0dcece7SHeiko Schocher #endif /* defined(CONFIG_HW_WATCHDOG) */ 70*6789e84eSHeiko Schocher i2c_set_bus_num(0); 71c0dcece7SHeiko Schocher if (read_eeprom() < 0) 72c0dcece7SHeiko Schocher puts("Could not get board ID.\n"); 73c0dcece7SHeiko Schocher 74c0dcece7SHeiko Schocher gd->bd->bi_arch_number = CONFIG_MACH_TYPE; 75c0dcece7SHeiko Schocher gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; 76c0dcece7SHeiko Schocher 77c0dcece7SHeiko Schocher #ifdef CONFIG_FACTORYSET 78c0dcece7SHeiko Schocher factoryset_read_eeprom(CONFIG_SYS_I2C_EEPROM_ADDR); 79c0dcece7SHeiko Schocher #endif 80c0dcece7SHeiko Schocher gpmc_init(); 81c0dcece7SHeiko Schocher 82c0dcece7SHeiko Schocher #ifdef CONFIG_VIDEO 83c0dcece7SHeiko Schocher board_video_init(); 84c0dcece7SHeiko Schocher #endif 85c0dcece7SHeiko Schocher 86c0dcece7SHeiko Schocher return 0; 87c0dcece7SHeiko Schocher } 88c0dcece7SHeiko Schocher #endif /* #ifndef CONFIG_SPL_BUILD */ 89c0dcece7SHeiko Schocher 90c0dcece7SHeiko Schocher #define OSC (V_OSCK/1000000) 91c0dcece7SHeiko Schocher const struct dpll_params dpll_ddr = { 92c0dcece7SHeiko Schocher DDR_PLL_FREQ, OSC-1, 1, -1, -1, -1, -1}; 93c0dcece7SHeiko Schocher 94c0dcece7SHeiko Schocher const struct dpll_params *get_dpll_ddr_params(void) 95c0dcece7SHeiko Schocher { 96c0dcece7SHeiko Schocher return &dpll_ddr; 97c0dcece7SHeiko Schocher } 98c0dcece7SHeiko Schocher 99c0dcece7SHeiko Schocher #ifdef CONFIG_BOARD_LATE_INIT 100c0dcece7SHeiko Schocher int board_late_init(void) 101c0dcece7SHeiko Schocher { 102c0dcece7SHeiko Schocher omap_nand_switch_ecc(1, 8); 103c0dcece7SHeiko Schocher 104c0dcece7SHeiko Schocher return 0; 105c0dcece7SHeiko Schocher } 106c0dcece7SHeiko Schocher #endif 107c0dcece7SHeiko Schocher 108c0dcece7SHeiko Schocher #ifndef CONFIG_SPL_BUILD 109c0dcece7SHeiko Schocher #if defined(BOARD_DFU_BUTTON_GPIO) 110c0dcece7SHeiko Schocher /* 111c0dcece7SHeiko Schocher * This command returns the status of the user button on 112c0dcece7SHeiko Schocher * Input - none 113c0dcece7SHeiko Schocher * Returns - 1 if button is held down 114c0dcece7SHeiko Schocher * 0 if button is not held down 115c0dcece7SHeiko Schocher */ 116c0dcece7SHeiko Schocher static int 117c0dcece7SHeiko Schocher do_userbutton(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 118c0dcece7SHeiko Schocher { 119c0dcece7SHeiko Schocher int button = 0; 120c0dcece7SHeiko Schocher int gpio; 121c0dcece7SHeiko Schocher 122c0dcece7SHeiko Schocher gpio = BOARD_DFU_BUTTON_GPIO; 123c0dcece7SHeiko Schocher gpio_request(gpio, "DFU"); 124c0dcece7SHeiko Schocher gpio_direction_input(gpio); 125c0dcece7SHeiko Schocher if (gpio_get_value(gpio)) 126c0dcece7SHeiko Schocher button = 1; 127c0dcece7SHeiko Schocher else 128c0dcece7SHeiko Schocher button = 0; 129c0dcece7SHeiko Schocher 130c0dcece7SHeiko Schocher gpio_free(gpio); 131c0dcece7SHeiko Schocher if (!button) { 132c0dcece7SHeiko Schocher /* LED0 - RED=1: GPIO2_0 2*32 = 64 */ 133c0dcece7SHeiko Schocher gpio_request(BOARD_DFU_BUTTON_LED, ""); 134c0dcece7SHeiko Schocher gpio_direction_output(BOARD_DFU_BUTTON_LED, 1); 135c0dcece7SHeiko Schocher gpio_set_value(BOARD_DFU_BUTTON_LED, 1); 136c0dcece7SHeiko Schocher } 137c0dcece7SHeiko Schocher 138c0dcece7SHeiko Schocher return button; 139c0dcece7SHeiko Schocher } 140c0dcece7SHeiko Schocher 141c0dcece7SHeiko Schocher U_BOOT_CMD( 142c0dcece7SHeiko Schocher dfubutton, CONFIG_SYS_MAXARGS, 1, do_userbutton, 143c0dcece7SHeiko Schocher "Return the status of the DFU button", 144c0dcece7SHeiko Schocher "" 145c0dcece7SHeiko Schocher ); 146c0dcece7SHeiko Schocher #endif 147c0dcece7SHeiko Schocher 148c0dcece7SHeiko Schocher static int 149c0dcece7SHeiko Schocher do_usertestwdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 150c0dcece7SHeiko Schocher { 151c0dcece7SHeiko Schocher printf("\n\n\n Go into infinite loop\n\n\n"); 152c0dcece7SHeiko Schocher while (1) 153c0dcece7SHeiko Schocher ; 154c0dcece7SHeiko Schocher return 0; 155c0dcece7SHeiko Schocher }; 156c0dcece7SHeiko Schocher 157c0dcece7SHeiko Schocher U_BOOT_CMD( 158c0dcece7SHeiko Schocher testwdt, CONFIG_SYS_MAXARGS, 1, do_usertestwdt, 159c0dcece7SHeiko Schocher "Sends U-Boot into infinite loop", 160c0dcece7SHeiko Schocher "" 161c0dcece7SHeiko Schocher ); 162c0dcece7SHeiko Schocher 163c0dcece7SHeiko Schocher #ifndef CONFIG_SYS_DCACHE_OFF 164c0dcece7SHeiko Schocher void enable_caches(void) 165c0dcece7SHeiko Schocher { 166c0dcece7SHeiko Schocher printf("Enable d-cache\n"); 167c0dcece7SHeiko Schocher /* Enable D-cache. I-cache is already enabled in start.S */ 168c0dcece7SHeiko Schocher dcache_enable(); 169c0dcece7SHeiko Schocher } 170c0dcece7SHeiko Schocher #endif /* CONFIG_SYS_DCACHE_OFF */ 171c0dcece7SHeiko Schocher #endif /* !CONFIG_SPL_BUILD */ 172