input: simplify key_matrix_decode_fdt()
authorStephen Warren <swarren@nvidia.com>
Thu, 23 May 2013 12:09:57 +0000 (12:09 +0000)
committerTom Rini <trini@ti.com>
Tue, 4 Jun 2013 20:06:32 +0000 (16:06 -0400)
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>
drivers/input/key_matrix.c

index c8b048e..ea05c77 100644 (file)
@@ -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;
 }