[<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