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 <= 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 > 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 interrupts_open(struct inode *inode, struct file *filp) 38 { 39 return seq_open(filp, &int_seq_ops); 40 } 41 42 static const struct file_operations proc_interrupts_operations = { 43 .open = interrupts_open, 44 .read = seq_read, 45 .llseek = seq_lseek, 46 .release = seq_release, 47 }; 48 49 static int __init proc_interrupts_init(void) 50 { 51 proc_create("interrupts", 0, NULL, &proc_interrupts_operations); 52 return 0; 53 } 54 fs_initcall(proc_interrupts_init); 55