1/* 2 * /proc interface for comedi 3 * 4 * COMEDI - Linux Control and Measurement Device Interface 5 * Copyright (C) 1998 David A. Schleef <ds@schleef.org> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 */ 17 18/* 19 * This is some serious bloatware. 20 * 21 * Taken from Dave A.'s PCL-711 driver, 'cuz I thought it 22 * was cool. 23 */ 24 25#include "comedidev.h" 26#include "comedi_internal.h" 27#include <linux/proc_fs.h> 28#include <linux/seq_file.h> 29 30static int comedi_read(struct seq_file *m, void *v) 31{ 32 int i; 33 int devices_q = 0; 34 struct comedi_driver *driv; 35 36 seq_printf(m, "comedi version " COMEDI_RELEASE "\nformat string: %s\n", 37 "\"%2d: %-20s %-20s %4d\", i, driver_name, board_name, n_subdevices"); 38 39 for (i = 0; i < COMEDI_NUM_BOARD_MINORS; i++) { 40 struct comedi_device *dev = comedi_dev_get_from_minor(i); 41 42 if (!dev) 43 continue; 44 45 down_read(&dev->attach_lock); 46 if (dev->attached) { 47 devices_q = 1; 48 seq_printf(m, "%2d: %-20s %-20s %4d\n", 49 i, dev->driver->driver_name, 50 dev->board_name, dev->n_subdevices); 51 } 52 up_read(&dev->attach_lock); 53 comedi_dev_put(dev); 54 } 55 if (!devices_q) 56 seq_puts(m, "no devices\n"); 57 58 mutex_lock(&comedi_drivers_list_lock); 59 for (driv = comedi_drivers; driv; driv = driv->next) { 60 seq_printf(m, "%s:\n", driv->driver_name); 61 for (i = 0; i < driv->num_names; i++) 62 seq_printf(m, " %s\n", 63 *(char **)((char *)driv->board_name + 64 i * driv->offset)); 65 66 if (!driv->num_names) 67 seq_printf(m, " %s\n", driv->driver_name); 68 } 69 mutex_unlock(&comedi_drivers_list_lock); 70 71 return 0; 72} 73 74/* 75 * seq_file wrappers for procfile show routines. 76 */ 77static int comedi_proc_open(struct inode *inode, struct file *file) 78{ 79 return single_open(file, comedi_read, NULL); 80} 81 82static const struct file_operations comedi_proc_fops = { 83 .open = comedi_proc_open, 84 .read = seq_read, 85 .llseek = seq_lseek, 86 .release = single_release, 87}; 88 89void comedi_proc_init(void) 90{ 91 proc_create("comedi", 0644, NULL, &comedi_proc_fops); 92} 93 94void comedi_proc_cleanup(void) 95{ 96 remove_proc_entry("comedi", NULL); 97} 98