/*
 * board-rsi-ews.c
 *
 *  Copyright (C)
 *  2005 SAN People,
 *  2008-2011 R-S-I Elektrotechnik GmbH & Co. KG
 *
 * Licensed under GPLv2 or later.
 */

#include <linux/types.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/spi/spi.h>
#include <linux/mtd/physmap.h>

#include <asm/setup.h>
#include <asm/mach-types.h>
#include <asm/irq.h>

#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/mach/irq.h>

#include <mach/hardware.h>
#include <mach/board.h>

#include <linux/gpio.h>

#include "generic.h"

static void __init rsi_ews_init_early(void)
{
	/* Initialize processor: 18.432 MHz crystal */
	at91_initialize(18432000);

	/* Setup the LEDs */
	at91_init_leds(AT91_PIN_PB6, AT91_PIN_PB9);

	/* DBGU on ttyS0. (Rx & Tx only) */
	/* This one is for debugging */
	at91_register_uart(0, 0, 0);

	/* USART1 on ttyS2. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */
	/* Dialin/-out modem interface */
	at91_register_uart(AT91RM9200_ID_US1, 2, ATMEL_UART_CTS | ATMEL_UART_RTS
			   | ATMEL_UART_DTR | ATMEL_UART_DSR | ATMEL_UART_DCD
			   | ATMEL_UART_RI);

	/* USART3 on ttyS4. (Rx, Tx, RTS) */
	/* RS485 communication */
	at91_register_uart(AT91RM9200_ID_US3, 4, ATMEL_UART_RTS);

	/* set serial console to ttyS0 (ie, DBGU) */
	at91_set_serial_console(0);
}

/*
 * Ethernet
 */
static struct macb_platform_data rsi_ews_eth_data __initdata = {
	.phy_irq_pin	= AT91_PIN_PC4,
	.is_rmii	= 1,
};

/*
 * USB Host
 */
static struct at91_usbh_data rsi_ews_usbh_data __initdata = {
	.ports		= 1,
	.vbus_pin	= {-EINVAL, -EINVAL},
	.overcurrent_pin= {-EINVAL, -EINVAL},
};

/*
 * SD/MC
 */
static struct at91_mmc_data rsi_ews_mmc_data __initdata = {
	.slot_b		= 0,
	.wire4		= 1,
	.det_pin	= AT91_PIN_PB27,
	.wp_pin		= AT91_PIN_PB29,
};

/*
 * I2C
 */
static struct i2c_board_info rsi_ews_i2c_devices[] __initdata = {
	{
		I2C_BOARD_INFO("ds1337", 0x68),
	},
	{
		I2C_BOARD_INFO("24c01", 0x50),
	}
};

/*
 * LEDs
 */
static struct gpio_led rsi_ews_leds[] = {
	{
		.name			= "led0",
		.gpio			= AT91_PIN_PB6,
		.active_low		= 0,
	},
	{
		.name			= "led1",
		.gpio			= AT91_PIN_PB7,
		.active_low		= 0,
	},
	{
		.name			= "led2",
		.gpio			= AT91_PIN_PB8,
		.active_low		= 0,
	},
	{
		.name			= "led3",
		.gpio			= AT91_PIN_PB9,
		.active_low		= 0,
	},
};

/*
 * DataFlash
 */
static struct spi_board_info rsi_ews_spi_devices[] = {
	{	/* DataFlash chip 1*/
		.modalias	= "mtd_dataflash",
		.chip_select	= 0,
		.max_speed_hz	= 5 * 1000 * 1000,
	},
	{	/* DataFlash chip 2*/
		.modalias	= "mtd_dataflash",
		.chip_select	= 1,
		.max_speed_hz	= 5 * 1000 * 1000,
	},
};

/*
 * NOR flash
 */
static struct mtd_partition rsiews_nor_partitions[] = {
	{
		.name		= "boot",
		.offset		= 0,
		.size		= 3 * SZ_128K,
		.mask_flags	= MTD_WRITEABLE
	},
	{
		.name		= "kernel",
		.offset		= MTDPART_OFS_NXTBLK,
		.size		= SZ_2M - (3 * SZ_128K)
	},
	{
		.name		= "root",
		.offset		= MTDPART_OFS_NXTBLK,
		.size		= SZ_8M
	},
	{
		.name		= "kernelupd",
		.offset		= MTDPART_OFS_NXTBLK,
		.size		= 3 * SZ_512K,
		.mask_flags	= MTD_WRITEABLE
	},
	{
		.name		= "rootupd",
		.offset		= MTDPART_OFS_NXTBLK,
		.size		= 9 * SZ_512K,
		.mask_flags	= MTD_WRITEABLE
	},
};

static struct physmap_flash_data rsiews_nor_data = {
	.width		= 2,
	.parts		= rsiews_nor_partitions,
	.nr_parts	= ARRAY_SIZE(rsiews_nor_partitions),
};

#define NOR_BASE	AT91_CHIPSELECT_0
#define NOR_SIZE	SZ_16M

static struct resource nor_flash_resources[] = {
	{
		.start	= NOR_BASE,
		.end	= NOR_BASE + NOR_SIZE - 1,
		.flags	= IORESOURCE_MEM,
	}
};

static struct platform_device rsiews_nor_flash = {
	.name		= "physmap-flash",
	.id		= 0,
	.dev		= {
				.platform_data	= &rsiews_nor_data,
	},
	.resource	= nor_flash_resources,
	.num_resources	= ARRAY_SIZE(nor_flash_resources),
};

/*
 * Init Func
 */
static void __init rsi_ews_board_init(void)
{
	/* Serial */
	at91_add_device_serial();
	at91_set_gpio_output(AT91_PIN_PA21, 0);
	/* Ethernet */
	at91_add_device_eth(&rsi_ews_eth_data);
	/* USB Host */
	at91_add_device_usbh(&rsi_ews_usbh_data);
	/* I2C */
	at91_add_device_i2c(rsi_ews_i2c_devices,
			ARRAY_SIZE(rsi_ews_i2c_devices));
	/* SPI */
	at91_add_device_spi(rsi_ews_spi_devices,
			ARRAY_SIZE(rsi_ews_spi_devices));
	/* MMC */
	at91_add_device_mmc(0, &rsi_ews_mmc_data);
	/* NOR Flash */
	platform_device_register(&rsiews_nor_flash);
	/* LEDs */
	at91_gpio_leds(rsi_ews_leds, ARRAY_SIZE(rsi_ews_leds));
}

MACHINE_START(RSI_EWS, "RSI EWS")
	/* Maintainer: Josef Holzmayr <holzmayr@rsi-elektrotechnik.de> */
	.timer		= &at91rm9200_timer,
	.map_io		= at91_map_io,
	.init_early	= rsi_ews_init_early,
	.init_irq	= at91_init_irq_default,
	.init_machine	= rsi_ews_board_init,
MACHINE_END
