diff options
author | Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com> | 2020-01-20 16:43:55 +0300 |
---|---|---|
committer | Lee Jones <lee.jones@linaro.org> | 2020-01-24 10:22:43 +0300 |
commit | e795bf725dabc918298e74cb29303ea6783f1874 (patch) | |
tree | 7cfd40a3365eb4cfb93d24a3d4349bc8856316d7 | |
parent | 1c743ad523bb2f77a43a740a43c3b5bb9cbd82cd (diff) | |
download | linux-e795bf725dabc918298e74cb29303ea6783f1874.tar.xz |
mfd: bd71828: Add power-key support
Use gpio_keys to send power input-event to user-space when power
button (short) press is detected.
Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
-rw-r--r-- | drivers/mfd/rohm-bd71828.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/mfd/rohm-bd71828.c b/drivers/mfd/rohm-bd71828.c index 0ec386c9f26b..210261d026f2 100644 --- a/drivers/mfd/rohm-bd71828.c +++ b/drivers/mfd/rohm-bd71828.c @@ -4,7 +4,9 @@ // // ROHM BD71828 PMIC driver +#include <linux/gpio_keys.h> #include <linux/i2c.h> +#include <linux/input.h> #include <linux/interrupt.h> #include <linux/ioport.h> #include <linux/irq.h> @@ -15,6 +17,18 @@ #include <linux/regmap.h> #include <linux/types.h> +static struct gpio_keys_button button = { + .code = KEY_POWER, + .gpio = -1, + .type = EV_KEY, +}; + +static struct gpio_keys_platform_data bd71828_powerkey_data = { + .buttons = &button, + .nbuttons = 1, + .name = "bd71828-pwrkey", +}; + static const struct resource rtc_irqs[] = { DEFINE_RES_IRQ_NAMED(BD71828_INT_RTC0, "bd71828-rtc-alm-0"), DEFINE_RES_IRQ_NAMED(BD71828_INT_RTC1, "bd71828-rtc-alm-1"), @@ -35,6 +49,10 @@ static struct mfd_cell bd71828_mfd_cells[] = { .name = "bd71828-rtc", .resources = rtc_irqs, .num_resources = ARRAY_SIZE(rtc_irqs), + }, { + .name = "gpio-keys", + .platform_data = &bd71828_powerkey_data, + .pdata_size = sizeof(bd71828_powerkey_data), }, }; @@ -288,6 +306,14 @@ static int bd71828_i2c_probe(struct i2c_client *i2c) dev_dbg(&i2c->dev, "Registered %d IRQs for chip\n", bd71828_irq_chip.num_irqs); + ret = regmap_irq_get_virq(irq_data, BD71828_INT_SHORTPUSH); + if (ret < 0) { + dev_err(&i2c->dev, "Failed to get the power-key IRQ\n"); + return ret; + } + + button.irq = ret; + ret = devm_mfd_add_devices(&i2c->dev, PLATFORM_DEVID_AUTO, bd71828_mfd_cells, ARRAY_SIZE(bd71828_mfd_cells), NULL, 0, |