* [RFC] [PATCH V2 3/3] ACPI video hotkey: export ACPI video hotkey events via input layer
@ 2007-08-10 21:07 Zhang Rui
2007-08-16 3:16 ` Len Brown
0 siblings, 1 reply; 2+ messages in thread
From: Zhang Rui @ 2007-08-10 21:07 UTC (permalink / raw)
To: linux-acpi; +Cc: lenb, mjg59, dmitry.torokhov, hmh, hughsient, luming.yu
From: Yu Luming <luming.yu@intel.com>
Export ACPI video hotkey events via input layer.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
drivers/acpi/video.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 86 insertions(+), 1 deletion(-)
Index: linux-2.6.23-rc2/drivers/acpi/video.c
===================================================================
--- linux-2.6.23-rc2.orig/drivers/acpi/video.c
+++ linux-2.6.23-rc2/drivers/acpi/video.c
@@ -31,7 +31,7 @@
#include <linux/list.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
-
+#include <linux/input.h>
#include <linux/backlight.h>
#include <linux/video_output.h>
#include <asm/uaccess.h>
@@ -138,6 +138,8 @@ struct acpi_video_bus {
struct semaphore sem;
struct list_head video_device_list;
struct proc_dir_entry *dir;
+ struct input_dev *input;
+ char phys[32]; /* for input device */
};
struct acpi_video_device_flags {
@@ -1764,6 +1766,9 @@ static void acpi_video_bus_notify(acpi_h
{
struct acpi_video_bus *video = data;
struct acpi_device *device = NULL;
+ struct input_dev *input;
+ int keycode;
+
printk("video bus notify\n");
@@ -1771,11 +1776,13 @@ static void acpi_video_bus_notify(acpi_h
return;
device = video->device;
+ input = video->input;
switch (event) {
case ACPI_VIDEO_NOTIFY_SWITCH: /* User requested a switch,
* most likely via hotkey. */
acpi_bus_generate_event(device, event, 0);
+ keycode = KEY_SWITCHVIDEOMODE;
break;
case ACPI_VIDEO_NOTIFY_PROBE: /* User plugged in or removed a video
@@ -1784,21 +1791,37 @@ static void acpi_video_bus_notify(acpi_h
acpi_video_device_rebind(video);
acpi_video_switch_output(video, event);
acpi_bus_generate_event(device, event, 0);
+ keycode = KEY_SWITCHVIDEOMODE;
break;
case ACPI_VIDEO_NOTIFY_CYCLE: /* Cycle Display output hotkey pressed. */
+ acpi_video_switch_output(video, event);
+ acpi_bus_generate_event(device, event, 0);
+ keycode = KEY_UNKNOWN;
+ break;
case ACPI_VIDEO_NOTIFY_NEXT_OUTPUT: /* Next Display output hotkey pressed. */
+ acpi_video_switch_output(video, event);
+ acpi_bus_generate_event(device, event, 0);
+ keycode = KEY_VIDEO_NEXT;
+ break;
case ACPI_VIDEO_NOTIFY_PREV_OUTPUT: /* previous Display output hotkey pressed. */
acpi_video_switch_output(video, event);
acpi_bus_generate_event(device, event, 0);
+ keycode = KEY_VIDEO_PREV;
break;
default:
+ keycode = KEY_UNKNOWN;
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Unsupported event [0x%x]\n", event));
break;
}
+ input_report_key(input, keycode, 1);
+ input_sync(input);
+ input_report_key(input, keycode, 0);
+ input_sync(input);
+
return;
}
@@ -1806,26 +1829,55 @@ static void acpi_video_device_notify(acp
{
struct acpi_video_device *video_device = data;
struct acpi_device *device = NULL;
+ struct acpi_video_bus *bus;
+ struct input_dev *input;
+ int keycode;
if (!video_device)
return;
device = video_device->dev;
+ bus = video_device->video;
+ input = bus->input;
switch (event) {
case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS: /* Cycle brightness */
+ acpi_video_switch_brightness(video_device, event);
+ acpi_bus_generate_event(device, event, 0);
+ keycode = KEY_UNKNOWN;
+ break;
case ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS: /* Increase brightness */
+ acpi_video_switch_brightness(video_device, event);
+ acpi_bus_generate_event(device, event, 0);
+ keycode = KEY_BRIGHTNESSUP;
+ break;
case ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS: /* Decrease brightness */
+ acpi_video_switch_brightness(video_device, event);
+ acpi_bus_generate_event(device, event, 0);
+ keycode = KEY_BRIGHTNESSDOWN;
+ break;
case ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS: /* zero brightnesss */
+ acpi_video_switch_brightness(video_device, event);
+ acpi_bus_generate_event(device, event, 0);
+ keycode = KEY_BRIGHTNESS_ZERO;
+ break;
case ACPI_VIDEO_NOTIFY_DISPLAY_OFF: /* display device off */
acpi_video_switch_brightness(video_device, event);
acpi_bus_generate_event(device, event, 0);
+ keycode = KEY_BRIGHTNESS_OFF;
break;
default:
+ keycode = KEY_UNKNOWN;
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Unsupported event [0x%x]\n", event));
break;
}
+
+ input_report_key(input, keycode, 1);
+ input_sync(input);
+ input_report_key(input, keycode, 0);
+ input_sync(input);
+
return;
}
@@ -1834,6 +1886,7 @@ static int acpi_video_bus_add(struct acp
int result = 0;
acpi_status status = 0;
struct acpi_video_bus *video = NULL;
+ struct input_dev *input;
if (!device)
@@ -1877,6 +1930,37 @@ static int acpi_video_bus_add(struct acp
goto end;
}
+
+ video->input = input = input_allocate_device();
+
+ snprintf(video->phys, sizeof(video->phys),
+ "%s/video/input0", acpi_device_hid(video->device));
+
+ input->name = acpi_device_name(video->device);
+ input->phys = video->phys;
+ input->id.bustype = BUS_HOST;
+ input->id.product = 0x06;
+ input->evbit[0] = BIT(EV_KEY);
+ set_bit(KEY_SWITCHVIDEOMODE, input->keybit);
+ set_bit(KEY_VIDEO_NEXT, input->keybit);
+ set_bit(KEY_VIDEO_PREV, input->keybit);
+ set_bit(KEY_BRIGHTNESSUP, input->keybit);
+ set_bit(KEY_BRIGHTNESSDOWN, input->keybit);
+ set_bit(KEY_BRIGHTNESS_ZERO, input->keybit);
+ set_bit(KEY_BRIGHTNESS_OFF, input->keybit);
+ result = input_register_device(input);
+ if (result) {
+ acpi_remove_notify_handler(video->device->handle,
+ ACPI_DEVICE_NOTIFY,
+ acpi_video_bus_notify);
+ acpi_video_bus_stop_devices(video);
+ acpi_video_bus_put_devices(video);
+ kfree(video->attached_array);
+ acpi_video_bus_remove_fs(device);
+ goto end;
+ }
+
+
printk(KERN_INFO PREFIX "%s [%s] (multi-head: %s rom: %s post: %s)\n",
ACPI_VIDEO_DEVICE_NAME, acpi_device_bid(device),
video->flags.multihead ? "yes" : "no",
@@ -1910,6 +1994,7 @@ static int acpi_video_bus_remove(struct
acpi_video_bus_put_devices(video);
acpi_video_bus_remove_fs(device);
+ input_unregister_device(video->input);
kfree(video->attached_array);
kfree(video);
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [RFC] [PATCH V2 3/3] ACPI video hotkey: export ACPI video hotkey events via input layer
2007-08-10 21:07 [RFC] [PATCH V2 3/3] ACPI video hotkey: export ACPI video hotkey events via input layer Zhang Rui
@ 2007-08-16 3:16 ` Len Brown
0 siblings, 0 replies; 2+ messages in thread
From: Len Brown @ 2007-08-16 3:16 UTC (permalink / raw)
To: Zhang Rui, linux-input
Cc: linux-acpi, mjg59, dmitry.torokhov, hmh, hughsient, luming.yu
On Friday 10 August 2007 17:07, Zhang Rui wrote:
> From: Yu Luming <luming.yu@intel.com>
>
> Export ACPI video hotkey events via input layer.
>
> Signed-off-by: Zhang Rui <rui.zhang@intel.com>
> ---
> drivers/acpi/video.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 86 insertions(+), 1 deletion(-)
>
> Index: linux-2.6.23-rc2/drivers/acpi/video.c
> ===================================================================
> --- linux-2.6.23-rc2.orig/drivers/acpi/video.c
> +++ linux-2.6.23-rc2/drivers/acpi/video.c
> @@ -31,7 +31,7 @@
> #include <linux/list.h>
> #include <linux/proc_fs.h>
> #include <linux/seq_file.h>
> -
> +#include <linux/input.h>
> #include <linux/backlight.h>
> #include <linux/video_output.h>
> #include <asm/uaccess.h>
> @@ -138,6 +138,8 @@ struct acpi_video_bus {
> struct semaphore sem;
> struct list_head video_device_list;
> struct proc_dir_entry *dir;
> + struct input_dev *input;
> + char phys[32]; /* for input device */
> };
>
> struct acpi_video_device_flags {
> @@ -1764,6 +1766,9 @@ static void acpi_video_bus_notify(acpi_h
> {
> struct acpi_video_bus *video = data;
> struct acpi_device *device = NULL;
> + struct input_dev *input;
> + int keycode;
> +
>
> printk("video bus notify\n");
please delete this printk
> @@ -1771,11 +1776,13 @@ static void acpi_video_bus_notify(acpi_h
> return;
>
> device = video->device;
> + input = video->input;
>
> switch (event) {
> case ACPI_VIDEO_NOTIFY_SWITCH: /* User requested a switch,
> * most likely via hotkey. */
> acpi_bus_generate_event(device, event, 0);
> + keycode = KEY_SWITCHVIDEOMODE;
> break;
>
> case ACPI_VIDEO_NOTIFY_PROBE: /* User plugged in or removed a video
> @@ -1784,21 +1791,37 @@ static void acpi_video_bus_notify(acpi_h
> acpi_video_device_rebind(video);
> acpi_video_switch_output(video, event);
> acpi_bus_generate_event(device, event, 0);
> + keycode = KEY_SWITCHVIDEOMODE;
> break;
>
> case ACPI_VIDEO_NOTIFY_CYCLE: /* Cycle Display output hotkey pressed. */
> + acpi_video_switch_output(video, event);
> + acpi_bus_generate_event(device, event, 0);
> + keycode = KEY_UNKNOWN;
how about KEY_VIDEO_CYCLE_MODE?
> + break;
> case ACPI_VIDEO_NOTIFY_NEXT_OUTPUT: /* Next Display output hotkey pressed. */
> + acpi_video_switch_output(video, event);
> + acpi_bus_generate_event(device, event, 0);
> + keycode = KEY_VIDEO_NEXT;
> + break;
> case ACPI_VIDEO_NOTIFY_PREV_OUTPUT: /* previous Display output hotkey pressed. */
> acpi_video_switch_output(video, event);
> acpi_bus_generate_event(device, event, 0);
> + keycode = KEY_VIDEO_PREV;
> break;
>
> default:
> + keycode = KEY_UNKNOWN;
> ACPI_DEBUG_PRINT((ACPI_DB_INFO,
> "Unsupported event [0x%x]\n", event));
> break;
> }
>
> + input_report_key(input, keycode, 1);
> + input_sync(input);
> + input_report_key(input, keycode, 0);
> + input_sync(input);
> +
> return;
> }
>
> @@ -1806,26 +1829,55 @@ static void acpi_video_device_notify(acp
> {
> struct acpi_video_device *video_device = data;
> struct acpi_device *device = NULL;
> + struct acpi_video_bus *bus;
> + struct input_dev *input;
> + int keycode;
>
> if (!video_device)
> return;
>
> device = video_device->dev;
> + bus = video_device->video;
> + input = bus->input;
>
> switch (event) {
> case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS: /* Cycle brightness */
> + acpi_video_switch_brightness(video_device, event);
> + acpi_bus_generate_event(device, event, 0);
> + keycode = KEY_UNKNOWN;
How about KEY_BRIGHTNESS_CYCLE?
> + break;
> case ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS: /* Increase brightness */
> + acpi_video_switch_brightness(video_device, event);
> + acpi_bus_generate_event(device, event, 0);
> + keycode = KEY_BRIGHTNESSUP;
> + break;
> case ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS: /* Decrease brightness */
> + acpi_video_switch_brightness(video_device, event);
> + acpi_bus_generate_event(device, event, 0);
> + keycode = KEY_BRIGHTNESSDOWN;
> + break;
> case ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS: /* zero brightnesss */
> + acpi_video_switch_brightness(video_device, event);
> + acpi_bus_generate_event(device, event, 0);
> + keycode = KEY_BRIGHTNESS_ZERO;
> + break;
> case ACPI_VIDEO_NOTIFY_DISPLAY_OFF: /* display device off */
> acpi_video_switch_brightness(video_device, event);
> acpi_bus_generate_event(device, event, 0);
> + keycode = KEY_BRIGHTNESS_OFF;
> break;
> default:
> + keycode = KEY_UNKNOWN;
> ACPI_DEBUG_PRINT((ACPI_DB_INFO,
> "Unsupported event [0x%x]\n", event));
> break;
> }
> +
> + input_report_key(input, keycode, 1);
> + input_sync(input);
> + input_report_key(input, keycode, 0);
> + input_sync(input);
> +
> return;
> }
>
> @@ -1834,6 +1886,7 @@ static int acpi_video_bus_add(struct acp
> int result = 0;
> acpi_status status = 0;
> struct acpi_video_bus *video = NULL;
> + struct input_dev *input;
>
>
> if (!device)
> @@ -1877,6 +1930,37 @@ static int acpi_video_bus_add(struct acp
> goto end;
> }
>
> +
> + video->input = input = input_allocate_device();
> +
> + snprintf(video->phys, sizeof(video->phys),
> + "%s/video/input0", acpi_device_hid(video->device));
> +
> + input->name = acpi_device_name(video->device);
> + input->phys = video->phys;
> + input->id.bustype = BUS_HOST;
> + input->id.product = 0x06;
> + input->evbit[0] = BIT(EV_KEY);
> + set_bit(KEY_SWITCHVIDEOMODE, input->keybit);
> + set_bit(KEY_VIDEO_NEXT, input->keybit);
> + set_bit(KEY_VIDEO_PREV, input->keybit);
> + set_bit(KEY_BRIGHTNESSUP, input->keybit);
> + set_bit(KEY_BRIGHTNESSDOWN, input->keybit);
> + set_bit(KEY_BRIGHTNESS_ZERO, input->keybit);
> + set_bit(KEY_BRIGHTNESS_OFF, input->keybit);
> + result = input_register_device(input);
> + if (result) {
> + acpi_remove_notify_handler(video->device->handle,
> + ACPI_DEVICE_NOTIFY,
> + acpi_video_bus_notify);
> + acpi_video_bus_stop_devices(video);
> + acpi_video_bus_put_devices(video);
> + kfree(video->attached_array);
> + acpi_video_bus_remove_fs(device);
> + goto end;
> + }
> +
> +
> printk(KERN_INFO PREFIX "%s [%s] (multi-head: %s rom: %s post: %s)\n",
> ACPI_VIDEO_DEVICE_NAME, acpi_device_bid(device),
> video->flags.multihead ? "yes" : "no",
> @@ -1910,6 +1994,7 @@ static int acpi_video_bus_remove(struct
> acpi_video_bus_put_devices(video);
> acpi_video_bus_remove_fs(device);
>
> + input_unregister_device(video->input);
> kfree(video->attached_array);
> kfree(video);
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2007-08-16 3:16 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-08-10 21:07 [RFC] [PATCH V2 3/3] ACPI video hotkey: export ACPI video hotkey events via input layer Zhang Rui
2007-08-16 3:16 ` Len Brown
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.