|
@@ -166,6 +166,8 @@ static struct key_entry eeepc_keymap[] = {
|
|
{KE_KEY, 0x1b, KEY_ZOOM },
|
|
{KE_KEY, 0x1b, KEY_ZOOM },
|
|
{KE_KEY, 0x1c, KEY_PROG2 },
|
|
{KE_KEY, 0x1c, KEY_PROG2 },
|
|
{KE_KEY, 0x1d, KEY_PROG3 },
|
|
{KE_KEY, 0x1d, KEY_PROG3 },
|
|
|
|
+ {KE_KEY, NOTIFY_BRN_MIN, KEY_BRIGHTNESSDOWN },
|
|
|
|
+ {KE_KEY, NOTIFY_BRN_MIN + 2, KEY_BRIGHTNESSUP },
|
|
{KE_KEY, 0x30, KEY_SWITCHVIDEOMODE },
|
|
{KE_KEY, 0x30, KEY_SWITCHVIDEOMODE },
|
|
{KE_KEY, 0x31, KEY_SWITCHVIDEOMODE },
|
|
{KE_KEY, 0x31, KEY_SWITCHVIDEOMODE },
|
|
{KE_KEY, 0x32, KEY_SWITCHVIDEOMODE },
|
|
{KE_KEY, 0x32, KEY_SWITCHVIDEOMODE },
|
|
@@ -512,11 +514,16 @@ static int eeepc_hotk_check(void)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-static void notify_brn(void)
|
|
|
|
|
|
+static int notify_brn(void)
|
|
{
|
|
{
|
|
|
|
+ /* returns the *previous* brightness, or -1 */
|
|
struct backlight_device *bd = eeepc_backlight_device;
|
|
struct backlight_device *bd = eeepc_backlight_device;
|
|
- if (bd)
|
|
|
|
|
|
+ if (bd) {
|
|
|
|
+ int old = bd->props.brightness;
|
|
bd->props.brightness = read_brightness(bd);
|
|
bd->props.brightness = read_brightness(bd);
|
|
|
|
+ return old;
|
|
|
|
+ }
|
|
|
|
+ return -1;
|
|
}
|
|
}
|
|
|
|
|
|
static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)
|
|
static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)
|
|
@@ -558,17 +565,33 @@ static void eeepc_hotk_notify(acpi_handle handle, u32 event, void *data)
|
|
{
|
|
{
|
|
static struct key_entry *key;
|
|
static struct key_entry *key;
|
|
u16 count;
|
|
u16 count;
|
|
|
|
+ int brn = -ENODEV;
|
|
|
|
|
|
if (!ehotk)
|
|
if (!ehotk)
|
|
return;
|
|
return;
|
|
if (event >= NOTIFY_BRN_MIN && event <= NOTIFY_BRN_MAX)
|
|
if (event >= NOTIFY_BRN_MIN && event <= NOTIFY_BRN_MAX)
|
|
- notify_brn();
|
|
|
|
|
|
+ brn = notify_brn();
|
|
count = ehotk->event_count[event % 128]++;
|
|
count = ehotk->event_count[event % 128]++;
|
|
acpi_bus_generate_proc_event(ehotk->device, event, count);
|
|
acpi_bus_generate_proc_event(ehotk->device, event, count);
|
|
acpi_bus_generate_netlink_event(ehotk->device->pnp.device_class,
|
|
acpi_bus_generate_netlink_event(ehotk->device->pnp.device_class,
|
|
dev_name(&ehotk->device->dev), event,
|
|
dev_name(&ehotk->device->dev), event,
|
|
count);
|
|
count);
|
|
if (ehotk->inputdev) {
|
|
if (ehotk->inputdev) {
|
|
|
|
+ if (brn != -ENODEV) {
|
|
|
|
+ /* brightness-change events need special
|
|
|
|
+ * handling for conversion to key events
|
|
|
|
+ */
|
|
|
|
+ if (brn < 0)
|
|
|
|
+ brn = event;
|
|
|
|
+ else
|
|
|
|
+ brn += NOTIFY_BRN_MIN;
|
|
|
|
+ if (event < brn)
|
|
|
|
+ event = NOTIFY_BRN_MIN; /* brightness down */
|
|
|
|
+ else if (event > brn)
|
|
|
|
+ event = NOTIFY_BRN_MIN + 2; /* ... up */
|
|
|
|
+ else
|
|
|
|
+ event = NOTIFY_BRN_MIN + 1; /* ... unchanged */
|
|
|
|
+ }
|
|
key = eepc_get_entry_by_scancode(event);
|
|
key = eepc_get_entry_by_scancode(event);
|
|
if (key) {
|
|
if (key) {
|
|
switch (key->type) {
|
|
switch (key->type) {
|