/*
 * Developed based on Atheros AP143 reference board support
 * - Removed LED support since WC LED does not need to display WAN or LAN
 *   status.
 *
 * Copyright (c) 2013 The Linux Foundation. All rights reserved.
 * Copyright (c) 2012 Gabor Juhos <juhosg@openwrt.org>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 */

#include <linux/platform_device.h>
#include <linux/ath9k_platform.h>
#include <linux/ar8216_platform.h>

#include <asm/mach-ath79/ar71xx_regs.h>

#include "common.h"
#include "dev-eth.h"
#include "dev-gfmn100.h"
#include "dev-spi.h"
#include "dev-usb.h"
#include "dev-wmac.h"
#include "machtypes.h"

#define AP143_MAC0_OFFSET		0
#define AP143_MAC1_OFFSET		6
#define AP143_WMAC_CALDATA_OFFSET	0x1000

void set_gpio_reg(u32 gpio_reg, u32 val)
{
	__raw_writel(val, (u32 *)KSEG1ADDR(AR71XX_GPIO_BASE + gpio_reg));
}

static void __init windcharger_setup(void)
{
	u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);

	ath79_register_gfmn100();

	ath79_register_wmac(art + AP143_WMAC_CALDATA_OFFSET, NULL);

	ath79_register_mdio(0, 0x0);
	ath79_register_mdio(1, 0x0);

	ath79_init_mac(ath79_eth0_data.mac_addr, art + AP143_MAC0_OFFSET, 0);
	ath79_init_mac(ath79_eth1_data.mac_addr, art + AP143_MAC1_OFFSET, 0);

	/* WAN port */
	ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
	ath79_eth0_data.speed = SPEED_100;
	ath79_eth0_data.duplex = DUPLEX_FULL;
	ath79_eth0_data.phy_mask = BIT(4);
	ath79_register_eth(0);

	/* LAN ports */
	ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
	ath79_eth1_data.speed = SPEED_100;
	ath79_eth1_data.duplex = DUPLEX_FULL;
	ath79_switch_data.phy_poll_mask |= BIT(4);
	ath79_switch_data.phy4_mii_en = 1;
	ath79_register_eth(1);

	set_gpio_reg(GFMN_GPIO_REG_OE, (GFMN_GPIO_POE | GFMN_GPIO_UART_RX |
	    GFMN_GPIO_RESET_SW | GFMN_GPIO_SPI_MISO));
	set_gpio_reg(GFMN_GPIO_REG_OUT, (GFMN_GPIO_SPI_CS | GFMN_GPIO_TEMP_CS));
	set_gpio_reg(GFMN_GPIO_REG_OUT_FUNC0, 0);
	set_gpio_reg(GFMN_GPIO_REG_OUT_FUNC1,
	    GFMN_GPIO_FUNC1_GPIO_5_SET(GFMN_GPIO_MUX_SPI_CS_0) |
	    GFMN_GPIO_FUNC1_GPIO_6_SET(GFMN_GPIO_MUX_SPI_CLK) |
	    GFMN_GPIO_FUNC1_GPIO_7_SET(GFMN_GPIO_MUX_SPI_MOSI));
	set_gpio_reg(GFMN_GPIO_REG_OUT_FUNC2,
	    GFMN_GPIO_FUNC2_GPIO_10_SET(GFMN_GPIO_MUX_UART_TX));
	set_gpio_reg(GFMN_GPIO_REG_OUT_FUNC3, 0);
	set_gpio_reg(GFMN_GPIO_REG_OUT_FUNC4,
	    GFMN_GPIO_FUNC4_GPIO_17_SET(GFMN_GPIO_MUX_SYS_RST_L));
}

MIPS_MACHINE(ATH79_MACH_GF_WINDCHARGER, "MN100",
             "Google Fiber windcharger MN100 board",
	     windcharger_setup);
