lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <fd0136e17af78dc9960fdff215022fa6ea89f116.camel@linaro.org>
Date: Tue, 13 Jan 2026 13:48:36 +0000
From: André Draszik <andre.draszik@...aro.org>
To: Lee Jones <lee@...nel.org>
Cc: Krzysztof Kozlowski <krzk@...nel.org>, Alexandre Belloni	
 <alexandre.belloni@...tlin.com>, Peter Griffin <peter.griffin@...aro.org>, 
 Tudor Ambarus <tudor.ambarus@...aro.org>, Will McVicker
 <willmcvicker@...gle.com>, Juan Yescas	 <jyescas@...gle.com>, Douglas
 Anderson <dianders@...omium.org>, 	kernel-team@...roid.com, Kaustabh
 Chakraborty <kauschluss@...root.org>, 	linux-kernel@...r.kernel.org,
 linux-samsung-soc@...r.kernel.org, 	linux-rtc@...r.kernel.org
Subject: Re: [PATCH RESEND v2 3/3] mfd: sec: drop now unused struct
 sec_pmic_dev::irq_data

Hi Lee,

Thanks for your review.

On Fri, 2026-01-09 at 10:45 +0000, Lee Jones wrote:
> On Wed, 17 Dec 2025, André Draszik wrote:
> 
> > This was used only to allow the s5m RTC driver to deal with the alarm
> > IRQ. That driver now uses a different approach to acquire that IRQ, and
> > ::irq_data doesn't need to be kept around anymore.
> > 
> > Signed-off-by: André Draszik <andre.draszik@...aro.org>
> > ---
> >  drivers/mfd/sec-common.c         |  9 +++---
> >  drivers/mfd/sec-core.h           |  2 +-
> >  drivers/mfd/sec-irq.c            | 63 ++++++++++++++++++----------------------
> >  include/linux/mfd/samsung/core.h |  1 -
> >  4 files changed, 35 insertions(+), 40 deletions(-)
> > 
> > diff --git a/drivers/mfd/sec-common.c b/drivers/mfd/sec-common.c
> > index 77370db52a7ba81234136b29f85892f4b197f429..0021f9ae8484fd0afc2e47c813a953c91fa38546 100644
> > --- a/drivers/mfd/sec-common.c
> > +++ b/drivers/mfd/sec-common.c
> > @@ -163,6 +163,7 @@ sec_pmic_parse_dt_pdata(struct device *dev)
> >  int sec_pmic_probe(struct device *dev, int device_type, unsigned int irq,
> >  		   struct regmap *regmap, struct i2c_client *client)
> >  {
> > +	struct regmap_irq_chip_data *irq_data;
> >  	struct sec_platform_data *pdata;
> >  	const struct mfd_cell *sec_devs;
> >  	struct sec_pmic_dev *sec_pmic;
> > @@ -187,9 +188,9 @@ int sec_pmic_probe(struct device *dev, int device_type, unsigned int irq,
> >  
> >  	sec_pmic->pdata = pdata;
> >  
> > -	ret = sec_irq_init(sec_pmic);
> > -	if (ret)
> > -		return ret;
> > +	irq_data = sec_irq_init(sec_pmic);
> > +	if (IS_ERR(irq_data))
> > +		return PTR_ERR(irq_data);
> >  
> >  	pm_runtime_set_active(sec_pmic->dev);
> >  
> > @@ -240,7 +241,7 @@ int sec_pmic_probe(struct device *dev, int device_type, unsigned int irq,
> >  				     sec_pmic->device_type);
> >  	}
> >  	ret = devm_mfd_add_devices(sec_pmic->dev, -1, sec_devs, num_sec_devs,
> > -				   NULL, 0, regmap_irq_get_domain(sec_pmic->irq_data));
> > +				   NULL, 0, regmap_irq_get_domain(irq_data));
> >  	if (ret)
> >  		return ret;
> >  
> > diff --git a/drivers/mfd/sec-core.h b/drivers/mfd/sec-core.h
> > index 92c7558ab8b0de44a52e028eeb7998e38358cb4c..8d85c70c232612d1f7e5fb61b2acd25bf03a62e0 100644
> > --- a/drivers/mfd/sec-core.h
> > +++ b/drivers/mfd/sec-core.h
> > @@ -18,6 +18,6 @@ int sec_pmic_probe(struct device *dev, int device_type, unsigned int irq,
> >  		   struct regmap *regmap, struct i2c_client *client);
> >  void sec_pmic_shutdown(struct device *dev);
> >  
> > -int sec_irq_init(struct sec_pmic_dev *sec_pmic);
> > +struct regmap_irq_chip_data *sec_irq_init(struct sec_pmic_dev *sec_pmic);
> >  
> >  #endif /* __SEC_CORE_INT_H */
> > diff --git a/drivers/mfd/sec-irq.c b/drivers/mfd/sec-irq.c
> > index d992e41e716dcdc060421e1db8475523842a12be..96f53c3617da4cb54f650f9b98c0b934b823ceda 100644
> > --- a/drivers/mfd/sec-irq.c
> > +++ b/drivers/mfd/sec-irq.c
> > @@ -268,26 +268,28 @@ static const struct regmap_irq_chip s5m8767_irq_chip = {
> >  	.ack_base = S5M8767_REG_INT1,
> >  };
> >  
> > -static int s2mpg1x_add_chained_irq_chip(struct device *dev, struct regmap *regmap, int pirq,
> > -					struct regmap_irq_chip_data *parent,
> > -					const struct regmap_irq_chip *chip,
> > -					struct regmap_irq_chip_data **data)
> > +static struct regmap_irq_chip_data *
> > +s2mpg1x_add_chained_irq_chip(struct device *dev, struct regmap *regmap, int pirq,
> > +			     struct regmap_irq_chip_data *parent,
> > +			     const struct regmap_irq_chip *chip)
> >  {
> > +	struct regmap_irq_chip_data *data;
> >  	int irq, ret;
> >  
> >  	irq = regmap_irq_get_virq(parent, pirq);
> >  	if (irq < 0)
> > -		return dev_err_probe(dev, irq, "Failed to get parent vIRQ(%d) for chip %s\n", pirq,
> > -				     chip->name);
> > +		return dev_err_ptr_probe(dev, irq, "Failed to get parent vIRQ(%d) for chip %s\n",
> > +					 pirq, chip->name);
> >  
> > -	ret = devm_regmap_add_irq_chip(dev, regmap, irq, IRQF_ONESHOT | IRQF_SHARED, 0, chip, data);
> > +	ret = devm_regmap_add_irq_chip(dev, regmap, irq, IRQF_ONESHOT | IRQF_SHARED, 0, chip,
> > +				       &data);
> >  	if (ret)
> > -		return dev_err_probe(dev, ret, "Failed to add %s IRQ chip\n", chip->name);
> > +		return dev_err_ptr_probe(dev, ret, "Failed to add %s IRQ chip\n", chip->name);
> >  
> > -	return 0;
> > +	return data;
> >  }
> >  
> > -static int sec_irq_init_s2mpg1x(struct sec_pmic_dev *sec_pmic)
> > +static struct regmap_irq_chip_data *sec_irq_init_s2mpg1x(struct sec_pmic_dev *sec_pmic)
> >  {
> >  	const struct regmap_irq_chip *irq_chip, *chained_irq_chip;
> >  	struct regmap_irq_chip_data *irq_data;
> > @@ -302,27 +304,28 @@ static int sec_irq_init_s2mpg1x(struct sec_pmic_dev *sec_pmic)
> >  		chained_pirq = S2MPG10_COMMON_IRQ_PMIC;
> >  		break;
> >  	default:
> > -		return dev_err_probe(sec_pmic->dev, -EINVAL, "Unsupported device type %d\n",
> > -				     sec_pmic->device_type);
> > +		return dev_err_ptr_probe(sec_pmic->dev, -EINVAL, "Unsupported device type %d\n",
> > +					 sec_pmic->device_type);
> >  	};
> >  
> >  	regmap_common = dev_get_regmap(sec_pmic->dev, "common");
> >  	if (!regmap_common)
> > -		return dev_err_probe(sec_pmic->dev, -EINVAL, "No 'common' regmap %d\n",
> > -				     sec_pmic->device_type);
> > +		return dev_err_ptr_probe(sec_pmic->dev, -EINVAL, "No 'common' regmap %d\n",
> > +					 sec_pmic->device_type);
> >  
> >  	ret = devm_regmap_add_irq_chip(sec_pmic->dev, regmap_common, sec_pmic->irq, IRQF_ONESHOT, 0,
> >  				       irq_chip, &irq_data);
> >  	if (ret)
> > -		return dev_err_probe(sec_pmic->dev, ret, "Failed to add %s IRQ chip\n",
> > -				     irq_chip->name);
> > +		return dev_err_ptr_probe(sec_pmic->dev, ret, "Failed to add %s IRQ chip\n",
> > +					 irq_chip->name);
> >  
> >  	return s2mpg1x_add_chained_irq_chip(sec_pmic->dev, sec_pmic->regmap_pmic, chained_pirq,
> > -					    irq_data, chained_irq_chip, &sec_pmic->irq_data);
> > +					    irq_data, chained_irq_chip);
> 
> That's a shame.
> 
> By keeping irq_data, you could have cleaned-up a bunch of these ugly
> calls by simply passing around sec_pmic or better yet dev (then extract
> sec_pmic from there).
> 
> Thus:
> 
>     return s2mpg1x_add_chained_irq_chip(sec_pmic->dev, sec_pmic->regmap_pmic, chained_pirq,
>                                         irq_data, chained_irq_chip, &sec_pmic->irq_data);
>                                         irq_data, chained_irq_chip);
> 
> Becomes:
> 
>     return s2mpg1x_add_chained_irq_chip(dev, chained_pirq, irq_data, chained_irq_chip);

s2mpg1x_add_chained_irq_chip() was modelled to be consistent with other
drivers doing a similar setup:
    drivers/mfd/intel_soc_pmic_bxtwc.c
    drivers/mfd/max77759.c

Maybe they're not good examples, but then maybe they also should be changed,
to ensure people don't copy from them.

As-is, it can easily be extended for additional chained chips, as the relevant
arguments are parameters and it can be used as a template for the benefit of
other (new) drivers (writers).

It slightly diverged from above two drivers in v2 since you requested for it
to 'return' 'struct regmap_irq_chip_data *' instead of having 
'struct regmap_irq_chip_data **' an additional argument in v1, though.

With your proposed change it won't be able to serve as example code as
easily. I see benefit in having similar code for similar setup. Anyway,
I'll change it again.


Cheers,
Andre'

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