Linux v4.0-7300-g4fc8adcfec3d
- Patch from Benjamin Tissoires to fix 3 finger tap on synaptics (rhbz 1212230) - Add patch to support touchpad on Google Pixel 2 (rhbz 1209088)
This commit is contained in:
parent
9b68c8a1f7
commit
8b91e0bbd8
223
Input-atmel_mxt_ts-add-support-for-Google-Pixel-2.patch
Normal file
223
Input-atmel_mxt_ts-add-support-for-Google-Pixel-2.patch
Normal file
@ -0,0 +1,223 @@
|
|||||||
|
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
|
||||||
|
Date: Tue, 7 Apr 2015 16:30:01 -0700
|
||||||
|
Subject: [PATCH] Input: atmel_mxt_ts - add support for Google Pixel 2
|
||||||
|
|
||||||
|
This change allows atmel_mxt_ts to bind to ACPI-enumerated devices in
|
||||||
|
Google Pixel 2 (2015).
|
||||||
|
|
||||||
|
While newer version of ACPI standard allow use of device-tree-like
|
||||||
|
properties in device descriptions, the version of ACPI implemented in
|
||||||
|
Google BIOS does not support them, and we have to resort to DMI data to
|
||||||
|
specify exact characteristics of the devices (touchpad vs. touchscreen,
|
||||||
|
GPIO to button mapping, etc).
|
||||||
|
|
||||||
|
Pixel 1 continues to use i2c devices and platform data created by
|
||||||
|
chromeos-laptop driver, since ACPI does not enumerate them.
|
||||||
|
|
||||||
|
Reviewed-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>
|
||||||
|
Tested-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>
|
||||||
|
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
|
||||||
|
---
|
||||||
|
drivers/input/touchscreen/atmel_mxt_ts.c | 141 ++++++++++++++++++++++++++++---
|
||||||
|
1 file changed, 130 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
|
||||||
|
index 2875ddf37289..40b98dda8f38 100644
|
||||||
|
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
|
||||||
|
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
|
||||||
|
@@ -14,6 +14,8 @@
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
+#include <linux/acpi.h>
|
||||||
|
+#include <linux/dmi.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/completion.h>
|
||||||
|
@@ -2371,7 +2373,7 @@ static void mxt_input_close(struct input_dev *dev)
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_OF
|
||||||
|
-static struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
|
||||||
|
+static const struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
|
||||||
|
{
|
||||||
|
struct mxt_platform_data *pdata;
|
||||||
|
u32 *keymap;
|
||||||
|
@@ -2379,7 +2381,7 @@ static struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
|
||||||
|
int proplen, i, ret;
|
||||||
|
|
||||||
|
if (!client->dev.of_node)
|
||||||
|
- return ERR_PTR(-ENODEV);
|
||||||
|
+ return ERR_PTR(-ENOENT);
|
||||||
|
|
||||||
|
pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
|
||||||
|
if (!pdata)
|
||||||
|
@@ -2410,25 +2412,132 @@ static struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
|
||||||
|
return pdata;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
-static struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
|
||||||
|
+static const struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
|
||||||
|
{
|
||||||
|
- dev_dbg(&client->dev, "No platform data specified\n");
|
||||||
|
- return ERR_PTR(-EINVAL);
|
||||||
|
+ return ERR_PTR(-ENOENT);
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#ifdef CONFIG_ACPI
|
||||||
|
+
|
||||||
|
+struct mxt_acpi_platform_data {
|
||||||
|
+ const char *hid;
|
||||||
|
+ struct mxt_platform_data pdata;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static unsigned int samus_touchpad_buttons[] = {
|
||||||
|
+ KEY_RESERVED,
|
||||||
|
+ KEY_RESERVED,
|
||||||
|
+ KEY_RESERVED,
|
||||||
|
+ BTN_LEFT
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static struct mxt_acpi_platform_data samus_platform_data[] = {
|
||||||
|
+ {
|
||||||
|
+ /* Touchpad */
|
||||||
|
+ .hid = "ATML0000",
|
||||||
|
+ .pdata = {
|
||||||
|
+ .t19_num_keys = ARRAY_SIZE(samus_touchpad_buttons),
|
||||||
|
+ .t19_keymap = samus_touchpad_buttons,
|
||||||
|
+ },
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ /* Touchscreen */
|
||||||
|
+ .hid = "ATML0001",
|
||||||
|
+ },
|
||||||
|
+ { }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct dmi_system_id mxt_dmi_table[] = {
|
||||||
|
+ {
|
||||||
|
+ /* 2015 Google Pixel */
|
||||||
|
+ .ident = "Chromebook Pixel 2",
|
||||||
|
+ .matches = {
|
||||||
|
+ DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"),
|
||||||
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "Samus"),
|
||||||
|
+ },
|
||||||
|
+ .driver_data = samus_platform_data,
|
||||||
|
+ },
|
||||||
|
+ { }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct mxt_platform_data *mxt_parse_acpi(struct i2c_client *client)
|
||||||
|
+{
|
||||||
|
+ struct acpi_device *adev;
|
||||||
|
+ const struct dmi_system_id *system_id;
|
||||||
|
+ const struct mxt_acpi_platform_data *acpi_pdata;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Ignore ACPI devices representing bootloader mode.
|
||||||
|
+ *
|
||||||
|
+ * This is a bit of a hack: Google Chromebook BIOS creates ACPI
|
||||||
|
+ * devices for both application and bootloader modes, but we are
|
||||||
|
+ * interested in application mode only (if device is in bootloader
|
||||||
|
+ * mode we'll end up switching into application anyway). So far
|
||||||
|
+ * application mode addresses were all above 0x40, so we'll use it
|
||||||
|
+ * as a threshold.
|
||||||
|
+ */
|
||||||
|
+ if (client->addr < 0x40)
|
||||||
|
+ return ERR_PTR(-ENXIO);
|
||||||
|
+
|
||||||
|
+ adev = ACPI_COMPANION(&client->dev);
|
||||||
|
+ if (!adev)
|
||||||
|
+ return ERR_PTR(-ENOENT);
|
||||||
|
+
|
||||||
|
+ system_id = dmi_first_match(mxt_dmi_table);
|
||||||
|
+ if (!system_id)
|
||||||
|
+ return ERR_PTR(-ENOENT);
|
||||||
|
+
|
||||||
|
+ acpi_pdata = system_id->driver_data;
|
||||||
|
+ if (!acpi_pdata)
|
||||||
|
+ return ERR_PTR(-ENOENT);
|
||||||
|
+
|
||||||
|
+ while (acpi_pdata->hid) {
|
||||||
|
+ if (!strcmp(acpi_device_hid(adev), acpi_pdata->hid))
|
||||||
|
+ return &acpi_pdata->pdata;
|
||||||
|
+
|
||||||
|
+ acpi_pdata++;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return ERR_PTR(-ENOENT);
|
||||||
|
+}
|
||||||
|
+#else
|
||||||
|
+static const struct mxt_platform_data *mxt_parse_acpi(struct i2c_client *client)
|
||||||
|
+{
|
||||||
|
+ return ERR_PTR(-ENOENT);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+static const struct mxt_platform_data *
|
||||||
|
+mxt_get_platform_data(struct i2c_client *client)
|
||||||
|
+{
|
||||||
|
+ const struct mxt_platform_data *pdata;
|
||||||
|
+
|
||||||
|
+ pdata = dev_get_platdata(&client->dev);
|
||||||
|
+ if (pdata)
|
||||||
|
+ return pdata;
|
||||||
|
+
|
||||||
|
+ pdata = mxt_parse_dt(client);
|
||||||
|
+ if (!IS_ERR(pdata) || PTR_ERR(pdata) != -ENOENT)
|
||||||
|
+ return pdata;
|
||||||
|
+
|
||||||
|
+ pdata = mxt_parse_acpi(client);
|
||||||
|
+ if (!IS_ERR(pdata) || PTR_ERR(pdata) != -ENOENT)
|
||||||
|
+ return pdata;
|
||||||
|
+
|
||||||
|
+ dev_err(&client->dev, "No platform data specified\n");
|
||||||
|
+ return ERR_PTR(-EINVAL);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
||||||
|
{
|
||||||
|
struct mxt_data *data;
|
||||||
|
const struct mxt_platform_data *pdata;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
- pdata = dev_get_platdata(&client->dev);
|
||||||
|
- if (!pdata) {
|
||||||
|
- pdata = mxt_parse_dt(client);
|
||||||
|
- if (IS_ERR(pdata))
|
||||||
|
- return PTR_ERR(pdata);
|
||||||
|
- }
|
||||||
|
+ pdata = mxt_get_platform_data(client);
|
||||||
|
+ if (IS_ERR(pdata))
|
||||||
|
+ return PTR_ERR(pdata);
|
||||||
|
|
||||||
|
data = kzalloc(sizeof(struct mxt_data), GFP_KERNEL);
|
||||||
|
if (!data) {
|
||||||
|
@@ -2536,6 +2645,15 @@ static const struct of_device_id mxt_of_match[] = {
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, mxt_of_match);
|
||||||
|
|
||||||
|
+#ifdef CONFIG_ACPI
|
||||||
|
+static const struct acpi_device_id mxt_acpi_id[] = {
|
||||||
|
+ { "ATML0000", 0 }, /* Touchpad */
|
||||||
|
+ { "ATML0001", 0 }, /* Touchscreen */
|
||||||
|
+ { }
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(acpi, mxt_acpi_id);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
static const struct i2c_device_id mxt_id[] = {
|
||||||
|
{ "qt602240_ts", 0 },
|
||||||
|
{ "atmel_mxt_ts", 0 },
|
||||||
|
@@ -2550,6 +2668,7 @@ static struct i2c_driver mxt_driver = {
|
||||||
|
.name = "atmel_mxt_ts",
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
.of_match_table = of_match_ptr(mxt_of_match),
|
||||||
|
+ .acpi_match_table = ACPI_PTR(mxt_acpi_id),
|
||||||
|
.pm = &mxt_pm_ops,
|
||||||
|
},
|
||||||
|
.probe = mxt_probe,
|
||||||
|
--
|
||||||
|
2.1.0
|
||||||
|
|
50
Input-synaptics-pin-3-touches-when-the-firmware-repo.patch
Normal file
50
Input-synaptics-pin-3-touches-when-the-firmware-repo.patch
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
|
||||||
|
Date: Thu, 16 Apr 2015 13:01:46 -0400
|
||||||
|
Subject: [PATCH] Input - synaptics: pin 3 touches when the firmware reports 3
|
||||||
|
fingers
|
||||||
|
|
||||||
|
Synaptics PS/2 touchpad can send only 2 touches in a report. They can
|
||||||
|
detect 4 or 5 and this information is valuable.
|
||||||
|
|
||||||
|
In commit 63c4fda (Input: synaptics - allocate 3 slots to keep stability
|
||||||
|
in image sensors), we allocate 3 slots, but we still continue to report
|
||||||
|
the 2 available fingers. That means that the client sees 2 used slots while
|
||||||
|
there is a total of 3 fingers advertised by BTN_TOOL_TRIPLETAP.
|
||||||
|
|
||||||
|
For old kernels this is not a problem because max_slots was 2 and libinput/
|
||||||
|
xorg-synaptics knew how to deal with that. Now that max_slot is 3, the
|
||||||
|
clients ignore BTN_TOOL_TRIPLETAP and count the actual used slots (so 2).
|
||||||
|
It then gets confused when receiving the BTN_TOOL_TRIPLETAP and DOUBLETAP
|
||||||
|
information, and goes wild.
|
||||||
|
|
||||||
|
We can pin the 3 slots until we get a total number of fingers below 2.
|
||||||
|
|
||||||
|
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1212230
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/input/mouse/synaptics.c | 8 ++++++++
|
||||||
|
1 file changed, 8 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
|
||||||
|
index 630af73e98c4..c69b308beb3f 100644
|
||||||
|
--- a/drivers/input/mouse/synaptics.c
|
||||||
|
+++ b/drivers/input/mouse/synaptics.c
|
||||||
|
@@ -935,6 +935,14 @@ static void synaptics_report_mt_data(struct psmouse *psmouse,
|
||||||
|
input_report_abs(dev, ABS_MT_PRESSURE, hw[i]->z);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* keep (slot count <= num_fingers) by pinning all slots */
|
||||||
|
+ if (num_fingers >= 3) {
|
||||||
|
+ for (i = 0; i < 3; i++) {
|
||||||
|
+ input_mt_slot(dev, i);
|
||||||
|
+ input_mt_report_slot_state(dev, MT_TOOL_FINGER, true);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
input_mt_drop_unused(dev);
|
||||||
|
|
||||||
|
/* Don't use active slot count to generate BTN_TOOL events. */
|
||||||
|
--
|
||||||
|
2.1.0
|
||||||
|
|
19
kernel.spec
19
kernel.spec
@ -67,7 +67,7 @@ Summary: The Linux kernel
|
|||||||
# The rc snapshot level
|
# The rc snapshot level
|
||||||
%define rcrev 0
|
%define rcrev 0
|
||||||
# The git snapshot level
|
# The git snapshot level
|
||||||
%define gitrev 6
|
%define gitrev 7
|
||||||
# Set rpm version accordingly
|
# Set rpm version accordingly
|
||||||
%define rpmversion 4.%{upstream_sublevel}.0
|
%define rpmversion 4.%{upstream_sublevel}.0
|
||||||
%endif
|
%endif
|
||||||
@ -611,6 +611,12 @@ Patch26138: ext4-Allocate-entire-range-in-zero-range.patch
|
|||||||
#CVE-2015-2150 rhbz 1196266 1200397
|
#CVE-2015-2150 rhbz 1196266 1200397
|
||||||
Patch26175: xen-pciback-Don-t-disable-PCI_COMMAND-on-PCI-device-.patch
|
Patch26175: xen-pciback-Don-t-disable-PCI_COMMAND-on-PCI-device-.patch
|
||||||
|
|
||||||
|
#rhbz 1212230
|
||||||
|
Patch26176: Input-synaptics-pin-3-touches-when-the-firmware-repo.patch
|
||||||
|
|
||||||
|
#rhbz 1209088
|
||||||
|
Patch26177: Input-atmel_mxt_ts-add-support-for-Google-Pixel-2.patch
|
||||||
|
|
||||||
# END OF PATCH DEFINITIONS
|
# END OF PATCH DEFINITIONS
|
||||||
|
|
||||||
%endif
|
%endif
|
||||||
@ -1337,6 +1343,12 @@ ApplyPatch ext4-Allocate-entire-range-in-zero-range.patch
|
|||||||
#CVE-2015-2150 rhbz 1196266 1200397
|
#CVE-2015-2150 rhbz 1196266 1200397
|
||||||
ApplyPatch xen-pciback-Don-t-disable-PCI_COMMAND-on-PCI-device-.patch
|
ApplyPatch xen-pciback-Don-t-disable-PCI_COMMAND-on-PCI-device-.patch
|
||||||
|
|
||||||
|
#rhbz 1212230
|
||||||
|
ApplyPatch Input-synaptics-pin-3-touches-when-the-firmware-repo.patch
|
||||||
|
|
||||||
|
#rhbz 1209088
|
||||||
|
ApplyPatch Input-atmel_mxt_ts-add-support-for-Google-Pixel-2.patch
|
||||||
|
|
||||||
# END OF PATCH APPLICATIONS
|
# END OF PATCH APPLICATIONS
|
||||||
|
|
||||||
%endif
|
%endif
|
||||||
@ -2187,6 +2199,11 @@ fi
|
|||||||
#
|
#
|
||||||
#
|
#
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Apr 17 2015 Josh Boyer <jwboyer@fedoraproject.org> - 4.1.0-0.rc0.git7.1
|
||||||
|
- Linux v4.0-7300-g4fc8adcfec3d
|
||||||
|
- Patch from Benjamin Tissoires to fix 3 finger tap on synaptics (rhbz 1212230)
|
||||||
|
- Add patch to support touchpad on Google Pixel 2 (rhbz 1209088)
|
||||||
|
|
||||||
* Fri Apr 17 2015 Josh Boyer <jwboyer@fedoraproject.org> - 4.1.0-0.rc0.git6.1
|
* Fri Apr 17 2015 Josh Boyer <jwboyer@fedoraproject.org> - 4.1.0-0.rc0.git6.1
|
||||||
- Linux v4.0-7209-g7d69cff26cea
|
- Linux v4.0-7209-g7d69cff26cea
|
||||||
|
|
||||||
|
2
sources
2
sources
@ -1,3 +1,3 @@
|
|||||||
a86916bd12798220da9eb4a1eec3616d linux-4.0.tar.xz
|
a86916bd12798220da9eb4a1eec3616d linux-4.0.tar.xz
|
||||||
d125eecce68ab6fb5f1f23523c2c04b8 perf-man-4.0.tar.gz
|
d125eecce68ab6fb5f1f23523c2c04b8 perf-man-4.0.tar.gz
|
||||||
ef582cbcc3652cd2aeaaf0ca05b5bed4 patch-4.0-git6.xz
|
f9af1b9baeff5a681739bb8868d2599f patch-4.0-git7.xz
|
||||||
|
Loading…
Reference in New Issue
Block a user