66 * This driver supports the following ACCES devices: 104-IDIO-16,
77 * 104-IDIO-16E, 104-IDO-16, 104-IDIO-8, 104-IDIO-8E, and 104-IDO-8.
88 */
9- #include <linux/bitops .h>
9+ #include <linux/bits .h>
1010#include <linux/device.h>
1111#include <linux/errno.h>
1212#include <linux/gpio/driver.h>
1919#include <linux/module.h>
2020#include <linux/moduleparam.h>
2121#include <linux/spinlock.h>
22+ #include <linux/types.h>
2223
2324#define IDIO_16_EXTENT 8
2425#define MAX_NUM_IDIO_16 max_num_isa_dev(IDIO_16_EXTENT)
@@ -32,19 +33,42 @@ static unsigned int irq[MAX_NUM_IDIO_16];
3233module_param_hw_array (irq , uint , irq , NULL , 0 );
3334MODULE_PARM_DESC (irq , "ACCES 104-IDIO-16 interrupt line numbers" );
3435
36+ /**
37+ * struct idio_16_reg - device registers structure
38+ * @out0_7: Read: N/A
39+ * Write: FET Drive Outputs 0-7
40+ * @in0_7: Read: Isolated Inputs 0-7
41+ * Write: Clear Interrupt
42+ * @irq_ctl: Read: Enable IRQ
43+ * Write: Disable IRQ
44+ * @unused: N/A
45+ * @out8_15: Read: N/A
46+ * Write: FET Drive Outputs 8-15
47+ * @in8_15: Read: Isolated Inputs 8-15
48+ * Write: N/A
49+ */
50+ struct idio_16_reg {
51+ u8 out0_7 ;
52+ u8 in0_7 ;
53+ u8 irq_ctl ;
54+ u8 unused ;
55+ u8 out8_15 ;
56+ u8 in8_15 ;
57+ };
58+
3559/**
3660 * struct idio_16_gpio - GPIO device private data structure
3761 * @chip: instance of the gpio_chip
3862 * @lock: synchronization lock to prevent I/O race conditions
3963 * @irq_mask: I/O bits affected by interrupts
40- * @base: base port address of the GPIO device
64+ * @reg: I/O address offset for the device registers
4165 * @out_state: output bits state
4266 */
4367struct idio_16_gpio {
4468 struct gpio_chip chip ;
4569 raw_spinlock_t lock ;
4670 unsigned long irq_mask ;
47- void __iomem * base ;
71+ struct idio_16_reg __iomem * reg ;
4872 unsigned int out_state ;
4973};
5074
@@ -79,9 +103,9 @@ static int idio_16_gpio_get(struct gpio_chip *chip, unsigned int offset)
79103 return - EINVAL ;
80104
81105 if (offset < 24 )
82- return !!(ioread8 (idio16gpio -> base + 1 ) & mask );
106+ return !!(ioread8 (& idio16gpio -> reg -> in0_7 ) & mask );
83107
84- return !!(ioread8 (idio16gpio -> base + 5 ) & (mask >>8 ));
108+ return !!(ioread8 (& idio16gpio -> reg -> in8_15 ) & (mask >>8 ));
85109}
86110
87111static int idio_16_gpio_get_multiple (struct gpio_chip * chip ,
@@ -91,9 +115,9 @@ static int idio_16_gpio_get_multiple(struct gpio_chip *chip,
91115
92116 * bits = 0 ;
93117 if (* mask & GENMASK (23 , 16 ))
94- * bits |= (unsigned long )ioread8 (idio16gpio -> base + 1 ) << 16 ;
118+ * bits |= (unsigned long )ioread8 (& idio16gpio -> reg -> in0_7 ) << 16 ;
95119 if (* mask & GENMASK (31 , 24 ))
96- * bits |= (unsigned long )ioread8 (idio16gpio -> base + 5 ) << 24 ;
120+ * bits |= (unsigned long )ioread8 (& idio16gpio -> reg -> in8_15 ) << 24 ;
97121
98122 return 0 ;
99123}
@@ -116,9 +140,9 @@ static void idio_16_gpio_set(struct gpio_chip *chip, unsigned int offset,
116140 idio16gpio -> out_state &= ~mask ;
117141
118142 if (offset > 7 )
119- iowrite8 (idio16gpio -> out_state >> 8 , idio16gpio -> base + 4 );
143+ iowrite8 (idio16gpio -> out_state >> 8 , & idio16gpio -> reg -> out8_15 );
120144 else
121- iowrite8 (idio16gpio -> out_state , idio16gpio -> base );
145+ iowrite8 (idio16gpio -> out_state , & idio16gpio -> reg -> out0_7 );
122146
123147 raw_spin_unlock_irqrestore (& idio16gpio -> lock , flags );
124148}
@@ -135,9 +159,9 @@ static void idio_16_gpio_set_multiple(struct gpio_chip *chip,
135159 idio16gpio -> out_state |= * mask & * bits ;
136160
137161 if (* mask & 0xFF )
138- iowrite8 (idio16gpio -> out_state , idio16gpio -> base );
162+ iowrite8 (idio16gpio -> out_state , & idio16gpio -> reg -> out0_7 );
139163 if ((* mask >> 8 ) & 0xFF )
140- iowrite8 (idio16gpio -> out_state >> 8 , idio16gpio -> base + 4 );
164+ iowrite8 (idio16gpio -> out_state >> 8 , & idio16gpio -> reg -> out8_15 );
141165
142166 raw_spin_unlock_irqrestore (& idio16gpio -> lock , flags );
143167}
@@ -158,7 +182,7 @@ static void idio_16_irq_mask(struct irq_data *data)
158182 if (!idio16gpio -> irq_mask ) {
159183 raw_spin_lock_irqsave (& idio16gpio -> lock , flags );
160184
161- iowrite8 (0 , idio16gpio -> base + 2 );
185+ iowrite8 (0 , & idio16gpio -> reg -> irq_ctl );
162186
163187 raw_spin_unlock_irqrestore (& idio16gpio -> lock , flags );
164188 }
@@ -177,7 +201,7 @@ static void idio_16_irq_unmask(struct irq_data *data)
177201 if (!prev_irq_mask ) {
178202 raw_spin_lock_irqsave (& idio16gpio -> lock , flags );
179203
180- ioread8 (idio16gpio -> base + 2 );
204+ ioread8 (& idio16gpio -> reg -> irq_ctl );
181205
182206 raw_spin_unlock_irqrestore (& idio16gpio -> lock , flags );
183207 }
@@ -212,7 +236,7 @@ static irqreturn_t idio_16_irq_handler(int irq, void *dev_id)
212236
213237 raw_spin_lock (& idio16gpio -> lock );
214238
215- iowrite8 (0 , idio16gpio -> base + 1 );
239+ iowrite8 (0 , & idio16gpio -> reg -> in0_7 );
216240
217241 raw_spin_unlock (& idio16gpio -> lock );
218242
@@ -232,8 +256,8 @@ static int idio_16_irq_init_hw(struct gpio_chip *gc)
232256 struct idio_16_gpio * const idio16gpio = gpiochip_get_data (gc );
233257
234258 /* Disable IRQ by default */
235- iowrite8 (0 , idio16gpio -> base + 2 );
236- iowrite8 (0 , idio16gpio -> base + 1 );
259+ iowrite8 (0 , & idio16gpio -> reg -> irq_ctl );
260+ iowrite8 (0 , & idio16gpio -> reg -> in0_7 );
237261
238262 return 0 ;
239263}
@@ -255,8 +279,8 @@ static int idio_16_probe(struct device *dev, unsigned int id)
255279 return - EBUSY ;
256280 }
257281
258- idio16gpio -> base = devm_ioport_map (dev , base [id ], IDIO_16_EXTENT );
259- if (!idio16gpio -> base )
282+ idio16gpio -> reg = devm_ioport_map (dev , base [id ], IDIO_16_EXTENT );
283+ if (!idio16gpio -> reg )
260284 return - ENOMEM ;
261285
262286 idio16gpio -> chip .label = name ;
0 commit comments