12e0c1c7dSJason Cooper /* 22e0c1c7dSJason Cooper * (C) Copyright 2011 32e0c1c7dSJason Cooper * Jason Cooper <u-boot@lakedaemon.net> 42e0c1c7dSJason Cooper * 52e0c1c7dSJason Cooper * Based on work by: 62e0c1c7dSJason Cooper * Marvell Semiconductor <www.marvell.com> 72e0c1c7dSJason Cooper * Written-by: Siddarth Gore <gores@marvell.com> 82e0c1c7dSJason Cooper * 92e0c1c7dSJason Cooper * See file CREDITS for list of people who contributed to this 102e0c1c7dSJason Cooper * project. 112e0c1c7dSJason Cooper * 122e0c1c7dSJason Cooper * This program is free software; you can redistribute it and/or 132e0c1c7dSJason Cooper * modify it under the terms of the GNU General Public License as 142e0c1c7dSJason Cooper * published by the Free Software Foundation; either version 2 of 152e0c1c7dSJason Cooper * the License, or (at your option) any later version. 162e0c1c7dSJason Cooper * 172e0c1c7dSJason Cooper * This program is distributed in the hope that it will be useful, 182e0c1c7dSJason Cooper * but WITHOUT ANY WARRANTY; without even the implied warranty of 192e0c1c7dSJason Cooper * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 202e0c1c7dSJason Cooper * GNU General Public License for more details. 212e0c1c7dSJason Cooper * 222e0c1c7dSJason Cooper * You should have received a copy of the GNU General Public License 232e0c1c7dSJason Cooper * along with this program; if not, write to the Free Software 242e0c1c7dSJason Cooper * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 252e0c1c7dSJason Cooper * MA 02110-1301 USA 262e0c1c7dSJason Cooper */ 272e0c1c7dSJason Cooper 282e0c1c7dSJason Cooper #include <common.h> 292e0c1c7dSJason Cooper #include <miiphy.h> 300ac16bf3SAnatolij Gustschin #include <asm/arch/cpu.h> 312e0c1c7dSJason Cooper #include <asm/arch/kirkwood.h> 322e0c1c7dSJason Cooper #include <asm/arch/mpp.h> 332e0c1c7dSJason Cooper #include "dreamplug.h" 342e0c1c7dSJason Cooper 352e0c1c7dSJason Cooper DECLARE_GLOBAL_DATA_PTR; 362e0c1c7dSJason Cooper 372e0c1c7dSJason Cooper int board_early_init_f(void) 382e0c1c7dSJason Cooper { 392e0c1c7dSJason Cooper /* 402e0c1c7dSJason Cooper * default gpio configuration 412e0c1c7dSJason Cooper * There are maximum 64 gpios controlled through 2 sets of registers 422e0c1c7dSJason Cooper * the below configuration configures mainly initial LED status 432e0c1c7dSJason Cooper */ 442e0c1c7dSJason Cooper kw_config_gpio(DREAMPLUG_OE_VAL_LOW, 452e0c1c7dSJason Cooper DREAMPLUG_OE_VAL_HIGH, 462e0c1c7dSJason Cooper DREAMPLUG_OE_LOW, DREAMPLUG_OE_HIGH); 472e0c1c7dSJason Cooper 482e0c1c7dSJason Cooper /* Multi-Purpose Pins Functionality configuration */ 49*9d86f0c3SAlbert ARIBAUD static const u32 kwmpp_config[] = { 502e0c1c7dSJason Cooper MPP0_SPI_SCn, /* SPI Flash */ 512e0c1c7dSJason Cooper MPP1_SPI_MOSI, 522e0c1c7dSJason Cooper MPP2_SPI_SCK, 532e0c1c7dSJason Cooper MPP3_SPI_MISO, 542e0c1c7dSJason Cooper MPP4_NF_IO6, 552e0c1c7dSJason Cooper MPP5_NF_IO7, 562e0c1c7dSJason Cooper MPP6_SYSRST_OUTn, 572e0c1c7dSJason Cooper MPP7_GPO, 582e0c1c7dSJason Cooper MPP8_TW_SDA, 592e0c1c7dSJason Cooper MPP9_TW_SCK, 602e0c1c7dSJason Cooper MPP10_UART0_TXD, /* Serial */ 612e0c1c7dSJason Cooper MPP11_UART0_RXD, 622e0c1c7dSJason Cooper MPP12_SD_CLK, /* SDIO Slot */ 632e0c1c7dSJason Cooper MPP13_SD_CMD, 642e0c1c7dSJason Cooper MPP14_SD_D0, 652e0c1c7dSJason Cooper MPP15_SD_D1, 662e0c1c7dSJason Cooper MPP16_SD_D2, 672e0c1c7dSJason Cooper MPP17_SD_D3, 682e0c1c7dSJason Cooper MPP18_NF_IO0, 692e0c1c7dSJason Cooper MPP19_NF_IO1, 702e0c1c7dSJason Cooper MPP20_GE1_0, /* Gigabit Ethernet */ 712e0c1c7dSJason Cooper MPP21_GE1_1, 722e0c1c7dSJason Cooper MPP22_GE1_2, 732e0c1c7dSJason Cooper MPP23_GE1_3, 742e0c1c7dSJason Cooper MPP24_GE1_4, 752e0c1c7dSJason Cooper MPP25_GE1_5, 762e0c1c7dSJason Cooper MPP26_GE1_6, 772e0c1c7dSJason Cooper MPP27_GE1_7, 782e0c1c7dSJason Cooper MPP28_GE1_8, 792e0c1c7dSJason Cooper MPP29_GE1_9, 802e0c1c7dSJason Cooper MPP30_GE1_10, 812e0c1c7dSJason Cooper MPP31_GE1_11, 822e0c1c7dSJason Cooper MPP32_GE1_12, 832e0c1c7dSJason Cooper MPP33_GE1_13, 842e0c1c7dSJason Cooper MPP34_GE1_14, 852e0c1c7dSJason Cooper MPP35_GE1_15, 862e0c1c7dSJason Cooper MPP36_GPIO, /* 7 external GPIO pins (36 - 45) */ 872e0c1c7dSJason Cooper MPP37_GPIO, 882e0c1c7dSJason Cooper MPP38_GPIO, 892e0c1c7dSJason Cooper MPP39_GPIO, 902e0c1c7dSJason Cooper MPP40_TDM_SPI_SCK, 912e0c1c7dSJason Cooper MPP41_TDM_SPI_MISO, 922e0c1c7dSJason Cooper MPP42_TDM_SPI_MOSI, 932e0c1c7dSJason Cooper MPP43_GPIO, 942e0c1c7dSJason Cooper MPP44_GPIO, 952e0c1c7dSJason Cooper MPP45_GPIO, 962e0c1c7dSJason Cooper MPP46_GPIO, 972e0c1c7dSJason Cooper MPP47_GPIO, /* Bluetooth LED */ 982e0c1c7dSJason Cooper MPP48_GPIO, /* Wifi LED */ 992e0c1c7dSJason Cooper MPP49_GPIO, /* Wifi AP LED */ 1002e0c1c7dSJason Cooper 0 1012e0c1c7dSJason Cooper }; 10284683638SValentin Longchamp kirkwood_mpp_conf(kwmpp_config, NULL); 1032e0c1c7dSJason Cooper return 0; 1042e0c1c7dSJason Cooper } 1052e0c1c7dSJason Cooper 1062e0c1c7dSJason Cooper int board_init(void) 1072e0c1c7dSJason Cooper { 1082e0c1c7dSJason Cooper /* adress of boot parameters */ 1092e0c1c7dSJason Cooper gd->bd->bi_boot_params = kw_sdram_bar(0) + 0x100; 1102e0c1c7dSJason Cooper 1112e0c1c7dSJason Cooper return 0; 1122e0c1c7dSJason Cooper } 1132e0c1c7dSJason Cooper 1142e0c1c7dSJason Cooper #ifdef CONFIG_RESET_PHY_R 1152e0c1c7dSJason Cooper void mv_phy_88e1116_init(char *name) 1162e0c1c7dSJason Cooper { 1172e0c1c7dSJason Cooper u16 reg; 1182e0c1c7dSJason Cooper u16 devadr; 1192e0c1c7dSJason Cooper 1202e0c1c7dSJason Cooper if (miiphy_set_current_dev(name)) 1212e0c1c7dSJason Cooper return; 1222e0c1c7dSJason Cooper 1232e0c1c7dSJason Cooper /* command to read PHY dev address */ 1242e0c1c7dSJason Cooper if (miiphy_read(name, 0xEE, 0xEE, (u16 *) &devadr)) { 1252e0c1c7dSJason Cooper printf("Err..%s could not read PHY dev address\n", 1262e0c1c7dSJason Cooper __func__); 1272e0c1c7dSJason Cooper return; 1282e0c1c7dSJason Cooper } 1292e0c1c7dSJason Cooper 1302e0c1c7dSJason Cooper /* 1312e0c1c7dSJason Cooper * Enable RGMII delay on Tx and Rx for CPU port 1322e0c1c7dSJason Cooper * Ref: sec 4.7.2 of chip datasheet 1332e0c1c7dSJason Cooper */ 1342e0c1c7dSJason Cooper miiphy_write(name, devadr, MV88E1116_PGADR_REG, 2); 1352e0c1c7dSJason Cooper miiphy_read(name, devadr, MV88E1116_MAC_CTRL2_REG, ®); 1362e0c1c7dSJason Cooper reg |= (MV88E1116_RGMII_RXTM_CTRL | MV88E1116_RGMII_TXTM_CTRL); 1372e0c1c7dSJason Cooper miiphy_write(name, devadr, MV88E1116_MAC_CTRL2_REG, reg); 1382e0c1c7dSJason Cooper miiphy_write(name, devadr, MV88E1116_PGADR_REG, 0); 1392e0c1c7dSJason Cooper 1402e0c1c7dSJason Cooper /* reset the phy */ 1412e0c1c7dSJason Cooper miiphy_reset(name, devadr); 1422e0c1c7dSJason Cooper 1432e0c1c7dSJason Cooper printf("88E1116 Initialized on %s\n", name); 1442e0c1c7dSJason Cooper } 1452e0c1c7dSJason Cooper 1462e0c1c7dSJason Cooper void reset_phy(void) 1472e0c1c7dSJason Cooper { 1482e0c1c7dSJason Cooper /* configure and initialize both PHY's */ 1492e0c1c7dSJason Cooper mv_phy_88e1116_init("egiga0"); 1502e0c1c7dSJason Cooper mv_phy_88e1116_init("egiga1"); 1512e0c1c7dSJason Cooper } 1522e0c1c7dSJason Cooper #endif /* CONFIG_RESET_PHY_R */ 153