[U-Boot] [PATCH] input: simplify key_matrix_decode_fdt()
Simon Glass
sjg at chromium.org
Sun May 26 21:31:23 CEST 2013
Hi Stephen,
On Thu, May 23, 2013 at 3:09 PM, Stephen Warren <swarren at wwwdotorg.org>wrote:
> From: Stephen Warren <swarren at nvidia.com>
>
> 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.
>
The original code dealt with ctrl and shift also - since removed. I think
it is good to simplify it.
>
> Signed-off-by: Stephen Warren <swarren at nvidia.com>
> ---
> Note: This depends on my previous patch "input: fix unaligned access
> in key_matrix_decode_fdt()". While to two patches could be squashed
> together, I'd prefer them to go in separately, since the former is a
> bug-fix that makes the original code work again on ARMv7 at least, and
> this patch is an unrelated refactoring.
>
Yes.
> ---
> drivers/input/key_matrix.c | 66
> +++++++++++++++++---------------------------
> 1 file changed, 26 insertions(+), 40 deletions(-)
>
> diff --git a/drivers/input/key_matrix.c b/drivers/input/key_matrix.c
> index c8b048e..ea05c77 100644
> --- a/drivers/input/key_matrix.c
> +++ b/drivers/input/key_matrix.c
> @@ -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);
>
Probably don't need plain_keycode variable at all.
> + config->plain_keycode = plain_keycode;
> + /* Conversion error -> fail */
> + if (!config->plain_keycode)
> + return -1;
>
Missing debug() here from old code
> +
> + 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) {
>
Should check config->fn_keycode here.
> - 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;
> }
>
> --
> 1.7.10.4
>
>
Regards,
Simon
More information about the U-Boot
mailing list