]>
git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - drivers/net/wireless/ath/ath5k/gpio.c
2 * Copyright (c) 2004-2008 Reyk Floeter <reyk@openbsd.org>
3 * Copyright (c) 2006-2008 Nick Kossifidis <mickflemm@gmail.com>
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.
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.
30 void ath5k_hw_set_ledstate(struct ath5k_hw
*ah
, unsigned int state
)
33 /*5210 has different led mode handling*/
37 if (ah
->ah_version
!= AR5K_AR5210
)
38 AR5K_REG_DISABLE_BITS(ah
, AR5K_PCICFG
,
39 AR5K_PCICFG_LEDMODE
| AR5K_PCICFG_LED
);
41 AR5K_REG_DISABLE_BITS(ah
, AR5K_PCICFG
, AR5K_PCICFG_LED
);
44 * Some blinking values, define at your wish
49 led
= AR5K_PCICFG_LEDMODE_PROP
| AR5K_PCICFG_LED_PEND
;
50 led_5210
= AR5K_PCICFG_LED_PEND
| AR5K_PCICFG_LED_BCTL
;
54 led
= AR5K_PCICFG_LEDMODE_PROP
| AR5K_PCICFG_LED_NONE
;
55 led_5210
= AR5K_PCICFG_LED_PEND
;
60 led
= AR5K_PCICFG_LEDMODE_PROP
| AR5K_PCICFG_LED_ASSOC
;
61 led_5210
= AR5K_PCICFG_LED_ASSOC
;
65 led
= AR5K_PCICFG_LEDMODE_PROM
| AR5K_PCICFG_LED_NONE
;
66 led_5210
= AR5K_PCICFG_LED_PEND
;
70 /*Write new status to the register*/
71 if (ah
->ah_version
!= AR5K_AR5210
)
72 AR5K_REG_ENABLE_BITS(ah
, AR5K_PCICFG
, led
);
74 AR5K_REG_ENABLE_BITS(ah
, AR5K_PCICFG
, led_5210
);
80 int ath5k_hw_set_gpio_input(struct ath5k_hw
*ah
, u32 gpio
)
82 if (gpio
>= AR5K_NUM_GPIO
)
85 ath5k_hw_reg_write(ah
,
86 (ath5k_hw_reg_read(ah
, AR5K_GPIOCR
) & ~AR5K_GPIOCR_OUT(gpio
))
87 | AR5K_GPIOCR_IN(gpio
), AR5K_GPIOCR
);
95 int ath5k_hw_set_gpio_output(struct ath5k_hw
*ah
, u32 gpio
)
97 if (gpio
>= AR5K_NUM_GPIO
)
100 ath5k_hw_reg_write(ah
,
101 (ath5k_hw_reg_read(ah
, AR5K_GPIOCR
) & ~AR5K_GPIOCR_OUT(gpio
))
102 | AR5K_GPIOCR_OUT(gpio
), AR5K_GPIOCR
);
110 u32
ath5k_hw_get_gpio(struct ath5k_hw
*ah
, u32 gpio
)
112 if (gpio
>= AR5K_NUM_GPIO
)
115 /* GPIO input magic */
116 return ((ath5k_hw_reg_read(ah
, AR5K_GPIODI
) & AR5K_GPIODI_M
) >> gpio
) &
123 int ath5k_hw_set_gpio(struct ath5k_hw
*ah
, u32 gpio
, u32 val
)
127 if (gpio
>= AR5K_NUM_GPIO
)
130 /* GPIO output magic */
131 data
= ath5k_hw_reg_read(ah
, AR5K_GPIODO
);
133 data
&= ~(1 << gpio
);
134 data
|= (val
& 1) << gpio
;
136 ath5k_hw_reg_write(ah
, data
, AR5K_GPIODO
);
142 * Initialize the GPIO interrupt (RFKill switch)
144 void ath5k_hw_set_gpio_intr(struct ath5k_hw
*ah
, unsigned int gpio
,
149 if (gpio
>= AR5K_NUM_GPIO
)
153 * Set the GPIO interrupt
155 data
= (ath5k_hw_reg_read(ah
, AR5K_GPIOCR
) &
156 ~(AR5K_GPIOCR_INT_SEL(gpio
) | AR5K_GPIOCR_INT_SELH
|
157 AR5K_GPIOCR_INT_ENA
| AR5K_GPIOCR_OUT(gpio
))) |
158 (AR5K_GPIOCR_INT_SEL(gpio
) | AR5K_GPIOCR_INT_ENA
);
160 ath5k_hw_reg_write(ah
, interrupt_level
? data
:
161 (data
| AR5K_GPIOCR_INT_SELH
), AR5K_GPIOCR
);
163 ah
->ah_imr
|= AR5K_IMR_GPIO
;
165 /* Enable GPIO interrupts */
166 AR5K_REG_ENABLE_BITS(ah
, AR5K_PIMR
, AR5K_IMR_GPIO
);