Skip to content

Commit

Permalink
platform/x86: thinkpad_acpi: fixed warning and incorporated review co…
Browse files Browse the repository at this point in the history
…mments

The previous commit adding new sysfs for keyboard language has warning and
few code correction has to be done as per new review comments.

Below changes has been addressed in this version:
 - corrected warning. Many thanks to kernel test robot <lkp@intel.com> for
   reporting and determining this warning.
 - used sysfs_emit_at() API instead of strcat.
 - sorted keyboard language array.
 - removed unwanted space and corrected sentences.

Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Nitin Joshi <njoshi1@lenovo.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20210202003210.91773-1-njoshi1@lenovo.com
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
  • Loading branch information
Nitin Joshi authored and Hans de Goede committed Feb 2, 2021
1 parent a78b96f commit cfa75cc
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 29 deletions.
15 changes: 8 additions & 7 deletions Documentation/admin-guide/laptops/thinkpad-acpi.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1476,18 +1476,19 @@ sysfs: keyboard_lang
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
Expand Down
33 changes: 11 additions & 22 deletions drivers/platform/x86/thinkpad_acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -9992,16 +9992,12 @@ struct keyboard_lang_data {
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},
Expand Down Expand Up @@ -10064,29 +10060,25 @@ static ssize_t keyboard_lang_show(struct device *dev,
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)
return 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,
Expand All @@ -10113,7 +10105,7 @@ 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;
}

Expand All @@ -10124,7 +10116,6 @@ static ssize_t keyboard_lang_store(struct device *dev,

return count;
}

static DEVICE_ATTR_RW(keyboard_lang);

static struct attribute *kbdlang_attributes[] = {
Expand All @@ -10143,7 +10134,7 @@ static int tpacpi_kbdlang_init(struct ibm_init_struct *iibm)
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;
Expand All @@ -10152,9 +10143,7 @@ static int tpacpi_kbdlang_init(struct ibm_init_struct *iibm)
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)
Expand Down

0 comments on commit cfa75cc

Please sign in to comment.