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