diff options
author | Philipp Zabel <philipp.zabel@gmail.com> | 2008-04-09 14:20:34 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-04-19 06:29:07 -0400 |
commit | a1635b8fe59de2c5223cda5ca8397b875c901904 (patch) | |
tree | 047db24bdba7da410937e1f8da821d30e9052a9f /include/linux/mfd | |
parent | e6816f34e4ee237fc1b54e0357e9ea31462ad411 (diff) |
[ARM] 4947/1: htc-egpio, a driver for GPIO/IRQ expanders with fixed input/output pins
implemented in CPLD chips on several HTC devices.
The original driver was written by Kevin O'Connor, I have adapted it to
use gpiolib and made the bus/register widths configurable.
Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'include/linux/mfd')
-rw-r--r-- | include/linux/mfd/htc-egpio.h | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/include/linux/mfd/htc-egpio.h b/include/linux/mfd/htc-egpio.h new file mode 100644 index 000000000000..b4201c971367 --- /dev/null +++ b/include/linux/mfd/htc-egpio.h | |||
@@ -0,0 +1,57 @@ | |||
1 | /* | ||
2 | * HTC simple EGPIO irq and gpio extender | ||
3 | */ | ||
4 | |||
5 | #ifndef __HTC_EGPIO_H__ | ||
6 | #define __HTC_EGPIO_H__ | ||
7 | |||
8 | #include <linux/gpio.h> | ||
9 | |||
10 | /* Descriptive values for all-in or all-out htc_egpio_chip descriptors. */ | ||
11 | #define HTC_EGPIO_OUTPUT (~0) | ||
12 | #define HTC_EGPIO_INPUT 0 | ||
13 | |||
14 | /** | ||
15 | * struct htc_egpio_chip - descriptor to create gpio_chip for register range | ||
16 | * @reg_start: index of first register | ||
17 | * @gpio_base: gpio number of first pin in this register range | ||
18 | * @num_gpios: number of gpios in this register range, max BITS_PER_LONG | ||
19 | * (number of registers = DIV_ROUND_UP(num_gpios, reg_width)) | ||
20 | * @direction: bitfield, '0' = input, '1' = output, | ||
21 | */ | ||
22 | struct htc_egpio_chip { | ||
23 | int reg_start; | ||
24 | int gpio_base; | ||
25 | int num_gpios; | ||
26 | unsigned long direction; | ||
27 | unsigned long initial_values; | ||
28 | }; | ||
29 | |||
30 | /** | ||
31 | * struct htc_egpio_platform_data - description provided by the arch | ||
32 | * @irq_base: beginning of available IRQs (eg, IRQ_BOARD_START) | ||
33 | * @num_irqs: number of irqs | ||
34 | * @reg_width: number of bits per register, either 8 or 16 bit | ||
35 | * @bus_width: alignment of the registers, either 16 or 32 bit | ||
36 | * @invert_acks: set if chip requires writing '0' to ack an irq, instead of '1' | ||
37 | * @ack_register: location of the irq/ack register | ||
38 | * @chip: pointer to array of htc_egpio_chip descriptors | ||
39 | * @num_chips: number of egpio chip descriptors | ||
40 | */ | ||
41 | struct htc_egpio_platform_data { | ||
42 | int bus_width; | ||
43 | int reg_width; | ||
44 | |||
45 | int irq_base; | ||
46 | int num_irqs; | ||
47 | int invert_acks; | ||
48 | int ack_register; | ||
49 | |||
50 | struct htc_egpio_chip *chip; | ||
51 | int num_chips; | ||
52 | }; | ||
53 | |||
54 | /* Determine the wakeup irq, to be called during early resume */ | ||
55 | extern int htc_egpio_get_wakeup_irq(struct device *dev); | ||
56 | |||
57 | #endif | ||