Commit e19168ff authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

[PATCH] USB: converted brlvger over to new usb_register_dev() changes.

parent b41c55be
...@@ -50,7 +50,6 @@ static const char longbanner[] = { ...@@ -50,7 +50,6 @@ static const char longbanner[] = {
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/atomic.h> #include <asm/atomic.h>
#include <linux/poll.h> #include <linux/poll.h>
#include <linux/devfs_fs_kernel.h>
#include <linux/brlvger.h> #include <linux/brlvger.h>
MODULE_AUTHOR( DRIVER_AUTHOR ); MODULE_AUTHOR( DRIVER_AUTHOR );
...@@ -180,12 +179,6 @@ struct brlvger_priv { ...@@ -180,12 +179,6 @@ struct brlvger_priv {
/* Globals */ /* Globals */
/* Table of connected devices, a different minor for each. */
static struct brlvger_priv *display_table[ MAX_NR_BRLVGER_DEVS ];
/* Mutex for the operation of removing a device from display_table */
static DECLARE_MUTEX(disconnect_sem);
/* For blocking open */ /* For blocking open */
static DECLARE_WAIT_QUEUE_HEAD(open_wait); static DECLARE_WAIT_QUEUE_HEAD(open_wait);
...@@ -237,6 +230,13 @@ static struct file_operations brlvger_fops = ...@@ -237,6 +230,13 @@ static struct file_operations brlvger_fops =
.poll = brlvger_poll, .poll = brlvger_poll,
}; };
static struct usb_class_driver brlvger_class = {
.name = "usb/brlvger%d",
.fops = &brlvger_fops,
.mode = S_IFCHR | S_IRUSR |S_IWUSR | S_IRGRP | S_IWGRP,
.minor_base = BRLVGER_MINOR,
};
static struct usb_driver brlvger_driver = static struct usb_driver brlvger_driver =
{ {
.owner = THIS_MODULE, .owner = THIS_MODULE,
...@@ -254,8 +254,6 @@ __init brlvger_init (void) ...@@ -254,8 +254,6 @@ __init brlvger_init (void)
if(stall_tries < 1 || write_repeats < 1) if(stall_tries < 1 || write_repeats < 1)
return -EINVAL; return -EINVAL;
memset(display_table, 0, sizeof(display_table));
if (usb_register(&brlvger_driver)) { if (usb_register(&brlvger_driver)) {
err("USB registration failed"); err("USB registration failed");
return -ENOSYS; return -ENOSYS;
...@@ -284,14 +282,12 @@ brlvger_probe (struct usb_interface *intf, ...@@ -284,14 +282,12 @@ brlvger_probe (struct usb_interface *intf,
{ {
struct usb_device *dev = interface_to_usbdev(intf); struct usb_device *dev = interface_to_usbdev(intf);
struct brlvger_priv *priv = NULL; struct brlvger_priv *priv = NULL;
int i;
int retval; int retval;
struct usb_endpoint_descriptor *endpoint; struct usb_endpoint_descriptor *endpoint;
struct usb_host_interface *actifsettings; struct usb_host_interface *actifsettings;
/* protects against reentrance: once we've found a free slot /* protects against reentrance: once we've found a free slot
we reserve it.*/ we reserve it.*/
static DECLARE_MUTEX(reserve_sem); static DECLARE_MUTEX(reserve_sem);
char devfs_name[20];
actifsettings = dev->actconfig->interface->altsetting; actifsettings = dev->actconfig->interface->altsetting;
...@@ -311,7 +307,7 @@ brlvger_probe (struct usb_interface *intf, ...@@ -311,7 +307,7 @@ brlvger_probe (struct usb_interface *intf,
down(&reserve_sem); down(&reserve_sem);
retval = usb_register_dev(&brlvger_fops, BRLVGER_MINOR, 1, &i); retval = usb_register_dev(intf, &brlvger_class);
if (retval) { if (retval) {
err("Not able to get a minor for this device."); err("Not able to get a minor for this device.");
goto error; goto error;
...@@ -331,7 +327,7 @@ brlvger_probe (struct usb_interface *intf, ...@@ -331,7 +327,7 @@ brlvger_probe (struct usb_interface *intf,
init_MUTEX(&priv->open_sem); init_MUTEX(&priv->open_sem);
init_MUTEX(&priv->dev_sem); init_MUTEX(&priv->dev_sem);
priv->subminor = i; priv->subminor = intf->minor;
/* we found a interrupt in endpoint */ /* we found a interrupt in endpoint */
priv->in_interrupt = endpoint; priv->in_interrupt = endpoint;
...@@ -372,17 +368,9 @@ brlvger_probe (struct usb_interface *intf, ...@@ -372,17 +368,9 @@ brlvger_probe (struct usb_interface *intf,
}; };
dbg("Display length: %d", priv->plength); dbg("Display length: %d", priv->plength);
sprintf(devfs_name, "usb/brlvger%d", priv->subminor); usb_set_intfdata (intf, priv);
devfs_register(NULL, devfs_name,
DEVFS_FL_DEFAULT, USB_MAJOR,
BRLVGER_MINOR+priv->subminor,
S_IFCHR |S_IRUSR|S_IWUSR |S_IRGRP|S_IWGRP,
&brlvger_fops, NULL);
display_table[i] = priv;
info( "Braille display %d is device major %d minor %d", info( "Braille display %d is device major %d minor %d",
i, USB_MAJOR, BRLVGER_MINOR + i); intf->minor, USB_MAJOR, BRLVGER_MINOR + intf->minor);
/* Tell anyone waiting on a blocking open */ /* Tell anyone waiting on a blocking open */
wake_up_interruptible(&open_wait); wake_up_interruptible(&open_wait);
...@@ -414,12 +402,7 @@ brlvger_disconnect(struct usb_interface *intf) ...@@ -414,12 +402,7 @@ brlvger_disconnect(struct usb_interface *intf)
if(priv){ if(priv){
info("Display %d disconnecting", priv->subminor); info("Display %d disconnecting", priv->subminor);
devfs_remove("usb/brlvger%d", priv->subminor); usb_deregister_dev(intf, &brlvger_class);
usb_deregister_dev(1, priv->subminor);
down(&disconnect_sem);
display_table[priv->subminor] = NULL;
up(&disconnect_sem);
down(&priv->open_sem); down(&priv->open_sem);
down(&priv->dev_sem); down(&priv->dev_sem);
...@@ -450,21 +433,18 @@ static int ...@@ -450,21 +433,18 @@ static int
brlvger_open(struct inode *inode, struct file *file) brlvger_open(struct inode *inode, struct file *file)
{ {
int devnum = minor (inode->i_rdev); int devnum = minor (inode->i_rdev);
struct brlvger_priv *priv; struct usb_interface *intf = NULL;
struct brlvger_priv *priv = NULL;
int n, ret; int n, ret;
if (devnum < BRLVGER_MINOR if (devnum < 0)
|| devnum >= (BRLVGER_MINOR + MAX_NR_BRLVGER_DEVS))
return -ENXIO; return -ENXIO;
n = devnum - BRLVGER_MINOR; n = devnum - BRLVGER_MINOR;
do { do {
down(&disconnect_sem); intf = usb_find_interface(&brlvger_driver, devnum);
priv = display_table[n]; if (!intf) {
if(!priv) {
up(&disconnect_sem);
if (file->f_flags & O_NONBLOCK) { if (file->f_flags & O_NONBLOCK) {
dbg3("Failing non-blocking open: " dbg3("Failing non-blocking open: "
"device %d not connected", n); "device %d not connected", n);
...@@ -475,19 +455,18 @@ brlvger_open(struct inode *inode, struct file *file) ...@@ -475,19 +455,18 @@ brlvger_open(struct inode *inode, struct file *file)
minor is connected. */ minor is connected. */
dbg2("Waiting for device %d to be connected", n); dbg2("Waiting for device %d to be connected", n);
ret = wait_event_interruptible(open_wait, ret = wait_event_interruptible(open_wait,
display_table[n] (intf = usb_find_interface(&brlvger_driver, devnum)));
!= NULL); if (ret) {
if(ret) {
dbg2("Interrupted wait for device %d", n); dbg2("Interrupted wait for device %d", n);
return ret; return ret;
} }
} }
} while(!priv); } while(!intf);
/* We grabbed an existing device. */ priv = usb_get_intfdata(intf);
/* We grabbed an existing device. */
if(down_interruptible(&priv->open_sem)) if(down_interruptible(&priv->open_sem))
return -ERESTARTSYS; return -ERESTARTSYS;
up(&disconnect_sem);
/* Only one process can open each device, no sharing. */ /* Only one process can open each device, no sharing. */
ret = -EBUSY; ret = -EBUSY;
......
...@@ -30,16 +30,8 @@ ...@@ -30,16 +30,8 @@
#define BRLVGER_DISPLAY_OFF 3 #define BRLVGER_DISPLAY_OFF 3
#define BRLVGER_BUZZ 4 #define BRLVGER_BUZZ 4
#ifdef CONFIG_USB_DYNAMIC_MINORS
#define MAX_NR_BRLVGER_DEVS 256
#define BRLVGER_MINOR 0
#else
/* Number of supported devices, and range of covered minors */
#define MAX_NR_BRLVGER_DEVS 4
/* Base minor for the char devices */ /* Base minor for the char devices */
#define BRLVGER_MINOR 128 #define BRLVGER_MINOR 128
#endif
/* Size of some fields */ /* Size of some fields */
#define BRLVGER_HWVER_SIZE 2 #define BRLVGER_HWVER_SIZE 2
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment