18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci#include <linux/fs.h> 38c2ecf20Sopenharmony_ci#include <linux/init.h> 48c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 58c2ecf20Sopenharmony_ci#include <linux/irqnr.h> 68c2ecf20Sopenharmony_ci#include <linux/proc_fs.h> 78c2ecf20Sopenharmony_ci#include <linux/seq_file.h> 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci/* 108c2ecf20Sopenharmony_ci * /proc/interrupts 118c2ecf20Sopenharmony_ci */ 128c2ecf20Sopenharmony_cistatic void *int_seq_start(struct seq_file *f, loff_t *pos) 138c2ecf20Sopenharmony_ci{ 148c2ecf20Sopenharmony_ci return (*pos <= nr_irqs) ? pos : NULL; 158c2ecf20Sopenharmony_ci} 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_cistatic void *int_seq_next(struct seq_file *f, void *v, loff_t *pos) 188c2ecf20Sopenharmony_ci{ 198c2ecf20Sopenharmony_ci (*pos)++; 208c2ecf20Sopenharmony_ci if (*pos > nr_irqs) 218c2ecf20Sopenharmony_ci return NULL; 228c2ecf20Sopenharmony_ci return pos; 238c2ecf20Sopenharmony_ci} 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cistatic void int_seq_stop(struct seq_file *f, void *v) 268c2ecf20Sopenharmony_ci{ 278c2ecf20Sopenharmony_ci /* Nothing to do */ 288c2ecf20Sopenharmony_ci} 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_cistatic const struct seq_operations int_seq_ops = { 318c2ecf20Sopenharmony_ci .start = int_seq_start, 328c2ecf20Sopenharmony_ci .next = int_seq_next, 338c2ecf20Sopenharmony_ci .stop = int_seq_stop, 348c2ecf20Sopenharmony_ci .show = show_interrupts 358c2ecf20Sopenharmony_ci}; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_cistatic int __init proc_interrupts_init(void) 388c2ecf20Sopenharmony_ci{ 398c2ecf20Sopenharmony_ci proc_create_seq("interrupts", 0, NULL, &int_seq_ops); 408c2ecf20Sopenharmony_ci return 0; 418c2ecf20Sopenharmony_ci} 428c2ecf20Sopenharmony_cifs_initcall(proc_interrupts_init); 43