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: ar5212_gpio.c,v 1.2 2011/03/07 11:25:43 cegger Exp $ 18 1.1 alc */ 19 1.1 alc #include "opt_ah.h" 20 1.1 alc 21 1.1 alc #include "ah.h" 22 1.1 alc #include "ah_internal.h" 23 1.1 alc #include "ah_devid.h" 24 1.1 alc #ifdef AH_DEBUG 25 1.1 alc #include "ah_desc.h" /* NB: for HAL_PHYERR* */ 26 1.1 alc #endif 27 1.1 alc 28 1.1 alc #include "ar5212/ar5212.h" 29 1.1 alc #include "ar5212/ar5212reg.h" 30 1.1 alc #include "ar5212/ar5212phy.h" 31 1.1 alc 32 1.1 alc #define AR_NUM_GPIO 6 /* 6 GPIO pins */ 33 1.1 alc #define AR_GPIOD_MASK 0x0000002F /* GPIO data reg r/w mask */ 34 1.1 alc 35 1.1 alc /* 36 1.1 alc * Configure GPIO Output lines 37 1.1 alc */ 38 1.1 alc HAL_BOOL 39 1.2 cegger ar5212GpioCfgOutput(struct ath_hal *ah, uint32_t gpio, HAL_GPIO_MUX_TYPE type) 40 1.1 alc { 41 1.1 alc HALASSERT(gpio < AR_NUM_GPIO); 42 1.1 alc 43 1.1 alc /* 44 1.1 alc * NB: AR_GPIOCR_CR_A(pin) is all 1's so there's no need 45 1.1 alc * to clear the field before or'ing in the new value. 46 1.1 alc */ 47 1.1 alc OS_REG_WRITE(ah, AR_GPIOCR, 48 1.1 alc OS_REG_READ(ah, AR_GPIOCR) | AR_GPIOCR_CR_A(gpio)); 49 1.1 alc 50 1.1 alc return AH_TRUE; 51 1.1 alc } 52 1.1 alc 53 1.1 alc /* 54 1.1 alc * Configure GPIO Input lines 55 1.1 alc */ 56 1.1 alc HAL_BOOL 57 1.1 alc ar5212GpioCfgInput(struct ath_hal *ah, uint32_t gpio) 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, AR_GPIOCR, 62 1.1 alc (OS_REG_READ(ah, AR_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 ar5212GpioSet(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 76 1.1 alc HALASSERT(gpio < AR_NUM_GPIO); 77 1.1 alc 78 1.1 alc reg = OS_REG_READ(ah, AR_GPIODO); 79 1.1 alc reg &= ~(1 << gpio); 80 1.1 alc reg |= (val&1) << gpio; 81 1.1 alc 82 1.1 alc OS_REG_WRITE(ah, AR_GPIODO, reg); 83 1.1 alc return AH_TRUE; 84 1.1 alc } 85 1.1 alc 86 1.1 alc /* 87 1.1 alc * Once configured for I/O - get input lines 88 1.1 alc */ 89 1.1 alc uint32_t 90 1.1 alc ar5212GpioGet(struct ath_hal *ah, uint32_t gpio) 91 1.1 alc { 92 1.1 alc if (gpio < AR_NUM_GPIO) { 93 1.1 alc uint32_t val = OS_REG_READ(ah, AR_GPIODI); 94 1.1 alc val = ((val & AR_GPIOD_MASK) >> gpio) & 0x1; 95 1.1 alc return val; 96 1.1 alc } else { 97 1.1 alc return 0xffffffff; 98 1.1 alc } 99 1.1 alc } 100 1.1 alc 101 1.1 alc /* 102 1.1 alc * Set the GPIO Interrupt 103 1.1 alc */ 104 1.1 alc void 105 1.1 alc ar5212GpioSetIntr(struct ath_hal *ah, u_int gpio, uint32_t ilevel) 106 1.1 alc { 107 1.1 alc uint32_t val; 108 1.1 alc 109 1.1 alc /* XXX bounds check gpio */ 110 1.1 alc val = OS_REG_READ(ah, AR_GPIOCR); 111 1.1 alc val &= ~(AR_GPIOCR_CR_A(gpio) | 112 1.1 alc AR_GPIOCR_INT_MASK | AR_GPIOCR_INT_ENA | AR_GPIOCR_INT_SEL); 113 1.1 alc val |= AR_GPIOCR_CR_N(gpio) | AR_GPIOCR_INT(gpio) | AR_GPIOCR_INT_ENA; 114 1.1 alc if (ilevel) 115 1.1 alc val |= AR_GPIOCR_INT_SELH; /* interrupt on pin high */ 116 1.1 alc else 117 1.1 alc val |= AR_GPIOCR_INT_SELL; /* interrupt on pin low */ 118 1.1 alc 119 1.1 alc /* Don't need to change anything for low level interrupt. */ 120 1.1 alc OS_REG_WRITE(ah, AR_GPIOCR, val); 121 1.1 alc 122 1.1 alc /* Change the interrupt mask. */ 123 1.1 alc (void) ar5212SetInterrupts(ah, AH5212(ah)->ah_maskReg | HAL_INT_GPIO); 124 1.1 alc } 125