/* SPDX-License-Identifier: GPL-2.0 */ /* Copyright 2022 William Breathitt Gray */ #ifndef _IDIO_16_H_ #define _IDIO_16_H_ #include #include /** * struct idio_16 - IDIO-16 registers structure * @out0_7: Read: FET Drive Outputs 0-7 * Write: FET Drive Outputs 0-7 * @in0_7: Read: Isolated Inputs 0-7 * Write: Clear Interrupt * @irq_ctl: Read: Enable IRQ * Write: Disable IRQ * @filter_ctl: Read: Activate Input Filters 0-15 * Write: Deactivate Input Filters 0-15 * @out8_15: Read: FET Drive Outputs 8-15 * Write: FET Drive Outputs 8-15 * @in8_15: Read: Isolated Inputs 8-15 * Write: Unused * @irq_status: Read: Interrupt status * Write: Unused */ struct idio_16 { u8 out0_7; u8 in0_7; u8 irq_ctl; u8 filter_ctl; u8 out8_15; u8 in8_15; u8 irq_status; }; #define IDIO_16_NOUT 16 /** * struct idio_16_state - IDIO-16 state structure * @lock: synchronization lock for accessing device state * @out_state: output signals state */ struct idio_16_state { spinlock_t lock; DECLARE_BITMAP(out_state, IDIO_16_NOUT); }; /** * idio_16_get_direction - get the I/O direction for a signal offset * @offset: offset of signal to get direction * * Returns the signal direction (0=output, 1=input) for the signal at @offset. */ static inline int idio_16_get_direction(const unsigned long offset) { return (offset >= IDIO_16_NOUT) ? 1 : 0; } int idio_16_get(struct idio_16 __iomem *reg, struct idio_16_state *state, unsigned long offset); void idio_16_get_multiple(struct idio_16 __iomem *reg, struct idio_16_state *state, const unsigned long *mask, unsigned long *bits); void idio_16_set(struct idio_16 __iomem *reg, struct idio_16_state *state, unsigned long offset, unsigned long value); void idio_16_set_multiple(struct idio_16 __iomem *reg, struct idio_16_state *state, const unsigned long *mask, const unsigned long *bits); void idio_16_state_init(struct idio_16_state *state); #endif /* _IDIO_16_H_ */