Path: blob/main/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_gpio.c
48526 views
/*1* Copyright (c) 2013 Qualcomm Atheros, Inc.2*3* Permission to use, copy, modify, and/or distribute this software for any4* purpose with or without fee is hereby granted, provided that the above5* copyright notice and this permission notice appear in all copies.6*7* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH8* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY9* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,10* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM11* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR12* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR13* PERFORMANCE OF THIS SOFTWARE.14*/1516#include "opt_ah.h"1718#include "ah.h"19#include "ah_internal.h"20#include "ah_devid.h"21#ifdef AH_DEBUG22#include "ah_desc.h" /* NB: for HAL_PHYERR* */23#endif2425#include "ar9300/ar9300.h"26#include "ar9300/ar9300reg.h"27#include "ar9300/ar9300phy.h"2829#define AR_GPIO_BIT(_gpio) (1 << (_gpio))3031/*32* Configure GPIO Output Mux control33*/34#if UMAC_SUPPORT_SMARTANTENNA35static void ar9340_soc_gpio_cfg_output_mux(36struct ath_hal *ah,37u_int32_t gpio,38u_int32_t ah_signal_type)39{40#define ADDR_READ(addr) (*((volatile u_int32_t *)(addr)))41#define ADDR_WRITE(addr, b) (void)((*(volatile u_int32_t *) (addr)) = (b))42#define AR9340_SOC_GPIO_FUN0 0xB804002c43#define AR9340_SOC_GPIO_OE 0xB804000044#if ATH_SMARTANTENNA_DISABLE_JTAG45#define AR9340_SOC_GPIO_FUNCTION (volatile u_int32_t*) 0xB804006c46#define WASP_DISABLE_JTAG 0x247#define MAX_JTAG_GPIO_PIN 148#endif49u_int8_t out_func, shift;50u_int32_t flags;51volatile u_int32_t* address;5253if (!ah_signal_type){54return;55}56#if ATH_SMARTANTENNA_DISABLE_JTAG57/*58* To use GPIO pins 0 and 1 for controling antennas, JTAG needs to disabled.59*/60if (gpio <= MAX_JTAG_GPIO_PIN) {61flags = ADDR_READ(AR9340_SOC_GPIO_FUNCTION);62flags |= WASP_DISABLE_JTAG;63ADDR_WRITE(AR9340_SOC_GPIO_FUNCTION, flags);64}65#endif66out_func = gpio / 4;67shift = (gpio % 4);68address = (volatile u_int32_t *)(AR9340_SOC_GPIO_FUN0 + (out_func*4));6970flags = ADDR_READ(address);71flags |= ah_signal_type << (8*shift);72ADDR_WRITE(address, flags);73flags = ADDR_READ(AR9340_SOC_GPIO_OE);74flags &= ~(1 << gpio);75ADDR_WRITE(AR9340_SOC_GPIO_OE, flags);7677}78#endif7980static void81ar9300_gpio_cfg_output_mux(struct ath_hal *ah, u_int32_t gpio, u_int32_t type)82{83int addr;84u_int32_t gpio_shift;8586/* each MUX controls 6 GPIO pins */87if (gpio > 11) {88addr = AR_HOSTIF_REG(ah, AR_GPIO_OUTPUT_MUX3);89} else if (gpio > 5) {90addr = AR_HOSTIF_REG(ah, AR_GPIO_OUTPUT_MUX2);91} else {92addr = AR_HOSTIF_REG(ah, AR_GPIO_OUTPUT_MUX1);93}9495/*96* 5 bits per GPIO pin.97* Bits 0..4 for 1st pin in that mux,98* bits 5..9 for 2nd pin, etc.99*/100gpio_shift = (gpio % 6) * 5;101102OS_REG_RMW(ah, addr, (type << gpio_shift), (0x1f << gpio_shift));103}104105/*106* Configure GPIO Output lines107*/108HAL_BOOL109ar9300_gpio_cfg_output(110struct ath_hal *ah,111u_int32_t gpio,112HAL_GPIO_MUX_TYPE hal_signal_type)113{114u_int32_t ah_signal_type;115u_int32_t gpio_shift;116u_int8_t smart_ant = 0;117static const u_int32_t mux_signal_conversion_table[] = {118/* HAL_GPIO_OUTPUT_MUX_AS_OUTPUT */119AR_GPIO_OUTPUT_MUX_AS_OUTPUT,120/* HAL_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED */121AR_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED,122/* HAL_GPIO_OUTPUT_MUX_AS_PCIE_POWER_LED */123AR_GPIO_OUTPUT_MUX_AS_PCIE_POWER_LED,124/* HAL_GPIO_OUTPUT_MUX_AS_MAC_NETWORK_LED */125AR_GPIO_OUTPUT_MUX_AS_MAC_NETWORK_LED,126/* HAL_GPIO_OUTPUT_MUX_AS_MAC_POWER_LED */127AR_GPIO_OUTPUT_MUX_AS_MAC_POWER_LED,128/* HAL_GPIO_OUTPUT_MUX_AS_WLAN_ACTIVE */129AR_GPIO_OUTPUT_MUX_AS_RX_CLEAR_EXTERNAL,130/* HAL_GPIO_OUTPUT_MUX_AS_TX_FRAME */131AR_GPIO_OUTPUT_MUX_AS_TX_FRAME,132/* HAL_GPIO_OUTPUT_MUX_AS_MCI_WLAN_DATA */133AR_GPIO_OUTPUT_MUX_AS_MCI_WLAN_DATA,134/* HAL_GPIO_OUTPUT_MUX_AS_MCI_WLAN_CLK */135AR_GPIO_OUTPUT_MUX_AS_MCI_WLAN_CLK,136/* HAL_GPIO_OUTPUT_MUX_AS_MCI_BT_DATA */137AR_GPIO_OUTPUT_MUX_AS_MCI_BT_DATA,138/* HAL_GPIO_OUTPUT_MUX_AS_MCI_BT_CLK */139AR_GPIO_OUTPUT_MUX_AS_MCI_BT_CLK,140/* HAL_GPIO_OUTPUT_MUX_AS_WL_IN_TX */141AR_GPIO_OUTPUT_MUX_AS_WL_IN_TX,142/* HAL_GPIO_OUTPUT_MUX_AS_WL_IN_RX */143AR_GPIO_OUTPUT_MUX_AS_WL_IN_RX,144/* HAL_GPIO_OUTPUT_MUX_AS_BT_IN_TX */145AR_GPIO_OUTPUT_MUX_AS_BT_IN_TX,146/* HAL_GPIO_OUTPUT_MUX_AS_BT_IN_RX */147AR_GPIO_OUTPUT_MUX_AS_BT_IN_RX,148/* HAL_GPIO_OUTPUT_MUX_AS_RUCKUS_STROBE */149AR_GPIO_OUTPUT_MUX_AS_RUCKUS_STROBE,150/* HAL_GPIO_OUTPUT_MUX_AS_RUCKUS_DATA */151AR_GPIO_OUTPUT_MUX_AS_RUCKUS_DATA,152/* HAL_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL0 */153AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL0,154/* HAL_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL1 */155AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL1,156/* HAL_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL2 */157AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL2,158/* HAL_GPIO_OUTPUT_MUX_AS_SMARTANT_SWCOM3 */159AR_GPIO_OUTPUT_MUX_AS_SWCOM3,160};161162HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins);163if ((gpio == AR9382_GPIO_PIN_8_RESERVED) ||164(gpio == AR9382_GPIO_9_INPUT_ONLY))165{166return AH_FALSE;167}168169/* Convert HAL signal type definitions to hardware-specific values. */170if ((int) hal_signal_type < ARRAY_LENGTH(mux_signal_conversion_table))171{172ah_signal_type = mux_signal_conversion_table[hal_signal_type];173} else {174return AH_FALSE;175}176177if (gpio <= AR9382_MAX_JTAG_GPIO_PIN_NUM) {178OS_REG_SET_BIT(ah,179AR_HOSTIF_REG(ah, AR_GPIO_INPUT_EN_VAL), AR_GPIO_JTAG_DISABLE);180}181182#if UMAC_SUPPORT_SMARTANTENNA183/* Get the pin and func values for smart antenna */184switch (ah_signal_type)185{186case AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL0:187gpio = ATH_GPIOPIN_ANTCHAIN0;188ah_signal_type = ATH_GPIOFUNC_ANTCHAIN0;189smart_ant = 1;190break;191case AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL1:192gpio = ATH_GPIOPIN_ANTCHAIN1;193ah_signal_type = ATH_GPIOFUNC_ANTCHAIN1;194smart_ant = 1;195break;196case AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL2:197gpio = ATH_GPIOPIN_ANTCHAIN2;198ah_signal_type = ATH_GPIOFUNC_ANTCHAIN2;199smart_ant = 1;200break;201#if ATH_SMARTANTENNA_ROUTE_SWCOM_TO_GPIO202case AR_GPIO_OUTPUT_MUX_AS_SWCOM3:203gpio = ATH_GPIOPIN_ROUTE_SWCOM3;204ah_signal_type = ATH_GPIOFUNC_ROUTE_SWCOM3;205smart_ant = 1;206break;207#endif208default:209break;210}211#endif212213if (smart_ant && (AR_SREV_WASP(ah) || AR_SREV_SCORPION(ah)))214{215#if UMAC_SUPPORT_SMARTANTENNA216ar9340_soc_gpio_cfg_output_mux(ah, gpio, ah_signal_type);217#endif218return AH_TRUE;219} else220{221/* Configure the MUX */222ar9300_gpio_cfg_output_mux(ah, gpio, ah_signal_type);223}224225/* 2 bits per output mode */226gpio_shift = 2 * gpio;227228OS_REG_RMW(ah,229AR_HOSTIF_REG(ah, AR_GPIO_OE_OUT),230(AR_GPIO_OE_OUT_DRV_ALL << gpio_shift),231(AR_GPIO_OE_OUT_DRV << gpio_shift));232return AH_TRUE;233}234235/*236* Configure GPIO Output lines -LED off237*/238HAL_BOOL239ar9300_gpio_cfg_output_led_off(240struct ath_hal *ah,241u_int32_t gpio,242HAL_GPIO_MUX_TYPE halSignalType)243{244#define N(a) (sizeof(a) / sizeof(a[0]))245u_int32_t ah_signal_type;246u_int32_t gpio_shift;247u_int8_t smart_ant = 0;248249static const u_int32_t mux_signal_conversion_table[] = {250/* HAL_GPIO_OUTPUT_MUX_AS_OUTPUT */251AR_GPIO_OUTPUT_MUX_AS_OUTPUT,252/* HAL_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED */253AR_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED,254/* HAL_GPIO_OUTPUT_MUX_AS_PCIE_POWER_LED */255AR_GPIO_OUTPUT_MUX_AS_PCIE_POWER_LED,256/* HAL_GPIO_OUTPUT_MUX_AS_MAC_NETWORK_LED */257AR_GPIO_OUTPUT_MUX_AS_MAC_NETWORK_LED,258/* HAL_GPIO_OUTPUT_MUX_AS_MAC_POWER_LED */259AR_GPIO_OUTPUT_MUX_AS_MAC_POWER_LED,260/* HAL_GPIO_OUTPUT_MUX_AS_WLAN_ACTIVE */261AR_GPIO_OUTPUT_MUX_AS_RX_CLEAR_EXTERNAL,262/* HAL_GPIO_OUTPUT_MUX_AS_TX_FRAME */263AR_GPIO_OUTPUT_MUX_AS_TX_FRAME,264/* HAL_GPIO_OUTPUT_MUX_AS_MCI_WLAN_DATA */265AR_GPIO_OUTPUT_MUX_AS_MCI_WLAN_DATA,266/* HAL_GPIO_OUTPUT_MUX_AS_MCI_WLAN_CLK */267AR_GPIO_OUTPUT_MUX_AS_MCI_WLAN_CLK,268/* HAL_GPIO_OUTPUT_MUX_AS_MCI_BT_DATA */269AR_GPIO_OUTPUT_MUX_AS_MCI_BT_DATA,270/* HAL_GPIO_OUTPUT_MUX_AS_MCI_BT_CLK */271AR_GPIO_OUTPUT_MUX_AS_MCI_BT_CLK,272/* HAL_GPIO_OUTPUT_MUX_AS_WL_IN_TX */273AR_GPIO_OUTPUT_MUX_AS_WL_IN_TX,274/* HAL_GPIO_OUTPUT_MUX_AS_WL_IN_RX */275AR_GPIO_OUTPUT_MUX_AS_WL_IN_RX,276/* HAL_GPIO_OUTPUT_MUX_AS_BT_IN_TX */277AR_GPIO_OUTPUT_MUX_AS_BT_IN_TX,278/* HAL_GPIO_OUTPUT_MUX_AS_BT_IN_RX */279AR_GPIO_OUTPUT_MUX_AS_BT_IN_RX,280AR_GPIO_OUTPUT_MUX_AS_RUCKUS_STROBE,281AR_GPIO_OUTPUT_MUX_AS_RUCKUS_DATA,282AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL0,283AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL1,284AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL2285};286HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.hal_num_gpio_pins);287288/* Convert HAL signal type definitions to hardware-specific values. */289if ((int) halSignalType < ARRAY_LENGTH(mux_signal_conversion_table))290{291ah_signal_type = mux_signal_conversion_table[halSignalType];292} else {293return AH_FALSE;294}295#if UMAC_SUPPORT_SMARTANTENNA296/* Get the pin and func values for smart antenna */297switch (halSignalType)298{299case AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL0:300gpio = ATH_GPIOPIN_ANTCHAIN0;301ah_signal_type = ATH_GPIOFUNC_ANTCHAIN0;302smart_ant = 1;303break;304case AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL1:305gpio = ATH_GPIOPIN_ANTCHAIN1;306ah_signal_type = ATH_GPIOFUNC_ANTCHAIN1;307smart_ant = 1;308break;309case AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL2:310gpio = ATH_GPIOPIN_ANTCHAIN2;311ah_signal_type = ATH_GPIOFUNC_ANTCHAIN2;312smart_ant = 1;313break;314default:315break;316}317#endif318319if (smart_ant && AR_SREV_WASP(ah))320{321return AH_FALSE;322}323324// Configure the MUX325ar9300_gpio_cfg_output_mux(ah, gpio, ah_signal_type);326327// 2 bits per output mode328gpio_shift = 2*gpio;329330OS_REG_RMW(ah,331AR_HOSTIF_REG(ah, AR_GPIO_OE_OUT),332(AR_GPIO_OE_OUT_DRV_NO << gpio_shift),333(AR_GPIO_OE_OUT_DRV << gpio_shift));334335return AH_TRUE;336#undef N337}338339/*340* Configure GPIO Input lines341*/342HAL_BOOL343ar9300_gpio_cfg_input(struct ath_hal *ah, u_int32_t gpio)344{345u_int32_t gpio_shift;346347HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins);348if ((gpio == AR9382_GPIO_PIN_8_RESERVED) ||349(gpio > AR9382_MAX_GPIO_INPUT_PIN_NUM))350{351return AH_FALSE;352}353354if (gpio <= AR9382_MAX_JTAG_GPIO_PIN_NUM) {355OS_REG_SET_BIT(ah,356AR_HOSTIF_REG(ah, AR_GPIO_INPUT_EN_VAL), AR_GPIO_JTAG_DISABLE);357}358/* TODO: configure input mux for AR9300 */359/* If configured as input, set output to tristate */360gpio_shift = 2 * gpio;361362OS_REG_RMW(ah,363AR_HOSTIF_REG(ah, AR_GPIO_OE_OUT),364(AR_GPIO_OE_OUT_DRV_NO << gpio_shift),365(AR_GPIO_OE_OUT_DRV << gpio_shift));366return AH_TRUE;367}368369/*370* Once configured for I/O - set output lines371* output the level of GPio PIN without care work mode372*/373HAL_BOOL374ar9300_gpio_set(struct ath_hal *ah, u_int32_t gpio, u_int32_t val)375{376HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins);377if ((gpio == AR9382_GPIO_PIN_8_RESERVED) ||378(gpio == AR9382_GPIO_9_INPUT_ONLY))379{380return AH_FALSE;381}382OS_REG_RMW(ah, AR_HOSTIF_REG(ah, AR_GPIO_OUT),383((val & 1) << gpio), AR_GPIO_BIT(gpio));384385return AH_TRUE;386}387388/*389* Once configured for I/O - get input lines390*/391u_int32_t392ar9300_gpio_get(struct ath_hal *ah, u_int32_t gpio)393{394u_int32_t gpio_in;395HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins);396if (gpio == AR9382_GPIO_PIN_8_RESERVED)397{398return 0xffffffff;399}400401gpio_in = OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_IN));402OS_REG_RMW(ah, AR_HOSTIF_REG(ah, AR_GPIO_IN),403(1 << gpio), AR_GPIO_BIT(gpio));404return (MS(gpio_in, AR_GPIO_IN_VAL) & AR_GPIO_BIT(gpio)) != 0;405}406407u_int32_t408ar9300_gpio_get_intr(struct ath_hal *ah)409{410unsigned int mask = 0;411struct ath_hal_9300 *ahp = AH9300(ah);412413mask = ahp->ah_gpio_cause;414return mask;415}416417/*418* Set the GPIO Interrupt419* Sync and Async interrupts are both set/cleared.420* Async GPIO interrupts may not be raised when the chip is put to sleep.421*/422void423ar9300_gpio_set_intr(struct ath_hal *ah, u_int gpio, u_int32_t ilevel)424{425426427int i, reg_bit;428u_int32_t reg_val;429u_int32_t regs[2], shifts[2];430431#ifdef AH_ASSERT432u_int32_t gpio_mask;433u_int32_t old_field_val = 0, field_val = 0;434#endif435436#ifdef ATH_GPIO_USE_ASYNC_CAUSE437regs[0] = AR_HOSTIF_REG(ah, AR_INTR_ASYNC_ENABLE);438regs[1] = AR_HOSTIF_REG(ah, AR_INTR_ASYNC_MASK);439shifts[0] = AR_INTR_ASYNC_ENABLE_GPIO_S;440shifts[1] = AR_INTR_ASYNC_MASK_GPIO_S;441#else442regs[0] = AR_HOSTIF_REG(ah, AR_INTR_SYNC_ENABLE);443regs[1] = AR_HOSTIF_REG(ah, AR_INTR_SYNC_MASK);444shifts[0] = AR_INTR_SYNC_ENABLE_GPIO_S;445shifts[1] = AR_INTR_SYNC_MASK_GPIO_S;446#endif447448HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins);449450if ((gpio == AR9382_GPIO_PIN_8_RESERVED) ||451(gpio > AR9382_MAX_GPIO_INPUT_PIN_NUM))452{453return;454}455456#ifdef AH_ASSERT457gpio_mask = (1 << AH_PRIVATE(ah)->ah_caps.halNumGpioPins) - 1;458#endif459if (ilevel == HAL_GPIO_INTR_DISABLE) {460/* clear this GPIO's bit in the interrupt registers */461for (i = 0; i < ARRAY_LENGTH(regs); i++) {462reg_val = OS_REG_READ(ah, regs[i]);463reg_bit = shifts[i] + gpio;464reg_val &= ~(1 << reg_bit);465OS_REG_WRITE(ah, regs[i], reg_val);466467/* check that each register has same GPIOs enabled */468#ifdef AH_ASSERT469field_val = (reg_val >> shifts[i]) & gpio_mask;470HALASSERT(i == 0 || old_field_val == field_val);471old_field_val = field_val;472#endif473}474475} else {476reg_val = OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_INTR_POL));477reg_bit = gpio;478if (ilevel == HAL_GPIO_INTR_HIGH) {479/* 0 == interrupt on pin high */480reg_val &= ~(1 << reg_bit);481} else if (ilevel == HAL_GPIO_INTR_LOW) {482/* 1 == interrupt on pin low */483reg_val |= (1 << reg_bit);484}485OS_REG_WRITE(ah, AR_HOSTIF_REG(ah, AR_GPIO_INTR_POL), reg_val);486487/* set this GPIO's bit in the interrupt registers */488for (i = 0; i < ARRAY_LENGTH(regs); i++) {489reg_val = OS_REG_READ(ah, regs[i]);490reg_bit = shifts[i] + gpio;491reg_val |= (1 << reg_bit);492OS_REG_WRITE(ah, regs[i], reg_val);493494/* check that each register has same GPIOs enabled */495#ifdef AH_ASSERT496field_val = (reg_val >> shifts[i]) & gpio_mask;497HALASSERT(i == 0 || old_field_val == field_val);498old_field_val = field_val;499#endif500}501}502}503504u_int32_t505ar9300_gpio_get_polarity(struct ath_hal *ah)506{507return OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_INTR_POL));508509}510511void512ar9300_gpio_set_polarity(struct ath_hal *ah, u_int32_t pol_map,513u_int32_t changed_mask)514{515u_int32_t gpio_mask;516517gpio_mask = (1 << AH_PRIVATE(ah)->ah_caps.halNumGpioPins) - 1;518OS_REG_WRITE(ah, AR_HOSTIF_REG(ah, AR_GPIO_INTR_POL), gpio_mask & pol_map);519520#ifndef ATH_GPIO_USE_ASYNC_CAUSE521/*522* For SYNC_CAUSE type interrupts, we need to clear the cause register523* explicitly. Otherwise an interrupt with the original polarity setting524* will come up immediately (if there is already an interrupt source),525* which is not what we want usually.526*/527OS_REG_WRITE(ah, AR_HOSTIF_REG(ah, AR_INTR_SYNC_CAUSE_CLR),528changed_mask << AR_INTR_SYNC_ENABLE_GPIO_S);529OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_INTR_SYNC_CAUSE_CLR));530#endif531}532533/*534* get the GPIO input pin mask535* gpio0 - gpio13536* gpio8, gpio11, regard as reserved by the chip ar9382537*/538539u_int32_t540ar9300_gpio_get_mask(struct ath_hal *ah)541{542u_int32_t mask = (1 << (AR9382_MAX_GPIO_INPUT_PIN_NUM + 1) ) - 1;543544if (AH_PRIVATE(ah)->ah_devid == AR9300_DEVID_AR9380_PCIE) {545mask = (1 << AR9382_MAX_GPIO_PIN_NUM) - 1;546mask &= ~(1 << AR9382_GPIO_PIN_8_RESERVED);547}548return mask;549}550551int552ar9300_gpio_set_mask(struct ath_hal *ah, u_int32_t mask, u_int32_t pol_map)553{554u_int32_t invalid = ~((1 << (AR9382_MAX_GPIO_INPUT_PIN_NUM + 1)) - 1);555556if (AH_PRIVATE(ah)->ah_devid == AR9300_DEVID_AR9380_PCIE) {557invalid = ~((1 << AR9382_MAX_GPIO_PIN_NUM) - 1);558invalid |= 1 << AR9382_GPIO_PIN_8_RESERVED;559}560if (mask & invalid) {561ath_hal_printf(ah, "%s: invalid GPIO mask 0x%x\n", __func__, mask);562return -1;563}564AH9300(ah)->ah_gpio_mask = mask;565OS_REG_WRITE(ah, AR_HOSTIF_REG(ah, AR_GPIO_INTR_POL), mask & pol_map);566567return 0;568}569570#ifdef AH_DEBUG571void ar9300_gpio_show(struct ath_hal *ah);572void ar9300_gpio_show(struct ath_hal *ah)573{574ath_hal_printf(ah, "--- 9382 GPIOs ---(ah=%p)\n", ah );575ath_hal_printf(ah,576"AH9300(_ah)->ah_hostifregs:%p\r\n", &(AH9300(ah)->ah_hostifregs));577ath_hal_printf(ah,578"GPIO_OUT: 0x%08X\n",579OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_OUT)));580ath_hal_printf(ah,581"GPIO_IN: 0x%08X\n",582OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_IN)));583ath_hal_printf(ah,584"GPIO_OE: 0x%08X\n",585OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_OE_OUT)));586ath_hal_printf(ah,587"GPIO_OE1_OUT: 0x%08X\n",588OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_OE1_OUT)));589ath_hal_printf(ah,590"GPIO_INTR_POLAR: 0x%08X\n",591OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_INTR_POL)));592ath_hal_printf(ah,593"GPIO_INPUT_VALUE: 0x%08X\n",594OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_INPUT_EN_VAL)));595ath_hal_printf(ah,596"GPIO_INPUT_MUX1: 0x%08X\n",597OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_INPUT_MUX1)));598ath_hal_printf(ah,599"GPIO_INPUT_MUX2: 0x%08X\n",600OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_INPUT_MUX2)));601ath_hal_printf(ah,602"GPIO_OUTPUT_MUX1: 0x%08X\n",603OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_OUTPUT_MUX1)));604ath_hal_printf(ah,605"GPIO_OUTPUT_MUX2: 0x%08X\n",606OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_OUTPUT_MUX2)));607ath_hal_printf(ah,608"GPIO_OUTPUT_MUX3: 0x%08X\n",609OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_OUTPUT_MUX3)));610ath_hal_printf(ah,611"GPIO_INPUT_STATE: 0x%08X\n",612OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_INPUT_STATE)));613ath_hal_printf(ah,614"GPIO_PDPU: 0x%08X\n",615OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_PDPU)));616ath_hal_printf(ah,617"GPIO_DS: 0x%08X\n",618OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_DS)));619ath_hal_printf(ah,620"AR_INTR_ASYNC_ENABLE: 0x%08X\n",621OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_INTR_ASYNC_ENABLE)));622ath_hal_printf(ah,623"AR_INTR_ASYNC_MASK: 0x%08X\n",624OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_INTR_ASYNC_MASK)));625ath_hal_printf(ah,626"AR_INTR_SYNC_ENABLE: 0x%08X\n",627OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_INTR_SYNC_ENABLE)));628ath_hal_printf(ah,629"AR_INTR_SYNC_MASK: 0x%08X\n",630OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_INTR_SYNC_MASK)));631ath_hal_printf(ah,632"AR_INTR_ASYNC_CAUSE: 0x%08X\n",633OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_INTR_ASYNC_CAUSE)));634ath_hal_printf(ah,635"AR_INTR_SYNC_CAUSE: 0x%08X\n",636OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_INTR_SYNC_CAUSE)));637638}639#endif /*AH_DEBUG*/640641642