[PATCH v4 4/8] mfd: mc13xxx: Use devm_mfd_add_devices and devm_regmap_add_irq_chip

Alexander Kurz posted 8 patches 2 weeks, 3 days ago
[PATCH v4 4/8] mfd: mc13xxx: Use devm_mfd_add_devices and devm_regmap_add_irq_chip
Posted by Alexander Kurz 2 weeks, 3 days ago
Use devm_mfd_add_devices() for adding MFD child devices and
devm_regmap_add_irq_chip() for IRQ chip registration.

This reduces the amount of required cleanup.

Signed-off-by: Alexander Kurz <akurz@blala.de>
---
 drivers/mfd/mc13xxx-core.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c
index 920797b806ce..091c9171b2b7 100644
--- a/drivers/mfd/mc13xxx-core.c
+++ b/drivers/mfd/mc13xxx-core.c
@@ -381,7 +381,7 @@ static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx,
 	if (!cell.name)
 		return -ENOMEM;
 
-	return mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0,
+	return devm_mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0,
 			       regmap_irq_get_domain(mc13xxx->irq_data));
 }
 
@@ -455,8 +455,9 @@ int mc13xxx_common_init(struct device *dev)
 	mc13xxx->irq_chip.irqs = mc13xxx->irqs;
 	mc13xxx->irq_chip.num_irqs = ARRAY_SIZE(mc13xxx->irqs);
 
-	ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq, IRQF_ONESHOT,
-				  0, &mc13xxx->irq_chip, &mc13xxx->irq_data);
+	ret = devm_regmap_add_irq_chip(dev, mc13xxx->regmap, mc13xxx->irq,
+				       IRQF_ONESHOT, 0, &mc13xxx->irq_chip,
+				       &mc13xxx->irq_data);
 	if (ret)
 		return ret;
 
@@ -502,8 +503,6 @@ void mc13xxx_common_exit(struct device *dev)
 {
 	struct mc13xxx *mc13xxx = dev_get_drvdata(dev);
 
-	mfd_remove_devices(dev);
-	regmap_del_irq_chip(mc13xxx->irq, mc13xxx->irq_data);
 	mutex_destroy(&mc13xxx->lock);
 }
 EXPORT_SYMBOL_GPL(mc13xxx_common_exit);
-- 
2.39.5
Re: [PATCH v4 4/8] mfd: mc13xxx: Use devm_mfd_add_devices and devm_regmap_add_irq_chip
Posted by Dmitry Torokhov 2 weeks, 1 day ago
Hi Alexander,

On Sun, Sep 14, 2025 at 07:37:19PM +0000, Alexander Kurz wrote:
> Use devm_mfd_add_devices() for adding MFD child devices and
> devm_regmap_add_irq_chip() for IRQ chip registration.
> 
> This reduces the amount of required cleanup.
> 
> Signed-off-by: Alexander Kurz <akurz@blala.de>
> ---
>  drivers/mfd/mc13xxx-core.c | 9 ++++-----
>  1 file changed, 4 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c
> index 920797b806ce..091c9171b2b7 100644
> --- a/drivers/mfd/mc13xxx-core.c
> +++ b/drivers/mfd/mc13xxx-core.c
> @@ -381,7 +381,7 @@ static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx,
>  	if (!cell.name)
>  		return -ENOMEM;
>  
> -	return mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0,
> +	return devm_mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0,
>  			       regmap_irq_get_domain(mc13xxx->irq_data));
>  }
>  
> @@ -455,8 +455,9 @@ int mc13xxx_common_init(struct device *dev)
>  	mc13xxx->irq_chip.irqs = mc13xxx->irqs;
>  	mc13xxx->irq_chip.num_irqs = ARRAY_SIZE(mc13xxx->irqs);
>  
> -	ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq, IRQF_ONESHOT,
> -				  0, &mc13xxx->irq_chip, &mc13xxx->irq_data);
> +	ret = devm_regmap_add_irq_chip(dev, mc13xxx->regmap, mc13xxx->irq,
> +				       IRQF_ONESHOT, 0, &mc13xxx->irq_chip,
> +				       &mc13xxx->irq_data);
>  	if (ret)
>  		return ret;
>  
> @@ -502,8 +503,6 @@ void mc13xxx_common_exit(struct device *dev)
>  {
>  	struct mc13xxx *mc13xxx = dev_get_drvdata(dev);
>  
> -	mfd_remove_devices(dev);
> -	regmap_del_irq_chip(mc13xxx->irq, mc13xxx->irq_data);
>  	mutex_destroy(&mc13xxx->lock);

This causes the mutex be destroyed while the sub-devices are still
present. The power button will try to call mc13xxx_lock() and
mc13xxx_unlock() and of mutex debugging is enabled you'll get errors.

I'd remove mutex_destroy() as well (and transitively get rid of 
mc13xxx_common_exit()) and then look into getting rid of  mc13xxx_lock()
and mc13xxx_unlock() because, as I mentioned in another email, they are
IMO not needed.

