From 8b91e0bbd8717cec6fda1de2a16415d69b887e75 Mon Sep 17 00:00:00 2001 From: Josh Boyer Date: Fri, 17 Apr 2015 09:31:16 -0400 Subject: [PATCH] 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) --- ...xt_ts-add-support-for-Google-Pixel-2.patch | 223 ++++++++++++++++++ ...pin-3-touches-when-the-firmware-repo.patch | 50 ++++ kernel.spec | 19 +- sources | 2 +- 4 files changed, 292 insertions(+), 2 deletions(-) create mode 100644 Input-atmel_mxt_ts-add-support-for-Google-Pixel-2.patch create mode 100644 Input-synaptics-pin-3-touches-when-the-firmware-repo.patch diff --git a/Input-atmel_mxt_ts-add-support-for-Google-Pixel-2.patch b/Input-atmel_mxt_ts-add-support-for-Google-Pixel-2.patch new file mode 100644 index 000000000..2e8af3375 --- /dev/null +++ b/Input-atmel_mxt_ts-add-support-for-Google-Pixel-2.patch @@ -0,0 +1,223 @@ +From: Dmitry Torokhov +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 +Tested-by: Javier Martinez Canillas +Signed-off-by: Dmitry Torokhov +--- + 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 ++#include + #include + #include + #include +@@ -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 + diff --git a/Input-synaptics-pin-3-touches-when-the-firmware-repo.patch b/Input-synaptics-pin-3-touches-when-the-firmware-repo.patch new file mode 100644 index 000000000..cdda67ad2 --- /dev/null +++ b/Input-synaptics-pin-3-touches-when-the-firmware-repo.patch @@ -0,0 +1,50 @@ +From: Benjamin Tissoires +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 +--- + 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 + diff --git a/kernel.spec b/kernel.spec index 63c706cf4..e217ae841 100644 --- a/kernel.spec +++ b/kernel.spec @@ -67,7 +67,7 @@ Summary: The Linux kernel # The rc snapshot level %define rcrev 0 # The git snapshot level -%define gitrev 6 +%define gitrev 7 # Set rpm version accordingly %define rpmversion 4.%{upstream_sublevel}.0 %endif @@ -611,6 +611,12 @@ Patch26138: ext4-Allocate-entire-range-in-zero-range.patch #CVE-2015-2150 rhbz 1196266 1200397 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 %endif @@ -1337,6 +1343,12 @@ ApplyPatch ext4-Allocate-entire-range-in-zero-range.patch #CVE-2015-2150 rhbz 1196266 1200397 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 %endif @@ -2187,6 +2199,11 @@ fi # # %changelog +* Fri Apr 17 2015 Josh Boyer - 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 - 4.1.0-0.rc0.git6.1 - Linux v4.0-7209-g7d69cff26cea diff --git a/sources b/sources index 6a72d570a..6749f2d98 100644 --- a/sources +++ b/sources @@ -1,3 +1,3 @@ a86916bd12798220da9eb4a1eec3616d linux-4.0.tar.xz d125eecce68ab6fb5f1f23523c2c04b8 perf-man-4.0.tar.gz -ef582cbcc3652cd2aeaaf0ca05b5bed4 patch-4.0-git6.xz +f9af1b9baeff5a681739bb8868d2599f patch-4.0-git7.xz