/* linux/arch/arm/mach-msm/board-kaiser-keypad.c * * Copyright (C) 2007 Google, Inc. * Author: Marcin Baliniak * * 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 #include #include #include #include #include #include #include #include #include #include static unsigned int kaiser_gpios[] = {18, 19, 20, 23, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 78 }; #define KAISER_KBD_IRQ 28 #define DRIVER_NAME "kaiser-kbd" typedef struct { unsigned short key; unsigned int gpio_state; } tKeys; typedef struct { struct input_dev *idev; unsigned short last_key; tKeys KaiserKbdKeys[10]; } tKaiserKeyboardData; tKaiserKeyboardData kaiser_kbd; unsigned int get_kbd_state(void) { int k; unsigned int retval=0; for (k = 0; k< sizeof(kaiser_gpios);k++) { retval = retval << 1; if (gpio_get_value(kaiser_gpios[k])) retval++; } return retval; } /* IRQ handler function*/ static irqreturn_t kaiser_kbd_irq_handle(int irq, void *data) { printk("kaiser_kbd_irq(%X)\n",get_kbd_state()); return IRQ_HANDLED; } static int kbd_idev_open (struct input_dev *idev) { //struct ts_data *d = idev->private; int ret = 0; return ret; } static void kbd_idev_close (struct input_dev *idev) { return; } #define MSM_GPIOF_ENABLE_INTERRUPT 0x10000000 /* Init module function */ static int __devinit kaiser_kbd_init(void) { int res; int k; tKaiserKeyboardData *data = & kaiser_kbd; for (k = 0; k< sizeof(kaiser_gpios);k++) gpio_configure(kaiser_gpios[k], GPIOF_INPUT);// | IRQF_TRIGGER_RISING | MSM_GPIOF_ENABLE_INTERRUPT); printk("kaiser_kbd_init\n"); if ((res = request_irq(KAISER_KBD_IRQ, kaiser_kbd_irq_handle, IRQF_PERCPU|IRQF_TRIGGER_RISING, "Kaiser keyboard", NULL))) { printk("kaiser_kbd_init: Unable register IRQ\n"); return res; } /* data->idev = input_allocate_device(); if(!data->idev) { printk("kaiser_kbd_init(): Can't allocate input device\n"); return -ENOMEM; } data->idev->private = &kaiser_kbd; data->idev->name = DRIVER_NAME; set_bit(EV_SYN, data->idev->evbit); set_bit(EV_KEY, data->idev->evbit); data->idev->open = kbd_idev_open; data->idev->close = kbd_idev_close; res = input_register_device(data->idev); if(res) { printk("kaiser_kbd_init(): Can't register input device\n"); input_free_device(data->idev); return res; } */ return 0; } /* Exit module function */ static void __exit kaiser_kbd_exit(void) { printk("kaiser_kbd_exit\n"); free_irq(KAISER_KBD_IRQ, NULL); } MODULE_AUTHOR("Marcin Baliniak "); MODULE_DESCRIPTION("Kaiser Keyboard"); MODULE_LICENSE("GPL"); module_init(kaiser_kbd_init); module_exit(kaiser_kbd_exit);