ar9300_gpio.c (250007) | ar9300_gpio.c (250008) |
---|---|
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 | 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#ifdef AH_SUPPORT_AR9300 20 | |
21#include "ah.h" 22#include "ah_internal.h" 23#include "ah_devid.h" 24#ifdef AH_DEBUG 25#include "ah_desc.h" /* NB: for HAL_PHYERR* */ 26#endif 27 28#include "ar9300/ar9300.h" 29#include "ar9300/ar9300reg.h" 30#include "ar9300/ar9300phy.h" 31 32#define AR_GPIO_BIT(_gpio) (1 << (_gpio)) 33 34/* 35 * Configure GPIO Output Mux control 36 */ | 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 */ |
37#ifdef UMAC_SUPPORT_SMARTANTENNA | 35#if UMAC_SUPPORT_SMARTANTENNA |
38static void ar9340_soc_gpio_cfg_output_mux( 39 struct ath_hal *ah, 40 u_int32_t gpio, 41 u_int32_t ah_signal_type) 42{ 43#define ADDR_READ(addr) (*((volatile u_int32_t *)(addr))) 44#define ADDR_WRITE(addr, b) (void)((*(volatile u_int32_t *) (addr)) = (b)) 45#define AR9340_SOC_GPIO_FUN0 0xB804002c --- 61 unchanged lines hidden (view full) --- 107 108/* 109 * Configure GPIO Output lines 110 */ 111HAL_BOOL 112ar9300_gpio_cfg_output( 113 struct ath_hal *ah, 114 u_int32_t gpio, | 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, |
115 HAL_GPIO_OUTPUT_MUX_TYPE hal_signal_type) | 113 HAL_GPIO_MUX_TYPE hal_signal_type) |
116{ 117 u_int32_t ah_signal_type; 118 u_int32_t gpio_shift; 119 u_int8_t smart_ant = 0; 120 static const u_int32_t mux_signal_conversion_table[] = { 121 /* HAL_GPIO_OUTPUT_MUX_AS_OUTPUT */ 122 AR_GPIO_OUTPUT_MUX_AS_OUTPUT, 123 /* HAL_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED */ --- 33 unchanged lines hidden (view full) --- 157 /* HAL_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL1 */ 158 AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL1, 159 /* HAL_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL2 */ 160 AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL2, 161 /* HAL_GPIO_OUTPUT_MUX_AS_SMARTANT_SWCOM3 */ 162 AR_GPIO_OUTPUT_MUX_AS_SWCOM3, 163 }; 164 | 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 |
165 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.hal_num_gpio_pins); | 163 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins); |
166 if ((gpio == AR9382_GPIO_PIN_8_RESERVED) || 167 (gpio == AR9382_GPIO_PIN_11_RESERVED) || 168 (gpio == AR9382_GPIO_9_INPUT_ONLY)) 169 { 170 return AH_FALSE; 171 } 172 173 /* Convert HAL signal type definitions to hardware-specific values. */ | 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. */ |
174 if (hal_signal_type < ARRAY_LENGTH(mux_signal_conversion_table)) | 172 if ((int) hal_signal_type < ARRAY_LENGTH(mux_signal_conversion_table)) |
175 { 176 ah_signal_type = mux_signal_conversion_table[hal_signal_type]; 177 } else { 178 return AH_FALSE; 179 } 180 181 if (gpio <= AR9382_MAX_JTAG_GPIO_PIN_NUM) { 182 OS_REG_SET_BIT(ah, --- 28 unchanged lines hidden (view full) --- 211#endif 212 default: 213 break; 214 } 215#endif 216 217 if (smart_ant && (AR_SREV_WASP(ah) || AR_SREV_SCORPION(ah))) 218 { | 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 { |
219#ifdef UMAC_SUPPORT_SMARTANTENNA | 217#if UMAC_SUPPORT_SMARTANTENNA |
220 ar9340_soc_gpio_cfg_output_mux(ah, gpio, ah_signal_type); 221#endif 222 return AH_TRUE; 223 } else 224 { 225 /* Configure the MUX */ 226 ar9300_gpio_cfg_output_mux(ah, gpio, ah_signal_type); 227 } --- 10 unchanged lines hidden (view full) --- 238 239/* 240 * Configure GPIO Output lines -LED off 241 */ 242HAL_BOOL 243ar9300_gpio_cfg_output_led_off( 244 struct ath_hal *ah, 245 u_int32_t gpio, | 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, |
246 HAL_GPIO_OUTPUT_MUX_TYPE halSignalType) | 244 HAL_GPIO_MUX_TYPE halSignalType) |
247{ 248#define N(a) (sizeof(a) / sizeof(a[0])) 249 u_int32_t ah_signal_type; 250 u_int32_t gpio_shift; 251 u_int8_t smart_ant = 0; 252 253 static const u_int32_t mux_signal_conversion_table[] = { 254 /* HAL_GPIO_OUTPUT_MUX_AS_OUTPUT */ --- 30 unchanged lines hidden (view full) --- 285 AR_GPIO_OUTPUT_MUX_AS_RUCKUS_DATA, 286 AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL0, 287 AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL1, 288 AR_GPIO_OUTPUT_MUX_AS_SMARTANT_CTRL2 289 }; 290 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.hal_num_gpio_pins); 291 292 /* Convert HAL signal type definitions to hardware-specific values. */ | 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. */ |
293 if (halSignalType < ARRAY_LENGTH(mux_signal_conversion_table)) | 291 if ((int) halSignalType < ARRAY_LENGTH(mux_signal_conversion_table)) |
294 { 295 ah_signal_type = mux_signal_conversion_table[halSignalType]; 296 } else { 297 return AH_FALSE; 298 } 299#if UMAC_SUPPORT_SMARTANTENNA 300 /* Get the pin and func values for smart antenna */ 301 switch (halSignalType) --- 41 unchanged lines hidden (view full) --- 343/* 344 * Configure GPIO Input lines 345 */ 346HAL_BOOL 347ar9300_gpio_cfg_input(struct ath_hal *ah, u_int32_t gpio) 348{ 349 u_int32_t gpio_shift; 350 | 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 |
351 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.hal_num_gpio_pins); | 349 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins); |
352 if ((gpio == AR9382_GPIO_PIN_8_RESERVED) || 353 (gpio == AR9382_GPIO_PIN_11_RESERVED) || 354 (gpio > AR9382_MAX_GPIO_INPUT_PIN_NUM)) 355 { 356 return AH_FALSE; 357 } 358 359 if (gpio <= AR9382_MAX_JTAG_GPIO_PIN_NUM) { --- 13 unchanged lines hidden (view full) --- 373 374/* 375 * Once configured for I/O - set output lines 376 * output the level of GPio PIN without care work mode 377 */ 378HAL_BOOL 379ar9300_gpio_set(struct ath_hal *ah, u_int32_t gpio, u_int32_t val) 380{ | 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{ |
381 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.hal_num_gpio_pins); | 379 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins); |
382 if ((gpio == AR9382_GPIO_PIN_8_RESERVED) || 383 (gpio == AR9382_GPIO_PIN_11_RESERVED) || 384 (gpio == AR9382_GPIO_9_INPUT_ONLY)) 385 { 386 return AH_FALSE; 387 } 388 OS_REG_RMW(ah, AR_HOSTIF_REG(ah, AR_GPIO_OUT), 389 ((val & 1) << gpio), AR_GPIO_BIT(gpio)); 390 391 return AH_TRUE; 392} 393 394/* 395 * Once configured for I/O - get input lines 396 */ 397u_int32_t 398ar9300_gpio_get(struct ath_hal *ah, u_int32_t gpio) 399{ 400 u_int32_t gpio_in; | 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; |
401 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.hal_num_gpio_pins); | 399 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins); |
402 if ((gpio == AR9382_GPIO_PIN_8_RESERVED) || 403 (gpio == AR9382_GPIO_PIN_11_RESERVED)) 404 { 405 return 0xffffffff; 406 } 407 408 gpio_in = OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_GPIO_IN)); 409 OS_REG_RMW(ah, AR_HOSTIF_REG(ah, AR_GPIO_IN), --- 37 unchanged lines hidden (view full) --- 447 shifts[1] = AR_INTR_ASYNC_MASK_GPIO_S; 448#else 449 regs[0] = AR_HOSTIF_REG(ah, AR_INTR_SYNC_ENABLE); 450 regs[1] = AR_HOSTIF_REG(ah, AR_INTR_SYNC_MASK); 451 shifts[0] = AR_INTR_SYNC_ENABLE_GPIO_S; 452 shifts[1] = AR_INTR_SYNC_MASK_GPIO_S; 453#endif 454 | 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 |
455 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.hal_num_gpio_pins); | 453 HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins); |
456 457 if ((gpio == AR9382_GPIO_PIN_8_RESERVED) || 458 (gpio == AR9382_GPIO_PIN_11_RESERVED) || 459 (gpio > AR9382_MAX_GPIO_INPUT_PIN_NUM)) 460 { 461 return; 462 } 463 464#ifdef AH_ASSERT | 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 |
465 gpio_mask = (1 << AH_PRIVATE(ah)->ah_caps.hal_num_gpio_pins) - 1; | 463 gpio_mask = (1 << AH_PRIVATE(ah)->ah_caps.halNumGpioPins) - 1; |
466#endif | 464#endif |
467 | |
468 if (ilevel == HAL_GPIO_INTR_DISABLE) { 469 /* clear this GPIO's bit in the interrupt registers */ 470 for (i = 0; i < ARRAY_LENGTH(regs); i++) { 471 reg_val = OS_REG_READ(ah, regs[i]); 472 reg_bit = shifts[i] + gpio; 473 reg_val &= ~(1 << reg_bit); 474 OS_REG_WRITE(ah, regs[i], reg_val); 475 --- 42 unchanged lines hidden (view full) --- 518} 519 520void 521ar9300_gpio_set_polarity(struct ath_hal *ah, u_int32_t pol_map, 522 u_int32_t changed_mask) 523{ 524 u_int32_t gpio_mask; 525 | 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 |
526 gpio_mask = (1 << AH_PRIVATE(ah)->ah_caps.hal_num_gpio_pins) - 1; | 523 gpio_mask = (1 << AH_PRIVATE(ah)->ah_caps.halNumGpioPins) - 1; |
527 OS_REG_WRITE(ah, AR_HOSTIF_REG(ah, AR_GPIO_INTR_POL), gpio_mask & pol_map); 528 529#ifndef ATH_GPIO_USE_ASYNC_CAUSE 530 /* 531 * For SYNC_CAUSE type interrupts, we need to clear the cause register 532 * explicitly. Otherwise an interrupt with the original polarity setting 533 * will come up immediately (if there is already an interrupt source), 534 * which is not what we want usually. --- 108 unchanged lines hidden (view full) --- 643 "AR_INTR_ASYNC_CAUSE: 0x%08X\n", 644 OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_INTR_ASYNC_CAUSE))); 645 ath_hal_printf(ah, 646 "AR_INTR_SYNC_CAUSE: 0x%08X\n", 647 OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_INTR_SYNC_CAUSE))); 648 649} 650#endif /*AH_DEBUG*/ | 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*/ |
651 652#endif /* AH_SUPPORT_AR9300 */ | |