diff options
-rw-r--r-- | recipes/linux/linux-2.6.31/boc01/014-091030-buttons.patch | 233 | ||||
-rw-r--r-- | recipes/linux/linux-2.6.31/boc01/defconfig | 1 | ||||
-rw-r--r-- | recipes/linux/linux_2.6.31.bb | 1 |
3 files changed, 235 insertions, 0 deletions
diff --git a/recipes/linux/linux-2.6.31/boc01/014-091030-buttons.patch b/recipes/linux/linux-2.6.31/boc01/014-091030-buttons.patch new file mode 100644 index 0000000000..9e56ad12b0 --- /dev/null +++ b/recipes/linux/linux-2.6.31/boc01/014-091030-buttons.patch @@ -0,0 +1,233 @@ +Index: linux-2.6.31/drivers/input/misc/Kconfig +=================================================================== +--- linux-2.6.31.orig/drivers/input/misc/Kconfig 2009-10-30 11:08:24.000000000 +0100 ++++ linux-2.6.31/drivers/input/misc/Kconfig 2009-10-30 11:08:32.000000000 +0100 +@@ -270,6 +270,13 @@ + To compile this driver as a module, choose M here: the + module will be called dm355evm_keys. + ++config INPUT_BOC_BTNS ++ tristate "BoC buttons interface" ++ select INPUT_POLLDEV ++ help ++ To compile this driver as a module, choose M here: ++ the module will be called boc-btns. ++ + config INPUT_CAPSENSE_BTNS + tristate "CAPSENSE CY8C201xx buttons interface" + select INPUT_POLLDEV +Index: linux-2.6.31/drivers/input/misc/Makefile +=================================================================== +--- linux-2.6.31.orig/drivers/input/misc/Makefile 2009-10-30 11:08:51.000000000 +0100 ++++ linux-2.6.31/drivers/input/misc/Makefile 2009-10-30 11:08:58.000000000 +0100 +@@ -26,4 +26,5 @@ + obj-$(CONFIG_INPUT_UINPUT) += uinput.o + obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o + obj-$(CONFIG_INPUT_YEALINK) += yealink.o ++obj-$(CONFIG_INPUT_BOC_BTNS) += boc-btns.o + obj-$(CONFIG_INPUT_CAPSENSE_BTNS) += capsense-btns.o +Index: linux-2.6.31/drivers/input/misc/boc-btns.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.31/drivers/input/misc/boc-btns.c 2009-10-30 11:57:13.000000000 +0100 +@@ -0,0 +1,200 @@ ++/* ++ * Buttons for BoC ++ * ++ * Copyright (C) 2009, Bollore telecom (www.bolloretelecom.eu). ++ * ++ * Jeremy Lainé <jeremy.laine@bolloretelecom.eu> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * 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. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#include <linux/init.h> ++#include <linux/gpio.h> ++#include <linux/input-polldev.h> ++#include <linux/module.h> ++#include <linux/platform_device.h> ++ ++#define BUTTONS_POLL_INTERVAL 30 /* msec */ ++ ++static unsigned char input_gpio[] = { ++ 231, // reset button ++}; ++ ++static unsigned short input_keymap[] = { ++ KEY_ESC, ++}; ++ ++struct buttons_dev { ++ struct input_polled_dev *poll_dev; ++ unsigned short keymap[ARRAY_SIZE(input_keymap)]; ++ int state[ARRAY_SIZE(input_keymap)]; ++}; ++ ++/* ++ * Buttons events handling ++ */ ++ ++static void handle_buttons(struct input_polled_dev *dev) ++{ ++ int i, value; ++ struct buttons_dev *bdev = dev->private; ++ struct input_dev *input = dev->input; ++ ++ // read GPIO ++ for (i = 0; i < ARRAY_SIZE(input_keymap); i++) ++ { ++ value = gpio_get_value(input_gpio[i]); ++ if (value != bdev->state[i]) ++ { ++ input_event(input, EV_MSC, MSC_SCAN, i); ++ input_report_key(input, input_keymap[i], value); ++ input_sync(input); ++ bdev->state[i] = value; ++ } ++ } ++} ++ ++/* ++ * Device initialisation ++ */ ++ ++static int __devinit boc_buttons_probe(struct platform_device *pdev) ++{ ++ struct buttons_dev *bdev; ++ struct input_polled_dev *poll_dev; ++ struct input_dev *input; ++ int error, i; ++ ++ for (i = 0; i < ARRAY_SIZE(input_keymap); i++) ++ { ++ if (gpio_request(input_gpio[i], NULL) < 0) ++ return -ENODEV; ++ } ++ ++ bdev = kzalloc(sizeof(struct buttons_dev), GFP_KERNEL); ++ if (!bdev) ++ return -ENOMEM; ++ ++ poll_dev = input_allocate_polled_device(); ++ if (!poll_dev) { ++ error = -ENOMEM; ++ goto out_allocated; ++ } ++ ++ memcpy(bdev->keymap, input_keymap, sizeof(bdev->keymap)); ++ ++ poll_dev->private = bdev; ++ poll_dev->poll = handle_buttons; ++ poll_dev->poll_interval = BUTTONS_POLL_INTERVAL; ++ ++ input = poll_dev->input; ++ input->name = "BoC buttons"; ++ input->phys = "boc/input0"; ++ input->id.bustype = BUS_HOST; ++ input->dev.parent = &pdev->dev; ++ ++ input->keycode = bdev->keymap; ++ input->keycodemax = ARRAY_SIZE(bdev->keymap); ++ input->keycodesize = sizeof(unsigned short); ++ ++ input_set_capability(input, EV_MSC, MSC_SCAN); ++ set_bit(EV_KEY, input->evbit); ++ ++ bdev->poll_dev = poll_dev; ++ dev_set_drvdata(&pdev->dev, bdev); ++ ++ error = input_register_polled_device(poll_dev); ++ if (error < 0) ++ goto out_polled; ++ ++ return 0; ++ ++out_polled: ++ input_free_polled_device(poll_dev); ++out_allocated: ++ kfree(bdev); ++ return error; ++} ++ ++static int __devexit boc_buttons_remove(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct buttons_dev *bdev = dev_get_drvdata(dev); ++ int i; ++ ++ input_unregister_polled_device(bdev->poll_dev); ++ input_free_polled_device(bdev->poll_dev); ++ kfree(bdev); ++ dev_set_drvdata(dev, NULL); ++ ++ for (i = 0; i < ARRAY_SIZE(input_keymap); i++) ++ gpio_free(input_gpio[i]); ++ ++ return 0; ++} ++ ++/* ++ * Driver initialisation ++ */ ++ ++static struct platform_driver boc_buttons_driver = { ++ .probe = boc_buttons_probe, ++ .remove = __devexit_p(boc_buttons_remove), ++ .driver = { ++ .name = "boc-btns", ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static struct platform_device *boc_buttons_device; ++ ++static int __init boc_buttons_init(void) ++{ ++ int err; ++ ++ err = platform_driver_register(&boc_buttons_driver); ++ if (err) ++ return err; ++ ++ boc_buttons_device = platform_device_alloc("boc-btns", -1); ++ if (!boc_buttons_device) { ++ err = -ENOMEM; ++ goto err_unregister_driver; ++ } ++ ++ err = platform_device_add(boc_buttons_device); ++ if (err) ++ goto err_free_device; ++ ++ return 0; ++ ++err_free_device: ++ platform_device_put(boc_buttons_device); ++err_unregister_driver: ++ platform_driver_unregister(&boc_buttons_driver); ++ return err; ++} ++ ++static void __exit boc_buttons_exit(void) ++{ ++ platform_device_unregister(boc_buttons_device); ++ platform_driver_unregister(&boc_buttons_driver); ++} ++ ++MODULE_AUTHOR("Jeremy Laine <jeremy.laine@m4x.org>"); ++MODULE_DESCRIPTION("BoC input driver"); ++MODULE_LICENSE("GPL"); ++module_init(boc_buttons_init); ++module_exit(boc_buttons_exit); diff --git a/recipes/linux/linux-2.6.31/boc01/defconfig b/recipes/linux/linux-2.6.31/boc01/defconfig index ad7856ce85..56e10a04a0 100644 --- a/recipes/linux/linux-2.6.31/boc01/defconfig +++ b/recipes/linux/linux-2.6.31/boc01/defconfig @@ -1089,6 +1089,7 @@ CONFIG_INPUT_MISC=y # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_UINPUT is not set # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set +CONFIG_INPUT_BOC_BTNS=y CONFIG_INPUT_CAPSENSE_BTNS=y # diff --git a/recipes/linux/linux_2.6.31.bb b/recipes/linux/linux_2.6.31.bb index 0956afdf75..d908326016 100644 --- a/recipes/linux/linux_2.6.31.bb +++ b/recipes/linux/linux_2.6.31.bb @@ -30,6 +30,7 @@ SRC_URI_append_boc01 = "\ file://011-091028-gpio.patch;patch=1 \ file://012-091019-capsense.patch;patch=1 \ file://013-091015-lcd.patch;patch=1 \ + file://014-091030-buttons.patch;patch=1 \ " SRC_URI_append_collie = "\ |