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(); 456789e84eSHeiko Schocher i2c_set_bus_num(0); 46*012681b1SHeiko Schocher 47*012681b1SHeiko Schocher /* enable early the console */ 48*012681b1SHeiko Schocher gd->baudrate = CONFIG_BAUDRATE; 49*012681b1SHeiko Schocher serial_init(); 50*012681b1SHeiko Schocher gd->have_console = 1; 51c0dcece7SHeiko Schocher if (read_eeprom() < 0) 52c0dcece7SHeiko Schocher puts("Could not get board ID.\n"); 53c0dcece7SHeiko Schocher 54c0dcece7SHeiko Schocher enable_board_pin_mux(); 55c0dcece7SHeiko Schocher } 56c0dcece7SHeiko Schocher 57c0dcece7SHeiko Schocher void sdram_init(void) 58c0dcece7SHeiko Schocher { 59c0dcece7SHeiko Schocher spl_siemens_board_init(); 60c0dcece7SHeiko Schocher board_init_ddr(); 61c0dcece7SHeiko Schocher 62c0dcece7SHeiko Schocher return; 63c0dcece7SHeiko Schocher } 64c0dcece7SHeiko Schocher #endif /* #ifdef CONFIG_SPL_BUILD */ 65c0dcece7SHeiko Schocher 66c0dcece7SHeiko Schocher #ifndef CONFIG_SPL_BUILD 67c0dcece7SHeiko Schocher /* 68c0dcece7SHeiko Schocher * Basic board specific setup. Pinmux has been handled already. 69c0dcece7SHeiko Schocher */ 70c0dcece7SHeiko Schocher int board_init(void) 71c0dcece7SHeiko Schocher { 72c0dcece7SHeiko Schocher #if defined(CONFIG_HW_WATCHDOG) 73c0dcece7SHeiko Schocher hw_watchdog_init(); 74c0dcece7SHeiko Schocher #endif /* defined(CONFIG_HW_WATCHDOG) */ 756789e84eSHeiko Schocher i2c_set_bus_num(0); 76c0dcece7SHeiko Schocher if (read_eeprom() < 0) 77c0dcece7SHeiko Schocher puts("Could not get board ID.\n"); 78c0dcece7SHeiko Schocher 79c0dcece7SHeiko Schocher gd->bd->bi_arch_number = CONFIG_MACH_TYPE; 80c0dcece7SHeiko Schocher gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; 81c0dcece7SHeiko Schocher 82c0dcece7SHeiko Schocher #ifdef CONFIG_FACTORYSET 83c0dcece7SHeiko Schocher factoryset_read_eeprom(CONFIG_SYS_I2C_EEPROM_ADDR); 84c0dcece7SHeiko Schocher #endif 85c0dcece7SHeiko Schocher gpmc_init(); 86c0dcece7SHeiko Schocher 87c0dcece7SHeiko Schocher #ifdef CONFIG_VIDEO 88c0dcece7SHeiko Schocher board_video_init(); 89c0dcece7SHeiko Schocher #endif 90c0dcece7SHeiko Schocher 91c0dcece7SHeiko Schocher return 0; 92c0dcece7SHeiko Schocher } 93c0dcece7SHeiko Schocher #endif /* #ifndef CONFIG_SPL_BUILD */ 94c0dcece7SHeiko Schocher 95c0dcece7SHeiko Schocher #define OSC (V_OSCK/1000000) 96c0dcece7SHeiko Schocher const struct dpll_params dpll_ddr = { 97c0dcece7SHeiko Schocher DDR_PLL_FREQ, OSC-1, 1, -1, -1, -1, -1}; 98c0dcece7SHeiko Schocher 99c0dcece7SHeiko Schocher const struct dpll_params *get_dpll_ddr_params(void) 100c0dcece7SHeiko Schocher { 101c0dcece7SHeiko Schocher return &dpll_ddr; 102c0dcece7SHeiko Schocher } 103c0dcece7SHeiko Schocher 104c0dcece7SHeiko Schocher #ifndef CONFIG_SPL_BUILD 105c0dcece7SHeiko Schocher #if defined(BOARD_DFU_BUTTON_GPIO) 106c0dcece7SHeiko Schocher /* 107c0dcece7SHeiko Schocher * This command returns the status of the user button on 108c0dcece7SHeiko Schocher * Input - none 109c0dcece7SHeiko Schocher * Returns - 1 if button is held down 110c0dcece7SHeiko Schocher * 0 if button is not held down 111c0dcece7SHeiko Schocher */ 112c0dcece7SHeiko Schocher static int 113c0dcece7SHeiko Schocher do_userbutton(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 114c0dcece7SHeiko Schocher { 115c0dcece7SHeiko Schocher int button = 0; 116c0dcece7SHeiko Schocher int gpio; 117c0dcece7SHeiko Schocher 118c0dcece7SHeiko Schocher gpio = BOARD_DFU_BUTTON_GPIO; 119c0dcece7SHeiko Schocher gpio_request(gpio, "DFU"); 120c0dcece7SHeiko Schocher gpio_direction_input(gpio); 121c0dcece7SHeiko Schocher if (gpio_get_value(gpio)) 122c0dcece7SHeiko Schocher button = 1; 123c0dcece7SHeiko Schocher else 124c0dcece7SHeiko Schocher button = 0; 125c0dcece7SHeiko Schocher 126c0dcece7SHeiko Schocher gpio_free(gpio); 127c0dcece7SHeiko Schocher 128c0dcece7SHeiko Schocher return button; 129c0dcece7SHeiko Schocher } 130c0dcece7SHeiko Schocher 131c0dcece7SHeiko Schocher U_BOOT_CMD( 132c0dcece7SHeiko Schocher dfubutton, CONFIG_SYS_MAXARGS, 1, do_userbutton, 133c0dcece7SHeiko Schocher "Return the status of the DFU button", 134c0dcece7SHeiko Schocher "" 135c0dcece7SHeiko Schocher ); 136c0dcece7SHeiko Schocher #endif 137111c8e40SEgli, Samuel /* 138111c8e40SEgli, Samuel * This command sets led 139111c8e40SEgli, Samuel * Input - name of led 140111c8e40SEgli, Samuel * value of led 141111c8e40SEgli, Samuel * Returns - 1 if input does not match 142111c8e40SEgli, Samuel * 0 if led was set 143111c8e40SEgli, Samuel */ 144111c8e40SEgli, Samuel static int 145111c8e40SEgli, Samuel do_setled(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 146111c8e40SEgli, Samuel { 147111c8e40SEgli, Samuel int gpio = 0; 148111c8e40SEgli, Samuel if (argc != 3) 149111c8e40SEgli, Samuel goto exit; 150111c8e40SEgli, Samuel #if defined(BOARD_STATUS_LED) 151111c8e40SEgli, Samuel if (!strcmp(argv[1], "stat")) 152111c8e40SEgli, Samuel gpio = BOARD_STATUS_LED; 153111c8e40SEgli, Samuel #endif 154111c8e40SEgli, Samuel #if defined(BOARD_DFU_BUTTON_LED) 155111c8e40SEgli, Samuel if (!strcmp(argv[1], "dfu")) 156111c8e40SEgli, Samuel gpio = BOARD_DFU_BUTTON_LED; 157111c8e40SEgli, Samuel #endif 158111c8e40SEgli, Samuel /* If argument does not mach exit */ 159111c8e40SEgli, Samuel if (gpio == 0) 160111c8e40SEgli, Samuel goto exit; 161111c8e40SEgli, Samuel gpio_request(gpio, ""); 162111c8e40SEgli, Samuel gpio_direction_output(gpio, 1); 163111c8e40SEgli, Samuel if (!strcmp(argv[2], "1")) 164111c8e40SEgli, Samuel gpio_set_value(gpio, 1); 165111c8e40SEgli, Samuel else 166111c8e40SEgli, Samuel gpio_set_value(gpio, 0); 167111c8e40SEgli, Samuel return 0; 168111c8e40SEgli, Samuel exit: 169111c8e40SEgli, Samuel return 1; 170111c8e40SEgli, Samuel } 171111c8e40SEgli, Samuel 172111c8e40SEgli, Samuel U_BOOT_CMD( 173111c8e40SEgli, Samuel led, CONFIG_SYS_MAXARGS, 2, do_setled, 174111c8e40SEgli, Samuel "Set led on or off", 175111c8e40SEgli, Samuel "dfu val - set dfu led\nled stat val - set status led" 176111c8e40SEgli, Samuel ); 177c0dcece7SHeiko Schocher 178c0dcece7SHeiko Schocher static int 179c0dcece7SHeiko Schocher do_usertestwdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 180c0dcece7SHeiko Schocher { 181c0dcece7SHeiko Schocher printf("\n\n\n Go into infinite loop\n\n\n"); 182c0dcece7SHeiko Schocher while (1) 183c0dcece7SHeiko Schocher ; 184c0dcece7SHeiko Schocher return 0; 185c0dcece7SHeiko Schocher }; 186c0dcece7SHeiko Schocher 187c0dcece7SHeiko Schocher U_BOOT_CMD( 188c0dcece7SHeiko Schocher testwdt, CONFIG_SYS_MAXARGS, 1, do_usertestwdt, 189c0dcece7SHeiko Schocher "Sends U-Boot into infinite loop", 190c0dcece7SHeiko Schocher "" 191c0dcece7SHeiko Schocher ); 192c0dcece7SHeiko Schocher #endif /* !CONFIG_SPL_BUILD */ 193