]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/staging/brcm80211/brcmfmac/dhd_custom_gpio.c
Merge branch 'master' into csb1725
[mv-sheeva.git] / drivers / staging / brcm80211 / brcmfmac / dhd_custom_gpio.c
diff --git a/drivers/staging/brcm80211/brcmfmac/dhd_custom_gpio.c b/drivers/staging/brcm80211/brcmfmac/dhd_custom_gpio.c
new file mode 100644 (file)
index 0000000..f647034
--- /dev/null
@@ -0,0 +1,160 @@
+/*
+ * 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 */