• Home
  • Raw
  • Download

Lines Matching +full:48 +full:- +full:bit

2  * GPIO driver for the ACCES 104-IDI-48 family
14 * This driver supports the following ACCES devices: 104-IDI-48A,
15 * 104-IDI-48AC, 104-IDI-48B, and 104-IDI-48BC.
38 MODULE_PARM_DESC(base, "ACCES 104-IDI-48 base addresses");
42 MODULE_PARM_DESC(irq, "ACCES 104-IDI-48 interrupt line numbers");
45 * struct idi_48_gpio - GPIO device private data structure
51 * @cos_enb: Change-Of-State IRQ enable boundaries mask
80 for (i = 0; i < 48; i += 8) in idi_48_gpio_get()
83 mask = BIT(offset - i); in idi_48_gpio_get()
85 return !!(inb(idi48gpio->base + base_offset) & mask); in idi_48_gpio_get()
88 /* The following line should never execute since offset < 48 */ in idi_48_gpio_get()
103 const unsigned long port_mask = GENMASK(gpio_reg_size - 1, 0); in idi_48_gpio_get_multiple()
107 bitmap_zero(bits, chip->ngpio); in idi_48_gpio_get_multiple()
128 port_state = inb(idi48gpio->base + ports[i]); in idi_48_gpio_get_multiple()
151 for (i = 0; i < 48; i += 8) in idi_48_irq_mask()
153 mask = BIT(offset - i); in idi_48_irq_mask()
156 idi48gpio->irq_mask[boundary] &= ~mask; in idi_48_irq_mask()
158 if (!idi48gpio->irq_mask[boundary]) { in idi_48_irq_mask()
159 idi48gpio->cos_enb &= ~BIT(boundary); in idi_48_irq_mask()
161 raw_spin_lock_irqsave(&idi48gpio->lock, flags); in idi_48_irq_mask()
163 outb(idi48gpio->cos_enb, idi48gpio->base + 7); in idi_48_irq_mask()
165 raw_spin_unlock_irqrestore(&idi48gpio->lock, in idi_48_irq_mask()
184 for (i = 0; i < 48; i += 8) in idi_48_irq_unmask()
186 mask = BIT(offset - i); in idi_48_irq_unmask()
188 prev_irq_mask = idi48gpio->irq_mask[boundary]; in idi_48_irq_unmask()
190 idi48gpio->irq_mask[boundary] |= mask; in idi_48_irq_unmask()
193 idi48gpio->cos_enb |= BIT(boundary); in idi_48_irq_unmask()
195 raw_spin_lock_irqsave(&idi48gpio->lock, flags); in idi_48_irq_unmask()
197 outb(idi48gpio->cos_enb, idi48gpio->base + 7); in idi_48_irq_unmask()
199 raw_spin_unlock_irqrestore(&idi48gpio->lock, in idi_48_irq_unmask()
209 /* The only valid irq types are none and both-edges */ in idi_48_irq_set_type()
212 return -EINVAL; in idi_48_irq_set_type()
218 .name = "104-idi-48",
233 struct gpio_chip *const chip = &idi48gpio->chip; in idi_48_irq_handler()
235 spin_lock(&idi48gpio->ack_lock); in idi_48_irq_handler()
237 raw_spin_lock(&idi48gpio->lock); in idi_48_irq_handler()
239 cos_status = inb(idi48gpio->base + 7); in idi_48_irq_handler()
241 raw_spin_unlock(&idi48gpio->lock); in idi_48_irq_handler()
243 /* IRQ Status (bit 6) is active low (0 = IRQ generated by device) */ in idi_48_irq_handler()
244 if (cos_status & BIT(6)) { in idi_48_irq_handler()
245 spin_unlock(&idi48gpio->ack_lock); in idi_48_irq_handler()
249 /* Bit 0-5 indicate which Change-Of-State boundary triggered the IRQ */ in idi_48_irq_handler()
253 irq_mask = idi48gpio->irq_mask[boundary]; in idi_48_irq_handler()
258 generic_handle_irq(irq_find_mapping(chip->irq.domain, in idi_48_irq_handler()
263 spin_unlock(&idi48gpio->ack_lock); in idi_48_irq_handler()
268 #define IDI48_NGPIO 48
270 "Bit 0 A", "Bit 1 A", "Bit 2 A", "Bit 3 A", "Bit 4 A", "Bit 5 A",
271 "Bit 6 A", "Bit 7 A", "Bit 8 A", "Bit 9 A", "Bit 10 A", "Bit 11 A",
272 "Bit 12 A", "Bit 13 A", "Bit 14 A", "Bit 15 A", "Bit 16 A", "Bit 17 A",
273 "Bit 18 A", "Bit 19 A", "Bit 20 A", "Bit 21 A", "Bit 22 A", "Bit 23 A",
274 "Bit 0 B", "Bit 1 B", "Bit 2 B", "Bit 3 B", "Bit 4 B", "Bit 5 B",
275 "Bit 6 B", "Bit 7 B", "Bit 8 B", "Bit 9 B", "Bit 10 B", "Bit 11 B",
276 "Bit 12 B", "Bit 13 B", "Bit 14 B", "Bit 15 B", "Bit 16 B", "Bit 17 B",
277 "Bit 18 B", "Bit 19 B", "Bit 20 B", "Bit 21 B", "Bit 22 B", "Bit 23 B"
288 return -ENOMEM; in idi_48_probe()
291 dev_err(dev, "Unable to lock port addresses (0x%X-0x%X)\n", in idi_48_probe()
293 return -EBUSY; in idi_48_probe()
296 idi48gpio->chip.label = name; in idi_48_probe()
297 idi48gpio->chip.parent = dev; in idi_48_probe()
298 idi48gpio->chip.owner = THIS_MODULE; in idi_48_probe()
299 idi48gpio->chip.base = -1; in idi_48_probe()
300 idi48gpio->chip.ngpio = IDI48_NGPIO; in idi_48_probe()
301 idi48gpio->chip.names = idi48_names; in idi_48_probe()
302 idi48gpio->chip.get_direction = idi_48_gpio_get_direction; in idi_48_probe()
303 idi48gpio->chip.direction_input = idi_48_gpio_direction_input; in idi_48_probe()
304 idi48gpio->chip.get = idi_48_gpio_get; in idi_48_probe()
305 idi48gpio->chip.get_multiple = idi_48_gpio_get_multiple; in idi_48_probe()
306 idi48gpio->base = base[id]; in idi_48_probe()
308 raw_spin_lock_init(&idi48gpio->lock); in idi_48_probe()
309 spin_lock_init(&idi48gpio->ack_lock); in idi_48_probe()
311 err = devm_gpiochip_add_data(dev, &idi48gpio->chip, idi48gpio); in idi_48_probe()
321 err = gpiochip_irqchip_add(&idi48gpio->chip, &idi_48_irqchip, 0, in idi_48_probe()
341 .name = "104-idi-48"
347 MODULE_DESCRIPTION("ACCES 104-IDI-48 GPIO driver");