mach-ux500: platform data for SFH7741 proximity sensor driver
authorPhilippe Langlais <philippe.langlais@linaro.org>
Fri, 14 Jan 2011 09:53:59 +0000 (10:53 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 14 Mar 2011 13:05:11 +0000 (14:05 +0100)
Proximity sensor is managed as an input event (SW_PROXIMITY).

Signed-off-by: Philippe Langlais <philippe.langlais@linaro.org>
[Named GPIO pin]
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
arch/arm/mach-ux500/board-mop500.c
arch/arm/mach-ux500/board-mop500.h

index fd6d509..dce6878 100644 (file)
@@ -20,6 +20,8 @@
 #include <linux/spi/spi.h>
 #include <linux/mfd/ab8500.h>
 #include <linux/mfd/tc3589x.h>
+#include <linux/input.h>
+#include <linux/gpio_keys.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -181,8 +183,58 @@ static void __init mop500_i2c_init(void)
        db8500_add_i2c3(&u8500_i2c3_data);
 }
 
+static struct gpio_keys_button mop500_gpio_keys[] = {
+       {
+               .desc                   = "SFH7741 Proximity Sensor",
+               .type                   = EV_SW,
+               .code                   = SW_FRONT_PROXIMITY,
+               .gpio                   = GPIO_PROX_SENSOR,
+               .active_low             = 0,
+               .can_disable            = 1,
+       }
+};
+
+static struct regulator *prox_regulator;
+static int mop500_prox_activate(struct device *dev);
+static void mop500_prox_deactivate(struct device *dev);
+
+static struct gpio_keys_platform_data mop500_gpio_keys_data = {
+       .buttons        = mop500_gpio_keys,
+       .nbuttons       = ARRAY_SIZE(mop500_gpio_keys),
+       .enable         = mop500_prox_activate,
+       .disable        = mop500_prox_deactivate,
+};
+
+static struct platform_device mop500_gpio_keys_device = {
+       .name   = "gpio-keys",
+       .id     = 0,
+       .dev    = {
+               .platform_data  = &mop500_gpio_keys_data,
+       },
+};
+
+static int mop500_prox_activate(struct device *dev)
+{
+       prox_regulator = regulator_get(&mop500_gpio_keys_device.dev,
+                                               "vcc");
+       if (IS_ERR(prox_regulator)) {
+               dev_err(&mop500_gpio_keys_device.dev,
+                       "no regulator\n");
+               return PTR_ERR(prox_regulator);
+       }
+       regulator_enable(prox_regulator);
+       return 0;
+}
+
+static void mop500_prox_deactivate(struct device *dev)
+{
+       regulator_disable(prox_regulator);
+       regulator_put(prox_regulator);
+}
+
 /* add any platform devices here - TODO */
 static struct platform_device *platform_devs[] __initdata = {
+       &mop500_gpio_keys_device,
 };
 
 static void __init mop500_spi_init(void)
index fe22b84..19b6c27 100644 (file)
@@ -11,6 +11,7 @@
 
 /* GPIOs on the TC35892 expander */
 #define GPIO_SDMMC_CD                  MOP500_EGPIO(3)
+#define GPIO_PROX_SENSOR               MOP500_EGPIO(7)
 #define GPIO_BU21013_CS                        MOP500_EGPIO(13)
 #define GPIO_SDMMC_EN                  MOP500_EGPIO(17)
 #define GPIO_SDMMC_1V8_3V_SEL          MOP500_EGPIO(18)