This feature is used to set keyboard language to ECFW using ASL interface.
Fewer thinkpads models like T580 , T590 , T15 Gen 1 etc.. has "=", "(',
")" numeric keys, which are not displaying correctly, when keyboard language
-is other than "english". This is because of default keyboard language in ECFW
-is set as "english". Hence using this sysfs, user can set correct keyboard
-language to ECFW and then these key's will work correctly .
+is other than "english". This is because the default keyboard language in ECFW
+is set as "english". Hence using this sysfs, user can set the correct keyboard
+language to ECFW and then these key's will work correctly.
Example of command to set keyboard language is mentioned below::
echo jp > /sys/devices/platform/thinkpad_acpi/keyboard_lang
-Text corresponding to keyboard layout to be set in sysfs are : jp (Japan), be(Belgian),
-cz(Czech), en(English), da(Danish), de(German), es(Spain) , et(Estonian),
-fr(French) , fr-ch (French(Switzerland)), pl(Polish), sl(Slovenian), hu
-(Hungarian), nl(Dutch), tr(Turkey), it(Italy), sv(Sweden), pt(portugese)
+Text corresponding to keyboard layout to be set in sysfs are: be(Belgian),
+cz(Czech), da(Danish), de(German), en(English), es(Spain), et(Estonian),
+fr(French), fr-ch(French(Switzerland)), hu(Hungarian), it(Italy), jp (Japan),
+nl(Dutch), nn(Norway), pl(Polish), pt(portugese), sl(Slovenian), sv(Sweden),
+tr(Turkey)
Adaptive keyboard
int lang_code;
};
-/*
- * When adding new entries to keyboard_lang_data, please check that
- * the select_lang[] buffer in keyboard_lang_show() is still large enough.
- */
-struct keyboard_lang_data keyboard_lang_data[] = {
- {"en", 0},
+static const struct keyboard_lang_data keyboard_lang_data[] = {
{"be", 0x080c},
{"cz", 0x0405},
{"da", 0x0406},
{"de", 0x0c07},
+ {"en", 0x0000},
{"es", 0x2c0a},
{"et", 0x0425},
{"fr", 0x040c},
struct device_attribute *attr,
char *buf)
{
- int output, err, i;
- char select_lang[80] = "";
- char lang[8] = "";
+ int output, err, i, len = 0;
err = get_keyboard_lang(&output);
if (err)
for (i = 0; i < ARRAY_SIZE(keyboard_lang_data); i++) {
if (i)
- strcat(select_lang, " ");
+ len += sysfs_emit_at(buf, len, "%s", " ");
if (output == keyboard_lang_data[i].lang_code) {
- strcat(lang, "[");
- strcat(lang, keyboard_lang_data[i].lang_str);
- strcat(lang, "]");
- strcat(select_lang, lang);
+ len += sysfs_emit_at(buf, len, "[%s]", keyboard_lang_data[i].lang_str);
} else {
- strcat(select_lang, keyboard_lang_data[i].lang_str);
+ len += sysfs_emit_at(buf, len, "%s", keyboard_lang_data[i].lang_str);
}
}
+ len += sysfs_emit_at(buf, len, "\n");
- return sysfs_emit(buf, "%s\n", select_lang);
+ return len;
}
static ssize_t keyboard_lang_store(struct device *dev,
if (err)
return err;
} else {
- pr_err("Unknown Keyboard language. Ignoring\n");
+ dev_err(&tpacpi_pdev->dev, "Unknown Keyboard language. Ignoring\n");
return -EINVAL;
}
return count;
}
-
static DEVICE_ATTR_RW(keyboard_lang);
static struct attribute *kbdlang_attributes[] = {
err = get_keyboard_lang(&output);
/*
* If support isn't available (ENODEV) then don't return an error
- * just don't create the sysfs group
+ * just don't create the sysfs group.
*/
if (err == -ENODEV)
return 0;
return err;
/* Platform supports this feature - create the sysfs file */
- err = sysfs_create_group(&tpacpi_pdev->dev.kobj, &kbdlang_attr_group);
-
- return err;
+ return sysfs_create_group(&tpacpi_pdev->dev.kobj, &kbdlang_attr_group);
}
static void kbdlang_exit(void)