Lines Matching refs:rc_map

106 struct rc_map *rc_map_get(const char *name)
204 * @rc_map: the rc_map to initialize
209 * This routine will initialize the rc_map and will allocate
214 static int ir_create_table(struct rc_dev *dev, struct rc_map *rc_map,
217 rc_map->name = kstrdup(name, GFP_KERNEL);
218 if (!rc_map->name)
220 rc_map->rc_proto = rc_proto;
221 rc_map->alloc = roundup_pow_of_two(size * sizeof(struct rc_map_table));
222 rc_map->size = rc_map->alloc / sizeof(struct rc_map_table);
223 rc_map->scan = kmalloc(rc_map->alloc, GFP_KERNEL);
224 if (!rc_map->scan) {
225 kfree(rc_map->name);
226 rc_map->name = NULL;
231 rc_map->size, rc_map->alloc);
237 * @rc_map: the table whose mappings need to be freed
242 static void ir_free_table(struct rc_map *rc_map)
244 rc_map->size = 0;
245 kfree(rc_map->name);
246 rc_map->name = NULL;
247 kfree(rc_map->scan);
248 rc_map->scan = NULL;
254 * @rc_map: the rc_map to resize
257 * This routine will shrink the rc_map if it has lots of
262 static int ir_resize_table(struct rc_dev *dev, struct rc_map *rc_map,
265 unsigned int oldalloc = rc_map->alloc;
267 struct rc_map_table *oldscan = rc_map->scan;
270 if (rc_map->size == rc_map->len) {
272 if (rc_map->alloc >= IR_TAB_MAX_SIZE)
279 if ((rc_map->len * 3 < rc_map->size) && (oldalloc > IR_TAB_MIN_SIZE)) {
292 memcpy(newscan, rc_map->scan, rc_map->len * sizeof(struct rc_map_table));
293 rc_map->scan = newscan;
294 rc_map->alloc = newalloc;
295 rc_map->size = rc_map->alloc / sizeof(struct rc_map_table);
303 * @rc_map: scancode table to be adjusted
314 struct rc_map *rc_map,
318 int old_keycode = rc_map->scan[index].keycode;
324 index, rc_map->scan[index].scancode);
325 rc_map->len--;
326 memmove(&rc_map->scan[index], &rc_map->scan[index+ 1],
327 (rc_map->len - index) * sizeof(struct rc_map_table));
332 rc_map->scan[index].scancode, new_keycode);
333 rc_map->scan[index].keycode = new_keycode;
341 for (i = 0; i < rc_map->len; i++) {
342 if (rc_map->scan[i].keycode == old_keycode) {
349 ir_resize_table(dev, rc_map, GFP_ATOMIC);
358 * @rc_map: scancode table to be searched
363 * This routine is used to locate given scancode in rc_map.
371 struct rc_map *rc_map,
388 for (i = 0; i < rc_map->len; i++) {
389 if (rc_map->scan[i].scancode == scancode)
393 if (rc_map->scan[i].scancode >= scancode)
398 if (rc_map->size == rc_map->len) {
399 if (!resize || ir_resize_table(dev, rc_map, GFP_ATOMIC))
404 if (i < rc_map->len)
405 memmove(&rc_map->scan[i + 1], &rc_map->scan[i],
406 (rc_map->len - i) * sizeof(struct rc_map_table));
407 rc_map->scan[i].scancode = scancode;
408 rc_map->scan[i].keycode = KEY_RESERVED;
409 rc_map->len++;
429 struct rc_map *rc_map = &rdev->rc_map;
435 spin_lock_irqsave(&rc_map->lock, flags);
439 if (index >= rc_map->len) {
448 index = ir_establish_scancode(rdev, rc_map, scancode, true);
449 if (index >= rc_map->len) {
455 *old_keycode = ir_update_mapping(rdev, rc_map, index, ke->keycode);
458 spin_unlock_irqrestore(&rc_map->lock, flags);
465 * @from: the struct rc_map to copy entries from
471 static int ir_setkeytable(struct rc_dev *dev, const struct rc_map *from)
473 struct rc_map *rc_map = &dev->rc_map;
477 rc = ir_create_table(dev, rc_map, from->name, from->rc_proto,
483 index = ir_establish_scancode(dev, rc_map,
485 if (index >= rc_map->len) {
490 ir_update_mapping(dev, rc_map, index,
495 ir_free_table(rc_map);
514 * @rc_map: the struct rc_map to search
522 static unsigned int ir_lookup_by_scancode(const struct rc_map *rc_map,
527 res = bsearch(&scancode, rc_map->scan, rc_map->len,
532 return res - rc_map->scan;
548 struct rc_map *rc_map = &rdev->rc_map;
555 spin_lock_irqsave(&rc_map->lock, flags);
564 index = ir_lookup_by_scancode(rc_map, scancode);
567 if (index < rc_map->len) {
568 entry = &rc_map->scan[index];
590 spin_unlock_irqrestore(&rc_map->lock, flags);
607 struct rc_map *rc_map = &dev->rc_map;
612 spin_lock_irqsave(&rc_map->lock, flags);
614 index = ir_lookup_by_scancode(rc_map, scancode);
615 keycode = index < rc_map->len ?
616 rc_map->scan[index].keycode : KEY_RESERVED;
618 spin_unlock_irqrestore(&rc_map->lock, flags);
1626 if (ret == 0 && dev->rc_map.name)
1627 ret = add_uevent_var(env, "NAME=%s", dev->rc_map.name);
1723 spin_lock_init(&dev->rc_map.lock);
1787 struct rc_map *rc_map;
1793 rc_map = rc_map_get(dev->map_name);
1794 if (!rc_map)
1795 rc_map = rc_map_get(RC_MAP_EMPTY);
1796 if (!rc_map || !rc_map->scan || rc_map->size == 0)
1799 rc = ir_setkeytable(dev, rc_map);
1803 rc_proto = BIT_ULL(rc_map->rc_proto);
1843 ir_free_table(&dev->rc_map);
1888 ir_free_table(&dev->rc_map);
1980 ir_free_table(&dev->rc_map);