Lines Matching +full:interrupt +full:- +full:map +full:- +full:mask
16 #include <linux/interrupt.h>
24 struct regmap *map; member
39 return &data->chip->irqs[irq - data->irq_base]; in irq_to_regmap_irq()
46 mutex_lock(&d->lock); in regmap_irq_lock()
55 * If there's been a change in the mask write it back to the in regmap_irq_sync_unlock()
59 for (i = 0; i < d->chip->num_regs; i++) { in regmap_irq_sync_unlock()
60 ret = regmap_update_bits(d->map, d->chip->mask_base + i, in regmap_irq_sync_unlock()
61 d->mask_buf_def[i], d->mask_buf[i]); in regmap_irq_sync_unlock()
63 dev_err(d->map->dev, "Failed to sync masks in %x\n", in regmap_irq_sync_unlock()
64 d->chip->mask_base + i); in regmap_irq_sync_unlock()
67 mutex_unlock(&d->lock); in regmap_irq_sync_unlock()
73 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->irq); in regmap_irq_enable()
75 d->mask_buf[irq_data->reg_offset] &= ~irq_data->mask; in regmap_irq_enable()
81 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->irq); in regmap_irq_disable()
83 d->mask_buf[irq_data->reg_offset] |= irq_data->mask; in regmap_irq_disable()
97 struct regmap_irq_chip *chip = data->chip; in regmap_irq_thread()
98 struct regmap *map = data->map; in regmap_irq_thread() local
100 u8 *buf8 = data->status_reg_buf; in regmap_irq_thread()
101 u16 *buf16 = data->status_reg_buf; in regmap_irq_thread()
102 u32 *buf32 = data->status_reg_buf; in regmap_irq_thread()
105 ret = regmap_bulk_read(map, chip->status_base, data->status_reg_buf, in regmap_irq_thread()
106 chip->num_regs); in regmap_irq_thread()
108 dev_err(map->dev, "Failed to read IRQ status: %d\n", ret); in regmap_irq_thread()
115 * interrupt. We assume that typically few of the interrupts in regmap_irq_thread()
119 for (i = 0; i < data->chip->num_regs; i++) { in regmap_irq_thread()
120 switch (map->format.val_bytes) { in regmap_irq_thread()
122 data->status_buf[i] = buf8[i]; in regmap_irq_thread()
125 data->status_buf[i] = buf16[i]; in regmap_irq_thread()
128 data->status_buf[i] = buf32[i]; in regmap_irq_thread()
135 data->status_buf[i] &= ~data->mask_buf[i]; in regmap_irq_thread()
137 if (data->status_buf[i] && chip->ack_base) { in regmap_irq_thread()
138 ret = regmap_write(map, chip->ack_base + i, in regmap_irq_thread()
139 data->status_buf[i]); in regmap_irq_thread()
141 dev_err(map->dev, "Failed to ack 0x%x: %d\n", in regmap_irq_thread()
142 chip->ack_base + i, ret); in regmap_irq_thread()
146 for (i = 0; i < chip->num_irqs; i++) { in regmap_irq_thread()
147 if (data->status_buf[chip->irqs[i].reg_offset] & in regmap_irq_thread()
148 chip->irqs[i].mask) { in regmap_irq_thread()
149 handle_nested_irq(data->irq_base + i); in regmap_irq_thread()
163 * map: The regmap for the device.
165 * irq_flags: The IRQF_ flags to use for the primary interrupt.
166 * chip: Configuration for the interrupt controller.
175 int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags, in regmap_add_irq_chip() argument
181 int ret = -ENOMEM; in regmap_add_irq_chip()
183 irq_base = irq_alloc_descs(irq_base, 0, chip->num_irqs, 0); in regmap_add_irq_chip()
185 dev_warn(map->dev, "Failed to allocate IRQs: %d\n", in regmap_add_irq_chip()
192 return -ENOMEM; in regmap_add_irq_chip()
194 d->status_buf = kzalloc(sizeof(unsigned int) * chip->num_regs, in regmap_add_irq_chip()
196 if (!d->status_buf) in regmap_add_irq_chip()
199 d->status_reg_buf = kzalloc(map->format.val_bytes * chip->num_regs, in regmap_add_irq_chip()
201 if (!d->status_reg_buf) in regmap_add_irq_chip()
204 d->mask_buf = kzalloc(sizeof(unsigned int) * chip->num_regs, in regmap_add_irq_chip()
206 if (!d->mask_buf) in regmap_add_irq_chip()
209 d->mask_buf_def = kzalloc(sizeof(unsigned int) * chip->num_regs, in regmap_add_irq_chip()
211 if (!d->mask_buf_def) in regmap_add_irq_chip()
214 d->map = map; in regmap_add_irq_chip()
215 d->chip = chip; in regmap_add_irq_chip()
216 d->irq_base = irq_base; in regmap_add_irq_chip()
217 mutex_init(&d->lock); in regmap_add_irq_chip()
219 for (i = 0; i < chip->num_irqs; i++) in regmap_add_irq_chip()
220 d->mask_buf_def[chip->irqs[i].reg_offset] in regmap_add_irq_chip()
221 |= chip->irqs[i].mask; in regmap_add_irq_chip()
223 /* Mask all the interrupts by default */ in regmap_add_irq_chip()
224 for (i = 0; i < chip->num_regs; i++) { in regmap_add_irq_chip()
225 d->mask_buf[i] = d->mask_buf_def[i]; in regmap_add_irq_chip()
226 ret = regmap_write(map, chip->mask_base + i, d->mask_buf[i]); in regmap_add_irq_chip()
228 dev_err(map->dev, "Failed to set masks in 0x%x: %d\n", in regmap_add_irq_chip()
229 chip->mask_base + i, ret); in regmap_add_irq_chip()
236 cur_irq < chip->num_irqs + irq_base; in regmap_add_irq_chip()
253 chip->name, d); in regmap_add_irq_chip()
255 dev_err(map->dev, "Failed to request IRQ %d: %d\n", irq, ret); in regmap_add_irq_chip()
262 kfree(d->mask_buf_def); in regmap_add_irq_chip()
263 kfree(d->mask_buf); in regmap_add_irq_chip()
264 kfree(d->status_reg_buf); in regmap_add_irq_chip()
265 kfree(d->status_buf); in regmap_add_irq_chip()
272 * regmap_del_irq_chip(): Stop interrupt handling for a regmap IRQ chip
283 kfree(d->mask_buf_def); in regmap_del_irq_chip()
284 kfree(d->mask_buf); in regmap_del_irq_chip()
285 kfree(d->status_reg_buf); in regmap_del_irq_chip()
286 kfree(d->status_buf); in regmap_del_irq_chip()
292 * regmap_irq_chip_get_base(): Retrieve interrupt base for a regmap IRQ chip
300 return data->irq_base; in regmap_irq_chip_get_base()