mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-16 14:08:45 +00:00
input: simplify key_matrix_decode_fdt()
We know the exact property names that the code wants to process. Look these up directly with fdt_get_property(), rather than iterating over all properties within the node, and checking each property's name, in a convoluted fashion, against the expected name. Signed-off-by: Stephen Warren <swarren@nvidia.com>
This commit is contained in:
parent
e573617c09
commit
df637fa6da
1 changed files with 24 additions and 38 deletions
|
@ -154,54 +154,40 @@ static uchar *create_keymap(struct key_matrix *config, u32 *data, int len,
|
|||
return map;
|
||||
}
|
||||
|
||||
int key_matrix_decode_fdt(struct key_matrix *config, const void *blob,
|
||||
int node)
|
||||
int key_matrix_decode_fdt(struct key_matrix *config, const void *blob, int node)
|
||||
{
|
||||
const struct fdt_property *prop;
|
||||
static const char prefix[] = "linux,";
|
||||
int plen = sizeof(prefix) - 1;
|
||||
int offset;
|
||||
int proplen;
|
||||
uchar *plain_keycode;
|
||||
|
||||
/* Check each property name for ones that we understand */
|
||||
for (offset = fdt_first_property_offset(blob, node);
|
||||
offset > 0;
|
||||
offset = fdt_next_property_offset(blob, offset)) {
|
||||
const char *name;
|
||||
int len;
|
||||
prop = fdt_get_property(blob, node, "linux,keymap", &proplen);
|
||||
/* Basic keymap is required */
|
||||
if (!prop)
|
||||
return -1;
|
||||
|
||||
prop = fdt_get_property_by_offset(blob, offset, NULL);
|
||||
name = fdt_string(blob, fdt32_to_cpu(prop->nameoff));
|
||||
len = strlen(name);
|
||||
plain_keycode = create_keymap(config, (u32 *)prop->data,
|
||||
proplen, KEY_FN, &config->fn_pos);
|
||||
config->plain_keycode = plain_keycode;
|
||||
/* Conversion error -> fail */
|
||||
if (!config->plain_keycode)
|
||||
return -1;
|
||||
|
||||
/* Name needs to match "1,<type>keymap" */
|
||||
debug("%s: property '%s'\n", __func__, name);
|
||||
if (strncmp(name, prefix, plen) ||
|
||||
len < plen + 6 ||
|
||||
strcmp(name + len - 6, "keymap"))
|
||||
continue;
|
||||
|
||||
len -= plen + 6;
|
||||
if (len == 0) {
|
||||
config->plain_keycode = create_keymap(config,
|
||||
(u32 *)prop->data, fdt32_to_cpu(prop->len),
|
||||
KEY_FN, &config->fn_pos);
|
||||
} else if (0 == strncmp(name + plen, "fn-", len)) {
|
||||
config->fn_keycode = create_keymap(config,
|
||||
(u32 *)prop->data, fdt32_to_cpu(prop->len),
|
||||
-1, NULL);
|
||||
} else {
|
||||
debug("%s: unrecognised property '%s'\n", __func__,
|
||||
name);
|
||||
}
|
||||
}
|
||||
debug("%s: Decoded key maps %p, %p from fdt\n", __func__,
|
||||
config->plain_keycode, config->fn_keycode);
|
||||
prop = fdt_get_property(blob, node, "linux,fn-keymap", &proplen);
|
||||
/* fn keymap is optional */
|
||||
if (!prop)
|
||||
goto done;
|
||||
|
||||
config->fn_keycode = create_keymap(config, (u32 *)prop->data,
|
||||
proplen, -1, NULL);
|
||||
/* Conversion error -> fail */
|
||||
if (!config->plain_keycode) {
|
||||
debug("%s: cannot find keycode-plain map\n", __func__);
|
||||
free(plain_keycode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
done:
|
||||
debug("%s: Decoded key maps %p, %p from fdt\n", __func__,
|
||||
config->plain_keycode, config->fn_keycode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue