Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull input fixes from Dmitry Torokhov: "Just a few assorted driver fixes" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: Input: elants_i2c - fix wake-on-touch Input: elan_i2c - set input device's vendor and product IDs Input: sun4i-lradc-keys - fix typo in binding documentation Input: atmel_mxt_ts - add maxtouch to I2C table for module autoload Input: arizona-haptic - fix disabling of haptics device Input: aiptek - fix crash on detecting device without endpoints Input: atmel_mxt_ts - add generic platform data for Chromebooks Input: parkbd - clear unused function pointers Input: walkera0701 - clear unused function pointers Input: turbografx - clear unused function pointers Input: gamecon - clear unused function pointers Input: db9 - clear unused function pointers
This commit is contained in:
commit
632f8577d6
|
@ -12,7 +12,7 @@ Each key is represented as a sub-node of "allwinner,sun4i-a10-lradc-keys":
|
||||||
Required subnode-properties:
|
Required subnode-properties:
|
||||||
- label: Descriptive name of the key.
|
- label: Descriptive name of the key.
|
||||||
- linux,code: Keycode to emit.
|
- linux,code: Keycode to emit.
|
||||||
- channel: Channel this key is attached to, mut be 0 or 1.
|
- channel: Channel this key is attached to, must be 0 or 1.
|
||||||
- voltage: Voltage in µV at lradc input when this key is pressed.
|
- voltage: Voltage in µV at lradc input when this key is pressed.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
|
@ -592,6 +592,7 @@ static void db9_attach(struct parport *pp)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memset(&db9_parport_cb, 0, sizeof(db9_parport_cb));
|
||||||
db9_parport_cb.flags = PARPORT_FLAG_EXCL;
|
db9_parport_cb.flags = PARPORT_FLAG_EXCL;
|
||||||
|
|
||||||
pd = parport_register_dev_model(pp, "db9", &db9_parport_cb, port_idx);
|
pd = parport_register_dev_model(pp, "db9", &db9_parport_cb, port_idx);
|
||||||
|
|
|
@ -951,6 +951,7 @@ static void gc_attach(struct parport *pp)
|
||||||
pads = gc_cfg[port_idx].args + 1;
|
pads = gc_cfg[port_idx].args + 1;
|
||||||
n_pads = gc_cfg[port_idx].nargs - 1;
|
n_pads = gc_cfg[port_idx].nargs - 1;
|
||||||
|
|
||||||
|
memset(&gc_parport_cb, 0, sizeof(gc_parport_cb));
|
||||||
gc_parport_cb.flags = PARPORT_FLAG_EXCL;
|
gc_parport_cb.flags = PARPORT_FLAG_EXCL;
|
||||||
|
|
||||||
pd = parport_register_dev_model(pp, "gamecon", &gc_parport_cb,
|
pd = parport_register_dev_model(pp, "gamecon", &gc_parport_cb,
|
||||||
|
|
|
@ -181,6 +181,7 @@ static void tgfx_attach(struct parport *pp)
|
||||||
n_buttons = tgfx_cfg[port_idx].args + 1;
|
n_buttons = tgfx_cfg[port_idx].args + 1;
|
||||||
n_devs = tgfx_cfg[port_idx].nargs - 1;
|
n_devs = tgfx_cfg[port_idx].nargs - 1;
|
||||||
|
|
||||||
|
memset(&tgfx_parport_cb, 0, sizeof(tgfx_parport_cb));
|
||||||
tgfx_parport_cb.flags = PARPORT_FLAG_EXCL;
|
tgfx_parport_cb.flags = PARPORT_FLAG_EXCL;
|
||||||
|
|
||||||
pd = parport_register_dev_model(pp, "turbografx", &tgfx_parport_cb,
|
pd = parport_register_dev_model(pp, "turbografx", &tgfx_parport_cb,
|
||||||
|
|
|
@ -218,6 +218,7 @@ static void walkera0701_attach(struct parport *pp)
|
||||||
|
|
||||||
w->parport = pp;
|
w->parport = pp;
|
||||||
|
|
||||||
|
memset(&walkera0701_parport_cb, 0, sizeof(walkera0701_parport_cb));
|
||||||
walkera0701_parport_cb.flags = PARPORT_FLAG_EXCL;
|
walkera0701_parport_cb.flags = PARPORT_FLAG_EXCL;
|
||||||
walkera0701_parport_cb.irq_func = walkera0701_irq_handler;
|
walkera0701_parport_cb.irq_func = walkera0701_irq_handler;
|
||||||
walkera0701_parport_cb.private = w;
|
walkera0701_parport_cb.private = w;
|
||||||
|
|
|
@ -97,8 +97,7 @@ static void arizona_haptics_work(struct work_struct *work)
|
||||||
|
|
||||||
ret = regmap_update_bits(arizona->regmap,
|
ret = regmap_update_bits(arizona->regmap,
|
||||||
ARIZONA_HAPTICS_CONTROL_1,
|
ARIZONA_HAPTICS_CONTROL_1,
|
||||||
ARIZONA_HAP_CTRL_MASK,
|
ARIZONA_HAP_CTRL_MASK, 0);
|
||||||
1 << ARIZONA_HAP_CTRL_SHIFT);
|
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
dev_err(arizona->dev, "Failed to stop haptics: %d\n",
|
dev_err(arizona->dev, "Failed to stop haptics: %d\n",
|
||||||
ret);
|
ret);
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
|
|
||||||
#define DRIVER_NAME "elan_i2c"
|
#define DRIVER_NAME "elan_i2c"
|
||||||
#define ELAN_DRIVER_VERSION "1.6.1"
|
#define ELAN_DRIVER_VERSION "1.6.1"
|
||||||
|
#define ELAN_VENDOR_ID 0x04f3
|
||||||
#define ETP_MAX_PRESSURE 255
|
#define ETP_MAX_PRESSURE 255
|
||||||
#define ETP_FWIDTH_REDUCE 90
|
#define ETP_FWIDTH_REDUCE 90
|
||||||
#define ETP_FINGER_WIDTH 15
|
#define ETP_FINGER_WIDTH 15
|
||||||
|
@ -914,6 +915,8 @@ static int elan_setup_input_device(struct elan_tp_data *data)
|
||||||
|
|
||||||
input->name = "Elan Touchpad";
|
input->name = "Elan Touchpad";
|
||||||
input->id.bustype = BUS_I2C;
|
input->id.bustype = BUS_I2C;
|
||||||
|
input->id.vendor = ELAN_VENDOR_ID;
|
||||||
|
input->id.product = data->product_id;
|
||||||
input_set_drvdata(input, data);
|
input_set_drvdata(input, data);
|
||||||
|
|
||||||
error = input_mt_init_slots(input, ETP_MAX_FINGERS,
|
error = input_mt_init_slots(input, ETP_MAX_FINGERS,
|
||||||
|
|
|
@ -145,6 +145,7 @@ static int parkbd_getport(struct parport *pp)
|
||||||
{
|
{
|
||||||
struct pardev_cb parkbd_parport_cb;
|
struct pardev_cb parkbd_parport_cb;
|
||||||
|
|
||||||
|
memset(&parkbd_parport_cb, 0, sizeof(parkbd_parport_cb));
|
||||||
parkbd_parport_cb.irq_func = parkbd_interrupt;
|
parkbd_parport_cb.irq_func = parkbd_interrupt;
|
||||||
parkbd_parport_cb.flags = PARPORT_FLAG_EXCL;
|
parkbd_parport_cb.flags = PARPORT_FLAG_EXCL;
|
||||||
|
|
||||||
|
|
|
@ -1819,6 +1819,14 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||||
input_set_abs_params(inputdev, ABS_TILT_Y, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0);
|
input_set_abs_params(inputdev, ABS_TILT_Y, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0);
|
||||||
input_set_abs_params(inputdev, ABS_WHEEL, AIPTEK_WHEEL_MIN, AIPTEK_WHEEL_MAX - 1, 0, 0);
|
input_set_abs_params(inputdev, ABS_WHEEL, AIPTEK_WHEEL_MIN, AIPTEK_WHEEL_MAX - 1, 0, 0);
|
||||||
|
|
||||||
|
/* Verify that a device really has an endpoint */
|
||||||
|
if (intf->altsetting[0].desc.bNumEndpoints < 1) {
|
||||||
|
dev_err(&intf->dev,
|
||||||
|
"interface has %d endpoints, but must have minimum 1\n",
|
||||||
|
intf->altsetting[0].desc.bNumEndpoints);
|
||||||
|
err = -EINVAL;
|
||||||
|
goto fail3;
|
||||||
|
}
|
||||||
endpoint = &intf->altsetting[0].endpoint[0].desc;
|
endpoint = &intf->altsetting[0].endpoint[0].desc;
|
||||||
|
|
||||||
/* Go set up our URB, which is called when the tablet receives
|
/* Go set up our URB, which is called when the tablet receives
|
||||||
|
@ -1861,6 +1869,7 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||||
if (i == ARRAY_SIZE(speeds)) {
|
if (i == ARRAY_SIZE(speeds)) {
|
||||||
dev_info(&intf->dev,
|
dev_info(&intf->dev,
|
||||||
"Aiptek tried all speeds, no sane response\n");
|
"Aiptek tried all speeds, no sane response\n");
|
||||||
|
err = -EINVAL;
|
||||||
goto fail3;
|
goto fail3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2487,6 +2487,31 @@ static struct mxt_acpi_platform_data samus_platform_data[] = {
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static unsigned int chromebook_tp_buttons[] = {
|
||||||
|
KEY_RESERVED,
|
||||||
|
KEY_RESERVED,
|
||||||
|
KEY_RESERVED,
|
||||||
|
KEY_RESERVED,
|
||||||
|
KEY_RESERVED,
|
||||||
|
BTN_LEFT
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct mxt_acpi_platform_data chromebook_platform_data[] = {
|
||||||
|
{
|
||||||
|
/* Touchpad */
|
||||||
|
.hid = "ATML0000",
|
||||||
|
.pdata = {
|
||||||
|
.t19_num_keys = ARRAY_SIZE(chromebook_tp_buttons),
|
||||||
|
.t19_keymap = chromebook_tp_buttons,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* Touchscreen */
|
||||||
|
.hid = "ATML0001",
|
||||||
|
},
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
static const struct dmi_system_id mxt_dmi_table[] = {
|
static const struct dmi_system_id mxt_dmi_table[] = {
|
||||||
{
|
{
|
||||||
/* 2015 Google Pixel */
|
/* 2015 Google Pixel */
|
||||||
|
@ -2497,6 +2522,14 @@ static const struct dmi_system_id mxt_dmi_table[] = {
|
||||||
},
|
},
|
||||||
.driver_data = samus_platform_data,
|
.driver_data = samus_platform_data,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
/* Other Google Chromebooks */
|
||||||
|
.ident = "Chromebook",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"),
|
||||||
|
},
|
||||||
|
.driver_data = chromebook_platform_data,
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2701,6 +2734,7 @@ static const struct i2c_device_id mxt_id[] = {
|
||||||
{ "qt602240_ts", 0 },
|
{ "qt602240_ts", 0 },
|
||||||
{ "atmel_mxt_ts", 0 },
|
{ "atmel_mxt_ts", 0 },
|
||||||
{ "atmel_mxt_tp", 0 },
|
{ "atmel_mxt_tp", 0 },
|
||||||
|
{ "maxtouch", 0 },
|
||||||
{ "mXT224", 0 },
|
{ "mXT224", 0 },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
|
@ -1316,7 +1316,13 @@ static int __maybe_unused elants_i2c_suspend(struct device *dev)
|
||||||
|
|
||||||
disable_irq(client->irq);
|
disable_irq(client->irq);
|
||||||
|
|
||||||
if (device_may_wakeup(dev) || ts->keep_power_in_suspend) {
|
if (device_may_wakeup(dev)) {
|
||||||
|
/*
|
||||||
|
* The device will automatically enter idle mode
|
||||||
|
* that has reduced power consumption.
|
||||||
|
*/
|
||||||
|
ts->wake_irq_enabled = (enable_irq_wake(client->irq) == 0);
|
||||||
|
} else if (ts->keep_power_in_suspend) {
|
||||||
for (retry_cnt = 0; retry_cnt < MAX_RETRIES; retry_cnt++) {
|
for (retry_cnt = 0; retry_cnt < MAX_RETRIES; retry_cnt++) {
|
||||||
error = elants_i2c_send(client, set_sleep_cmd,
|
error = elants_i2c_send(client, set_sleep_cmd,
|
||||||
sizeof(set_sleep_cmd));
|
sizeof(set_sleep_cmd));
|
||||||
|
@ -1326,10 +1332,6 @@ static int __maybe_unused elants_i2c_suspend(struct device *dev)
|
||||||
dev_err(&client->dev,
|
dev_err(&client->dev,
|
||||||
"suspend command failed: %d\n", error);
|
"suspend command failed: %d\n", error);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (device_may_wakeup(dev))
|
|
||||||
ts->wake_irq_enabled =
|
|
||||||
(enable_irq_wake(client->irq) == 0);
|
|
||||||
} else {
|
} else {
|
||||||
elants_i2c_power_off(ts);
|
elants_i2c_power_off(ts);
|
||||||
}
|
}
|
||||||
|
@ -1345,10 +1347,11 @@ static int __maybe_unused elants_i2c_resume(struct device *dev)
|
||||||
int retry_cnt;
|
int retry_cnt;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if (device_may_wakeup(dev) && ts->wake_irq_enabled)
|
if (device_may_wakeup(dev)) {
|
||||||
disable_irq_wake(client->irq);
|
if (ts->wake_irq_enabled)
|
||||||
|
disable_irq_wake(client->irq);
|
||||||
if (ts->keep_power_in_suspend) {
|
elants_i2c_sw_reset(client);
|
||||||
|
} else if (ts->keep_power_in_suspend) {
|
||||||
for (retry_cnt = 0; retry_cnt < MAX_RETRIES; retry_cnt++) {
|
for (retry_cnt = 0; retry_cnt < MAX_RETRIES; retry_cnt++) {
|
||||||
error = elants_i2c_send(client, set_active_cmd,
|
error = elants_i2c_send(client, set_active_cmd,
|
||||||
sizeof(set_active_cmd));
|
sizeof(set_active_cmd));
|
||||||
|
|
Loading…
Reference in New Issue