1 1.1 alc /* 2 1.1 alc * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting 3 1.1 alc * Copyright (c) 2002-2008 Atheros Communications, Inc. 4 1.1 alc * 5 1.1 alc * Permission to use, copy, modify, and/or distribute this software for any 6 1.1 alc * purpose with or without fee is hereby granted, provided that the above 7 1.1 alc * copyright notice and this permission notice appear in all copies. 8 1.1 alc * 9 1.1 alc * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 1.1 alc * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 1.1 alc * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 1.1 alc * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 1.1 alc * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 1.1 alc * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 1.1 alc * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 1.1 alc * 17 1.2 cegger * $Id: ar5312_gpio.c,v 1.2 2011/03/07 11:25:44 cegger Exp $ 18 1.1 alc */ 19 1.1 alc #include "opt_ah.h" 20 1.1 alc 21 1.1 alc #ifdef AH_SUPPORT_AR5312 22 1.1 alc 23 1.1 alc #include "ah.h" 24 1.1 alc #include "ah_internal.h" 25 1.1 alc #include "ah_devid.h" 26 1.1 alc 27 1.1 alc #include "ar5312/ar5312.h" 28 1.1 alc #include "ar5312/ar5312reg.h" 29 1.1 alc #include "ar5312/ar5312phy.h" 30 1.1 alc 31 1.1 alc #define AR_NUM_GPIO 6 /* 6 GPIO pins */ 32 1.1 alc #define AR5312_GPIOD_MASK 0x0000002F /* GPIO data reg r/w mask */ 33 1.1 alc 34 1.1 alc /* 35 1.1 alc * Configure GPIO Output lines 36 1.1 alc */ 37 1.1 alc HAL_BOOL 38 1.2 cegger ar5312GpioCfgOutput(struct ath_hal *ah, uint32_t gpio, HAL_GPIO_MUX_TYPE type) 39 1.1 alc { 40 1.1 alc uint32_t gpioOffset = (AR5312_GPIO_BASE - ((uint32_t) ah->ah_sh)); 41 1.1 alc 42 1.1 alc HALASSERT(gpio < AR_NUM_GPIO); 43 1.1 alc 44 1.1 alc OS_REG_WRITE(ah, gpioOffset+AR5312_GPIOCR, 45 1.1 alc (OS_REG_READ(ah, gpioOffset+AR5312_GPIOCR) &~ AR_GPIOCR_CR_A(gpio)) 46 1.1 alc | AR_GPIOCR_CR_A(gpio)); 47 1.1 alc 48 1.1 alc return AH_TRUE; 49 1.1 alc } 50 1.1 alc 51 1.1 alc /* 52 1.1 alc * Configure GPIO Input lines 53 1.1 alc */ 54 1.1 alc HAL_BOOL 55 1.1 alc ar5312GpioCfgInput(struct ath_hal *ah, uint32_t gpio) 56 1.1 alc { 57 1.1 alc uint32_t gpioOffset = (AR5312_GPIO_BASE - ((uint32_t) ah->ah_sh)); 58 1.1 alc 59 1.1 alc HALASSERT(gpio < AR_NUM_GPIO); 60 1.1 alc 61 1.1 alc OS_REG_WRITE(ah, gpioOffset+AR5312_GPIOCR, 62 1.1 alc (OS_REG_READ(ah, gpioOffset+AR5312_GPIOCR) &~ AR_GPIOCR_CR_A(gpio)) 63 1.1 alc | AR_GPIOCR_CR_N(gpio)); 64 1.1 alc 65 1.1 alc return AH_TRUE; 66 1.1 alc } 67 1.1 alc 68 1.1 alc /* 69 1.1 alc * Once configured for I/O - set output lines 70 1.1 alc */ 71 1.1 alc HAL_BOOL 72 1.1 alc ar5312GpioSet(struct ath_hal *ah, uint32_t gpio, uint32_t val) 73 1.1 alc { 74 1.1 alc uint32_t reg; 75 1.1 alc uint32_t gpioOffset = (AR5312_GPIO_BASE - ((uint32_t) ah->ah_sh)); 76 1.1 alc 77 1.1 alc HALASSERT(gpio < AR_NUM_GPIO); 78 1.1 alc 79 1.1 alc reg = OS_REG_READ(ah, gpioOffset+AR5312_GPIODO); 80 1.1 alc reg &= ~(1 << gpio); 81 1.1 alc reg |= (val&1) << gpio; 82 1.1 alc 83 1.1 alc OS_REG_WRITE(ah, gpioOffset+AR5312_GPIODO, reg); 84 1.1 alc return AH_TRUE; 85 1.1 alc } 86 1.1 alc 87 1.1 alc /* 88 1.1 alc * Once configured for I/O - get input lines 89 1.1 alc */ 90 1.1 alc uint32_t 91 1.1 alc ar5312GpioGet(struct ath_hal *ah, uint32_t gpio) 92 1.1 alc { 93 1.1 alc uint32_t gpioOffset = (AR5312_GPIO_BASE - ((uint32_t) ah->ah_sh)); 94 1.1 alc 95 1.1 alc if (gpio < AR_NUM_GPIO) { 96 1.1 alc uint32_t val = OS_REG_READ(ah, gpioOffset+AR5312_GPIODI); 97 1.1 alc val = ((val & AR5312_GPIOD_MASK) >> gpio) & 0x1; 98 1.1 alc return val; 99 1.1 alc } else { 100 1.1 alc return 0xffffffff; 101 1.1 alc } 102 1.1 alc } 103 1.1 alc 104 1.1 alc /* 105 1.1 alc * Set the GPIO Interrupt 106 1.1 alc */ 107 1.1 alc void 108 1.1 alc ar5312GpioSetIntr(struct ath_hal *ah, u_int gpio, uint32_t ilevel) 109 1.1 alc { 110 1.1 alc uint32_t val; 111 1.1 alc uint32_t gpioOffset = (AR5312_GPIO_BASE - ((uint32_t) ah->ah_sh)); 112 1.1 alc 113 1.1 alc /* XXX bounds check gpio */ 114 1.1 alc val = OS_REG_READ(ah, gpioOffset+AR5312_GPIOCR); 115 1.1 alc val &= ~(AR_GPIOCR_CR_A(gpio) | 116 1.1 alc AR_GPIOCR_INT_MASK | AR_GPIOCR_INT_ENA | AR_GPIOCR_INT_SEL); 117 1.1 alc val |= AR_GPIOCR_CR_N(gpio) | AR_GPIOCR_INT(gpio) | AR_GPIOCR_INT_ENA; 118 1.1 alc if (ilevel) 119 1.1 alc val |= AR_GPIOCR_INT_SELH; /* interrupt on pin high */ 120 1.1 alc else 121 1.1 alc val |= AR_GPIOCR_INT_SELL; /* interrupt on pin low */ 122 1.1 alc 123 1.1 alc /* Don't need to change anything for low level interrupt. */ 124 1.1 alc OS_REG_WRITE(ah, gpioOffset+AR5312_GPIOCR, val); 125 1.1 alc 126 1.1 alc /* Change the interrupt mask. */ 127 1.1 alc (void) ar5212SetInterrupts(ah, AH5212(ah)->ah_maskReg | HAL_INT_GPIO); 128 1.1 alc } 129 1.1 alc 130 1.1 alc 131 1.1 alc #endif /* AH_SUPPORT_AR5312 */ 132