All pastes #988217 Raw Edit

new kaiser keyboard driver

public text v1 · immutable
#988217 ·published 2008-04-17 11:47 UTC
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);