diff options
Diffstat (limited to 'drivers/input')
| -rw-r--r-- | drivers/input/keyboard/imx_keypad.c | 4 | ||||
| -rw-r--r-- | drivers/input/misc/ab8500-ponkey.c | 4 | ||||
| -rw-r--r-- | drivers/input/mouse/sentelic.c | 11 | ||||
| -rw-r--r-- | drivers/input/serio/ambakmi.c | 6 | ||||
| -rw-r--r-- | drivers/input/serio/i8042-x86ia64io.h | 6 | ||||
| -rw-r--r-- | drivers/input/touchscreen/edt-ft5x06.c | 9 | ||||
| -rw-r--r-- | drivers/input/touchscreen/usbtouchscreen.c | 40 | 
7 files changed, 70 insertions, 10 deletions
diff --git a/drivers/input/keyboard/imx_keypad.c b/drivers/input/keyboard/imx_keypad.c index ce68e361558..cdc252612c0 100644 --- a/drivers/input/keyboard/imx_keypad.c +++ b/drivers/input/keyboard/imx_keypad.c @@ -516,9 +516,9 @@ static int __devinit imx_keypad_probe(struct platform_device *pdev)  	input_set_drvdata(input_dev, keypad);  	/* Ensure that the keypad will stay dormant until opened */ -	clk_enable(keypad->clk); +	clk_prepare_enable(keypad->clk);  	imx_keypad_inhibit(keypad); -	clk_disable(keypad->clk); +	clk_disable_unprepare(keypad->clk);  	error = request_irq(irq, imx_keypad_irq_handler, 0,  			    pdev->name, keypad); diff --git a/drivers/input/misc/ab8500-ponkey.c b/drivers/input/misc/ab8500-ponkey.c index f06231b7cab..84ec691c05a 100644 --- a/drivers/input/misc/ab8500-ponkey.c +++ b/drivers/input/misc/ab8500-ponkey.c @@ -74,8 +74,8 @@ static int __devinit ab8500_ponkey_probe(struct platform_device *pdev)  	ponkey->idev = input;  	ponkey->ab8500 = ab8500; -	ponkey->irq_dbf = ab8500_irq_get_virq(ab8500, irq_dbf); -	ponkey->irq_dbr = ab8500_irq_get_virq(ab8500, irq_dbr); +	ponkey->irq_dbf = irq_dbf; +	ponkey->irq_dbr = irq_dbr;  	input->name = "AB8500 POn(PowerOn) Key";  	input->dev.parent = &pdev->dev; diff --git a/drivers/input/mouse/sentelic.c b/drivers/input/mouse/sentelic.c index 3f5649f1908..a261d857691 100644 --- a/drivers/input/mouse/sentelic.c +++ b/drivers/input/mouse/sentelic.c @@ -721,6 +721,17 @@ static psmouse_ret_t fsp_process_byte(struct psmouse *psmouse)  	switch (psmouse->packet[0] >> FSP_PKT_TYPE_SHIFT) {  	case FSP_PKT_TYPE_ABS: + +		if ((packet[0] == 0x48 || packet[0] == 0x49) && +		    packet[1] == 0 && packet[2] == 0) { +			/* +			 * Ignore coordinate noise when finger leaving the +			 * surface, otherwise cursor may jump to upper-left +			 * corner. +			 */ +			packet[3] &= 0xf0; +		} +  		abs_x = GET_ABS_X(packet);  		abs_y = GET_ABS_Y(packet); diff --git a/drivers/input/serio/ambakmi.c b/drivers/input/serio/ambakmi.c index 2ffd110bd5b..2e77246c2e5 100644 --- a/drivers/input/serio/ambakmi.c +++ b/drivers/input/serio/ambakmi.c @@ -72,7 +72,7 @@ static int amba_kmi_open(struct serio *io)  	unsigned int divisor;  	int ret; -	ret = clk_enable(kmi->clk); +	ret = clk_prepare_enable(kmi->clk);  	if (ret)  		goto out; @@ -92,7 +92,7 @@ static int amba_kmi_open(struct serio *io)  	return 0;   clk_disable: -	clk_disable(kmi->clk); +	clk_disable_unprepare(kmi->clk);   out:  	return ret;  } @@ -104,7 +104,7 @@ static void amba_kmi_close(struct serio *io)  	writeb(0, KMICR);  	free_irq(kmi->irq, kmi); -	clk_disable(kmi->clk); +	clk_disable_unprepare(kmi->clk);  }  static int __devinit amba_kmi_probe(struct amba_device *dev, diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index 6918773ce02..d6cc77a53c7 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h @@ -335,6 +335,12 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = {  	},  	{  		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), +			DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE C850D"), +		}, +	}, +	{ +		.matches = {  			DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"),  			DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"),  		}, diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c index b06a5e3a665..64957770b52 100644 --- a/drivers/input/touchscreen/edt-ft5x06.c +++ b/drivers/input/touchscreen/edt-ft5x06.c @@ -566,9 +566,12 @@ static ssize_t edt_ft5x06_debugfs_raw_data_read(struct file *file,  	}  	read = min_t(size_t, count, tsdata->raw_bufsize - *off); -	error = copy_to_user(buf, tsdata->raw_buffer + *off, read); -	if (!error) -		*off += read; +	if (copy_to_user(buf, tsdata->raw_buffer + *off, read)) { +		error = -EFAULT; +		goto out; +	} + +	*off += read;  out:  	mutex_unlock(&tsdata->mutex);  	return error ?: read; diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c index e32709e0dd6..721fdb3597c 100644 --- a/drivers/input/touchscreen/usbtouchscreen.c +++ b/drivers/input/touchscreen/usbtouchscreen.c @@ -304,6 +304,45 @@ static int e2i_read_data(struct usbtouch_usb *dev, unsigned char *pkt)  #define EGALAX_PKT_TYPE_REPT		0x80  #define EGALAX_PKT_TYPE_DIAG		0x0A +static int egalax_init(struct usbtouch_usb *usbtouch) +{ +	int ret, i; +	unsigned char *buf; +	struct usb_device *udev = interface_to_usbdev(usbtouch->interface); + +	/* +	 * An eGalax diagnostic packet kicks the device into using the right +	 * protocol.  We send a "check active" packet.  The response will be +	 * read later and ignored. +	 */ + +	buf = kmalloc(3, GFP_KERNEL); +	if (!buf) +		return -ENOMEM; + +	buf[0] = EGALAX_PKT_TYPE_DIAG; +	buf[1] = 1;	/* length */ +	buf[2] = 'A';	/* command - check active */ + +	for (i = 0; i < 3; i++) { +		ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), +				      0, +				      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, +				      0, 0, buf, 3, +				      USB_CTRL_SET_TIMEOUT); +		if (ret >= 0) { +			ret = 0; +			break; +		} +		if (ret != -EPIPE) +			break; +	} + +	kfree(buf); + +	return ret; +} +  static int egalax_read_data(struct usbtouch_usb *dev, unsigned char *pkt)  {  	if ((pkt[0] & EGALAX_PKT_TYPE_MASK) != EGALAX_PKT_TYPE_REPT) @@ -1056,6 +1095,7 @@ static struct usbtouch_device_info usbtouch_dev_info[] = {  		.process_pkt	= usbtouch_process_multi,  		.get_pkt_len	= egalax_get_pkt_len,  		.read_data	= egalax_read_data, +		.init		= egalax_init,  	},  #endif  |