/*
 * arch/arm/mach-ambarella/init-coconut.c
 *
 * Author: Anthony Ginger <hfjiang@ambarella.com>
 *
 * Copyright (C) 2004-2010, Ambarella, Inc.
 *
 * 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.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 */

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/dma-mapping.h>
#include <linux/spi/spi.h>
#include <linux/spi/spidev.h>
#include <linux/i2c.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/input.h>
#include <linux/pda_power.h>
#include <sound/ak4642_amb.h>

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

#include <plat/ambinput.h>

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

#include "board-device.h"
#include <mach/init-dropcam.h>

/* ==========================================================================*/
 static int ambarella_power_is_ac_online(void)
 {
 	return 1;
 }

 static struct pda_power_pdata  ambarella_power_supply_info = {
 	.is_ac_online    = ambarella_power_is_ac_online,
 };

 static struct platform_device ambarella_power_supply = {
 	.name = "pda-power",
 	.id   = -1,
 	.dev  = {
 		.platform_data = &ambarella_power_supply_info,
 	},
 };

/* ==========================================================================*/
 static struct platform_device *ambarella_devices[] __initdata = {
 	&ambarella_adc0,
 	&ambarella_crypto,
//  &ambarella_eth0,
 	&ambarella_fb0,
 	&ambarella_fb1,
 	&ambarella_i2s0,
 	&ambarella_pcm0,
 	&ambarella_dummy_codec0,
 	&ambarella_idc0,
 	&ambarella_idc1,
 	&ambarella_i2cmux,
//  &ambarella_ir0,
 	&ambarella_sd0,
//  &ambarella_spi0,
//  &ambarella_spi1,
//  &ambarella_spi_slave,
 	&ambarella_uart,
//  &ambarella_uart1,
 	&ambarella_udc0,
 	&ambarella_wdt0,
 	&ambarella_pwm_platform_device0,
//  &ambarella_pwm_platform_device1,
//  &ambarella_pwm_platform_device2,
//  &ambarella_pwm_platform_device3,
//  &ambarella_pwm_platform_device4,
 	&ambarella_power_supply,
 	&ambarella_fsg_device0,
 	&ambarella_usb_device0,
 };

/* ==========================================================================*/
 static struct ambarella_key_table dropcam_keymap[AMBINPUT_TABLE_SIZE] = {
 	{AMBINPUT_VI_KEY,       {.vi_key        = {0,   0,      0}}},
 	{AMBINPUT_VI_REL,       {.vi_rel        = {0,   0,      0}}},
 	{AMBINPUT_VI_ABS,       {.vi_abs        = {0,   0,      0}}},
 	{AMBINPUT_VI_SW,        {.vi_sw         = {0,   0,      0}}},

	{AMBINPUT_GPIO_KEY,     {.gpio_key      = {KEY_CONFIG,   0, 1, GPIO(35), IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING}}},

 	{AMBINPUT_END}
 };

 static struct ambarella_input_board_info dropcam_board_input_info = {
	.pkeymap		= dropcam_keymap,
	.pinput_dev		= NULL,
	.pdev			= NULL,

	.abx_max_x		= 4095,
	.abx_max_y		= 4095,
	.abx_max_pressure	= 4095,
	.abx_max_width		= 16,
};

static struct platform_device dropcam_board_input = {
	.name		= "ambarella-input",
	.id		= -1,
	.resource	= NULL,
	.num_resources	= 0,
	.dev		= {
		.platform_data		= &dropcam_board_input_info,
		.dma_mask		= &ambarella_dmamask,
		.coherent_dma_mask	= DMA_BIT_MASK(32),
	}
};

/* ==========================================================================*/
#define AK4642_RESET_PIN  12
#define AK4642_RESET_DELAY  1

 static struct ak4642_platform_data coconut_ak4642_pdata = {
 	.rst_pin  = AK4642_RESET_PIN,
 	.rst_delay  = AK4642_RESET_DELAY,
 };

 static struct i2c_board_info ambarella_ak4642_board_info = {
 	I2C_BOARD_INFO("ak4642", 0x12),
 	.platform_data  = &coconut_ak4642_pdata,
 };

