Hi Stephen, On Thu, May 23, 2013 at 3:09 PM, Stephen Warren <[email protected]>wrote:
> From: Stephen Warren <[email protected]> > > 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 <[email protected]> > --- > 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
_______________________________________________ U-Boot mailing list [email protected] http://lists.denx.de/mailman/listinfo/u-boot

