stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v6 0/1] i2c: Restore power status of device if probe fails
@ 2022-11-14 12:20 Ricardo Ribalda
  2022-11-14 12:20 ` [PATCH v6 1/1] i2c: Restore initial power state " Ricardo Ribalda
  0 siblings, 1 reply; 4+ messages in thread
From: Ricardo Ribalda @ 2022-11-14 12:20 UTC (permalink / raw)
  To: Rafael J. Wysocki, Tomasz Figa, Mika Westerberg, Wolfram Sang
  Cc: Hidenori Kobayashi, stable, Sergey Senozhatsky, linux-kernel,
	Hidenori Kobayashi, Sakari Ailus, Ricardo Ribalda, linux-i2c

We have discovered that some power lines were always on even if the devices
on that power line was not used.

This happens because we failed to probe a device on the i2c bus, and the
ACPI Power Resource were never turned off.

This patch tries to fix this issue.

To: Mika Westerberg <mika.westerberg@linux.intel.com>
To: Wolfram Sang <wsa@kernel.org>
To: Sakari Ailus <sakari.ailus@linux.intel.com>
To: Tomasz Figa <tfiga@chromium.org>
To: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
Cc: Hidenori Kobayashi <hidenorik@google.com>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: linux-i2c@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: stable@vger.kernel.org
Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
---
Changes in v6:
- Add Reviewed-by: Hidenori (Thanks!).
- Set device always off at remove.
- Link to v5: https://lore.kernel.org/r/20221109-i2c-waive-v5-0-2839667f8f6a@chromium.org

Changes in v5:
- Add Cc: stable
- Add Reviewed-by Sakary (Thanks!).
- Renamed turn-off as power-off, in the name of consistency (Thanks Sergey!)
- Link to v4: https://lore.kernel.org/r/20221109-i2c-waive-v4-0-e4496462833b@chromium.org

Changes in v4:
- Rename full_power to do_power_on.
- Link to v3: https://lore.kernel.org/r/20221109-i2c-waive-v3-0-d8651cb4b88d@chromium.org

Changes in v3:
- Introduce full_power variable to make more clear what we are doing.
- Link to v2: https://lore.kernel.org/r/20221109-i2c-waive-v2-0-07550bf2dacc@chromium.org

Changes in v2:
- Cover also device remove
- Link to v1: https://lore.kernel.org/r/20221109-i2c-waive-v1-0-ed70a99b990d@chromium.org

---
Ricardo Ribalda (1):
      i2c: Restore initial power state if probe fails

 drivers/i2c/i2c-core-base.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)
---
base-commit: f141df371335645ce29a87d9683a3f79fba7fd67
change-id: 20221109-i2c-waive-ae97fea1f1b5

Best regards,
-- 
Ricardo Ribalda <ribalda@chromium.org>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v6 1/1] i2c: Restore initial power state if probe fails
  2022-11-14 12:20 [PATCH v6 0/1] i2c: Restore power status of device if probe fails Ricardo Ribalda
@ 2022-11-14 12:20 ` Ricardo Ribalda
  2022-11-14 12:42   ` Mika Westerberg
  2022-11-14 19:47   ` Wolfram Sang
  0 siblings, 2 replies; 4+ messages in thread
From: Ricardo Ribalda @ 2022-11-14 12:20 UTC (permalink / raw)
  To: Rafael J. Wysocki, Tomasz Figa, Mika Westerberg, Wolfram Sang
  Cc: Hidenori Kobayashi, stable, Sergey Senozhatsky, linux-kernel,
	Hidenori Kobayashi, Sakari Ailus, Ricardo Ribalda, linux-i2c

A driver that supports I2C_DRV_ACPI_WAIVE_D0_PROBE is not expected to
power off a device that it has not powered on previously.

For devices operating in "full_power" mode, the first call to
`i2c_acpi_waive_d0_probe` will return 0, which means that the device
will be turned on with `dev_pm_domain_attach`.

If probe fails the second call to `i2c_acpi_waive_d0_probe` will
return 1, which means that the device will not be turned off.
This is, it will be left in a different power state. Lets fix it.

Reviewed-by: Hidenori Kobayashi <hidenorik@chromium.org>
Reviewed-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Cc: stable@vger.kernel.org
Fixes: b18c1ad685d9 ("i2c: Allow an ACPI driver to manage the device's power state during probe")
Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>

diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
index b4edf10e8fd0..7539b0740351 100644
--- a/drivers/i2c/i2c-core-base.c
+++ b/drivers/i2c/i2c-core-base.c
@@ -467,6 +467,7 @@ static int i2c_device_probe(struct device *dev)
 {
 	struct i2c_client	*client = i2c_verify_client(dev);
 	struct i2c_driver	*driver;
+	bool do_power_on;
 	int status;
 
 	if (!client)
@@ -545,8 +546,8 @@ static int i2c_device_probe(struct device *dev)
 	if (status < 0)
 		goto err_clear_wakeup_irq;
 
-	status = dev_pm_domain_attach(&client->dev,
-				      !i2c_acpi_waive_d0_probe(dev));
+	do_power_on = !i2c_acpi_waive_d0_probe(dev);
+	status = dev_pm_domain_attach(&client->dev, do_power_on);
 	if (status)
 		goto err_clear_wakeup_irq;
 
@@ -585,7 +586,7 @@ static int i2c_device_probe(struct device *dev)
 err_release_driver_resources:
 	devres_release_group(&client->dev, client->devres_group_id);
 err_detach_pm_domain:
-	dev_pm_domain_detach(&client->dev, !i2c_acpi_waive_d0_probe(dev));
+	dev_pm_domain_detach(&client->dev, do_power_on);
 err_clear_wakeup_irq:
 	dev_pm_clear_wake_irq(&client->dev);
 	device_init_wakeup(&client->dev, false);
@@ -610,7 +611,7 @@ static void i2c_device_remove(struct device *dev)
 
 	devres_release_group(&client->dev, client->devres_group_id);
 
-	dev_pm_domain_detach(&client->dev, !i2c_acpi_waive_d0_probe(dev));
+	dev_pm_domain_detach(&client->dev, true);
 
 	dev_pm_clear_wake_irq(&client->dev);
 	device_init_wakeup(&client->dev, false);

-- 
b4 0.11.0-dev-d93f8

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v6 1/1] i2c: Restore initial power state if probe fails
  2022-11-14 12:20 ` [PATCH v6 1/1] i2c: Restore initial power state " Ricardo Ribalda
@ 2022-11-14 12:42   ` Mika Westerberg
  2022-11-14 19:47   ` Wolfram Sang
  1 sibling, 0 replies; 4+ messages in thread
From: Mika Westerberg @ 2022-11-14 12:42 UTC (permalink / raw)
  To: Ricardo Ribalda
  Cc: Rafael J. Wysocki, Tomasz Figa, Wolfram Sang, Hidenori Kobayashi,
	stable, Sergey Senozhatsky, linux-kernel, Hidenori Kobayashi,
	Sakari Ailus, linux-i2c

On Mon, Nov 14, 2022 at 01:20:34PM +0100, Ricardo Ribalda wrote:
> A driver that supports I2C_DRV_ACPI_WAIVE_D0_PROBE is not expected to
> power off a device that it has not powered on previously.
> 
> For devices operating in "full_power" mode, the first call to
> `i2c_acpi_waive_d0_probe` will return 0, which means that the device
> will be turned on with `dev_pm_domain_attach`.
> 
> If probe fails the second call to `i2c_acpi_waive_d0_probe` will
> return 1, which means that the device will not be turned off.
> This is, it will be left in a different power state. Lets fix it.
> 
> Reviewed-by: Hidenori Kobayashi <hidenorik@chromium.org>
> Reviewed-by: Sergey Senozhatsky <senozhatsky@chromium.org>
> Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>

Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v6 1/1] i2c: Restore initial power state if probe fails
  2022-11-14 12:20 ` [PATCH v6 1/1] i2c: Restore initial power state " Ricardo Ribalda
  2022-11-14 12:42   ` Mika Westerberg
@ 2022-11-14 19:47   ` Wolfram Sang
  1 sibling, 0 replies; 4+ messages in thread
From: Wolfram Sang @ 2022-11-14 19:47 UTC (permalink / raw)
  To: Ricardo Ribalda
  Cc: Rafael J. Wysocki, Tomasz Figa, Mika Westerberg,
	Hidenori Kobayashi, stable, Sergey Senozhatsky, linux-kernel,
	Hidenori Kobayashi, Sakari Ailus, linux-i2c

[-- Attachment #1: Type: text/plain, Size: 1009 bytes --]

wOn Mon, Nov 14, 2022 at 01:20:34PM +0100, Ricardo Ribalda wrote:
> A driver that supports I2C_DRV_ACPI_WAIVE_D0_PROBE is not expected to
> power off a device that it has not powered on previously.
> 
> For devices operating in "full_power" mode, the first call to
> `i2c_acpi_waive_d0_probe` will return 0, which means that the device
> will be turned on with `dev_pm_domain_attach`.
> 
> If probe fails the second call to `i2c_acpi_waive_d0_probe` will
> return 1, which means that the device will not be turned off.
> This is, it will be left in a different power state. Lets fix it.
> 
> Reviewed-by: Hidenori Kobayashi <hidenorik@chromium.org>
> Reviewed-by: Sergey Senozhatsky <senozhatsky@chromium.org>
> Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> Cc: stable@vger.kernel.org
> Fixes: b18c1ad685d9 ("i2c: Allow an ACPI driver to manage the device's power state during probe")
> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>

Applied to for-current, thanks!


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-11-14 19:48 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-14 12:20 [PATCH v6 0/1] i2c: Restore power status of device if probe fails Ricardo Ribalda
2022-11-14 12:20 ` [PATCH v6 1/1] i2c: Restore initial power state " Ricardo Ribalda
2022-11-14 12:42   ` Mika Westerberg
2022-11-14 19:47   ` Wolfram Sang

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).