diff options
Diffstat (limited to 'target/linux/s3c24xx/patches/0009-gta01-inputdevice.patch.patch')
-rwxr-xr-x | target/linux/s3c24xx/patches/0009-gta01-inputdevice.patch.patch | 298 |
1 files changed, 298 insertions, 0 deletions
diff --git a/target/linux/s3c24xx/patches/0009-gta01-inputdevice.patch.patch b/target/linux/s3c24xx/patches/0009-gta01-inputdevice.patch.patch new file mode 100755 index 0000000000..ef8cb7fce3 --- /dev/null +++ b/target/linux/s3c24xx/patches/0009-gta01-inputdevice.patch.patch @@ -0,0 +1,298 @@ +From db36b757a45cf8d9088727d975d93917021b1171 Mon Sep 17 00:00:00 2001 +From: mokopatches <mokopatches@openmoko.org> +Date: Wed, 16 Jul 2008 14:44:48 +0100 +Subject: [PATCH] gta01-inputdevice.patch + This provides support for the GTA01 keyboard + +Signed-off-by: Harald Welte <laforge@openmoko.org> +--- + drivers/input/keyboard/Kconfig | 12 ++ + drivers/input/keyboard/Makefile | 1 + + drivers/input/keyboard/neo1973kbd.c | 242 +++++++++++++++++++++++++++++++++++ + 3 files changed, 255 insertions(+), 0 deletions(-) + create mode 100644 drivers/input/keyboard/neo1973kbd.c + +diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig +index efd70a9..b8ecca9 100644 +--- a/drivers/input/keyboard/Kconfig ++++ b/drivers/input/keyboard/Kconfig +@@ -323,4 +323,16 @@ config KEYBOARD_SH_KEYSC + + To compile this driver as a module, choose M here: the + module will be called sh_keysc. ++config KEYBOARD_NEO1973 ++ tristate "FIC Neo1973 buttons" ++ depends on MACH_NEO1973 ++ default y ++ help ++ Say Y here to enable the buttons on the FIC Neo1973 ++ GSM phone. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called neo1973kbd. ++ ++ + endif +diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile +index 0edc8f2..b3aa339 100644 +--- a/drivers/input/keyboard/Makefile ++++ b/drivers/input/keyboard/Makefile +@@ -14,6 +14,7 @@ obj-$(CONFIG_KEYBOARD_LOCOMO) += locomokbd.o + obj-$(CONFIG_KEYBOARD_NEWTON) += newtonkbd.o + obj-$(CONFIG_KEYBOARD_STOWAWAY) += stowaway.o + obj-$(CONFIG_KEYBOARD_CORGI) += corgikbd.o ++obj-$(CONFIG_KEYBOARD_NEO1973) += neo1973kbd.o + obj-$(CONFIG_KEYBOARD_SPITZ) += spitzkbd.o + obj-$(CONFIG_KEYBOARD_TOSA) += tosakbd.o + obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o +diff --git a/drivers/input/keyboard/neo1973kbd.c b/drivers/input/keyboard/neo1973kbd.c +new file mode 100644 +index 0000000..917d5ae +--- /dev/null ++++ b/drivers/input/keyboard/neo1973kbd.c +@@ -0,0 +1,242 @@ ++/* ++ * Keyboard driver for FIC Neo1973 GSM phone ++ * ++ * (C) 2006-2007 by OpenMoko, Inc. ++ * Author: Harald Welte <laforge@openmoko.org> ++ * All rights reserved. ++ * ++ * inspired by corkgbd.c by Richard Purdie ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ */ ++ ++#include <linux/delay.h> ++#include <linux/platform_device.h> ++#include <linux/init.h> ++#include <linux/input.h> ++#include <linux/interrupt.h> ++#include <linux/jiffies.h> ++#include <linux/module.h> ++#include <linux/slab.h> ++ ++#include <asm/hardware.h> ++#include <asm/arch/gta01.h> ++#include <asm/mach-types.h> ++ ++struct neo1973kbd { ++ struct input_dev *input; ++ unsigned int suspended; ++ unsigned long suspend_jiffies; ++}; ++ ++static irqreturn_t neo1973kbd_aux_irq(int irq, void *dev_id) ++{ ++ struct neo1973kbd *neo1973kbd_data = dev_id; ++ ++ /* FIXME: use GPIO from platform_dev resources */ ++ if (s3c2410_gpio_getpin(GTA01_GPIO_AUX_KEY)) ++ input_report_key(neo1973kbd_data->input, KEY_PHONE, 0); ++ else ++ input_report_key(neo1973kbd_data->input, KEY_PHONE, 1); ++ ++ input_sync(neo1973kbd_data->input); ++ ++ return IRQ_HANDLED; ++} ++ ++static irqreturn_t neo1973kbd_hold_irq(int irq, void *dev_id) ++{ ++ struct neo1973kbd *neo1973kbd_data = dev_id; ++ ++ /* FIXME: use GPIO from platform_dev resources */ ++ if (s3c2410_gpio_getpin(GTA01_GPIO_HOLD_KEY)) ++ input_report_key(neo1973kbd_data->input, KEY_PAUSE, 1); ++ else ++ input_report_key(neo1973kbd_data->input, KEY_PAUSE, 0); ++ ++ input_sync(neo1973kbd_data->input); ++ ++ return IRQ_HANDLED; ++} ++ ++static irqreturn_t neo1973kbd_headphone_irq(int irq, void *dev_id) ++{ ++ struct neo1973kbd *neo1973kbd_data = dev_id; ++ ++ /* FIXME: use GPIO from platform_dev resources */ ++ if (s3c2410_gpio_getpin(GTA01_GPIO_JACK_INSERT)) ++ input_report_switch(neo1973kbd_data->input, ++ SW_HEADPHONE_INSERT, 1); ++ else ++ input_report_switch(neo1973kbd_data->input, ++ SW_HEADPHONE_INSERT, 0); ++ ++ input_sync(neo1973kbd_data->input); ++ ++ return IRQ_HANDLED; ++} ++ ++#ifdef CONFIG_PM ++static int neo1973kbd_suspend(struct platform_device *dev, pm_message_t state) ++{ ++ struct neo1973kbd *neo1973kbd = platform_get_drvdata(dev); ++ ++ neo1973kbd->suspended = 1; ++ ++ return 0; ++} ++ ++static int neo1973kbd_resume(struct platform_device *dev) ++{ ++ struct neo1973kbd *neo1973kbd = platform_get_drvdata(dev); ++ ++ neo1973kbd->suspended = 0; ++ ++ return 0; ++} ++#else ++#define neo1973kbd_suspend NULL ++#define neo1973kbd_resume NULL ++#endif ++ ++static int neo1973kbd_probe(struct platform_device *pdev) ++{ ++ struct neo1973kbd *neo1973kbd; ++ struct input_dev *input_dev; ++ int rc, irq_aux, irq_hold, irq_jack; ++ ++ neo1973kbd = kzalloc(sizeof(struct neo1973kbd), GFP_KERNEL); ++ input_dev = input_allocate_device(); ++ if (!neo1973kbd || !input_dev) { ++ kfree(neo1973kbd); ++ input_free_device(input_dev); ++ return -ENOMEM; ++ } ++ ++ if (pdev->resource[0].flags != 0) ++ return -EINVAL; ++ ++ irq_aux = s3c2410_gpio_getirq(pdev->resource[0].start); ++ if (irq_aux < 0) ++ return -EINVAL; ++ ++ irq_hold = s3c2410_gpio_getirq(pdev->resource[1].start); ++ if (irq_hold < 0) ++ return -EINVAL; ++ ++ irq_jack = s3c2410_gpio_getirq(pdev->resource[2].start); ++ if (irq_jack < 0) ++ return -EINVAL; ++ ++ platform_set_drvdata(pdev, neo1973kbd); ++ ++ neo1973kbd->input = input_dev; ++ ++ input_dev->name = "Neo1973 Buttons"; ++ input_dev->phys = "neo1973kbd/input0"; ++ input_dev->id.bustype = BUS_HOST; ++ input_dev->id.vendor = 0x0001; ++ input_dev->id.product = 0x0001; ++ input_dev->id.version = 0x0100; ++ input_dev->cdev.dev = &pdev->dev; ++ input_dev->private = neo1973kbd; ++ ++ input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_SW); ++ set_bit(SW_HEADPHONE_INSERT, input_dev->swbit); ++ set_bit(KEY_PHONE, input_dev->keybit); ++ set_bit(KEY_PAUSE, input_dev->keybit); ++ ++ rc = input_register_device(neo1973kbd->input); ++ if (rc) ++ goto out_register; ++ ++ if (request_irq(irq_aux, neo1973kbd_aux_irq, IRQF_DISABLED | ++ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, ++ "Neo1973 AUX button", neo1973kbd)) { ++ dev_err(&pdev->dev, "Can't get IRQ %u\n", irq_aux); ++ goto out_aux; ++ } ++ ++ /* ++ * GTA01 revisions before Bv4 can't be resumed by the PMU, so we use ++ * resume by AUX. ++ */ ++ if (machine_is_neo1973_gta01()) ++ enable_irq_wake(irq_aux); ++ ++ if (request_irq(irq_hold, neo1973kbd_hold_irq, IRQF_DISABLED | ++ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, ++ "Neo1973 HOLD button", neo1973kbd)) { ++ dev_err(&pdev->dev, "Can't get IRQ %u\n", irq_hold); ++ goto out_hold; ++ } ++ ++ if (request_irq(irq_jack, neo1973kbd_headphone_irq, IRQF_DISABLED | ++ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, ++ "Neo1973 Headphone Jack", neo1973kbd)) { ++ dev_err(&pdev->dev, "Can't get IRQ %u\n", irq_jack); ++ goto out_jack; ++ } ++ enable_irq_wake(irq_jack); ++ ++ return 0; ++ ++out_jack: ++ free_irq(irq_hold, neo1973kbd); ++out_hold: ++ free_irq(irq_aux, neo1973kbd); ++out_aux: ++ input_unregister_device(neo1973kbd->input); ++out_register: ++ input_free_device(neo1973kbd->input); ++ platform_set_drvdata(pdev, NULL); ++ kfree(neo1973kbd); ++ ++ return -ENODEV; ++} ++ ++static int neo1973kbd_remove(struct platform_device *pdev) ++{ ++ struct neo1973kbd *neo1973kbd = platform_get_drvdata(pdev); ++ ++ free_irq(s3c2410_gpio_getirq(pdev->resource[2].start), neo1973kbd); ++ free_irq(s3c2410_gpio_getirq(pdev->resource[1].start), neo1973kbd); ++ free_irq(s3c2410_gpio_getirq(pdev->resource[0].start), neo1973kbd); ++ ++ input_unregister_device(neo1973kbd->input); ++ input_free_device(neo1973kbd->input); ++ platform_set_drvdata(pdev, NULL); ++ kfree(neo1973kbd); ++ ++ return 0; ++} ++ ++static struct platform_driver neo1973kbd_driver = { ++ .probe = neo1973kbd_probe, ++ .remove = neo1973kbd_remove, ++ .suspend = neo1973kbd_suspend, ++ .resume = neo1973kbd_resume, ++ .driver = { ++ .name = "neo1973-button", ++ }, ++}; ++ ++static int __devinit neo1973kbd_init(void) ++{ ++ return platform_driver_register(&neo1973kbd_driver); ++} ++ ++static void __exit neo1973kbd_exit(void) ++{ ++ platform_driver_unregister(&neo1973kbd_driver); ++} ++ ++module_init(neo1973kbd_init); ++module_exit(neo1973kbd_exit); ++ ++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>"); ++MODULE_DESCRIPTION("FIC Neo1973 buttons input driver"); ++MODULE_LICENSE("GPL"); +-- +1.5.6.3 + |