xref: /rk3399_rockchip-uboot/board/Marvell/dreamplug/dreamplug.c (revision 96c5f0816a95c80e993140e34e1b06c016e90f36)
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  *
91a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
102e0c1c7dSJason Cooper  */
112e0c1c7dSJason Cooper 
122e0c1c7dSJason Cooper #include <common.h>
132e0c1c7dSJason Cooper #include <miiphy.h>
140ac16bf3SAnatolij Gustschin #include <asm/arch/cpu.h>
153dc23f78SStefan Roese #include <asm/arch/soc.h>
162e0c1c7dSJason Cooper #include <asm/arch/mpp.h>
172e0c1c7dSJason Cooper #include "dreamplug.h"
182e0c1c7dSJason Cooper 
192e0c1c7dSJason Cooper DECLARE_GLOBAL_DATA_PTR;
202e0c1c7dSJason Cooper 
board_early_init_f(void)212e0c1c7dSJason Cooper int board_early_init_f(void)
222e0c1c7dSJason Cooper {
232e0c1c7dSJason Cooper 	/*
242e0c1c7dSJason Cooper 	 * default gpio configuration
252e0c1c7dSJason Cooper 	 * There are maximum 64 gpios controlled through 2 sets of registers
262e0c1c7dSJason Cooper 	 * the  below configuration configures mainly initial LED status
272e0c1c7dSJason Cooper 	 */
28d5c5132fSStefan Roese 	mvebu_config_gpio(DREAMPLUG_OE_VAL_LOW,
292e0c1c7dSJason Cooper 			  DREAMPLUG_OE_VAL_HIGH,
302e0c1c7dSJason Cooper 			  DREAMPLUG_OE_LOW, DREAMPLUG_OE_HIGH);
312e0c1c7dSJason Cooper 
322e0c1c7dSJason Cooper 	/* Multi-Purpose Pins Functionality configuration */
339d86f0c3SAlbert ARIBAUD 	static const u32 kwmpp_config[] = {
342e0c1c7dSJason Cooper 		MPP0_SPI_SCn,		/* SPI Flash */
352e0c1c7dSJason Cooper 		MPP1_SPI_MOSI,
362e0c1c7dSJason Cooper 		MPP2_SPI_SCK,
372e0c1c7dSJason Cooper 		MPP3_SPI_MISO,
382e0c1c7dSJason Cooper 		MPP4_NF_IO6,
392e0c1c7dSJason Cooper 		MPP5_NF_IO7,
402e0c1c7dSJason Cooper 		MPP6_SYSRST_OUTn,
412e0c1c7dSJason Cooper 		MPP7_GPO,
422e0c1c7dSJason Cooper 		MPP8_TW_SDA,
432e0c1c7dSJason Cooper 		MPP9_TW_SCK,
442e0c1c7dSJason Cooper 		MPP10_UART0_TXD,	/* Serial */
452e0c1c7dSJason Cooper 		MPP11_UART0_RXD,
462e0c1c7dSJason Cooper 		MPP12_SD_CLK,		/* SDIO Slot */
472e0c1c7dSJason Cooper 		MPP13_SD_CMD,
482e0c1c7dSJason Cooper 		MPP14_SD_D0,
492e0c1c7dSJason Cooper 		MPP15_SD_D1,
502e0c1c7dSJason Cooper 		MPP16_SD_D2,
512e0c1c7dSJason Cooper 		MPP17_SD_D3,
522e0c1c7dSJason Cooper 		MPP18_NF_IO0,
532e0c1c7dSJason Cooper 		MPP19_NF_IO1,
542e0c1c7dSJason Cooper 		MPP20_GE1_0,		/* Gigabit Ethernet */
552e0c1c7dSJason Cooper 		MPP21_GE1_1,
562e0c1c7dSJason Cooper 		MPP22_GE1_2,
572e0c1c7dSJason Cooper 		MPP23_GE1_3,
582e0c1c7dSJason Cooper 		MPP24_GE1_4,
592e0c1c7dSJason Cooper 		MPP25_GE1_5,
602e0c1c7dSJason Cooper 		MPP26_GE1_6,
612e0c1c7dSJason Cooper 		MPP27_GE1_7,
622e0c1c7dSJason Cooper 		MPP28_GE1_8,
632e0c1c7dSJason Cooper 		MPP29_GE1_9,
642e0c1c7dSJason Cooper 		MPP30_GE1_10,
652e0c1c7dSJason Cooper 		MPP31_GE1_11,
662e0c1c7dSJason Cooper 		MPP32_GE1_12,
672e0c1c7dSJason Cooper 		MPP33_GE1_13,
682e0c1c7dSJason Cooper 		MPP34_GE1_14,
692e0c1c7dSJason Cooper 		MPP35_GE1_15,
702e0c1c7dSJason Cooper 		MPP36_GPIO,		/* 7 external GPIO pins (36 - 45) */
712e0c1c7dSJason Cooper 		MPP37_GPIO,
722e0c1c7dSJason Cooper 		MPP38_GPIO,
732e0c1c7dSJason Cooper 		MPP39_GPIO,
742e0c1c7dSJason Cooper 		MPP40_TDM_SPI_SCK,
752e0c1c7dSJason Cooper 		MPP41_TDM_SPI_MISO,
762e0c1c7dSJason Cooper 		MPP42_TDM_SPI_MOSI,
772e0c1c7dSJason Cooper 		MPP43_GPIO,
782e0c1c7dSJason Cooper 		MPP44_GPIO,
792e0c1c7dSJason Cooper 		MPP45_GPIO,
802e0c1c7dSJason Cooper 		MPP46_GPIO,
812e0c1c7dSJason Cooper 		MPP47_GPIO,		/* Bluetooth LED */
822e0c1c7dSJason Cooper 		MPP48_GPIO,		/* Wifi LED */
832e0c1c7dSJason Cooper 		MPP49_GPIO,		/* Wifi AP LED */
842e0c1c7dSJason Cooper 		0
852e0c1c7dSJason Cooper 	};
8684683638SValentin Longchamp 	kirkwood_mpp_conf(kwmpp_config, NULL);
872e0c1c7dSJason Cooper 	return 0;
882e0c1c7dSJason Cooper }
892e0c1c7dSJason Cooper 
board_init(void)902e0c1c7dSJason Cooper int board_init(void)
912e0c1c7dSJason Cooper {
922e0c1c7dSJason Cooper 	/* adress of boot parameters */
93*96c5f081SStefan Roese 	gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
942e0c1c7dSJason Cooper 
952e0c1c7dSJason Cooper 	return 0;
962e0c1c7dSJason Cooper }
972e0c1c7dSJason Cooper 
982e0c1c7dSJason Cooper #ifdef CONFIG_RESET_PHY_R
mv_phy_88e1116_init(char * name)992e0c1c7dSJason Cooper void mv_phy_88e1116_init(char *name)
1002e0c1c7dSJason Cooper {
1012e0c1c7dSJason Cooper 	u16 reg;
1022e0c1c7dSJason Cooper 	u16 devadr;
1032e0c1c7dSJason Cooper 
1042e0c1c7dSJason Cooper 	if (miiphy_set_current_dev(name))
1052e0c1c7dSJason Cooper 		return;
1062e0c1c7dSJason Cooper 
1072e0c1c7dSJason Cooper 	/* command to read PHY dev address */
1082e0c1c7dSJason Cooper 	if (miiphy_read(name, 0xEE, 0xEE, (u16 *) &devadr)) {
1092e0c1c7dSJason Cooper 		printf("Err..%s could not read PHY dev address\n",
1102e0c1c7dSJason Cooper 			__func__);
1112e0c1c7dSJason Cooper 		return;
1122e0c1c7dSJason Cooper 	}
1132e0c1c7dSJason Cooper 
1142e0c1c7dSJason Cooper 	/*
1152e0c1c7dSJason Cooper 	 * Enable RGMII delay on Tx and Rx for CPU port
1162e0c1c7dSJason Cooper 	 * Ref: sec 4.7.2 of chip datasheet
1172e0c1c7dSJason Cooper 	 */
1182e0c1c7dSJason Cooper 	miiphy_write(name, devadr, MV88E1116_PGADR_REG, 2);
1192e0c1c7dSJason Cooper 	miiphy_read(name, devadr, MV88E1116_MAC_CTRL2_REG, &reg);
1202e0c1c7dSJason Cooper 	reg |= (MV88E1116_RGMII_RXTM_CTRL | MV88E1116_RGMII_TXTM_CTRL);
1212e0c1c7dSJason Cooper 	miiphy_write(name, devadr, MV88E1116_MAC_CTRL2_REG, reg);
1222e0c1c7dSJason Cooper 	miiphy_write(name, devadr, MV88E1116_PGADR_REG, 0);
1232e0c1c7dSJason Cooper 
1242e0c1c7dSJason Cooper 	/* reset the phy */
1252e0c1c7dSJason Cooper 	miiphy_reset(name, devadr);
1262e0c1c7dSJason Cooper 
1272e0c1c7dSJason Cooper 	printf("88E1116 Initialized on %s\n", name);
1282e0c1c7dSJason Cooper }
1292e0c1c7dSJason Cooper 
reset_phy(void)1302e0c1c7dSJason Cooper void reset_phy(void)
1312e0c1c7dSJason Cooper {
1322e0c1c7dSJason Cooper 	/* configure and initialize both PHY's */
1332e0c1c7dSJason Cooper 	mv_phy_88e1116_init("egiga0");
1342e0c1c7dSJason Cooper 	mv_phy_88e1116_init("egiga1");
1352e0c1c7dSJason Cooper }
1362e0c1c7dSJason Cooper #endif /* CONFIG_RESET_PHY_R */
137