linux-2.6.31: add driver for boc01 buttons
authorOE Builder <oebuilder@waffle.bolloretelecom.eu>
Fri, 30 Oct 2009 11:18:56 +0000 (12:18 +0100)
committerOE Builder <oebuilder@waffle.bolloretelecom.eu>
Fri, 30 Oct 2009 11:18:56 +0000 (12:18 +0100)
recipes/linux/linux-2.6.31/boc01/014-091030-buttons.patch [new file with mode: 0644]
recipes/linux/linux-2.6.31/boc01/defconfig
recipes/linux/linux_2.6.31.bb

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 (file)
index 0000000..9e56ad1
--- /dev/null
@@ -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);
index ad7856c..56e10a0 100644 (file)
@@ -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
 
 #
index 0956afd..d908326 100644 (file)
@@ -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 = "\