19637c4b2SEvgeni Dobrev /*
29637c4b2SEvgeni Dobrev * Copyright (C) 2014 Evgeni Dobrev <evgeni@studio-punkt.com>
39637c4b2SEvgeni Dobrev *
49637c4b2SEvgeni Dobrev * Based on sheevaplug.c originally written by
59637c4b2SEvgeni Dobrev * Prafulla Wadaskar <prafulla@marvell.com>
69637c4b2SEvgeni Dobrev * (C) Copyright 2009
79637c4b2SEvgeni Dobrev * Marvell Semiconductor <www.marvell.com>
89637c4b2SEvgeni Dobrev *
99637c4b2SEvgeni Dobrev * SPDX-License-Identifier: GPL-2.0+
109637c4b2SEvgeni Dobrev */
119637c4b2SEvgeni Dobrev
129637c4b2SEvgeni Dobrev #include <common.h>
139637c4b2SEvgeni Dobrev #include <miiphy.h>
14*c62db35dSSimon Glass #include <asm/mach-types.h>
159637c4b2SEvgeni Dobrev #include <asm/arch/soc.h>
169637c4b2SEvgeni Dobrev #include <asm/arch/mpp.h>
179637c4b2SEvgeni Dobrev #include <asm/arch/cpu.h>
189637c4b2SEvgeni Dobrev #include <asm/io.h>
199637c4b2SEvgeni Dobrev
209637c4b2SEvgeni Dobrev DECLARE_GLOBAL_DATA_PTR;
219637c4b2SEvgeni Dobrev
board_early_init_f(void)229637c4b2SEvgeni Dobrev int board_early_init_f(void)
239637c4b2SEvgeni Dobrev {
249637c4b2SEvgeni Dobrev /*
259637c4b2SEvgeni Dobrev * default gpio configuration
269637c4b2SEvgeni Dobrev */
279637c4b2SEvgeni Dobrev mvebu_config_gpio(NAS220_GE_OE_VAL_LOW, NAS220_GE_OE_VAL_HIGH,
289637c4b2SEvgeni Dobrev NAS220_GE_OE_LOW, NAS220_GE_OE_HIGH);
299637c4b2SEvgeni Dobrev
309637c4b2SEvgeni Dobrev /* Multi-Purpose Pins Functionality configuration */
319637c4b2SEvgeni Dobrev static const u32 kwmpp_config[] = {
329637c4b2SEvgeni Dobrev MPP0_NF_IO2,
339637c4b2SEvgeni Dobrev MPP1_NF_IO3,
349637c4b2SEvgeni Dobrev MPP2_NF_IO4,
359637c4b2SEvgeni Dobrev MPP3_NF_IO5,
369637c4b2SEvgeni Dobrev MPP4_NF_IO6,
379637c4b2SEvgeni Dobrev MPP5_NF_IO7,
389637c4b2SEvgeni Dobrev MPP6_SYSRST_OUTn,
399637c4b2SEvgeni Dobrev MPP7_SPI_SCn,
409637c4b2SEvgeni Dobrev MPP8_TW_SDA,
419637c4b2SEvgeni Dobrev MPP9_TW_SCK,
429637c4b2SEvgeni Dobrev MPP10_UART0_TXD,
439637c4b2SEvgeni Dobrev MPP11_UART0_RXD,
449637c4b2SEvgeni Dobrev MPP12_GPO,
459637c4b2SEvgeni Dobrev MPP13_GPIO,
469637c4b2SEvgeni Dobrev MPP14_GPIO,
479637c4b2SEvgeni Dobrev MPP15_SATA0_ACTn,
489637c4b2SEvgeni Dobrev MPP16_SATA1_ACTn,
499637c4b2SEvgeni Dobrev MPP17_SATA0_PRESENTn,
509637c4b2SEvgeni Dobrev MPP18_NF_IO0,
519637c4b2SEvgeni Dobrev MPP19_NF_IO1,
529637c4b2SEvgeni Dobrev MPP20_GPIO,
539637c4b2SEvgeni Dobrev MPP21_GPIO,
549637c4b2SEvgeni Dobrev MPP22_GPIO,
559637c4b2SEvgeni Dobrev MPP23_GPIO,
569637c4b2SEvgeni Dobrev MPP24_GPIO,
579637c4b2SEvgeni Dobrev MPP25_GPIO,
589637c4b2SEvgeni Dobrev MPP26_GPIO,
599637c4b2SEvgeni Dobrev MPP27_GPIO,
609637c4b2SEvgeni Dobrev MPP28_GPIO,
619637c4b2SEvgeni Dobrev MPP29_GPIO,
629637c4b2SEvgeni Dobrev MPP30_GPIO,
639637c4b2SEvgeni Dobrev MPP31_GPIO,
649637c4b2SEvgeni Dobrev MPP32_GPIO,
659637c4b2SEvgeni Dobrev MPP33_GPIO,
669637c4b2SEvgeni Dobrev MPP34_GPIO,
679637c4b2SEvgeni Dobrev MPP35_GPIO,
689637c4b2SEvgeni Dobrev 0
699637c4b2SEvgeni Dobrev };
709637c4b2SEvgeni Dobrev kirkwood_mpp_conf(kwmpp_config, NULL);
719637c4b2SEvgeni Dobrev return 0;
729637c4b2SEvgeni Dobrev }
739637c4b2SEvgeni Dobrev
board_init(void)749637c4b2SEvgeni Dobrev int board_init(void)
759637c4b2SEvgeni Dobrev {
769637c4b2SEvgeni Dobrev /*
779637c4b2SEvgeni Dobrev * arch number of board
789637c4b2SEvgeni Dobrev */
7992a1babfSTom Rini gd->bd->bi_arch_number = MACH_TYPE_RD88F6192_NAS;
809637c4b2SEvgeni Dobrev
819637c4b2SEvgeni Dobrev /* adress of boot parameters */
829637c4b2SEvgeni Dobrev gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
839637c4b2SEvgeni Dobrev
849637c4b2SEvgeni Dobrev return 0;
859637c4b2SEvgeni Dobrev }
869637c4b2SEvgeni Dobrev
879637c4b2SEvgeni Dobrev #ifdef CONFIG_RESET_PHY_R
889637c4b2SEvgeni Dobrev /* Configure and enable MV88E1116 PHY */
reset_phy(void)899637c4b2SEvgeni Dobrev void reset_phy(void)
909637c4b2SEvgeni Dobrev {
919637c4b2SEvgeni Dobrev u16 reg;
929637c4b2SEvgeni Dobrev u16 devadr;
939637c4b2SEvgeni Dobrev char *name = "egiga0";
949637c4b2SEvgeni Dobrev
959637c4b2SEvgeni Dobrev if (miiphy_set_current_dev(name))
969637c4b2SEvgeni Dobrev return;
979637c4b2SEvgeni Dobrev
989637c4b2SEvgeni Dobrev /* command to read PHY dev address */
999637c4b2SEvgeni Dobrev if (miiphy_read(name, 0xEE, 0xEE, (u16 *)&devadr)) {
1009637c4b2SEvgeni Dobrev printf("Err..%s could not read PHY dev address\n", __func__);
1019637c4b2SEvgeni Dobrev return;
1029637c4b2SEvgeni Dobrev }
1039637c4b2SEvgeni Dobrev
1049637c4b2SEvgeni Dobrev /*
1059637c4b2SEvgeni Dobrev * Enable RGMII delay on Tx and Rx for CPU port
1069637c4b2SEvgeni Dobrev * Ref: sec 4.7.2 of chip datasheet
1079637c4b2SEvgeni Dobrev */
1089637c4b2SEvgeni Dobrev miiphy_write(name, devadr, MV88E1116_PGADR_REG, 2);
1099637c4b2SEvgeni Dobrev miiphy_read(name, devadr, MV88E1116_MAC_CTRL_REG, ®);
1109637c4b2SEvgeni Dobrev reg |= (MV88E1116_RGMII_RXTM_CTRL | MV88E1116_RGMII_TXTM_CTRL);
1119637c4b2SEvgeni Dobrev miiphy_write(name, devadr, MV88E1116_MAC_CTRL_REG, reg);
1129637c4b2SEvgeni Dobrev miiphy_write(name, devadr, MV88E1116_PGADR_REG, 0);
1139637c4b2SEvgeni Dobrev
1149637c4b2SEvgeni Dobrev /* reset the phy */
1159637c4b2SEvgeni Dobrev miiphy_reset(name, devadr);
1169637c4b2SEvgeni Dobrev
1179637c4b2SEvgeni Dobrev printf("88E1116 Initialized on %s\n", name);
1189637c4b2SEvgeni Dobrev }
1199637c4b2SEvgeni Dobrev #endif /* CONFIG_RESET_PHY_R */
120