162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include <linux/fs.h>
362306a36Sopenharmony_ci#include <linux/init.h>
462306a36Sopenharmony_ci#include <linux/interrupt.h>
562306a36Sopenharmony_ci#include <linux/irqnr.h>
662306a36Sopenharmony_ci#include <linux/proc_fs.h>
762306a36Sopenharmony_ci#include <linux/seq_file.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci/*
1062306a36Sopenharmony_ci * /proc/interrupts
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_cistatic void *int_seq_start(struct seq_file *f, loff_t *pos)
1362306a36Sopenharmony_ci{
1462306a36Sopenharmony_ci	return (*pos <= nr_irqs) ? pos : NULL;
1562306a36Sopenharmony_ci}
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistatic void *int_seq_next(struct seq_file *f, void *v, loff_t *pos)
1862306a36Sopenharmony_ci{
1962306a36Sopenharmony_ci	(*pos)++;
2062306a36Sopenharmony_ci	if (*pos > nr_irqs)
2162306a36Sopenharmony_ci		return NULL;
2262306a36Sopenharmony_ci	return pos;
2362306a36Sopenharmony_ci}
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistatic void int_seq_stop(struct seq_file *f, void *v)
2662306a36Sopenharmony_ci{
2762306a36Sopenharmony_ci	/* Nothing to do */
2862306a36Sopenharmony_ci}
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistatic const struct seq_operations int_seq_ops = {
3162306a36Sopenharmony_ci	.start = int_seq_start,
3262306a36Sopenharmony_ci	.next  = int_seq_next,
3362306a36Sopenharmony_ci	.stop  = int_seq_stop,
3462306a36Sopenharmony_ci	.show  = show_interrupts
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistatic int __init proc_interrupts_init(void)
3862306a36Sopenharmony_ci{
3962306a36Sopenharmony_ci	proc_create_seq("interrupts", 0, NULL, &int_seq_ops);
4062306a36Sopenharmony_ci	return 0;
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_cifs_initcall(proc_interrupts_init);
43