/*
 * Copyright (C) 2011 Simon Guinot <sguinot@lacie.com>
 *
 * Based on Kirkwood support:
 * (C) Copyright 2009
 * Marvell Semiconductor <www.marvell.com>
 * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#include <common.h>
#include <command.h>
#include <asm/arch/cpu.h>
#include <asm/arch/soc.h>
#include <asm/arch/mpp.h>
#include <asm/arch/gpio.h>

#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 */
	mvebu_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 = mvebu_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
