linux/drivers/media/IR/rc-map.c
<<
>>
Prefs
   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