android_kernel_cmhtcleo/drivers/input/misc/dummy_keypad.c
2010-08-27 11:19:57 +02:00

118 lines
3.3 KiB
C

/* drivers/input/misc/dummy_keypad.c
*
* Copyright (C) 2007 HTC Corporation.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include <linux/kernel.h>
#include <linux/gpio.h>
#include <linux/gpio_event.h>
#include <linux/hrtimer.h>
#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/wakelock.h>
#include <linux/platform_device.h>
#define DRIVER_NAME "dummy_keypad"
const unsigned short _usb_hut_keymap[29] = {
KEY_1, KEY_2, KEY_3, KEY_4,
KEY_5, KEY_6, KEY_7, KEY_8,
KEY_9, KEY_0,
KEY_BACKSPACE, KEY_ENTER, KEY_HOME, KEY_END,
KEY_POWER, KEY_COMPOSE, KEY_MENU, KEY_BACK,
KEY_SWITCHVIDEOMODE, KEY_KBDILLUMTOGGLE,
KEY_UP, KEY_LEFT, KEY_RIGHT, KEY_DOWN,
KEY_VOLUMEDOWN, KEY_VOLUMEUP,
KEY_SEND,
/* STAR(*) and POUND(#) */
KEY_SWITCHVIDEOMODE, KEY_KBDILLUMTOGGLE
};
struct dummy_keypad_struct {
uint32_t version;
struct input_dev *input_dev;
const char *keypad_name;
const unsigned short *usb_hut_keymap;
size_t usb_hut_keymap_size;
};
static struct dummy_keypad_struct *dummy_keypad;
static int dummy_keypad_init_func(void)
{
u16 loop_i;
dummy_keypad = kzalloc(sizeof(*dummy_keypad), GFP_KERNEL);
if (dummy_keypad == NULL) {
printk(KERN_ERR "%s: Can't allocate memory\n", __func__);
goto kzalloc_fail;
}
dummy_keypad->keypad_name = DRIVER_NAME;
dummy_keypad->usb_hut_keymap = _usb_hut_keymap;
dummy_keypad->usb_hut_keymap_size = ARRAY_SIZE(_usb_hut_keymap);
dummy_keypad->input_dev = input_allocate_device();
if (dummy_keypad->input_dev == NULL) {
printk(KERN_ERR "%s: Failed to allocate input device\n", __func__);
goto input_allocate_device_fail;
}
dummy_keypad->input_dev->name = DRIVER_NAME;
set_bit(EV_KEY, dummy_keypad->input_dev->evbit);
/* Setting USB HUT keycode */
for (loop_i = 0; loop_i < dummy_keypad->usb_hut_keymap_size; loop_i++) {
if (dummy_keypad->usb_hut_keymap[loop_i])
set_bit(dummy_keypad->usb_hut_keymap[loop_i] & KEY_MAX,
dummy_keypad->input_dev->keybit);
}
if (input_register_device(dummy_keypad->input_dev)) {
printk(KERN_ERR "%s: Unable to register %s input device\n", __func__,
dummy_keypad->input_dev->name);
goto input_register_device_fail;
}
return 0;
input_register_device_fail:
input_free_device(dummy_keypad->input_dev);
input_allocate_device_fail:
kfree(dummy_keypad);
kzalloc_fail:
return -ENOMEM;
}
static int dummy_keypad_exit_func(void)
{
input_unregister_device(dummy_keypad->input_dev);
input_free_device(dummy_keypad->input_dev);
kfree(dummy_keypad);
return 0;
}
static int __init dummy_keypad_init(void)
{
pr_info("%s: %s: initial running...\n", __func__, DRIVER_NAME);
return dummy_keypad_init_func();
}
static void __exit dummy_keypad_exit(void)
{
dummy_keypad_exit_func();
pr_info("%s: %s: exit...\n", __func__, DRIVER_NAME);
}
module_init(dummy_keypad_init);
module_exit(dummy_keypad_exit);
MODULE_AUTHOR("Anthony Chang<anthony_chang@htc.com>");
MODULE_DESCRIPTION("Dummy Keypad Driver. This Driver should be use under test.");
MODULE_LICENSE("GPL");