Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull input subsystem fixes from Dmitry Torokhov: "Just a few fixups to various drivers" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: Input: elantech - fix touchpad initialization on Gigabyte U2442 Input: tca8418 - fix loading this driver as a module from a device tree Input: bma150 - extend chip detection for bma180 Input: atkbd - fix keyboard not working on some LG laptops Input: synaptics - add min/max quirk for ThinkPad Edge E431
This commit is contained in:
Коммит
d86561b4c7
|
@ -504,9 +504,12 @@ byte 5:
|
||||||
* reg_10
|
* reg_10
|
||||||
|
|
||||||
bit 7 6 5 4 3 2 1 0
|
bit 7 6 5 4 3 2 1 0
|
||||||
0 0 0 0 0 0 0 A
|
0 0 0 0 R F T A
|
||||||
|
|
||||||
A: 1 = enable absolute tracking
|
A: 1 = enable absolute tracking
|
||||||
|
T: 1 = enable two finger mode auto correct
|
||||||
|
F: 1 = disable ABS Position Filter
|
||||||
|
R: 1 = enable real hardware resolution
|
||||||
|
|
||||||
6.2 Native absolute mode 6 byte packet format
|
6.2 Native absolute mode 6 byte packet format
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
|
@ -243,6 +243,12 @@ static void (*atkbd_platform_fixup)(struct atkbd *, const void *data);
|
||||||
static void *atkbd_platform_fixup_data;
|
static void *atkbd_platform_fixup_data;
|
||||||
static unsigned int (*atkbd_platform_scancode_fixup)(struct atkbd *, unsigned int);
|
static unsigned int (*atkbd_platform_scancode_fixup)(struct atkbd *, unsigned int);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Certain keyboards to not like ATKBD_CMD_RESET_DIS and stop responding
|
||||||
|
* to many commands until full reset (ATKBD_CMD_RESET_BAT) is performed.
|
||||||
|
*/
|
||||||
|
static bool atkbd_skip_deactivate;
|
||||||
|
|
||||||
static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf,
|
static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf,
|
||||||
ssize_t (*handler)(struct atkbd *, char *));
|
ssize_t (*handler)(struct atkbd *, char *));
|
||||||
static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count,
|
static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count,
|
||||||
|
@ -768,7 +774,8 @@ static int atkbd_probe(struct atkbd *atkbd)
|
||||||
* Make sure nothing is coming from the keyboard and disturbs our
|
* Make sure nothing is coming from the keyboard and disturbs our
|
||||||
* internal state.
|
* internal state.
|
||||||
*/
|
*/
|
||||||
atkbd_deactivate(atkbd);
|
if (!atkbd_skip_deactivate)
|
||||||
|
atkbd_deactivate(atkbd);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1638,6 +1645,12 @@ static int __init atkbd_setup_scancode_fixup(const struct dmi_system_id *id)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __init atkbd_deactivate_fixup(const struct dmi_system_id *id)
|
||||||
|
{
|
||||||
|
atkbd_skip_deactivate = true;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = {
|
static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = {
|
||||||
{
|
{
|
||||||
.matches = {
|
.matches = {
|
||||||
|
@ -1775,6 +1788,20 @@ static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = {
|
||||||
.callback = atkbd_setup_scancode_fixup,
|
.callback = atkbd_setup_scancode_fixup,
|
||||||
.driver_data = atkbd_oqo_01plus_scancode_fixup,
|
.driver_data = atkbd_oqo_01plus_scancode_fixup,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "LW25-B7HV"),
|
||||||
|
},
|
||||||
|
.callback = atkbd_deactivate_fixup,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "P1-J273B"),
|
||||||
|
},
|
||||||
|
.callback = atkbd_deactivate_fixup,
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -392,6 +392,13 @@ static const struct of_device_id tca8418_dt_ids[] = {
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, tca8418_dt_ids);
|
MODULE_DEVICE_TABLE(of, tca8418_dt_ids);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The device tree based i2c loader looks for
|
||||||
|
* "i2c:" + second_component_of(property("compatible"))
|
||||||
|
* and therefore we need an alias to be found.
|
||||||
|
*/
|
||||||
|
MODULE_ALIAS("i2c:tca8418");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct i2c_driver tca8418_keypad_driver = {
|
static struct i2c_driver tca8418_keypad_driver = {
|
||||||
|
|
|
@ -70,6 +70,7 @@
|
||||||
#define BMA150_CFG_5_REG 0x11
|
#define BMA150_CFG_5_REG 0x11
|
||||||
|
|
||||||
#define BMA150_CHIP_ID 2
|
#define BMA150_CHIP_ID 2
|
||||||
|
#define BMA180_CHIP_ID 3
|
||||||
#define BMA150_CHIP_ID_REG BMA150_DATA_0_REG
|
#define BMA150_CHIP_ID_REG BMA150_DATA_0_REG
|
||||||
|
|
||||||
#define BMA150_ACC_X_LSB_REG BMA150_DATA_2_REG
|
#define BMA150_ACC_X_LSB_REG BMA150_DATA_2_REG
|
||||||
|
@ -539,7 +540,7 @@ static int bma150_probe(struct i2c_client *client,
|
||||||
}
|
}
|
||||||
|
|
||||||
chip_id = i2c_smbus_read_byte_data(client, BMA150_CHIP_ID_REG);
|
chip_id = i2c_smbus_read_byte_data(client, BMA150_CHIP_ID_REG);
|
||||||
if (chip_id != BMA150_CHIP_ID) {
|
if (chip_id != BMA150_CHIP_ID && chip_id != BMA180_CHIP_ID) {
|
||||||
dev_err(&client->dev, "BMA150 chip id error: %d\n", chip_id);
|
dev_err(&client->dev, "BMA150 chip id error: %d\n", chip_id);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -643,6 +644,7 @@ static UNIVERSAL_DEV_PM_OPS(bma150_pm, bma150_suspend, bma150_resume, NULL);
|
||||||
|
|
||||||
static const struct i2c_device_id bma150_id[] = {
|
static const struct i2c_device_id bma150_id[] = {
|
||||||
{ "bma150", 0 },
|
{ "bma150", 0 },
|
||||||
|
{ "bma180", 0 },
|
||||||
{ "smb380", 0 },
|
{ "smb380", 0 },
|
||||||
{ "bma023", 0 },
|
{ "bma023", 0 },
|
||||||
{ }
|
{ }
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
#include <linux/dmi.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
|
@ -831,7 +832,11 @@ static int elantech_set_absolute_mode(struct psmouse *psmouse)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
etd->reg_10 = 0x0b;
|
if (etd->set_hw_resolution)
|
||||||
|
etd->reg_10 = 0x0b;
|
||||||
|
else
|
||||||
|
etd->reg_10 = 0x03;
|
||||||
|
|
||||||
if (elantech_write_reg(psmouse, 0x10, etd->reg_10))
|
if (elantech_write_reg(psmouse, 0x10, etd->reg_10))
|
||||||
rc = -1;
|
rc = -1;
|
||||||
|
|
||||||
|
@ -1330,6 +1335,22 @@ static int elantech_reconnect(struct psmouse *psmouse)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some hw_version 3 models go into error state when we try to set bit 3 of r10
|
||||||
|
*/
|
||||||
|
static const struct dmi_system_id no_hw_res_dmi_table[] = {
|
||||||
|
#if defined(CONFIG_DMI) && defined(CONFIG_X86)
|
||||||
|
{
|
||||||
|
/* Gigabyte U2442 */
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "U2442"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* determine hardware version and set some properties according to it.
|
* determine hardware version and set some properties according to it.
|
||||||
*/
|
*/
|
||||||
|
@ -1390,6 +1411,9 @@ static int elantech_set_properties(struct elantech_data *etd)
|
||||||
*/
|
*/
|
||||||
etd->crc_enabled = ((etd->fw_version & 0x4000) == 0x4000);
|
etd->crc_enabled = ((etd->fw_version & 0x4000) == 0x4000);
|
||||||
|
|
||||||
|
/* Enable real hardware resolution on hw_version 3 ? */
|
||||||
|
etd->set_hw_resolution = !dmi_check_system(no_hw_res_dmi_table);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -130,6 +130,7 @@ struct elantech_data {
|
||||||
bool jumpy_cursor;
|
bool jumpy_cursor;
|
||||||
bool reports_pressure;
|
bool reports_pressure;
|
||||||
bool crc_enabled;
|
bool crc_enabled;
|
||||||
|
bool set_hw_resolution;
|
||||||
unsigned char hw_version;
|
unsigned char hw_version;
|
||||||
unsigned int fw_version;
|
unsigned int fw_version;
|
||||||
unsigned int single_finger_reports;
|
unsigned int single_finger_reports;
|
||||||
|
|
|
@ -1565,6 +1565,14 @@ static const struct dmi_system_id min_max_dmi_table[] __initconst = {
|
||||||
},
|
},
|
||||||
.driver_data = (int []){1232, 5710, 1156, 4696},
|
.driver_data = (int []){1232, 5710, 1156, 4696},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
/* Lenovo ThinkPad Edge E431 */
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad Edge E431"),
|
||||||
|
},
|
||||||
|
.driver_data = (int []){1024, 5022, 2508, 4832},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
/* Lenovo ThinkPad T431s */
|
/* Lenovo ThinkPad T431s */
|
||||||
.matches = {
|
.matches = {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче