Module Name: src Committed By: christos Date: Sat Mar 30 03:09:44 UTC 2013
Modified Files: src/sys/dev/acpi: thinkpad_acpi.c src/sys/sys: power.h Log Message: Define THINKPAD_EXTENDED_HOTKEYS to enable more hotkeys on ThinkPads. This has only been tested on a T61. XXX: Should we put THINKPAD_EXTENDED_HOTKEYS into a opt_*.h include (defflag) or just always enable it? To generate a diff of this commit: cvs rdiff -u -r1.42 -r1.43 src/sys/dev/acpi/thinkpad_acpi.c cvs rdiff -u -r1.17 -r1.18 src/sys/sys/power.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/acpi/thinkpad_acpi.c diff -u src/sys/dev/acpi/thinkpad_acpi.c:1.42 src/sys/dev/acpi/thinkpad_acpi.c:1.43 --- src/sys/dev/acpi/thinkpad_acpi.c:1.42 Sat Nov 24 15:56:39 2012 +++ src/sys/dev/acpi/thinkpad_acpi.c Fri Mar 29 23:09:44 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: thinkpad_acpi.c,v 1.42 2012/11/24 20:56:39 riastradh Exp $ */ +/* $NetBSD: thinkpad_acpi.c,v 1.43 2013/03/30 03:09:44 christos Exp $ */ /*- * Copyright (c) 2007 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: thinkpad_acpi.c,v 1.42 2012/11/24 20:56:39 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: thinkpad_acpi.c,v 1.43 2013/03/30 03:09:44 christos Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -55,15 +55,28 @@ typedef struct thinkpad_softc { ACPI_HANDLE sc_powhdl; ACPI_HANDLE sc_cmoshdl; -#define TP_PSW_SLEEP 0 -#define TP_PSW_HIBERNATE 1 -#define TP_PSW_DISPLAY_CYCLE 2 -#define TP_PSW_LOCK_SCREEN 3 -#define TP_PSW_BATTERY_INFO 4 -#define TP_PSW_EJECT_BUTTON 5 -#define TP_PSW_ZOOM_BUTTON 6 -#define TP_PSW_VENDOR_BUTTON 7 -#define TP_PSW_LAST 8 +#define TP_PSW_SLEEP 0 /* FnF4 */ +#define TP_PSW_HIBERNATE 1 /* FnF12 */ +#define TP_PSW_DISPLAY_CYCLE 2 /* FnF7 */ +#define TP_PSW_LOCK_SCREEN 3 /* FnF2 */ +#define TP_PSW_BATTERY_INFO 4 /* FnF3 */ +#define TP_PSW_EJECT_BUTTON 5 /* FnF9 */ +#define TP_PSW_ZOOM_BUTTON 6 /* FnSPACE */ +#define TP_PSW_VENDOR_BUTTON 7 /* ThinkVantage */ +#define TP_PSW_FNF1_BUTTON 8 /* FnF1 */ +#define TP_PSW_WIRELESS_BUTTON 9 /* FnF5 */ +#define TP_PSW_WWAN_BUTTON 10 /* FnF6 */ +#define TP_PSW_POINTER_BUTTON 11 /* FnF8 */ +#define TP_PSW_FNF10_BUTTON 12 /* FnF10 */ +#define TP_PSW_FNF11_BUTTON 13 /* FnF11 */ +#define TP_PSW_BRIGHTNESS_UP 14 +#define TP_PSW_BRIGHTNESS_DOWN 15 +#define TP_PSW_THINKLIGHT 16 +#define TP_PSW_VOLUME_UP 17 +#define TP_PSW_VOLUME_DOWN 18 +#define TP_PSW_VOLUME_MUTE 19 +#define TP_PSW_LAST 20 + struct sysmon_pswitch sc_smpsw[TP_PSW_LAST]; bool sc_smpsw_valid; @@ -83,16 +96,16 @@ typedef struct thinkpad_softc { #define THINKPAD_NOTIFY_DisplayCycle 0x007 #define THINKPAD_NOTIFY_PointerSwitch 0x008 #define THINKPAD_NOTIFY_EjectButton 0x009 -#define THINKPAD_NOTIFY_FnF10 0x00a +#define THINKPAD_NOTIFY_FnF10 0x00a /* XXX: Not seen on T61 */ #define THINKPAD_NOTIFY_FnF11 0x00b #define THINKPAD_NOTIFY_HibernateButton 0x00c #define THINKPAD_NOTIFY_BrightnessUp 0x010 #define THINKPAD_NOTIFY_BrightnessDown 0x011 #define THINKPAD_NOTIFY_ThinkLight 0x012 #define THINKPAD_NOTIFY_Zoom 0x014 -#define THINKPAD_NOTIFY_VolumeUp 0x015 -#define THINKPAD_NOTIFY_VolumeDown 0x016 -#define THINKPAD_NOTIFY_VolumeMute 0x017 +#define THINKPAD_NOTIFY_VolumeUp 0x015 /* XXX: Not seen on T61 */ +#define THINKPAD_NOTIFY_VolumeDown 0x016 /* XXX: Not seen on T61 */ +#define THINKPAD_NOTIFY_VolumeMute 0x017 /* XXX: Not seen on T61 */ #define THINKPAD_NOTIFY_ThinkVantage 0x018 #define THINKPAD_CMOS_BRIGHTNESS_UP 0x04 @@ -245,6 +258,20 @@ thinkpad_attach(device_t parent, device_ psw[TP_PSW_EJECT_BUTTON].smpsw_name = PSWITCH_HK_EJECT_BUTTON; psw[TP_PSW_ZOOM_BUTTON].smpsw_name = PSWITCH_HK_ZOOM_BUTTON; psw[TP_PSW_VENDOR_BUTTON].smpsw_name = PSWITCH_HK_VENDOR_BUTTON; +#ifdef THINKPAD_EXTENDED_HOTKEYS + psw[TP_PSW_FNF1_BUTTON].smpsw_name = PSWITCH_HK_FNF1_BUTTON; + psw[TP_PSW_WIRELESS_BUTTON].smpsw_name = PSWITCH_HK_WIRELESS_BUTTON; + psw[TP_PSW_WWAN_BUTTON].smpsw_name = PSWITCH_HK_WWAN_BUTTON; + psw[TP_PSW_POINTER_BUTTON].smpsw_name = PSWITCH_HK_POINTER_BUTTON; + psw[TP_PSW_FNF10_BUTTON].smpsw_name = PSWITCH_HK_FNF10_BUTTON; + psw[TP_PSW_FNF11_BUTTON].smpsw_name = PSWITCH_HK_FNF11_BUTTON; + psw[TP_PSW_BRIGHTNESS_UP].smpsw_name = PSWITCH_HK_BRIGHTNESS_UP; + psw[TP_PSW_BRIGHTNESS_DOWN].smpsw_name = PSWITCH_HK_BRIGHTNESS_DOWN; + psw[TP_PSW_THINKLIGHT].smpsw_name = PSWITCH_HK_THINKLIGHT; + psw[TP_PSW_VOLUME_UP].smpsw_name = PSWITCH_HK_VOLUME_UP; + psw[TP_PSW_VOLUME_DOWN].smpsw_name = PSWITCH_HK_VOLUME_DOWN; + psw[TP_PSW_VOLUME_MUTE].smpsw_name = PSWITCH_HK_VOLUME_MUTE; +#endif /* THINKPAD_EXTENDED_HOTKEYS */ for (i = 0; i < TP_PSW_LAST; i++) { /* not supported yet */ @@ -343,15 +370,39 @@ thinkpad_get_hotkeys(void *opaque) switch (event) { case THINKPAD_NOTIFY_BrightnessUp: thinkpad_brightness_up(self); +#ifdef THINKPAD_EXTENDED_HOTKEYS + if (sc->sc_smpsw_valid == false) + break; + sysmon_pswitch_event(&sc->sc_smpsw[TP_PSW_BRIGHTNESS_UP], + PSWITCH_EVENT_PRESSED); +#endif break; case THINKPAD_NOTIFY_BrightnessDown: thinkpad_brightness_down(self); +#ifdef THINKPAD_EXTENDED_HOTKEYS + if (sc->sc_smpsw_valid == false) + break; + sysmon_pswitch_event(&sc->sc_smpsw[TP_PSW_BRIGHTNESS_DOWN], + PSWITCH_EVENT_PRESSED); +#endif break; case THINKPAD_NOTIFY_WirelessSwitch: thinkpad_wireless_toggle(sc); +#ifdef THINKPAD_EXTENDED_HOTKEYS + if (sc->sc_smpsw_valid == false) + break; + sysmon_pswitch_event(&sc->sc_smpsw[TP_PSW_WIRELESS_BUTTON], + PSWITCH_EVENT_PRESSED); +#endif break; case THINKPAD_NOTIFY_wWANSwitch: thinkpad_wwan_toggle(sc); +#ifdef THINKPAD_EXTENDED_HOTKEYS + if (sc->sc_smpsw_valid == false) + break; + sysmon_pswitch_event(&sc->sc_smpsw[TP_PSW_WWAN_BUTTON], + PSWITCH_EVENT_PRESSED); +#endif break; case THINKPAD_NOTIFY_SleepButton: if (sc->sc_smpsw_valid == false) @@ -409,6 +460,59 @@ thinkpad_get_hotkeys(void *opaque) &sc->sc_smpsw[TP_PSW_VENDOR_BUTTON], PSWITCH_EVENT_PRESSED); break; +#ifdef THINKPAD_EXTENDED_HOTKEYS + case THINKPAD_NOTIFY_FnF1: + if (sc->sc_smpsw_valid == false) + break; + sysmon_pswitch_event(&sc->sc_smpsw[TP_PSW_FNF1_BUTTON], + PSWITCH_EVENT_PRESSED); + break; + case THINKPAD_NOTIFY_PointerSwitch: + if (sc->sc_smpsw_valid == false) + break; + sysmon_pswitch_event(&sc->sc_smpsw[TP_PSW_POINTER_BUTTON], + PSWITCH_EVENT_PRESSED); + break; + case THINKPAD_NOTIFY_FnF11: + if (sc->sc_smpsw_valid == false) + break; + sysmon_pswitch_event(&sc->sc_smpsw[TP_PSW_FNF11_BUTTON], + PSWITCH_EVENT_PRESSED); + break; + case THINKPAD_NOTIFY_ThinkLight: + if (sc->sc_smpsw_valid == false) + break; + sysmon_pswitch_event(&sc->sc_smpsw[TP_PSW_THINKLIGHT], + PSWITCH_EVENT_PRESSED); + break; + /* + * For some reason the next four aren't seen on my T61. + */ + case THINKPAD_NOTIFY_FnF10: + if (sc->sc_smpsw_valid == false) + break; + sysmon_pswitch_event(&sc->sc_smpsw[TP_PSW_FNF10_BUTTON], + PSWITCH_EVENT_PRESSED); + break; + case THINKPAD_NOTIFY_VolumeUp: + if (sc->sc_smpsw_valid == false) + break; + sysmon_pswitch_event(&sc->sc_smpsw[TP_PSW_VOLUME_UP], + PSWITCH_EVENT_PRESSED); + break; + case THINKPAD_NOTIFY_VolumeDown: + if (sc->sc_smpsw_valid == false) + break; + sysmon_pswitch_event(&sc->sc_smpsw[TP_PSW_VOLUME_DOWN], + PSWITCH_EVENT_PRESSED); + break; + case THINKPAD_NOTIFY_VolumeMute: + if (sc->sc_smpsw_valid == false) + break; + sysmon_pswitch_event(&sc->sc_smpsw[TP_PSW_VOLUME_MUTE], + PSWITCH_EVENT_PRESSED); + break; +#else case THINKPAD_NOTIFY_FnF1: case THINKPAD_NOTIFY_PointerSwitch: case THINKPAD_NOTIFY_FnF10: @@ -419,6 +523,7 @@ thinkpad_get_hotkeys(void *opaque) case THINKPAD_NOTIFY_VolumeMute: /* XXXJDM we should deliver hotkeys as keycodes */ break; +#endif /* THINKPAD_EXTENDED_HOTKEYS */ default: aprint_debug_dev(self, "notify event 0x%03x\n", event); break; Index: src/sys/sys/power.h diff -u src/sys/sys/power.h:1.17 src/sys/sys/power.h:1.18 --- src/sys/sys/power.h:1.17 Sun Jul 15 14:31:35 2012 +++ src/sys/sys/power.h Fri Mar 29 23:09:44 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: power.h,v 1.17 2012/07/15 18:31:35 pgoyette Exp $ */ +/* $NetBSD: power.h,v 1.18 2013/03/30 03:09:44 christos Exp $ */ /* * Copyright (c) 2003 Wasabi Systems, Inc. @@ -97,6 +97,20 @@ #define PSWITCH_HK_EJECT_BUTTON "eject-button" #define PSWITCH_HK_ZOOM_BUTTON "zoom-button" #define PSWITCH_HK_VENDOR_BUTTON "vendor-button" +#ifdef THINKPAD_EXTENDED_HOTKEYS +#define PSWITCH_HK_FNF1_BUTTON "fnf1-button" +#define PSWITCH_HK_WIRELESS_BUTTON "wireless-button" +#define PSWITCH_HK_WWAN_BUTTON "wWAN-button" +#define PSWITCH_HK_POINTER_BUTTON "pointer-button" +#define PSWITCH_HK_FNF10_BUTTON "fnf10-button" +#define PSWITCH_HK_FNF11_BUTTON "fnf11-button" +#define PSWITCH_HK_BRIGHTNESS_UP "brightness-up" +#define PSWITCH_HK_BRIGHTNESS_DOWN "brightness-down" +#define PSWITCH_HK_THINKLIGHT "thinklight" +#define PSWITCH_HK_VOLUME_UP "volume-up" +#define PSWITCH_HK_VOLUME_DOWN "volume-down" +#define PSWITCH_HK_VOLUME_MUTE "volume-mute" +#endif /* THINKPAD_EXTENDED_HOTKEYS */ #define PSWITCH_EVENT_PRESSED 0 /* button pressed, lid closed, AC off */ #define PSWITCH_EVENT_RELEASED 1 /* button released, lid open, AC on */ @@ -145,7 +159,7 @@ struct pswitch_state { #define PENVSYS_TYPE_INDICATOR 17 /* - * The following events apply for temperatures, power, resistance, + * The following events apply for temperatures, power, resistance, * voltages, battery and fan sensors: * * PENVSYS_EVENT_CRITICAL A critical limit.