uboot/board/logicpd/am3517evm/am3517evm.c
<<
>>
Prefs
   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 - http://www.ti.com/
  11 */
  12
  13#include <common.h>
  14#include <dm.h>
  15#include <ns16550.h>
  16#include <asm/io.h>
  17#include <asm/omap_musb.h>
  18#include <asm/arch/am35x_def.h>
  19#include <asm/arch/mem.h>
  20#include <asm/arch/mux.h>
  21#include <asm/arch/sys_proto.h>
  22#include <asm/arch/mmc_host_def.h>
  23#include <asm/arch/musb.h>
  24#include <asm/mach-types.h>
  25#include <linux/errno.h>
  26#include <asm/gpio.h>
  27#include <linux/usb/ch9.h>
  28#include <linux/usb/gadget.h>
  29#include <linux/usb/musb.h>
  30#include <i2c.h>
  31#include <netdev.h>
  32#include "am3517evm.h"
  33
  34DECLARE_GLOBAL_DATA_PTR;
  35
  36#define AM3517_IP_SW_RESET      0x48002598
  37#define CPGMACSS_SW_RST         (1 << 1)
  38#define PHY_GPIO                30
  39
  40
  41/*
  42 * Routine: board_init
  43 * Description: Early hardware init.
  44 */
  45int board_init(void)
  46{
  47        gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
  48        /* board id for Linux */
  49        gd->bd->bi_arch_number = MACH_TYPE_OMAP3517EVM;
  50        /* boot param addr */
  51        gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);
  52
  53        return 0;
  54}
  55
  56#ifdef CONFIG_USB_MUSB_AM35X
  57static struct musb_hdrc_config musb_config = {
  58        .multipoint     = 1,
  59        .dyn_fifo       = 1,
  60        .num_eps        = 16,
  61        .ram_bits       = 12,
  62};
  63
  64static struct omap_musb_board_data musb_board_data = {
  65        .set_phy_power          = am35x_musb_phy_power,
  66        .clear_irq              = am35x_musb_clear_irq,
  67        .reset                  = am35x_musb_reset,
  68};
  69
  70static struct musb_hdrc_platform_data musb_plat = {
  71#if defined(CONFIG_USB_MUSB_HOST)
  72        .mode           = MUSB_HOST,
  73#elif defined(CONFIG_USB_MUSB_GADGET)
  74        .mode           = MUSB_PERIPHERAL,
  75#else
  76#error "Please define either CONFIG_USB_MUSB_HOST or CONFIG_USB_MUSB_GADGET"
  77#endif
  78        .config         = &musb_config,
  79        .power          = 250,
  80        .platform_ops   = &am35x_ops,
  81        .board_data     = &musb_board_data,
  82};
  83
  84static void am3517_evm_musb_init(void)
  85{
  86        /*
  87         * Set up USB clock/mode in the DEVCONF2 register.
  88         * USB2.0 PHY reference clock is 13 MHz
  89         */
  90        clrsetbits_le32(&am35x_scm_general_regs->devconf2,
  91                        CONF2_REFFREQ | CONF2_OTGMODE | CONF2_PHY_GPIOMODE,
  92                        CONF2_REFFREQ_13MHZ | CONF2_SESENDEN |
  93                        CONF2_VBDTCTEN | CONF2_DATPOL);
  94
  95        musb_register(&musb_plat, &musb_board_data,
  96                        (void *)AM35XX_IPSS_USBOTGSS_BASE);
  97}
  98#else
  99#define am3517_evm_musb_init() do {} while (0)
 100#endif
 101
 102/*
 103 * Routine: misc_init_r
 104 * Description: Init i2c, ethernet, etc... (done here so udelay works)
 105 */
 106int misc_init_r(void)
 107{
 108        volatile unsigned int ctr;
 109        u32 reset;
 110
 111#ifdef CONFIG_SYS_I2C_OMAP24XX
 112        i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
 113#endif
 114
 115        omap_die_id_display();
 116
 117        am3517_evm_musb_init();
 118
 119        if (gpio_request(PHY_GPIO, "gpio_30") == 0) {
 120                /* activate PHY reset */
 121                gpio_direction_output(PHY_GPIO, 0);
 122                gpio_set_value(PHY_GPIO, 0);
 123
 124                ctr  = 0;
 125                do {
 126                        udelay(1000);
 127                        ctr++;
 128                } while (ctr < 300);
 129
 130                /* deactivate PHY reset */
 131                gpio_set_value(PHY_GPIO, 1);
 132
 133                /* allow the PHY to stabilize and settle down */
 134                ctr = 0;
 135                do {
 136                        udelay(1000);
 137                        ctr++;
 138                } while (ctr < 300);
 139
 140                /* ensure that the module is out of reset */
 141                reset = readl(AM3517_IP_SW_RESET);
 142                reset &= (~CPGMACSS_SW_RST);
 143                writel(reset, AM3517_IP_SW_RESET);
 144
 145                /* Free requested GPIO */
 146                gpio_free(PHY_GPIO);
 147        }
 148
 149        return 0;
 150}
 151
 152/*
 153 * Routine: set_muxconf_regs
 154 * Description: Setting up the configuration Mux registers specific to the
 155 *              hardware. Many pins need to be moved from protect to primary
 156 *              mode.
 157 */
 158void set_muxconf_regs(void)
 159{
 160        MUX_AM3517EVM();
 161}
 162
 163#if defined(CONFIG_MMC)
 164int board_mmc_init(bd_t *bis)
 165{
 166        return omap_mmc_init(0, 0, 0, -1, -1);
 167}
 168#endif
 169
 170#if defined(CONFIG_USB_ETHER) && defined(CONFIG_USB_MUSB_GADGET)
 171int board_eth_init(bd_t *bis)
 172{
 173        int rv, n = 0;
 174
 175        rv = cpu_eth_init(bis);
 176        if (rv > 0)
 177                n += rv;
 178
 179        rv = usb_eth_initialize(bis);
 180        if (rv > 0)
 181                n += rv;
 182
 183        return n;
 184}
 185#endif
 186