Hi Dmitry, Em 31-01-2011 06:53, Dmitry Torokhov escreveu: > Input: dvb-usb-remote - convert to new style of get/setkeycode > > Signed-off-by: Dmitry Torokhov <dtor@xxxxxxx> > --- > > Mauro, > > This is needed so that I could rename get/setkeycode_new into > get/setkeycode and get rid of duplicate pointers and compat code in > input core. > > Compiled only, not tested. I can't test this patch, since all the DVB-USB devices I have here, I converted to use rc-core. > If you are OK with the patch then I'd like to merge this through my > tree. Yeah, I'm ok. I don't have any intention on touching on those legacy support functions (except for their removal, after having the remaining drivers converted). So, feel free to submit it via your tree. Acked-by: Mauro Carvalho Chehab <mchehab@xxxxxxxxxx> > > Thanks! > > drivers/media/dvb/dvb-usb/dvb-usb-remote.c | 113 +++++++++++++++++----------- > 1 files changed, 70 insertions(+), 43 deletions(-) > > > diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-remote.c b/drivers/media/dvb/dvb-usb/dvb-usb-remote.c > index 23005b3..347fbd4 100644 > --- a/drivers/media/dvb/dvb-usb/dvb-usb-remote.c > +++ b/drivers/media/dvb/dvb-usb/dvb-usb-remote.c > @@ -8,60 +8,71 @@ > #include "dvb-usb-common.h" > #include <linux/usb/input.h> > > +static unsigned int > +legacy_dvb_usb_get_keymap_index(const struct input_keymap_entry *ke, > + struct rc_map_table *keymap, > + unsigned int keymap_size) > +{ > + unsigned int index; > + unsigned int scancode; > + > + if (ke->flags & INPUT_KEYMAP_BY_INDEX) { > + index = ke->index; > + } else { > + if (input_scancode_to_scalar(ke, &scancode)) > + return keymap_size; > + > + /* See if we can match the raw key code. */ > + for (index = 0; index < keymap_size; index++) > + if (keymap[index].scancode == scancode) > + break; > + > + /* See if there is an unused hole in the map */ > + if (index >= keymap_size) { > + for (index = 0; index < keymap_size; index++) { > + if (keymap[index].keycode == KEY_RESERVED || > + keymap[index].keycode == KEY_UNKNOWN) { > + break; > + } > + } > + } > + } > + > + return index; > +} > + > static int legacy_dvb_usb_getkeycode(struct input_dev *dev, > - unsigned int scancode, unsigned int *keycode) > + struct input_keymap_entry *ke) > { > struct dvb_usb_device *d = input_get_drvdata(dev); > - > struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table; > - int i; > + unsigned int keymap_size = d->props.rc.legacy.rc_map_size; > + unsigned int index; > > - /* See if we can match the raw key code. */ > - for (i = 0; i < d->props.rc.legacy.rc_map_size; i++) > - if (keymap[i].scancode == scancode) { > - *keycode = keymap[i].keycode; > - return 0; > - } > + index = legacy_dvb_usb_get_keymap_index(ke, keymap, keymap_size); > + if (index >= keymap_size) > + return -EINVAL; > > - /* > - * If is there extra space, returns KEY_RESERVED, > - * otherwise, input core won't let legacy_dvb_usb_setkeycode > - * to work > - */ > - for (i = 0; i < d->props.rc.legacy.rc_map_size; i++) > - if (keymap[i].keycode == KEY_RESERVED || > - keymap[i].keycode == KEY_UNKNOWN) { > - *keycode = KEY_RESERVED; > - return 0; > - } > + ke->keycode = keymap[index].keycode; > + if (ke->keycode == KEY_UNKNOWN) > + ke->keycode = KEY_RESERVED; > + ke->len = sizeof(keymap[index].scancode); > + memcpy(&ke->scancode, &keymap[index].scancode, ke->len); > + ke->index = index; > > - return -EINVAL; > + return 0; > } > > static int legacy_dvb_usb_setkeycode(struct input_dev *dev, > - unsigned int scancode, unsigned int keycode) > + const struct input_keymap_entry *ke, > + unsigned int *old_keycode) > { > struct dvb_usb_device *d = input_get_drvdata(dev); > - > struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table; > - int i; > - > - /* Search if it is replacing an existing keycode */ > - for (i = 0; i < d->props.rc.legacy.rc_map_size; i++) > - if (keymap[i].scancode == scancode) { > - keymap[i].keycode = keycode; > - return 0; > - } > - > - /* Search if is there a clean entry. If so, use it */ > - for (i = 0; i < d->props.rc.legacy.rc_map_size; i++) > - if (keymap[i].keycode == KEY_RESERVED || > - keymap[i].keycode == KEY_UNKNOWN) { > - keymap[i].scancode = scancode; > - keymap[i].keycode = keycode; > - return 0; > - } > + unsigned int keymap_size = d->props.rc.legacy.rc_map_size; > + unsigned int index; > > + index = legacy_dvb_usb_get_keymap_index(ke, keymap, keymap_size); > /* > * FIXME: Currently, it is not possible to increase the size of > * scancode table. For it to happen, one possibility > @@ -69,8 +80,24 @@ static int legacy_dvb_usb_setkeycode(struct input_dev *dev, > * copying data, appending the new key on it, and freeing > * the old one - or maybe just allocating some spare space > */ > + if (index >= keymap_size) > + return -EINVAL; > + > + *old_keycode = keymap[index].keycode; > + keymap->keycode = ke->keycode; > + __set_bit(ke->keycode, dev->keybit); > + > + if (*old_keycode != KEY_RESERVED) { > + __clear_bit(*old_keycode, dev->keybit); > + for (index = 0; index < keymap_size; index++) { > + if (keymap[index].keycode == *old_keycode) { > + __set_bit(*old_keycode, dev->keybit); > + break; > + } > + } > + } > > - return -EINVAL; > + return 0; > } > > /* Remote-control poll function - called every dib->rc_query_interval ms to see > @@ -171,8 +198,8 @@ static int legacy_dvb_usb_remote_init(struct dvb_usb_device *d) > d->input_dev = input_dev; > d->rc_dev = NULL; > > - input_dev->getkeycode = legacy_dvb_usb_getkeycode; > - input_dev->setkeycode = legacy_dvb_usb_setkeycode; > + input_dev->getkeycode_new = legacy_dvb_usb_getkeycode; > + input_dev->setkeycode_new = legacy_dvb_usb_setkeycode; > > /* set the bits for the keys */ > deb_rc("key map size: %d\n", d->props.rc.legacy.rc_map_size); -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html