But this version of the patch is broken as far as I can tell.

Thanks.

-- 
Dmitry
Re: [PATCH v4 4/8] mfd: mc13xxx: Use devm_mfd_add_devices and devm_regmap_add_irq_chip
Posted by Alexander Kurz 2 weeks ago
Hi Dimitry
On Tue, 16 Sep 2025, Dmitry Torokhov wrote:

> Hi Alexander,
> 
> On Sun, Sep 14, 2025 at 07:37:19PM +0000, Alexander Kurz wrote:
> > Use devm_mfd_add_devices() for adding MFD child devices and
> > devm_regmap_add_irq_chip() for IRQ chip registration.
> > 
> > This reduces the amount of required cleanup.
> > 
> > Signed-off-by: Alexander Kurz <akurz@blala.de>
> > ---
> >  drivers/mfd/mc13xxx-core.c | 9 ++++-----
> >  1 file changed, 4 insertions(+), 5 deletions(-)
> > 
> > diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c
> > index 920797b806ce..091c9171b2b7 100644
> > --- a/drivers/mfd/mc13xxx-core.c
> > +++ b/drivers/mfd/mc13xxx-core.c
> > @@ -381,7 +381,7 @@ static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx,
> >  	if (!cell.name)
> >  		return -ENOMEM;
> >  
> > -	return mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0,
> > +	return devm_mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0,
> >  			       regmap_irq_get_domain(mc13xxx->irq_data));
> >  }
> >  
> > @@ -455,8 +455,9 @@ int mc13xxx_common_init(struct device *dev)
> >  	mc13xxx->irq_chip.irqs = mc13xxx->irqs;
> >  	mc13xxx->irq_chip.num_irqs = ARRAY_SIZE(mc13xxx->irqs);
> >  
> > -	ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq, IRQF_ONESHOT,
> > -				  0, &mc13xxx->irq_chip, &mc13xxx->irq_data);
> > +	ret = devm_regmap_add_irq_chip(dev, mc13xxx->regmap, mc13xxx->irq,
> > +				       IRQF_ONESHOT, 0, &mc13xxx->irq_chip,
> > +				       &mc13xxx->irq_data);
> >  	if (ret)
> >  		return ret;
> >  
> > @@ -502,8 +503,6 @@ void mc13xxx_common_exit(struct device *dev)
> >  {
> >  	struct mc13xxx *mc13xxx = dev_get_drvdata(dev);
> >  
> > -	mfd_remove_devices(dev);
> > -	regmap_del_irq_chip(mc13xxx->irq, mc13xxx->irq_data);
> >  	mutex_destroy(&mc13xxx->lock);
> 
> This causes the mutex be destroyed while the sub-devices are still
> present. The power button will try to call mc13xxx_lock() and
> mc13xxx_unlock() and of mutex debugging is enabled you'll get errors.
Thanks for noting this, actually I have introduced this change
in v4 of this series.

> I'd remove mutex_destroy() as well (and transitively get rid of 
> mc13xxx_common_exit()) and then look into getting rid of  mc13xxx_lock()
> and mc13xxx_unlock() because, as I mentioned in another email, they are
> IMO not needed.
I would prefer not to extend the scope of this series even further
and just drop this patch for v5.

