1 // SPDX-License-Identifier: GPL-2.0-only
3 * GPIO driver for the ACCES PCI-IDIO-16
4 * Copyright (C) 2017 William Breathitt Gray
6 #include <linux/bits.h>
7 #include <linux/device.h>
8 #include <linux/errno.h>
9 #include <linux/gpio/driver.h>
10 #include <linux/interrupt.h>
11 #include <linux/irqdesc.h>
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/pci.h>
15 #include <linux/spinlock.h>
16 #include <linux/types.h>
18 #include "gpio-idio-16.h"
21 * struct idio_16_gpio - GPIO device private data structure
22 * @chip: instance of the gpio_chip
23 * @lock: synchronization lock to prevent I/O race conditions
24 * @reg: I/O address offset for the GPIO device registers
25 * @state: ACCES IDIO-16 device state
26 * @irq_mask: I/O bits affected by interrupts
29 struct gpio_chip chip;
31 struct idio_16 __iomem *reg;
32 struct idio_16_state state;
33 unsigned long irq_mask;
36 static int idio_16_gpio_get_direction(struct gpio_chip *chip,
39 if (idio_16_get_direction(offset))
40 return GPIO_LINE_DIRECTION_IN;
42 return GPIO_LINE_DIRECTION_OUT;
45 static int idio_16_gpio_direction_input(struct gpio_chip *chip,
51 static int idio_16_gpio_direction_output(struct gpio_chip *chip,
52 unsigned int offset, int value)
54 chip->set(chip, offset, value);
58 static int idio_16_gpio_get(struct gpio_chip *chip, unsigned int offset)
60 struct idio_16_gpio *const idio16gpio = gpiochip_get_data(chip);
62 return idio_16_get(idio16gpio->reg, &idio16gpio->state, offset);
65 static int idio_16_gpio_get_multiple(struct gpio_chip *chip,
66 unsigned long *mask, unsigned long *bits)
68 struct idio_16_gpio *const idio16gpio = gpiochip_get_data(chip);
70 idio_16_get_multiple(idio16gpio->reg, &idio16gpio->state, mask, bits);
74 static void idio_16_gpio_set(struct gpio_chip *chip, unsigned int offset,
77 struct idio_16_gpio *const idio16gpio = gpiochip_get_data(chip);
79 idio_16_set(idio16gpio->reg, &idio16gpio->state, offset, value);
82 static void idio_16_gpio_set_multiple(struct gpio_chip *chip,
83 unsigned long *mask, unsigned long *bits)
85 struct idio_16_gpio *const idio16gpio = gpiochip_get_data(chip);
87 idio_16_set_multiple(idio16gpio->reg, &idio16gpio->state, mask, bits);
90 static void idio_16_irq_ack(struct irq_data *data)
94 static void idio_16_irq_mask(struct irq_data *data)
96 struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
97 struct idio_16_gpio *const idio16gpio = gpiochip_get_data(chip);
98 const unsigned long mask = BIT(irqd_to_hwirq(data));
101 idio16gpio->irq_mask &= ~mask;
103 if (!idio16gpio->irq_mask) {
104 raw_spin_lock_irqsave(&idio16gpio->lock, flags);
106 iowrite8(0, &idio16gpio->reg->irq_ctl);
108 raw_spin_unlock_irqrestore(&idio16gpio->lock, flags);
112 static void idio_16_irq_unmask(struct irq_data *data)
114 struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
115 struct idio_16_gpio *const idio16gpio = gpiochip_get_data(chip);
116 const unsigned long mask = BIT(irqd_to_hwirq(data));
117 const unsigned long prev_irq_mask = idio16gpio->irq_mask;
120 idio16gpio->irq_mask |= mask;
122 if (!prev_irq_mask) {
123 raw_spin_lock_irqsave(&idio16gpio->lock, flags);
125 ioread8(&idio16gpio->reg->irq_ctl);
127 raw_spin_unlock_irqrestore(&idio16gpio->lock, flags);
131 static int idio_16_irq_set_type(struct irq_data *data, unsigned int flow_type)
133 /* The only valid irq types are none and both-edges */
134 if (flow_type != IRQ_TYPE_NONE &&
135 (flow_type & IRQ_TYPE_EDGE_BOTH) != IRQ_TYPE_EDGE_BOTH)
141 static struct irq_chip idio_16_irqchip = {
142 .name = "pci-idio-16",
143 .irq_ack = idio_16_irq_ack,
144 .irq_mask = idio_16_irq_mask,
145 .irq_unmask = idio_16_irq_unmask,
146 .irq_set_type = idio_16_irq_set_type
149 static irqreturn_t idio_16_irq_handler(int irq, void *dev_id)
151 struct idio_16_gpio *const idio16gpio = dev_id;
152 unsigned int irq_status;
153 struct gpio_chip *const chip = &idio16gpio->chip;
156 raw_spin_lock(&idio16gpio->lock);
158 irq_status = ioread8(&idio16gpio->reg->irq_status);
160 raw_spin_unlock(&idio16gpio->lock);
162 /* Make sure our device generated IRQ */
163 if (!(irq_status & 0x3) || !(irq_status & 0x4))
166 for_each_set_bit(gpio, &idio16gpio->irq_mask, chip->ngpio)
167 generic_handle_domain_irq(chip->irq.domain, gpio);
169 raw_spin_lock(&idio16gpio->lock);
171 /* Clear interrupt */
172 iowrite8(0, &idio16gpio->reg->in0_7);
174 raw_spin_unlock(&idio16gpio->lock);
179 #define IDIO_16_NGPIO 32
180 static const char *idio_16_names[IDIO_16_NGPIO] = {
181 "OUT0", "OUT1", "OUT2", "OUT3", "OUT4", "OUT5", "OUT6", "OUT7",
182 "OUT8", "OUT9", "OUT10", "OUT11", "OUT12", "OUT13", "OUT14", "OUT15",
183 "IIN0", "IIN1", "IIN2", "IIN3", "IIN4", "IIN5", "IIN6", "IIN7",
184 "IIN8", "IIN9", "IIN10", "IIN11", "IIN12", "IIN13", "IIN14", "IIN15"
187 static int idio_16_irq_init_hw(struct gpio_chip *gc)
189 struct idio_16_gpio *const idio16gpio = gpiochip_get_data(gc);
191 /* Disable IRQ by default and clear any pending interrupt */
192 iowrite8(0, &idio16gpio->reg->irq_ctl);
193 iowrite8(0, &idio16gpio->reg->in0_7);
198 static int idio_16_probe(struct pci_dev *pdev, const struct pci_device_id *id)
200 struct device *const dev = &pdev->dev;
201 struct idio_16_gpio *idio16gpio;
203 const size_t pci_bar_index = 2;
204 const char *const name = pci_name(pdev);
205 struct gpio_irq_chip *girq;
207 idio16gpio = devm_kzalloc(dev, sizeof(*idio16gpio), GFP_KERNEL);
211 err = pcim_enable_device(pdev);
213 dev_err(dev, "Failed to enable PCI device (%d)\n", err);
217 err = pcim_iomap_regions(pdev, BIT(pci_bar_index), name);
219 dev_err(dev, "Unable to map PCI I/O addresses (%d)\n", err);
223 idio16gpio->reg = pcim_iomap_table(pdev)[pci_bar_index];
225 /* Deactivate input filters */
226 iowrite8(0, &idio16gpio->reg->filter_ctl);
228 idio16gpio->chip.label = name;
229 idio16gpio->chip.parent = dev;
230 idio16gpio->chip.owner = THIS_MODULE;
231 idio16gpio->chip.base = -1;
232 idio16gpio->chip.ngpio = IDIO_16_NGPIO;
233 idio16gpio->chip.names = idio_16_names;
234 idio16gpio->chip.get_direction = idio_16_gpio_get_direction;
235 idio16gpio->chip.direction_input = idio_16_gpio_direction_input;
236 idio16gpio->chip.direction_output = idio_16_gpio_direction_output;
237 idio16gpio->chip.get = idio_16_gpio_get;
238 idio16gpio->chip.get_multiple = idio_16_gpio_get_multiple;
239 idio16gpio->chip.set = idio_16_gpio_set;
240 idio16gpio->chip.set_multiple = idio_16_gpio_set_multiple;
242 idio_16_state_init(&idio16gpio->state);
244 girq = &idio16gpio->chip.irq;
245 girq->chip = &idio_16_irqchip;
246 /* This will let us handle the parent IRQ in the driver */
247 girq->parent_handler = NULL;
248 girq->num_parents = 0;
249 girq->parents = NULL;
250 girq->default_type = IRQ_TYPE_NONE;
251 girq->handler = handle_edge_irq;
252 girq->init_hw = idio_16_irq_init_hw;
254 raw_spin_lock_init(&idio16gpio->lock);
256 err = devm_gpiochip_add_data(dev, &idio16gpio->chip, idio16gpio);
258 dev_err(dev, "GPIO registering failed (%d)\n", err);
262 err = devm_request_irq(dev, pdev->irq, idio_16_irq_handler, IRQF_SHARED,
265 dev_err(dev, "IRQ handler registering failed (%d)\n", err);
272 static const struct pci_device_id idio_16_pci_dev_id[] = {
273 { PCI_DEVICE(0x494F, 0x0DC8) }, { 0 }
275 MODULE_DEVICE_TABLE(pci, idio_16_pci_dev_id);
277 static struct pci_driver idio_16_driver = {
278 .name = "pci-idio-16",
279 .id_table = idio_16_pci_dev_id,
280 .probe = idio_16_probe
283 module_pci_driver(idio_16_driver);
286 MODULE_DESCRIPTION("ACCES PCI-IDIO-16 GPIO driver");
287 MODULE_LICENSE("GPL v2");
288 MODULE_IMPORT_NS(GPIO_IDIO_16);