12be6bb0cSPaul Mundt /* 22be6bb0cSPaul Mundt * Support for virtual IRQ subgroups debugfs mapping. 32be6bb0cSPaul Mundt * 42be6bb0cSPaul Mundt * Copyright (C) 2010 Paul Mundt 52be6bb0cSPaul Mundt * 62be6bb0cSPaul Mundt * Modelled after arch/powerpc/kernel/irq.c. 72be6bb0cSPaul Mundt * 82be6bb0cSPaul Mundt * This file is subject to the terms and conditions of the GNU General Public 92be6bb0cSPaul Mundt * License. See the file "COPYING" in the main directory of this archive 102be6bb0cSPaul Mundt * for more details. 112be6bb0cSPaul Mundt */ 122be6bb0cSPaul Mundt #include <linux/seq_file.h> 132be6bb0cSPaul Mundt #include <linux/fs.h> 142be6bb0cSPaul Mundt #include <linux/init.h> 152be6bb0cSPaul Mundt #include <linux/irq.h> 162be6bb0cSPaul Mundt #include <linux/debugfs.h> 172be6bb0cSPaul Mundt #include "internals.h" 182be6bb0cSPaul Mundt 192be6bb0cSPaul Mundt static int intc_irq_xlate_debug(struct seq_file *m, void *priv) 202be6bb0cSPaul Mundt { 212be6bb0cSPaul Mundt int i; 222be6bb0cSPaul Mundt 232be6bb0cSPaul Mundt seq_printf(m, "%-5s %-7s %-15s\n", "irq", "enum", "chip name"); 242be6bb0cSPaul Mundt 252be6bb0cSPaul Mundt for (i = 1; i < nr_irqs; i++) { 262be6bb0cSPaul Mundt struct intc_map_entry *entry = intc_irq_xlate_get(i); 272be6bb0cSPaul Mundt struct intc_desc_int *desc = entry->desc; 282be6bb0cSPaul Mundt 292be6bb0cSPaul Mundt if (!desc) 302be6bb0cSPaul Mundt continue; 312be6bb0cSPaul Mundt 322be6bb0cSPaul Mundt seq_printf(m, "%5d ", i); 332be6bb0cSPaul Mundt seq_printf(m, "0x%05x ", entry->enum_id); 342be6bb0cSPaul Mundt seq_printf(m, "%-15s\n", desc->chip.name); 352be6bb0cSPaul Mundt } 362be6bb0cSPaul Mundt 372be6bb0cSPaul Mundt return 0; 382be6bb0cSPaul Mundt } 392be6bb0cSPaul Mundt 402be6bb0cSPaul Mundt static int intc_irq_xlate_open(struct inode *inode, struct file *file) 412be6bb0cSPaul Mundt { 422be6bb0cSPaul Mundt return single_open(file, intc_irq_xlate_debug, inode->i_private); 432be6bb0cSPaul Mundt } 442be6bb0cSPaul Mundt 452be6bb0cSPaul Mundt static const struct file_operations intc_irq_xlate_fops = { 462be6bb0cSPaul Mundt .open = intc_irq_xlate_open, 472be6bb0cSPaul Mundt .read = seq_read, 482be6bb0cSPaul Mundt .llseek = seq_lseek, 492be6bb0cSPaul Mundt .release = single_release, 502be6bb0cSPaul Mundt }; 512be6bb0cSPaul Mundt 522be6bb0cSPaul Mundt static int __init intc_irq_xlate_init(void) 532be6bb0cSPaul Mundt { 542be6bb0cSPaul Mundt /* 552be6bb0cSPaul Mundt * XXX.. use arch_debugfs_dir here when all of the intc users are 562be6bb0cSPaul Mundt * converted. 572be6bb0cSPaul Mundt */ 582be6bb0cSPaul Mundt if (debugfs_create_file("intc_irq_xlate", S_IRUGO, NULL, NULL, 592be6bb0cSPaul Mundt &intc_irq_xlate_fops) == NULL) 602be6bb0cSPaul Mundt return -ENOMEM; 612be6bb0cSPaul Mundt 622be6bb0cSPaul Mundt return 0; 632be6bb0cSPaul Mundt } 642be6bb0cSPaul Mundt fs_initcall(intc_irq_xlate_init); 65