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); 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) */ 706789e84eSHeiko 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 132c0dcece7SHeiko Schocher return button; 133c0dcece7SHeiko Schocher } 134c0dcece7SHeiko Schocher 135c0dcece7SHeiko Schocher U_BOOT_CMD( 136c0dcece7SHeiko Schocher dfubutton, CONFIG_SYS_MAXARGS, 1, do_userbutton, 137c0dcece7SHeiko Schocher "Return the status of the DFU button", 138c0dcece7SHeiko Schocher "" 139c0dcece7SHeiko Schocher ); 140c0dcece7SHeiko Schocher #endif 141*111c8e40SEgli, Samuel /* 142*111c8e40SEgli, Samuel * This command sets led 143*111c8e40SEgli, Samuel * Input - name of led 144*111c8e40SEgli, Samuel * value of led 145*111c8e40SEgli, Samuel * Returns - 1 if input does not match 146*111c8e40SEgli, Samuel * 0 if led was set 147*111c8e40SEgli, Samuel */ 148*111c8e40SEgli, Samuel static int 149*111c8e40SEgli, Samuel do_setled(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 150*111c8e40SEgli, Samuel { 151*111c8e40SEgli, Samuel int gpio = 0; 152*111c8e40SEgli, Samuel if (argc != 3) 153*111c8e40SEgli, Samuel goto exit; 154*111c8e40SEgli, Samuel #if defined(BOARD_STATUS_LED) 155*111c8e40SEgli, Samuel if (!strcmp(argv[1], "stat")) 156*111c8e40SEgli, Samuel gpio = BOARD_STATUS_LED; 157*111c8e40SEgli, Samuel #endif 158*111c8e40SEgli, Samuel #if defined(BOARD_DFU_BUTTON_LED) 159*111c8e40SEgli, Samuel if (!strcmp(argv[1], "dfu")) 160*111c8e40SEgli, Samuel gpio = BOARD_DFU_BUTTON_LED; 161*111c8e40SEgli, Samuel #endif 162*111c8e40SEgli, Samuel /* If argument does not mach exit */ 163*111c8e40SEgli, Samuel if (gpio == 0) 164*111c8e40SEgli, Samuel goto exit; 165*111c8e40SEgli, Samuel gpio_request(gpio, ""); 166*111c8e40SEgli, Samuel gpio_direction_output(gpio, 1); 167*111c8e40SEgli, Samuel if (!strcmp(argv[2], "1")) 168*111c8e40SEgli, Samuel gpio_set_value(gpio, 1); 169*111c8e40SEgli, Samuel else 170*111c8e40SEgli, Samuel gpio_set_value(gpio, 0); 171*111c8e40SEgli, Samuel return 0; 172*111c8e40SEgli, Samuel exit: 173*111c8e40SEgli, Samuel return 1; 174*111c8e40SEgli, Samuel } 175*111c8e40SEgli, Samuel 176*111c8e40SEgli, Samuel U_BOOT_CMD( 177*111c8e40SEgli, Samuel led, CONFIG_SYS_MAXARGS, 2, do_setled, 178*111c8e40SEgli, Samuel "Set led on or off", 179*111c8e40SEgli, Samuel "dfu val - set dfu led\nled stat val - set status led" 180*111c8e40SEgli, Samuel ); 181c0dcece7SHeiko Schocher 182c0dcece7SHeiko Schocher static int 183c0dcece7SHeiko Schocher do_usertestwdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 184c0dcece7SHeiko Schocher { 185c0dcece7SHeiko Schocher printf("\n\n\n Go into infinite loop\n\n\n"); 186c0dcece7SHeiko Schocher while (1) 187c0dcece7SHeiko Schocher ; 188c0dcece7SHeiko Schocher return 0; 189c0dcece7SHeiko Schocher }; 190c0dcece7SHeiko Schocher 191c0dcece7SHeiko Schocher U_BOOT_CMD( 192c0dcece7SHeiko Schocher testwdt, CONFIG_SYS_MAXARGS, 1, do_usertestwdt, 193c0dcece7SHeiko Schocher "Sends U-Boot into infinite loop", 194c0dcece7SHeiko Schocher "" 195c0dcece7SHeiko Schocher ); 196c0dcece7SHeiko Schocher #endif /* !CONFIG_SPL_BUILD */ 197