1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
20ad6c34cSSuriyan Ramasami /*
30ad6c34cSSuriyan Ramasami  * Copyright (C) 2013 Suriyan Ramasami <suriyan.r@gmail.com>
40ad6c34cSSuriyan Ramasami  *
50ad6c34cSSuriyan Ramasami  * Based on dockstar.c originally written by
60ad6c34cSSuriyan Ramasami  * Copyright (C) 2010  Eric C. Cooper <ecc@cmu.edu>
70ad6c34cSSuriyan Ramasami  *
80ad6c34cSSuriyan Ramasami  * Based on sheevaplug.c originally written by
90ad6c34cSSuriyan Ramasami  * Prafulla Wadaskar <prafulla@marvell.com>
100ad6c34cSSuriyan Ramasami  * (C) Copyright 2009
110ad6c34cSSuriyan Ramasami  * Marvell Semiconductor <www.marvell.com>
120ad6c34cSSuriyan Ramasami  */
130ad6c34cSSuriyan Ramasami 
140ad6c34cSSuriyan Ramasami #include <common.h>
150ad6c34cSSuriyan Ramasami #include <miiphy.h>
16c62db35dSSimon Glass #include <asm/mach-types.h>
173dc23f78SStefan Roese #include <asm/arch/soc.h>
180ad6c34cSSuriyan Ramasami #include <asm/arch/mpp.h>
190ad6c34cSSuriyan Ramasami #include <asm/arch/cpu.h>
200ad6c34cSSuriyan Ramasami #include <asm/io.h>
210ad6c34cSSuriyan Ramasami 
220ad6c34cSSuriyan Ramasami DECLARE_GLOBAL_DATA_PTR;
230ad6c34cSSuriyan Ramasami 
board_early_init_f(void)240ad6c34cSSuriyan Ramasami int board_early_init_f(void)
250ad6c34cSSuriyan Ramasami {
260ad6c34cSSuriyan Ramasami 	/* Multi-Purpose Pins Functionality configuration */
270ad6c34cSSuriyan Ramasami 	static const u32 kwmpp_config[] = {
280ad6c34cSSuriyan Ramasami 		MPP0_NF_IO2,
290ad6c34cSSuriyan Ramasami 		MPP1_NF_IO3,
300ad6c34cSSuriyan Ramasami 		MPP2_NF_IO4,
310ad6c34cSSuriyan Ramasami 		MPP3_NF_IO5,
320ad6c34cSSuriyan Ramasami 		MPP4_NF_IO6,
330ad6c34cSSuriyan Ramasami 		MPP5_NF_IO7,
340ad6c34cSSuriyan Ramasami 		MPP6_SYSRST_OUTn,
350ad6c34cSSuriyan Ramasami 		MPP7_GPO,
360ad6c34cSSuriyan Ramasami 		MPP8_UART0_RTS,
370ad6c34cSSuriyan Ramasami 		MPP9_UART0_CTS,
380ad6c34cSSuriyan Ramasami 		MPP10_UART0_TXD,
390ad6c34cSSuriyan Ramasami 		MPP11_UART0_RXD,
400ad6c34cSSuriyan Ramasami 		MPP12_SD_CLK,
410ad6c34cSSuriyan Ramasami 		MPP13_SD_CMD,
420ad6c34cSSuriyan Ramasami 		MPP14_SD_D0,
430ad6c34cSSuriyan Ramasami 		MPP15_SD_D1,
440ad6c34cSSuriyan Ramasami 		MPP16_SD_D2,
450ad6c34cSSuriyan Ramasami 		MPP17_SD_D3,
460ad6c34cSSuriyan Ramasami 		MPP18_NF_IO0,
470ad6c34cSSuriyan Ramasami 		MPP19_NF_IO1,
480ad6c34cSSuriyan Ramasami 		MPP20_GPIO,
490ad6c34cSSuriyan Ramasami 		MPP21_GPIO,
500ad6c34cSSuriyan Ramasami 		MPP22_GPIO,
510ad6c34cSSuriyan Ramasami 		MPP23_GPIO,
520ad6c34cSSuriyan Ramasami 		MPP24_GPIO,
530ad6c34cSSuriyan Ramasami 		MPP25_GPIO,
540ad6c34cSSuriyan Ramasami 		MPP26_GPIO,
550ad6c34cSSuriyan Ramasami 		MPP27_GPIO,
560ad6c34cSSuriyan Ramasami 		MPP28_GPIO,
570ad6c34cSSuriyan Ramasami 		MPP29_TSMP9,
580ad6c34cSSuriyan Ramasami 		MPP30_GPIO,
590ad6c34cSSuriyan Ramasami 		MPP31_GPIO,
600ad6c34cSSuriyan Ramasami 		MPP32_GPIO,
610ad6c34cSSuriyan Ramasami 		MPP33_GPIO,
620ad6c34cSSuriyan Ramasami 		MPP34_GPIO,
630ad6c34cSSuriyan Ramasami 		MPP35_GPIO,
640ad6c34cSSuriyan Ramasami 		MPP36_GPIO,
650ad6c34cSSuriyan Ramasami 		MPP37_GPIO,
660ad6c34cSSuriyan Ramasami 		MPP38_GPIO,
670ad6c34cSSuriyan Ramasami 		MPP39_GPIO,
680ad6c34cSSuriyan Ramasami 		MPP40_GPIO,
690ad6c34cSSuriyan Ramasami 		MPP41_GPIO,
700ad6c34cSSuriyan Ramasami 		MPP42_GPIO,
710ad6c34cSSuriyan Ramasami 		MPP43_GPIO,
720ad6c34cSSuriyan Ramasami 		MPP44_GPIO,
730ad6c34cSSuriyan Ramasami 		MPP45_GPIO,
740ad6c34cSSuriyan Ramasami 		MPP46_GPIO,
750ad6c34cSSuriyan Ramasami 		MPP47_GPIO,
760ad6c34cSSuriyan Ramasami 		MPP48_GPIO,
770ad6c34cSSuriyan Ramasami 		MPP49_GPIO,
780ad6c34cSSuriyan Ramasami 		0
790ad6c34cSSuriyan Ramasami 	};
800ad6c34cSSuriyan Ramasami 
810ad6c34cSSuriyan Ramasami 	/*
820ad6c34cSSuriyan Ramasami 	 * default gpio configuration
830ad6c34cSSuriyan Ramasami 	 * There are maximum 64 gpios controlled through 2 sets of registers
840ad6c34cSSuriyan Ramasami 	 * the  below configuration configures mainly initial LED status
850ad6c34cSSuriyan Ramasami 	 */
86d5c5132fSStefan Roese 	mvebu_config_gpio(GOFLEXHOME_OE_VAL_LOW,
870ad6c34cSSuriyan Ramasami 			  GOFLEXHOME_OE_VAL_HIGH,
880ad6c34cSSuriyan Ramasami 			  GOFLEXHOME_OE_LOW, GOFLEXHOME_OE_HIGH);
890ad6c34cSSuriyan Ramasami 	kirkwood_mpp_conf(kwmpp_config, NULL);
900ad6c34cSSuriyan Ramasami 	return 0;
910ad6c34cSSuriyan Ramasami }
920ad6c34cSSuriyan Ramasami 
board_init(void)930ad6c34cSSuriyan Ramasami int board_init(void)
940ad6c34cSSuriyan Ramasami {
9594ba26f2STom Rini 	/*
9694ba26f2STom Rini 	 * arch number of board
9794ba26f2STom Rini 	 */
9894ba26f2STom Rini 	gd->bd->bi_arch_number = MACH_TYPE_GOFLEXHOME;
9994ba26f2STom Rini 
1000ad6c34cSSuriyan Ramasami 	/* address of boot parameters */
10196c5f081SStefan Roese 	gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
1020ad6c34cSSuriyan Ramasami 
1030ad6c34cSSuriyan Ramasami 	return 0;
1040ad6c34cSSuriyan Ramasami }
1050ad6c34cSSuriyan Ramasami 
1060ad6c34cSSuriyan Ramasami #ifdef CONFIG_RESET_PHY_R
1070ad6c34cSSuriyan Ramasami /* Configure and enable MV88E1116 PHY */
reset_phy(void)1080ad6c34cSSuriyan Ramasami void reset_phy(void)
1090ad6c34cSSuriyan Ramasami {
1100ad6c34cSSuriyan Ramasami 	u16 reg;
1110ad6c34cSSuriyan Ramasami 	u16 devadr;
1120ad6c34cSSuriyan Ramasami 	char *name = "egiga0";
1130ad6c34cSSuriyan Ramasami 
1140ad6c34cSSuriyan Ramasami 	if (miiphy_set_current_dev(name))
1150ad6c34cSSuriyan Ramasami 		return;
1160ad6c34cSSuriyan Ramasami 
1170ad6c34cSSuriyan Ramasami 	/* command to read PHY dev address */
1180ad6c34cSSuriyan Ramasami 	if (miiphy_read(name, 0xEE, 0xEE, (u16 *)&devadr)) {
1190ad6c34cSSuriyan Ramasami 		printf("Err..%s could not read PHY dev address\n",
1200ad6c34cSSuriyan Ramasami 		       __func__);
1210ad6c34cSSuriyan Ramasami 		return;
1220ad6c34cSSuriyan Ramasami 	}
1230ad6c34cSSuriyan Ramasami 
1240ad6c34cSSuriyan Ramasami 	/*
1250ad6c34cSSuriyan Ramasami 	 * Enable RGMII delay on Tx and Rx for CPU port
1260ad6c34cSSuriyan Ramasami 	 * Ref: sec 4.7.2 of chip datasheet
1270ad6c34cSSuriyan Ramasami 	 */
1280ad6c34cSSuriyan Ramasami 	miiphy_write(name, devadr, MV88E1116_PGADR_REG, 2);
1290ad6c34cSSuriyan Ramasami 	miiphy_read(name, devadr, MV88E1116_MAC_CTRL_REG, &reg);
1300ad6c34cSSuriyan Ramasami 	reg |= (MV88E1116_RGMII_RXTM_CTRL | MV88E1116_RGMII_TXTM_CTRL);
1310ad6c34cSSuriyan Ramasami 	miiphy_write(name, devadr, MV88E1116_MAC_CTRL_REG, reg);
1320ad6c34cSSuriyan Ramasami 	miiphy_write(name, devadr, MV88E1116_PGADR_REG, 0);
1330ad6c34cSSuriyan Ramasami 
1340ad6c34cSSuriyan Ramasami 	/* reset the phy */
1350ad6c34cSSuriyan Ramasami 	miiphy_reset(name, devadr);
1360ad6c34cSSuriyan Ramasami 
1370ad6c34cSSuriyan Ramasami 	printf("88E1116 Initialized on %s\n", name);
1380ad6c34cSSuriyan Ramasami }
1390ad6c34cSSuriyan Ramasami #endif /* CONFIG_RESET_PHY_R */
1400ad6c34cSSuriyan Ramasami 
1410ad6c34cSSuriyan Ramasami #define GREEN_LED	(1 << 14)
1420ad6c34cSSuriyan Ramasami #define ORANGE_LED	(1 << 15)
1430ad6c34cSSuriyan Ramasami #define BOTH_LEDS	(GREEN_LED | ORANGE_LED)
1440ad6c34cSSuriyan Ramasami #define NEITHER_LED	0
1450ad6c34cSSuriyan Ramasami 
set_leds(u32 leds,u32 blinking)1460ad6c34cSSuriyan Ramasami static void set_leds(u32 leds, u32 blinking)
1470ad6c34cSSuriyan Ramasami {
1480ad6c34cSSuriyan Ramasami 	struct kwgpio_registers *r;
1490ad6c34cSSuriyan Ramasami 	u32 oe;
1500ad6c34cSSuriyan Ramasami 	u32 bl;
1510ad6c34cSSuriyan Ramasami 
152d5c5132fSStefan Roese 	r = (struct kwgpio_registers *)MVEBU_GPIO1_BASE;
1530ad6c34cSSuriyan Ramasami 	oe = readl(&r->oe) | BOTH_LEDS;
1540ad6c34cSSuriyan Ramasami 	writel(oe & ~leds, &r->oe);	/* active low */
1550ad6c34cSSuriyan Ramasami 	bl = readl(&r->blink_en) & ~BOTH_LEDS;
1560ad6c34cSSuriyan Ramasami 	writel(bl | blinking, &r->blink_en);
1570ad6c34cSSuriyan Ramasami }
1580ad6c34cSSuriyan Ramasami 
show_boot_progress(int val)1590ad6c34cSSuriyan Ramasami void show_boot_progress(int val)
1600ad6c34cSSuriyan Ramasami {
1610ad6c34cSSuriyan Ramasami 	switch (val) {
1620ad6c34cSSuriyan Ramasami 	case BOOTSTAGE_ID_RUN_OS:		/* booting Linux */
1630ad6c34cSSuriyan Ramasami 		set_leds(BOTH_LEDS, NEITHER_LED);
1640ad6c34cSSuriyan Ramasami 		break;
1650ad6c34cSSuriyan Ramasami 	case BOOTSTAGE_ID_NET_ETH_START:	/* Ethernet initialization */
1660ad6c34cSSuriyan Ramasami 		set_leds(GREEN_LED, GREEN_LED);
1670ad6c34cSSuriyan Ramasami 		break;
1680ad6c34cSSuriyan Ramasami 	default:
1690ad6c34cSSuriyan Ramasami 		if (val < 0)	/* error */
1700ad6c34cSSuriyan Ramasami 			set_leds(ORANGE_LED, ORANGE_LED);
1710ad6c34cSSuriyan Ramasami 		break;
1720ad6c34cSSuriyan Ramasami 	}
1730ad6c34cSSuriyan Ramasami }
174