Lines Matching refs:rc_map

57 struct rc_map *rc_map_get(const char *name)  in rc_map_get()
128 static int ir_create_table(struct rc_map *rc_map, in ir_create_table() argument
131 rc_map->name = name; in ir_create_table()
132 rc_map->rc_type = rc_type; in ir_create_table()
133 rc_map->alloc = roundup_pow_of_two(size * sizeof(struct rc_map_table)); in ir_create_table()
134 rc_map->size = rc_map->alloc / sizeof(struct rc_map_table); in ir_create_table()
135 rc_map->scan = kmalloc(rc_map->alloc, GFP_KERNEL); in ir_create_table()
136 if (!rc_map->scan) in ir_create_table()
140 rc_map->size, rc_map->alloc); in ir_create_table()
151 static void ir_free_table(struct rc_map *rc_map) in ir_free_table() argument
153 rc_map->size = 0; in ir_free_table()
154 kfree(rc_map->scan); in ir_free_table()
155 rc_map->scan = NULL; in ir_free_table()
167 static int ir_resize_table(struct rc_map *rc_map, gfp_t gfp_flags) in ir_resize_table() argument
169 unsigned int oldalloc = rc_map->alloc; in ir_resize_table()
171 struct rc_map_table *oldscan = rc_map->scan; in ir_resize_table()
174 if (rc_map->size == rc_map->len) { in ir_resize_table()
176 if (rc_map->alloc >= IR_TAB_MAX_SIZE) in ir_resize_table()
183 if ((rc_map->len * 3 < rc_map->size) && (oldalloc > IR_TAB_MIN_SIZE)) { in ir_resize_table()
198 memcpy(newscan, rc_map->scan, rc_map->len * sizeof(struct rc_map_table)); in ir_resize_table()
199 rc_map->scan = newscan; in ir_resize_table()
200 rc_map->alloc = newalloc; in ir_resize_table()
201 rc_map->size = rc_map->alloc / sizeof(struct rc_map_table); in ir_resize_table()
218 struct rc_map *rc_map, in ir_update_mapping() argument
222 int old_keycode = rc_map->scan[index].keycode; in ir_update_mapping()
228 index, rc_map->scan[index].scancode); in ir_update_mapping()
229 rc_map->len--; in ir_update_mapping()
230 memmove(&rc_map->scan[index], &rc_map->scan[index+ 1], in ir_update_mapping()
231 (rc_map->len - index) * sizeof(struct rc_map_table)); in ir_update_mapping()
236 rc_map->scan[index].scancode, new_keycode); in ir_update_mapping()
237 rc_map->scan[index].keycode = new_keycode; in ir_update_mapping()
245 for (i = 0; i < rc_map->len; i++) { in ir_update_mapping()
246 if (rc_map->scan[i].keycode == old_keycode) { in ir_update_mapping()
253 ir_resize_table(rc_map, GFP_ATOMIC); in ir_update_mapping()
274 struct rc_map *rc_map, in ir_establish_scancode() argument
292 for (i = 0; i < rc_map->len; i++) { in ir_establish_scancode()
293 if (rc_map->scan[i].scancode == scancode) in ir_establish_scancode()
297 if (rc_map->scan[i].scancode >= scancode) in ir_establish_scancode()
302 if (rc_map->size == rc_map->len) { in ir_establish_scancode()
303 if (!resize || ir_resize_table(rc_map, GFP_ATOMIC)) in ir_establish_scancode()
308 if (i < rc_map->len) in ir_establish_scancode()
309 memmove(&rc_map->scan[i + 1], &rc_map->scan[i], in ir_establish_scancode()
310 (rc_map->len - i) * sizeof(struct rc_map_table)); in ir_establish_scancode()
311 rc_map->scan[i].scancode = scancode; in ir_establish_scancode()
312 rc_map->scan[i].keycode = KEY_RESERVED; in ir_establish_scancode()
313 rc_map->len++; in ir_establish_scancode()
332 struct rc_map *rc_map = &rdev->rc_map; in ir_setkeycode() local
338 spin_lock_irqsave(&rc_map->lock, flags); in ir_setkeycode()
342 if (index >= rc_map->len) { in ir_setkeycode()
351 index = ir_establish_scancode(rdev, rc_map, scancode, true); in ir_setkeycode()
352 if (index >= rc_map->len) { in ir_setkeycode()
358 *old_keycode = ir_update_mapping(rdev, rc_map, index, ke->keycode); in ir_setkeycode()
361 spin_unlock_irqrestore(&rc_map->lock, flags); in ir_setkeycode()
375 const struct rc_map *from) in ir_setkeytable()
377 struct rc_map *rc_map = &dev->rc_map; in ir_setkeytable() local
381 rc = ir_create_table(rc_map, from->name, in ir_setkeytable()
387 rc_map->size, rc_map->alloc); in ir_setkeytable()
390 index = ir_establish_scancode(dev, rc_map, in ir_setkeytable()
392 if (index >= rc_map->len) { in ir_setkeytable()
397 ir_update_mapping(dev, rc_map, index, in ir_setkeytable()
402 ir_free_table(rc_map); in ir_setkeytable()
416 static unsigned int ir_lookup_by_scancode(const struct rc_map *rc_map, in ir_lookup_by_scancode() argument
420 int end = rc_map->len - 1; in ir_lookup_by_scancode()
425 if (rc_map->scan[mid].scancode < scancode) in ir_lookup_by_scancode()
427 else if (rc_map->scan[mid].scancode > scancode) in ir_lookup_by_scancode()
449 struct rc_map *rc_map = &rdev->rc_map; in ir_getkeycode() local
456 spin_lock_irqsave(&rc_map->lock, flags); in ir_getkeycode()
465 index = ir_lookup_by_scancode(rc_map, scancode); in ir_getkeycode()
468 if (index < rc_map->len) { in ir_getkeycode()
469 entry = &rc_map->scan[index]; in ir_getkeycode()
492 spin_unlock_irqrestore(&rc_map->lock, flags); in ir_getkeycode()
508 struct rc_map *rc_map = &dev->rc_map; in rc_g_keycode_from_table() local
513 spin_lock_irqsave(&rc_map->lock, flags); in rc_g_keycode_from_table()
515 index = ir_lookup_by_scancode(rc_map, scancode); in rc_g_keycode_from_table()
516 keycode = index < rc_map->len ? in rc_g_keycode_from_table()
517 rc_map->scan[index].keycode : KEY_RESERVED; in rc_g_keycode_from_table()
519 spin_unlock_irqrestore(&rc_map->lock, flags); in rc_g_keycode_from_table()
1194 if (dev->rc_map.name) in rc_dev_uevent()
1195 ADD_HOTPLUG_VAR("NAME=%s", dev->rc_map.name); in rc_dev_uevent()
1279 spin_lock_init(&dev->rc_map.lock); in rc_allocate_device()
1310 struct rc_map *rc_map; in rc_register_device() local
1317 rc_map = rc_map_get(dev->map_name); in rc_register_device()
1318 if (!rc_map) in rc_register_device()
1319 rc_map = rc_map_get(RC_MAP_EMPTY); in rc_register_device()
1320 if (!rc_map || !rc_map->scan || rc_map->size == 0) in rc_register_device()
1365 rc = ir_setkeytable(dev, rc_map); in rc_register_device()
1422 u64 rc_type = (1ll << rc_map->rc_type); in rc_register_device()
1436 rc_map->name ? rc_map->name : "unknown", in rc_register_device()
1448 ir_free_table(&dev->rc_map); in rc_register_device()
1471 ir_free_table(&dev->rc_map); in rc_unregister_device()