| From a572ccf8d29ed64f036d9324ffad7790a4c36ff8 Mon Sep 17 00:00:00 2001 |
| From: Hans de Goede <hdegoede@redhat.com> |
| Date: Mon, 23 Mar 2020 22:59:39 +0100 |
| Subject: [PATCH] extcon: axp288: Add wakeup support |
| |
| commit 9c94553099efb2ba873cbdddfd416a8a09d0e5f1 upstream. |
| |
| On devices with an AXP288, we need to wakeup from suspend when a charger |
| is plugged in, so that we can do charger-type detection and so that the |
| axp288-charger driver, which listens for our extcon events, can configure |
| the input-current-limit accordingly. |
| |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> |
| Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/extcon/extcon-axp288.c b/drivers/extcon/extcon-axp288.c |
| index 7254852e6ec0..0bd08ef4a083 100644 |
| --- a/drivers/extcon/extcon-axp288.c |
| +++ b/drivers/extcon/extcon-axp288.c |
| @@ -421,9 +421,40 @@ static int axp288_extcon_probe(struct platform_device *pdev) |
| /* Start charger cable type detection */ |
| axp288_extcon_enable(info); |
| |
| + device_init_wakeup(dev, true); |
| + platform_set_drvdata(pdev, info); |
| + |
| + return 0; |
| +} |
| + |
| +static int __maybe_unused axp288_extcon_suspend(struct device *dev) |
| +{ |
| + struct axp288_extcon_info *info = dev_get_drvdata(dev); |
| + |
| + if (device_may_wakeup(dev)) |
| + enable_irq_wake(info->irq[VBUS_RISING_IRQ]); |
| + |
| return 0; |
| } |
| |
| +static int __maybe_unused axp288_extcon_resume(struct device *dev) |
| +{ |
| + struct axp288_extcon_info *info = dev_get_drvdata(dev); |
| + |
| + /* |
| + * Wakeup when a charger is connected to do charger-type |
| + * connection and generate an extcon event which makes the |
| + * axp288 charger driver set the input current limit. |
| + */ |
| + if (device_may_wakeup(dev)) |
| + disable_irq_wake(info->irq[VBUS_RISING_IRQ]); |
| + |
| + return 0; |
| +} |
| + |
| +static SIMPLE_DEV_PM_OPS(axp288_extcon_pm_ops, axp288_extcon_suspend, |
| + axp288_extcon_resume); |
| + |
| static const struct platform_device_id axp288_extcon_table[] = { |
| { .name = "axp288_extcon" }, |
| {}, |
| @@ -435,6 +466,7 @@ static struct platform_driver axp288_extcon_driver = { |
| .id_table = axp288_extcon_table, |
| .driver = { |
| .name = "axp288_extcon", |
| + .pm = &axp288_extcon_pm_ops, |
| }, |
| }; |
| |
| -- |
| 2.7.4 |
| |