Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d86561b4 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
parents c6c96d7b 36189cc3
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -504,9 +504,12 @@ byte 5:
* reg_10

   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
         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
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+28 −1
Original line number Diff line number Diff line
@@ -243,6 +243,12 @@ static void (*atkbd_platform_fixup)(struct atkbd *, const void *data);
static void *atkbd_platform_fixup_data;
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,
				ssize_t (*handler)(struct atkbd *, char *));
static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count,
@@ -768,6 +774,7 @@ static int atkbd_probe(struct atkbd *atkbd)
 * Make sure nothing is coming from the keyboard and disturbs our
 * internal state.
 */
	if (!atkbd_skip_deactivate)
		atkbd_deactivate(atkbd);

	return 0;
@@ -1638,6 +1645,12 @@ static int __init atkbd_setup_scancode_fixup(const struct dmi_system_id *id)
	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 = {
	{
		.matches = {
@@ -1775,6 +1788,20 @@ static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = {
		.callback = atkbd_setup_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,
	},
	{ }
};

+7 −0
Original line number Diff line number Diff line
@@ -392,6 +392,13 @@ static const struct of_device_id 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

static struct i2c_driver tca8418_keypad_driver = {
+3 −1
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@
#define BMA150_CFG_5_REG	0x11

#define BMA150_CHIP_ID		2
#define BMA180_CHIP_ID		3
#define BMA150_CHIP_ID_REG	BMA150_DATA_0_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);
	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);
		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[] = {
	{ "bma150", 0 },
	{ "bma180", 0 },
	{ "smb380", 0 },
	{ "bma023", 0 },
	{ }
+25 −1
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
 */

#include <linux/delay.h>
#include <linux/dmi.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/input.h>
@@ -831,7 +832,11 @@ static int elantech_set_absolute_mode(struct psmouse *psmouse)
		break;

	case 3:
		if (etd->set_hw_resolution)
			etd->reg_10 = 0x0b;
		else
			etd->reg_10 = 0x03;

		if (elantech_write_reg(psmouse, 0x10, etd->reg_10))
			rc = -1;

@@ -1330,6 +1335,22 @@ static int elantech_reconnect(struct psmouse *psmouse)
	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.
 */
@@ -1390,6 +1411,9 @@ static int elantech_set_properties(struct elantech_data *etd)
	 */
	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;
}

Loading