126749582SAjay Bhargav /*
226749582SAjay Bhargav * (C) Copyright 2011
326749582SAjay Bhargav * eInfochips Ltd. <www.einfochips.com>
4c7c47ca2SAjay Bhargav * Written-by: Ajay Bhargav <contact@8051projects.net>
526749582SAjay Bhargav *
626749582SAjay Bhargav * Based on Aspenite:
726749582SAjay Bhargav * (C) Copyright 2010
826749582SAjay Bhargav * Marvell Semiconductor <www.marvell.com>
926749582SAjay Bhargav * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
1026749582SAjay Bhargav * Contributor: Mahavir Jain <mjain@marvell.com>
1126749582SAjay Bhargav *
121a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
1326749582SAjay Bhargav */
1426749582SAjay Bhargav
1526749582SAjay Bhargav #include <common.h>
1626749582SAjay Bhargav #include <mvmfp.h>
17cebad164SPrafulla Wadaskar #include <asm/arch/cpu.h>
1826749582SAjay Bhargav #include <asm/arch/mfp.h>
1926749582SAjay Bhargav #include <asm/arch/armada100.h>
2047e75d72SAjay Bhargav #include <asm/gpio.h>
2147e75d72SAjay Bhargav #include <miiphy.h>
22*c62db35dSSimon Glass #include <asm/mach-types.h>
2326749582SAjay Bhargav
24aa0ecfebSAjay Bhargav #ifdef CONFIG_ARMADA100_FEC
25aa0ecfebSAjay Bhargav #include <net.h>
26aa0ecfebSAjay Bhargav #include <netdev.h>
27aa0ecfebSAjay Bhargav #endif /* CONFIG_ARMADA100_FEC */
28aa0ecfebSAjay Bhargav
2926749582SAjay Bhargav DECLARE_GLOBAL_DATA_PTR;
3026749582SAjay Bhargav
board_early_init_f(void)3126749582SAjay Bhargav int board_early_init_f(void)
3226749582SAjay Bhargav {
3326749582SAjay Bhargav u32 mfp_cfg[] = {
3426749582SAjay Bhargav /* I2C */
3526749582SAjay Bhargav MFP105_CI2C_SDA,
3626749582SAjay Bhargav MFP106_CI2C_SCL,
3726749582SAjay Bhargav
3826749582SAjay Bhargav /* Enable Console on UART3 */
3926749582SAjay Bhargav MFPO8_UART3_TXD,
4026749582SAjay Bhargav MFPO9_UART3_RXD,
41aa0ecfebSAjay Bhargav
42aa0ecfebSAjay Bhargav /* Ethernet PHY Interface */
43aa0ecfebSAjay Bhargav MFP086_ETH_TXCLK,
44aa0ecfebSAjay Bhargav MFP087_ETH_TXEN,
45aa0ecfebSAjay Bhargav MFP088_ETH_TXDQ3,
46aa0ecfebSAjay Bhargav MFP089_ETH_TXDQ2,
47aa0ecfebSAjay Bhargav MFP090_ETH_TXDQ1,
48aa0ecfebSAjay Bhargav MFP091_ETH_TXDQ0,
49aa0ecfebSAjay Bhargav MFP092_ETH_CRS,
50aa0ecfebSAjay Bhargav MFP093_ETH_COL,
51aa0ecfebSAjay Bhargav MFP094_ETH_RXCLK,
52aa0ecfebSAjay Bhargav MFP095_ETH_RXER,
53aa0ecfebSAjay Bhargav MFP096_ETH_RXDQ3,
54aa0ecfebSAjay Bhargav MFP097_ETH_RXDQ2,
55aa0ecfebSAjay Bhargav MFP098_ETH_RXDQ1,
56aa0ecfebSAjay Bhargav MFP099_ETH_RXDQ0,
57aa0ecfebSAjay Bhargav MFP100_ETH_MDC,
58aa0ecfebSAjay Bhargav MFP101_ETH_MDIO,
59aa0ecfebSAjay Bhargav MFP103_ETH_RXDV,
60aa0ecfebSAjay Bhargav
61daa4b2f7SAjay Bhargav /* SSP2 */
62daa4b2f7SAjay Bhargav MFP107_SSP2_RXD,
63daa4b2f7SAjay Bhargav MFP108_SSP2_TXD,
64daa4b2f7SAjay Bhargav MFP110_SSP2_CS,
65daa4b2f7SAjay Bhargav MFP111_SSP2_CLK,
66daa4b2f7SAjay Bhargav
6726749582SAjay Bhargav MFP_EOC /*End of configuration*/
6826749582SAjay Bhargav };
6926749582SAjay Bhargav /* configure MFP's */
7026749582SAjay Bhargav mfp_config(mfp_cfg);
7126749582SAjay Bhargav return 0;
7226749582SAjay Bhargav }
7326749582SAjay Bhargav
board_init(void)7426749582SAjay Bhargav int board_init(void)
7526749582SAjay Bhargav {
76daa4b2f7SAjay Bhargav struct armd1apb2_registers *apb2_regs =
77daa4b2f7SAjay Bhargav (struct armd1apb2_registers *)ARMD1_APBC2_BASE;
78daa4b2f7SAjay Bhargav
7926749582SAjay Bhargav /* arch number of Board */
8092a1babfSTom Rini gd->bd->bi_arch_number = MACH_TYPE_GPLUGD;
8126749582SAjay Bhargav /* adress of boot parameters */
8226749582SAjay Bhargav gd->bd->bi_boot_params = armd1_sdram_base(0) + 0x100;
8347e75d72SAjay Bhargav /* Assert PHY_RST# */
8447e75d72SAjay Bhargav gpio_direction_output(CONFIG_SYS_GPIO_PHY_RST, GPIO_LOW);
8547e75d72SAjay Bhargav udelay(10);
8647e75d72SAjay Bhargav /* Deassert PHY_RST# */
8747e75d72SAjay Bhargav gpio_set_value(CONFIG_SYS_GPIO_PHY_RST, GPIO_HIGH);
88daa4b2f7SAjay Bhargav
89daa4b2f7SAjay Bhargav /* Enable SSP2 clock */
90daa4b2f7SAjay Bhargav writel(SSP2_APBCLK | SSP2_FNCLK, &apb2_regs->ssp2_clkrst);
9126749582SAjay Bhargav return 0;
9226749582SAjay Bhargav }
93aa0ecfebSAjay Bhargav
94aa0ecfebSAjay Bhargav #ifdef CONFIG_ARMADA100_FEC
board_eth_init(bd_t * bis)95aa0ecfebSAjay Bhargav int board_eth_init(bd_t *bis)
96aa0ecfebSAjay Bhargav {
97aa0ecfebSAjay Bhargav struct armd1apmu_registers *apmu_regs =
98aa0ecfebSAjay Bhargav (struct armd1apmu_registers *)ARMD1_APMU_BASE;
99aa0ecfebSAjay Bhargav
100aa0ecfebSAjay Bhargav /* Enable clock of ethernet controller */
101aa0ecfebSAjay Bhargav writel(FE_CLK_RST | FE_CLK_ENA, &apmu_regs->fecrc);
102aa0ecfebSAjay Bhargav
103aa0ecfebSAjay Bhargav return armada100_fec_register(ARMD1_FEC_BASE);
104aa0ecfebSAjay Bhargav }
10547e75d72SAjay Bhargav
10647e75d72SAjay Bhargav #ifdef CONFIG_RESET_PHY_R
10747e75d72SAjay Bhargav /* Configure and initialize PHY chip 88E3015 */
reset_phy(void)10847e75d72SAjay Bhargav void reset_phy(void)
10947e75d72SAjay Bhargav {
11047e75d72SAjay Bhargav u16 phy_adr;
11147e75d72SAjay Bhargav const char *name = "armd-fec0";
11247e75d72SAjay Bhargav
11347e75d72SAjay Bhargav if (miiphy_set_current_dev(name))
11447e75d72SAjay Bhargav return;
11547e75d72SAjay Bhargav
11647e75d72SAjay Bhargav /* command to read PHY dev address */
11747e75d72SAjay Bhargav if (miiphy_read(name, 0xff, 0xff, &phy_adr)) {
11847e75d72SAjay Bhargav printf("Err..%s could not read PHY dev address\n", __func__);
11947e75d72SAjay Bhargav return;
12047e75d72SAjay Bhargav }
12147e75d72SAjay Bhargav
12247e75d72SAjay Bhargav /* Set Ethernet LED in TX blink mode */
12347e75d72SAjay Bhargav miiphy_write(name, phy_adr, PHY_LED_MAN_REG, 0x00);
12447e75d72SAjay Bhargav miiphy_write(name, phy_adr, PHY_LED_PAR_SEL_REG, PHY_LED_VAL);
12547e75d72SAjay Bhargav
12647e75d72SAjay Bhargav /* reset the phy */
12747e75d72SAjay Bhargav miiphy_reset(name, phy_adr);
12847e75d72SAjay Bhargav debug("88E3015 Initialized on %s\n", name);
12947e75d72SAjay Bhargav }
13047e75d72SAjay Bhargav #endif /* CONFIG_RESET_PHY_R */
131aa0ecfebSAjay Bhargav #endif /* CONFIG_ARMADA100_FEC */
132