linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@rjwysocki.net>
To: Linux ACPI <linux-acpi@vger.kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
	Linux PM <linux-pm@vger.kernel.org>,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Mika Westerberg <mika.westerberg@linux.intel.com>,
	Hans de Goede <hdegoede@redhat.com>,
	Sakari Ailus <sakari.ailus@linux.intel.com>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Ulf Hansson <ulf.hansson@linaro.org>,
	linux-mmc@vger.kernel.org
Subject: [PATCH v2 15/16] ACPI / MMC: PM: Unify fixing up device power
Date: Mon, 13 Jun 2022 20:36:06 +0200	[thread overview]
Message-ID: <3004712.CbtlEUcBR6@kreacher> (raw)
In-Reply-To: <2653857.mvXUDI8C0e@kreacher>

From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

Introduce acpi_device_fix_up_power_extended() for fixing up power of
a device having an ACPI companion in a manner that takes the device's
children into account and make the MMC code use it in two places
instead of walking the list of the device ACPI companion's children
directly.

This will help to eliminate the children list head from struct
acpi_device as it is redundant and it is used in questionable ways
in some places (in particular, locking is needed for walking the
list pointed to it safely, but it is often missing).

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Ulf Hansson <ulf.hansson@linaro.org>
---

v1 -> v2:
   * Add R-by from Andy and ACKs from Adrian and Ulf.

---
 drivers/acpi/device_pm.c          |   22 ++++++++++++++++++++++
 drivers/mmc/host/sdhci-acpi.c     |    7 ++-----
 drivers/mmc/host/sdhci-pci-core.c |   11 +++--------
 include/acpi/acpi_bus.h           |    1 +
 4 files changed, 28 insertions(+), 13 deletions(-)

