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