1ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef/* 26f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * /proc interface for comedi 36f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * 46f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * COMEDI - Linux Control and Measurement Device Interface 56f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * Copyright (C) 1998 David A. Schleef <ds@schleef.org> 66f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * 76f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * This program is free software; you can redistribute it and/or modify 86f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * it under the terms of the GNU General Public License as published by 96f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * the Free Software Foundation; either version 2 of the License, or 106f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * (at your option) any later version. 116f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * 126f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * This program is distributed in the hope that it will be useful, 136f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * but WITHOUT ANY WARRANTY; without even the implied warranty of 146f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 156f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * GNU General Public License for more details. 166f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling */ 17ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef 18ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef/* 196f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * This is some serious bloatware. 206f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * 216f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * Taken from Dave A.'s PCL-711 driver, 'cuz I thought it 226f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling * was cool. 236f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling */ 24ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef 25ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef#include "comedidev.h" 26f286766e4ba899043714471a0a2c9f1474d2ab5cIan Abbott#include "comedi_internal.h" 27ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef#include <linux/proc_fs.h> 281f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells#include <linux/seq_file.h> 29ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef 301f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howellsstatic int comedi_read(struct seq_file *m, void *v) 31ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef{ 32ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef int i; 33ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef int devices_q = 0; 34139dfbdfacb02e3ef3df936d2fabd1ad5f14ea88Bill Pemberton struct comedi_driver *driv; 35ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef 366f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling seq_printf(m, "comedi version " COMEDI_RELEASE "\nformat string: %s\n", 376f2c9efa66d0455e2a5a3de600deaed433e1f3a4Michael Welling "\"%2d: %-20s %-20s %4d\", i, driver_name, board_name, n_subdevices"); 38ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef 39ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef for (i = 0; i < COMEDI_NUM_BOARD_MINORS; i++) { 40616a3548e816553c31d57cc211a86d327a192e12Ian Abbott struct comedi_device *dev = comedi_dev_get_from_minor(i); 41616a3548e816553c31d57cc211a86d327a192e12Ian Abbott 424da5fa9a439fda3019585aecab44462fd641b6f8H Hartley Sweeten if (!dev) 43c7427409cd071a34c4a13c5c24531b7a10334e31Bill Pemberton continue; 44ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef 45616a3548e816553c31d57cc211a86d327a192e12Ian Abbott down_read(&dev->attach_lock); 46ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef if (dev->attached) { 47ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef devices_q = 1; 481f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells seq_printf(m, "%2d: %-20s %-20s %4d\n", 491f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells i, dev->driver->driver_name, 501f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells dev->board_name, dev->n_subdevices); 51ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef } 52616a3548e816553c31d57cc211a86d327a192e12Ian Abbott up_read(&dev->attach_lock); 53616a3548e816553c31d57cc211a86d327a192e12Ian Abbott comedi_dev_put(dev); 54ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef } 5582675f3547ba2a0732beabd9bb4393535f74408cBill Pemberton if (!devices_q) 561f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells seq_puts(m, "no devices\n"); 57ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef 58c383e2d6dacf0b6fdd40fbaf044e235cac54a20fIan Abbott mutex_lock(&comedi_drivers_list_lock); 59ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef for (driv = comedi_drivers; driv; driv = driv->next) { 601f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells seq_printf(m, "%s:\n", driv->driver_name); 611f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells for (i = 0; i < driv->num_names; i++) 621f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells seq_printf(m, " %s\n", 631f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells *(char **)((char *)driv->board_name + 641f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells i * driv->offset)); 651f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells 6682675f3547ba2a0732beabd9bb4393535f74408cBill Pemberton if (!driv->num_names) 671f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells seq_printf(m, " %s\n", driv->driver_name); 68ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef } 69c383e2d6dacf0b6fdd40fbaf044e235cac54a20fIan Abbott mutex_unlock(&comedi_drivers_list_lock); 70ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef 711f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells return 0; 721f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells} 731f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells 741f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells/* 751f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells * seq_file wrappers for procfile show routines. 761f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells */ 771f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howellsstatic int comedi_proc_open(struct inode *inode, struct file *file) 781f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells{ 791f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells return single_open(file, comedi_read, NULL); 80ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef} 81ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef 821f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howellsstatic const struct file_operations comedi_proc_fops = { 831f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells .open = comedi_proc_open, 841f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells .read = seq_read, 851f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells .llseek = seq_lseek, 86bae301d34652e1aa8d8e63198d2dcc84dc612517Al Viro .release = single_release, 871f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells}; 881f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells 89ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleefvoid comedi_proc_init(void) 90ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef{ 911f817b86d5e6aceed48dac7db6ce9a82a4375e3fDavid Howells proc_create("comedi", 0644, NULL, &comedi_proc_fops); 92ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef} 93ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef 94ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleefvoid comedi_proc_cleanup(void) 95ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef{ 9622d114248be8907f965e68a1bfdcea3302cbc776Greg Kroah-Hartman remove_proc_entry("comedi", NULL); 97ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef} 98