Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a71b819b authored by Philippe Langlais's avatar Philippe Langlais Committed by Linus Walleij
Browse files

mach-ux500: platform data for SFH7741 proximity sensor driver



Proximity sensor is managed as an input event (SW_PROXIMITY).

Signed-off-by: default avatarPhilippe Langlais <philippe.langlais@linaro.org>
[Named GPIO pin]
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent b3f1f73d
Loading
Loading
Loading
Loading
+52 −0
Original line number Diff line number Diff line
@@ -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)
+1 −0
Original line number Diff line number Diff line
@@ -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)