All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lee Jones <lee@kernel.org>
To: Bartosz Golaszewski <brgl@kernel.org>
Cc: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>,
	Sebastian Reichel <sre@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Lorenzo Pieralisi <lpieralisi@kernel.org>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	Daniel Lezcano <daniel.lezcano@kernel.org>,
	Christian Loehle <christian.loehle@arm.com>,
	Ulf Hansson <ulfh@kernel.org>, Rob Herring <robh@kernel.org>,
	Krzysztof Kozlowski <krzk+dt@kernel.org>,
	Conor Dooley <conor+dt@kernel.org>,
	Bjorn Andersson <andersson@kernel.org>,
	Konrad Dybcio <konradybcio@kernel.org>,
	Arnd Bergmann <arnd@arndb.de>,
	Souvik Chakravarty <Souvik.Chakravarty@arm.com>,
	Andy Yan <andy.yan@rock-chips.com>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	John Stultz <john.stultz@linaro.org>,
	Moritz Fischer <moritz.fischer@ettus.com>,
	Sudeep Holla <sudeep.holla@kernel.org>,
	linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-msm@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org,
	Florian Fainelli <florian.fainelli@broadcom.com>,
	Krzysztof Kozlowski <krzk@kernel.org>,
	Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>,
	Mukesh Ojha <mukesh.ojha@oss.qualcomm.com>,
	Andre Draszik <andre.draszik@linaro.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Kathiravan Thirumoorthy
	<kathiravan.thirumoorthy@oss.qualcomm.com>,
	Srinivas Kandagatla <srini@kernel.org>,
	Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Subject: Re: [PATCH v22 08/13] mfd: core: Add firmware-node support to MFD cells
Date: Thu, 21 May 2026 14:24:19 +0100	[thread overview]
Message-ID: <20260521132419.GA3591266@google.com> (raw)
In-Reply-To: <CAMRc=MfqaCjiALZyVBHQs=Taft1M9xmNTFvQHWPrd5PgcTfJDQ@mail.gmail.com>

On Thu, 21 May 2026, Bartosz Golaszewski wrote:

