Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull input layer fixes from Dmitry Torokhov: "Fixes for two recent regressions (in Synaptics PS/2 and uinput drivers) and some more driver fixups" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: Revert "Input: synaptics - fix handling of disabling gesture mode" Input: psmouse - fix data race in __ps2_command Input: elan_i2c - add all valid ic type for i2c/smbus Input: zhenhua - ensure we have BITREVERSE Input: omap4-keypad - fix memory leak Input: serio - fix blocking of parport Input: uinput - fix crash when using ABS events Input: elan_i2c - expand maximum product_id form 0xFF to 0xFFFF Input: elan_i2c - add ic type 0x03 Input: elan_i2c - don't require known iap version Input: imx6ul_tsc - fix controller name Input: imx6ul_tsc - use the preferred method for kzalloc() Input: imx6ul_tsc - check for negative return value Input: imx6ul_tsc - propagate the errors Input: walkera0701 - fix abs() calculations on 64 bit values Input: mms114 - remove unneded semicolons Input: pm8941-pwrkey - remove unneded semicolon Input: fix typo in MT documentation Input: cyapa - fix address of Gen3 devices in device tree documentation
This commit is contained in:
commit
978ab6a009
|
@ -25,7 +25,7 @@ Example:
|
|||
/* Cypress Gen3 touchpad */
|
||||
touchpad@67 {
|
||||
compatible = "cypress,cyapa";
|
||||
reg = <0x24>;
|
||||
reg = <0x67>;
|
||||
interrupt-parent = <&gpio>;
|
||||
interrupts = <2 IRQ_TYPE_EDGE_FALLING>; /* GPIO 2 */
|
||||
wakeup-source;
|
||||
|
|
|
@ -361,7 +361,7 @@ For win8 devices with both T and C coordinates, the position mapping is
|
|||
ABS_MT_POSITION_X := T_X
|
||||
ABS_MT_POSITION_Y := T_Y
|
||||
ABS_MT_TOOL_X := C_X
|
||||
ABS_MT_TOOL_X := C_Y
|
||||
ABS_MT_TOOL_Y := C_Y
|
||||
|
||||
Unfortunately, there is not enough information to specify both the touching
|
||||
ellipse and the tool ellipse, so one has to resort to approximations. One
|
||||
|
|
|
@ -150,7 +150,7 @@ static void walkera0701_irq_handler(void *handler_data)
|
|||
if (w->counter == 24) { /* full frame */
|
||||
walkera0701_parse_frame(w);
|
||||
w->counter = NO_SYNC;
|
||||
if (abs(pulse_time - SYNC_PULSE) < RESERVE) /* new frame sync */
|
||||
if (abs64(pulse_time - SYNC_PULSE) < RESERVE) /* new frame sync */
|
||||
w->counter = 0;
|
||||
} else {
|
||||
if ((pulse_time > (ANALOG_MIN_PULSE - RESERVE)
|
||||
|
@ -161,7 +161,7 @@ static void walkera0701_irq_handler(void *handler_data)
|
|||
} else
|
||||
w->counter = NO_SYNC;
|
||||
}
|
||||
} else if (abs(pulse_time - SYNC_PULSE - BIN0_PULSE) <
|
||||
} else if (abs64(pulse_time - SYNC_PULSE - BIN0_PULSE) <
|
||||
RESERVE + BIN1_PULSE - BIN0_PULSE) /* frame sync .. */
|
||||
w->counter = 0;
|
||||
|
||||
|
|
|
@ -266,7 +266,7 @@ static int omap4_keypad_probe(struct platform_device *pdev)
|
|||
|
||||
error = omap4_keypad_parse_dt(&pdev->dev, keypad_data);
|
||||
if (error)
|
||||
return error;
|
||||
goto err_free_keypad;
|
||||
|
||||
res = request_mem_region(res->start, resource_size(res), pdev->name);
|
||||
if (!res) {
|
||||
|
|
|
@ -93,7 +93,7 @@ static int pm8941_reboot_notify(struct notifier_block *nb,
|
|||
default:
|
||||
reset_type = PON_PS_HOLD_TYPE_HARD_RESET;
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
error = regmap_update_bits(pwrkey->regmap,
|
||||
pwrkey->baseaddr + PON_PS_HOLD_RST_CTL,
|
||||
|
|
|
@ -414,7 +414,7 @@ static int uinput_setup_device(struct uinput_device *udev,
|
|||
dev->id.product = user_dev->id.product;
|
||||
dev->id.version = user_dev->id.version;
|
||||
|
||||
for_each_set_bit(i, dev->absbit, ABS_CNT) {
|
||||
for (i = 0; i < ABS_CNT; i++) {
|
||||
input_abs_set_max(dev, i, user_dev->absmax[i]);
|
||||
input_abs_set_min(dev, i, user_dev->absmin[i]);
|
||||
input_abs_set_fuzz(dev, i, user_dev->absfuzz[i]);
|
||||
|
|
|
@ -60,7 +60,7 @@ struct elan_transport_ops {
|
|||
int (*get_sm_version)(struct i2c_client *client,
|
||||
u8* ic_type, u8 *version);
|
||||
int (*get_checksum)(struct i2c_client *client, bool iap, u16 *csum);
|
||||
int (*get_product_id)(struct i2c_client *client, u8 *id);
|
||||
int (*get_product_id)(struct i2c_client *client, u16 *id);
|
||||
|
||||
int (*get_max)(struct i2c_client *client,
|
||||
unsigned int *max_x, unsigned int *max_y);
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
#include "elan_i2c.h"
|
||||
|
||||
#define DRIVER_NAME "elan_i2c"
|
||||
#define ELAN_DRIVER_VERSION "1.6.0"
|
||||
#define ELAN_DRIVER_VERSION "1.6.1"
|
||||
#define ETP_MAX_PRESSURE 255
|
||||
#define ETP_FWIDTH_REDUCE 90
|
||||
#define ETP_FINGER_WIDTH 15
|
||||
|
@ -76,7 +76,7 @@ struct elan_tp_data {
|
|||
unsigned int x_res;
|
||||
unsigned int y_res;
|
||||
|
||||
u8 product_id;
|
||||
u16 product_id;
|
||||
u8 fw_version;
|
||||
u8 sm_version;
|
||||
u8 iap_version;
|
||||
|
@ -98,15 +98,25 @@ static int elan_get_fwinfo(u8 iap_version, u16 *validpage_count,
|
|||
u16 *signature_address)
|
||||
{
|
||||
switch (iap_version) {
|
||||
case 0x00:
|
||||
case 0x06:
|
||||
case 0x08:
|
||||
*validpage_count = 512;
|
||||
break;
|
||||
case 0x03:
|
||||
case 0x07:
|
||||
case 0x09:
|
||||
case 0x0A:
|
||||
case 0x0B:
|
||||
case 0x0C:
|
||||
*validpage_count = 768;
|
||||
break;
|
||||
case 0x0D:
|
||||
*validpage_count = 896;
|
||||
break;
|
||||
case 0x0E:
|
||||
*validpage_count = 640;
|
||||
break;
|
||||
default:
|
||||
/* unknown ic type clear value */
|
||||
*validpage_count = 0;
|
||||
|
@ -266,11 +276,10 @@ static int elan_query_device_info(struct elan_tp_data *data)
|
|||
|
||||
error = elan_get_fwinfo(data->iap_version, &data->fw_validpage_count,
|
||||
&data->fw_signature_address);
|
||||
if (error) {
|
||||
dev_err(&data->client->dev,
|
||||
"unknown iap version %d\n", data->iap_version);
|
||||
return error;
|
||||
}
|
||||
if (error)
|
||||
dev_warn(&data->client->dev,
|
||||
"unexpected iap version %#04x (ic type: %#04x), firmware update will not work\n",
|
||||
data->iap_version, data->ic_type);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -486,6 +495,9 @@ static ssize_t elan_sysfs_update_fw(struct device *dev,
|
|||
const u8 *fw_signature;
|
||||
static const u8 signature[] = {0xAA, 0x55, 0xCC, 0x33, 0xFF, 0xFF};
|
||||
|
||||
if (data->fw_validpage_count == 0)
|
||||
return -EINVAL;
|
||||
|
||||
/* Look for a firmware with the product id appended. */
|
||||
fw_name = kasprintf(GFP_KERNEL, ETP_FW_NAME, data->product_id);
|
||||
if (!fw_name) {
|
||||
|
|
|
@ -276,7 +276,7 @@ static int elan_i2c_get_sm_version(struct i2c_client *client,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int elan_i2c_get_product_id(struct i2c_client *client, u8 *id)
|
||||
static int elan_i2c_get_product_id(struct i2c_client *client, u16 *id)
|
||||
{
|
||||
int error;
|
||||
u8 val[3];
|
||||
|
@ -287,7 +287,7 @@ static int elan_i2c_get_product_id(struct i2c_client *client, u8 *id)
|
|||
return error;
|
||||
}
|
||||
|
||||
*id = val[0];
|
||||
*id = le16_to_cpup((__le16 *)val);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -183,7 +183,7 @@ static int elan_smbus_get_sm_version(struct i2c_client *client,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int elan_smbus_get_product_id(struct i2c_client *client, u8 *id)
|
||||
static int elan_smbus_get_product_id(struct i2c_client *client, u16 *id)
|
||||
{
|
||||
int error;
|
||||
u8 val[3];
|
||||
|
@ -195,7 +195,7 @@ static int elan_smbus_get_product_id(struct i2c_client *client, u8 *id)
|
|||
return error;
|
||||
}
|
||||
|
||||
*id = val[1];
|
||||
*id = be16_to_cpup((__be16 *)val);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -519,18 +519,14 @@ static int synaptics_set_mode(struct psmouse *psmouse)
|
|||
struct synaptics_data *priv = psmouse->private;
|
||||
|
||||
priv->mode = 0;
|
||||
|
||||
if (priv->absolute_mode) {
|
||||
if (priv->absolute_mode)
|
||||
priv->mode |= SYN_BIT_ABSOLUTE_MODE;
|
||||
if (SYN_CAP_EXTENDED(priv->capabilities))
|
||||
priv->mode |= SYN_BIT_W_MODE;
|
||||
}
|
||||
|
||||
if (!SYN_MODE_WMODE(priv->mode) && priv->disable_gesture)
|
||||
if (priv->disable_gesture)
|
||||
priv->mode |= SYN_BIT_DISABLE_GESTURE;
|
||||
|
||||
if (psmouse->rate >= 80)
|
||||
priv->mode |= SYN_BIT_HIGH_RATE;
|
||||
if (SYN_CAP_EXTENDED(priv->capabilities))
|
||||
priv->mode |= SYN_BIT_W_MODE;
|
||||
|
||||
if (synaptics_mode_cmd(psmouse, priv->mode))
|
||||
return -1;
|
||||
|
|
|
@ -212,12 +212,17 @@ int __ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command)
|
|||
* time before the ACK arrives.
|
||||
*/
|
||||
if (ps2_sendbyte(ps2dev, command & 0xff,
|
||||
command == PS2_CMD_RESET_BAT ? 1000 : 200))
|
||||
goto out;
|
||||
command == PS2_CMD_RESET_BAT ? 1000 : 200)) {
|
||||
serio_pause_rx(ps2dev->serio);
|
||||
goto out_reset_flags;
|
||||
}
|
||||
|
||||
for (i = 0; i < send; i++)
|
||||
if (ps2_sendbyte(ps2dev, param[i], 200))
|
||||
goto out;
|
||||
for (i = 0; i < send; i++) {
|
||||
if (ps2_sendbyte(ps2dev, param[i], 200)) {
|
||||
serio_pause_rx(ps2dev->serio);
|
||||
goto out_reset_flags;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The reset command takes a long time to execute.
|
||||
|
@ -234,17 +239,18 @@ int __ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command)
|
|||
!(ps2dev->flags & PS2_FLAG_CMD), timeout);
|
||||
}
|
||||
|
||||
serio_pause_rx(ps2dev->serio);
|
||||
|
||||
if (param)
|
||||
for (i = 0; i < receive; i++)
|
||||
param[i] = ps2dev->cmdbuf[(receive - 1) - i];
|
||||
|
||||
if (ps2dev->cmdcnt && (command != PS2_CMD_RESET_BAT || ps2dev->cmdcnt != 1))
|
||||
goto out;
|
||||
goto out_reset_flags;
|
||||
|
||||
rc = 0;
|
||||
|
||||
out:
|
||||
serio_pause_rx(ps2dev->serio);
|
||||
out_reset_flags:
|
||||
ps2dev->flags = 0;
|
||||
serio_continue_rx(ps2dev->serio);
|
||||
|
||||
|
|
|
@ -194,6 +194,7 @@ static int __init parkbd_init(void)
|
|||
parkbd_port = parkbd_allocate_serio();
|
||||
if (!parkbd_port) {
|
||||
parport_release(parkbd_dev);
|
||||
parport_unregister_device(parkbd_dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
|
|
@ -94,7 +94,7 @@ struct imx6ul_tsc {
|
|||
* TSC module need ADC to get the measure value. So
|
||||
* before config TSC, we should initialize ADC module.
|
||||
*/
|
||||
static void imx6ul_adc_init(struct imx6ul_tsc *tsc)
|
||||
static int imx6ul_adc_init(struct imx6ul_tsc *tsc)
|
||||
{
|
||||
int adc_hc = 0;
|
||||
int adc_gc;
|
||||
|
@ -122,17 +122,23 @@ static void imx6ul_adc_init(struct imx6ul_tsc *tsc)
|
|||
|
||||
timeout = wait_for_completion_timeout
|
||||
(&tsc->completion, ADC_TIMEOUT);
|
||||
if (timeout == 0)
|
||||
if (timeout == 0) {
|
||||
dev_err(tsc->dev, "Timeout for adc calibration\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
adc_gs = readl(tsc->adc_regs + REG_ADC_GS);
|
||||
if (adc_gs & ADC_CALF)
|
||||
if (adc_gs & ADC_CALF) {
|
||||
dev_err(tsc->dev, "ADC calibration failed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* TSC need the ADC work in hardware trigger */
|
||||
adc_cfg = readl(tsc->adc_regs + REG_ADC_CFG);
|
||||
adc_cfg |= ADC_HARDWARE_TRIGGER;
|
||||
writel(adc_cfg, tsc->adc_regs + REG_ADC_CFG);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -188,11 +194,17 @@ static void imx6ul_tsc_set(struct imx6ul_tsc *tsc)
|
|||
writel(start, tsc->tsc_regs + REG_TSC_FLOW_CONTROL);
|
||||
}
|
||||
|
||||
static void imx6ul_tsc_init(struct imx6ul_tsc *tsc)
|
||||
static int imx6ul_tsc_init(struct imx6ul_tsc *tsc)
|
||||
{
|
||||
imx6ul_adc_init(tsc);
|
||||
int err;
|
||||
|
||||
err = imx6ul_adc_init(tsc);
|
||||
if (err)
|
||||
return err;
|
||||
imx6ul_tsc_channel_config(tsc);
|
||||
imx6ul_tsc_set(tsc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void imx6ul_tsc_disable(struct imx6ul_tsc *tsc)
|
||||
|
@ -311,9 +323,7 @@ static int imx6ul_tsc_open(struct input_dev *input_dev)
|
|||
return err;
|
||||
}
|
||||
|
||||
imx6ul_tsc_init(tsc);
|
||||
|
||||
return 0;
|
||||
return imx6ul_tsc_init(tsc);
|
||||
}
|
||||
|
||||
static void imx6ul_tsc_close(struct input_dev *input_dev)
|
||||
|
@ -337,7 +347,7 @@ static int imx6ul_tsc_probe(struct platform_device *pdev)
|
|||
int tsc_irq;
|
||||
int adc_irq;
|
||||
|
||||
tsc = devm_kzalloc(&pdev->dev, sizeof(struct imx6ul_tsc), GFP_KERNEL);
|
||||
tsc = devm_kzalloc(&pdev->dev, sizeof(*tsc), GFP_KERNEL);
|
||||
if (!tsc)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -345,7 +355,7 @@ static int imx6ul_tsc_probe(struct platform_device *pdev)
|
|||
if (!input_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
input_dev->name = "iMX6UL TouchScreen Controller";
|
||||
input_dev->name = "iMX6UL Touchscreen Controller";
|
||||
input_dev->id.bustype = BUS_HOST;
|
||||
|
||||
input_dev->open = imx6ul_tsc_open;
|
||||
|
@ -406,7 +416,7 @@ static int imx6ul_tsc_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
adc_irq = platform_get_irq(pdev, 1);
|
||||
if (adc_irq <= 0) {
|
||||
if (adc_irq < 0) {
|
||||
dev_err(&pdev->dev, "no adc irq resource?\n");
|
||||
return adc_irq;
|
||||
}
|
||||
|
@ -491,7 +501,7 @@ static int __maybe_unused imx6ul_tsc_resume(struct device *dev)
|
|||
goto out;
|
||||
}
|
||||
|
||||
imx6ul_tsc_init(tsc);
|
||||
retval = imx6ul_tsc_init(tsc);
|
||||
}
|
||||
|
||||
out:
|
||||
|
|
|
@ -394,12 +394,12 @@ static struct mms114_platform_data *mms114_parse_dt(struct device *dev)
|
|||
if (of_property_read_u32(np, "x-size", &pdata->x_size)) {
|
||||
dev_err(dev, "failed to get x-size property\n");
|
||||
return NULL;
|
||||
};
|
||||
}
|
||||
|
||||
if (of_property_read_u32(np, "y-size", &pdata->y_size)) {
|
||||
dev_err(dev, "failed to get y-size property\n");
|
||||
return NULL;
|
||||
};
|
||||
}
|
||||
|
||||
of_property_read_u32(np, "contact-threshold",
|
||||
&pdata->contact_threshold);
|
||||
|
|
Loading…
Reference in New Issue