Linux 3.12-rc4
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.14 (GNU/Linux) iQEcBAABAgAGBQJSUc9zAAoJEHm+PkMAQRiG9DMH/AtpuAF6LlMRPjrCeuJQ1pyh T0IUO+CsLKO6qtM5IyweP8V6zaasNjIuW1+B6IwVIl8aOrM+M7CwRiKvpey26ldM I8G2ron7hqSOSQqSQs20jN2yGAqQGpYIbTmpdGLAjQ350NNNvEKthbP5SZR5PAmE UuIx5OGEkaOyZXvCZJXU9AZkCxbihlMSt2zFVxybq2pwnGezRUYgCigE81aeyE0I QLwzzMVdkCxtZEpkdJMpLILAz22jN4RoVDbXRa2XC7dA9I2PEEXI9CcLzqCsx2Ii 8eYS+no2K5N2rrpER7JFUB2B/2X8FaVDE+aJBCkfbtwaYTV9UYLq3a/sKVpo1Cs= =xSFJ -----END PGP SIGNATURE----- Merge tag 'v3.12-rc4' into next Merge with mainline to bring in changes to input subsystem that were committed through other trees.
This commit is contained in:
commit
e3c55d406b
8358 changed files with 565336 additions and 243699 deletions
|
|
@ -48,6 +48,7 @@ struct evdev_client {
|
|||
struct evdev *evdev;
|
||||
struct list_head node;
|
||||
int clkid;
|
||||
bool revoked;
|
||||
unsigned int bufsize;
|
||||
struct input_event buffer[];
|
||||
};
|
||||
|
|
@ -164,6 +165,9 @@ static void evdev_pass_values(struct evdev_client *client,
|
|||
struct input_event event;
|
||||
bool wakeup = false;
|
||||
|
||||
if (client->revoked)
|
||||
return;
|
||||
|
||||
event.time = ktime_to_timeval(client->clkid == CLOCK_MONOTONIC ?
|
||||
mono : real);
|
||||
|
||||
|
|
@ -240,7 +244,7 @@ static int evdev_flush(struct file *file, fl_owner_t id)
|
|||
if (retval)
|
||||
return retval;
|
||||
|
||||
if (!evdev->exist)
|
||||
if (!evdev->exist || client->revoked)
|
||||
retval = -ENODEV;
|
||||
else
|
||||
retval = input_flush_device(&evdev->handle, file);
|
||||
|
|
@ -429,7 +433,7 @@ static ssize_t evdev_write(struct file *file, const char __user *buffer,
|
|||
if (retval)
|
||||
return retval;
|
||||
|
||||
if (!evdev->exist) {
|
||||
if (!evdev->exist || client->revoked) {
|
||||
retval = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
|
@ -482,7 +486,7 @@ static ssize_t evdev_read(struct file *file, char __user *buffer,
|
|||
return -EINVAL;
|
||||
|
||||
for (;;) {
|
||||
if (!evdev->exist)
|
||||
if (!evdev->exist || client->revoked)
|
||||
return -ENODEV;
|
||||
|
||||
if (client->packet_head == client->tail &&
|
||||
|
|
@ -511,7 +515,7 @@ static ssize_t evdev_read(struct file *file, char __user *buffer,
|
|||
if (!(file->f_flags & O_NONBLOCK)) {
|
||||
error = wait_event_interruptible(evdev->wait,
|
||||
client->packet_head != client->tail ||
|
||||
!evdev->exist);
|
||||
!evdev->exist || client->revoked);
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
|
|
@ -529,7 +533,11 @@ static unsigned int evdev_poll(struct file *file, poll_table *wait)
|
|||
|
||||
poll_wait(file, &evdev->wait, wait);
|
||||
|
||||
mask = evdev->exist ? POLLOUT | POLLWRNORM : POLLHUP | POLLERR;
|
||||
if (evdev->exist && !client->revoked)
|
||||
mask = POLLOUT | POLLWRNORM;
|
||||
else
|
||||
mask = POLLHUP | POLLERR;
|
||||
|
||||
if (client->packet_head != client->tail)
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
|
||||
|
|
@ -795,6 +803,17 @@ static int evdev_handle_mt_request(struct input_dev *dev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int evdev_revoke(struct evdev *evdev, struct evdev_client *client,
|
||||
struct file *file)
|
||||
{
|
||||
client->revoked = true;
|
||||
evdev_ungrab(evdev, client);
|
||||
input_flush_device(&evdev->handle, file);
|
||||
wake_up_interruptible(&evdev->wait);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long evdev_do_ioctl(struct file *file, unsigned int cmd,
|
||||
void __user *p, int compat_mode)
|
||||
{
|
||||
|
|
@ -857,6 +876,12 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
|
|||
else
|
||||
return evdev_ungrab(evdev, client);
|
||||
|
||||
case EVIOCREVOKE:
|
||||
if (p)
|
||||
return -EINVAL;
|
||||
else
|
||||
return evdev_revoke(evdev, client, file);
|
||||
|
||||
case EVIOCSCLOCKID:
|
||||
if (copy_from_user(&i, p, sizeof(unsigned int)))
|
||||
return -EFAULT;
|
||||
|
|
@ -1002,7 +1027,7 @@ static long evdev_ioctl_handler(struct file *file, unsigned int cmd,
|
|||
if (retval)
|
||||
return retval;
|
||||
|
||||
if (!evdev->exist) {
|
||||
if (!evdev->exist || client->revoked) {
|
||||
retval = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -639,16 +639,18 @@ EXPORT_SYMBOL(gameport_unregister_port);
|
|||
* Gameport driver operations
|
||||
*/
|
||||
|
||||
static ssize_t gameport_driver_show_description(struct device_driver *drv, char *buf)
|
||||
static ssize_t description_show(struct device_driver *drv, char *buf)
|
||||
{
|
||||
struct gameport_driver *driver = to_gameport_driver(drv);
|
||||
return sprintf(buf, "%s\n", driver->description ? driver->description : "(none)");
|
||||
}
|
||||
static DRIVER_ATTR_RO(description);
|
||||
|
||||
static struct driver_attribute gameport_driver_attrs[] = {
|
||||
__ATTR(description, S_IRUGO, gameport_driver_show_description, NULL),
|
||||
__ATTR_NULL
|
||||
static struct attribute *gameport_driver_attrs[] = {
|
||||
&driver_attr_description.attr,
|
||||
NULL
|
||||
};
|
||||
ATTRIBUTE_GROUPS(gameport_driver);
|
||||
|
||||
static int gameport_driver_probe(struct device *dev)
|
||||
{
|
||||
|
|
@ -749,7 +751,7 @@ static int gameport_bus_match(struct device *dev, struct device_driver *drv)
|
|||
static struct bus_type gameport_bus = {
|
||||
.name = "gameport",
|
||||
.dev_attrs = gameport_device_attrs,
|
||||
.drv_attrs = gameport_driver_attrs,
|
||||
.drv_groups = gameport_driver_groups,
|
||||
.match = gameport_bus_match,
|
||||
.probe = gameport_driver_probe,
|
||||
.remove = gameport_driver_remove,
|
||||
|
|
|
|||
|
|
@ -224,7 +224,7 @@ config KEYBOARD_TCA6416
|
|||
|
||||
config KEYBOARD_TCA8418
|
||||
tristate "TCA8418 Keypad Support"
|
||||
depends on I2C && GENERIC_HARDIRQS
|
||||
depends on I2C
|
||||
select INPUT_MATRIXKMAP
|
||||
help
|
||||
This driver implements basic keypad functionality
|
||||
|
|
@ -303,7 +303,7 @@ config KEYBOARD_HP7XX
|
|||
|
||||
config KEYBOARD_LM8323
|
||||
tristate "LM8323 keypad chip"
|
||||
depends on I2C && GENERIC_HARDIRQS
|
||||
depends on I2C
|
||||
depends on LEDS_CLASS
|
||||
help
|
||||
If you say yes here you get support for the National Semiconductor
|
||||
|
|
|
|||
|
|
@ -89,9 +89,9 @@
|
|||
#define USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO 0x025a
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS 0x025b
|
||||
/* MacbookAir6,2 (unibody, June 2013) */
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI 0x0291
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO 0x0292
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS 0x0293
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI 0x0290
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO 0x0291
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS 0x0292
|
||||
|
||||
#define BCM5974_DEVICE(prod) { \
|
||||
.match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \
|
||||
|
|
|
|||
|
|
@ -239,7 +239,6 @@ config SERIO_PS2MULT
|
|||
|
||||
config SERIO_ARC_PS2
|
||||
tristate "ARC PS/2 support"
|
||||
depends on GENERIC_HARDIRQS
|
||||
help
|
||||
Say Y here if you have an ARC FPGA platform with a PS/2
|
||||
controller in it.
|
||||
|
|
|
|||
|
|
@ -176,6 +176,7 @@ static int altera_ps2_remove(struct platform_device *pdev)
|
|||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id altera_ps2_match[] = {
|
||||
{ .compatible = "ALTR,ps2-1.0", },
|
||||
{ .compatible = "altr,ps2-1.0", },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, altera_ps2_match);
|
||||
|
|
|
|||
|
|
@ -732,19 +732,20 @@ EXPORT_SYMBOL(serio_unregister_child_port);
|
|||
* Serio driver operations
|
||||
*/
|
||||
|
||||
static ssize_t serio_driver_show_description(struct device_driver *drv, char *buf)
|
||||
static ssize_t description_show(struct device_driver *drv, char *buf)
|
||||
{
|
||||
struct serio_driver *driver = to_serio_driver(drv);
|
||||
return sprintf(buf, "%s\n", driver->description ? driver->description : "(none)");
|
||||
}
|
||||
static DRIVER_ATTR_RO(description);
|
||||
|
||||
static ssize_t serio_driver_show_bind_mode(struct device_driver *drv, char *buf)
|
||||
static ssize_t bind_mode_show(struct device_driver *drv, char *buf)
|
||||
{
|
||||
struct serio_driver *serio_drv = to_serio_driver(drv);
|
||||
return sprintf(buf, "%s\n", serio_drv->manual_bind ? "manual" : "auto");
|
||||
}
|
||||
|
||||
static ssize_t serio_driver_set_bind_mode(struct device_driver *drv, const char *buf, size_t count)
|
||||
static ssize_t bind_mode_store(struct device_driver *drv, const char *buf, size_t count)
|
||||
{
|
||||
struct serio_driver *serio_drv = to_serio_driver(drv);
|
||||
int retval;
|
||||
|
|
@ -760,14 +761,14 @@ static ssize_t serio_driver_set_bind_mode(struct device_driver *drv, const char
|
|||
|
||||
return retval;
|
||||
}
|
||||
static DRIVER_ATTR_RW(bind_mode);
|
||||
|
||||
|
||||
static struct driver_attribute serio_driver_attrs[] = {
|
||||
__ATTR(description, S_IRUGO, serio_driver_show_description, NULL),
|
||||
__ATTR(bind_mode, S_IWUSR | S_IRUGO,
|
||||
serio_driver_show_bind_mode, serio_driver_set_bind_mode),
|
||||
__ATTR_NULL
|
||||
static struct attribute *serio_driver_attrs[] = {
|
||||
&driver_attr_description.attr,
|
||||
&driver_attr_bind_mode.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(serio_driver);
|
||||
|
||||
static int serio_driver_probe(struct device *dev)
|
||||
{
|
||||
|
|
@ -996,7 +997,7 @@ EXPORT_SYMBOL(serio_interrupt);
|
|||
static struct bus_type serio_bus = {
|
||||
.name = "serio",
|
||||
.dev_attrs = serio_device_attrs,
|
||||
.drv_attrs = serio_driver_attrs,
|
||||
.drv_groups = serio_driver_groups,
|
||||
.match = serio_bus_match,
|
||||
.uevent = serio_uevent,
|
||||
.probe = serio_driver_probe,
|
||||
|
|
|
|||
|
|
@ -389,7 +389,7 @@ config TOUCHSCREEN_MCS5000
|
|||
|
||||
config TOUCHSCREEN_MMS114
|
||||
tristate "MELFAS MMS114 touchscreen"
|
||||
depends on I2C && GENERIC_HARDIRQS
|
||||
depends on I2C
|
||||
help
|
||||
Say Y here if you have the MELFAS MMS114 touchscreen controller
|
||||
chip in your system.
|
||||
|
|
@ -845,7 +845,7 @@ config TOUCHSCREEN_TSC_SERIO
|
|||
|
||||
config TOUCHSCREEN_TSC2005
|
||||
tristate "TSC2005 based touchscreens"
|
||||
depends on SPI_MASTER && GENERIC_HARDIRQS
|
||||
depends on SPI_MASTER
|
||||
help
|
||||
Say Y here if you have a TSC2005 based touchscreen.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue