1/* ir-raw-event.c - handle IR Pulse/Space event 2 * 3 * Copyright (C) 2010 by Mauro Carvalho Chehab <mchehab@redhat.com> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation version 2 of the License. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 */ 14 15#include <media/ir-core.h> 16#include <linux/spinlock.h> 17#include <linux/delay.h> 18 19/* Used to handle IR raw handler extensions */ 20static LIST_HEAD(rc_map_list); 21static DEFINE_SPINLOCK(rc_map_lock); 22 23static struct rc_keymap *seek_rc_map(const char *name) 24{ 25 struct rc_keymap *map = NULL; 26 27 spin_lock(&rc_map_lock); 28 list_for_each_entry(map, &rc_map_list, list) { 29 if (!strcmp(name, map->map.name)) { 30 spin_unlock(&rc_map_lock); 31 return map; 32 } 33 } 34 spin_unlock(&rc_map_lock); 35 36 return NULL; 37} 38 39struct ir_scancode_table *get_rc_map(const char *name) 40{ 41 42 struct rc_keymap *map; 43 44 map = seek_rc_map(name); 45#ifdef MODULE 46 if (!map) { 47 int rc = request_module(name); 48 if (rc < 0) { 49 printk(KERN_ERR "Couldn't load IR keymap %s\n", name); 50 return NULL; 51 } 52 msleep(20); /* Give some time for IR to register */ 53 54 map = seek_rc_map(name); 55 } 56#endif 57 if (!map) { 58 printk(KERN_ERR "IR keymap %s not found\n", name); 59 return NULL; 60 } 61 62 printk(KERN_INFO "Registered IR keymap %s\n", map->map.name); 63 64 return &map->map; 65} 66EXPORT_SYMBOL_GPL(get_rc_map); 67 68int ir_register_map(struct rc_keymap *map) 69{ 70 spin_lock(&rc_map_lock); 71 list_add_tail(&map->list, &rc_map_list); 72 spin_unlock(&rc_map_lock); 73 return 0; 74} 75EXPORT_SYMBOL_GPL(ir_register_map); 76 77void ir_unregister_map(struct rc_keymap *map) 78{ 79 spin_lock(&rc_map_lock); 80 list_del(&map->list); 81 spin_unlock(&rc_map_lock); 82} 83EXPORT_SYMBOL_GPL(ir_unregister_map); 84 85 86static struct ir_scancode empty[] = { 87 { 0x2a, KEY_COFFEE }, 88}; 89 90static struct rc_keymap empty_map = { 91 .map = { 92 .scan = empty, 93 .size = ARRAY_SIZE(empty), 94 .ir_type = IR_TYPE_UNKNOWN, /* Legacy IR type */ 95 .name = RC_MAP_EMPTY, 96 } 97}; 98 99int ir_rcmap_init(void) 100{ 101 return ir_register_map(&empty_map); 102} 103 104void ir_rcmap_cleanup(void) 105{ 106 ir_unregister_map(&empty_map); 107} 108