/*
 *  Support for Raidsonic NAS-4220-B
 *
 *  Copyright (C) 2009 Janos Laube <janos.dev@gmail.com>
 *
 * based on rut1xx.c
 *  Copyright (C) 2008 Paulius Zaleckas <paulius.zaleckas@teltonika.lt>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/leds.h>
#include <linux/input.h>
#include <linux/gpio_keys.h>
#include <linux/io.h>

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

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

#include "common.h"

static struct gpio_led ib4220b_leds[] = {
	{
		.name			= "nas4220b:orange:hdd",
		.default_trigger	= "none",
		.gpio			= 60,
	},
	{
		.name			= "nas4220b:green:os",
		.default_trigger	= "heartbeat",
		.gpio			= 62,
	},
};

static struct gpio_led_platform_data ib4220b_leds_data = {
	.num_leds	= ARRAY_SIZE(ib4220b_leds),
	.leds		= ib4220b_leds,
};

static struct platform_device ib4220b_led_device = {
	.name	= "leds-gpio",
	.id	= -1,
	.dev	= {
		.platform_data = &ib4220b_leds_data,
	},
};

static struct gpio_keys_button ib4220b_keys[] = {
	{
		.code		= KEY_SETUP,
		.gpio		= 61,
		.active_low	= 1,
		.desc		= "Backup Button",
		.type		= EV_KEY,
	},
	{
		.code		= KEY_RESTART,
		.gpio		= 63,
		.active_low	= 1,
		.desc		= "Softreset Button",
		.type		= EV_KEY,
	},
};

static struct gpio_keys_platform_data ib4220b_keys_data = {
	.buttons	= ib4220b_keys,
	.nbuttons	= ARRAY_SIZE(ib4220b_keys),
};

static struct platform_device ib4220b_key_device = {
	.name	= "gpio-keys",
	.id	= -1,
	.dev	= {
		.platform_data = &ib4220b_keys_data,
	},
};

static void __init ib4220b_init(void)
{
	gemini_gpio_init();
	platform_register_uart();
	platform_register_pflash(SZ_16M, NULL, 0);
	platform_device_register(&ib4220b_led_device);
	platform_device_register(&ib4220b_key_device);
	platform_register_rtc();
}

MACHINE_START(NAS4220B, "Raidsonic NAS IB-4220-B")
	.atag_offset	= 0x100,
	.map_io		= gemini_map_io,
	.init_irq	= gemini_init_irq,
	.init_time	= gemini_timer_init,
	.init_machine	= ib4220b_init,
	.restart	= gemini_restart,
MACHINE_END
