Path: blob/main/sys/dev/ath/ath_hal/ar5312/ar5312_gpio.c
39566 views
/*-1* SPDX-License-Identifier: ISC2*3* Copyright (c) 2002-2008 Sam Leffler, Errno Consulting4* Copyright (c) 2002-2008 Atheros Communications, Inc.5*6* Permission to use, copy, modify, and/or distribute this software for any7* purpose with or without fee is hereby granted, provided that the above8* copyright notice and this permission notice appear in all copies.9*10* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES11* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF12* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR13* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES14* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN15* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF16* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.17*/18#include "opt_ah.h"1920#ifdef AH_SUPPORT_AR53122122#include "ah.h"23#include "ah_internal.h"24#include "ah_devid.h"2526#include "ar5312/ar5312.h"27#include "ar5312/ar5312reg.h"28#include "ar5312/ar5312phy.h"2930#define AR_NUM_GPIO 6 /* 6 GPIO pins */31#define AR5312_GPIOD_MASK 0x0000002F /* GPIO data reg r/w mask */3233/*34* Configure GPIO Output lines35*/36HAL_BOOL37ar5312GpioCfgOutput(struct ath_hal *ah, uint32_t gpio, HAL_GPIO_MUX_TYPE type)38{39uint32_t gpioOffset = (AR5312_GPIO_BASE - ((uint32_t) ah->ah_sh));4041HALASSERT(gpio < AR_NUM_GPIO);4243OS_REG_WRITE(ah, gpioOffset+AR5312_GPIOCR,44(OS_REG_READ(ah, gpioOffset+AR5312_GPIOCR) &~ AR_GPIOCR_CR_A(gpio))45| AR_GPIOCR_CR_A(gpio));4647return AH_TRUE;48}4950/*51* Configure GPIO Input lines52*/53HAL_BOOL54ar5312GpioCfgInput(struct ath_hal *ah, uint32_t gpio)55{56uint32_t gpioOffset = (AR5312_GPIO_BASE - ((uint32_t) ah->ah_sh));5758HALASSERT(gpio < AR_NUM_GPIO);5960OS_REG_WRITE(ah, gpioOffset+AR5312_GPIOCR,61(OS_REG_READ(ah, gpioOffset+AR5312_GPIOCR) &~ AR_GPIOCR_CR_A(gpio))62| AR_GPIOCR_CR_N(gpio));6364return AH_TRUE;65}6667/*68* Once configured for I/O - set output lines69*/70HAL_BOOL71ar5312GpioSet(struct ath_hal *ah, uint32_t gpio, uint32_t val)72{73uint32_t reg;74uint32_t gpioOffset = (AR5312_GPIO_BASE - ((uint32_t) ah->ah_sh));7576HALASSERT(gpio < AR_NUM_GPIO);7778reg = OS_REG_READ(ah, gpioOffset+AR5312_GPIODO);79reg &= ~(1 << gpio);80reg |= (val&1) << gpio;8182OS_REG_WRITE(ah, gpioOffset+AR5312_GPIODO, reg);83return AH_TRUE;84}8586/*87* Once configured for I/O - get input lines88*/89uint32_t90ar5312GpioGet(struct ath_hal *ah, uint32_t gpio)91{92uint32_t gpioOffset = (AR5312_GPIO_BASE - ((uint32_t) ah->ah_sh));9394if (gpio < AR_NUM_GPIO) {95uint32_t val = OS_REG_READ(ah, gpioOffset+AR5312_GPIODI);96val = ((val & AR5312_GPIOD_MASK) >> gpio) & 0x1;97return val;98} else {99return 0xffffffff;100}101}102103/*104* Set the GPIO Interrupt105*/106void107ar5312GpioSetIntr(struct ath_hal *ah, u_int gpio, uint32_t ilevel)108{109uint32_t val;110uint32_t gpioOffset = (AR5312_GPIO_BASE - ((uint32_t) ah->ah_sh));111112/* XXX bounds check gpio */113val = OS_REG_READ(ah, gpioOffset+AR5312_GPIOCR);114val &= ~(AR_GPIOCR_CR_A(gpio) |115AR_GPIOCR_INT_MASK | AR_GPIOCR_INT_ENA | AR_GPIOCR_INT_SEL);116val |= AR_GPIOCR_CR_N(gpio) | AR_GPIOCR_INT(gpio) | AR_GPIOCR_INT_ENA;117if (ilevel)118val |= AR_GPIOCR_INT_SELH; /* interrupt on pin high */119else120val |= AR_GPIOCR_INT_SELL; /* interrupt on pin low */121122/* Don't need to change anything for low level interrupt. */123OS_REG_WRITE(ah, gpioOffset+AR5312_GPIOCR, val);124125/* Change the interrupt mask. */126(void) ar5212SetInterrupts(ah, AH5212(ah)->ah_maskReg | HAL_INT_GPIO);127}128129#endif /* AH_SUPPORT_AR5312 */130131132