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_ */ 47