Home | History | Annotate | Download | only in sys
      1 /*
      2 * Customer code to add GPIO control during WLAN start/stop
      3 * Copyright (C) 1999-2010, Broadcom Corporation
      4 *
      5 *      Unless you and Broadcom execute a separate written software license
      6 * agreement governing use of this software, this software is licensed to you
      7 * under the terms of the GNU General Public License version 2 (the "GPL"),
      8 * available at http://www.broadcom.com/licenses/GPLv2.php, with the
      9 * following added to such license:
     10 *
     11 *      As a special exception, the copyright holders of this software give you
     12 * permission to link this software with independent modules, and to copy and
     13 * distribute the resulting executable under terms of your choice, provided that
     14 * you also meet, for each linked independent module, the terms and conditions of
     15 * the license of that module.  An independent module is a module which is not
     16 * derived from this software.  The special exception does not apply to any
     17 * modifications of the software.
     18 *
     19 *      Notwithstanding the above, under no circumstances may you combine this
     20 * software in any way with any other Broadcom software provided under a license
     21 * other than the GPL, without Broadcom's express prior written consent.
     22 *
     23 * $Id: dhd_custom_gpio.c,v 1.1.4.8.4.1 2010/09/02 23:13:16 Exp $
     24 */
     25 
     26 
     27 #include <typedefs.h>
     28 #include <linuxver.h>
     29 #include <osl.h>
     30 #include <bcmutils.h>
     31 
     32 #include <dngl_stats.h>
     33 #include <dhd.h>
     34 
     35 #include <wlioctl.h>
     36 #include <wl_iw.h>
     37 
     38 #define WL_ERROR(x) printf x
     39 #define WL_TRACE(x)
     40 
     41 #ifdef CUSTOMER_HW
     42 extern  void bcm_wlan_power_off(int);
     43 extern  void bcm_wlan_power_on(int);
     44 #endif /* CUSTOMER_HW */
     45 #ifdef CUSTOMER_HW2
     46 int wifi_set_carddetect(int on);
     47 int wifi_set_power(int on, unsigned long msec);
     48 int wifi_get_irq_number(unsigned long *irq_flags_ptr);
     49 int wifi_get_mac_addr(unsigned char *buf);
     50 #endif
     51 
     52 #if defined(OOB_INTR_ONLY)
     53 
     54 #if defined(BCMLXSDMMC)
     55 extern int sdioh_mmc_irq(int irq);
     56 #endif /* (BCMLXSDMMC)  */
     57 
     58 #ifdef CUSTOMER_HW3
     59 #include <mach/gpio.h>
     60 #endif
     61 
     62 /* Customer specific Host GPIO defintion  */
     63 static int dhd_oob_gpio_num = -1; /* GG 19 */
     64 
     65 module_param(dhd_oob_gpio_num, int, 0644);
     66 MODULE_PARM_DESC(dhd_oob_gpio_num, "DHD oob gpio number");
     67 
     68 int dhd_customer_oob_irq_map(unsigned long *irq_flags_ptr)
     69 {
     70 	int  host_oob_irq = 0;
     71 
     72 #ifdef CUSTOMER_HW2
     73 	host_oob_irq = wifi_get_irq_number(irq_flags_ptr);
     74 
     75 #else /* for NOT  CUSTOMER_HW2 */
     76 #if defined(CUSTOM_OOB_GPIO_NUM)
     77 	if (dhd_oob_gpio_num < 0) {
     78 		dhd_oob_gpio_num = CUSTOM_OOB_GPIO_NUM;
     79 	}
     80 #endif
     81 
     82 	if (dhd_oob_gpio_num < 0) {
     83 		WL_ERROR(("%s: ERROR customer specific Host GPIO is NOT defined \n",
     84 			__FUNCTION__));
     85 		return (dhd_oob_gpio_num);
     86 	}
     87 
     88 	WL_ERROR(("%s: customer specific Host GPIO number is (%d)\n",
     89 	         __FUNCTION__, dhd_oob_gpio_num));
     90 
     91 #if defined CUSTOMER_HW
     92 	host_oob_irq = MSM_GPIO_TO_INT(dhd_oob_gpio_num);
     93 #elif defined CUSTOMER_HW3
     94 	gpio_request(dhd_oob_gpio_num, "oob irq");
     95 	host_oob_irq = gpio_to_irq(dhd_oob_gpio_num);
     96 	gpio_direction_input(dhd_oob_gpio_num);
     97 #endif /* CUSTOMER_HW */
     98 #endif /* CUSTOMER_HW2 */
     99 
    100 	return (host_oob_irq);
    101 }
    102 #endif /* defined(OOB_INTR_ONLY) */
    103 
    104 /* Customer function to control hw specific wlan gpios */
    105 void
    106 dhd_customer_gpio_wlan_ctrl(int onoff)
    107 {
    108 	switch (onoff) {
    109 		case WLAN_RESET_OFF:
    110 			WL_TRACE(("%s: call customer specific GPIO to insert WLAN RESET\n",
    111 				__FUNCTION__));
    112 #ifdef CUSTOMER_HW
    113 			bcm_wlan_power_off(2);
    114 #endif /* CUSTOMER_HW */
    115 #ifdef CUSTOMER_HW2
    116 			wifi_set_power(0, 0);
    117 #endif
    118 			WL_ERROR(("=========== WLAN placed in RESET ========\n"));
    119 		break;
    120 
    121 		case WLAN_RESET_ON:
    122 			WL_TRACE(("%s: callc customer specific GPIO to remove WLAN RESET\n",
    123 				__FUNCTION__));
    124 #ifdef CUSTOMER_HW
    125 			bcm_wlan_power_on(2);
    126 #endif /* CUSTOMER_HW */
    127 #ifdef CUSTOMER_HW2
    128 			wifi_set_power(1, 0);
    129 #endif
    130 			WL_ERROR(("=========== WLAN going back to live  ========\n"));
    131 		break;
    132 
    133 		case WLAN_POWER_OFF:
    134 			WL_TRACE(("%s: call customer specific GPIO to turn off WL_REG_ON\n",
    135 				__FUNCTION__));
    136 #ifdef CUSTOMER_HW
    137 			bcm_wlan_power_off(1);
    138 #endif /* CUSTOMER_HW */
    139 		break;
    140 
    141 		case WLAN_POWER_ON:
    142 			WL_TRACE(("%s: call customer specific GPIO to turn on WL_REG_ON\n",
    143 				__FUNCTION__));
    144 #ifdef CUSTOMER_HW
    145 			bcm_wlan_power_on(1);
    146 			/* Lets customer power to get stable */
    147 			OSL_DELAY(50);
    148 #endif /* CUSTOMER_HW */
    149 		break;
    150 	}
    151 }
    152 
    153 #ifdef GET_CUSTOM_MAC_ENABLE
    154 /* Function to get custom MAC address */
    155 int
    156 dhd_custom_get_mac_address(unsigned char *buf)
    157 {
    158 	int ret = 0;
    159 
    160 	WL_TRACE(("%s Enter\n", __FUNCTION__));
    161 	if (!buf)
    162 		return -EINVAL;
    163 
    164 	/* Customer access to MAC address stored outside of DHD driver */
    165 #ifdef CUSTOMER_HW2
    166 	ret = wifi_get_mac_addr(buf);
    167 #endif
    168 
    169 #ifdef EXAMPLE_GET_MAC
    170 	/* EXAMPLE code */
    171 	{
    172 		struct ether_addr ea_example = {{0x00, 0x11, 0x22, 0x33, 0x44, 0xFF}};
    173 		bcopy((char *)&ea_example, buf, sizeof(struct ether_addr));
    174 	}
    175 #endif /* EXAMPLE_GET_MAC */
    176 
    177 	return ret;
    178 }
    179 #endif /* GET_CUSTOM_MAC_ENABLE */
    180