1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * am3517evm.c - board file for TI's AM3517 family of devices. 4 * 5 * Author: Vaibhav Hiremath <hvaibhav@ti.com> 6 * 7 * Based on ti/evm/evm.c 8 * 9 * Copyright (C) 2010 10 * Texas Instruments Incorporated - https://www.ti.com/ 11 */ 12 13#include <common.h> 14#include <dm.h> 15#include <init.h> 16#include <net.h> 17#include <ns16550.h> 18#include <serial.h> 19#include <asm/global_data.h> 20#include <asm/io.h> 21#include <asm/omap_musb.h> 22#include <asm/arch/am35x_def.h> 23#include <asm/arch/mem.h> 24#include <asm/arch/mux.h> 25#include <asm/arch/sys_proto.h> 26#include <asm/arch/mmc_host_def.h> 27#include <asm/arch/musb.h> 28#include <asm/mach-types.h> 29#include <linux/errno.h> 30#include <asm/gpio.h> 31#include <linux/usb/ch9.h> 32#include <linux/usb/gadget.h> 33#include <linux/usb/musb.h> 34#include <i2c.h> 35#include "am3517evm.h" 36 37DECLARE_GLOBAL_DATA_PTR; 38 39#define AM3517_IP_SW_RESET 0x48002598 40#define CPGMACSS_SW_RST (1 << 1) 41#define PHY_GPIO 30 42 43#if defined(CONFIG_SPL_BUILD) 44#if defined(CONFIG_SPL_OS_BOOT) 45int spl_start_uboot(void) 46{ 47 /* break into full u-boot on 'c' */ 48 return serial_tstc() && serial_getc() == 'c'; 49} 50#endif 51#endif 52 53/* 54 * Routine: board_init 55 * Description: Early hardware init. 56 */ 57int board_init(void) 58{ 59 gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 60 /* board id for Linux */ 61 gd->bd->bi_arch_number = MACH_TYPE_OMAP3517EVM; 62 /* boot param addr */ 63 gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 64 65 return 0; 66} 67 68#ifdef CONFIG_USB_MUSB_AM35X 69static struct musb_hdrc_config musb_config = { 70 .multipoint = 1, 71 .dyn_fifo = 1, 72 .num_eps = 16, 73 .ram_bits = 12, 74}; 75 76static struct omap_musb_board_data musb_board_data = { 77 .set_phy_power = am35x_musb_phy_power, 78 .clear_irq = am35x_musb_clear_irq, 79 .reset = am35x_musb_reset, 80}; 81 82static struct musb_hdrc_platform_data musb_plat = { 83#if defined(CONFIG_USB_MUSB_HOST) 84 .mode = MUSB_HOST, 85#elif defined(CONFIG_USB_MUSB_GADGET) 86 .mode = MUSB_PERIPHERAL, 87#else 88#error "Please define either CONFIG_USB_MUSB_HOST or CONFIG_USB_MUSB_GADGET" 89#endif 90 .config = &musb_config, 91 .power = 250, 92 .platform_ops = &am35x_ops, 93 .board_data = &musb_board_data, 94}; 95 96static void am3517_evm_musb_init(void) 97{ 98 /* 99 * Set up USB clock/mode in the DEVCONF2 register. 100 * USB2.0 PHY reference clock is 13 MHz 101 */ 102 clrsetbits_le32(&am35x_scm_general_regs->devconf2, 103 CONF2_REFFREQ | CONF2_OTGMODE | CONF2_PHY_GPIOMODE, 104 CONF2_REFFREQ_13MHZ | CONF2_SESENDEN | 105 CONF2_VBDTCTEN | CONF2_DATPOL); 106 107 musb_register(&musb_plat, &musb_board_data, 108 (void *)AM35XX_IPSS_USBOTGSS_BASE); 109} 110#else 111#define am3517_evm_musb_init() do {} while (0) 112#endif 113 114/* 115 * Routine: misc_init_r 116 * Description: Init i2c, ethernet, etc... (done here so udelay works) 117 */ 118int misc_init_r(void) 119{ 120 omap_die_id_display(); 121 122 am3517_evm_musb_init(); 123 124 return 0; 125} 126 127/* 128 * Routine: set_muxconf_regs 129 * Description: Setting up the configuration Mux registers specific to the 130 * hardware. Many pins need to be moved from protect to primary 131 * mode. 132 */ 133void set_muxconf_regs(void) 134{ 135 MUX_AM3517EVM(); 136} 137 138#if defined(CONFIG_USB_ETHER) && defined(CONFIG_USB_MUSB_GADGET) 139int board_eth_init(struct bd_info *bis) 140{ 141 int rv, n = 0; 142 143 rv = cpu_eth_init(bis); 144 if (rv > 0) 145 n += rv; 146 147 rv = usb_eth_initialize(bis); 148 if (rv > 0) 149 n += rv; 150 151 return n; 152} 153#endif 154