/*
 * Platform glue data for ST-Ericsson CW1200 driver
 *
 * Copyright (c) 2013, Sagrad, Inc
 * Author: Solomon Peachy <speachy@sagrad.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/module.h>
#include <linux/cw1200_platform.h>

MODULE_AUTHOR("Solomon Peachy <speachy@sagrad.com>");
MODULE_DESCRIPTION("ST-Ericsson CW1200 Platform glue driver");
MODULE_LICENSE("GPL");

/* Define just one of these.  Feel free to customize as needed */
#define SAGRAD_1091_1098_EVK_SDIO
/* #define SAGRAD_1091_1098_EVK_SPI */

#ifdef SAGRAD_1091_1098_EVK_SDIO
#if 0
static struct resource cw1200_href_resources[] = {
	{
		.start = 215,  /* fix me as appropriate */
		.end = 215,    /* ditto */
		.flags = IORESOURCE_IO,
		.name = "cw1200_wlan_reset",
	},
	{
		.start = 216,  /* fix me as appropriate */
		.end = 216,    /* ditto */
		.flags = IORESOURCE_IO,
		.name = "cw1200_wlan_powerup",
	},
	{
		.start = NOMADIK_GPIO_TO_IRQ(216), /* fix me as appropriate */
		.end = NOMADIK_GPIO_TO_IRQ(216),   /* ditto */
		.flags = IORESOURCE_IRQ,
		.name = "cw1200_wlan_irq",
	},
};
#endif

static int cw1200_power_ctrl(const struct cw1200_platform_data_sdio *pdata,
			     bool enable)
{
	/* Control 3v3 and 1v8 to hardware as appropriate */
	/* Note this is not needed if it's controlled elsewhere or always on */

	/* May require delay for power to stabilize */
	return 0;
}

static int cw1200_clk_ctrl(const struct cw1200_platform_data_sdio *pdata,
			   bool enable)
{
	/* Turn CLK_32K off and on as appropriate. */
	/* Note this is not needed if it's always on */

	/* May require delay for clock to stabilize */
	return 0;
}

static struct cw1200_platform_data_sdio cw1200_platform_data = {
	.ref_clk = 38400,
	.have_5ghz = false,
#if 0
	.reset = &cw1200_href_resources[0],
	.powerup = &cw1200_href_resources[1],
	.irq = &cw1200_href_resources[2],
#endif
	.power_ctrl = cw1200_power_ctrl,
	.clk_ctrl = cw1200_clk_ctrl,
/*	.macaddr = ??? */
	.sdd_file = "sdd_sagrad_1091_1098.bin",
};
#endif

#ifdef SAGRAD_1091_1098_EVK_SPI
/* Note that this is an example of integrating into your board support file */
static struct resource cw1200_href_resources[] = {
	{
		.start = GPIO_RF_RESET,
		.end = GPIO_RF_RESET,
		.flags = IORESOURCE_IO,
		.name = "cw1200_wlan_reset",
	},
	{
		.start = GPIO_RF_POWERUP,
		.end = GPIO_RF_POWERUP,
		.flags = IORESOURCE_IO,
		.name = "cw1200_wlan_powerup",
	},
};

static int cw1200_power_ctrl(const struct cw1200_platform_data_spi *pdata,
			     bool enable)
{
	/* Control 3v3 and 1v8 to hardware as appropriate */
	/* Note this is not needed if it's controlled elsewhere or always on */

	/* May require delay for power to stabilize */
	return 0;
}
static int cw1200_clk_ctrl(const struct cw1200_platform_data_spi *pdata,
			   bool enable)
{
	/* Turn CLK_32K off and on as appropriate. */
	/* Note this is not needed if it's always on */

	/* May require delay for clock to stabilize */
	return 0;
}

static struct cw1200_platform_data_spi cw1200_platform_data = {
	.ref_clk = 38400,
	.spi_bits_per_word = 16,
	.reset = &cw1200_href_resources[0],
	.powerup = &cw1200_href_resources[1],
	.power_ctrl = cw1200_power_ctrl,
	.clk_ctrl = cw1200_clk_ctrl,
/*	.macaddr = ??? */
	.sdd_file = "sdd_sagrad_1091_1098.bin",
};
static struct spi_board_info myboard_spi_devices[] __initdata = {
	{
		.modalias = "cw1200_wlan_spi",
		.max_speed_hz = 10000000, /* 52MHz Max */
		.bus_num = 0,
		.irq = WIFI_IRQ,
		.platform_data = &cw1200_platform_data,
		.chip_select = 0,
	},
};
#endif


const void *cw1200_get_platform_data(void)
{
	return &cw1200_platform_data;
}
EXPORT_SYMBOL_GPL(cw1200_get_platform_data);