From patchwork Fri May 14 04:11:12 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Arve_Hj=C3=B8nnev=C3=A5g?= X-Patchwork-Id: 99532 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o4E4DCOs006306 for ; Fri, 14 May 2010 04:13:12 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752150Ab0ENELo (ORCPT ); Fri, 14 May 2010 00:11:44 -0400 Received: from mail-px0-f174.google.com ([209.85.212.174]:52482 "EHLO mail-px0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751947Ab0ENELm (ORCPT ); Fri, 14 May 2010 00:11:42 -0400 Received: by mail-px0-f174.google.com with SMTP id 5so1130359pxi.19 for ; Thu, 13 May 2010 21:11:42 -0700 (PDT) Received: by 10.115.115.9 with SMTP id s9mr693754wam.66.1273810302227; Thu, 13 May 2010 21:11:42 -0700 (PDT) Received: from localhost.localdomain (arve.mtv.corp.google.com [172.18.103.168]) by mx.google.com with ESMTPS id f11sm16375381wai.23.2010.05.13.21.11.40 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 13 May 2010 21:11:41 -0700 (PDT) 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" , =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= , Dmitry Torokhov , =?UTF-8?q?M=C3=A1rton=20N=C3=A9meth?= , Sven Neumann , Tero Saarni , Alexey Dobriyan , Matthew Garrett , Jiri Kosina , Henrik Rydberg , linux-input@vger.kernel.org Subject: [PATCH 7/8] Input: Block suspend while event queue is not empty. Date: Thu, 13 May 2010 21:11:12 -0700 Message-Id: <1273810273-3039-8-git-send-email-arve@android.com> X-Mailer: git-send-email 1.6.5.1 In-Reply-To: <1273810273-3039-7-git-send-email-arve@android.com> References: <1273810273-3039-1-git-send-email-arve@android.com> <1273810273-3039-2-git-send-email-arve@android.com> <1273810273-3039-3-git-send-email-arve@android.com> <1273810273-3039-4-git-send-email-arve@android.com> <1273810273-3039-5-git-send-email-arve@android.com> <1273810273-3039-6-git-send-email-arve@android.com> <1273810273-3039-7-git-send-email-arve@android.com> MIME-Version: 1.0 Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Fri, 14 May 2010 04:13:12 +0000 (UTC) diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index 2ee6c7a..bff2247 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_unregister(&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_unregister(&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 */