> On Thu, May 21, 2026 at 1:26 PM Lee Jones <lee@kernel.org> wrote:
> >
> > On Thu, 14 May 2026, Shivendra Pratap wrote:
> >
> > > MFD core has no way to register a child device using an explicit firmware
> > > node. This prevents drivers from registering child nodes when those nodes
> > > do not define a compatible string. One such example is the PSCI
> > > "reboot-mode" node, which omits a compatible string as it describes
> > > boot-states provided by the underlying firmware.
> > >
> > > Extend struct mfd_cell with a callback that allows drivers to provide an
> > > explicit firmware node. The node is added to the MFD child device during
> > > registration when none is assigned by device tree, ACPI, or software
> > > matching.
> > >
> > > Suggested-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
> > > Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
> > > ---
> > >  drivers/mfd/mfd-core.c   | 30 ++++++++++++++++++++++++++++++
> > >  include/linux/mfd/core.h | 14 ++++++++++++++
> > >  2 files changed, 44 insertions(+)
> > >
> > > diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c
> > > index 7aa32b90cf1eb7fa0a05bf3dc506e60a262c9850..cc2a2a924d6d3044e29a9f864b536ee325ed797b 100644
> > > --- a/drivers/mfd/mfd-core.c
> > > +++ b/drivers/mfd/mfd-core.c
> > > @@ -10,6 +10,7 @@
> > >  #include <linux/kernel.h>
> > >  #include <linux/platform_device.h>
> > >  #include <linux/acpi.h>
> > > +#include <linux/fwnode.h>
> > >  #include <linux/list.h>
> > >  #include <linux/property.h>
> > >  #include <linux/mfd/core.h>
> > > @@ -148,6 +149,11 @@ static int mfd_match_of_node_to_dev(struct platform_device *pdev,
> > >       return 0;
> > >  }
> > >
> > > +static void mfd_child_fwnode_put(void *data)
> > > +{
> > > +     fwnode_handle_put(data);
> > > +}
> > > +
> > >  static int mfd_add_device(struct device *parent, int id,
> > >                         const struct mfd_cell *cell,
> > >                         struct resource *mem_base,
> > > @@ -156,6 +162,7 @@ static int mfd_add_device(struct device *parent, int id,
> > >       struct resource *res;
> > >       struct platform_device *pdev;
> > >       struct mfd_of_node_entry *of_entry, *tmp;
> > > +     struct fwnode_handle *fwnode;
> > >       bool disabled = false;
> > >       int ret = -ENOMEM;
> > >       int platform_id;
> > > @@ -224,6 +231,29 @@ static int mfd_add_device(struct device *parent, int id,
> > >
> > >       mfd_acpi_add_device(cell, pdev);
> > >
> > > +     if (!pdev->dev.fwnode && cell->get_child_fwnode) {
> > > +             fwnode = cell->get_child_fwnode(parent);
> > > +             if (fwnode) {
> > > +                     device_set_node(&pdev->dev, fwnode);
> > > +
> > > +                     /*
> > > +                      * platform_device_release() drops only of_node refs.
> > > +                      * Track non-OF fwnodes explicitly so they are put on
> > > +                      * all teardown paths.
> > > +                      */
> > > +                     if (!to_of_node(fwnode)) {
> > > +                             ret = devm_add_action(&pdev->dev,
> > > +                                                   mfd_child_fwnode_put,
> > > +                                                   fwnode);
> > > +                             if (ret) {
> > > +                                     device_set_node(&pdev->dev, NULL);
> > > +                                     fwnode_handle_put(fwnode);
> > > +                                     goto fail_of_entry;
> > > +                             }
> > > +                     }
> > > +             }
> > > +     }
> >
> > mfd_add_device() is getting very busy now with support for all of these
> > different registration APIs.  Suggest that we start breaking them out.
> >
> > > +
> > >       if (cell->pdata_size) {
> > >               ret = platform_device_add_data(pdev,
> > >                                       cell->platform_data, cell->pdata_size);
> > > diff --git a/include/linux/mfd/core.h b/include/linux/mfd/core.h
> > > index faeea7abd688f223fb0b31cde0a9b69dfe2a61ff..abfc26c057d6ee46947ba2b6f2e99f420e74b127 100644
> > > --- a/include/linux/mfd/core.h
> > > +++ b/include/linux/mfd/core.h
> > > @@ -50,6 +50,7 @@
> > >  #define MFD_DEP_LEVEL_HIGH 1
> > >
> > >  struct irq_domain;
> > > +struct fwnode_handle;
> > >  struct software_node;
> > >
> > >  /* Matches ACPI PNP id, either _HID or _CID, or ACPI _ADR */
> > > @@ -80,6 +81,19 @@ struct mfd_cell {
> > >
> > >       /* Software node for the device. */
> > >       const struct software_node *swnode;
> > > +     /*
> > > +      * Callback to return an explicit firmware node.
> > > +      * @parent: MFD parent device passed to mfd_add_devices().
> > > +      *
> > > +      * Called only if OF/ACPI matching did not assign a fwnode.
> > > +      * Ownership of the returned reference is transferred to MFD core.
> > > +      *
> > > +      * Return a referenced fwnode or NULL if none is available.
> > > +      *
> > > +      * mfd_cell must be zero-initialized or get_child_fwnode must be NULL
> > > +      * when unused.
> > > +      */
> > > +     struct fwnode_handle *(*get_child_fwnode)(struct device *parent);
> >
> > I'm very much against pointers to functions if they can be avoided.  Why
> > does fwnode need this and none of the other APIs do?
> >
> 
> I suggested it because of its flexibility. The alternative I had in
> mind is something like a new field in mfd_cell:
> 
>     const char *cell_node_name;
> 
> Which - if set - would tell MFD to look up an fwnode that's a child of
> the parent device's node by name - as it may not have a compatible.

Remind me why the chlid device can't look-up its own fwnode?

-- 
Lee Jones

  reply	other threads:[~2026-05-21 13:24 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-14 14:25 [PATCH v22 00/13] Implement PSCI reboot mode driver for PSCI resets Shivendra Pratap
2026-05-14 14:25 ` [PATCH v22 01/13] power: reset: reboot-mode: Remove devres based allocations Shivendra Pratap
2026-05-14 14:25 ` [PATCH v22 02/13] power: reset: reboot-mode: Add support for 64 bit magic Shivendra Pratap
2026-05-14 20:15   ` sashiko-bot
2026-05-14 14:25 ` [PATCH v22 03/13] power: reset: reboot-mode: Add support for predefined reboot modes Shivendra Pratap
2026-05-14 21:09   ` sashiko-bot
2026-05-14 14:25 ` [PATCH v22 04/13] firmware: psci: Introduce command-based resets Shivendra Pratap
2026-05-14 21:23   ` sashiko-bot
2026-05-14 14:25 ` [PATCH v22 05/13] mfd: psci-mfd: Add PSCI MFD driver for cpuidle-psci-domain cell Shivendra Pratap
2026-05-14 14:25 ` [PATCH v22 06/13] dt-bindings: arm: Document reboot mode magic Shivendra Pratap
2026-05-14 14:25 ` [PATCH v22 07/13] power: reset: Add psci-reboot-mode driver Shivendra Pratap
2026-05-14 22:49   ` sashiko-bot
2026-05-18  8:58   ` Bartosz Golaszewski
2026-05-18 16:45     ` Shivendra Pratap
2026-05-14 14:25 ` [PATCH v22 08/13] mfd: core: Add firmware-node support to MFD cells Shivendra Pratap
2026-05-14 23:19   ` sashiko-bot
2026-05-18  8:57   ` Bartosz Golaszewski
2026-05-18 16:41     ` Shivendra Pratap
2026-05-20 17:51       ` Shivendra Pratap
2026-05-21 11:26   ` Lee Jones
2026-05-21 12:29     ` Bartosz Golaszewski
2026-05-21 13:24       ` Lee Jones [this message]
2026-05-21 13:36         ` Bartosz Golaszewski
2026-05-21 16:27           ` Lee Jones
2026-05-22  9:08             ` Bartosz Golaszewski
2026-05-25  9:34               ` Shivendra Pratap
2026-06-03 18:51                 ` Shivendra Pratap
2026-05-14 14:25 ` [PATCH v22 09/13] mfd: psci-mfd: Add psci-reboot-mode child cell Shivendra Pratap
2026-05-18  8:53   ` Bartosz Golaszewski
2026-05-14 14:25 ` [PATCH v22 10/13] arm64: dts: qcom: Add psci reboot-modes for kodiak boards Shivendra Pratap
2026-05-14 14:25 ` [PATCH v22 11/13] arm64: dts: qcom: Add psci reboot-modes for lemans boards Shivendra Pratap
2026-05-14 14:25 ` [PATCH v22 12/13] arm64: dts: qcom: Add psci reboot-modes for monaco boards Shivendra Pratap
2026-05-15  0:24   ` sashiko-bot
2026-05-14 14:25 ` [PATCH v22 13/13] arm64: dts: qcom: Add psci reboot-modes for talos boards Shivendra Pratap
2026-05-29 13:30 ` [PATCH v22 00/13] Implement PSCI reboot mode driver for PSCI resets Shivendra Pratap

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260521132419.GA3591266@google.com \
    --to=lee@kernel.org \
    --cc=Souvik.Chakravarty@arm.com \
    --cc=andersson@kernel.org \
    --cc=andre.draszik@linaro.org \
    --cc=andy.yan@rock-chips.com \
    --cc=arnd@arndb.de \
    --cc=bartosz.golaszewski@oss.qualcomm.com \
    --cc=brgl@kernel.org \
    --cc=christian.loehle@arm.com \
    --cc=conor+dt@kernel.org \
    --cc=daniel.lezcano@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=dmitry.baryshkov@oss.qualcomm.com \
    --cc=florian.fainelli@broadcom.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=john.stultz@linaro.org \
    --cc=kathiravan.thirumoorthy@oss.qualcomm.com \
    --cc=konradybcio@kernel.org \
    --cc=krzk+dt@kernel.org \
    --cc=krzk@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=lpieralisi@kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=matthias.bgg@gmail.com \
    --cc=moritz.fischer@ettus.com \
    --cc=mukesh.ojha@oss.qualcomm.com \
    --cc=rafael@kernel.org \
    --cc=robh@kernel.org \
    --cc=shivendra.pratap@oss.qualcomm.com \
    --cc=sre@kernel.org \
    --cc=srini@kernel.org \
    --cc=sudeep.holla@kernel.org \
    --cc=ulfh@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.