/* ==========================================================================*/
 void init_dropcam_r1r2(void)
 {
 	int         i;

 	ambarella_init_machine("Dropcam");

 	printk("Initializing R1/R2 Dropcam board (revision %d)\n", AMBARELLA_BOARD_REV(system_rev));

	/* Config Board */
 	ambarella_board_generic.power_detect.irq_gpio = GPIO(11);
 	ambarella_board_generic.power_detect.irq_line = gpio_to_irq(11);
 	ambarella_board_generic.power_detect.irq_type = IRQF_TRIGGER_FALLING;
 	ambarella_board_generic.power_detect.irq_gpio_val = GPIO_LOW;
 	ambarella_board_generic.power_detect.irq_gpio_mode = GPIO_FUNC_SW_INPUT;

 	ambarella_board_generic.vin0_vsync.irq_gpio = GPIO(95);
 	ambarella_board_generic.vin0_vsync.irq_line = gpio_to_irq(95);
 	ambarella_board_generic.vin0_vsync.irq_type = IRQF_TRIGGER_RISING;
 	ambarella_board_generic.vin0_vsync.irq_gpio_val = GPIO_HIGH;
 	ambarella_board_generic.vin0_vsync.irq_gpio_mode = GPIO_FUNC_SW_INPUT;

	//ambarella_board_generic.vin0_reset.gpio_id = GPIO(93);
	//ambarella_board_generic.vin0_reset.active_level = GPIO_LOW;
	//ambarella_board_generic.vin0_reset.active_delay = 200;

	/* Config SD */
 	ambarella_platform_sd_controller0.max_clock = 25000000;
 	fio_default_owner = SELECT_FIO_SDIO;
 	ambarella_platform_sd_controller0.slot[0].cd_delay = 100;
 	ambarella_platform_sd_controller0.slot[0].fixed_wp = 0;
 	ambarella_platform_sd_controller0.slot[0].fixed_cd = 0;
 	ambarella_platform_sd_controller0.slot[0].gpio_cd.irq_gpio = -1;
 	ambarella_platform_sd_controller0.slot[0].gpio_cd.irq_line = -1;
 	ambarella_platform_sd_controller0.slot[0].gpio_cd.irq_type = -1;
 	ambarella_platform_sd_controller0.slot[0].gpio_cd.irq_gpio_val = GPIO_LOW;
 	ambarella_platform_sd_controller0.slot[0].gpio_cd.irq_gpio_mode = GPIO_FUNC_SW_INPUT;

 	ambarella_platform_sd_controller0.slot[1].cd_delay = 100;
 	ambarella_platform_sd_controller0.slot[1].fixed_wp = 0;
 	ambarella_platform_sd_controller0.slot[1].fixed_cd = 0;
 	ambarella_platform_sd_controller0.slot[1].gpio_cd.irq_gpio = -1;
 	ambarella_platform_sd_controller0.slot[1].gpio_cd.irq_line = -1;
 	ambarella_platform_sd_controller0.slot[1].gpio_cd.irq_type = -1;
 	ambarella_platform_sd_controller0.slot[1].gpio_cd.irq_gpio_val = GPIO_LOW;
 	ambarella_platform_sd_controller0.slot[1].gpio_cd.irq_gpio_mode = GPIO_FUNC_SW_INPUT;

 	ambarella_board_generic.wifi_sd_bus = 0;
 	ambarella_board_generic.wifi_sd_slot = 1;

 	ambarella_board_generic.wifi_power.gpio_id = GPIO(51);
 	ambarella_board_generic.wifi_power.active_level = GPIO_HIGH;
 	ambarella_board_generic.wifi_power.active_delay = 100;

 	ambarella_board_generic.vin0_power.gpio_id = GPIO(53);
 	ambarella_board_generic.vin0_power.active_level = GPIO_HIGH;
 	ambarella_board_generic.vin0_power.active_delay = 100;

 	ambarella_board_generic.vin0_reset.gpio_id = GPIO(52);
 	ambarella_board_generic.vin0_reset.active_level = GPIO_HIGH;
 	ambarella_board_generic.vin0_reset.active_delay = 100;

	/* Register devices */
 	platform_add_devices(ambarella_devices, ARRAY_SIZE(ambarella_devices));
 	for (i = 0; i < ARRAY_SIZE(ambarella_devices); i++) {
 		device_set_wakeup_capable(&ambarella_devices[i]->dev, 1);
 		device_set_wakeup_enable(&ambarella_devices[i]->dev, 0);
 	}

 	i2c_register_board_info(0, &ambarella_ak4642_board_info, 1);

 	i2c_register_board_info(0, ambarella_board_vin_infos, ARRAY_SIZE(ambarella_board_vin_infos));
 	i2c_register_board_info(1, &ambarella_board_hdmi_info, 1);

 	if (AMBARELLA_BOARD_REV(system_rev) >= 17) {
 		i2c_register_board_info(2, &ambarella_isl12022m_board_info, 1);
 	} else {
 		platform_device_register(&ambarella_rtc0);
 	}

 	platform_device_register(&dropcam_board_input);
 }

