|
@@ -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;
|
|
|
-
|
|
|
- /* 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_by_offset(blob, offset, NULL);
|
|
|
- name = fdt_string(blob, fdt32_to_cpu(prop->nameoff));
|
|
|
- len = strlen(name);
|
|
|
-
|
|
|
- /* 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;
|
|
|
+ int proplen;
|
|
|
+ uchar *plain_keycode;
|
|
|
|
|
|
- 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,keymap", &proplen);
|
|
|
+ /* Basic keymap is required */
|
|
|
+ if (!prop)
|
|
|
+ return -1;
|
|
|
|
|
|
+ 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;
|
|
|
+
|
|
|
+ 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;
|
|
|
}
|
|
|
|