diff options
Diffstat (limited to 'drivers/input/evdev.c')
| -rw-r--r-- | drivers/input/evdev.c | 20 | 
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index 3738d173f9a..9f2352bd834 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c @@ -20,7 +20,6 @@  #include <linux/major.h>  #include <linux/smp_lock.h>  #include <linux/device.h> -#include <linux/devfs_fs_kernel.h>  #include <linux/compat.h>  struct evdev { @@ -566,6 +565,7 @@ static long evdev_ioctl_compat(struct file *file, unsigned int cmd, unsigned lon  						case EV_LED: bits = dev->ledbit; max = LED_MAX; break;  						case EV_SND: bits = dev->sndbit; max = SND_MAX; break;  						case EV_FF:  bits = dev->ffbit;  max = FF_MAX;  break; +						case EV_SW:  bits = dev->swbit;  max = SW_MAX;  break;  						default: return -EINVAL;  					}  					bit_to_user(bits, max); @@ -580,6 +580,9 @@ static long evdev_ioctl_compat(struct file *file, unsigned int cmd, unsigned lon  				if (_IOC_NR(cmd) == _IOC_NR(EVIOCGSND(0)))  					bit_to_user(dev->snd, SND_MAX); +				if (_IOC_NR(cmd) == _IOC_NR(EVIOCGSW(0))) +					bit_to_user(dev->sw, SW_MAX); +  				if (_IOC_NR(cmd) == _IOC_NR(EVIOCGNAME(0))) {  					int len;  					if (!dev->name) return -ENOENT; @@ -662,6 +665,7 @@ static struct file_operations evdev_fops = {  static struct input_handle *evdev_connect(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id)  {  	struct evdev *evdev; +	struct class_device *cdev;  	int minor;  	for (minor = 0; minor < EVDEV_MINORS && evdev_table[minor]; minor++); @@ -687,11 +691,13 @@ static struct input_handle *evdev_connect(struct input_handler *handler, struct  	evdev_table[minor] = evdev; -	devfs_mk_cdev(MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor), -			S_IFCHR|S_IRUGO|S_IWUSR, "input/event%d", minor); -	class_device_create(input_class, +	cdev = class_device_create(&input_class, &dev->cdev,  			MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor), -			dev->dev, "event%d", minor); +			dev->cdev.dev, evdev->name); + +	/* temporary symlink to keep userspace happy */ +	sysfs_create_link(&input_class.subsys.kset.kobj, &cdev->kobj, +			  evdev->name);  	return &evdev->handle;  } @@ -701,9 +707,9 @@ static void evdev_disconnect(struct input_handle *handle)  	struct evdev *evdev = handle->private;  	struct evdev_list *list; -	class_device_destroy(input_class, +	sysfs_remove_link(&input_class.subsys.kset.kobj, evdev->name); +	class_device_destroy(&input_class,  			MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + evdev->minor)); -	devfs_remove("input/event%d", evdev->minor);  	evdev->exist = 0;  	if (evdev->open) {  | 
