* [PATCH 0/2] sony-laptop patches for 2.6.33
@ 2009-12-12 5:09 Mattia Dongili
2009-12-12 5:09 ` [PATCH 1/2] sony-laptop: add AVMode key mapping Mattia Dongili
0 siblings, 1 reply; 3+ messages in thread
From: Mattia Dongili @ 2009-12-12 5:09 UTC (permalink / raw)
To: Len Brown; +Cc: linux-acpi, Mattia Dongili
Hi Len,
Please apply the following two patches to your next submission for 2.6.33.
Nothing terribly dramatic, just a new key being mapped and the removal of
sony-laptop's private workqueue.
Thanks.
Dmitry Torokhov (1):
sony-laptop - remove private workqueue, use keventd instead
Mattia Dongili (1):
sony-laptop: add AVMode key mapping
drivers/platform/x86/sony-laptop.c | 61 ++++++++++++++++++++---------------
include/linux/sonypi.h | 1 +
2 files changed, 36 insertions(+), 26 deletions(-)
--
mattia
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] sony-laptop: add AVMode key mapping
2009-12-12 5:09 [PATCH 0/2] sony-laptop patches for 2.6.33 Mattia Dongili
@ 2009-12-12 5:09 ` Mattia Dongili
2009-12-12 5:09 ` [PATCH 2/2] sony-laptop - remove private workqueue, use keventd instead Mattia Dongili
0 siblings, 1 reply; 3+ messages in thread
From: Mattia Dongili @ 2009-12-12 5:09 UTC (permalink / raw)
To: Len Brown; +Cc: linux-acpi, Mattia Dongili, Matthew W. S. Bell, Dmitry Torokhov
Some models are equipped with an "AVMode" function key that sends
sony-laptop: Unknown event: 0x100 0xa1
sony-laptop: Unknown event: 0x100 0x21
for press and release respectively.
Signed-off-by: Mattia Dongili <malattia@linux.it>
Cc: "Matthew W. S. Bell" <matthew@bells23.org.uk>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/platform/x86/sony-laptop.c | 4 ++++
include/linux/sonypi.h | 1 +
2 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c
index a2a742c..9710f70 100644
--- a/drivers/platform/x86/sony-laptop.c
+++ b/drivers/platform/x86/sony-laptop.c
@@ -232,6 +232,7 @@ static int sony_laptop_input_index[] = {
56, /* 69 SONYPI_EVENT_VOLUME_INC_PRESSED */
57, /* 70 SONYPI_EVENT_VOLUME_DEC_PRESSED */
-1, /* 71 SONYPI_EVENT_BRIGHTNESS_PRESSED */
+ 58, /* 72 SONYPI_EVENT_MEDIA_PRESSED */
};
static int sony_laptop_input_keycode_map[] = {
@@ -293,6 +294,7 @@ static int sony_laptop_input_keycode_map[] = {
KEY_F15, /* 55 SONYPI_EVENT_SETTINGKEY_PRESSED */
KEY_VOLUMEUP, /* 56 SONYPI_EVENT_VOLUME_INC_PRESSED */
KEY_VOLUMEDOWN, /* 57 SONYPI_EVENT_VOLUME_DEC_PRESSED */
+ KEY_MEDIA, /* 58 SONYPI_EVENT_MEDIA_PRESSED */
};
/* release buttons after a short delay if pressed */
@@ -890,6 +892,8 @@ static struct sony_nc_event sony_100_events[] = {
{ 0x0C, SONYPI_EVENT_FNKEY_RELEASED },
{ 0x9f, SONYPI_EVENT_CD_EJECT_PRESSED },
{ 0x1f, SONYPI_EVENT_ANYBUTTON_RELEASED },
+ { 0xa1, SONYPI_EVENT_MEDIA_PRESSED },
+ { 0x21, SONYPI_EVENT_ANYBUTTON_RELEASED },
{ 0, 0 },
};
diff --git a/include/linux/sonypi.h b/include/linux/sonypi.h
index 34c4475..4f95c1a 100644
--- a/include/linux/sonypi.h
+++ b/include/linux/sonypi.h
@@ -111,6 +111,7 @@
#define SONYPI_EVENT_VOLUME_INC_PRESSED 69
#define SONYPI_EVENT_VOLUME_DEC_PRESSED 70
#define SONYPI_EVENT_BRIGHTNESS_PRESSED 71
+#define SONYPI_EVENT_MEDIA_PRESSED 72
/* get/set brightness */
#define SONYPI_IOCGBRT _IOR('v', 0, __u8)
--
1.6.5.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2] sony-laptop - remove private workqueue, use keventd instead
2009-12-12 5:09 ` [PATCH 1/2] sony-laptop: add AVMode key mapping Mattia Dongili
@ 2009-12-12 5:09 ` Mattia Dongili
0 siblings, 0 replies; 3+ messages in thread
From: Mattia Dongili @ 2009-12-12 5:09 UTC (permalink / raw)
To: Len Brown; +Cc: linux-acpi, Dmitry Torokhov, Dmitry Torokhov, Mattia Dongili
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
If we reschedule work instead of having work function sleep for 10 msecs
between reads from kfifo we can safely use the main workqueue (keventd)
and not bother with creating driver-private one.
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Mattia Dongili <malattia@linux.it>
---
drivers/platform/x86/sony-laptop.c | 57 +++++++++++++++++++----------------
1 files changed, 31 insertions(+), 26 deletions(-)
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c
index 9710f70..b2dccf4 100644
--- a/drivers/platform/x86/sony-laptop.c
+++ b/drivers/platform/x86/sony-laptop.c
@@ -144,7 +144,6 @@ struct sony_laptop_input_s {
struct input_dev *key_dev;
struct kfifo *fifo;
spinlock_t fifo_lock;
- struct workqueue_struct *wq;
};
static struct sony_laptop_input_s sony_laptop_input = {
@@ -300,17 +299,28 @@ static int sony_laptop_input_keycode_map[] = {
/* release buttons after a short delay if pressed */
static void do_sony_laptop_release_key(struct work_struct *work)
{
+ struct delayed_work *dwork =
+ container_of(work, struct delayed_work, work);
struct sony_laptop_keypress kp;
- while (kfifo_get(sony_laptop_input.fifo, (unsigned char *)&kp,
- sizeof(kp)) == sizeof(kp)) {
- msleep(10);
+ if (kfifo_get(sony_laptop_input.fifo,
+ (unsigned char *)&kp, sizeof(kp)) == sizeof(kp)) {
input_report_key(kp.dev, kp.key, 0);
input_sync(kp.dev);
}
+
+ /*
+ * If there is something in the fifo scnhedule nect release.
+ * We don't care about locking, at worst we may schedule an
+ * extra "empty" wakeup. This may be improved with the new
+ * kfifo API.
+ */
+ if (__kfifo_len(sony_laptop_input.fifo) != 0)
+ schedule_delayed_work(dwork, msecs_to_jiffies(10));
}
-static DECLARE_WORK(sony_laptop_release_key_work,
- do_sony_laptop_release_key);
+
+static DECLARE_DELAYED_WORK(sony_laptop_release_key_work,
+ do_sony_laptop_release_key);
/* forward event to the input subsystem */
static void sony_laptop_report_input_event(u8 event)
@@ -364,12 +374,12 @@ static void sony_laptop_report_input_event(u8 event)
/* we emit the scancode so we can always remap the key */
input_event(kp.dev, EV_MSC, MSC_SCAN, event);
input_sync(kp.dev);
+
+ /* schedule key release */
kfifo_put(sony_laptop_input.fifo,
(unsigned char *)&kp, sizeof(kp));
-
- if (!work_pending(&sony_laptop_release_key_work))
- queue_work(sony_laptop_input.wq,
- &sony_laptop_release_key_work);
+ schedule_delayed_work(&sony_laptop_release_key_work,
+ msecs_to_jiffies(10));
} else
dprintk("unknown input event %.2x\n", event);
}
@@ -396,20 +406,11 @@ static int sony_laptop_setup_input(struct acpi_device *acpi_device)
goto err_dec_users;
}
- /* init workqueue */
- sony_laptop_input.wq = create_singlethread_workqueue("sony-laptop");
- if (!sony_laptop_input.wq) {
- printk(KERN_ERR DRV_PFX
- "Unable to create workqueue.\n");
- error = -ENXIO;
- goto err_free_kfifo;
- }
-
/* input keys */
key_dev = input_allocate_device();
if (!key_dev) {
error = -ENOMEM;
- goto err_destroy_wq;
+ goto err_free_kfifo;
}
key_dev->name = "Sony Vaio Keys";
@@ -472,9 +473,6 @@ err_unregister_keydev:
err_free_keydev:
input_free_device(key_dev);
-err_destroy_wq:
- destroy_workqueue(sony_laptop_input.wq);
-
err_free_kfifo:
kfifo_free(sony_laptop_input.fifo);
@@ -485,12 +483,20 @@ err_dec_users:
static void sony_laptop_remove_input(void)
{
+ struct sony_laptop_keypress kp = { NULL };
+
/* cleanup only after the last user has gone */
if (!atomic_dec_and_test(&sony_laptop_input.users))
return;
- /* flush workqueue first */
- flush_workqueue(sony_laptop_input.wq);
+ cancel_delayed_work_sync(&sony_laptop_release_key_work);
+
+ /* Generate key-up events for remaining keys */
+ while (kfifo_get(sony_laptop_input.fifo,
+ (unsigned char *)&kp, sizeof(kp)) == sizeof(kp)) {
+ input_report_key(kp.dev, kp.key, 0);
+ input_sync(kp.dev);
+ }
/* destroy input devs */
input_unregister_device(sony_laptop_input.key_dev);
@@ -501,7 +507,6 @@ static void sony_laptop_remove_input(void)
sony_laptop_input.jog_dev = NULL;
}
- destroy_workqueue(sony_laptop_input.wq);
kfifo_free(sony_laptop_input.fifo);
}
--
1.6.5.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2009-12-12 5:10 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-12-12 5:09 [PATCH 0/2] sony-laptop patches for 2.6.33 Mattia Dongili
2009-12-12 5:09 ` [PATCH 1/2] sony-laptop: add AVMode key mapping Mattia Dongili
2009-12-12 5:09 ` [PATCH 2/2] sony-laptop - remove private workqueue, use keventd instead Mattia Dongili
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox