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