From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= Subject: [PATCH 7/8] Input: Block suspend while event queue is not empty. Date: Tue, 27 Apr 2010 21:31:58 -0700 Message-ID: <1272429119-12103-8-git-send-email-arve@android.com> References: <1272429119-12103-1-git-send-email-arve@android.com> <1272429119-12103-2-git-send-email-arve@android.com> <1272429119-12103-3-git-send-email-arve@android.com> <1272429119-12103-4-git-send-email-arve@android.com> <1272429119-12103-5-git-send-email-arve@android.com> <1272429119-12103-6-git-send-email-arve@android.com> <1272429119-12103-7-git-send-email-arve@android.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1272429119-12103-7-git-send-email-arve@android.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-pm-bounces@lists.linux-foundation.org Errors-To: linux-pm-bounces@lists.linux-foundation.org To: linux-pm@lists.linux-foundation.org, linux-kernel@vger.kernel.org Cc: linux-input@vger.kernel.org, =?UTF-8?q?M=C3=A1rton=20N=C3=A9meth?= , Thadeu Lima de Souza Cascardo , Dmitry Torokhov , Sven Neumann , Oleg Nesterov , Jiri Kosina , Tejun Heo , Henrik Rydberg , Tero Saarni , Matthew Garrett List-Id: linux-input@vger.kernel.org QWRkIGFuIGlvY3RsLCBFVklPQ1NTVVNQRU5EQkxPQ0ssIHRvIGVuYWJsZSBhIHN1c3BlbmRfYmxv Y2tlciB0aGF0IHdpbGwgYmxvY2sKc3VzcGVuZCB3aGlsZSB0aGUgZXZlbnQgcXVldWUgaXMgbm90 IGVtcHR5LiBUaGlzIGFsbG93cyB1c2Vyc3BhY2UgY29kZSB0bwpwcm9jZXNzIGlucHV0IGV2ZW50 cyB3aGlsZSB0aGUgZGV2aWNlIGFwcGVhcnMgdG8gYmUgYXNsZWVwLgoKU2lnbmVkLW9mZi1ieTog QXJ2ZSBIasO4bm5ldsOlZyA8YXJ2ZUBhbmRyb2lkLmNvbT4KLS0tCiBkcml2ZXJzL2lucHV0L2V2 ZGV2LmMgfCAgIDIyICsrKysrKysrKysrKysrKysrKysrKysKIGluY2x1ZGUvbGludXgvaW5wdXQu aCB8ICAgIDMgKysrCiAyIGZpbGVzIGNoYW5nZWQsIDI1IGluc2VydGlvbnMoKyksIDAgZGVsZXRp b25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9ldmRldi5jIGIvZHJpdmVycy9pbnB1 dC9ldmRldi5jCmluZGV4IDJlZTZjN2EuLjY2ZTBkMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5w dXQvZXZkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKQEAgLTIwLDYgKzIwLDcgQEAK ICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5j bHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZF9ibG9ja2VyLmg+ CiAjaW5jbHVkZSAiaW5wdXQtY29tcGF0LmgiCiAKIHN0cnVjdCBldmRldiB7CkBAIC00Myw2ICs0 NCw4IEBAIHN0cnVjdCBldmRldl9jbGllbnQgewogCXN0cnVjdCBmYXN5bmNfc3RydWN0ICpmYXN5 bmM7CiAJc3RydWN0IGV2ZGV2ICpldmRldjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJc3Ry dWN0IHN1c3BlbmRfYmxvY2tlciBzdXNwZW5kX2Jsb2NrZXI7CisJYm9vbCB1c2Vfc3VzcGVuZF9i bG9ja2VyOwogfTsKIAogc3RhdGljIHN0cnVjdCBldmRldiAqZXZkZXZfdGFibGVbRVZERVZfTUlO T1JTXTsKQEAgLTU1LDYgKzU4LDggQEAgc3RhdGljIHZvaWQgZXZkZXZfcGFzc19ldmVudChzdHJ1 Y3QgZXZkZXZfY2xpZW50ICpjbGllbnQsCiAJICogSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIGp1 c3QgYWNxdWlyZSB0aGUgbG9jawogCSAqLwogCXNwaW5fbG9jaygmY2xpZW50LT5idWZmZXJfbG9j ayk7CisJaWYgKGNsaWVudC0+dXNlX3N1c3BlbmRfYmxvY2tlcikKKwkJc3VzcGVuZF9ibG9jaygm Y2xpZW50LT5zdXNwZW5kX2Jsb2NrZXIpOwogCWNsaWVudC0+YnVmZmVyW2NsaWVudC0+aGVhZCsr XSA9ICpldmVudDsKIAljbGllbnQtPmhlYWQgJj0gRVZERVZfQlVGRkVSX1NJWkUgLSAxOwogCXNw aW5fdW5sb2NrKCZjbGllbnQtPmJ1ZmZlcl9sb2NrKTsKQEAgLTIzNCw2ICsyMzksOCBAQCBzdGF0 aWMgaW50IGV2ZGV2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZp bGUpCiAJbXV0ZXhfdW5sb2NrKCZldmRldi0+bXV0ZXgpOwogCiAJZXZkZXZfZGV0YWNoX2NsaWVu dChldmRldiwgY2xpZW50KTsKKwlpZiAoY2xpZW50LT51c2Vfc3VzcGVuZF9ibG9ja2VyKQorCQlz dXNwZW5kX2Jsb2NrZXJfZGVzdHJveSgmY2xpZW50LT5zdXNwZW5kX2Jsb2NrZXIpOwogCWtmcmVl KGNsaWVudCk7CiAKIAlldmRldl9jbG9zZV9kZXZpY2UoZXZkZXYpOwpAQCAtMzM1LDYgKzM0Miw4 IEBAIHN0YXRpYyBpbnQgZXZkZXZfZmV0Y2hfbmV4dF9ldmVudChzdHJ1Y3QgZXZkZXZfY2xpZW50 ICpjbGllbnQsCiAJaWYgKGhhdmVfZXZlbnQpIHsKIAkJKmV2ZW50ID0gY2xpZW50LT5idWZmZXJb Y2xpZW50LT50YWlsKytdOwogCQljbGllbnQtPnRhaWwgJj0gRVZERVZfQlVGRkVSX1NJWkUgLSAx OworCQlpZiAoY2xpZW50LT51c2Vfc3VzcGVuZF9ibG9ja2VyICYmIGNsaWVudC0+aGVhZCA9PSBj bGllbnQtPnRhaWwpCisJCQlzdXNwZW5kX3VuYmxvY2soJmNsaWVudC0+c3VzcGVuZF9ibG9ja2Vy KTsKIAl9CiAKIAlzcGluX3VubG9ja19pcnEoJmNsaWVudC0+YnVmZmVyX2xvY2spOwpAQCAtNTg1 LDYgKzU5NCwxOSBAQCBzdGF0aWMgbG9uZyBldmRldl9kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmls ZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJZWxzZQogCQkJcmV0dXJuIGV2ZGV2X3VuZ3JhYihldmRl diwgY2xpZW50KTsKIAorCWNhc2UgRVZJT0NHU1VTUEVOREJMT0NLOgorCQlyZXR1cm4gcHV0X3Vz ZXIoY2xpZW50LT51c2Vfc3VzcGVuZF9ibG9ja2VyLCBpcCk7CisKKwljYXNlIEVWSU9DU1NVU1BF TkRCTE9DSzoKKwkJc3Bpbl9sb2NrX2lycSgmY2xpZW50LT5idWZmZXJfbG9jayk7CisJCWlmICgh Y2xpZW50LT51c2Vfc3VzcGVuZF9ibG9ja2VyICYmIHApCisJCQlzdXNwZW5kX2Jsb2NrZXJfaW5p dCgmY2xpZW50LT5zdXNwZW5kX2Jsb2NrZXIsICJldmRldiIpOworCQllbHNlIGlmIChjbGllbnQt PnVzZV9zdXNwZW5kX2Jsb2NrZXIgJiYgIXApCisJCQlzdXNwZW5kX2Jsb2NrZXJfZGVzdHJveSgm Y2xpZW50LT5zdXNwZW5kX2Jsb2NrZXIpOworCQljbGllbnQtPnVzZV9zdXNwZW5kX2Jsb2NrZXIg PSAhIXA7CisJCXNwaW5fdW5sb2NrX2lycSgmY2xpZW50LT5idWZmZXJfbG9jayk7CisJCXJldHVy biAwOworCiAJZGVmYXVsdDoKIAogCQlpZiAoX0lPQ19UWVBFKGNtZCkgIT0gJ0UnKQpkaWZmIC0t Z2l0IGEvaW5jbHVkZS9saW51eC9pbnB1dC5oIGIvaW5jbHVkZS9saW51eC9pbnB1dC5oCmluZGV4 IDdlZDIyNTEuLmIyZDkzYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5wdXQuaAorKysg Yi9pbmNsdWRlL2xpbnV4L2lucHV0LmgKQEAgLTgyLDYgKzgyLDkgQEAgc3RydWN0IGlucHV0X2Fi c2luZm8gewogCiAjZGVmaW5lIEVWSU9DR1JBQgkJX0lPVygnRScsIDB4OTAsIGludCkJCQkvKiBH cmFiL1JlbGVhc2UgZGV2aWNlICovCiAKKyNkZWZpbmUgRVZJT0NHU1VTUEVOREJMT0NLCV9JT1Io J0UnLCAweDkxLCBpbnQpCQkJLyogZ2V0IHN1c3BlbmQgYmxvY2sgZW5hYmxlICovCisjZGVmaW5l IEVWSU9DU1NVU1BFTkRCTE9DSwlfSU9XKCdFJywgMHg5MSwgaW50KQkJCS8qIHNldCBzdXNwZW5k IGJsb2NrIGVuYWJsZSAqLworCiAvKgogICogRXZlbnQgdHlwZXMKICAqLwotLSAKMS42LjUuMQoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtcG0g bWFpbGluZyBsaXN0CmxpbnV4LXBtQGxpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnCmh0dHBzOi8v bGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1wbQ== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751765Ab0D1Edu (ORCPT ); Wed, 28 Apr 2010 00:33:50 -0400 Received: from mail-pz0-f204.google.com ([209.85.222.204]:57985 "EHLO mail-pz0-f204.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751269Ab0D1Ech (ORCPT ); Wed, 28 Apr 2010 00:32:37 -0400 From: =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= To: linux-pm@lists.linux-foundation.org, linux-kernel@vger.kernel.org Cc: "Rafael J. Wysocki" , Alan Stern , Tejun Heo , Oleg Nesterov , =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= , Dmitry Torokhov , Thadeu Lima de Souza Cascardo , =?UTF-8?q?M=C3=A1rton=20N=C3=A9meth?= , Sven Neumann , Tero Saarni , Henrik Rydberg , Matthew Garrett , Jiri Kosina , linux-input@vger.kernel.org Subject: [PATCH 7/8] Input: Block suspend while event queue is not empty. Date: Tue, 27 Apr 2010 21:31:58 -0700 Message-Id: <1272429119-12103-8-git-send-email-arve@android.com> X-Mailer: git-send-email 1.6.5.1 In-Reply-To: <1272429119-12103-7-git-send-email-arve@android.com> References: <1272429119-12103-1-git-send-email-arve@android.com> <1272429119-12103-2-git-send-email-arve@android.com> <1272429119-12103-3-git-send-email-arve@android.com> <1272429119-12103-4-git-send-email-arve@android.com> <1272429119-12103-5-git-send-email-arve@android.com> <1272429119-12103-6-git-send-email-arve@android.com> <1272429119-12103-7-git-send-email-arve@android.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add an ioctl, EVIOCSSUSPENDBLOCK, to enable a suspend_blocker that will block suspend while the event queue is not empty. This allows userspace code to process input events while the device appears to be asleep. Signed-off-by: Arve Hjønnevåg --- drivers/input/evdev.c | 22 ++++++++++++++++++++++ include/linux/input.h | 3 +++ 2 files changed, 25 insertions(+), 0 deletions(-) diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index 2ee6c7a..66e0d16 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "input-compat.h" struct evdev { @@ -43,6 +44,8 @@ struct evdev_client { struct fasync_struct *fasync; struct evdev *evdev; struct list_head node; + struct suspend_blocker suspend_blocker; + bool use_suspend_blocker; }; static struct evdev *evdev_table[EVDEV_MINORS]; @@ -55,6 +58,8 @@ static void evdev_pass_event(struct evdev_client *client, * Interrupts are disabled, just acquire the lock */ spin_lock(&client->buffer_lock); + if (client->use_suspend_blocker) + suspend_block(&client->suspend_blocker); client->buffer[client->head++] = *event; client->head &= EVDEV_BUFFER_SIZE - 1; spin_unlock(&client->buffer_lock); @@ -234,6 +239,8 @@ static int evdev_release(struct inode *inode, struct file *file) mutex_unlock(&evdev->mutex); evdev_detach_client(evdev, client); + if (client->use_suspend_blocker) + suspend_blocker_destroy(&client->suspend_blocker); kfree(client); evdev_close_device(evdev); @@ -335,6 +342,8 @@ static int evdev_fetch_next_event(struct evdev_client *client, if (have_event) { *event = client->buffer[client->tail++]; client->tail &= EVDEV_BUFFER_SIZE - 1; + if (client->use_suspend_blocker && client->head == client->tail) + suspend_unblock(&client->suspend_blocker); } spin_unlock_irq(&client->buffer_lock); @@ -585,6 +594,19 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd, else return evdev_ungrab(evdev, client); + case EVIOCGSUSPENDBLOCK: + return put_user(client->use_suspend_blocker, ip); + + case EVIOCSSUSPENDBLOCK: + spin_lock_irq(&client->buffer_lock); + if (!client->use_suspend_blocker && p) + suspend_blocker_init(&client->suspend_blocker, "evdev"); + else if (client->use_suspend_blocker && !p) + suspend_blocker_destroy(&client->suspend_blocker); + client->use_suspend_blocker = !!p; + spin_unlock_irq(&client->buffer_lock); + return 0; + default: if (_IOC_TYPE(cmd) != 'E') diff --git a/include/linux/input.h b/include/linux/input.h index 7ed2251..b2d93b4 100644 --- a/include/linux/input.h +++ b/include/linux/input.h @@ -82,6 +82,9 @@ struct input_absinfo { #define EVIOCGRAB _IOW('E', 0x90, int) /* Grab/Release device */ +#define EVIOCGSUSPENDBLOCK _IOR('E', 0x91, int) /* get suspend block enable */ +#define EVIOCSSUSPENDBLOCK _IOW('E', 0x91, int) /* set suspend block enable */ + /* * Event types */ -- 1.6.5.1