X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=board%2Fbf518f-ezbrd%2Fbf518f-ezbrd.c;h=a14e5097193360cf95d965bb7d0097c696c91d97;hb=bcce53d048de7f41078d25e39aa2f26d752d3658;hp=2c7961ab7c290e11392649d21ca405485d34e218;hpb=ca41ef301b21b3ac25af71750624e0b3d5ddbb3e;p=u-boot diff --git a/board/bf518f-ezbrd/bf518f-ezbrd.c b/board/bf518f-ezbrd/bf518f-ezbrd.c index 2c7961ab7c..a14e509719 100644 --- a/board/bf518f-ezbrd/bf518f-ezbrd.c +++ b/board/bf518f-ezbrd/bf518f-ezbrd.c @@ -1,5 +1,5 @@ /* - * U-boot - main board file + * U-Boot - main board file * * Copyright (c) 2008-2009 Analog Devices Inc. * @@ -13,8 +13,9 @@ #include #include #include -#include +#include #include +#include DECLARE_GLOBAL_DATA_PTR; @@ -25,67 +26,105 @@ int checkboard(void) return 0; } -phys_size_t initdram(int board_type) +#if defined(CONFIG_BFIN_MAC) +static void board_init_enetaddr(uchar *mac_addr) { - gd->bd->bi_memstart = CONFIG_SYS_SDRAM_BASE; - gd->bd->bi_memsize = CONFIG_SYS_MAX_RAM_SIZE; - return gd->bd->bi_memsize; +#ifndef CONFIG_SYS_NO_FLASH + /* we cram the MAC in the last flash sector */ + uchar *board_mac_addr = (uchar *)0x203F0096; + if (is_valid_ethaddr(board_mac_addr)) { + memcpy(mac_addr, board_mac_addr, 6); + eth_setenv_enetaddr("ethaddr", mac_addr); + } +#endif } -#if defined(CONFIG_BFIN_MAC) -static void board_init_enetaddr(uchar *mac_addr) +/* Only the first run of boards had a KSZ switch */ +#if defined(CONFIG_BFIN_SPI) && __SILICON_REVISION__ == 0 +# define KSZ_POSSIBLE 1 +#else +# define KSZ_POSSIBLE 0 +#endif + +#define KSZ_MAX_HZ 5000000 + +#define KSZ_WRITE 0x02 +#define KSZ_READ 0x03 + +#define KSZ_REG_CHID 0x00 /* Register 0: Chip ID0 */ +#define KSZ_REG_STPID 0x01 /* Register 1: Chip ID1 / Start Switch */ +#define KSZ_REG_GC9 0x0b /* Register 11: Global Control 9 */ +#define KSZ_REG_P3C0 0x30 /* Register 48: Port 3 Control 0 */ + +static int ksz8893m_transfer(struct spi_slave *slave, uchar dir, uchar reg, + uchar data, uchar result[3]) { - bool valid_mac = false; + unsigned char dout[3] = { dir, reg, data, }; + return spi_xfer(slave, sizeof(dout) * 8, dout, result, SPI_XFER_BEGIN | SPI_XFER_END); +} -#if 0 - /* the MAC is stored in OTP memory page 0xDF */ - uint32_t ret; - uint64_t otp_mac; +static int ksz8893m_reg_set(struct spi_slave *slave, uchar reg, uchar data) +{ + unsigned char din[3]; + return ksz8893m_transfer(slave, KSZ_WRITE, reg, data, din); +} - ret = bfrom_OtpRead(0xDF, OTP_LOWER_HALF, &otp_mac); - if (!(ret & OTP_MASTER_ERROR)) { - uchar *otp_mac_p = (uchar *)&otp_mac; +static int ksz8893m_reg_read(struct spi_slave *slave, uchar reg) +{ + int ret; + unsigned char din[3]; + ret = ksz8893m_transfer(slave, KSZ_READ, reg, 0, din); + return ret ? ret : din[2]; +} - for (ret = 0; ret < 6; ++ret) - mac_addr[ret] = otp_mac_p[5 - ret]; +static int ksz8893m_reg_clear(struct spi_slave *slave, uchar reg, uchar mask) +{ + return ksz8893m_reg_set(slave, reg, ksz8893m_reg_read(slave, reg) & mask); +} - if (is_valid_ether_addr(mac_addr)) - valid_mac = true; - } -#endif +static int ksz8893m_reset(struct spi_slave *slave) +{ + int ret = 0; - if (!valid_mac) { - puts("Warning: Generating 'random' MAC address\n"); - bfin_gen_rand_mac(mac_addr); - } + /* Disable STPID mode */ + ret |= ksz8893m_reg_clear(slave, KSZ_REG_GC9, 0x01); + + /* Disable VLAN tag insert on Port3 */ + ret |= ksz8893m_reg_clear(slave, KSZ_REG_P3C0, 0x04); - eth_setenv_enetaddr("ethaddr", mac_addr); + /* Start switch */ + ret |= ksz8893m_reg_set(slave, KSZ_REG_STPID, 0x01); + + return ret; } -int board_eth_init(bd_t *bis) +static bool board_ksz_init(void) { static bool switch_is_alive = false; - int ret; if (!switch_is_alive) { - struct spi_slave *slave = spi_setup_slave(0, 1, 5000000, SPI_MODE_3); + struct spi_slave *slave = spi_setup_slave(0, 1, KSZ_MAX_HZ, SPI_MODE_3); if (slave) { if (!spi_claim_bus(slave)) { - unsigned char dout[3] = { 2, 1, 1, }; - unsigned char din[3]; - ret = spi_xfer(slave, sizeof(dout) * 8, dout, din, SPI_XFER_BEGIN | SPI_XFER_END); - if (!ret) - switch_is_alive = true; + bool phy_is_ksz = (ksz8893m_reg_read(slave, KSZ_REG_CHID) == 0x88); + int ret = phy_is_ksz ? ksz8893m_reset(slave) : 0; + switch_is_alive = (ret == 0); spi_release_bus(slave); } spi_free_slave(slave); } } - if (switch_is_alive) - return bfin_EMAC_initialize(bis); - else - return -1; + return switch_is_alive; +} + +int board_eth_init(bd_t *bis) +{ + if (KSZ_POSSIBLE) { + if (!board_ksz_init()) + return 0; + } + return bfin_EMAC_initialize(bis); } #endif @@ -97,5 +136,27 @@ int misc_init_r(void) board_init_enetaddr(enetaddr); #endif +#ifndef CONFIG_SYS_NO_FLASH + /* we use the last sector for the MAC address / POST LDR */ + extern flash_info_t flash_info[]; + flash_protect(FLAG_PROTECT_SET, 0x203F0000, 0x203FFFFF, &flash_info[0]); +#endif + return 0; } + +int board_early_init_f(void) +{ + /* connect async banks by default */ + const unsigned short pins[] = { + P_AMS2, P_AMS3, 0, + }; + return peripheral_request_list(pins, "async"); +} + +#ifdef CONFIG_BFIN_SDH +int board_mmc_init(bd_t *bis) +{ + return bfin_mmc_init(bis); +} +#endif