Merge tag 'x86-urgent-2022-08-06' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / gpio / gpio-i8255.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright 2022 William Breathitt Gray */
3 #ifndef _I8255_H_
4 #define _I8255_H_
5
6 #include <linux/spinlock.h>
7 #include <linux/types.h>
8
9 /**
10  * struct i8255 - Intel 8255 register structure
11  * @port:       Port A, B, and C
12  * @control:    Control register
13  */
14 struct i8255 {
15         u8 port[3];
16         u8 control;
17 };
18
19 /**
20  * struct i8255_state - Intel 8255 state structure
21  * @lock:               synchronization lock for accessing device state
22  * @control_state:      Control register state
23  */
24 struct i8255_state {
25         spinlock_t lock;
26         u8 control_state;
27 };
28
29 void i8255_direction_input(struct i8255 __iomem *ppi, struct i8255_state *state,
30                            unsigned long offset);
31 void i8255_direction_output(struct i8255 __iomem *ppi,
32                             struct i8255_state *state, unsigned long offset,
33                             unsigned long value);
34 int i8255_get(struct i8255 __iomem *ppi, unsigned long offset);
35 int i8255_get_direction(const struct i8255_state *state, unsigned long offset);
36 void i8255_get_multiple(struct i8255 __iomem *ppi, const unsigned long *mask,
37                         unsigned long *bits, unsigned long ngpio);
38 void i8255_mode0_output(struct i8255 __iomem *const ppi);
39 void i8255_set(struct i8255 __iomem *ppi, struct i8255_state *state,
40                unsigned long offset, unsigned long value);
41 void i8255_set_multiple(struct i8255 __iomem *ppi, struct i8255_state *state,
42                         const unsigned long *mask, const unsigned long *bits,
43                         unsigned long ngpio);
44 void i8255_state_init(struct i8255_state *const state, unsigned long nbanks);
45
46 #endif /* _I8255_H_ */