/*
 * Copyright (c) 2010 Broadcom Corporation
 *
 * 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 <linuxver.h>
#include <osl.h>
#include <bcmutils.h>

#include <dngl_stats.h>
#include <dhd.h>

#include <wlioctl.h>
#include <wl_iw.h>

#define WL_ERROR(x) printf x
#define WL_TRACE(x)

#ifdef CUSTOMER_HW
extern void bcm_wlan_power_off(int);
extern void bcm_wlan_power_on(int);
#endif				/* CUSTOMER_HW */
#ifdef CUSTOMER_HW2
int wifi_set_carddetect(int on);
int wifi_set_power(int on, unsigned long msec);
int wifi_get_irq_number(unsigned long *irq_flags_ptr);
#endif

#if defined(OOB_INTR_ONLY)

#if defined(BCMLXSDMMC)
extern int sdioh_mmc_irq(int irq);
#endif				/* (BCMLXSDMMC)  */

#ifdef CUSTOMER_HW3
#include <mach/gpio.h>
#endif

/* Customer specific Host GPIO defintion  */
static int dhd_oob_gpio_num = -1;	/* GG 19 */

module_param(dhd_oob_gpio_num, int, 0644);
MODULE_PARM_DESC(dhd_oob_gpio_num, "DHD oob gpio number");

int dhd_customer_oob_irq_map(unsigned long *irq_flags_ptr)
{
	int host_oob_irq = 0;

#ifdef CUSTOMER_HW2
	host_oob_irq = wifi_get_irq_number(irq_flags_ptr);

#else				/* for NOT  CUSTOMER_HW2 */
#if defined(CUSTOM_OOB_GPIO_NUM)
	if (dhd_oob_gpio_num < 0)
		dhd_oob_gpio_num = CUSTOM_OOB_GPIO_NUM;
#endif

	if (dhd_oob_gpio_num < 0) {
		WL_ERROR(("%s: ERROR customer specific Host GPIO is NOT defined\n",
			__func__));
		return dhd_oob_gpio_num;
	}

	WL_ERROR(("%s: customer specific Host GPIO number is (%d)\n",
		  __func__, dhd_oob_gpio_num));

#if defined CUSTOMER_HW
	host_oob_irq = MSM_GPIO_TO_INT(dhd_oob_gpio_num);
#elif defined CUSTOMER_HW3
	gpio_request(dhd_oob_gpio_num, "oob irq");
	host_oob_irq = gpio_to_irq(dhd_oob_gpio_num);
	gpio_direction_input(dhd_oob_gpio_num);
#endif				/* CUSTOMER_HW */
#endif				/* CUSTOMER_HW2 */

	return host_oob_irq;
}
#endif				/* defined(OOB_INTR_ONLY) */

/* Customer function to control hw specific wlan gpios */
void dhd_customer_gpio_wlan_ctrl(int onoff)
{
	switch (onoff) {
	case WLAN_RESET_OFF:
		WL_TRACE(("%s: call customer specific GPIO to insert WLAN RESET\n",
			__func__));
#ifdef CUSTOMER_HW
		bcm_wlan_power_off(2);
#endif				/* CUSTOMER_HW */
#ifdef CUSTOMER_HW2
		wifi_set_power(0, 0);
#endif
		WL_ERROR(("=========== WLAN placed in RESET ========\n"));
		break;

	case WLAN_RESET_ON:
		WL_TRACE(("%s: callc customer specific GPIO to remove WLAN RESET\n",
			__func__));
#ifdef CUSTOMER_HW
		bcm_wlan_power_on(2);
#endif				/* CUSTOMER_HW */
#ifdef CUSTOMER_HW2
		wifi_set_power(1, 0);
#endif
		WL_ERROR(("=========== WLAN going back to live  ========\n"));
		break;

	case WLAN_POWER_OFF:
		WL_TRACE(("%s: call customer specific GPIO to turn off WL_REG_ON\n",
			__func__));
#ifdef CUSTOMER_HW
		bcm_wlan_power_off(1);
#endif				/* CUSTOMER_HW */
		break;

	case WLAN_POWER_ON:
		WL_TRACE(("%s: call customer specific GPIO to turn on WL_REG_ON\n",
			__func__));
#ifdef CUSTOMER_HW
		bcm_wlan_power_on(1);
#endif				/* CUSTOMER_HW */
		/* Lets customer power to get stable */
		udelay(200);
		break;
	}
}

#ifdef GET_CUSTOM_MAC_ENABLE
/* Function to get custom MAC address */
int dhd_custom_get_mac_address(unsigned char *buf)
{
	WL_TRACE(("%s Enter\n", __func__));
	if (!buf)
		return -EINVAL;

	/* Customer access to MAC address stored outside of DHD driver */

#ifdef EXAMPLE_GET_MAC
	/* EXAMPLE code */
	{
		struct ether_addr ea_example = {
			{0x00, 0x11, 0x22, 0x33, 0x44, 0xFF} };
		bcopy((char *)&ea_example, buf, sizeof(struct ether_addr));
	}
#endif				/* EXAMPLE_GET_MAC */

	return 0;
}
#endif				/* GET_CUSTOM_MAC_ENABLE */