There are still more issues todo with mc13xxx, e.g. mc13xxx-led does
not work since commit 78efa53e715e ("leds: Init leds class earlier").
Cleaning up potentially legacy mutex is just one more topic on this list. 
> 
> But this version of the patch is broken as far as I can tell.
> 
> Thanks.
> 
> -- 
> Dmitry
> 
Thanks, Alexander
Re: [PATCH v4 4/8] mfd: mc13xxx: Use devm_mfd_add_devices and devm_regmap_add_irq_chip
Posted by Lee Jones 2 weeks, 1 day ago
On Tue, 16 Sep 2025, Dmitry Torokhov wrote:

> Hi Alexander,
> 
> On Sun, Sep 14, 2025 at 07:37:19PM +0000, Alexander Kurz wrote:
> > Use devm_mfd_add_devices() for adding MFD child devices and
> > devm_regmap_add_irq_chip() for IRQ chip registration.
> > 
> > This reduces the amount of required cleanup.
> > 
> > Signed-off-by: Alexander Kurz <akurz@blala.de>
> > ---
> >  drivers/mfd/mc13xxx-core.c | 9 ++++-----
> >  1 file changed, 4 insertions(+), 5 deletions(-)
> > 
> > diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c
> > index 920797b806ce..091c9171b2b7 100644
> > --- a/drivers/mfd/mc13xxx-core.c
> > +++ b/drivers/mfd/mc13xxx-core.c
> > @@ -381,7 +381,7 @@ static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx,
> >  	if (!cell.name)
> >  		return -ENOMEM;
> >  
> > -	return mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0,
> > +	return devm_mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0,
> >  			       regmap_irq_get_domain(mc13xxx->irq_data));
> >  }
> >  
> > @@ -455,8 +455,9 @@ int mc13xxx_common_init(struct device *dev)
> >  	mc13xxx->irq_chip.irqs = mc13xxx->irqs;
> >  	mc13xxx->irq_chip.num_irqs = ARRAY_SIZE(mc13xxx->irqs);
> >  
> > -	ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq, IRQF_ONESHOT,
> > -				  0, &mc13xxx->irq_chip, &mc13xxx->irq_data);
> > +	ret = devm_regmap_add_irq_chip(dev, mc13xxx->regmap, mc13xxx->irq,
> > +				       IRQF_ONESHOT, 0, &mc13xxx->irq_chip,
> > +				       &mc13xxx->irq_data);
> >  	if (ret)
> >  		return ret;
> >  
> > @@ -502,8 +503,6 @@ void mc13xxx_common_exit(struct device *dev)
> >  {
> >  	struct mc13xxx *mc13xxx = dev_get_drvdata(dev);
> >  
> > -	mfd_remove_devices(dev);
> > -	regmap_del_irq_chip(mc13xxx->irq, mc13xxx->irq_data);
> >  	mutex_destroy(&mc13xxx->lock);
> 
> This causes the mutex be destroyed while the sub-devices are still
> present. The power button will try to call mc13xxx_lock() and
> mc13xxx_unlock() and of mutex debugging is enabled you'll get errors.
> 
> I'd remove mutex_destroy() as well (and transitively get rid of 
> mc13xxx_common_exit()) and then look into getting rid of  mc13xxx_lock()
> and mc13xxx_unlock() because, as I mentioned in another email, they are
> IMO not needed.
> 
> But this version of the patch is broken as far as I can tell.

Thanks for the input Dmitry.

I have removed the patch until this gets resolved.

-- 
Lee Jones [李琼斯]
Re: (subset) [PATCH v4 4/8] mfd: mc13xxx: Use devm_mfd_add_devices and devm_regmap_add_irq_chip
Posted by Lee Jones 2 weeks, 2 days ago
On Sun, 14 Sep 2025 19:37:19 +0000, Alexander Kurz wrote:
> Use devm_mfd_add_devices() for adding MFD child devices and
> devm_regmap_add_irq_chip() for IRQ chip registration.
> 
> This reduces the amount of required cleanup.
> 
> 

Applied, thanks!

[4/8] mfd: mc13xxx: Use devm_mfd_add_devices and devm_regmap_add_irq_chip
      commit: c5f395868781099e54a220bd5d6dc60c698c8c72

--
Lee Jones [李琼斯]