diff options
author | Davide Garberi <dade.garberi@gmail.com> | 2018-10-05 22:55:24 +0200 |
---|---|---|
committer | Davide Garberi <dade.garberi@gmail.com> | 2022-07-27 18:59:04 +0200 |
commit | 6310fa483621961a0b809329830a7e01a48caa3c (patch) | |
tree | df82303e29459deb8b3caa271b8018f11beb4b8e | |
parent | 3ac6332f857a3bdb116274450f4fcf22736bb3ac (diff) |
fpc1020: Add wakeup sysfs node and dts entry
* Useful for configpanel
Signed-off-by: Davide Garberi <dade.garberi@gmail.com>
Change-Id: I5e522fde0a69b4e21cfa1ec76907a083ffae1a65
-rwxr-xr-x | arch/arm/boot/dts/qcom/zuk/common-fingerprint.dtsi | 1 | ||||
-rw-r--r-- | drivers/fingerprint/fpc1020_ree.c | 44 |
2 files changed, 40 insertions, 5 deletions
diff --git a/arch/arm/boot/dts/qcom/zuk/common-fingerprint.dtsi b/arch/arm/boot/dts/qcom/zuk/common-fingerprint.dtsi index e59e8de4f8c2..4d5131fc7f50 100755 --- a/arch/arm/boot/dts/qcom/zuk/common-fingerprint.dtsi +++ b/arch/arm/boot/dts/qcom/zuk/common-fingerprint.dtsi @@ -7,6 +7,7 @@ interrupts = <91 0x1>; fpc,gpio_irq = <&tlmm 91 0x00>; fpc,gpio_reset = <&tlmm 90 0x00>; + fpc,enable-wakeup; }; gen-vkeys { diff --git a/drivers/fingerprint/fpc1020_ree.c b/drivers/fingerprint/fpc1020_ree.c index 60a78378b5fc..166040a550f2 100644 --- a/drivers/fingerprint/fpc1020_ree.c +++ b/drivers/fingerprint/fpc1020_ree.c @@ -186,6 +186,36 @@ static ssize_t utouch_show_disable(struct device *dev, } static DEVICE_ATTR(utouch_disable, S_IRUGO|S_IWUSR, utouch_show_disable, utouch_store_disable); +static ssize_t enable_wakeup_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + char c; + + c = fpc1020->wakeup_enabled ? '1' : '0'; + return scnprintf(buf, PAGE_SIZE, "%c\n", c); +} + +static ssize_t enable_wakeup_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + int i; + + if (sscanf(buf, "%u", &i) == 1 && i < 2) { + fpc1020->wakeup_enabled = (i == 1); + + dev_info(dev, "%s\n", i ? "wakeup enabled" : "wakeup disabled"); + return count; + } else { + dev_info(dev, "%s: wakeup_enabled write error\n", __func__); + return -EINVAL; + } +} +static DEVICE_ATTR(enable_wakeup, S_IWUSR | S_IRUSR, enable_wakeup_show, + enable_wakeup_store); + + static ssize_t proximity_state_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { @@ -212,6 +242,7 @@ static DEVICE_ATTR(proximity_state, S_IWUSR, NULL, proximity_state_set); static struct attribute *attributes[] = { &dev_attr_irq.attr, &dev_attr_key.attr, + &dev_attr_enable_wakeup.attr, &dev_attr_proximity_state.attr, &dev_attr_utouch_disable.attr, NULL @@ -299,7 +330,7 @@ static irqreturn_t fpc1020_irq_handler(int irq, void *_fpc1020) static int fpc1020_initial_irq(struct fpc1020_data *fpc1020) { int retval = 0; - + int irqf; if (!gpio_is_valid(fpc1020->irq_gpio)) { pr_err("IRQ pin(%d) is not valid\n", fpc1020->irq_gpio); return -EINVAL; @@ -323,12 +354,15 @@ static int fpc1020_initial_irq(struct fpc1020_data *fpc1020) return -EINVAL; } - device_init_wakeup(fpc1020->dev, 1); - fpc1020->wakeup_enabled = 1; + irqf = IRQF_TRIGGER_RISING | IRQF_ONESHOT; + if (of_property_read_bool(fpc1020->dev->of_node, "fpc,enable-wakeup")) { + irqf |= IRQF_NO_SUSPEND; + device_init_wakeup(fpc1020->dev, 1); + fpc1020->wakeup_enabled = 1; + } retval = devm_request_threaded_irq(fpc1020->dev, - fpc1020->irq, NULL, fpc1020_irq_handler, - IRQF_TRIGGER_RISING | IRQF_ONESHOT | IRQF_NO_SUSPEND, + fpc1020->irq, NULL, fpc1020_irq_handler, irqf, dev_name(fpc1020->dev), fpc1020); if (retval) { |