#include <linux/platform_device.h>
#include <linux/input.h>
#include <linux/irq.h>
+#include <linux/gpio_keys.h>
-#include <asm/arch/pxa-regs.h>
-#include <asm/arch/hardware.h>
-
-#include <asm/hardware/gpio_keys.h>
+#include <asm/gpio.h>
static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
{
struct input_dev *input = platform_get_drvdata(pdev);
for (i = 0; i < pdata->nbuttons; i++) {
- int gpio = pdata->buttons[i].gpio;
- if (irq == IRQ_GPIO(gpio)) {
- int state = ((GPLR(gpio) & GPIO_bit(gpio)) ? 1 : 0) ^ (pdata->buttons[i].active_low);
+ struct gpio_keys_button *button = &pdata->buttons[i];
+ int gpio = button->gpio;
+
+ if (irq == gpio_to_irq(gpio)) {
+ unsigned int type = button->type ?: EV_KEY;
+ int state = (gpio_get_value(gpio) ? 1 : 0) ^ button->active_low;
- input_report_key(input, pdata->buttons[i].keycode, state);
+ input_event(input, type, button->code, !!state);
input_sync(input);
}
}
input->name = pdev->name;
input->phys = "gpio-keys/input0";
- input->cdev.dev = &pdev->dev;
- input->private = pdata;
+ input->dev.parent = &pdev->dev;
input->id.bustype = BUS_HOST;
input->id.vendor = 0x0001;
input->id.version = 0x0100;
for (i = 0; i < pdata->nbuttons; i++) {
- int code = pdata->buttons[i].keycode;
- int irq = IRQ_GPIO(pdata->buttons[i].gpio);
+ struct gpio_keys_button *button = &pdata->buttons[i];
+ int irq = gpio_to_irq(button->gpio);
+ unsigned int type = button->type ?: EV_KEY;
set_irq_type(irq, IRQ_TYPE_EDGE_BOTH);
- error = request_irq(irq, gpio_keys_isr, SA_SAMPLE_RANDOM,
- pdata->buttons[i].desc ? pdata->buttons[i].desc : "gpio_keys",
+ error = request_irq(irq, gpio_keys_isr, IRQF_SAMPLE_RANDOM,
+ button->desc ? button->desc : "gpio_keys",
pdev);
if (error) {
- printk(KERN_ERR "gpio-keys: unable to claim irq %d; error %d\n", irq, ret);
+ printk(KERN_ERR "gpio-keys: unable to claim irq %d; error %d\n",
+ irq, error);
goto fail;
}
- set_bit(code, input->keybit);
+
+ input_set_capability(input, type, button->code);
}
error = input_register_device(input);
fail:
for (i = i - 1; i >= 0; i--)
- free_irq(IRQ_GPIO(pdata->buttons[i].gpio), pdev);
+ free_irq(gpio_to_irq(pdata->buttons[i].gpio), pdev);
input_free_device(input);
int i;
for (i = 0; i < pdata->nbuttons; i++) {
- int irq = IRQ_GPIO(pdata->buttons[i].gpio);
+ int irq = gpio_to_irq(pdata->buttons[i].gpio);
free_irq(irq, pdev);
}