Skip to content

Commit

Permalink
gpio: mpc8xxx: Add wake on GPIO support
Browse files Browse the repository at this point in the history
The mpc8xxx GPIO can generate an interrupt on state change. This
interrupt can be used to wake up the device from its sleep state if
enabled to do so. Add required support to the driver so that the GPIO
can be used in this way.

In order for the GPIO to actually function in this way, it is necessary
to also set the GPIO bit in the RCPM. This can be done via the device
tree fsl,rcpm-wakeup property.

Signed-off-by: Martyn Welch <martyn.welch@collabora.com>
Link: https://lore.kernel.org/r/20240820143328.1987442-1-martyn.welch@collabora.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
  • Loading branch information
Martyn Welch authored and Bartosz Golaszewski committed Sep 2, 2024
1 parent c10c762 commit e9482dc
Showing 1 changed file with 29 additions and 0 deletions.
29 changes: 29 additions & 0 deletions drivers/gpio/gpio-mpc8xxx.c
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,8 @@ static int mpc8xxx_probe(struct platform_device *pdev)
goto err;
}

device_init_wakeup(&pdev->dev, true);

return 0;
err:
irq_domain_remove(mpc8xxx_gc->irq);
Expand All @@ -429,6 +431,31 @@ static void mpc8xxx_remove(struct platform_device *pdev)
}
}

#ifdef CONFIG_PM
static int mpc8xxx_suspend(struct platform_device *pdev, pm_message_t state)
{
struct mpc8xxx_gpio_chip *mpc8xxx_gc = platform_get_drvdata(pdev);

if (mpc8xxx_gc->irqn && device_may_wakeup(&pdev->dev))
enable_irq_wake(mpc8xxx_gc->irqn);

return 0;
}

static int mpc8xxx_resume(struct platform_device *pdev)
{
struct mpc8xxx_gpio_chip *mpc8xxx_gc = platform_get_drvdata(pdev);

if (mpc8xxx_gc->irqn && device_may_wakeup(&pdev->dev))
disable_irq_wake(mpc8xxx_gc->irqn);

return 0;
}
#else
#define mpc8xxx_suspend NULL
#define mpc8xxx_resume NULL
#endif

#ifdef CONFIG_ACPI
static const struct acpi_device_id gpio_acpi_ids[] = {
{"NXP0031",},
Expand All @@ -440,6 +467,8 @@ MODULE_DEVICE_TABLE(acpi, gpio_acpi_ids);
static struct platform_driver mpc8xxx_plat_driver = {
.probe = mpc8xxx_probe,
.remove_new = mpc8xxx_remove,
.suspend = mpc8xxx_suspend,
.resume = mpc8xxx_resume,
.driver = {
.name = "gpio-mpc8xxx",
.of_match_table = mpc8xxx_gpio_ids,
Expand Down

0 comments on commit e9482dc

Please sign in to comment.