/* * Copyright (C) 2011 Simon Guinot * * Based on Kirkwood support: * (C) Copyright 2009 * Marvell Semiconductor * Written-by: Prafulla Wadaskar * * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include #include #include #include #include "../common/common.h" #include "netdev.h" DECLARE_GLOBAL_DATA_PTR; /* GPIO configuration: start FAN at low speed, USB and HDD */ #define WIRELESS_SPACE_OE_LOW 0xFF006808 #define WIRELESS_SPACE_OE_HIGH 0x0000F989 #define WIRELESS_SPACE_OE_VAL_LOW 0x00010080 #define WIRELESS_SPACE_OE_VAL_HIGH 0x00000240 #define WIRELESS_SPACE_REAR_BUTTON 13 #define WIRELESS_SPACE_FRONT_BUTTON 43 const u32 kwmpp_config[] = { MPP0_NF_IO2, MPP1_NF_IO3, MPP2_NF_IO4, MPP3_NF_IO5, MPP4_NF_IO6, MPP5_NF_IO7, MPP6_SYSRST_OUTn, MPP7_GPO, /* Fan speed (bit 1) */ MPP8_TW_SDA, MPP9_TW_SCK, MPP10_UART0_TXD, MPP11_UART0_RXD, MPP13_GPIO, /* Red led */ MPP14_GPIO, /* USB fuse */ MPP15_SATA0_ACTn, MPP16_GPIO, /* SATA 0 power */ MPP17_GPIO, /* SATA 1 power */ MPP18_NF_IO0, MPP19_NF_IO1, MPP20_GE1_0, /* Gigabit Ethernet 1 */ MPP21_GE1_1, MPP22_GE1_2, MPP23_GE1_3, MPP24_GE1_4, MPP25_GE1_5, MPP26_GE1_6, MPP27_GE1_7, MPP28_GE1_8, MPP29_GE1_9, MPP30_GE1_10, MPP31_GE1_11, MPP32_GE1_12, MPP33_GE1_13, MPP34_GE1_14, MPP35_GE1_15, MPP36_GPIO, /* Fan speed (bit 2) */ MPP37_GPIO, /* Fan speed (bit 0) */ MPP38_GPIO, /* Fan power */ MPP39_GPIO, /* Fan rotation fail */ MPP40_GPIO, /* Ethernet switch link */ MPP41_GPIO, /* USB enable host vbus */ MPP42_GPIO, /* LED clock control */ MPP43_GPIO, /* WPS button (0=Pushed, 1=Released) */ MPP44_GPIO, /* Red LED on/off */ MPP45_GPIO, /* Red LED timer blink (on=off=100ms) */ MPP46_GPIO, /* Green LED on/off */ MPP47_GPIO, /* LED (blue, green) SATA activity blink */ MPP48_GPIO, /* Blue LED on/off */ 0 }; struct mv88e61xx_config swcfg = { .name = "egiga0", .vlancfg = MV88E61XX_VLANCFG_ROUTER, .rgmii_delay = MV88E61XX_RGMII_DELAY_EN, .led_init = MV88E61XX_LED_INIT_EN, .mdip = MV88E61XX_MDIP_NOCHANGE, .portstate = MV88E61XX_PORTSTT_FORWARDING, .cpuport = 0x20, .ports_enabled = 0x3F, }; int board_early_init_f(void) { /* Gpio configuration */ kw_config_gpio(WIRELESS_SPACE_OE_VAL_LOW, WIRELESS_SPACE_OE_VAL_HIGH, WIRELESS_SPACE_OE_LOW, WIRELESS_SPACE_OE_HIGH); /* Multi-Purpose Pins Functionality configuration */ kirkwood_mpp_conf(kwmpp_config, NULL); return 0; } int board_init(void) { /* Machine number */ gd->bd->bi_arch_number = CONFIG_MACH_TYPE; /* Boot parameters address */ gd->bd->bi_boot_params = kw_sdram_bar(0) + 0x100; return 0; } #if defined(CONFIG_MISC_INIT_R) int misc_init_r(void) { #if defined(CONFIG_CMD_I2C) && defined(CONFIG_SYS_I2C_EEPROM_ADDR) if (!getenv("ethaddr")) { uchar mac[6]; if (lacie_read_mac_address(mac) == 0) eth_setenv_enetaddr("ethaddr", mac); } #endif return 0; } #endif #if defined(CONFIG_CMD_NET) && defined(CONFIG_RESET_PHY_R) /* Configure and initialize PHY */ void reset_phy(void) { /* configure switch on egiga0 */ mv88e61xx_switch_initialize(&swcfg); } #endif #if defined(CONFIG_KIRKWOOD_GPIO) && defined(CONFIG_WIRELESS_SPACE_CMD) /* Return GPIO button status */ static int do_ws(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { if (strcmp(argv[1], "button") == 0) { if (strcmp(argv[2], "rear") == 0) /* invert GPIO result for intuitive while/until use */ return !kw_gpio_get_value(WIRELESS_SPACE_REAR_BUTTON); else if (strcmp(argv[2], "front") == 0) return kw_gpio_get_value(WIRELESS_SPACE_FRONT_BUTTON); else return -1; } else { return -1; } } U_BOOT_CMD(ws, 3, 0, do_ws, "Return GPIO button status 0=off 1=on", "- ws button rear|front: test buttons' states\n" ); #endif