rendered paste body/* linux/arch/arm/mach-msm/board-kaiser-keypad.c
*
* Copyright (C) 2007 Google, Inc.
* Author: Marcin Baliniak <marcin@baliniak.pl>
*
* 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/init.h>
#include <linux/platform_device.h>
#include <linux/input.h>
#include <asm/gpio.h>
#include <asm/hardware.h>
#include <asm/arch/board.h>
#include <asm/arch/msm_iomap.h>
#include <asm/io.h>
#include <asm/delay.h>
#include <linux/gpio_event.h>
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 <marcin@baliniak.pl>");
MODULE_DESCRIPTION("Kaiser Keyboard");
MODULE_LICENSE("GPL");
module_init(kaiser_kbd_init);
module_exit(kaiser_kbd_exit);