* [PATCH V2] support Thinkpad X1 Carbon's adaptive keyboard @ 2014-03-03 16:31 ` Shuduo Sang 0 siblings, 0 replies; 14+ messages in thread From: Shuduo Sang @ 2014-03-03 16:31 UTC (permalink / raw) To: bjorn, ibm-acpi-devel, linux-acpi, linux-kernel, ibm-acpi, matthew.garrett, platform-driver-x86 Cc: bruce.ma Hi, Support Thinkpad X1 Carbon's Adaptive keyboard patch version 2 is here. Modified V1 patch's code according to Bjorn's comment. Thanks, Shuduo >From fd2ab11002f3e5cb7fb9b26452db170e9835cde1 Mon Sep 17 00:00:00 2001 From: Shuduo Sang <sangshuduo@gmail.com> Date: Mon, 3 Mar 2014 14:29:32 +0800 Subject: [PATCH] support thinkpad X1 Carbon's adaptive keyboard Thinkpad X1 Carbon's adaptive keyboard has five modes including Home mode, Web browser mode, Web conference mode, Function mode and Lay-flat mode. We support Home mode and Function mode currently. Signed-off-by: Bruce Ma <bruce.ma@canonical.com> Signed-off-by: Shuduo Sang <shuduo.sang@canonical.com> --- drivers/platform/x86/thinkpad_acpi.c | 102 +++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index defb6af..fe2db4d 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -3437,6 +3437,106 @@ err_exit: return (res < 0)? res : 1; } +/* Thinkpad X1 Carbon support 5 modes including Home mode, Web browser + * mode, Web conference mode, Function mode and Lay-flat mode. + * We support Home mode and Function mode currently. + * + * Will consider support rest of modes in future. + * + */ +enum ADAPTIVE_KEY_MODE { + HOME_MODE, + WEB_BROWSER_MODE, + WEB_CONFERENCE_MODE, + FUNCTION_MODE, + LAYFLAT_MODE +}; + +int adaptive_keyboard_modes[] = { + HOME_MODE, +/* WEB_BROWSER_MODE = 2, + WEB_CONFERENCE_MODE = 3, */ + FUNCTION_MODE +}; + +#define DFR_CHANGE_ROW 0x101 +#define DFR_SHOW_QUICKVIEW_ROW 0x102 + +/* press Fn key a while second, it will switch to Function Mode. Then + * release Fn key, previous mode be restored. + */ +bool adaptive_keyboard_mode_is_saved; +int adaptive_keybarod_prev_mode; + +static int adaptive_keyboard_get_next_mode(int mode) +{ + int i; + int max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1; + + for (i = 0; i <= max_mode; i++) { + if (adaptive_keyboard_modes[i] == mode) + break; + } + + if (i >= max_mode) + i = 0; + else + i++; + + return adaptive_keyboard_modes[i]; +} + +static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode) +{ + u32 current_mode = 0; + int new_mode = 0; + + switch (scancode) { + case DFR_CHANGE_ROW: + if (adaptive_keyboard_mode_is_saved) { + new_mode = adaptive_keybarod_prev_mode; + adaptive_keyboard_mode_is_saved = false; + } else { + if (!acpi_evalf( + hkey_handle, ¤t_mode, + "GTRW", "dd", 0)) { + pr_err("Cannot read adaptive keyboard mode\n"); + return false; + } else { + new_mode = adaptive_keyboard_get_next_mode( + current_mode); + } + } + + if (!acpi_evalf(hkey_handle, NULL, "STRW", "vd", new_mode)) { + pr_err("Cannot set adaptive keyboard mode\n"); + return false; + } + + return true; + + case DFR_SHOW_QUICKVIEW_ROW: + if (!acpi_evalf(hkey_handle, + &adaptive_keybarod_prev_mode, + "GTRW", "dd", 0)) { + pr_err("Cannot read adaptive keyboard mode\n"); + return false; + } else { + adaptive_keyboard_mode_is_saved = true; + + if (!acpi_evalf(hkey_handle, + NULL, "STRW", "vd", FUNCTION_MODE)) { + pr_err("Cannot set adaptive keyboard mode\n"); + return false; + } + } + return true; + + default: + return false; + } +} + static bool hotkey_notify_hotkey(const u32 hkey, bool *send_acpi_ev, bool *ignore_acpi_ev) @@ -3456,6 +3556,8 @@ static bool hotkey_notify_hotkey(const u32 hkey, *ignore_acpi_ev = true; } return true; + } else { + return adaptive_keyboard_hotkey_notify_hotkey(scancode); } return false; } -- 1.9.0 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH V2] support Thinkpad X1 Carbon's adaptive keyboard @ 2014-03-03 16:31 ` Shuduo Sang 0 siblings, 0 replies; 14+ messages in thread From: Shuduo Sang @ 2014-03-03 16:31 UTC (permalink / raw) To: bjorn, ibm-acpi-devel, linux-acpi, linux-kernel, ibm-acpi, matthew.garrett, platform-driver-x86 Cc: bruce.ma Hi, Support Thinkpad X1 Carbon's Adaptive keyboard patch version 2 is here. Modified V1 patch's code according to Bjorn's comment. Thanks, Shuduo From fd2ab11002f3e5cb7fb9b26452db170e9835cde1 Mon Sep 17 00:00:00 2001 From: Shuduo Sang <sangshuduo@gmail.com> Date: Mon, 3 Mar 2014 14:29:32 +0800 Subject: [PATCH] support thinkpad X1 Carbon's adaptive keyboard Thinkpad X1 Carbon's adaptive keyboard has five modes including Home mode, Web browser mode, Web conference mode, Function mode and Lay-flat mode. We support Home mode and Function mode currently. Signed-off-by: Bruce Ma <bruce.ma@canonical.com> Signed-off-by: Shuduo Sang <shuduo.sang@canonical.com> --- drivers/platform/x86/thinkpad_acpi.c | 102 +++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index defb6af..fe2db4d 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -3437,6 +3437,106 @@ err_exit: return (res < 0)? res : 1; } +/* Thinkpad X1 Carbon support 5 modes including Home mode, Web browser + * mode, Web conference mode, Function mode and Lay-flat mode. + * We support Home mode and Function mode currently. + * + * Will consider support rest of modes in future. + * + */ +enum ADAPTIVE_KEY_MODE { + HOME_MODE, + WEB_BROWSER_MODE, + WEB_CONFERENCE_MODE, + FUNCTION_MODE, + LAYFLAT_MODE +}; + +int adaptive_keyboard_modes[] = { + HOME_MODE, +/* WEB_BROWSER_MODE = 2, + WEB_CONFERENCE_MODE = 3, */ + FUNCTION_MODE +}; + +#define DFR_CHANGE_ROW 0x101 +#define DFR_SHOW_QUICKVIEW_ROW 0x102 + +/* press Fn key a while second, it will switch to Function Mode. Then + * release Fn key, previous mode be restored. + */ +bool adaptive_keyboard_mode_is_saved; +int adaptive_keybarod_prev_mode; + +static int adaptive_keyboard_get_next_mode(int mode) +{ + int i; + int max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1; + + for (i = 0; i <= max_mode; i++) { + if (adaptive_keyboard_modes[i] == mode) + break; + } + + if (i >= max_mode) + i = 0; + else + i++; + + return adaptive_keyboard_modes[i]; +} + +static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode) +{ + u32 current_mode = 0; + int new_mode = 0; + + switch (scancode) { + case DFR_CHANGE_ROW: + if (adaptive_keyboard_mode_is_saved) { + new_mode = adaptive_keybarod_prev_mode; + adaptive_keyboard_mode_is_saved = false; + } else { + if (!acpi_evalf( + hkey_handle, ¤t_mode, + "GTRW", "dd", 0)) { + pr_err("Cannot read adaptive keyboard mode\n"); + return false; + } else { + new_mode = adaptive_keyboard_get_next_mode( + current_mode); + } + } + + if (!acpi_evalf(hkey_handle, NULL, "STRW", "vd", new_mode)) { + pr_err("Cannot set adaptive keyboard mode\n"); + return false; + } + + return true; + + case DFR_SHOW_QUICKVIEW_ROW: + if (!acpi_evalf(hkey_handle, + &adaptive_keybarod_prev_mode, + "GTRW", "dd", 0)) { + pr_err("Cannot read adaptive keyboard mode\n"); + return false; + } else { + adaptive_keyboard_mode_is_saved = true; + + if (!acpi_evalf(hkey_handle, + NULL, "STRW", "vd", FUNCTION_MODE)) { + pr_err("Cannot set adaptive keyboard mode\n"); + return false; + } + } + return true; + + default: + return false; + } +} + static bool hotkey_notify_hotkey(const u32 hkey, bool *send_acpi_ev, bool *ignore_acpi_ev) @@ -3456,6 +3556,8 @@ static bool hotkey_notify_hotkey(const u32 hkey, *ignore_acpi_ev = true; } return true; + } else { + return adaptive_keyboard_hotkey_notify_hotkey(scancode); } return false; } -- 1.9.0 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH V2] support Thinkpad X1 Carbon's adaptive keyboard 2014-03-03 16:31 ` Shuduo Sang (?) @ 2014-03-04 9:19 ` Tobias Klauser 2014-03-04 9:47 ` Shuduo Sang ` (2 more replies) -1 siblings, 3 replies; 14+ messages in thread From: Tobias Klauser @ 2014-03-04 9:19 UTC (permalink / raw) To: Shuduo Sang Cc: bjorn, ibm-acpi-devel, linux-acpi, linux-kernel, ibm-acpi, matthew.garrett, platform-driver-x86, bruce.ma On 2014-03-03 at 17:31:08 +0100, Shuduo Sang <shuduo.sang@canonical.com> wrote: [...] > +/* press Fn key a while second, it will switch to Function Mode. Then > + * release Fn key, previous mode be restored. > + */ > +bool adaptive_keyboard_mode_is_saved; > +int adaptive_keybarod_prev_mode; These should probably be made static, since they're only used inside the module. > +static int adaptive_keyboard_get_next_mode(int mode) > +{ > + int i; > + int max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1; sizeof and thus ARRAY_SIZE returns a size_t, so i and max_mode could be of type size_t as well. > + > + for (i = 0; i <= max_mode; i++) { > + if (adaptive_keyboard_modes[i] == mode) > + break; > + } > + > + if (i >= max_mode) > + i = 0; > + else > + i++; > + > + return adaptive_keyboard_modes[i]; > +} > + > +static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode) > +{ > + u32 current_mode = 0; > + int new_mode = 0; > + > + switch (scancode) { > + case DFR_CHANGE_ROW: > + if (adaptive_keyboard_mode_is_saved) { > + new_mode = adaptive_keybarod_prev_mode; > + adaptive_keyboard_mode_is_saved = false; > + } else { > + if (!acpi_evalf( > + hkey_handle, ¤t_mode, > + "GTRW", "dd", 0)) { > + pr_err("Cannot read adaptive keyboard mode\n"); > + return false; > + } else { > + new_mode = adaptive_keyboard_get_next_mode( > + current_mode); > + } > + } > + > + if (!acpi_evalf(hkey_handle, NULL, "STRW", "vd", new_mode)) { > + pr_err("Cannot set adaptive keyboard mode\n"); > + return false; > + } > + > + return true; > + > + case DFR_SHOW_QUICKVIEW_ROW: > + if (!acpi_evalf(hkey_handle, > + &adaptive_keybarod_prev_mode, > + "GTRW", "dd", 0)) { > + pr_err("Cannot read adaptive keyboard mode\n"); > + return false; > + } else { > + adaptive_keyboard_mode_is_saved = true; > + > + if (!acpi_evalf(hkey_handle, > + NULL, "STRW", "vd", FUNCTION_MODE)) { > + pr_err("Cannot set adaptive keyboard mode\n"); > + return false; > + } > + } > + return true; > + > + default: > + return false; > + } > +} > + > static bool hotkey_notify_hotkey(const u32 hkey, > bool *send_acpi_ev, > bool *ignore_acpi_ev) > @@ -3456,6 +3556,8 @@ static bool hotkey_notify_hotkey(const u32 hkey, > *ignore_acpi_ev = true; > } > return true; > + } else { > + return adaptive_keyboard_hotkey_notify_hotkey(scancode); > } > return false; > } > -- > 1.9.0 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH V2] support Thinkpad X1 Carbon's adaptive keyboard 2014-03-04 9:19 ` Tobias Klauser @ 2014-03-04 9:47 ` Shuduo Sang 2014-03-04 11:13 ` Shuduo Sang [not found] ` <20140304091916.GE1883-93Khv+1bN0NyDzI6CaY1VQ@public.gmane.org> 2 siblings, 0 replies; 14+ messages in thread From: Shuduo Sang @ 2014-03-04 9:47 UTC (permalink / raw) To: Tobias Klauser Cc: bjorn, ibm-acpi-devel, linux-acpi, linux-kernel, ibm-acpi, matthew.garrett, platform-driver-x86, bruce.ma Hi Tobias, Thanks for your comments. Shuduo On 03/04/2014 05:19 PM, Tobias Klauser wrote: > On 2014-03-03 at 17:31:08 +0100, Shuduo Sang <shuduo.sang@canonical.com> wrote: > [...] >> +/* press Fn key a while second, it will switch to Function Mode. Then >> + * release Fn key, previous mode be restored. >> + */ >> +bool adaptive_keyboard_mode_is_saved; >> +int adaptive_keybarod_prev_mode; > > These should probably be made static, since they're only used inside the > module. > Yes. Let me fix it in V3. >> +static int adaptive_keyboard_get_next_mode(int mode) >> +{ >> + int i; >> + int max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1; > > sizeof and thus ARRAY_SIZE returns a size_t, so i and max_mode could be > of type size_t as well. > Agree. Will fix in V3. >> + >> + for (i = 0; i <= max_mode; i++) { >> + if (adaptive_keyboard_modes[i] == mode) >> + break; >> + } >> + >> + if (i >= max_mode) >> + i = 0; >> + else >> + i++; >> + >> + return adaptive_keyboard_modes[i]; >> +} >> + >> +static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode) >> +{ >> + u32 current_mode = 0; >> + int new_mode = 0; >> + >> + switch (scancode) { >> + case DFR_CHANGE_ROW: >> + if (adaptive_keyboard_mode_is_saved) { >> + new_mode = adaptive_keybarod_prev_mode; >> + adaptive_keyboard_mode_is_saved = false; >> + } else { >> + if (!acpi_evalf( >> + hkey_handle, ¤t_mode, >> + "GTRW", "dd", 0)) { >> + pr_err("Cannot read adaptive keyboard mode\n"); >> + return false; >> + } else { >> + new_mode = adaptive_keyboard_get_next_mode( >> + current_mode); >> + } >> + } >> + >> + if (!acpi_evalf(hkey_handle, NULL, "STRW", "vd", new_mode)) { >> + pr_err("Cannot set adaptive keyboard mode\n"); >> + return false; >> + } >> + >> + return true; >> + >> + case DFR_SHOW_QUICKVIEW_ROW: >> + if (!acpi_evalf(hkey_handle, >> + &adaptive_keybarod_prev_mode, >> + "GTRW", "dd", 0)) { >> + pr_err("Cannot read adaptive keyboard mode\n"); >> + return false; >> + } else { >> + adaptive_keyboard_mode_is_saved = true; >> + >> + if (!acpi_evalf(hkey_handle, >> + NULL, "STRW", "vd", FUNCTION_MODE)) { >> + pr_err("Cannot set adaptive keyboard mode\n"); >> + return false; >> + } >> + } >> + return true; >> + >> + default: >> + return false; >> + } >> +} >> + >> static bool hotkey_notify_hotkey(const u32 hkey, >> bool *send_acpi_ev, >> bool *ignore_acpi_ev) >> @@ -3456,6 +3556,8 @@ static bool hotkey_notify_hotkey(const u32 hkey, >> *ignore_acpi_ev = true; >> } >> return true; >> + } else { >> + return adaptive_keyboard_hotkey_notify_hotkey(scancode); >> } >> return false; >> } >> -- >> 1.9.0 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> Please read the FAQ at http://www.tux.org/lkml/ >> ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH V3] support Thinkpad X1 Carbon 2nd generation's adaptive keyboard 2014-03-04 9:19 ` Tobias Klauser @ 2014-03-04 11:13 ` Shuduo Sang 2014-03-04 11:13 ` Shuduo Sang [not found] ` <20140304091916.GE1883-93Khv+1bN0NyDzI6CaY1VQ@public.gmane.org> 2 siblings, 0 replies; 14+ messages in thread From: Shuduo Sang @ 2014-03-04 11:13 UTC (permalink / raw) To: Tobias Klauser, bjorn, ibm-acpi-devel, linux-acpi, linux-kernel, ibm-acpi, matthew.garrett, platform-driver-x86, bruce.ma Submit patch V3 to support Adaptive Keyboard on Thinkpad X1 Carbon 2nd generation according to Tobias's comments. Thanks, Shuduo >From 2b8175e69deee661d97d371b2422a9c192fefd52 Mon Sep 17 00:00:00 2001 From: Shuduo Sang <sangshuduo@gmail.com> Date: Mon, 3 Mar 2014 14:29:32 +0800 Subject: [PATCH] support thinkpad X1 Carbon's adaptive keyboard Thinkpad X1 Carbon's adaptive keyboard has five modes including Home mode, Web browser mode, Web conference mode, Function mode and Lay-flat mode. We support Home mode and Function mode currently. Signed-off-by: Bruce Ma <bruce.ma@canonical.com> Signed-off-by: Shuduo Sang <shuduo.sang@canonical.com> --- drivers/platform/x86/thinkpad_acpi.c | 102 +++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index defb6af..6664dcd 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -3437,6 +3437,106 @@ err_exit: return (res < 0)? res : 1; } +/* Thinkpad X1 Carbon support 5 modes including Home mode, Web browser + * mode, Web conference mode, Function mode and Lay-flat mode. + * We support Home mode and Function mode currently. + * + * Will consider support rest of modes in future. + * + */ +enum ADAPTIVE_KEY_MODE { + HOME_MODE, + WEB_BROWSER_MODE, + WEB_CONFERENCE_MODE, + FUNCTION_MODE, + LAYFLAT_MODE +}; + +int adaptive_keyboard_modes[] = { + HOME_MODE, +/* WEB_BROWSER_MODE = 2, + WEB_CONFERENCE_MODE = 3, */ + FUNCTION_MODE +}; + +#define DFR_CHANGE_ROW 0x101 +#define DFR_SHOW_QUICKVIEW_ROW 0x102 + +/* press Fn key a while second, it will switch to Function Mode. Then + * release Fn key, previous mode be restored. + */ +static bool adaptive_keyboard_mode_is_saved; +static int adaptive_keyboard_prev_mode; + +static int adaptive_keyboard_get_next_mode(int mode) +{ + int i; + size_t max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1; + + for (i = 0; i <= max_mode; i++) { + if (adaptive_keyboard_modes[i] == mode) + break; + } + + if (i >= max_mode) + i = 0; + else + i++; + + return adaptive_keyboard_modes[i]; +} + +static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode) +{ + u32 current_mode = 0; + int new_mode = 0; + + switch (scancode) { + case DFR_CHANGE_ROW: + if (adaptive_keyboard_mode_is_saved) { + new_mode = adaptive_keyboard_prev_mode; + adaptive_keyboard_mode_is_saved = false; + } else { + if (!acpi_evalf( + hkey_handle, ¤t_mode, + "GTRW", "dd", 0)) { + pr_err("Cannot read adaptive keyboard mode\n"); + return false; + } else { + new_mode = adaptive_keyboard_get_next_mode( + current_mode); + } + } + + if (!acpi_evalf(hkey_handle, NULL, "STRW", "vd", new_mode)) { + pr_err("Cannot set adaptive keyboard mode\n"); + return false; + } + + return true; + + case DFR_SHOW_QUICKVIEW_ROW: + if (!acpi_evalf(hkey_handle, + &adaptive_keyboard_prev_mode, + "GTRW", "dd", 0)) { + pr_err("Cannot read adaptive keyboard mode\n"); + return false; + } else { + adaptive_keyboard_mode_is_saved = true; + + if (!acpi_evalf(hkey_handle, + NULL, "STRW", "vd", FUNCTION_MODE)) { + pr_err("Cannot set adaptive keyboard mode\n"); + return false; + } + } + return true; + + default: + return false; + } +} + static bool hotkey_notify_hotkey(const u32 hkey, bool *send_acpi_ev, bool *ignore_acpi_ev) @@ -3456,6 +3556,8 @@ static bool hotkey_notify_hotkey(const u32 hkey, *ignore_acpi_ev = true; } return true; + } else { + return adaptive_keyboard_hotkey_notify_hotkey(scancode); } return false; } -- 1.9.0 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH V3] support Thinkpad X1 Carbon 2nd generation's adaptive keyboard @ 2014-03-04 11:13 ` Shuduo Sang 0 siblings, 0 replies; 14+ messages in thread From: Shuduo Sang @ 2014-03-04 11:13 UTC (permalink / raw) To: Tobias Klauser, bjorn, ibm-acpi-devel, linux-acpi, linux-kernel, ibm-acpi, matthew.garrett, platform-driver-x86, bruce.ma Submit patch V3 to support Adaptive Keyboard on Thinkpad X1 Carbon 2nd generation according to Tobias's comments. Thanks, Shuduo From 2b8175e69deee661d97d371b2422a9c192fefd52 Mon Sep 17 00:00:00 2001 From: Shuduo Sang <sangshuduo@gmail.com> Date: Mon, 3 Mar 2014 14:29:32 +0800 Subject: [PATCH] support thinkpad X1 Carbon's adaptive keyboard Thinkpad X1 Carbon's adaptive keyboard has five modes including Home mode, Web browser mode, Web conference mode, Function mode and Lay-flat mode. We support Home mode and Function mode currently. Signed-off-by: Bruce Ma <bruce.ma@canonical.com> Signed-off-by: Shuduo Sang <shuduo.sang@canonical.com> --- drivers/platform/x86/thinkpad_acpi.c | 102 +++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index defb6af..6664dcd 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -3437,6 +3437,106 @@ err_exit: return (res < 0)? res : 1; } +/* Thinkpad X1 Carbon support 5 modes including Home mode, Web browser + * mode, Web conference mode, Function mode and Lay-flat mode. + * We support Home mode and Function mode currently. + * + * Will consider support rest of modes in future. + * + */ +enum ADAPTIVE_KEY_MODE { + HOME_MODE, + WEB_BROWSER_MODE, + WEB_CONFERENCE_MODE, + FUNCTION_MODE, + LAYFLAT_MODE +}; + +int adaptive_keyboard_modes[] = { + HOME_MODE, +/* WEB_BROWSER_MODE = 2, + WEB_CONFERENCE_MODE = 3, */ + FUNCTION_MODE +}; + +#define DFR_CHANGE_ROW 0x101 +#define DFR_SHOW_QUICKVIEW_ROW 0x102 + +/* press Fn key a while second, it will switch to Function Mode. Then + * release Fn key, previous mode be restored. + */ +static bool adaptive_keyboard_mode_is_saved; +static int adaptive_keyboard_prev_mode; + +static int adaptive_keyboard_get_next_mode(int mode) +{ + int i; + size_t max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1; + + for (i = 0; i <= max_mode; i++) { + if (adaptive_keyboard_modes[i] == mode) + break; + } + + if (i >= max_mode) + i = 0; + else + i++; + + return adaptive_keyboard_modes[i]; +} + +static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode) +{ + u32 current_mode = 0; + int new_mode = 0; + + switch (scancode) { + case DFR_CHANGE_ROW: + if (adaptive_keyboard_mode_is_saved) { + new_mode = adaptive_keyboard_prev_mode; + adaptive_keyboard_mode_is_saved = false; + } else { + if (!acpi_evalf( + hkey_handle, ¤t_mode, + "GTRW", "dd", 0)) { + pr_err("Cannot read adaptive keyboard mode\n"); + return false; + } else { + new_mode = adaptive_keyboard_get_next_mode( + current_mode); + } + } + + if (!acpi_evalf(hkey_handle, NULL, "STRW", "vd", new_mode)) { + pr_err("Cannot set adaptive keyboard mode\n"); + return false; + } + + return true; + + case DFR_SHOW_QUICKVIEW_ROW: + if (!acpi_evalf(hkey_handle, + &adaptive_keyboard_prev_mode, + "GTRW", "dd", 0)) { + pr_err("Cannot read adaptive keyboard mode\n"); + return false; + } else { + adaptive_keyboard_mode_is_saved = true; + + if (!acpi_evalf(hkey_handle, + NULL, "STRW", "vd", FUNCTION_MODE)) { + pr_err("Cannot set adaptive keyboard mode\n"); + return false; + } + } + return true; + + default: + return false; + } +} + static bool hotkey_notify_hotkey(const u32 hkey, bool *send_acpi_ev, bool *ignore_acpi_ev) @@ -3456,6 +3556,8 @@ static bool hotkey_notify_hotkey(const u32 hkey, *ignore_acpi_ev = true; } return true; + } else { + return adaptive_keyboard_hotkey_notify_hotkey(scancode); } return false; } -- 1.9.0 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH V3] support Thinkpad X1 Carbon 2nd generation's adaptive keyboard 2014-03-04 11:13 ` Shuduo Sang (?) @ 2014-03-04 13:51 ` Tobias Klauser [not found] ` <20140304135120.GF1883-93Khv+1bN0NyDzI6CaY1VQ@public.gmane.org> -1 siblings, 1 reply; 14+ messages in thread From: Tobias Klauser @ 2014-03-04 13:51 UTC (permalink / raw) To: Shuduo Sang Cc: bjorn, ibm-acpi-devel, linux-acpi, linux-kernel, ibm-acpi, matthew.garrett, platform-driver-x86, bruce.ma On 2014-03-04 at 12:13:54 +0100, Shuduo Sang <shuduo.sang@canonical.com> wrote: > > Submit patch V3 to support Adaptive Keyboard on Thinkpad X1 Carbon 2nd > generation according to Tobias's comments. It seems like I missed one in the previous comment, sorry. Also one of the previous comments was only partially addressed in this updated patch. See below for the comments... > Thanks, > Shuduo > > From 2b8175e69deee661d97d371b2422a9c192fefd52 Mon Sep 17 00:00:00 2001 > From: Shuduo Sang <sangshuduo@gmail.com> > Date: Mon, 3 Mar 2014 14:29:32 +0800 > Subject: [PATCH] support thinkpad X1 Carbon's adaptive keyboard > > Thinkpad X1 Carbon's adaptive keyboard has five modes including Home > mode, Web browser mode, Web conference mode, Function mode and Lay-flat > mode. We support Home mode and Function mode currently. > > Signed-off-by: Bruce Ma <bruce.ma@canonical.com> > Signed-off-by: Shuduo Sang <shuduo.sang@canonical.com> > --- > drivers/platform/x86/thinkpad_acpi.c | 102 > +++++++++++++++++++++++++++++++++++ > 1 file changed, 102 insertions(+) > > diff --git a/drivers/platform/x86/thinkpad_acpi.c > b/drivers/platform/x86/thinkpad_acpi.c > index defb6af..6664dcd 100644 > --- a/drivers/platform/x86/thinkpad_acpi.c > +++ b/drivers/platform/x86/thinkpad_acpi.c > @@ -3437,6 +3437,106 @@ err_exit: > return (res < 0)? res : 1; > } > > +/* Thinkpad X1 Carbon support 5 modes including Home mode, Web browser > + * mode, Web conference mode, Function mode and Lay-flat mode. > + * We support Home mode and Function mode currently. > + * > + * Will consider support rest of modes in future. > + * > + */ > +enum ADAPTIVE_KEY_MODE { > + HOME_MODE, > + WEB_BROWSER_MODE, > + WEB_CONFERENCE_MODE, > + FUNCTION_MODE, > + LAYFLAT_MODE > +}; > + > +int adaptive_keyboard_modes[] = { > + HOME_MODE, > +/* WEB_BROWSER_MODE = 2, > + WEB_CONFERENCE_MODE = 3, */ > + FUNCTION_MODE > +}; This array can be made be static const. > + > +#define DFR_CHANGE_ROW 0x101 > +#define DFR_SHOW_QUICKVIEW_ROW 0x102 > + > +/* press Fn key a while second, it will switch to Function Mode. Then > + * release Fn key, previous mode be restored. > + */ > +static bool adaptive_keyboard_mode_is_saved; > +static int adaptive_keyboard_prev_mode; > + > +static int adaptive_keyboard_get_next_mode(int mode) > +{ > + int i; This should be size_t as well, as mentioned in the previous comment. > + size_t max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1; > + > + for (i = 0; i <= max_mode; i++) { > + if (adaptive_keyboard_modes[i] == mode) > + break; > + } > + > + if (i >= max_mode) > + i = 0; > + else > + i++; > + > + return adaptive_keyboard_modes[i]; > +} > + > +static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode) > +{ > + u32 current_mode = 0; > + int new_mode = 0; > + > + switch (scancode) { > + case DFR_CHANGE_ROW: > + if (adaptive_keyboard_mode_is_saved) { > + new_mode = adaptive_keyboard_prev_mode; > + adaptive_keyboard_mode_is_saved = false; > + } else { > + if (!acpi_evalf( > + hkey_handle, ¤t_mode, > + "GTRW", "dd", 0)) { > + pr_err("Cannot read adaptive keyboard mode\n"); > + return false; > + } else { > + new_mode = adaptive_keyboard_get_next_mode( > + current_mode); > + } > + } > + > + if (!acpi_evalf(hkey_handle, NULL, "STRW", "vd", new_mode)) { > + pr_err("Cannot set adaptive keyboard mode\n"); > + return false; > + } > + > + return true; > + > + case DFR_SHOW_QUICKVIEW_ROW: > + if (!acpi_evalf(hkey_handle, > + &adaptive_keyboard_prev_mode, > + "GTRW", "dd", 0)) { > + pr_err("Cannot read adaptive keyboard mode\n"); > + return false; > + } else { > + adaptive_keyboard_mode_is_saved = true; > + > + if (!acpi_evalf(hkey_handle, > + NULL, "STRW", "vd", FUNCTION_MODE)) { > + pr_err("Cannot set adaptive keyboard mode\n"); > + return false; > + } > + } > + return true; > + > + default: > + return false; > + } > +} > + > static bool hotkey_notify_hotkey(const u32 hkey, > bool *send_acpi_ev, > bool *ignore_acpi_ev) > @@ -3456,6 +3556,8 @@ static bool hotkey_notify_hotkey(const u32 hkey, > *ignore_acpi_ev = true; > } > return true; > + } else { > + return adaptive_keyboard_hotkey_notify_hotkey(scancode); > } > return false; > } > -- > 1.9.0 > ^ permalink raw reply [flat|nested] 14+ messages in thread
[parent not found: <20140304135120.GF1883-93Khv+1bN0NyDzI6CaY1VQ@public.gmane.org>]
* Re: [PATCH V3] support Thinkpad X1 Carbon 2nd generation's adaptive keyboard [not found] ` <20140304135120.GF1883-93Khv+1bN0NyDzI6CaY1VQ@public.gmane.org> @ 2014-03-05 4:20 ` Shuduo Sang 0 siblings, 0 replies; 14+ messages in thread From: Shuduo Sang @ 2014-03-05 4:20 UTC (permalink / raw) To: Tobias Klauser Cc: linux-acpi-u79uwXL29TY76Z2rM5mHXA, ibm-acpi-N3TV7GIv+o9fyO9Q7EP/yw, linux-kernel-u79uwXL29TY76Z2rM5mHXA, platform-driver-x86-u79uwXL29TY76Z2rM5mHXA, ibm-acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Bruce Ma, matthew.garrett-+LlxwbBB2+6sTnJN9+BGXg, Bjørn Mork [-- Attachment #1.1: Type: text/plain, Size: 5819 bytes --] OK. I will modify them in V4. :) On Tue, Mar 4, 2014 at 9:51 PM, Tobias Klauser <tklauser-93Khv+1bN0NyDzI6CaY1VQ@public.gmane.org> wrote: > On 2014-03-04 at 12:13:54 +0100, Shuduo Sang <shuduo.sang-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> > wrote: > > > > Submit patch V3 to support Adaptive Keyboard on Thinkpad X1 Carbon 2nd > > generation according to Tobias's comments. > > It seems like I missed one in the previous comment, sorry. Also one > of the previous comments was only partially addressed in this updated > patch. See below for the comments... > > > Thanks, > > Shuduo > > > > From 2b8175e69deee661d97d371b2422a9c192fefd52 Mon Sep 17 00:00:00 2001 > > From: Shuduo Sang <sangshuduo-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> > > Date: Mon, 3 Mar 2014 14:29:32 +0800 > > Subject: [PATCH] support thinkpad X1 Carbon's adaptive keyboard > > > > Thinkpad X1 Carbon's adaptive keyboard has five modes including Home > > mode, Web browser mode, Web conference mode, Function mode and Lay-flat > > mode. We support Home mode and Function mode currently. > > > > Signed-off-by: Bruce Ma <bruce.ma-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> > > Signed-off-by: Shuduo Sang <shuduo.sang-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> > > --- > > drivers/platform/x86/thinkpad_acpi.c | 102 > > +++++++++++++++++++++++++++++++++++ > > 1 file changed, 102 insertions(+) > > > > diff --git a/drivers/platform/x86/thinkpad_acpi.c > > b/drivers/platform/x86/thinkpad_acpi.c > > index defb6af..6664dcd 100644 > > --- a/drivers/platform/x86/thinkpad_acpi.c > > +++ b/drivers/platform/x86/thinkpad_acpi.c > > @@ -3437,6 +3437,106 @@ err_exit: > > return (res < 0)? res : 1; > > } > > > > +/* Thinkpad X1 Carbon support 5 modes including Home mode, Web browser > > + * mode, Web conference mode, Function mode and Lay-flat mode. > > + * We support Home mode and Function mode currently. > > + * > > + * Will consider support rest of modes in future. > > + * > > + */ > > +enum ADAPTIVE_KEY_MODE { > > + HOME_MODE, > > + WEB_BROWSER_MODE, > > + WEB_CONFERENCE_MODE, > > + FUNCTION_MODE, > > + LAYFLAT_MODE > > +}; > > + > > +int adaptive_keyboard_modes[] = { > > + HOME_MODE, > > +/* WEB_BROWSER_MODE = 2, > > + WEB_CONFERENCE_MODE = 3, */ > > + FUNCTION_MODE > > +}; > > This array can be made be static const. > > > + > > +#define DFR_CHANGE_ROW 0x101 > > +#define DFR_SHOW_QUICKVIEW_ROW 0x102 > > + > > +/* press Fn key a while second, it will switch to Function Mode. Then > > + * release Fn key, previous mode be restored. > > + */ > > +static bool adaptive_keyboard_mode_is_saved; > > +static int adaptive_keyboard_prev_mode; > > + > > +static int adaptive_keyboard_get_next_mode(int mode) > > +{ > > + int i; > > This should be size_t as well, as mentioned in the previous comment. > > > + size_t max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1; > > + > > + for (i = 0; i <= max_mode; i++) { > > + if (adaptive_keyboard_modes[i] == mode) > > + break; > > + } > > + > > + if (i >= max_mode) > > + i = 0; > > + else > > + i++; > > + > > + return adaptive_keyboard_modes[i]; > > +} > > + > > +static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int > scancode) > > +{ > > + u32 current_mode = 0; > > + int new_mode = 0; > > + > > + switch (scancode) { > > + case DFR_CHANGE_ROW: > > + if (adaptive_keyboard_mode_is_saved) { > > + new_mode = adaptive_keyboard_prev_mode; > > + adaptive_keyboard_mode_is_saved = false; > > + } else { > > + if (!acpi_evalf( > > + hkey_handle, ¤t_mode, > > + "GTRW", "dd", 0)) { > > + pr_err("Cannot read adaptive keyboard > mode\n"); > > + return false; > > + } else { > > + new_mode = adaptive_keyboard_get_next_mode( > > + current_mode); > > + } > > + } > > + > > + if (!acpi_evalf(hkey_handle, NULL, "STRW", "vd", > new_mode)) { > > + pr_err("Cannot set adaptive keyboard mode\n"); > > + return false; > > + } > > + > > + return true; > > + > > + case DFR_SHOW_QUICKVIEW_ROW: > > + if (!acpi_evalf(hkey_handle, > > + &adaptive_keyboard_prev_mode, > > + "GTRW", "dd", 0)) { > > + pr_err("Cannot read adaptive keyboard mode\n"); > > + return false; > > + } else { > > + adaptive_keyboard_mode_is_saved = true; > > + > > + if (!acpi_evalf(hkey_handle, > > + NULL, "STRW", "vd", > FUNCTION_MODE)) { > > + pr_err("Cannot set adaptive keyboard > mode\n"); > > + return false; > > + } > > + } > > + return true; > > + > > + default: > > + return false; > > + } > > +} > > + > > static bool hotkey_notify_hotkey(const u32 hkey, > > bool *send_acpi_ev, > > bool *ignore_acpi_ev) > > @@ -3456,6 +3556,8 @@ static bool hotkey_notify_hotkey(const u32 hkey, > > *ignore_acpi_ev = true; > > } > > return true; > > + } else { > > + return adaptive_keyboard_hotkey_notify_hotkey(scancode); > > } > > return false; > > } > > -- > > 1.9.0 > > > [-- Attachment #1.2: Type: text/html, Size: 7613 bytes --] [-- Attachment #2: Type: text/plain, Size: 451 bytes --] ------------------------------------------------------------------------------ Subversion Kills Productivity. Get off Subversion & Make the Move to Perforce. With Perforce, you get hassle-free workflows. Merge that actually works. Faster operations. Version large binaries. Built-in WAN optimization and the freedom to use Git, Perforce or both. Make the move to Perforce. http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk [-- Attachment #3: Type: text/plain, Size: 201 bytes --] _______________________________________________ ibm-acpi-devel mailing list ibm-acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org https://lists.sourceforge.net/lists/listinfo/ibm-acpi-devel ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH V3] support Thinkpad X1 Carbon 2nd generation's adaptive keyboard 2014-03-04 11:13 ` Shuduo Sang (?) (?) @ 2014-03-05 5:54 ` SeongJae Park 2014-03-05 6:35 ` Shuduo Sang -1 siblings, 1 reply; 14+ messages in thread From: SeongJae Park @ 2014-03-05 5:54 UTC (permalink / raw) To: Shuduo Sang Cc: Tobias Klauser, bjorn, ibm-acpi-devel, linux-acpi, linux-kernel@vger.kernel.org, ibm-acpi, matthew.garrett, platform-driver-x86, bruce.ma Hello, This is just a trivial comment. On Tue, Mar 4, 2014 at 8:13 PM, Shuduo Sang <shuduo.sang@canonical.com> wrote: > > > Submit patch V3 to support Adaptive Keyboard on Thinkpad X1 Carbon 2nd > generation according to Tobias's comments. > > Thanks, > Shuduo > > From 2b8175e69deee661d97d371b2422a9c192fefd52 Mon Sep 17 00:00:00 2001 > From: Shuduo Sang <sangshuduo@gmail.com> > Date: Mon, 3 Mar 2014 14:29:32 +0800 > Subject: [PATCH] support thinkpad X1 Carbon's adaptive keyboard > > Thinkpad X1 Carbon's adaptive keyboard has five modes including Home > mode, Web browser mode, Web conference mode, Function mode and Lay-flat > mode. We support Home mode and Function mode currently. > > Signed-off-by: Bruce Ma <bruce.ma@canonical.com> > Signed-off-by: Shuduo Sang <shuduo.sang@canonical.com> > --- > drivers/platform/x86/thinkpad_acpi.c | 102 > +++++++++++++++++++++++++++++++++++ > 1 file changed, 102 insertions(+) > > diff --git a/drivers/platform/x86/thinkpad_acpi.c > b/drivers/platform/x86/thinkpad_acpi.c > index defb6af..6664dcd 100644 > --- a/drivers/platform/x86/thinkpad_acpi.c > +++ b/drivers/platform/x86/thinkpad_acpi.c > @@ -3437,6 +3437,106 @@ err_exit: > return (res < 0)? res : 1; > } > > +/* Thinkpad X1 Carbon support 5 modes including Home mode, Web browser > + * mode, Web conference mode, Function mode and Lay-flat mode. > + * We support Home mode and Function mode currently. > + * > + * Will consider support rest of modes in future. > + * > + */ > +enum ADAPTIVE_KEY_MODE { > + HOME_MODE, > + WEB_BROWSER_MODE, > + WEB_CONFERENCE_MODE, > + FUNCTION_MODE, > + LAYFLAT_MODE > +}; > + > +int adaptive_keyboard_modes[] = { > + HOME_MODE, > +/* WEB_BROWSER_MODE = 2, > + WEB_CONFERENCE_MODE = 3, */ > + FUNCTION_MODE > +}; > + > +#define DFR_CHANGE_ROW 0x101 > +#define DFR_SHOW_QUICKVIEW_ROW 0x102 > + > +/* press Fn key a while second, it will switch to Function Mode. Then > + * release Fn key, previous mode be restored. > + */ > +static bool adaptive_keyboard_mode_is_saved; > +static int adaptive_keyboard_prev_mode; > + > +static int adaptive_keyboard_get_next_mode(int mode) > +{ > + int i; > + size_t max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1; > + > + for (i = 0; i <= max_mode; i++) { > + if (adaptive_keyboard_modes[i] == mode) > + break; > + } > + > + if (i >= max_mode) > + i = 0; > + else > + i++; > + > + return adaptive_keyboard_modes[i]; > +} > + > +static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode) > +{ > + u32 current_mode = 0; > + int new_mode = 0; > + > + switch (scancode) { > + case DFR_CHANGE_ROW: > + if (adaptive_keyboard_mode_is_saved) { > + new_mode = adaptive_keyboard_prev_mode; > + adaptive_keyboard_mode_is_saved = false; > + } else { > + if (!acpi_evalf( > + hkey_handle, ¤t_mode, > + "GTRW", "dd", 0)) { > + pr_err("Cannot read adaptive keyboard mode\n"); > + return false; > + } else { > + new_mode = adaptive_keyboard_get_next_mode( > + current_mode); > + } > + } > + > + if (!acpi_evalf(hkey_handle, NULL, "STRW", "vd", new_mode)) { > + pr_err("Cannot set adaptive keyboard mode\n"); > + return false; > + } > + > + return true; Isn't the blank line above return statement unnecessary? > + > + case DFR_SHOW_QUICKVIEW_ROW: > + if (!acpi_evalf(hkey_handle, > + &adaptive_keyboard_prev_mode, > + "GTRW", "dd", 0)) { > + pr_err("Cannot read adaptive keyboard mode\n"); > + return false; > + } else { > + adaptive_keyboard_mode_is_saved = true; > + > + if (!acpi_evalf(hkey_handle, > + NULL, "STRW", "vd", FUNCTION_MODE)) { > + pr_err("Cannot set adaptive keyboard mode\n"); > + return false; > + } > + } > + return true; > + > + default: > + return false; > + } > +} > + > static bool hotkey_notify_hotkey(const u32 hkey, > bool *send_acpi_ev, > bool *ignore_acpi_ev) > @@ -3456,6 +3556,8 @@ static bool hotkey_notify_hotkey(const u32 hkey, > *ignore_acpi_ev = true; > } > return true; > + } else { > + return adaptive_keyboard_hotkey_notify_hotkey(scancode); > } > return false; > } > -- > 1.9.0 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH V3] support Thinkpad X1 Carbon 2nd generation's adaptive keyboard 2014-03-05 5:54 ` SeongJae Park @ 2014-03-05 6:35 ` Shuduo Sang 2014-03-05 7:06 ` SeongJae Park 0 siblings, 1 reply; 14+ messages in thread From: Shuduo Sang @ 2014-03-05 6:35 UTC (permalink / raw) To: SeongJae Park Cc: Tobias Klauser, bjorn, ibm-acpi-devel, linux-acpi, linux-kernel@vger.kernel.org, ibm-acpi, matthew.garrett, platform-driver-x86, bruce.ma On 03/05/2014 01:54 PM, SeongJae Park wrote: > Hello, > This is just a trivial comment. > > > On Tue, Mar 4, 2014 at 8:13 PM, Shuduo Sang <shuduo.sang@canonical.com> wrote: >> >> >> Submit patch V3 to support Adaptive Keyboard on Thinkpad X1 Carbon 2nd >> generation according to Tobias's comments. >> >> Thanks, >> Shuduo >> >> From 2b8175e69deee661d97d371b2422a9c192fefd52 Mon Sep 17 00:00:00 2001 >> From: Shuduo Sang <sangshuduo@gmail.com> >> Date: Mon, 3 Mar 2014 14:29:32 +0800 >> Subject: [PATCH] support thinkpad X1 Carbon's adaptive keyboard >> >> Thinkpad X1 Carbon's adaptive keyboard has five modes including Home >> mode, Web browser mode, Web conference mode, Function mode and Lay-flat >> mode. We support Home mode and Function mode currently. >> >> Signed-off-by: Bruce Ma <bruce.ma@canonical.com> >> Signed-off-by: Shuduo Sang <shuduo.sang@canonical.com> >> --- >> drivers/platform/x86/thinkpad_acpi.c | 102 >> +++++++++++++++++++++++++++++++++++ >> 1 file changed, 102 insertions(+) >> >> diff --git a/drivers/platform/x86/thinkpad_acpi.c >> b/drivers/platform/x86/thinkpad_acpi.c >> index defb6af..6664dcd 100644 >> --- a/drivers/platform/x86/thinkpad_acpi.c >> +++ b/drivers/platform/x86/thinkpad_acpi.c >> @@ -3437,6 +3437,106 @@ err_exit: >> return (res < 0)? res : 1; >> } >> >> +/* Thinkpad X1 Carbon support 5 modes including Home mode, Web browser >> + * mode, Web conference mode, Function mode and Lay-flat mode. >> + * We support Home mode and Function mode currently. >> + * >> + * Will consider support rest of modes in future. >> + * >> + */ >> +enum ADAPTIVE_KEY_MODE { >> + HOME_MODE, >> + WEB_BROWSER_MODE, >> + WEB_CONFERENCE_MODE, >> + FUNCTION_MODE, >> + LAYFLAT_MODE >> +}; >> + >> +int adaptive_keyboard_modes[] = { >> + HOME_MODE, >> +/* WEB_BROWSER_MODE = 2, >> + WEB_CONFERENCE_MODE = 3, */ >> + FUNCTION_MODE >> +}; >> + >> +#define DFR_CHANGE_ROW 0x101 >> +#define DFR_SHOW_QUICKVIEW_ROW 0x102 >> + >> +/* press Fn key a while second, it will switch to Function Mode. Then >> + * release Fn key, previous mode be restored. >> + */ >> +static bool adaptive_keyboard_mode_is_saved; >> +static int adaptive_keyboard_prev_mode; >> + >> +static int adaptive_keyboard_get_next_mode(int mode) >> +{ >> + int i; >> + size_t max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1; >> + >> + for (i = 0; i <= max_mode; i++) { >> + if (adaptive_keyboard_modes[i] == mode) >> + break; >> + } >> + >> + if (i >= max_mode) >> + i = 0; >> + else >> + i++; >> + >> + return adaptive_keyboard_modes[i]; >> +} >> + >> +static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode) >> +{ >> + u32 current_mode = 0; >> + int new_mode = 0; >> + >> + switch (scancode) { >> + case DFR_CHANGE_ROW: >> + if (adaptive_keyboard_mode_is_saved) { >> + new_mode = adaptive_keyboard_prev_mode; >> + adaptive_keyboard_mode_is_saved = false; >> + } else { >> + if (!acpi_evalf( >> + hkey_handle, ¤t_mode, >> + "GTRW", "dd", 0)) { >> + pr_err("Cannot read adaptive keyboard mode\n"); >> + return false; >> + } else { >> + new_mode = adaptive_keyboard_get_next_mode( >> + current_mode); >> + } >> + } >> + >> + if (!acpi_evalf(hkey_handle, NULL, "STRW", "vd", new_mode)) { >> + pr_err("Cannot set adaptive keyboard mode\n"); >> + return false; >> + } >> + >> + return true; > > Isn't the blank line above return statement unnecessary? > Doesn't it look clearly? :) >> + >> + case DFR_SHOW_QUICKVIEW_ROW: >> + if (!acpi_evalf(hkey_handle, >> + &adaptive_keyboard_prev_mode, >> + "GTRW", "dd", 0)) { >> + pr_err("Cannot read adaptive keyboard mode\n"); >> + return false; >> + } else { >> + adaptive_keyboard_mode_is_saved = true; >> + >> + if (!acpi_evalf(hkey_handle, >> + NULL, "STRW", "vd", FUNCTION_MODE)) { >> + pr_err("Cannot set adaptive keyboard mode\n"); >> + return false; >> + } >> + } >> + return true; >> + >> + default: >> + return false; >> + } >> +} >> + >> static bool hotkey_notify_hotkey(const u32 hkey, >> bool *send_acpi_ev, >> bool *ignore_acpi_ev) >> @@ -3456,6 +3556,8 @@ static bool hotkey_notify_hotkey(const u32 hkey, >> *ignore_acpi_ev = true; >> } >> return true; >> + } else { >> + return adaptive_keyboard_hotkey_notify_hotkey(scancode); >> } >> return false; >> } >> -- >> 1.9.0 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH V3] support Thinkpad X1 Carbon 2nd generation's adaptive keyboard 2014-03-05 6:35 ` Shuduo Sang @ 2014-03-05 7:06 ` SeongJae Park 0 siblings, 0 replies; 14+ messages in thread From: SeongJae Park @ 2014-03-05 7:06 UTC (permalink / raw) To: Shuduo Sang Cc: Tobias Klauser, bjorn, ibm-acpi-devel, linux-acpi, linux-kernel@vger.kernel.org, ibm-acpi, matthew.garrett, platform-driver-x86, Bruce Ma On Wed, Mar 5, 2014 at 3:35 PM, Shuduo Sang <shuduo.sang@canonical.com> wrote: > > > On 03/05/2014 01:54 PM, SeongJae Park wrote: >> Hello, >> This is just a trivial comment. >> >> >> On Tue, Mar 4, 2014 at 8:13 PM, Shuduo Sang <shuduo.sang@canonical.com> wrote: >>> >>> >>> Submit patch V3 to support Adaptive Keyboard on Thinkpad X1 Carbon 2nd >>> generation according to Tobias's comments. >>> >>> Thanks, >>> Shuduo >>> >>> From 2b8175e69deee661d97d371b2422a9c192fefd52 Mon Sep 17 00:00:00 2001 >>> From: Shuduo Sang <sangshuduo@gmail.com> >>> Date: Mon, 3 Mar 2014 14:29:32 +0800 >>> Subject: [PATCH] support thinkpad X1 Carbon's adaptive keyboard >>> >>> Thinkpad X1 Carbon's adaptive keyboard has five modes including Home >>> mode, Web browser mode, Web conference mode, Function mode and Lay-flat >>> mode. We support Home mode and Function mode currently. >>> >>> Signed-off-by: Bruce Ma <bruce.ma@canonical.com> >>> Signed-off-by: Shuduo Sang <shuduo.sang@canonical.com> >>> --- >>> drivers/platform/x86/thinkpad_acpi.c | 102 >>> +++++++++++++++++++++++++++++++++++ >>> 1 file changed, 102 insertions(+) >>> >>> diff --git a/drivers/platform/x86/thinkpad_acpi.c >>> b/drivers/platform/x86/thinkpad_acpi.c >>> index defb6af..6664dcd 100644 >>> --- a/drivers/platform/x86/thinkpad_acpi.c >>> +++ b/drivers/platform/x86/thinkpad_acpi.c >>> @@ -3437,6 +3437,106 @@ err_exit: >>> return (res < 0)? res : 1; >>> } >>> >>> +/* Thinkpad X1 Carbon support 5 modes including Home mode, Web browser >>> + * mode, Web conference mode, Function mode and Lay-flat mode. >>> + * We support Home mode and Function mode currently. >>> + * >>> + * Will consider support rest of modes in future. >>> + * >>> + */ >>> +enum ADAPTIVE_KEY_MODE { >>> + HOME_MODE, >>> + WEB_BROWSER_MODE, >>> + WEB_CONFERENCE_MODE, >>> + FUNCTION_MODE, >>> + LAYFLAT_MODE >>> +}; >>> + >>> +int adaptive_keyboard_modes[] = { >>> + HOME_MODE, >>> +/* WEB_BROWSER_MODE = 2, >>> + WEB_CONFERENCE_MODE = 3, */ >>> + FUNCTION_MODE >>> +}; >>> + >>> +#define DFR_CHANGE_ROW 0x101 >>> +#define DFR_SHOW_QUICKVIEW_ROW 0x102 >>> + >>> +/* press Fn key a while second, it will switch to Function Mode. Then >>> + * release Fn key, previous mode be restored. >>> + */ >>> +static bool adaptive_keyboard_mode_is_saved; >>> +static int adaptive_keyboard_prev_mode; >>> + >>> +static int adaptive_keyboard_get_next_mode(int mode) >>> +{ >>> + int i; >>> + size_t max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1; >>> + >>> + for (i = 0; i <= max_mode; i++) { >>> + if (adaptive_keyboard_modes[i] == mode) >>> + break; >>> + } >>> + >>> + if (i >= max_mode) >>> + i = 0; >>> + else >>> + i++; >>> + >>> + return adaptive_keyboard_modes[i]; >>> +} >>> + >>> +static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode) >>> +{ >>> + u32 current_mode = 0; >>> + int new_mode = 0; >>> + >>> + switch (scancode) { >>> + case DFR_CHANGE_ROW: >>> + if (adaptive_keyboard_mode_is_saved) { >>> + new_mode = adaptive_keyboard_prev_mode; >>> + adaptive_keyboard_mode_is_saved = false; >>> + } else { >>> + if (!acpi_evalf( >>> + hkey_handle, ¤t_mode, >>> + "GTRW", "dd", 0)) { >>> + pr_err("Cannot read adaptive keyboard mode\n"); >>> + return false; >>> + } else { >>> + new_mode = adaptive_keyboard_get_next_mode( >>> + current_mode); >>> + } >>> + } >>> + >>> + if (!acpi_evalf(hkey_handle, NULL, "STRW", "vd", new_mode)) { >>> + pr_err("Cannot set adaptive keyboard mode\n"); >>> + return false; >>> + } >>> + >>> + return true; >> >> Isn't the blank line above return statement unnecessary? >> > > Doesn't it look clearly? :) Well, I thought it might be unintended blank line because the return statement in below case doesn't have blank line. Anyway, I agree if it was your intention. > >>> + >>> + case DFR_SHOW_QUICKVIEW_ROW: >>> + if (!acpi_evalf(hkey_handle, >>> + &adaptive_keyboard_prev_mode, >>> + "GTRW", "dd", 0)) { >>> + pr_err("Cannot read adaptive keyboard mode\n"); >>> + return false; >>> + } else { >>> + adaptive_keyboard_mode_is_saved = true; >>> + >>> + if (!acpi_evalf(hkey_handle, >>> + NULL, "STRW", "vd", FUNCTION_MODE)) { >>> + pr_err("Cannot set adaptive keyboard mode\n"); >>> + return false; >>> + } >>> + } >>> + return true; >>> + >>> + default: >>> + return false; >>> + } >>> +} >>> + >>> static bool hotkey_notify_hotkey(const u32 hkey, >>> bool *send_acpi_ev, >>> bool *ignore_acpi_ev) >>> @@ -3456,6 +3556,8 @@ static bool hotkey_notify_hotkey(const u32 hkey, >>> *ignore_acpi_ev = true; >>> } >>> return true; >>> + } else { >>> + return adaptive_keyboard_hotkey_notify_hotkey(scancode); >>> } >>> return false; >>> } >>> -- >>> 1.9.0 >>> >>> -- >>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in >>> the body of a message to majordomo@vger.kernel.org >>> More majordomo info at http://vger.kernel.org/majordomo-info.html >>> Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 14+ messages in thread
[parent not found: <20140304091916.GE1883-93Khv+1bN0NyDzI6CaY1VQ@public.gmane.org>]
* [PATCH V4] support Thinkpad X1 Carbon 2nd generation's adaptive keyboard [not found] ` <20140304091916.GE1883-93Khv+1bN0NyDzI6CaY1VQ@public.gmane.org> 2014-03-06 10:20 ` Shuduo Sang @ 2014-03-06 10:20 ` Shuduo Sang 0 siblings, 0 replies; 14+ messages in thread From: Shuduo Sang @ 2014-03-06 10:20 UTC (permalink / raw) To: Tobias Klauser, bjorn-yOkvZcmFvRU, ibm-acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, linux-acpi-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, ibm-acpi-N3TV7GIv+o9fyO9Q7EP/yw, matthew.garrett-+LlxwbBB2+6sTnJN9+BGXg, platform-driver-x86-u79uwXL29TY76Z2rM5mHXA Cc: bruce.ma-Z7WLFzj8eWMS+FvcfC7Uqw Submit patch V4 to support Adaptive Keyboard on Thinkpad X1 Carbon 2nd generation according to Tobias's comments. Thanks, Shuduo >From b153a7b14791c6e01892c0e274e23eefd625fb8d Mon Sep 17 00:00:00 2001 From: Shuduo Sang <shuduo.sang-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> Date: Mon, 3 Mar 2014 14:29:32 +0800 Subject: [PATCH] support thinkpad X1 Carbon's adaptive keyboard Thinkpad X1 Carbon's adaptive keyboard has five modes including Home mode, Web browser mode, Web conference mode, Function mode and Lay-flat mode. We support Home mode and Function mode currently. Signed-off-by: Bruce Ma <bruce.ma-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> Signed-off-by: Shuduo Sang <shuduo.sang-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> --- drivers/platform/x86/thinkpad_acpi.c | 102 +++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index defb6af..f4978fa 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -3437,6 +3437,106 @@ err_exit: return (res < 0)? res : 1; } +/* Thinkpad X1 Carbon support 5 modes including Home mode, Web browser + * mode, Web conference mode, Function mode and Lay-flat mode. + * We support Home mode and Function mode currently. + * + * Will consider support rest of modes in future. + * + */ +enum ADAPTIVE_KEY_MODE { + HOME_MODE, + WEB_BROWSER_MODE, + WEB_CONFERENCE_MODE, + FUNCTION_MODE, + LAYFLAT_MODE +}; + +const int adaptive_keyboard_modes[] = { + HOME_MODE, +/* WEB_BROWSER_MODE = 2, + WEB_CONFERENCE_MODE = 3, */ + FUNCTION_MODE +}; + +#define DFR_CHANGE_ROW 0x101 +#define DFR_SHOW_QUICKVIEW_ROW 0x102 + +/* press Fn key a while second, it will switch to Function Mode. Then + * release Fn key, previous mode be restored. + */ +static bool adaptive_keyboard_mode_is_saved; +static int adaptive_keyboard_prev_mode; + +static int adaptive_keyboard_get_next_mode(int mode) +{ + size_t i; + size_t max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1; + + for (i = 0; i <= max_mode; i++) { + if (adaptive_keyboard_modes[i] == mode) + break; + } + + if (i >= max_mode) + i = 0; + else + i++; + + return adaptive_keyboard_modes[i]; +} + +static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode) +{ + u32 current_mode = 0; + int new_mode = 0; + + switch (scancode) { + case DFR_CHANGE_ROW: + if (adaptive_keyboard_mode_is_saved) { + new_mode = adaptive_keyboard_prev_mode; + adaptive_keyboard_mode_is_saved = false; + } else { + if (!acpi_evalf( + hkey_handle, ¤t_mode, + "GTRW", "dd", 0)) { + pr_err("Cannot read adaptive keyboard mode\n"); + return false; + } else { + new_mode = adaptive_keyboard_get_next_mode( + current_mode); + } + } + + if (!acpi_evalf(hkey_handle, NULL, "STRW", "vd", new_mode)) { + pr_err("Cannot set adaptive keyboard mode\n"); + return false; + } + + return true; + + case DFR_SHOW_QUICKVIEW_ROW: + if (!acpi_evalf(hkey_handle, + &adaptive_keyboard_prev_mode, + "GTRW", "dd", 0)) { + pr_err("Cannot read adaptive keyboard mode\n"); + return false; + } else { + adaptive_keyboard_mode_is_saved = true; + + if (!acpi_evalf(hkey_handle, + NULL, "STRW", "vd", FUNCTION_MODE)) { + pr_err("Cannot set adaptive keyboard mode\n"); + return false; + } + } + return true; + + default: + return false; + } +} + static bool hotkey_notify_hotkey(const u32 hkey, bool *send_acpi_ev, bool *ignore_acpi_ev) @@ -3456,6 +3556,8 @@ static bool hotkey_notify_hotkey(const u32 hkey, *ignore_acpi_ev = true; } return true; + } else { + return adaptive_keyboard_hotkey_notify_hotkey(scancode); } return false; } -- 1.9.0 ------------------------------------------------------------------------------ Subversion Kills Productivity. Get off Subversion & Make the Move to Perforce. With Perforce, you get hassle-free workflows. Merge that actually works. Faster operations. Version large binaries. Built-in WAN optimization and the freedom to use Git, Perforce or both. Make the move to Perforce. http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH V4] support Thinkpad X1 Carbon 2nd generation's adaptive keyboard @ 2014-03-06 10:20 ` Shuduo Sang 0 siblings, 0 replies; 14+ messages in thread From: Shuduo Sang @ 2014-03-06 10:20 UTC (permalink / raw) To: Tobias Klauser, bjorn, ibm-acpi-devel, linux-acpi, linux-kernel, ibm-acpi, matthew.garrett, platform-driver-x86 Cc: bruce.ma Submit patch V4 to support Adaptive Keyboard on Thinkpad X1 Carbon 2nd generation according to Tobias's comments. Thanks, Shuduo >From b153a7b14791c6e01892c0e274e23eefd625fb8d Mon Sep 17 00:00:00 2001 From: Shuduo Sang <shuduo.sang@canonical.com> Date: Mon, 3 Mar 2014 14:29:32 +0800 Subject: [PATCH] support thinkpad X1 Carbon's adaptive keyboard Thinkpad X1 Carbon's adaptive keyboard has five modes including Home mode, Web browser mode, Web conference mode, Function mode and Lay-flat mode. We support Home mode and Function mode currently. Signed-off-by: Bruce Ma <bruce.ma@canonical.com> Signed-off-by: Shuduo Sang <shuduo.sang@canonical.com> --- drivers/platform/x86/thinkpad_acpi.c | 102 +++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index defb6af..f4978fa 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -3437,6 +3437,106 @@ err_exit: return (res < 0)? res : 1; } +/* Thinkpad X1 Carbon support 5 modes including Home mode, Web browser + * mode, Web conference mode, Function mode and Lay-flat mode. + * We support Home mode and Function mode currently. + * + * Will consider support rest of modes in future. + * + */ +enum ADAPTIVE_KEY_MODE { + HOME_MODE, + WEB_BROWSER_MODE, + WEB_CONFERENCE_MODE, + FUNCTION_MODE, + LAYFLAT_MODE +}; + +const int adaptive_keyboard_modes[] = { + HOME_MODE, +/* WEB_BROWSER_MODE = 2, + WEB_CONFERENCE_MODE = 3, */ + FUNCTION_MODE +}; + +#define DFR_CHANGE_ROW 0x101 +#define DFR_SHOW_QUICKVIEW_ROW 0x102 + +/* press Fn key a while second, it will switch to Function Mode. Then + * release Fn key, previous mode be restored. + */ +static bool adaptive_keyboard_mode_is_saved; +static int adaptive_keyboard_prev_mode; + +static int adaptive_keyboard_get_next_mode(int mode) +{ + size_t i; + size_t max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1; + + for (i = 0; i <= max_mode; i++) { + if (adaptive_keyboard_modes[i] == mode) + break; + } + + if (i >= max_mode) + i = 0; + else + i++; + + return adaptive_keyboard_modes[i]; +} + +static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode) +{ + u32 current_mode = 0; + int new_mode = 0; + + switch (scancode) { + case DFR_CHANGE_ROW: + if (adaptive_keyboard_mode_is_saved) { + new_mode = adaptive_keyboard_prev_mode; + adaptive_keyboard_mode_is_saved = false; + } else { + if (!acpi_evalf( + hkey_handle, ¤t_mode, + "GTRW", "dd", 0)) { + pr_err("Cannot read adaptive keyboard mode\n"); + return false; + } else { + new_mode = adaptive_keyboard_get_next_mode( + current_mode); + } + } + + if (!acpi_evalf(hkey_handle, NULL, "STRW", "vd", new_mode)) { + pr_err("Cannot set adaptive keyboard mode\n"); + return false; + } + + return true; + + case DFR_SHOW_QUICKVIEW_ROW: + if (!acpi_evalf(hkey_handle, + &adaptive_keyboard_prev_mode, + "GTRW", "dd", 0)) { + pr_err("Cannot read adaptive keyboard mode\n"); + return false; + } else { + adaptive_keyboard_mode_is_saved = true; + + if (!acpi_evalf(hkey_handle, + NULL, "STRW", "vd", FUNCTION_MODE)) { + pr_err("Cannot set adaptive keyboard mode\n"); + return false; + } + } + return true; + + default: + return false; + } +} + static bool hotkey_notify_hotkey(const u32 hkey, bool *send_acpi_ev, bool *ignore_acpi_ev) @@ -3456,6 +3556,8 @@ static bool hotkey_notify_hotkey(const u32 hkey, *ignore_acpi_ev = true; } return true; + } else { + return adaptive_keyboard_hotkey_notify_hotkey(scancode); } return false; } -- 1.9.0 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH V4] support Thinkpad X1 Carbon 2nd generation's adaptive keyboard @ 2014-03-06 10:20 ` Shuduo Sang 0 siblings, 0 replies; 14+ messages in thread From: Shuduo Sang @ 2014-03-06 10:20 UTC (permalink / raw) To: Tobias Klauser, bjorn-yOkvZcmFvRU, ibm-acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, linux-acpi-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, ibm-acpi-N3TV7GIv+o9fyO9Q7EP/yw, matthew.garrett-+LlxwbBB2+6sTnJN9+BGXg, platform-driver-x86-u79uwXL29TY76Z2rM5mHXA Cc: bruce.ma-Z7WLFzj8eWMS+FvcfC7Uqw Submit patch V4 to support Adaptive Keyboard on Thinkpad X1 Carbon 2nd generation according to Tobias's comments. Thanks, Shuduo From b153a7b14791c6e01892c0e274e23eefd625fb8d Mon Sep 17 00:00:00 2001 From: Shuduo Sang <shuduo.sang-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> Date: Mon, 3 Mar 2014 14:29:32 +0800 Subject: [PATCH] support thinkpad X1 Carbon's adaptive keyboard Thinkpad X1 Carbon's adaptive keyboard has five modes including Home mode, Web browser mode, Web conference mode, Function mode and Lay-flat mode. We support Home mode and Function mode currently. Signed-off-by: Bruce Ma <bruce.ma-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> Signed-off-by: Shuduo Sang <shuduo.sang-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> --- drivers/platform/x86/thinkpad_acpi.c | 102 +++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index defb6af..f4978fa 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -3437,6 +3437,106 @@ err_exit: return (res < 0)? res : 1; } +/* Thinkpad X1 Carbon support 5 modes including Home mode, Web browser + * mode, Web conference mode, Function mode and Lay-flat mode. + * We support Home mode and Function mode currently. + * + * Will consider support rest of modes in future. + * + */ +enum ADAPTIVE_KEY_MODE { + HOME_MODE, + WEB_BROWSER_MODE, + WEB_CONFERENCE_MODE, + FUNCTION_MODE, + LAYFLAT_MODE +}; + +const int adaptive_keyboard_modes[] = { + HOME_MODE, +/* WEB_BROWSER_MODE = 2, + WEB_CONFERENCE_MODE = 3, */ + FUNCTION_MODE +}; + +#define DFR_CHANGE_ROW 0x101 +#define DFR_SHOW_QUICKVIEW_ROW 0x102 + +/* press Fn key a while second, it will switch to Function Mode. Then + * release Fn key, previous mode be restored. + */ +static bool adaptive_keyboard_mode_is_saved; +static int adaptive_keyboard_prev_mode; + +static int adaptive_keyboard_get_next_mode(int mode) +{ + size_t i; + size_t max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1; + + for (i = 0; i <= max_mode; i++) { + if (adaptive_keyboard_modes[i] == mode) + break; + } + + if (i >= max_mode) + i = 0; + else + i++; + + return adaptive_keyboard_modes[i]; +} + +static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode) +{ + u32 current_mode = 0; + int new_mode = 0; + + switch (scancode) { + case DFR_CHANGE_ROW: + if (adaptive_keyboard_mode_is_saved) { + new_mode = adaptive_keyboard_prev_mode; + adaptive_keyboard_mode_is_saved = false; + } else { + if (!acpi_evalf( + hkey_handle, ¤t_mode, + "GTRW", "dd", 0)) { + pr_err("Cannot read adaptive keyboard mode\n"); + return false; + } else { + new_mode = adaptive_keyboard_get_next_mode( + current_mode); + } + } + + if (!acpi_evalf(hkey_handle, NULL, "STRW", "vd", new_mode)) { + pr_err("Cannot set adaptive keyboard mode\n"); + return false; + } + + return true; + + case DFR_SHOW_QUICKVIEW_ROW: + if (!acpi_evalf(hkey_handle, + &adaptive_keyboard_prev_mode, + "GTRW", "dd", 0)) { + pr_err("Cannot read adaptive keyboard mode\n"); + return false; + } else { + adaptive_keyboard_mode_is_saved = true; + + if (!acpi_evalf(hkey_handle, + NULL, "STRW", "vd", FUNCTION_MODE)) { + pr_err("Cannot set adaptive keyboard mode\n"); + return false; + } + } + return true; + + default: + return false; + } +} + static bool hotkey_notify_hotkey(const u32 hkey, bool *send_acpi_ev, bool *ignore_acpi_ev) @@ -3456,6 +3556,8 @@ static bool hotkey_notify_hotkey(const u32 hkey, *ignore_acpi_ev = true; } return true; + } else { + return adaptive_keyboard_hotkey_notify_hotkey(scancode); } return false; } -- 1.9.0 ------------------------------------------------------------------------------ Subversion Kills Productivity. Get off Subversion & Make the Move to Perforce. With Perforce, you get hassle-free workflows. Merge that actually works. Faster operations. Version large binaries. Built-in WAN optimization and the freedom to use Git, Perforce or both. Make the move to Perforce. http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk ^ permalink raw reply related [flat|nested] 14+ messages in thread
end of thread, other threads:[~2014-03-06 10:20 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-03-03 16:31 [PATCH V2] support Thinkpad X1 Carbon's adaptive keyboard Shuduo Sang
2014-03-03 16:31 ` Shuduo Sang
2014-03-04 9:19 ` Tobias Klauser
2014-03-04 9:47 ` Shuduo Sang
2014-03-04 11:13 ` [PATCH V3] support Thinkpad X1 Carbon 2nd generation's " Shuduo Sang
2014-03-04 11:13 ` Shuduo Sang
2014-03-04 13:51 ` Tobias Klauser
[not found] ` <20140304135120.GF1883-93Khv+1bN0NyDzI6CaY1VQ@public.gmane.org>
2014-03-05 4:20 ` Shuduo Sang
2014-03-05 5:54 ` SeongJae Park
2014-03-05 6:35 ` Shuduo Sang
2014-03-05 7:06 ` SeongJae Park
[not found] ` <20140304091916.GE1883-93Khv+1bN0NyDzI6CaY1VQ@public.gmane.org>
2014-03-06 10:20 ` [PATCH V4] " Shuduo Sang
2014-03-06 10:20 ` Shuduo Sang
2014-03-06 10:20 ` Shuduo Sang
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.