1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // regmap based irq_chip
4 //
5 // Copyright 2011 Wolfson Microelectronics plc
6 //
7 // Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
8
9 #include <linux/array_size.h>
10 #include <linux/device.h>
11 #include <linux/export.h>
12 #include <linux/interrupt.h>
13 #include <linux/irq.h>
14 #include <linux/irqdomain.h>
15 #include <linux/overflow.h>
16 #include <linux/pm_runtime.h>
17 #include <linux/regmap.h>
18 #include <linux/slab.h>
19
20 #include "internal.h"
21
22 struct regmap_irq_chip_data {
23 struct mutex lock;
24 struct lock_class_key lock_key;
25 struct irq_chip irq_chip;
26
27 struct regmap *map;
28 const struct regmap_irq_chip *chip;
29
30 int irq_base;
31 struct irq_domain *domain;
32
33 int irq;
34 int wake_count;
35
36 void *status_reg_buf;
37 unsigned int *main_status_buf;
38 unsigned int *status_buf;
39 unsigned int *prev_status_buf;
40 unsigned int *mask_buf;
41 unsigned int *mask_buf_def;
42 unsigned int *wake_buf;
43 unsigned int *type_buf;
44 unsigned int *type_buf_def;
45 unsigned int **config_buf;
46
47 unsigned int irq_reg_stride;
48
49 unsigned int (*get_irq_reg)(struct regmap_irq_chip_data *data,
50 unsigned int base, int index);
51
52 unsigned int clear_status:1;
53 };
54
55 static inline const
irq_to_regmap_irq(struct regmap_irq_chip_data * data,int irq)56 struct regmap_irq *irq_to_regmap_irq(struct regmap_irq_chip_data *data,
57 int irq)
58 {
59 return &data->chip->irqs[irq];
60 }
61
regmap_irq_can_bulk_read_status(struct regmap_irq_chip_data * data)62 static bool regmap_irq_can_bulk_read_status(struct regmap_irq_chip_data *data)
63 {
64 struct regmap *map = data->map;
65
66 /*
67 * While possible that a user-defined ->get_irq_reg() callback might
68 * be linear enough to support bulk reads, most of the time it won't.
69 * Therefore only allow them if the default callback is being used.
70 */
71 return data->irq_reg_stride == 1 && map->reg_stride == 1 &&
72 data->get_irq_reg == regmap_irq_get_irq_reg_linear &&
73 !map->use_single_read;
74 }
75
regmap_irq_lock(struct irq_data * data)76 static void regmap_irq_lock(struct irq_data *data)
77 {
78 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data);
79
80 mutex_lock(&d->lock);
81 }
82
regmap_irq_sync_unlock(struct irq_data * data)83 static void regmap_irq_sync_unlock(struct irq_data *data)
84 {
85 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data);
86 struct regmap *map = d->map;
87 int i, j, ret;
88 u32 reg;
89 u32 val;
90
91 if (d->chip->runtime_pm) {
92 ret = pm_runtime_get_sync(map->dev);
93 if (ret < 0)
94 dev_err(map->dev, "IRQ sync failed to resume: %d\n",
95 ret);
96 }
97
98 if (d->clear_status) {
99 for (i = 0; i < d->chip->num_regs; i++) {
100 reg = d->get_irq_reg(d, d->chip->status_base, i);
101
102 ret = regmap_read(map, reg, &val);
103 if (ret)
104 dev_err(d->map->dev,
105 "Failed to clear the interrupt status bits\n");
106 }
107
108 d->clear_status = false;
109 }
110
111 /*
112 * If there's been a change in the mask write it back to the
113 * hardware. We rely on the use of the regmap core cache to
114 * suppress pointless writes.
115 */
116 for (i = 0; i < d->chip->num_regs; i++) {
117 if (d->chip->handle_mask_sync)
118 d->chip->handle_mask_sync(i, d->mask_buf_def[i],
119 d->mask_buf[i],
120 d->chip->irq_drv_data);
121
122 if (d->chip->mask_base && !d->chip->handle_mask_sync) {
123 reg = d->get_irq_reg(d, d->chip->mask_base, i);
124 ret = regmap_update_bits(d->map, reg,
125 d->mask_buf_def[i],
126 d->mask_buf[i]);
127 if (ret)
128 dev_err(d->map->dev, "Failed to sync masks in %x\n", reg);
129 }
130
131 if (d->chip->unmask_base && !d->chip->handle_mask_sync) {
132 reg = d->get_irq_reg(d, d->chip->unmask_base, i);
133 ret = regmap_update_bits(d->map, reg,
134 d->mask_buf_def[i], ~d->mask_buf[i]);
135 if (ret)
136 dev_err(d->map->dev, "Failed to sync masks in %x\n",
137 reg);
138 }
139
140 reg = d->get_irq_reg(d, d->chip->wake_base, i);
141 if (d->wake_buf) {
142 if (d->chip->wake_invert)
143 ret = regmap_update_bits(d->map, reg,
144 d->mask_buf_def[i],
145 ~d->wake_buf[i]);
146 else
147 ret = regmap_update_bits(d->map, reg,
148 d->mask_buf_def[i],
149 d->wake_buf[i]);
150 if (ret != 0)
151 dev_err(d->map->dev,
152 "Failed to sync wakes in %x: %d\n",
153 reg, ret);
154 }
155
156 if (!d->chip->init_ack_masked)
157 continue;
158 /*
159 * Ack all the masked interrupts unconditionally,
160 * OR if there is masked interrupt which hasn't been Acked,
161 * it'll be ignored in irq handler, then may introduce irq storm
162 */
163 if (d->mask_buf[i] && (d->chip->ack_base || d->chip->use_ack)) {
164 reg = d->get_irq_reg(d, d->chip->ack_base, i);
165
166 /* some chips ack by write 0 */
167 if (d->chip->ack_invert)
168 ret = regmap_write(map, reg, ~d->mask_buf[i]);
169 else
170 ret = regmap_write(map, reg, d->mask_buf[i]);
171 if (d->chip->clear_ack) {
172 if (d->chip->ack_invert && !ret)
173 ret = regmap_write(map, reg, UINT_MAX);
174 else if (!ret)
175 ret = regmap_write(map, reg, 0);
176 }
177 if (ret != 0)
178 dev_err(d->map->dev, "Failed to ack 0x%x: %d\n",
179 reg, ret);
180 }
181 }
182
183 for (i = 0; i < d->chip->num_config_bases; i++) {
184 for (j = 0; j < d->chip->num_config_regs; j++) {
185 reg = d->get_irq_reg(d, d->chip->config_base[i], j);
186 ret = regmap_write(map, reg, d->config_buf[i][j]);
187 if (ret)
188 dev_err(d->map->dev,
189 "Failed to write config %x: %d\n",
190 reg, ret);
191 }
192 }
193
194 if (d->chip->runtime_pm)
195 pm_runtime_put(map->dev);
196
197 /* If we've changed our wakeup count propagate it to the parent */
198 if (d->wake_count < 0)
199 for (i = d->wake_count; i < 0; i++)
200 disable_irq_wake(d->irq);
201 else if (d->wake_count > 0)
202 for (i = 0; i < d->wake_count; i++)
203 enable_irq_wake(d->irq);
204
205 d->wake_count = 0;
206
207 mutex_unlock(&d->lock);
208 }
209
regmap_irq_enable(struct irq_data * data)210 static void regmap_irq_enable(struct irq_data *data)
211 {
212 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data);
213 struct regmap *map = d->map;
214 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq);
215 unsigned int reg = irq_data->reg_offset / map->reg_stride;
216 unsigned int mask;
217
218 /*
219 * The type_in_mask flag means that the underlying hardware uses
220 * separate mask bits for each interrupt trigger type, but we want
221 * to have a single logical interrupt with a configurable type.
222 *
223 * If the interrupt we're enabling defines any supported types
224 * then instead of using the regular mask bits for this interrupt,
225 * use the value previously written to the type buffer at the
226 * corresponding offset in regmap_irq_set_type().
227 */
228 if (d->chip->type_in_mask && irq_data->type.types_supported)
229 mask = d->type_buf[reg] & irq_data->mask;
230 else
231 mask = irq_data->mask;
232
233 if (d->chip->clear_on_unmask)
234 d->clear_status = true;
235
236 d->mask_buf[reg] &= ~mask;
237 }
238
regmap_irq_disable(struct irq_data * data)239 static void regmap_irq_disable(struct irq_data *data)
240 {
241 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data);
242 struct regmap *map = d->map;
243 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq);
244
245 d->mask_buf[irq_data->reg_offset / map->reg_stride] |= irq_data->mask;
246 }
247
regmap_irq_set_type(struct irq_data * data,unsigned int type)248 static int regmap_irq_set_type(struct irq_data *data, unsigned int type)
249 {
250 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data);
251 struct regmap *map = d->map;
252 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq);
253 int reg, ret;
254 const struct regmap_irq_type *t = &irq_data->type;
255
256 if ((t->types_supported & type) != type)
257 return 0;
258
259 reg = t->type_reg_offset / map->reg_stride;
260
261 if (d->chip->type_in_mask) {
262 ret = regmap_irq_set_type_config_simple(&d->type_buf, type,
263 irq_data, reg, d->chip->irq_drv_data);
264 if (ret)
265 return ret;
266 }
267
268 if (d->chip->set_type_config) {
269 ret = d->chip->set_type_config(d->config_buf, type, irq_data,
270 reg, d->chip->irq_drv_data);
271 if (ret)
272 return ret;
273 }
274
275 return 0;
276 }
277
regmap_irq_set_wake(struct irq_data * data,unsigned int on)278 static int regmap_irq_set_wake(struct irq_data *data, unsigned int on)
279 {
280 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data);
281 struct regmap *map = d->map;
282 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq);
283
284 if (on) {
285 if (d->wake_buf)
286 d->wake_buf[irq_data->reg_offset / map->reg_stride]
287 &= ~irq_data->mask;
288 d->wake_count++;
289 } else {
290 if (d->wake_buf)
291 d->wake_buf[irq_data->reg_offset / map->reg_stride]
292 |= irq_data->mask;
293 d->wake_count--;
294 }
295
296 return 0;
297 }
298
regmap_irq_reqres(struct irq_data * data)299 static int regmap_irq_reqres(struct irq_data *data)
300 {
301 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data);
302 irq_hw_number_t hwirq = irqd_to_hwirq(data);
303
304 if (d->chip->irq_reqres)
305 return d->chip->irq_reqres(d->chip->irq_drv_data, hwirq);
306
307 return 0;
308 }
309
regmap_irq_relres(struct irq_data * data)310 static void regmap_irq_relres(struct irq_data *data)
311 {
312 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data);
313 irq_hw_number_t hwirq = irqd_to_hwirq(data);
314
315 if (d->chip->irq_relres)
316 d->chip->irq_relres(d->chip->irq_drv_data, hwirq);
317 }
318
319 static const struct irq_chip regmap_irq_chip = {
320 .irq_bus_lock = regmap_irq_lock,
321 .irq_bus_sync_unlock = regmap_irq_sync_unlock,
322 .irq_disable = regmap_irq_disable,
323 .irq_enable = regmap_irq_enable,
324 .irq_set_type = regmap_irq_set_type,
325 .irq_set_wake = regmap_irq_set_wake,
326 .irq_request_resources = regmap_irq_reqres,
327 .irq_release_resources = regmap_irq_relres,
328 };
329
read_sub_irq_data(struct regmap_irq_chip_data * data,unsigned int b)330 static inline int read_sub_irq_data(struct regmap_irq_chip_data *data,
331 unsigned int b)
332 {
333 const struct regmap_irq_chip *chip = data->chip;
334 const struct regmap_irq_sub_irq_map *subreg;
335 struct regmap *map = data->map;
336 unsigned int reg;
337 int i, ret = 0;
338
339 if (!chip->sub_reg_offsets) {
340 reg = data->get_irq_reg(data, chip->status_base, b);
341 ret = regmap_read(map, reg, &data->status_buf[b]);
342 } else {
343 /*
344 * Note we can't use ->get_irq_reg() here because the offsets
345 * in 'subreg' are *not* interchangeable with indices.
346 */
347 subreg = &chip->sub_reg_offsets[b];
348 for (i = 0; i < subreg->num_regs; i++) {
349 unsigned int offset = subreg->offset[i];
350 unsigned int index = offset / map->reg_stride;
351
352 ret = regmap_read(map, chip->status_base + offset,
353 &data->status_buf[index]);
354 if (ret)
355 break;
356 }
357 }
358 return ret;
359 }
360
read_irq_data(struct regmap_irq_chip_data * data)361 static int read_irq_data(struct regmap_irq_chip_data *data)
362 {
363 const struct regmap_irq_chip *chip = data->chip;
364 struct regmap *map = data->map;
365 int ret, i;
366 u32 reg;
367
368 /*
369 * Read only registers with active IRQs if the chip has 'main status
370 * register'. Else read in the statuses, using a single bulk read if
371 * possible in order to reduce the I/O overheads.
372 */
373
374 if (chip->no_status) {
375 /* no status register so default to all active */
376 memset32(data->status_buf, GENMASK(31, 0), chip->num_regs);
377 } else if (chip->num_main_regs) {
378 unsigned int max_main_bits;
379
380 max_main_bits = (chip->num_main_status_bits) ?
381 chip->num_main_status_bits : chip->num_regs;
382 /* Clear the status buf as we don't read all status regs */
383 memset32(data->status_buf, 0, chip->num_regs);
384
385 /* We could support bulk read for main status registers
386 * but I don't expect to see devices with really many main
387 * status registers so let's only support single reads for the
388 * sake of simplicity. and add bulk reads only if needed
389 */
390 for (i = 0; i < chip->num_main_regs; i++) {
391 reg = data->get_irq_reg(data, chip->main_status, i);
392 ret = regmap_read(map, reg, &data->main_status_buf[i]);
393 if (ret) {
394 dev_err(map->dev, "Failed to read IRQ status %d\n", ret);
395 return ret;
396 }
397 }
398
399 /* Read sub registers with active IRQs */
400 for (i = 0; i < chip->num_main_regs; i++) {
401 unsigned int b;
402 const unsigned long mreg = data->main_status_buf[i];
403
404 for_each_set_bit(b, &mreg, map->format.val_bytes * 8) {
405 if (i * map->format.val_bytes * 8 + b >
406 max_main_bits)
407 break;
408 ret = read_sub_irq_data(data, b);
409
410 if (ret != 0) {
411 dev_err(map->dev, "Failed to read IRQ status %d\n", ret);
412 return ret;
413 }
414 }
415
416 }
417 } else if (regmap_irq_can_bulk_read_status(data)) {
418
419 u8 *buf8 = data->status_reg_buf;
420 u16 *buf16 = data->status_reg_buf;
421 u32 *buf32 = data->status_reg_buf;
422
423 BUG_ON(!data->status_reg_buf);
424
425 ret = regmap_bulk_read(map, chip->status_base,
426 data->status_reg_buf,
427 chip->num_regs);
428 if (ret != 0) {
429 dev_err(map->dev, "Failed to read IRQ status: %d\n", ret);
430 return ret;
431 }
432
433 for (i = 0; i < data->chip->num_regs; i++) {
434 switch (map->format.val_bytes) {
435 case 1:
436 data->status_buf[i] = buf8[i];
437 break;
438 case 2:
439 data->status_buf[i] = buf16[i];
440 break;
441 case 4:
442 data->status_buf[i] = buf32[i];
443 break;
444 default:
445 BUG();
446 return -EIO;
447 }
448 }
449
450 } else {
451 for (i = 0; i < data->chip->num_regs; i++) {
452 unsigned int reg = data->get_irq_reg(data,
453 data->chip->status_base, i);
454 ret = regmap_read(map, reg, &data->status_buf[i]);
455
456 if (ret != 0) {
457 dev_err(map->dev, "Failed to read IRQ status: %d\n", ret);
458 return ret;
459 }
460 }
461 }
462
463 if (chip->status_invert)
464 for (i = 0; i < data->chip->num_regs; i++)
465 data->status_buf[i] = ~data->status_buf[i];
466
467 return 0;
468 }
469
regmap_irq_thread(int irq,void * d)470 static irqreturn_t regmap_irq_thread(int irq, void *d)
471 {
472 struct regmap_irq_chip_data *data = d;
473 const struct regmap_irq_chip *chip = data->chip;
474 struct regmap *map = data->map;
475 int ret, i;
476 bool handled = false;
477 u32 reg;
478
479 if (chip->handle_pre_irq)
480 chip->handle_pre_irq(chip->irq_drv_data);
481
482 if (chip->runtime_pm) {
483 ret = pm_runtime_get_sync(map->dev);
484 if (ret < 0) {
485 dev_err(map->dev, "IRQ thread failed to resume: %d\n", ret);
486 goto exit;
487 }
488 }
489
490 ret = read_irq_data(data);
491 if (ret < 0)
492 goto exit;
493
494 if (chip->status_is_level) {
495 for (i = 0; i < data->chip->num_regs; i++) {
496 unsigned int val = data->status_buf[i];
497
498 data->status_buf[i] ^= data->prev_status_buf[i];
499 data->prev_status_buf[i] = val;
500 }
501 }
502
503 /*
504 * Ignore masked IRQs and ack if we need to; we ack early so
505 * there is no race between handling and acknowledging the
506 * interrupt. We assume that typically few of the interrupts
507 * will fire simultaneously so don't worry about overhead from
508 * doing a write per register.
509 */
510 for (i = 0; i < data->chip->num_regs; i++) {
511 data->status_buf[i] &= ~data->mask_buf[i];
512
513 if (data->status_buf[i] && (chip->ack_base || chip->use_ack)) {
514 reg = data->get_irq_reg(data, data->chip->ack_base, i);
515
516 if (chip->ack_invert)
517 ret = regmap_write(map, reg,
518 ~data->status_buf[i]);
519 else
520 ret = regmap_write(map, reg,
521 data->status_buf[i]);
522 if (chip->clear_ack) {
523 if (chip->ack_invert && !ret)
524 ret = regmap_write(map, reg, UINT_MAX);
525 else if (!ret)
526 ret = regmap_write(map, reg, 0);
527 }
528 if (ret != 0)
529 dev_err(map->dev, "Failed to ack 0x%x: %d\n",
530 reg, ret);
531 }
532 }
533
534 for (i = 0; i < chip->num_irqs; i++) {
535 if (data->status_buf[chip->irqs[i].reg_offset /
536 map->reg_stride] & chip->irqs[i].mask) {
537 handle_nested_irq(irq_find_mapping(data->domain, i));
538 handled = true;
539 }
540 }
541
542 exit:
543 if (chip->handle_post_irq)
544 chip->handle_post_irq(chip->irq_drv_data);
545
546 if (chip->runtime_pm)
547 pm_runtime_put(map->dev);
548
549 if (handled)
550 return IRQ_HANDLED;
551 else
552 return IRQ_NONE;
553 }
554
555 static struct lock_class_key regmap_irq_lock_class;
556 static struct lock_class_key regmap_irq_request_class;
557
regmap_irq_map(struct irq_domain * h,unsigned int virq,irq_hw_number_t hw)558 static int regmap_irq_map(struct irq_domain *h, unsigned int virq,
559 irq_hw_number_t hw)
560 {
561 struct regmap_irq_chip_data *data = h->host_data;
562
563 irq_set_chip_data(virq, data);
564 irq_set_lockdep_class(virq, ®map_irq_lock_class, ®map_irq_request_class);
565 irq_set_chip(virq, &data->irq_chip);
566 irq_set_nested_thread(virq, 1);
567 irq_set_parent(virq, data->irq);
568 irq_set_noprobe(virq);
569
570 return 0;
571 }
572
573 static const struct irq_domain_ops regmap_domain_ops = {
574 .map = regmap_irq_map,
575 .xlate = irq_domain_xlate_onetwocell,
576 };
577
578 /**
579 * regmap_irq_get_irq_reg_linear() - Linear IRQ register mapping callback.
580 * @data: Data for the &struct regmap_irq_chip
581 * @base: Base register
582 * @index: Register index
583 *
584 * Returns the register address corresponding to the given @base and @index
585 * by the formula ``base + index * regmap_stride * irq_reg_stride``.
586 */
regmap_irq_get_irq_reg_linear(struct regmap_irq_chip_data * data,unsigned int base,int index)587 unsigned int regmap_irq_get_irq_reg_linear(struct regmap_irq_chip_data *data,
588 unsigned int base, int index)
589 {
590 struct regmap *map = data->map;
591
592 return base + index * map->reg_stride * data->irq_reg_stride;
593 }
594 EXPORT_SYMBOL_GPL(regmap_irq_get_irq_reg_linear);
595
596 /**
597 * regmap_irq_set_type_config_simple() - Simple IRQ type configuration callback.
598 * @buf: Buffer containing configuration register values, this is a 2D array of
599 * `num_config_bases` rows, each of `num_config_regs` elements.
600 * @type: The requested IRQ type.
601 * @irq_data: The IRQ being configured.
602 * @idx: Index of the irq's config registers within each array `buf[i]`
603 * @irq_drv_data: Driver specific IRQ data
604 *
605 * This is a &struct regmap_irq_chip->set_type_config callback suitable for
606 * chips with one config register. Register values are updated according to
607 * the &struct regmap_irq_type data associated with an IRQ.
608 */
regmap_irq_set_type_config_simple(unsigned int ** buf,unsigned int type,const struct regmap_irq * irq_data,int idx,void * irq_drv_data)609 int regmap_irq_set_type_config_simple(unsigned int **buf, unsigned int type,
610 const struct regmap_irq *irq_data,
611 int idx, void *irq_drv_data)
612 {
613 const struct regmap_irq_type *t = &irq_data->type;
614
615 if (t->type_reg_mask)
616 buf[0][idx] &= ~t->type_reg_mask;
617 else
618 buf[0][idx] &= ~(t->type_falling_val |
619 t->type_rising_val |
620 t->type_level_low_val |
621 t->type_level_high_val);
622
623 switch (type) {
624 case IRQ_TYPE_EDGE_FALLING:
625 buf[0][idx] |= t->type_falling_val;
626 break;
627
628 case IRQ_TYPE_EDGE_RISING:
629 buf[0][idx] |= t->type_rising_val;
630 break;
631
632 case IRQ_TYPE_EDGE_BOTH:
633 buf[0][idx] |= (t->type_falling_val |
634 t->type_rising_val);
635 break;
636
637 case IRQ_TYPE_LEVEL_HIGH:
638 buf[0][idx] |= t->type_level_high_val;
639 break;
640
641 case IRQ_TYPE_LEVEL_LOW:
642 buf[0][idx] |= t->type_level_low_val;
643 break;
644
645 default:
646 return -EINVAL;
647 }
648
649 return 0;
650 }
651 EXPORT_SYMBOL_GPL(regmap_irq_set_type_config_simple);
652
regmap_irq_create_domain(struct fwnode_handle * fwnode,int irq_base,const struct regmap_irq_chip * chip,struct regmap_irq_chip_data * d)653 static int regmap_irq_create_domain(struct fwnode_handle *fwnode, int irq_base,
654 const struct regmap_irq_chip *chip,
655 struct regmap_irq_chip_data *d)
656 {
657 struct irq_domain_info info = {
658 .fwnode = fwnode,
659 .size = chip->num_irqs,
660 .hwirq_max = chip->num_irqs,
661 .virq_base = irq_base,
662 .ops = ®map_domain_ops,
663 .host_data = d,
664 .name_suffix = chip->domain_suffix,
665 };
666
667 d->domain = irq_domain_instantiate(&info);
668 if (IS_ERR(d->domain)) {
669 dev_err(d->map->dev, "Failed to create IRQ domain\n");
670 return PTR_ERR(d->domain);
671 }
672
673 return 0;
674 }
675
676
677 /**
678 * regmap_add_irq_chip_fwnode() - Use standard regmap IRQ controller handling
679 *
680 * @fwnode: The firmware node where the IRQ domain should be added to.
681 * @map: The regmap for the device.
682 * @irq: The IRQ the device uses to signal interrupts.
683 * @irq_flags: The IRQF_ flags to use for the primary interrupt.
684 * @irq_base: Allocate at specific IRQ number if irq_base > 0.
685 * @chip: Configuration for the interrupt controller.
686 * @data: Runtime data structure for the controller, allocated on success.
687 *
688 * Returns 0 on success or an errno on failure.
689 *
690 * In order for this to be efficient the chip really should use a
691 * register cache. The chip driver is responsible for restoring the
692 * register values used by the IRQ controller over suspend and resume.
693 */
regmap_add_irq_chip_fwnode(struct fwnode_handle * fwnode,struct regmap * map,int irq,int irq_flags,int irq_base,const struct regmap_irq_chip * chip,struct regmap_irq_chip_data ** data)694 int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode,
695 struct regmap *map, int irq,
696 int irq_flags, int irq_base,
697 const struct regmap_irq_chip *chip,
698 struct regmap_irq_chip_data **data)
699 {
700 struct regmap_irq_chip_data *d;
701 int i;
702 int ret = -ENOMEM;
703 u32 reg;
704
705 if (chip->num_regs <= 0)
706 return -EINVAL;
707
708 if (chip->clear_on_unmask && (chip->ack_base || chip->use_ack))
709 return -EINVAL;
710
711 if (chip->mask_base && chip->unmask_base && !chip->mask_unmask_non_inverted)
712 return -EINVAL;
713
714 for (i = 0; i < chip->num_irqs; i++) {
715 if (chip->irqs[i].reg_offset % map->reg_stride)
716 return -EINVAL;
717 if (chip->irqs[i].reg_offset / map->reg_stride >=
718 chip->num_regs)
719 return -EINVAL;
720 }
721
722 if (irq_base) {
723 irq_base = irq_alloc_descs(irq_base, 0, chip->num_irqs, 0);
724 if (irq_base < 0) {
725 dev_warn(map->dev, "Failed to allocate IRQs: %d\n",
726 irq_base);
727 return irq_base;
728 }
729 }
730
731 d = kzalloc_obj(*d);
732 if (!d)
733 return -ENOMEM;
734
735 if (chip->num_main_regs) {
736 d->main_status_buf = kcalloc(chip->num_main_regs,
737 sizeof(*d->main_status_buf),
738 GFP_KERNEL);
739
740 if (!d->main_status_buf)
741 goto err_alloc;
742 }
743
744 d->status_buf = kcalloc(chip->num_regs, sizeof(*d->status_buf),
745 GFP_KERNEL);
746 if (!d->status_buf)
747 goto err_alloc;
748
749 if (chip->status_is_level) {
750 d->prev_status_buf = kcalloc(chip->num_regs, sizeof(*d->prev_status_buf),
751 GFP_KERNEL);
752 if (!d->prev_status_buf)
753 goto err_alloc;
754 }
755
756 d->mask_buf = kcalloc(chip->num_regs, sizeof(*d->mask_buf),
757 GFP_KERNEL);
758 if (!d->mask_buf)
759 goto err_alloc;
760
761 d->mask_buf_def = kcalloc(chip->num_regs, sizeof(*d->mask_buf_def),
762 GFP_KERNEL);
763 if (!d->mask_buf_def)
764 goto err_alloc;
765
766 if (chip->wake_base) {
767 d->wake_buf = kcalloc(chip->num_regs, sizeof(*d->wake_buf),
768 GFP_KERNEL);
769 if (!d->wake_buf)
770 goto err_alloc;
771 }
772
773 if (chip->type_in_mask) {
774 d->type_buf_def = kcalloc(chip->num_regs,
775 sizeof(*d->type_buf_def), GFP_KERNEL);
776 if (!d->type_buf_def)
777 goto err_alloc;
778
779 d->type_buf = kcalloc(chip->num_regs, sizeof(*d->type_buf), GFP_KERNEL);
780 if (!d->type_buf)
781 goto err_alloc;
782 }
783
784 if (chip->num_config_bases && chip->num_config_regs) {
785 /*
786 * Create config_buf[num_config_bases][num_config_regs]
787 */
788 d->config_buf = kcalloc(chip->num_config_bases,
789 sizeof(*d->config_buf), GFP_KERNEL);
790 if (!d->config_buf)
791 goto err_alloc;
792
793 for (i = 0; i < chip->num_config_bases; i++) {
794 d->config_buf[i] = kcalloc(chip->num_config_regs,
795 sizeof(**d->config_buf),
796 GFP_KERNEL);
797 if (!d->config_buf[i])
798 goto err_alloc;
799 }
800 }
801
802 d->irq_chip = regmap_irq_chip;
803 d->irq_chip.name = chip->name;
804 d->irq = irq;
805 d->map = map;
806 d->chip = chip;
807 d->irq_base = irq_base;
808
809 if (chip->irq_reg_stride)
810 d->irq_reg_stride = chip->irq_reg_stride;
811 else
812 d->irq_reg_stride = 1;
813
814 if (chip->get_irq_reg)
815 d->get_irq_reg = chip->get_irq_reg;
816 else
817 d->get_irq_reg = regmap_irq_get_irq_reg_linear;
818
819 if (regmap_irq_can_bulk_read_status(d)) {
820 d->status_reg_buf = kmalloc_array(chip->num_regs,
821 map->format.val_bytes,
822 GFP_KERNEL);
823 if (!d->status_reg_buf)
824 goto err_alloc;
825 }
826
827 /*
828 * If one regmap-irq is the parent of another then we'll try
829 * to lock the child with the parent locked, use an explicit
830 * lock_key so lockdep can figure out what's going on.
831 */
832 lockdep_register_key(&d->lock_key);
833 mutex_init_with_key(&d->lock, &d->lock_key);
834
835 for (i = 0; i < chip->num_irqs; i++)
836 d->mask_buf_def[chip->irqs[i].reg_offset / map->reg_stride]
837 |= chip->irqs[i].mask;
838
839 /* Mask all the interrupts by default */
840 for (i = 0; i < chip->num_regs; i++) {
841 d->mask_buf[i] = d->mask_buf_def[i];
842
843 if (chip->handle_mask_sync) {
844 ret = chip->handle_mask_sync(i, d->mask_buf_def[i],
845 d->mask_buf[i],
846 chip->irq_drv_data);
847 if (ret)
848 goto err_mutex;
849 }
850
851 if (chip->mask_base && !chip->handle_mask_sync) {
852 reg = d->get_irq_reg(d, chip->mask_base, i);
853 ret = regmap_update_bits(d->map, reg,
854 d->mask_buf_def[i],
855 d->mask_buf[i]);
856 if (ret) {
857 dev_err(map->dev, "Failed to set masks in 0x%x: %d\n",
858 reg, ret);
859 goto err_mutex;
860 }
861 }
862
863 if (chip->unmask_base && !chip->handle_mask_sync) {
864 reg = d->get_irq_reg(d, chip->unmask_base, i);
865 ret = regmap_update_bits(d->map, reg,
866 d->mask_buf_def[i], ~d->mask_buf[i]);
867 if (ret) {
868 dev_err(map->dev, "Failed to set masks in 0x%x: %d\n",
869 reg, ret);
870 goto err_mutex;
871 }
872 }
873
874 if (!chip->init_ack_masked)
875 continue;
876
877 /* Ack masked but set interrupts */
878 if (d->chip->no_status) {
879 /* no status register so default to all active */
880 d->status_buf[i] = UINT_MAX;
881 } else {
882 reg = d->get_irq_reg(d, d->chip->status_base, i);
883 ret = regmap_read(map, reg, &d->status_buf[i]);
884 if (ret != 0) {
885 dev_err(map->dev, "Failed to read IRQ status: %d\n",
886 ret);
887 goto err_mutex;
888 }
889 }
890
891 if (chip->status_invert)
892 d->status_buf[i] = ~d->status_buf[i];
893
894 if (d->status_buf[i] && (chip->ack_base || chip->use_ack)) {
895 reg = d->get_irq_reg(d, d->chip->ack_base, i);
896 if (chip->ack_invert)
897 ret = regmap_write(map, reg,
898 ~(d->status_buf[i] & d->mask_buf[i]));
899 else
900 ret = regmap_write(map, reg,
901 d->status_buf[i] & d->mask_buf[i]);
902 if (chip->clear_ack) {
903 if (chip->ack_invert && !ret)
904 ret = regmap_write(map, reg, UINT_MAX);
905 else if (!ret)
906 ret = regmap_write(map, reg, 0);
907 }
908 if (ret != 0) {
909 dev_err(map->dev, "Failed to ack 0x%x: %d\n",
910 reg, ret);
911 goto err_mutex;
912 }
913 }
914 }
915
916 /* Wake is disabled by default */
917 if (d->wake_buf) {
918 for (i = 0; i < chip->num_regs; i++) {
919 d->wake_buf[i] = d->mask_buf_def[i];
920 reg = d->get_irq_reg(d, d->chip->wake_base, i);
921
922 if (chip->wake_invert)
923 ret = regmap_update_bits(d->map, reg,
924 d->mask_buf_def[i],
925 0);
926 else
927 ret = regmap_update_bits(d->map, reg,
928 d->mask_buf_def[i],
929 d->wake_buf[i]);
930 if (ret != 0) {
931 dev_err(map->dev, "Failed to set masks in 0x%x: %d\n",
932 reg, ret);
933 goto err_mutex;
934 }
935 }
936 }
937
938 /* Store current levels */
939 if (chip->status_is_level) {
940 ret = read_irq_data(d);
941 if (ret < 0)
942 goto err_mutex;
943
944 memcpy(d->prev_status_buf, d->status_buf,
945 array_size(d->chip->num_regs, sizeof(d->prev_status_buf[0])));
946 }
947
948 ret = regmap_irq_create_domain(fwnode, irq_base, chip, d);
949 if (ret)
950 goto err_mutex;
951
952 ret = request_threaded_irq(irq, NULL, regmap_irq_thread,
953 irq_flags | IRQF_ONESHOT,
954 chip->name, d);
955 if (ret != 0) {
956 dev_err(map->dev, "Failed to request IRQ %d for %s: %d\n",
957 irq, chip->name, ret);
958 goto err_domain;
959 }
960
961 *data = d;
962
963 return 0;
964
965 err_domain:
966 irq_domain_remove(d->domain);
967 err_mutex:
968 mutex_destroy(&d->lock);
969 lockdep_unregister_key(&d->lock_key);
970 err_alloc:
971 kfree(d->type_buf);
972 kfree(d->type_buf_def);
973 kfree(d->wake_buf);
974 kfree(d->mask_buf_def);
975 kfree(d->mask_buf);
976 kfree(d->main_status_buf);
977 kfree(d->status_buf);
978 kfree(d->prev_status_buf);
979 kfree(d->status_reg_buf);
980 if (d->config_buf) {
981 for (i = 0; i < chip->num_config_bases; i++)
982 kfree(d->config_buf[i]);
983 kfree(d->config_buf);
984 }
985 kfree(d);
986 return ret;
987 }
988 EXPORT_SYMBOL_GPL(regmap_add_irq_chip_fwnode);
989
990 /**
991 * regmap_add_irq_chip() - Use standard regmap IRQ controller handling
992 *
993 * @map: The regmap for the device.
994 * @irq: The IRQ the device uses to signal interrupts.
995 * @irq_flags: The IRQF_ flags to use for the primary interrupt.
996 * @irq_base: Allocate at specific IRQ number if irq_base > 0.
997 * @chip: Configuration for the interrupt controller.
998 * @data: Runtime data structure for the controller, allocated on success.
999 *
1000 * Returns 0 on success or an errno on failure.
1001 *
1002 * This is the same as regmap_add_irq_chip_fwnode, except that the firmware
1003 * node of the regmap is used.
1004 */
regmap_add_irq_chip(struct regmap * map,int irq,int irq_flags,int irq_base,const struct regmap_irq_chip * chip,struct regmap_irq_chip_data ** data)1005 int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
1006 int irq_base, const struct regmap_irq_chip *chip,
1007 struct regmap_irq_chip_data **data)
1008 {
1009 return regmap_add_irq_chip_fwnode(dev_fwnode(map->dev), map, irq,
1010 irq_flags, irq_base, chip, data);
1011 }
1012 EXPORT_SYMBOL_GPL(regmap_add_irq_chip);
1013
1014 /**
1015 * regmap_del_irq_chip() - Stop interrupt handling for a regmap IRQ chip
1016 *
1017 * @irq: Primary IRQ for the device
1018 * @d: ®map_irq_chip_data allocated by regmap_add_irq_chip()
1019 *
1020 * This function also disposes of all mapped IRQs on the chip.
1021 */
regmap_del_irq_chip(int irq,struct regmap_irq_chip_data * d)1022 void regmap_del_irq_chip(int irq, struct regmap_irq_chip_data *d)
1023 {
1024 unsigned int virq;
1025 int i, hwirq;
1026
1027 if (!d)
1028 return;
1029
1030 free_irq(irq, d);
1031
1032 /* Dispose all virtual irq from irq domain before removing it */
1033 for (hwirq = 0; hwirq < d->chip->num_irqs; hwirq++) {
1034 /* Ignore hwirq if holes in the IRQ list */
1035 if (!d->chip->irqs[hwirq].mask)
1036 continue;
1037
1038 /*
1039 * Find the virtual irq of hwirq on chip and if it is
1040 * there then dispose it
1041 */
1042 virq = irq_find_mapping(d->domain, hwirq);
1043 if (virq)
1044 irq_dispose_mapping(virq);
1045 }
1046
1047 irq_domain_remove(d->domain);
1048 kfree(d->type_buf);
1049 kfree(d->type_buf_def);
1050 kfree(d->wake_buf);
1051 kfree(d->mask_buf_def);
1052 kfree(d->mask_buf);
1053 kfree(d->main_status_buf);
1054 kfree(d->status_reg_buf);
1055 kfree(d->status_buf);
1056 kfree(d->prev_status_buf);
1057 if (d->config_buf) {
1058 for (i = 0; i < d->chip->num_config_bases; i++)
1059 kfree(d->config_buf[i]);
1060 kfree(d->config_buf);
1061 }
1062 mutex_destroy(&d->lock);
1063 lockdep_unregister_key(&d->lock_key);
1064 kfree(d);
1065 }
1066 EXPORT_SYMBOL_GPL(regmap_del_irq_chip);
1067
devm_regmap_irq_chip_release(struct device * dev,void * res)1068 static void devm_regmap_irq_chip_release(struct device *dev, void *res)
1069 {
1070 struct regmap_irq_chip_data *d = *(struct regmap_irq_chip_data **)res;
1071
1072 regmap_del_irq_chip(d->irq, d);
1073 }
1074
devm_regmap_irq_chip_match(struct device * dev,void * res,void * data)1075 static int devm_regmap_irq_chip_match(struct device *dev, void *res, void *data)
1076
1077 {
1078 struct regmap_irq_chip_data **r = res;
1079
1080 if (!r || !*r) {
1081 WARN_ON(!r || !*r);
1082 return 0;
1083 }
1084 return *r == data;
1085 }
1086
1087 /**
1088 * devm_regmap_add_irq_chip_fwnode() - Resource managed regmap_add_irq_chip_fwnode()
1089 *
1090 * @dev: The device pointer on which irq_chip belongs to.
1091 * @fwnode: The firmware node where the IRQ domain should be added to.
1092 * @map: The regmap for the device.
1093 * @irq: The IRQ the device uses to signal interrupts
1094 * @irq_flags: The IRQF_ flags to use for the primary interrupt.
1095 * @irq_base: Allocate at specific IRQ number if irq_base > 0.
1096 * @chip: Configuration for the interrupt controller.
1097 * @data: Runtime data structure for the controller, allocated on success
1098 *
1099 * Returns 0 on success or an errno on failure.
1100 *
1101 * The ®map_irq_chip_data will be automatically released when the device is
1102 * unbound.
1103 */
devm_regmap_add_irq_chip_fwnode(struct device * dev,struct fwnode_handle * fwnode,struct regmap * map,int irq,int irq_flags,int irq_base,const struct regmap_irq_chip * chip,struct regmap_irq_chip_data ** data)1104 int devm_regmap_add_irq_chip_fwnode(struct device *dev,
1105 struct fwnode_handle *fwnode,
1106 struct regmap *map, int irq,
1107 int irq_flags, int irq_base,
1108 const struct regmap_irq_chip *chip,
1109 struct regmap_irq_chip_data **data)
1110 {
1111 struct regmap_irq_chip_data **ptr, *d;
1112 int ret;
1113
1114 ptr = devres_alloc(devm_regmap_irq_chip_release, sizeof(*ptr),
1115 GFP_KERNEL);
1116 if (!ptr)
1117 return -ENOMEM;
1118
1119 ret = regmap_add_irq_chip_fwnode(fwnode, map, irq, irq_flags, irq_base,
1120 chip, &d);
1121 if (ret < 0) {
1122 devres_free(ptr);
1123 return ret;
1124 }
1125
1126 *ptr = d;
1127 devres_add(dev, ptr);
1128 *data = d;
1129 return 0;
1130 }
1131 EXPORT_SYMBOL_GPL(devm_regmap_add_irq_chip_fwnode);
1132
1133 /**
1134 * devm_regmap_add_irq_chip() - Resource managed regmap_add_irq_chip()
1135 *
1136 * @dev: The device pointer on which irq_chip belongs to.
1137 * @map: The regmap for the device.
1138 * @irq: The IRQ the device uses to signal interrupts
1139 * @irq_flags: The IRQF_ flags to use for the primary interrupt.
1140 * @irq_base: Allocate at specific IRQ number if irq_base > 0.
1141 * @chip: Configuration for the interrupt controller.
1142 * @data: Runtime data structure for the controller, allocated on success
1143 *
1144 * Returns 0 on success or an errno on failure.
1145 *
1146 * The ®map_irq_chip_data will be automatically released when the device is
1147 * unbound.
1148 */
devm_regmap_add_irq_chip(struct device * dev,struct regmap * map,int irq,int irq_flags,int irq_base,const struct regmap_irq_chip * chip,struct regmap_irq_chip_data ** data)1149 int devm_regmap_add_irq_chip(struct device *dev, struct regmap *map, int irq,
1150 int irq_flags, int irq_base,
1151 const struct regmap_irq_chip *chip,
1152 struct regmap_irq_chip_data **data)
1153 {
1154 return devm_regmap_add_irq_chip_fwnode(dev, dev_fwnode(map->dev), map,
1155 irq, irq_flags, irq_base, chip,
1156 data);
1157 }
1158 EXPORT_SYMBOL_GPL(devm_regmap_add_irq_chip);
1159
1160 /**
1161 * devm_regmap_del_irq_chip() - Resource managed regmap_del_irq_chip()
1162 *
1163 * @dev: Device for which the resource was allocated.
1164 * @irq: Primary IRQ for the device.
1165 * @data: ®map_irq_chip_data allocated by regmap_add_irq_chip().
1166 *
1167 * A resource managed version of regmap_del_irq_chip().
1168 */
devm_regmap_del_irq_chip(struct device * dev,int irq,struct regmap_irq_chip_data * data)1169 void devm_regmap_del_irq_chip(struct device *dev, int irq,
1170 struct regmap_irq_chip_data *data)
1171 {
1172 int rc;
1173
1174 WARN_ON(irq != data->irq);
1175 rc = devres_release(dev, devm_regmap_irq_chip_release,
1176 devm_regmap_irq_chip_match, data);
1177
1178 if (rc != 0)
1179 WARN_ON(rc);
1180 }
1181 EXPORT_SYMBOL_GPL(devm_regmap_del_irq_chip);
1182
1183 /**
1184 * regmap_irq_chip_get_base() - Retrieve interrupt base for a regmap IRQ chip
1185 *
1186 * @data: regmap irq controller to operate on.
1187 *
1188 * Useful for drivers to request their own IRQs.
1189 */
regmap_irq_chip_get_base(struct regmap_irq_chip_data * data)1190 int regmap_irq_chip_get_base(struct regmap_irq_chip_data *data)
1191 {
1192 WARN_ON(!data->irq_base);
1193 return data->irq_base;
1194 }
1195 EXPORT_SYMBOL_GPL(regmap_irq_chip_get_base);
1196
1197 /**
1198 * regmap_irq_get_virq() - Map an interrupt on a chip to a virtual IRQ
1199 *
1200 * @data: regmap irq controller to operate on.
1201 * @irq: index of the interrupt requested in the chip IRQs.
1202 *
1203 * Useful for drivers to request their own IRQs.
1204 */
regmap_irq_get_virq(struct regmap_irq_chip_data * data,int irq)1205 int regmap_irq_get_virq(struct regmap_irq_chip_data *data, int irq)
1206 {
1207 /* Handle holes in the IRQ list */
1208 if (!data->chip->irqs[irq].mask)
1209 return -EINVAL;
1210
1211 return irq_create_mapping(data->domain, irq);
1212 }
1213 EXPORT_SYMBOL_GPL(regmap_irq_get_virq);
1214
1215 /**
1216 * regmap_irq_get_domain() - Retrieve the irq_domain for the chip
1217 *
1218 * @data: regmap_irq controller to operate on.
1219 *
1220 * Useful for drivers to request their own IRQs and for integration
1221 * with subsystems. For ease of integration NULL is accepted as a
1222 * domain, allowing devices to just call this even if no domain is
1223 * allocated.
1224 */
regmap_irq_get_domain(struct regmap_irq_chip_data * data)1225 struct irq_domain *regmap_irq_get_domain(struct regmap_irq_chip_data *data)
1226 {
1227 if (data)
1228 return data->domain;
1229 else
1230 return NULL;
1231 }
1232 EXPORT_SYMBOL_GPL(regmap_irq_get_domain);
1233