From 3993a16309c7efc93dee772a9279a34bc88cdcb5 Mon Sep 17 00:00:00 2001 From: Maruyama Shohei Date: Wed, 14 Mar 2018 09:55:24 -0700 Subject: Input: silead - add Chuwi Hi8 support This commit add ACPI support for Chuwi Hi8 tablet. On the ACPI table of the tablet, GSL1680 is registered as MSSL0001, so the driver does not recognize the device. This commit resolve it. Signed-off-by: Shohei Maruyama Reviewed-by: Hans de Goede Signed-off-by: Hans de Goede Signed-off-by: Dmitry Torokhov --- drivers/input/touchscreen/silead.c | 1 + 1 file changed, 1 insertion(+) (limited to 'drivers/input/touchscreen') diff --git a/drivers/input/touchscreen/silead.c b/drivers/input/touchscreen/silead.c index 646b1e768e6b..ff7043f74a3d 100644 --- a/drivers/input/touchscreen/silead.c +++ b/drivers/input/touchscreen/silead.c @@ -602,6 +602,7 @@ static const struct acpi_device_id silead_ts_acpi_match[] = { { "GSL3675", 0 }, { "GSL3692", 0 }, { "MSSL1680", 0 }, + { "MSSL0001", 0 }, { } }; MODULE_DEVICE_TABLE(acpi, silead_ts_acpi_match); -- cgit v1.2.3 From 12e510dbc57b29b4314cd792851532bea76b4715 Mon Sep 17 00:00:00 2001 From: Marcus Folkesson Date: Sat, 17 Mar 2018 10:52:39 -0700 Subject: Input: usbtouchscreen - fix deadlock in autosuspend usb_autopm_get_interface() that is called in usbtouch_open() does an autoresume if the device is suspended. input_dev->mutex used in usbtouch_resume() is in this case already taken by the input subsystem and will cause a deadlock. Signed-off-by: Marcus Folkesson Signed-off-by: Dmitry Torokhov --- drivers/input/touchscreen/usbtouchscreen.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'drivers/input/touchscreen') diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c index aa77d243b786..d15a7e2d9bbf 100644 --- a/drivers/input/touchscreen/usbtouchscreen.c +++ b/drivers/input/touchscreen/usbtouchscreen.c @@ -54,6 +54,7 @@ #include #include #include +#include static bool swap_xy; module_param(swap_xy, bool, 0644); @@ -107,6 +108,7 @@ struct usbtouch_usb { struct usb_interface *interface; struct input_dev *input; struct usbtouch_device_info *type; + struct mutex pm_mutex; /* serialize access to open/suspend */ char name[128]; char phys[64]; void *priv; @@ -1450,6 +1452,7 @@ static int usbtouch_open(struct input_dev *input) if (r < 0) goto out; + mutex_lock(&usbtouch->pm_mutex); if (!usbtouch->type->irq_always) { if (usb_submit_urb(usbtouch->irq, GFP_KERNEL)) { r = -EIO; @@ -1459,6 +1462,7 @@ static int usbtouch_open(struct input_dev *input) usbtouch->interface->needs_remote_wakeup = 1; out_put: + mutex_unlock(&usbtouch->pm_mutex); usb_autopm_put_interface(usbtouch->interface); out: return r; @@ -1469,8 +1473,11 @@ static void usbtouch_close(struct input_dev *input) struct usbtouch_usb *usbtouch = input_get_drvdata(input); int r; + mutex_lock(&usbtouch->pm_mutex); if (!usbtouch->type->irq_always) usb_kill_urb(usbtouch->irq); + mutex_unlock(&usbtouch->pm_mutex); + r = usb_autopm_get_interface(usbtouch->interface); usbtouch->interface->needs_remote_wakeup = 0; if (!r) @@ -1493,10 +1500,10 @@ static int usbtouch_resume(struct usb_interface *intf) struct input_dev *input = usbtouch->input; int result = 0; - mutex_lock(&input->mutex); + mutex_lock(&usbtouch->pm_mutex); if (input->users || usbtouch->type->irq_always) result = usb_submit_urb(usbtouch->irq, GFP_NOIO); - mutex_unlock(&input->mutex); + mutex_unlock(&usbtouch->pm_mutex); return result; } @@ -1519,10 +1526,10 @@ static int usbtouch_reset_resume(struct usb_interface *intf) } /* restart IO if needed */ - mutex_lock(&input->mutex); + mutex_lock(&usbtouch->pm_mutex); if (input->users) err = usb_submit_urb(usbtouch->irq, GFP_NOIO); - mutex_unlock(&input->mutex); + mutex_unlock(&usbtouch->pm_mutex); return err; } -- cgit v1.2.3 From 85f46fbf5e242ef923fd313722e65cb6d2170149 Mon Sep 17 00:00:00 2001 From: Marcus Folkesson Date: Sat, 17 Mar 2018 10:54:13 -0700 Subject: Input: usbtouchscreen - do not rely on input_dev->users If the device is unused and suspended, a call to open will cause the device to autoresume through the call to usb_autopm_get_interface(). input_dev->users is already incremented by the input subsystem, therefore this expression will always be evaluated to true: if (input->users || usbtouch->type->irq_always) result = usb_submit_urb(usbtouch->irq, GFP_NOIO); The same URB will then be fail when resubmitted in usbtouch_open(). Introduce usbtouch->is_open to keep track of the state instead. Signed-off-by: Marcus Folkesson Signed-off-by: Dmitry Torokhov --- drivers/input/touchscreen/usbtouchscreen.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'drivers/input/touchscreen') diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c index d15a7e2d9bbf..c6cf90868503 100644 --- a/drivers/input/touchscreen/usbtouchscreen.c +++ b/drivers/input/touchscreen/usbtouchscreen.c @@ -109,6 +109,7 @@ struct usbtouch_usb { struct input_dev *input; struct usbtouch_device_info *type; struct mutex pm_mutex; /* serialize access to open/suspend */ + bool is_open; char name[128]; char phys[64]; void *priv; @@ -1461,6 +1462,7 @@ static int usbtouch_open(struct input_dev *input) } usbtouch->interface->needs_remote_wakeup = 1; + usbtouch->is_open = true; out_put: mutex_unlock(&usbtouch->pm_mutex); usb_autopm_put_interface(usbtouch->interface); @@ -1476,6 +1478,7 @@ static void usbtouch_close(struct input_dev *input) mutex_lock(&usbtouch->pm_mutex); if (!usbtouch->type->irq_always) usb_kill_urb(usbtouch->irq); + usbtouch->is_open = false; mutex_unlock(&usbtouch->pm_mutex); r = usb_autopm_get_interface(usbtouch->interface); @@ -1497,11 +1500,10 @@ static int usbtouch_suspend static int usbtouch_resume(struct usb_interface *intf) { struct usbtouch_usb *usbtouch = usb_get_intfdata(intf); - struct input_dev *input = usbtouch->input; int result = 0; mutex_lock(&usbtouch->pm_mutex); - if (input->users || usbtouch->type->irq_always) + if (usbtouch->is_open || usbtouch->type->irq_always) result = usb_submit_urb(usbtouch->irq, GFP_NOIO); mutex_unlock(&usbtouch->pm_mutex); @@ -1511,7 +1513,6 @@ static int usbtouch_resume(struct usb_interface *intf) static int usbtouch_reset_resume(struct usb_interface *intf) { struct usbtouch_usb *usbtouch = usb_get_intfdata(intf); - struct input_dev *input = usbtouch->input; int err = 0; /* reinit the device */ @@ -1527,7 +1528,7 @@ static int usbtouch_reset_resume(struct usb_interface *intf) /* restart IO if needed */ mutex_lock(&usbtouch->pm_mutex); - if (input->users) + if (usbtouch->is_open) err = usb_submit_urb(usbtouch->irq, GFP_NOIO); mutex_unlock(&usbtouch->pm_mutex); -- cgit v1.2.3 From 1d960003603403f28b9d391087905491b98f3923 Mon Sep 17 00:00:00 2001 From: Marek Szyprowski Date: Fri, 30 Mar 2018 11:12:21 -0700 Subject: Input: stmfts - use async probe & suspend/resume to avoid 2s delay Executing stmfts_power_on() function lasts over 2 seconds, what significantly slows down the boot and resume processes if driver is compiled in. Avoid this delay by forcing this driver to be probed and suspended/resumed asynchronously. Signed-off-by: Marek Szyprowski Signed-off-by: Dmitry Torokhov --- drivers/input/touchscreen/stmfts.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'drivers/input/touchscreen') diff --git a/drivers/input/touchscreen/stmfts.c b/drivers/input/touchscreen/stmfts.c index efdb1a75a163..40c833db150a 100644 --- a/drivers/input/touchscreen/stmfts.c +++ b/drivers/input/touchscreen/stmfts.c @@ -730,6 +730,7 @@ static int stmfts_probe(struct i2c_client *client, return err; pm_runtime_enable(&client->dev); + device_enable_async_suspend(&client->dev); return 0; } @@ -805,6 +806,7 @@ static struct i2c_driver stmfts_driver = { .name = STMFTS_DEV_NAME, .of_match_table = of_match_ptr(stmfts_of_match), .pm = &stmfts_pm_ops, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = stmfts_probe, .remove = stmfts_remove, -- cgit v1.2.3 From adf313f41a0d6495ac9b313d012a291c6dad6b21 Mon Sep 17 00:00:00 2001 From: Andi Shyti Date: Fri, 30 Mar 2018 11:13:10 -0700 Subject: Input: stmfts, s6sy761 - update my e-mail Because I will be leaving Samsung soon, for reachability update my reference e-mail to etezian.org. Signed-off-by: Andi Shyti Signed-off-by: Dmitry Torokhov --- drivers/input/touchscreen/s6sy761.c | 2 +- drivers/input/touchscreen/stmfts.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/input/touchscreen') diff --git a/drivers/input/touchscreen/s6sy761.c b/drivers/input/touchscreen/s6sy761.c index 675efa93d444..b63d7fdf0cd2 100644 --- a/drivers/input/touchscreen/s6sy761.c +++ b/drivers/input/touchscreen/s6sy761.c @@ -2,7 +2,7 @@ // Samsung S6SY761 Touchscreen device driver // // Copyright (c) 2017 Samsung Electronics Co., Ltd. -// Copyright (c) 2017 Andi Shyti +// Copyright (c) 2017 Andi Shyti #include #include diff --git a/drivers/input/touchscreen/stmfts.c b/drivers/input/touchscreen/stmfts.c index 40c833db150a..704e99046916 100644 --- a/drivers/input/touchscreen/stmfts.c +++ b/drivers/input/touchscreen/stmfts.c @@ -2,7 +2,7 @@ // STMicroelectronics FTS Touchscreen device driver // // Copyright (c) 2017 Samsung Electronics Co., Ltd. -// Copyright (c) 2017 Andi Shyti +// Copyright (c) 2017 Andi Shyti #include #include -- cgit v1.2.3