Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
gpio.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2004-2008 Reyk Floeter <[email protected]>
3  * Copyright (c) 2006-2008 Nick Kossifidis <[email protected]>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  *
17  */
18 
19 /****************\
20  GPIO Functions
21 \****************/
22 
23 #include "ath5k.h"
24 #include "reg.h"
25 #include "debug.h"
26 
27 
52 void
53 ath5k_hw_set_ledstate(struct ath5k_hw *ah, unsigned int state)
54 {
55  u32 led;
56  /*5210 has different led mode handling*/
57  u32 led_5210;
58 
59  /*Reset led status*/
60  if (ah->ah_version != AR5K_AR5210)
63  else
65 
66  /*
67  * Some blinking values, define at your wish
68  */
69  switch (state) {
70  case AR5K_LED_SCAN:
71  case AR5K_LED_AUTH:
74  break;
75 
76  case AR5K_LED_INIT:
78  led_5210 = AR5K_PCICFG_LED_PEND;
79  break;
80 
81  case AR5K_LED_ASSOC:
82  case AR5K_LED_RUN:
84  led_5210 = AR5K_PCICFG_LED_ASSOC;
85  break;
86 
87  default:
89  led_5210 = AR5K_PCICFG_LED_PEND;
90  break;
91  }
92 
93  /*Write new status to the register*/
94  if (ah->ah_version != AR5K_AR5210)
96  else
97  AR5K_REG_ENABLE_BITS(ah, AR5K_PCICFG, led_5210);
98 }
99 
105 int
107 {
108  if (gpio >= AR5K_NUM_GPIO)
109  return -EINVAL;
110 
111  ath5k_hw_reg_write(ah,
112  (ath5k_hw_reg_read(ah, AR5K_GPIOCR) & ~AR5K_GPIOCR_OUT(gpio))
113  | AR5K_GPIOCR_IN(gpio), AR5K_GPIOCR);
114 
115  return 0;
116 }
117 
123 int
125 {
126  if (gpio >= AR5K_NUM_GPIO)
127  return -EINVAL;
128 
129  ath5k_hw_reg_write(ah,
130  (ath5k_hw_reg_read(ah, AR5K_GPIOCR) & ~AR5K_GPIOCR_OUT(gpio))
131  | AR5K_GPIOCR_OUT(gpio), AR5K_GPIOCR);
132 
133  return 0;
134 }
135 
141 u32
143 {
144  if (gpio >= AR5K_NUM_GPIO)
145  return 0xffffffff;
146 
147  /* GPIO input magic */
148  return ((ath5k_hw_reg_read(ah, AR5K_GPIODI) & AR5K_GPIODI_M) >> gpio) &
149  0x1;
150 }
151 
158 int
160 {
161  u32 data;
162 
163  if (gpio >= AR5K_NUM_GPIO)
164  return -EINVAL;
165 
166  /* GPIO output magic */
167  data = ath5k_hw_reg_read(ah, AR5K_GPIODO);
168 
169  data &= ~(1 << gpio);
170  data |= (val & 1) << gpio;
171 
172  ath5k_hw_reg_write(ah, data, AR5K_GPIODO);
173 
174  return 0;
175 }
176 
188 void
189 ath5k_hw_set_gpio_intr(struct ath5k_hw *ah, unsigned int gpio,
190  u32 interrupt_level)
191 {
192  u32 data;
193 
194  if (gpio >= AR5K_NUM_GPIO)
195  return;
196 
197  /*
198  * Set the GPIO interrupt
199  */
200  data = (ath5k_hw_reg_read(ah, AR5K_GPIOCR) &
204 
205  ath5k_hw_reg_write(ah, interrupt_level ? data :
207 
208  ah->ah_imr |= AR5K_IMR_GPIO;
209 
210  /* Enable GPIO interrupts */
212 }
213