11d0f5fa1SDavid Purdy /*
21d0f5fa1SDavid Purdy * Copyright (C) 2012
31d0f5fa1SDavid Purdy * David Purdy <david.c.purdy@gmail.com>
41d0f5fa1SDavid Purdy *
51d0f5fa1SDavid Purdy * Based on Kirkwood support:
61d0f5fa1SDavid Purdy * (C) Copyright 2009
71d0f5fa1SDavid Purdy * Marvell Semiconductor <www.marvell.com>
81d0f5fa1SDavid Purdy * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
91d0f5fa1SDavid Purdy *
101a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
111d0f5fa1SDavid Purdy */
121d0f5fa1SDavid Purdy
131d0f5fa1SDavid Purdy #include <common.h>
141d0f5fa1SDavid Purdy #include <miiphy.h>
151d0f5fa1SDavid Purdy #include <asm/arch/cpu.h>
163dc23f78SStefan Roese #include <asm/arch/soc.h>
171d0f5fa1SDavid Purdy #include <asm/arch/mpp.h>
181d0f5fa1SDavid Purdy #include "pogo_e02.h"
191d0f5fa1SDavid Purdy
201d0f5fa1SDavid Purdy DECLARE_GLOBAL_DATA_PTR;
211d0f5fa1SDavid Purdy
board_early_init_f(void)221d0f5fa1SDavid Purdy int board_early_init_f(void)
231d0f5fa1SDavid Purdy {
241d0f5fa1SDavid Purdy /*
251d0f5fa1SDavid Purdy * default gpio configuration
261d0f5fa1SDavid Purdy * There are maximum 64 gpios controlled through 2 sets of registers
271d0f5fa1SDavid Purdy * the below configuration configures mainly initial LED status
281d0f5fa1SDavid Purdy */
29d5c5132fSStefan Roese mvebu_config_gpio(POGO_E02_OE_VAL_LOW,
301d0f5fa1SDavid Purdy POGO_E02_OE_VAL_HIGH,
311d0f5fa1SDavid Purdy POGO_E02_OE_LOW, POGO_E02_OE_HIGH);
321d0f5fa1SDavid Purdy
331d0f5fa1SDavid Purdy /* Multi-Purpose Pins Functionality configuration */
349d86f0c3SAlbert ARIBAUD static const u32 kwmpp_config[] = {
351d0f5fa1SDavid Purdy MPP0_NF_IO2,
361d0f5fa1SDavid Purdy MPP1_NF_IO3,
371d0f5fa1SDavid Purdy MPP2_NF_IO4,
381d0f5fa1SDavid Purdy MPP3_NF_IO5,
391d0f5fa1SDavid Purdy MPP4_NF_IO6,
401d0f5fa1SDavid Purdy MPP5_NF_IO7,
411d0f5fa1SDavid Purdy MPP6_SYSRST_OUTn,
421d0f5fa1SDavid Purdy MPP7_GPO,
431d0f5fa1SDavid Purdy MPP8_UART0_RTS,
441d0f5fa1SDavid Purdy MPP9_UART0_CTS,
451d0f5fa1SDavid Purdy MPP10_UART0_TXD,
461d0f5fa1SDavid Purdy MPP11_UART0_RXD,
471d0f5fa1SDavid Purdy MPP12_SD_CLK,
481d0f5fa1SDavid Purdy MPP13_SD_CMD,
491d0f5fa1SDavid Purdy MPP14_SD_D0,
501d0f5fa1SDavid Purdy MPP15_SD_D1,
511d0f5fa1SDavid Purdy MPP16_SD_D2,
521d0f5fa1SDavid Purdy MPP17_SD_D3,
531d0f5fa1SDavid Purdy MPP18_NF_IO0,
541d0f5fa1SDavid Purdy MPP19_NF_IO1,
551d0f5fa1SDavid Purdy MPP29_TSMP9, /* USB Power Enable */
561d0f5fa1SDavid Purdy MPP48_GPIO, /* LED green */
571d0f5fa1SDavid Purdy MPP49_GPIO, /* LED orange */
581d0f5fa1SDavid Purdy 0
591d0f5fa1SDavid Purdy };
6084683638SValentin Longchamp kirkwood_mpp_conf(kwmpp_config, NULL);
611d0f5fa1SDavid Purdy return 0;
621d0f5fa1SDavid Purdy }
631d0f5fa1SDavid Purdy
board_init(void)641d0f5fa1SDavid Purdy int board_init(void)
651d0f5fa1SDavid Purdy {
661d0f5fa1SDavid Purdy /* Boot parameters address */
67*96c5f081SStefan Roese gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
681d0f5fa1SDavid Purdy
691d0f5fa1SDavid Purdy return 0;
701d0f5fa1SDavid Purdy }
711d0f5fa1SDavid Purdy
721d0f5fa1SDavid Purdy #ifdef CONFIG_RESET_PHY_R
731d0f5fa1SDavid Purdy /* Configure and initialize PHY */
reset_phy(void)741d0f5fa1SDavid Purdy void reset_phy(void)
751d0f5fa1SDavid Purdy {
761d0f5fa1SDavid Purdy u16 reg;
771d0f5fa1SDavid Purdy u16 devadr;
781d0f5fa1SDavid Purdy char *name = "egiga0";
791d0f5fa1SDavid Purdy
801d0f5fa1SDavid Purdy if (miiphy_set_current_dev(name))
811d0f5fa1SDavid Purdy return;
821d0f5fa1SDavid Purdy
831d0f5fa1SDavid Purdy /* command to read PHY dev address */
841d0f5fa1SDavid Purdy if (miiphy_read(name, 0xEE, 0xEE, (u16 *) &devadr)) {
851d0f5fa1SDavid Purdy printf("Err..(%s) could not read PHY dev address\n", __func__);
861d0f5fa1SDavid Purdy return;
871d0f5fa1SDavid Purdy }
881d0f5fa1SDavid Purdy
891d0f5fa1SDavid Purdy /*
901d0f5fa1SDavid Purdy * Enable RGMII delay on Tx and Rx for CPU port
911d0f5fa1SDavid Purdy * Ref: sec 4.7.2 of chip datasheet
921d0f5fa1SDavid Purdy */
931d0f5fa1SDavid Purdy miiphy_write(name, devadr, MV88E1116_PGADR_REG, 2);
941d0f5fa1SDavid Purdy miiphy_read(name, devadr, MV88E1116_MAC_CTRL_REG, ®);
951d0f5fa1SDavid Purdy reg |= (MV88E1116_RGMII_RXTM_CTRL | MV88E1116_RGMII_TXTM_CTRL);
961d0f5fa1SDavid Purdy miiphy_write(name, devadr, MV88E1116_MAC_CTRL_REG, reg);
971d0f5fa1SDavid Purdy miiphy_write(name, devadr, MV88E1116_PGADR_REG, 0);
981d0f5fa1SDavid Purdy
991d0f5fa1SDavid Purdy /* reset the phy */
1001d0f5fa1SDavid Purdy miiphy_reset(name, devadr);
1011d0f5fa1SDavid Purdy
1021d0f5fa1SDavid Purdy debug("88E1116 Initialized on %s\n", name);
1031d0f5fa1SDavid Purdy }
1041d0f5fa1SDavid Purdy #endif /* CONFIG_RESET_PHY_R */
105