diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | kernel/mpio.c | 34 |
2 files changed, 28 insertions, 10 deletions
@@ -1,3 +1,7 @@ +2002-11-01 Yuji Touya <salmoon@users.sourceforge.net> + + * kernel/mpio.c: Add usbdevfs filesystem support + 2002-10-29 Andreas Buesching <crunchy@tzi.de> * mpiosh/mpiosh.c (mpiosh_init): uses the new configuration file diff --git a/kernel/mpio.c b/kernel/mpio.c index 7ee67cb..54a336d 100644 --- a/kernel/mpio.c +++ b/kernel/mpio.c @@ -46,6 +46,7 @@ #include <linux/spinlock.h> #include <linux/usb.h> #include <linux/smp_lock.h> +#include <linux/devfs_fs_kernel.h> #ifdef CONFIG_USB_DEBUG # define DEBUG @@ -56,7 +57,7 @@ /* * Version Information */ -#define DRIVER_VERSION "0.0.1" +#define DRIVER_VERSION "0.0.2" #define DRIVER_AUTHOR "Yuji Touya <salmoon@users.sourceforge.net>" #define DRIVER_DESC "USB MPIO driver" @@ -71,6 +72,7 @@ struct mpio_usb_data { struct usb_device *mpio_dev; /* init: probe_mpio */ + devfs_handle_t devfs; /* devfs device */ unsigned int ifnum; /* Interface number of the USB device */ int isopen; /* nz if open */ int present; /* Device is present on the bus */ @@ -80,6 +82,8 @@ struct mpio_usb_data { struct semaphore lock; /* general race avoidance */ }; +extern devfs_handle_t usb_devfs_handle; /* /dev/usb dir. */ + static struct mpio_usb_data mpio_instance; static int open_mpio(struct inode *inode, struct file *file) @@ -275,6 +279,15 @@ read_mpio(struct file *file, char *buffer, size_t count, loff_t * ppos) return read_count; } +static struct +file_operations usb_mpio_fops = { + read: read_mpio, + write: write_mpio, +/* ioctl: ioctl_mpio, */ + open: open_mpio, + release: close_mpio, +}; + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) /* Hmm, .... */ static void *probe_mpio(struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id) @@ -313,6 +326,14 @@ static void *probe_mpio(struct usb_device *dev, unsigned int ifnum) } dbg("probe_mpio: ibuf address:%p", mpio->ibuf); + mpio->devfs = devfs_register(usb_devfs_handle, "mpio", + DEVFS_FL_DEFAULT, USB_MAJOR, + MPIO_MINOR, + S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | + S_IWGRP, &usb_mpio_fops, NULL); + if (mpio->devfs == NULL) + dbg("probe_mpio: device node registration failed"); + init_MUTEX(&(mpio->lock)); return mpio; @@ -322,6 +343,8 @@ static void disconnect_mpio(struct usb_device *dev, void *ptr) { struct mpio_usb_data *mpio = (struct mpio_usb_data *) ptr; + devfs_unregister(mpio->devfs); + if (mpio->isopen) { mpio->isopen = 0; /* better let it finish - the release will do whats needed */ @@ -336,15 +359,6 @@ static void disconnect_mpio(struct usb_device *dev, void *ptr) mpio->present = 0; } -static struct -file_operations usb_mpio_fops = { - read: read_mpio, - write: write_mpio, -/* ioctl: ioctl_mpio, */ - open: open_mpio, - release: close_mpio, -}; - #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) static struct usb_device_id mpio_table [] = { { USB_DEVICE(0x2735, 1) }, /* MPIO-* (all models?) */ |