1/* 2 * Copyright (c) 2013 Qualcomm Atheros, Inc. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 9 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 11 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 13 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14 * PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17#include "opt_ah.h" 18 |
19#include "ah.h" 20#include "ah_internal.h" 21#include "ah_devid.h" 22#ifdef AH_DEBUG 23#include "ah_desc.h" /* NB: for HAL_PHYERR* */ 24#endif 25 26#include "ar9300/ar9300.h" 27#include "ar9300/ar9300reg.h" 28#include "ar9300/ar9300phy.h" 29 30#define AR_GPIO_BIT(_gpio) (1 << (_gpio)) 31 32/* 33 * Configure GPIO Output Mux control 34 */ |
35#if UMAC_SUPPORT_SMARTANTENNA |
36static void ar9340_soc_gpio_cfg_output_mux( 37 struct ath_hal *ah, 38 u_int32_t gpio, 39 u_int32_t ah_signal_type) 40{ 41#define ADDR_READ(addr) (*((volatile u_int32_t *)(addr))) 42#define ADDR_WRITE(addr, b) (void)((*(volatile u_int32_t *) (addr)) = (b)) 43#define AR9340_SOC_GPIO_FUN0 0xB804002c --- 61 unchanged lines hidden (view full) --- 105 106/* 107 * Configure GPIO Output lines 108 */ 109HAL_BOOL 110ar9300_gpio_cfg_output( 111 struct ath_hal *ah, 112 u_int32_t gpio, |
113 HAL_GPIO_MUX_TYPE hal_signal_type) |
114{ 115 u_int32_t ah_signal_type; 116 u_int32_t gpio_shift; 117 u_int8_t smart_ant = 0; 118 static const u_int32_t mux_signal_conversion_table[] = { 119 /* HAL_GPIO_OUTPUT_MUX_AS_OUTPUT */ 120 AR_GPIO_OUTPUT_MUX_AS_OUTPUT, 121 /* HAL_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED */ --- 33 unchanged lines hidden (view full) --- 155 /* HAL_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL1 */ 156 AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL1, 157 /* HAL_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL2 */ 158 AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL2, 159 /* HAL_GPIO_OUTPUT_MUX_AS_SMARTANT_SWCOM3 */ 160 AR_GPIO_OUTPUT_MUX_AS_SWCOM3, 161 }; 162 |
163 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins); |
164 if ((gpio == AR9382_GPIO_PIN_8_RESERVED) || 165 (gpio == AR9382_GPIO_PIN_11_RESERVED) || 166 (gpio == AR9382_GPIO_9_INPUT_ONLY)) 167 { 168 return AH_FALSE; 169 } 170 171 /* Convert HAL signal type definitions to hardware-specific values. */ |
172 if ((int) hal_signal_type < ARRAY_LENGTH(mux_signal_conversion_table)) |
173 { 174 ah_signal_type = mux_signal_conversion_table[hal_signal_type]; 175 } else { 176 return AH_FALSE; 177 } 178 179 if (gpio <= AR9382_MAX_JTAG_GPIO_PIN_NUM) { 180 OS_REG_SET_BIT(ah, --- 28 unchanged lines hidden (view full) --- 209#endif 210 default: 211 break; 212 } 213#endif 214 215 if (smart_ant && (AR_SREV_WASP(ah) || AR_SREV_SCORPION(ah))) 216 { |
217#if UMAC_SUPPORT_SMARTANTENNA |
218 ar9340_soc_gpio_cfg_output_mux(ah, gpio, ah_signal_type); 219#endif 220 return AH_TRUE; 221 } else 222 { 223 /* Configure the MUX */ 224 ar9300_gpio_cfg_output_mux(ah, gpio, ah_signal_type); 225 } --- 10 unchanged lines hidden (view full) --- 236 237/* 238 * Configure GPIO Output lines -LED off 239 */ 240HAL_BOOL 241ar9300_gpio_cfg_output_led_off( 242 struct ath_hal *ah, 243 u_int32_t gpio, |
244 HAL_GPIO_MUX_TYPE halSignalType) |
245{ 246#define N(a) (sizeof(a) / sizeof(a[0])) 247 u_int32_t ah_signal_type; 248 u_int32_t gpio_shift; 249 u_int8_t smart_ant = 0; 250 251 static const u_int32_t mux_signal_conversion_table[] = { 252 /* HAL_GPIO_OUTPUT_MUX_AS_OUTPUT */ --- 30 unchanged lines hidden (view full) --- 283 AR_GPIO_OUTPUT_MUX_AS_RUCKUS_DATA, 284 AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL0, 285 AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL1, 286 AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL2 287 }; 288 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.hal_num_gpio_pins); 289 290 /* Convert HAL signal type definitions to hardware-specific values. */ |
291 if ((int) halSignalType < ARRAY_LENGTH(mux_signal_conversion_table)) |
292 { 293 ah_signal_type = mux_signal_conversion_table[halSignalType]; 294 } else { 295 return AH_FALSE; 296 } 297#if UMAC_SUPPORT_SMARTANTENNA 298 /* Get the pin and func values for smart antenna */ 299 switch (halSignalType) --- 41 unchanged lines hidden (view full) --- 341/* 342 * Configure GPIO Input lines 343 */ 344HAL_BOOL 345ar9300_gpio_cfg_input(struct ath_hal *ah, u_int32_t gpio) 346{ 347 u_int32_t gpio_shift; 348 |
349 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins); |
350 if ((gpio == AR9382_GPIO_PIN_8_RESERVED) || 351 (gpio == AR9382_GPIO_PIN_11_RESERVED) || 352 (gpio > AR9382_MAX_GPIO_INPUT_PIN_NUM)) 353 { 354 return AH_FALSE; 355 } 356 357 if (gpio <= AR9382_MAX_JTAG_GPIO_PIN_NUM) { --- 13 unchanged lines hidden (view full) --- 371 372/* 373 * Once configured for I/O - set output lines 374 * output the level of GPio PIN without care work mode 375 */ 376HAL_BOOL 377ar9300_gpio_set(struct ath_hal *ah, u_int32_t gpio, u_int32_t val) 378{ |
379 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins); |
380 if ((gpio == AR9382_GPIO_PIN_8_RESERVED) || 381 (gpio == AR9382_GPIO_PIN_11_RESERVED) || 382 (gpio == AR9382_GPIO_9_INPUT_ONLY)) 383 { 384 return AH_FALSE; 385 } 386 OS_REG_RMW(ah, AR_HOSTIF_REG(ah, AR_GPIO_OUT), 387 ((val & 1) << gpio), AR_GPIO_BIT(gpio)); 388 389 return AH_TRUE; 390} 391 392/* 393 * Once configured for I/O - get input lines 394 */ 395u_int32_t 396ar9300_gpio_get(struct ath_hal *ah, u_int32_t gpio) 397{ 398 u_int32_t gpio_in; |
399 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins); |
400 if ((gpio == AR9382_GPIO_PIN_8_RESERVED) || 401 (gpio == AR9382_GPIO_PIN_11_RESERVED)) 402 { 403 return 0xffffffff; 404 } 405 406 gpio_in = OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_IN)); 407 OS_REG_RMW(ah, AR_HOSTIF_REG(ah, AR_GPIO_IN), --- 37 unchanged lines hidden (view full) --- 445 shifts[1] = AR_INTR_ASYNC_MASK_GPIO_S; 446#else 447 regs[0] = AR_HOSTIF_REG(ah, AR_INTR_SYNC_ENABLE); 448 regs[1] = AR_HOSTIF_REG(ah, AR_INTR_SYNC_MASK); 449 shifts[0] = AR_INTR_SYNC_ENABLE_GPIO_S; 450 shifts[1] = AR_INTR_SYNC_MASK_GPIO_S; 451#endif 452 |
453 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins); |
454 455 if ((gpio == AR9382_GPIO_PIN_8_RESERVED) || 456 (gpio == AR9382_GPIO_PIN_11_RESERVED) || 457 (gpio > AR9382_MAX_GPIO_INPUT_PIN_NUM)) 458 { 459 return; 460 } 461 462#ifdef AH_ASSERT |
463 gpio_mask = (1 << AH_PRIVATE(ah)->ah_caps.halNumGpioPins) - 1; |
464#endif |
465 if (ilevel == HAL_GPIO_INTR_DISABLE) { 466 /* clear this GPIO's bit in the interrupt registers */ 467 for (i = 0; i < ARRAY_LENGTH(regs); i++) { 468 reg_val = OS_REG_READ(ah, regs[i]); 469 reg_bit = shifts[i] + gpio; 470 reg_val &= ~(1 << reg_bit); 471 OS_REG_WRITE(ah, regs[i], reg_val); 472 --- 42 unchanged lines hidden (view full) --- 515} 516 517void 518ar9300_gpio_set_polarity(struct ath_hal *ah, u_int32_t pol_map, 519 u_int32_t changed_mask) 520{ 521 u_int32_t gpio_mask; 522 |
523 gpio_mask = (1 << AH_PRIVATE(ah)->ah_caps.halNumGpioPins) - 1; |
524 OS_REG_WRITE(ah, AR_HOSTIF_REG(ah, AR_GPIO_INTR_POL), gpio_mask & pol_map); 525 526#ifndef ATH_GPIO_USE_ASYNC_CAUSE 527 /* 528 * For SYNC_CAUSE type interrupts, we need to clear the cause register 529 * explicitly. Otherwise an interrupt with the original polarity setting 530 * will come up immediately (if there is already an interrupt source), 531 * which is not what we want usually. --- 108 unchanged lines hidden (view full) --- 640 "AR_INTR_ASYNC_CAUSE: 0x%08X\n", 641 OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_INTR_ASYNC_CAUSE))); 642 ath_hal_printf(ah, 643 "AR_INTR_SYNC_CAUSE: 0x%08X\n", 644 OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_INTR_SYNC_CAUSE))); 645 646} 647#endif /*AH_DEBUG*/ |