1237611Sadrian/* 2237611Sadrian * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting 3237611Sadrian * Copyright (c) 2002-2005 Atheros Communications, Inc. 4237611Sadrian * Copyright (c) 2008-2010, Atheros Communications Inc. 5237611Sadrian * 6237611Sadrian * Permission to use, copy, modify, and/or distribute this software for any 7237611Sadrian * purpose with or without fee is hereby granted, provided that the above 8237611Sadrian * copyright notice and this permission notice appear in all copies. 9237611Sadrian * 10237611Sadrian * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11237611Sadrian * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12237611Sadrian * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13237611Sadrian * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14237611Sadrian * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15237611Sadrian * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16237611Sadrian * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17237611Sadrian * 18237611Sadrian * $FreeBSD$ 19237611Sadrian */ 20237611Sadrian 21237611Sadrian#include "opt_ah.h" 22237611Sadrian 23237611Sadrian#include "ah.h" 24237611Sadrian#include "ah_internal.h" 25237611Sadrian#include "ah_devid.h" 26237611Sadrian#ifdef AH_DEBUG 27237611Sadrian#include "ah_desc.h" /* NB: for HAL_PHYERR* */ 28237611Sadrian#endif 29237611Sadrian 30237611Sadrian#include "ar5416/ar5416.h" 31237611Sadrian#include "ar5416/ar5416reg.h" 32237611Sadrian#include "ar5416/ar5416phy.h" 33237611Sadrian#include "ar5416/ar5416desc.h" /* AR5416_CONTTXMODE */ 34237611Sadrian#include "ar5416/ar5416_btcoex.h" 35237611Sadrian 36237611Sadrianvoid 37237611Sadrianar5416SetBTCoexInfo(struct ath_hal *ah, HAL_BT_COEX_INFO *btinfo) 38237611Sadrian{ 39237611Sadrian struct ath_hal_5416 *ahp = AH5416(ah); 40237611Sadrian 41237611Sadrian ahp->ah_btModule = btinfo->bt_module; 42237611Sadrian ahp->ah_btCoexConfigType = btinfo->bt_coex_config; 43237611Sadrian ahp->ah_btActiveGpioSelect = btinfo->bt_gpio_bt_active; 44237611Sadrian ahp->ah_btPriorityGpioSelect = btinfo->bt_gpio_bt_priority; 45237611Sadrian ahp->ah_wlanActiveGpioSelect = btinfo->bt_gpio_wlan_active; 46237611Sadrian ahp->ah_btActivePolarity = btinfo->bt_active_polarity; 47237611Sadrian ahp->ah_btCoexSingleAnt = btinfo->bt_single_ant; 48237611Sadrian ahp->ah_btWlanIsolation = btinfo->bt_isolation; 49237611Sadrian} 50237611Sadrian 51237611Sadrianvoid 52237611Sadrianar5416BTCoexConfig(struct ath_hal *ah, HAL_BT_COEX_CONFIG *btconf) 53237611Sadrian{ 54237611Sadrian struct ath_hal_5416 *ahp = AH5416(ah); 55237611Sadrian HAL_BOOL rxClearPolarity = btconf->bt_rxclear_polarity; 56237611Sadrian 57237611Sadrian /* 58237611Sadrian * For Kiwi and Osprey, the polarity of rx_clear is active high. 59237611Sadrian * The bt_rxclear_polarity flag from ath(4) needs to be inverted. 60237611Sadrian */ 61237611Sadrian if (AR_SREV_KIWI(ah)) { 62237611Sadrian rxClearPolarity = !btconf->bt_rxclear_polarity; 63237611Sadrian } 64237611Sadrian 65237611Sadrian ahp->ah_btCoexMode = (ahp->ah_btCoexMode & AR_BT_QCU_THRESH) | 66237611Sadrian SM(btconf->bt_time_extend, AR_BT_TIME_EXTEND) | 67237611Sadrian SM(btconf->bt_txstate_extend, AR_BT_TXSTATE_EXTEND) | 68237611Sadrian SM(btconf->bt_txframe_extend, AR_BT_TX_FRAME_EXTEND) | 69237611Sadrian SM(btconf->bt_mode, AR_BT_MODE) | 70237611Sadrian SM(btconf->bt_quiet_collision, AR_BT_QUIET) | 71237611Sadrian SM(rxClearPolarity, AR_BT_RX_CLEAR_POLARITY) | 72237611Sadrian SM(btconf->bt_priority_time, AR_BT_PRIORITY_TIME) | 73237611Sadrian SM(btconf->bt_first_slot_time, AR_BT_FIRST_SLOT_TIME); 74237611Sadrian 75237611Sadrian ahp->ah_btCoexMode2 |= SM(btconf->bt_hold_rxclear, 76237611Sadrian AR_BT_HOLD_RX_CLEAR); 77237611Sadrian 78237611Sadrian if (ahp->ah_btCoexSingleAnt == AH_FALSE) { 79237611Sadrian /* Enable ACK to go out even though BT has higher priority. */ 80237611Sadrian ahp->ah_btCoexMode2 |= AR_BT_DISABLE_BT_ANT; 81237611Sadrian } 82237611Sadrian} 83237611Sadrian 84237611Sadrianvoid 85237611Sadrianar5416BTCoexSetQcuThresh(struct ath_hal *ah, int qnum) 86237611Sadrian{ 87237611Sadrian struct ath_hal_5416 *ahp = AH5416(ah); 88237611Sadrian 89237611Sadrian ahp->ah_btCoexMode |= SM(qnum, AR_BT_QCU_THRESH); 90237611Sadrian} 91237611Sadrian 92237611Sadrianvoid 93237611Sadrianar5416BTCoexSetWeights(struct ath_hal *ah, u_int32_t stompType) 94237611Sadrian{ 95237611Sadrian struct ath_hal_5416 *ahp = AH5416(ah); 96237611Sadrian 97237611Sadrian if (AR_SREV_KIWI_10_OR_LATER(ah)) { 98237611Sadrian /* TODO: TX RX seperate is not enabled. */ 99237611Sadrian switch (stompType) { 100237611Sadrian case HAL_BT_COEX_STOMP_ALL: 101237611Sadrian ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; 102237611Sadrian ahp->ah_btCoexWLANWeight = AR5416_STOMP_ALL_WLAN_WGHT; 103237611Sadrian break; 104237611Sadrian case HAL_BT_COEX_STOMP_LOW: 105237611Sadrian ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; 106237611Sadrian ahp->ah_btCoexWLANWeight = AR5416_STOMP_LOW_WLAN_WGHT; 107237611Sadrian break; 108237611Sadrian case HAL_BT_COEX_STOMP_ALL_FORCE: 109237611Sadrian ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; 110237611Sadrian ahp->ah_btCoexWLANWeight = 111237611Sadrian AR5416_STOMP_ALL_FORCE_WLAN_WGHT; 112237611Sadrian break; 113237611Sadrian case HAL_BT_COEX_STOMP_LOW_FORCE: 114237611Sadrian ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; 115237611Sadrian ahp->ah_btCoexWLANWeight = 116237611Sadrian AR5416_STOMP_LOW_FORCE_WLAN_WGHT; 117237611Sadrian break; 118237611Sadrian case HAL_BT_COEX_STOMP_NONE: 119237611Sadrian case HAL_BT_COEX_NO_STOMP: 120237611Sadrian ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; 121237611Sadrian ahp->ah_btCoexWLANWeight = AR5416_STOMP_NONE_WLAN_WGHT; 122237611Sadrian break; 123237611Sadrian default: 124237611Sadrian /* There is a forceWeight from registry */ 125237611Sadrian ahp->ah_btCoexBTWeight = stompType & 0xffff; 126237611Sadrian ahp->ah_btCoexWLANWeight = stompType >> 16; 127237611Sadrian break; 128237611Sadrian } 129237611Sadrian } else { 130237611Sadrian switch (stompType) { 131237611Sadrian case HAL_BT_COEX_STOMP_ALL: 132237611Sadrian ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; 133237611Sadrian ahp->ah_btCoexWLANWeight = AR5416_STOMP_ALL_WLAN_WGHT; 134237611Sadrian break; 135237611Sadrian case HAL_BT_COEX_STOMP_LOW: 136237611Sadrian ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; 137237611Sadrian ahp->ah_btCoexWLANWeight = AR5416_STOMP_LOW_WLAN_WGHT; 138237611Sadrian break; 139237611Sadrian case HAL_BT_COEX_STOMP_ALL_FORCE: 140237611Sadrian ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; 141237611Sadrian ahp->ah_btCoexWLANWeight = 142237611Sadrian AR5416_STOMP_ALL_FORCE_WLAN_WGHT; 143237611Sadrian break; 144237611Sadrian case HAL_BT_COEX_STOMP_LOW_FORCE: 145237611Sadrian ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; 146237611Sadrian ahp->ah_btCoexWLANWeight = 147237611Sadrian AR5416_STOMP_LOW_FORCE_WLAN_WGHT; 148237611Sadrian break; 149237611Sadrian case HAL_BT_COEX_STOMP_NONE: 150237611Sadrian case HAL_BT_COEX_NO_STOMP: 151237611Sadrian ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; 152237611Sadrian ahp->ah_btCoexWLANWeight = AR5416_STOMP_NONE_WLAN_WGHT; 153237611Sadrian break; 154237611Sadrian default: 155237611Sadrian /* There is a forceWeight from registry */ 156237611Sadrian ahp->ah_btCoexBTWeight = stompType & 0xffff; 157237611Sadrian ahp->ah_btCoexWLANWeight = stompType >> 16; 158237611Sadrian break; 159237611Sadrian } 160237611Sadrian } 161237611Sadrian} 162237611Sadrian 163237611Sadrianvoid 164237611Sadrianar5416BTCoexSetupBmissThresh(struct ath_hal *ah, u_int32_t thresh) 165237611Sadrian{ 166237611Sadrian struct ath_hal_5416 *ahp = AH5416(ah); 167237611Sadrian 168237611Sadrian ahp->ah_btCoexMode2 |= SM(thresh, AR_BT_BCN_MISS_THRESH); 169237611Sadrian} 170237611Sadrian 171237611Sadrian/* 172237611Sadrian * There is no antenna diversity for Owl, Kiwi, etc. 173237611Sadrian * 174237611Sadrian * Kite will override this particular method. 175237611Sadrian */ 176243843Sadrianvoid 177237611Sadrianar5416BTCoexAntennaDiversity(struct ath_hal *ah) 178237611Sadrian{ 179237611Sadrian} 180237611Sadrian 181237611Sadrianvoid 182237611Sadrianar5416BTCoexSetParameter(struct ath_hal *ah, u_int32_t type, u_int32_t value) 183237611Sadrian{ 184237611Sadrian struct ath_hal_5416 *ahp = AH5416(ah); 185237611Sadrian 186237611Sadrian switch (type) { 187237611Sadrian case HAL_BT_COEX_SET_ACK_PWR: 188237611Sadrian if (value) { 189237611Sadrian ahp->ah_btCoexFlag |= HAL_BT_COEX_FLAG_LOW_ACK_PWR; 190237611Sadrian OS_REG_WRITE(ah, AR_TPC, HAL_BT_COEX_LOW_ACK_POWER); 191237611Sadrian } else { 192237611Sadrian ahp->ah_btCoexFlag &= ~HAL_BT_COEX_FLAG_LOW_ACK_PWR; 193237611Sadrian OS_REG_WRITE(ah, AR_TPC, HAL_BT_COEX_HIGH_ACK_POWER); 194237611Sadrian } 195237611Sadrian break; 196237611Sadrian case HAL_BT_COEX_ANTENNA_DIVERSITY: 197237611Sadrian /* This is overridden for Kite */ 198237611Sadrian break; 199237611Sadrian#if 0 200237611Sadrian case HAL_BT_COEX_LOWER_TX_PWR: 201237611Sadrian if (value) { 202237611Sadrian if ((ahp->ah_btCoexFlag & HAL_BT_COEX_FLAG_LOWER_TX_PWR) == 0) { 203237611Sadrian ahp->ah_btCoexFlag |= HAL_BT_COEX_FLAG_LOWER_TX_PWR; 204237611Sadrian AH_PRIVATE(ah)->ah_config.ath_hal_desc_tpc = 1; 205237611Sadrian ar5416SetTxPowerLimit(ah, AH_PRIVATE(ah)->ah_power_limit, AH_PRIVATE(ah)->ah_extra_txpow, 0); 206237611Sadrian } 207237611Sadrian } 208237611Sadrian else { 209237611Sadrian if (ahp->ah_btCoexFlag & HAL_BT_COEX_FLAG_LOWER_TX_PWR) { 210237611Sadrian ahp->ah_btCoexFlag &= ~HAL_BT_COEX_FLAG_LOWER_TX_PWR; 211237611Sadrian AH_PRIVATE(ah)->ah_config.ath_hal_desc_tpc = 0; 212237611Sadrian ar5416SetTxPowerLimit(ah, AH_PRIVATE(ah)->ah_power_limit, AH_PRIVATE(ah)->ah_extra_txpow, 0); 213237611Sadrian } 214237611Sadrian } 215237611Sadrian break; 216237611Sadrian#endif 217237611Sadrian default: 218237611Sadrian break; 219237611Sadrian } 220237611Sadrian} 221237611Sadrian 222237611Sadrianvoid 223237611Sadrianar5416BTCoexDisable(struct ath_hal *ah) 224237611Sadrian{ 225237611Sadrian struct ath_hal_5416 *ahp = AH5416(ah); 226237611Sadrian 227237611Sadrian /* Always drive rx_clear_external output as 0 */ 228237611Sadrian ar5416GpioSet(ah, ahp->ah_wlanActiveGpioSelect, 0); 229237611Sadrian ar5416GpioCfgOutput(ah, ahp->ah_wlanActiveGpioSelect, 230237611Sadrian HAL_GPIO_OUTPUT_MUX_AS_OUTPUT); 231237611Sadrian 232237611Sadrian if (AR_SREV_9271(ah)) { 233237611Sadrian /* 234237611Sadrian * Set wlanActiveGpio to input when disabling BT-COEX to 235237611Sadrian * reduce power consumption 236237611Sadrian */ 237237611Sadrian ar5416GpioCfgInput(ah, ahp->ah_wlanActiveGpioSelect); 238237611Sadrian } 239237611Sadrian 240237611Sadrian if (ahp->ah_btCoexSingleAnt == AH_TRUE) { 241237611Sadrian OS_REG_RMW_FIELD(ah, AR_QUIET1, AR_QUIET1_QUIET_ACK_CTS_ENABLE, 242237611Sadrian 1); 243237611Sadrian OS_REG_RMW_FIELD(ah, AR_MISC_MODE, AR_PCU_BT_ANT_PREVENT_RX, 244237611Sadrian 0); 245237611Sadrian } 246237611Sadrian 247237611Sadrian OS_REG_WRITE(ah, AR_BT_COEX_MODE, AR_BT_QUIET | AR_BT_MODE); 248237611Sadrian OS_REG_WRITE(ah, AR_BT_COEX_WEIGHT, 0); 249237611Sadrian if (AR_SREV_KIWI_10_OR_LATER(ah)) 250237611Sadrian OS_REG_WRITE(ah, AR_BT_COEX_WEIGHT2, 0); 251237611Sadrian OS_REG_WRITE(ah, AR_BT_COEX_MODE2, 0); 252237611Sadrian 253237611Sadrian ahp->ah_btCoexEnabled = AH_FALSE; 254237611Sadrian} 255237611Sadrian 256237611Sadrianint 257237611Sadrianar5416BTCoexEnable(struct ath_hal *ah) 258237611Sadrian{ 259237611Sadrian struct ath_hal_5416 *ahp = AH5416(ah); 260237611Sadrian 261237611Sadrian /* Program coex mode and weight registers to actually enable coex */ 262237611Sadrian OS_REG_WRITE(ah, AR_BT_COEX_MODE, ahp->ah_btCoexMode); 263237611Sadrian OS_REG_WRITE(ah, AR_BT_COEX_WEIGHT, 264237611Sadrian SM(ahp->ah_btCoexWLANWeight & 0xFFFF, AR_BT_WL_WGHT) | 265237611Sadrian SM(ahp->ah_btCoexBTWeight & 0xFFFF, AR_BT_BT_WGHT)); 266237611Sadrian if (AR_SREV_KIWI_10_OR_LATER(ah)) { 267237611Sadrian OS_REG_WRITE(ah, AR_BT_COEX_WEIGHT2, 268237611Sadrian SM(ahp->ah_btCoexWLANWeight >> 16, AR_BT_WL_WGHT)); 269237611Sadrian } 270237611Sadrian OS_REG_WRITE(ah, AR_BT_COEX_MODE2, ahp->ah_btCoexMode2); 271237611Sadrian 272249517Sadrian /* Added Select GPIO5~8 instaed SPI */ 273249517Sadrian if (AR_SREV_9271(ah)) { 274249517Sadrian uint32_t val; 275237611Sadrian 276249517Sadrian val = OS_REG_READ(ah, AR9271_CLOCK_CONTROL); 277249517Sadrian val &= 0xFFFFFEFF; 278249517Sadrian OS_REG_WRITE(ah, AR9271_CLOCK_CONTROL, val); 279249517Sadrian } 280249517Sadrian 281237611Sadrian if (ahp->ah_btCoexFlag & HAL_BT_COEX_FLAG_LOW_ACK_PWR) 282237611Sadrian OS_REG_WRITE(ah, AR_TPC, HAL_BT_COEX_LOW_ACK_POWER); 283237611Sadrian else 284237611Sadrian OS_REG_WRITE(ah, AR_TPC, HAL_BT_COEX_HIGH_ACK_POWER); 285237611Sadrian 286237611Sadrian if (ahp->ah_btCoexSingleAnt == AH_TRUE) { 287237611Sadrian OS_REG_RMW_FIELD(ah, AR_QUIET1, 288237611Sadrian AR_QUIET1_QUIET_ACK_CTS_ENABLE, 1); 289237611Sadrian /* XXX should update miscMode? */ 290237611Sadrian OS_REG_RMW_FIELD(ah, AR_MISC_MODE, 291237611Sadrian AR_PCU_BT_ANT_PREVENT_RX, 1); 292237611Sadrian } else { 293237611Sadrian OS_REG_RMW_FIELD(ah, AR_QUIET1, 294237611Sadrian AR_QUIET1_QUIET_ACK_CTS_ENABLE, 1); 295237611Sadrian /* XXX should update miscMode? */ 296237611Sadrian OS_REG_RMW_FIELD(ah, AR_MISC_MODE, 297237611Sadrian AR_PCU_BT_ANT_PREVENT_RX, 0); 298237611Sadrian } 299237611Sadrian 300237611Sadrian if (ahp->ah_btCoexConfigType == HAL_BT_COEX_CFG_3WIRE) { 301237611Sadrian /* For 3-wire, configure the desired GPIO port for rx_clear */ 302237611Sadrian ar5416GpioCfgOutput(ah, ahp->ah_wlanActiveGpioSelect, 303237611Sadrian HAL_GPIO_OUTPUT_MUX_AS_WLAN_ACTIVE); 304237611Sadrian } else { 305237611Sadrian /* 306237611Sadrian * For 2-wire, configure the desired GPIO port 307237611Sadrian * for TX_FRAME output 308237611Sadrian */ 309237611Sadrian ar5416GpioCfgOutput(ah, ahp->ah_wlanActiveGpioSelect, 310237611Sadrian HAL_GPIO_OUTPUT_MUX_AS_TX_FRAME); 311237611Sadrian } 312237611Sadrian 313237611Sadrian /* 314237611Sadrian * Enable a weak pull down on BT_ACTIVE. 315237611Sadrian * When BT device is disabled, BT_ACTIVE might be floating. 316237611Sadrian */ 317237611Sadrian OS_REG_RMW(ah, AR_GPIO_PDPU, 318237611Sadrian (0x2 << (ahp->ah_btActiveGpioSelect * 2)), 319237611Sadrian (0x3 << (ahp->ah_btActiveGpioSelect * 2))); 320237611Sadrian 321237611Sadrian ahp->ah_btCoexEnabled = AH_TRUE; 322237611Sadrian 323237611Sadrian return (0); 324237611Sadrian} 325237611Sadrian 326237611Sadrianvoid 327237611Sadrianar5416InitBTCoex(struct ath_hal *ah) 328237611Sadrian{ 329237611Sadrian struct ath_hal_5416 *ahp = AH5416(ah); 330237611Sadrian 331251483Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, 332251483Sadrian "%s: called; configType=%d\n", 333251483Sadrian __func__, 334251483Sadrian ahp->ah_btCoexConfigType); 335251483Sadrian 336237611Sadrian if (ahp->ah_btCoexConfigType == HAL_BT_COEX_CFG_3WIRE) { 337237611Sadrian OS_REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, 338237611Sadrian (AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_BB | 339237611Sadrian AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_BB)); 340237611Sadrian 341237611Sadrian /* 342237611Sadrian * Set input mux for bt_prority_async and 343237611Sadrian * bt_active_async to GPIO pins 344237611Sadrian */ 345237611Sadrian OS_REG_RMW_FIELD(ah, AR_GPIO_INPUT_MUX1, 346237611Sadrian AR_GPIO_INPUT_MUX1_BT_ACTIVE, 347237611Sadrian ahp->ah_btActiveGpioSelect); 348237611Sadrian OS_REG_RMW_FIELD(ah, AR_GPIO_INPUT_MUX1, 349237611Sadrian AR_GPIO_INPUT_MUX1_BT_PRIORITY, 350237611Sadrian ahp->ah_btPriorityGpioSelect); 351237611Sadrian 352237611Sadrian /* 353237611Sadrian * Configure the desired GPIO ports for input 354237611Sadrian */ 355237611Sadrian ar5416GpioCfgInput(ah, ahp->ah_btActiveGpioSelect); 356237611Sadrian ar5416GpioCfgInput(ah, ahp->ah_btPriorityGpioSelect); 357237611Sadrian 358243843Sadrian /* 359243843Sadrian * Configure the antenna diversity setup. 360243843Sadrian * It's a no-op for AR9287; AR9285 overrides this 361243843Sadrian * as required. 362243843Sadrian */ 363243843Sadrian AH5416(ah)->ah_btCoexSetDiversity(ah); 364237611Sadrian 365237611Sadrian if (ahp->ah_btCoexEnabled) 366237611Sadrian ar5416BTCoexEnable(ah); 367237611Sadrian else 368237611Sadrian ar5416BTCoexDisable(ah); 369237611Sadrian } else if (ahp->ah_btCoexConfigType != HAL_BT_COEX_CFG_NONE) { 370237611Sadrian /* 2-wire */ 371237611Sadrian if (ahp->ah_btCoexEnabled) { 372237611Sadrian /* Connect bt_active_async to baseband */ 373237611Sadrian OS_REG_CLR_BIT(ah, AR_GPIO_INPUT_EN_VAL, 374237611Sadrian (AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_DEF | 375237611Sadrian AR_GPIO_INPUT_EN_VAL_BT_FREQUENCY_DEF)); 376237611Sadrian OS_REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, 377237611Sadrian AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_BB); 378237611Sadrian 379237611Sadrian /* 380237611Sadrian * Set input mux for bt_prority_async and 381237611Sadrian * bt_active_async to GPIO pins 382237611Sadrian */ 383237611Sadrian OS_REG_RMW_FIELD(ah, AR_GPIO_INPUT_MUX1, 384237611Sadrian AR_GPIO_INPUT_MUX1_BT_ACTIVE, 385237611Sadrian ahp->ah_btActiveGpioSelect); 386237611Sadrian 387237611Sadrian /* Configure the desired GPIO ports for input */ 388237611Sadrian ar5416GpioCfgInput(ah, ahp->ah_btActiveGpioSelect); 389237611Sadrian 390237611Sadrian /* Enable coexistence on initialization */ 391237611Sadrian ar5416BTCoexEnable(ah); 392237611Sadrian } 393237611Sadrian } 394237611Sadrian} 395