| 1 | // SPDX-License-Identifier: GPL-2.0 | 
|---|
| 2 | #include <linux/fs.h> | 
|---|
| 3 | #include <linux/init.h> | 
|---|
| 4 | #include <linux/interrupt.h> | 
|---|
| 5 | #include <linux/irqnr.h> | 
|---|
| 6 | #include <linux/proc_fs.h> | 
|---|
| 7 | #include <linux/seq_file.h> | 
|---|
| 8 |  | 
|---|
| 9 | /* | 
|---|
| 10 | * /proc/interrupts | 
|---|
| 11 | */ | 
|---|
| 12 | static void *int_seq_start(struct seq_file *f, loff_t *pos) | 
|---|
| 13 | { | 
|---|
| 14 | return *pos <= irq_get_nr_irqs() ? pos : NULL; | 
|---|
| 15 | } | 
|---|
| 16 |  | 
|---|
| 17 | static void *int_seq_next(struct seq_file *f, void *v, loff_t *pos) | 
|---|
| 18 | { | 
|---|
| 19 | (*pos)++; | 
|---|
| 20 | if (*pos > irq_get_nr_irqs()) | 
|---|
| 21 | return NULL; | 
|---|
| 22 | return pos; | 
|---|
| 23 | } | 
|---|
| 24 |  | 
|---|
| 25 | static void int_seq_stop(struct seq_file *f, void *v) | 
|---|
| 26 | { | 
|---|
| 27 | /* Nothing to do */ | 
|---|
| 28 | } | 
|---|
| 29 |  | 
|---|
| 30 | static const struct seq_operations int_seq_ops = { | 
|---|
| 31 | .start = int_seq_start, | 
|---|
| 32 | .next  = int_seq_next, | 
|---|
| 33 | .stop  = int_seq_stop, | 
|---|
| 34 | .show  = show_interrupts | 
|---|
| 35 | }; | 
|---|
| 36 |  | 
|---|
| 37 | static int __init proc_interrupts_init(void) | 
|---|
| 38 | { | 
|---|
| 39 | proc_create_seq( "interrupts", 0, NULL, &int_seq_ops); | 
|---|
| 40 | return 0; | 
|---|
| 41 | } | 
|---|
| 42 | fs_initcall(proc_interrupts_init); | 
|---|
| 43 |  | 
|---|