* [PATCH 7/8] Input: Block suspend while event queue is not empty. [not found] ` <1272429119-12103-7-git-send-email-arve@android.com> @ 2010-04-28 4:31 ` Arve Hjønnevåg 0 siblings, 0 replies; 4+ messages in thread From: Arve Hjønnevåg @ 2010-04-28 4:31 UTC (permalink / raw) To: linux-pm, linux-kernel Cc: linux-input, Márton Németh, Thadeu Lima de Souza Cascardo, Dmitry Torokhov, Sven Neumann, Oleg Nesterov, Jiri Kosina, Tejun Heo, Henrik Rydberg, Tero Saarni, Matthew Garrett 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 <arve@android.com> --- 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 <linux/input.h> #include <linux/major.h> #include <linux/device.h> +#include <linux/suspend_blocker.h> #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 _______________________________________________ linux-pm mailing list linux-pm@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/linux-pm ^ permalink raw reply related [flat|nested] 4+ messages in thread
[parent not found: <1272667021-21312-1-git-send-email-arve@android.com>]
[parent not found: <1272667021-21312-2-git-send-email-arve@android.com>]
[parent not found: <1272667021-21312-3-git-send-email-arve@android.com>]
[parent not found: <1272667021-21312-4-git-send-email-arve@android.com>]
[parent not found: <1272667021-21312-5-git-send-email-arve@android.com>]
[parent not found: <1272667021-21312-6-git-send-email-arve@android.com>]
[parent not found: <1272667021-21312-7-git-send-email-arve@android.com>]
* [PATCH 7/8] Input: Block suspend while event queue is not empty. [not found] ` <1272667021-21312-7-git-send-email-arve@android.com> @ 2010-04-30 22:37 ` Arve Hjønnevåg 0 siblings, 0 replies; 4+ messages in thread From: Arve Hjønnevåg @ 2010-04-30 22:37 UTC (permalink / raw) To: linux-pm, linux-kernel Cc: Rafael J. Wysocki, Alan Stern, Tejun Heo, Oleg Nesterov, Arve Hjønnevåg, Dmitry Torokhov, Thadeu Lima de Souza Cascardo, Márton Németh, Sven Neumann, Tero Saarni, Matthew Garrett, Jiri Kosina, Henrik Rydberg, linux-input 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 <arve@android.com> --- 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 <linux/input.h> #include <linux/major.h> #include <linux/device.h> +#include <linux/suspend_blocker.h> #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 ^ permalink raw reply related [flat|nested] 4+ messages in thread
[parent not found: <1273810273-3039-1-git-send-email-arve@android.com>]
[parent not found: <1273810273-3039-2-git-send-email-arve@android.com>]
[parent not found: <1273810273-3039-3-git-send-email-arve@android.com>]
[parent not found: <1273810273-3039-4-git-send-email-arve@android.com>]
[parent not found: <1273810273-3039-5-git-send-email-arve@android.com>]
[parent not found: <1273810273-3039-6-git-send-email-arve@android.com>]
[parent not found: <1273810273-3039-7-git-send-email-arve@android.com>]
* [PATCH 7/8] Input: Block suspend while event queue is not empty. [not found] ` <1273810273-3039-7-git-send-email-arve@android.com> @ 2010-05-14 4:11 ` Arve Hjønnevåg 0 siblings, 0 replies; 4+ messages in thread From: Arve Hjønnevåg @ 2010-05-14 4:11 UTC (permalink / raw) To: linux-pm, linux-kernel Cc: Márton Németh, Jiri Kosina, Dmitry Torokhov, Sven Neumann, Henrik Rydberg, linux-input, Alexey Dobriyan, Tero Saarni, Matthew Garrett 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 <arve@android.com> --- 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..bff2247 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c @@ -20,6 +20,7 @@ #include <linux/input.h> #include <linux/major.h> #include <linux/device.h> +#include <linux/suspend.h> #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 */ -- 1.6.5.1 _______________________________________________ linux-pm mailing list linux-pm@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/linux-pm ^ permalink raw reply related [flat|nested] 4+ messages in thread
[parent not found: <1274482015-30899-1-git-send-email-arve@android.com>]
[parent not found: <1274482015-30899-2-git-send-email-arve@android.com>]
[parent not found: <1274482015-30899-3-git-send-email-arve@android.com>]
[parent not found: <1274482015-30899-4-git-send-email-arve@android.com>]
[parent not found: <1274482015-30899-5-git-send-email-arve@android.com>]
[parent not found: <1274482015-30899-6-git-send-email-arve@android.com>]
[parent not found: <1274482015-30899-7-git-send-email-arve@android.com>]
* [PATCH 7/8] Input: Block suspend while event queue is not empty. [not found] ` <1274482015-30899-7-git-send-email-arve@android.com> @ 2010-05-21 22:46 ` Arve Hjønnevåg 0 siblings, 0 replies; 4+ messages in thread From: Arve Hjønnevåg @ 2010-05-21 22:46 UTC (permalink / raw) To: linux-pm, linux-kernel Cc: Rafael J. Wysocki, Arve Hjønnevåg, Dmitry Torokhov, Márton Németh, Sven Neumann, Tero Saarni, Alexey Dobriyan, Matthew Garrett, Jiri Kosina, Henrik Rydberg, linux-input 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 <arve@android.com> --- 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..bff2247 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c @@ -20,6 +20,7 @@ #include <linux/input.h> #include <linux/major.h> #include <linux/device.h> +#include <linux/suspend.h> #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 */ -- 1.6.5.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-05-21 22:46 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <1272429119-12103-1-git-send-email-arve@android.com> [not found] ` <1272429119-12103-2-git-send-email-arve@android.com> [not found] ` <1272429119-12103-3-git-send-email-arve@android.com> [not found] ` <1272429119-12103-4-git-send-email-arve@android.com> [not found] ` <1272429119-12103-5-git-send-email-arve@android.com> [not found] ` <1272429119-12103-6-git-send-email-arve@android.com> [not found] ` <1272429119-12103-7-git-send-email-arve@android.com> 2010-04-28 4:31 ` [PATCH 7/8] Input: Block suspend while event queue is not empty Arve Hjønnevåg [not found] <1272667021-21312-1-git-send-email-arve@android.com> [not found] ` <1272667021-21312-2-git-send-email-arve@android.com> [not found] ` <1272667021-21312-3-git-send-email-arve@android.com> [not found] ` <1272667021-21312-4-git-send-email-arve@android.com> [not found] ` <1272667021-21312-5-git-send-email-arve@android.com> [not found] ` <1272667021-21312-6-git-send-email-arve@android.com> [not found] ` <1272667021-21312-7-git-send-email-arve@android.com> 2010-04-30 22:37 ` Arve Hjønnevåg [not found] <1273810273-3039-1-git-send-email-arve@android.com> [not found] ` <1273810273-3039-2-git-send-email-arve@android.com> [not found] ` <1273810273-3039-3-git-send-email-arve@android.com> [not found] ` <1273810273-3039-4-git-send-email-arve@android.com> [not found] ` <1273810273-3039-5-git-send-email-arve@android.com> [not found] ` <1273810273-3039-6-git-send-email-arve@android.com> [not found] ` <1273810273-3039-7-git-send-email-arve@android.com> 2010-05-14 4:11 ` Arve Hjønnevåg [not found] <1274482015-30899-1-git-send-email-arve@android.com> [not found] ` <1274482015-30899-2-git-send-email-arve@android.com> [not found] ` <1274482015-30899-3-git-send-email-arve@android.com> [not found] ` <1274482015-30899-4-git-send-email-arve@android.com> [not found] ` <1274482015-30899-5-git-send-email-arve@android.com> [not found] ` <1274482015-30899-6-git-send-email-arve@android.com> [not found] ` <1274482015-30899-7-git-send-email-arve@android.com> 2010-05-21 22:46 ` Arve Hjønnevåg
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).