proc.c revision 4da5fa9a439fda3019585aecab44462fd641b6f8
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    module/proc.c
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    /proc interface for comedi
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    COMEDI - Linux Control and Measurement Device Interface
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    Copyright (C) 1998 David A. Schleef <ds@schleef.org>
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8fbb7a2dc2be493c87399550bdc2ddaa510cdf450Bob Moore    This program is free software; you can redistribute it and/or modify
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    it under the terms of the GNU General Public License as published by
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    the Free Software Foundation; either version 2 of the License, or
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    (at your option) any later version.
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    This program is distributed in the hope that it will be useful,
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    but WITHOUT ANY WARRANTY; without even the implied warranty of
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    GNU General Public License for more details.
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    You should have received a copy of the GNU General Public License
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    along with this program; if not, write to the Free Software
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*/
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	This is some serious bloatware.
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Taken from Dave A.'s PCL-711 driver, 'cuz I thought it
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	was cool.
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*/
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "comedidev.h"
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "comedi_internal.h"
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/proc_fs.h>
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/string.h>
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PROC_FS
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int comedi_read(char *buf, char **start, off_t offset, int len,
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       int *eof, void *data)
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int devices_q = 0;
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int l = 0;
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct comedi_driver *driv;
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
45e2f7a7772880458edff1b1cc5a988947229fac26Len Brown	l += sprintf(buf + l,
46e2f7a7772880458edff1b1cc5a988947229fac26Len Brown		     "comedi version " COMEDI_RELEASE "\n"
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		     "format string: %s\n",
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		     "\"%2d: %-20s %-20s %4d\", i, "
494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		     "driver_name, board_name, n_subdevices");
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < COMEDI_NUM_BOARD_MINORS; i++) {
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct comedi_device *dev = comedi_dev_from_minor(i);
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!dev)
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			continue;
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (dev->attached) {
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			devices_q = 1;
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			l += sprintf(buf + l, "%2d: %-20s %-20s %4d\n",
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				     i,
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				     dev->driver->driver_name,
624be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				     dev->board_name, dev->n_subdevices);
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
644be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	}
654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if (!devices_q)
664be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		l += sprintf(buf + l, "no devices\n");
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
68b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore	for (driv = comedi_drivers; driv; driv = driv->next) {
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		l += sprintf(buf + l, "%s:\n", driv->driver_name);
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (i = 0; i < driv->num_names; i++) {
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			l += sprintf(buf + l, " %s\n",
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				     *(char **)((char *)driv->board_name +
7352fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore						i * driv->offset));
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!driv->num_names)
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			l += sprintf(buf + l, " %s\n", driv->driver_name);
7752fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore	}
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return l;
804be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown}
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8252fc0b026e99b5d5d585095148d997d5634bbc25Bob Moorevoid comedi_proc_init(void)
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct proc_dir_entry *comedi_proc;
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	comedi_proc = create_proc_entry("comedi", S_IFREG | S_IRUGO, NULL);
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (comedi_proc)
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		comedi_proc->read_proc = comedi_read;
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
9044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore
9144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorevoid comedi_proc_cleanup(void)
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	remove_proc_entry("comedi", NULL);
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
954be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown#endif
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds