From: Lukas Wunner <lukas@wunner.de>
To: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>,
Felipe Balbi <balbi@kernel.org>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Sakari Ailus <sakari.ailus@linux.intel.com>,
linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org,
linux-acpi@vger.kernel.org
Subject: Re: [PATCHv2 1/3] software node: Power management operations for software nodes
Date: Fri, 25 Mar 2022 17:42:55 +0100 [thread overview]
Message-ID: <20220325164255.GA12710@wunner.de> (raw)
In-Reply-To: <20201029105941.63410-2-heikki.krogerus@linux.intel.com>
Hi Heikki,
saw this linked in your WSR and felt compelled to reply... ;)
On Thu, Oct 29, 2020 at 01:59:39PM +0300, Heikki Krogerus wrote:
> +static int software_node_runtime_suspend(struct device *dev)
> +{
> + struct swnode_pm_domain *domain = to_swnode_pm_domain(dev->pm_domain);
> + struct swnode *swnode = dev_to_swnode(dev);
> + int ret;
> +
> + if (domain->primary && domain->primary->ops.runtime_suspend)
> + ret = domain->primary->ops.runtime_suspend(dev);
> + else if (dev->type && dev->type->pm && dev->type->pm->runtime_suspend)
> + ret = dev->type->pm->runtime_suspend(dev);
> + else if (dev->class && dev->class->pm && dev->class->pm->runtime_suspend)
> + ret = dev->class->pm->runtime_suspend(dev);
> + else if (dev->bus && dev->bus->pm && dev->bus->pm->runtime_suspend)
> + ret = dev->bus->pm->runtime_suspend(dev);
> + else
> + ret = pm_generic_runtime_suspend(dev);
This if/else ladder seems to be duplicated for every single PM callback
in this patch.
Code size can be reduced significantly if you use offsetof() to determine
the offset of the given callback in struct pm_ops, then pass that offset
to a helper which contains the above-quoted if/else ladder and retrieves
the callback. Finally invoke the callback you've just retrieved.
That way you only need the if/else ladder once in your patch.
For an example, see pcie_port_device_iter() and its callers
pcie_port_device_suspend() and so on:
https://elixir.bootlin.com/linux/latest/source/drivers/pci/pcie/portdrv_core.c#L372
Thanks,
Lukas
next prev parent reply other threads:[~2022-03-25 16:43 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-29 10:59 [PATCHv2 0/3] PM operations for software nodes Heikki Krogerus
2020-10-29 10:59 ` [PATCHv2 1/3] software node: Power management " Heikki Krogerus
2020-10-29 11:13 ` Sakari Ailus
2020-10-29 11:51 ` Heikki Krogerus
2020-10-29 12:17 ` Andy Shevchenko
2020-10-29 13:01 ` Sakari Ailus
2020-10-29 17:10 ` Rafael J. Wysocki
2020-10-30 10:27 ` Heikki Krogerus
2022-03-25 16:42 ` Lukas Wunner [this message]
2022-03-28 8:15 ` Heikki Krogerus
2020-10-29 10:59 ` [PATCHv2 2/3] software node: Introduce device_add_software_node() Heikki Krogerus
2020-10-29 10:59 ` [PATCHv2 3/3] usb: dwc3: pci: Register a software node for the dwc3 platform device Heikki Krogerus
2020-10-29 12:18 ` [PATCHv2 0/3] PM operations for software nodes Andy Shevchenko
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=20220325164255.GA12710@wunner.de \
--to=lukas@wunner.de \
--cc=andriy.shevchenko@linux.intel.com \
--cc=balbi@kernel.org \
--cc=heikki.krogerus@linux.intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=rjw@rjwysocki.net \
--cc=sakari.ailus@linux.intel.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox