Re: [PATCH v2 2/5] mfd: rn5t618: add irq support

From: Pierre-Hugues Husson
Date: Wed Nov 20 2019 - 02:54:58 EST


Le jeu. 31 oct. 2019 Ã 22:38, Andreas Kemnade <andreas@xxxxxxxxxxxx> a Ãcrit :
>
> This adds support for irq handling in the rc5t619 which is required
> for properly implementing subdevices like rtc.
> For now only definitions for the variant rc5t619 are included.
>
> Signed-off-by: Andreas Kemnade <andreas@xxxxxxxxxxxx>
> ---
> Changes in v2:
> - no dead code, did some more testing and thinking for that
> - remove extra empty lines
> drivers/mfd/Kconfig | 1 +
> drivers/mfd/Makefile | 2 +-
> drivers/mfd/rn5t618-core.c | 35 ++++++++++++++-
> drivers/mfd/rn5t618-irq.c | 85 +++++++++++++++++++++++++++++++++++++
> include/linux/mfd/rn5t618.h | 16 +++++++
> 5 files changed, 137 insertions(+), 2 deletions(-)
> create mode 100644 drivers/mfd/rn5t618-irq.c
>
> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index ae24d3ea68ea..522e068d0082 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -1057,6 +1057,7 @@ config MFD_RN5T618
> depends on OF
> select MFD_CORE
> select REGMAP_I2C
> + select REGMAP_IRQ
> help
> Say yes here to add support for the Ricoh RN5T567,
> RN5T618, RC5T619 PMIC.
> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> index 110ea700231b..2906d5db67d0 100644
> --- a/drivers/mfd/Makefile
> +++ b/drivers/mfd/Makefile
> @@ -217,7 +217,7 @@ obj-$(CONFIG_MFD_VIPERBOARD) += viperboard.o
> obj-$(CONFIG_MFD_RC5T583) += rc5t583.o rc5t583-irq.o
> obj-$(CONFIG_MFD_RK808) += rk808.o
>
> -rn5t618-objs := rn5t618-core.o
> +rn5t618-objs := rn5t618-core.o rn5t618-irq.o
> obj-$(CONFIG_MFD_RN5T618) += rn5t618.o
> obj-$(CONFIG_MFD_SEC_CORE) += sec-core.o sec-irq.o
> obj-$(CONFIG_MFD_SYSCON) += syscon.o
> diff --git a/drivers/mfd/rn5t618-core.c b/drivers/mfd/rn5t618-core.c
> index da5cd9c92a59..d4ed2865ed8b 100644
> --- a/drivers/mfd/rn5t618-core.c
> +++ b/drivers/mfd/rn5t618-core.c
> @@ -8,6 +8,7 @@
>
> #include <linux/delay.h>
> #include <linux/i2c.h>
> +#include <linux/interrupt.h>
> #include <linux/mfd/core.h>
> #include <linux/mfd/rn5t618.h>
> #include <linux/module.h>
> @@ -105,7 +106,8 @@ static int rn5t618_i2c_probe(struct i2c_client *i2c,
>
> i2c_set_clientdata(i2c, priv);
> priv->variant = (long)of_id->data;
> -
> + priv->chip_irq = i2c->irq;
> + priv->dev = &i2c->dev;
> priv->regmap = devm_regmap_init_i2c(i2c, &rn5t618_regmap_config);
> if (IS_ERR(priv->regmap)) {
> ret = PTR_ERR(priv->regmap);
> @@ -137,6 +139,11 @@ static int rn5t618_i2c_probe(struct i2c_client *i2c,
> return ret;
> }
>
> + if (priv->chip_irq > 0) {
> + if (rn5t618_irq_init(priv))
> + priv->chip_irq = 0;
> + }
> +
> return 0;
> }
>
> @@ -154,15 +161,41 @@ static int rn5t618_i2c_remove(struct i2c_client *i2c)
> return 0;
> }
>
> +static int __maybe_unused rn5t618_i2c_suspend(struct device *dev)
> +{
> + struct rn5t618 *priv = dev_get_drvdata(dev);
> +
> + if (priv->chip_irq)
> + disable_irq(priv->chip_irq);
> +
> + return 0;
> +}
> +
> +static int __maybe_unused rn5t618_i2c_resume(struct device *dev)
> +{
> + struct rn5t618 *priv = dev_get_drvdata(dev);
> +
> + if (priv->chip_irq)
> + enable_irq(priv->chip_irq);
> +
> + return 0;
> +}

For what it's worth, the boards I have (Archos 101 Oxygen and Pipo P9)
with rc5t619 use GPIO for power button.
So IRQ would need to be enabled in suspend for this to work.
Also, since you actually added alarm support, perhaps you want to
wake-up from suspend using alarm as well?