1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * HTC simple EGPIO irq and gpio extender |
4 | */ |
5 | |
6 | #ifndef __HTC_EGPIO_H__ |
7 | #define __HTC_EGPIO_H__ |
8 | |
9 | /* Descriptive values for all-in or all-out htc_egpio_chip descriptors. */ |
10 | #define HTC_EGPIO_OUTPUT (~0) |
11 | #define HTC_EGPIO_INPUT 0 |
12 | |
13 | /** |
14 | * struct htc_egpio_chip - descriptor to create gpio_chip for register range |
15 | * @reg_start: index of first register |
16 | * @gpio_base: gpio number of first pin in this register range |
17 | * @num_gpios: number of gpios in this register range, max BITS_PER_LONG |
18 | * (number of registers = DIV_ROUND_UP(num_gpios, reg_width)) |
19 | * @direction: bitfield, '0' = input, '1' = output, |
20 | */ |
21 | struct htc_egpio_chip { |
22 | int reg_start; |
23 | int gpio_base; |
24 | int num_gpios; |
25 | unsigned long direction; |
26 | unsigned long initial_values; |
27 | }; |
28 | |
29 | /** |
30 | * struct htc_egpio_platform_data - description provided by the arch |
31 | * @irq_base: beginning of available IRQs (eg, IRQ_BOARD_START) |
32 | * @num_irqs: number of irqs |
33 | * @reg_width: number of bits per register, either 8 or 16 bit |
34 | * @bus_width: alignment of the registers, either 16 or 32 bit |
35 | * @invert_acks: set if chip requires writing '0' to ack an irq, instead of '1' |
36 | * @ack_register: location of the irq/ack register |
37 | * @chip: pointer to array of htc_egpio_chip descriptors |
38 | * @num_chips: number of egpio chip descriptors |
39 | */ |
40 | struct htc_egpio_platform_data { |
41 | int bus_width; |
42 | int reg_width; |
43 | |
44 | int irq_base; |
45 | int num_irqs; |
46 | int invert_acks; |
47 | int ack_register; |
48 | |
49 | struct htc_egpio_chip *chip; |
50 | int num_chips; |
51 | }; |
52 | |
53 | #endif |
54 | |