Index: linux-pm/drivers/mmc/host/sdhci-acpi.c
===================================================================
--- linux-pm.orig/drivers/mmc/host/sdhci-acpi.c
+++ linux-pm/drivers/mmc/host/sdhci-acpi.c
@@ -775,8 +775,8 @@ static int sdhci_acpi_probe(struct platf
 {
 	struct device *dev = &pdev->dev;
 	const struct sdhci_acpi_slot *slot;
-	struct acpi_device *device, *child;
 	const struct dmi_system_id *id;
+	struct acpi_device *device;
 	struct sdhci_acpi_host *c;
 	struct sdhci_host *host;
 	struct resource *iomem;
@@ -796,10 +796,7 @@ static int sdhci_acpi_probe(struct platf
 	slot = sdhci_acpi_get_slot(device);
 
 	/* Power on the SDHCI controller and its children */
-	acpi_device_fix_up_power(device);
-	list_for_each_entry(child, &device->children, node)
-		if (child->status.present && child->status.enabled)
-			acpi_device_fix_up_power(child);
+	acpi_device_fix_up_power_extended(device);
 
 	if (sdhci_acpi_byt_defer(dev))
 		return -EPROBE_DEFER;
Index: linux-pm/drivers/acpi/device_pm.c
===================================================================
--- linux-pm.orig/drivers/acpi/device_pm.c
+++ linux-pm/drivers/acpi/device_pm.c
@@ -369,6 +369,28 @@ int acpi_device_fix_up_power(struct acpi
 }
 EXPORT_SYMBOL_GPL(acpi_device_fix_up_power);
 
+static int fix_up_power_if_applicable(struct acpi_device *adev, void *not_used)
+{
+	if (adev->status.present && adev->status.enabled)
+		acpi_device_fix_up_power(adev);
+
+	return 0;
+}
+
+/**
+ * acpi_device_fix_up_power_extended - Force device and its children into D0.
+ * @adev: Parent device object whose power state is to be fixed up.
+ *
+ * Call acpi_device_fix_up_power() for @adev and its children so long as they
+ * are reported as present and enabled.
+ */
+void acpi_device_fix_up_power_extended(struct acpi_device *adev)
+{
+	acpi_device_fix_up_power(adev);
+	acpi_dev_for_each_child(adev, fix_up_power_if_applicable, NULL);
+}
+EXPORT_SYMBOL_GPL(acpi_device_fix_up_power_extended);
+
 int acpi_device_update_power(struct acpi_device *device, int *state_p)
 {
 	int state;
Index: linux-pm/include/acpi/acpi_bus.h
===================================================================
--- linux-pm.orig/include/acpi/acpi_bus.h
+++ linux-pm/include/acpi/acpi_bus.h
@@ -524,6 +524,7 @@ const char *acpi_power_state_string(int
 int acpi_device_set_power(struct acpi_device *device, int state);
 int acpi_bus_init_power(struct acpi_device *device);
 int acpi_device_fix_up_power(struct acpi_device *device);
+void acpi_device_fix_up_power_extended(struct acpi_device *adev);
 int acpi_bus_update_power(acpi_handle handle, int *state_p);
 int acpi_device_update_power(struct acpi_device *device, int *state_p);
 bool acpi_bus_power_manageable(acpi_handle handle);
Index: linux-pm/drivers/mmc/host/sdhci-pci-core.c
===================================================================
--- linux-pm.orig/drivers/mmc/host/sdhci-pci-core.c
+++ linux-pm/drivers/mmc/host/sdhci-pci-core.c
@@ -1240,16 +1240,11 @@ static const struct sdhci_pci_fixes sdhc
 #ifdef CONFIG_ACPI
 static void intel_mrfld_mmc_fix_up_power_slot(struct sdhci_pci_slot *slot)
 {
-	struct acpi_device *device, *child;
+	struct acpi_device *device;
 
 	device = ACPI_COMPANION(&slot->chip->pdev->dev);
-	if (!device)
-		return;
-
-	acpi_device_fix_up_power(device);
-	list_for_each_entry(child, &device->children, node)
-		if (child->status.present && child->status.enabled)
-			acpi_device_fix_up_power(child);
+	if (device)
+		acpi_device_fix_up_power_extended(device);
 }
 #else
 static inline void intel_mrfld_mmc_fix_up_power_slot(struct sdhci_pci_slot *slot) {}




  parent reply	other threads:[~2022-06-13 20:06 UTC|newest]

Thread overview: 77+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-09 13:44 [PATCH v1 00/16] ACPI: Get rid of the list of children in struct acpi_device Rafael J. Wysocki
2022-06-09 13:47 ` [PATCH v1 01/16] ACPI: glue: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-09 13:49 ` [PATCH v1 02/16] ACPI: glue: Introduce acpi_dev_has_children() Rafael J. Wysocki
2022-06-09 13:54 ` [PATCH v1 03/16] ACPI: glue: Introduce acpi_find_child_by_adr() Rafael J. Wysocki
2022-06-09 13:54 ` [PATCH v1 04/16] thunderbolt: ACPI: Use acpi_find_child_by_adr() Rafael J. Wysocki
2022-06-09 15:25   ` Andy Shevchenko
2022-06-09 15:36     ` Rafael J. Wysocki
2022-06-10  6:46   ` Heikki Krogerus
2022-06-10 13:12     ` Rafael J. Wysocki
2022-06-09 13:56 ` [PATCH v1 05/16] USB: " Rafael J. Wysocki
2022-06-09 15:27   ` Andy Shevchenko
2022-06-09 15:37     ` Rafael J. Wysocki
2022-06-10  6:47   ` Heikki Krogerus
2022-06-10 13:14     ` Rafael J. Wysocki
2022-06-09 13:58 ` [PATCH v1 06/16] ACPI: container: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-09 15:29   ` Andy Shevchenko
2022-06-09 15:58     ` Rafael J. Wysocki
2022-06-09 13:59 ` [PATCH v1 07/16] ACPI: property: Use acpi_dev_for_each_child() for child lookup Rafael J. Wysocki
2022-06-09 14:02 ` [PATCH v1 08/16] ACPI: bus: Export acpi_dev_for_each_child() to modules Rafael J. Wysocki
2022-06-09 14:03 ` [PATCH v1 09/16] ACPI: video: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-09 15:40   ` Andy Shevchenko
2022-06-09 14:06 ` [PATCH v1 10/16] ACPI: bus: Introduce acpi_dev_for_each_child_reverse() Rafael J. Wysocki
2022-06-09 15:40   ` Andy Shevchenko
2022-06-09 14:07 ` [PATCH v1 11/16] ACPI: scan: Walk ACPI device's children using driver core Rafael J. Wysocki
2022-06-09 14:09 ` [PATCH v1 12/16] platform/x86/thinkpad_acpi: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-09 15:48   ` Andy Shevchenko
2022-06-09 15:56     ` Rafael J. Wysocki
2022-06-09 14:12 ` [PATCH v1 13/16] mfd: core: " Rafael J. Wysocki
2022-06-09 14:16 ` [PATCH v1 14/16] soundwire: " Rafael J. Wysocki
2022-06-09 15:22   ` Pierre-Louis Bossart
2022-06-09 16:13     ` Rafael J. Wysocki
2022-06-09 16:21       ` Pierre-Louis Bossart
2022-06-09 17:35         ` Rafael J. Wysocki
2022-06-09 19:08           ` Pierre-Louis Bossart
2022-06-09 14:18 ` [PATCH v1 15/16] ACPI / MMC: PM: Unify fixing up device power Rafael J. Wysocki
2022-06-09 15:33   ` Adrian Hunter
2022-06-10 12:16   ` Ulf Hansson
2022-06-09 14:19 ` [PATCH v1 16/16] ACPI: bus: Drop unused list heads from struct acpi_device Rafael J. Wysocki
2022-06-09 15:12 ` [PATCH v1 00/16] ACPI: Get rid of the list of children in " Andy Shevchenko
2022-06-09 20:24   ` Frank Rowand
2022-06-09 15:56 ` Andy Shevchenko
2022-06-09 15:59   ` Rafael J. Wysocki
2022-06-13 18:03 ` [PATCH v2 " Rafael J. Wysocki
2022-06-13 18:05   ` [PATCH v2 01/16] ACPI: glue: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-13 18:06   ` [PATCH v2 02/16] ACPI: glue: Introduce acpi_dev_has_children() Rafael J. Wysocki
2022-06-13 18:10   ` [PATCH v2 03/16] ACPI: glue: Introduce acpi_find_child_by_adr() Rafael J. Wysocki
2022-06-13 18:11   ` [PATCH v2 04/16] thunderbolt: ACPI: Replace tb_acpi_find_port() with acpi_find_child_by_adr() Rafael J. Wysocki
2022-06-13 18:55     ` Andy Shevchenko
2022-06-14  6:07     ` Mika Westerberg
2022-06-14 18:25       ` Rafael J. Wysocki
2022-06-15  6:27         ` Mika Westerberg
2022-06-15 19:52           ` Rafael J. Wysocki
2022-06-14  7:36     ` Heikki Krogerus
2022-06-13 18:15   ` [PATCH v2 06/16] ACPI: container: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-13 18:16   ` [PATCH v2 07/16] ACPI: property: Use acpi_dev_for_each_child() for child lookup Rafael J. Wysocki
2022-06-13 18:26   ` [PATCH v2 08/16] ACPI: bus: Export acpi_dev_for_each_child() to modules Rafael J. Wysocki
2022-06-13 18:26   ` [PATCH v2 09/16] ACPI: video: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-13 18:26   ` [PATCH v2 10/16] ACPI: bus: Introduce acpi_dev_for_each_child_reverse() Rafael J. Wysocki
2022-06-13 18:27   ` [PATCH v2 11/16] ACPI: scan: Walk ACPI device's children using driver core Rafael J. Wysocki
2022-06-13 18:30   ` [PATCH v2 12/16] platform/x86/thinkpad_acpi: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-13 18:54     ` Andy Shevchenko
2022-06-13 20:50     ` Hans de Goede
2022-06-13 18:31   ` [PATCH v2 13/16] mfd: core: " Rafael J. Wysocki
2022-06-15 22:39     ` Lee Jones
2022-06-16 17:31       ` Rafael J. Wysocki
2022-06-27 11:38     ` [GIT PULL] Immutable branch between MFD and ACPI due for the v5.20 merge window Lee Jones
2022-06-27 12:15       ` Rafael J. Wysocki
2022-06-13 18:35   ` [PATCH v2 14/16] soundwire: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-23  8:10     ` Vinod Koul
2022-06-23 12:29       ` Rafael J. Wysocki
2022-06-23 12:41         ` Vinod Koul
2022-06-23 13:26           ` Rafael J. Wysocki
2022-06-13 18:36   ` Rafael J. Wysocki [this message]
2022-06-13 18:38   ` [PATCH v2 16/16] ACPI: bus: Drop unused list heads from struct acpi_device Rafael J. Wysocki
2022-06-13 18:39   ` [PATCH v2 05/16] USB: ACPI: Replace usb_acpi_find_port() with acpi_find_child_by_adr() Rafael J. Wysocki
2022-06-13 18:53     ` Andy Shevchenko
2022-06-14  7:37     ` Heikki Krogerus

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=3004712.CbtlEUcBR6@kreacher \
    --to=rjw@rjwysocki.net \
    --cc=adrian.hunter@intel.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=hdegoede@redhat.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mika.westerberg@linux.intel.com \
    --cc=sakari.ailus@linux.intel.com \
    --cc=ulf.hansson@linaro.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).