mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 0/2] leds: freeze delayed hardware access during suspend
@ 2026-10-16 10:04 Jiale Yao
  2026-10-16 10:04 ` [PATCH 1/2] leds: tps6131x: queue torch refresh work on freezable workqueue Jiale Yao
  2026-10-16 10:04 ` [PATCH 2/2] leds: cr0014114: queue recount " Jiale Yao
  0 siblings, 2 replies; 5+ messages in thread
From: Jiale Yao @ 2026-10-16 10:04 UTC (permalink / raw)
  To: Matthias Fend, Lee Jones, Pavel Machek, linux-leds, linux-kernel
  Cc: Jiale Yao

The TPS6131x torch watchdog refresh and CR0014114 firmware recount
callbacks perform bus transfers from delayed work. Both callbacks use the
non-freezable system workqueue and can run after their I2C or SPI controller
has been suspended.

Queue both callbacks on system_freezable_wq. This freezes their hardware
access before device suspend and resumes it after devices become available
again. Each patch is independent and can be applied separately.

Jiale Yao (2):
  leds: tps6131x: queue torch refresh work on freezable workqueue
  leds: cr0014114: queue recount work on freezable workqueue

 drivers/leds/flash/leds-tps6131x.c | 11 +++++++----
 drivers/leds/leds-cr0014114.c      |  6 ++++--
 2 files changed, 11 insertions(+), 6 deletions(-)

-- 
2.34.1


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

* [PATCH 1/2] leds: tps6131x: queue torch refresh work on freezable workqueue
  2026-10-16 10:04 [PATCH 0/2] leds: freeze delayed hardware access during suspend Jiale Yao
@ 2026-10-16 10:04 ` Jiale Yao
  2026-10-17  7:16   ` jiale yao
  2026-10-16 10:04 ` [PATCH 2/2] leds: cr0014114: queue recount " Jiale Yao
  1 sibling, 1 reply; 5+ messages in thread
From: Jiale Yao @ 2026-10-16 10:04 UTC (permalink / raw)
  To: Matthias Fend, Lee Jones, Pavel Machek, linux-leds, linux-kernel
  Cc: Jiale Yao

The torch watchdog refresh work performs I2C register writes and
reschedules itself every ten seconds while the torch is enabled. Since
schedule_delayed_work() uses the non-freezable system workqueue, the
callback can run after the I2C adapter has been suspended.

Queue the refresh on system_freezable_wq so it is frozen before devices
are suspended and resumed only after they become available again.

Signed-off-by: Jiale Yao <yaojiale02@163.com>
---
 drivers/leds/flash/leds-tps6131x.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/leds/flash/leds-tps6131x.c b/drivers/leds/flash/leds-tps6131x.c
index 5c9a5af5af05..841a6538e75e 100644
--- a/drivers/leds/flash/leds-tps6131x.c
+++ b/drivers/leds/flash/leds-tps6131x.c
@@ -11,6 +11,7 @@
 #include <linux/leds.h>
 #include <linux/module.h>
 #include <linux/regmap.h>
+#include <linux/workqueue.h>
 #include <media/v4l2-flash-led-class.h>
 
 #define TPS6131X_REG_0				0x00
@@ -307,8 +308,9 @@ static void tps6131x_torch_refresh_handler(struct work_struct *work)
 		return;
 	}
 
-	schedule_delayed_work(&tps6131x->torch_refresh_work,
-			      TPS6131X_TORCH_REFRESH_INTERVAL_JIFFIES);
+	queue_delayed_work(system_freezable_wq,
+			   &tps6131x->torch_refresh_work,
+			   TPS6131X_TORCH_REFRESH_INTERVAL_JIFFIES);
 }
 
 static int tps6131x_brightness_set(struct led_classdev *cdev, enum led_brightness brightness)
@@ -367,8 +369,9 @@ static int tps6131x_brightness_set(struct led_classdev *cdev, enum led_brightnes
 	 * To prevent this, the mode must be refreshed within the watchdog timeout.
 	 */
 	if (brightness)
-		schedule_delayed_work(&tps6131x->torch_refresh_work,
-				      TPS6131X_TORCH_REFRESH_INTERVAL_JIFFIES);
+		queue_delayed_work(system_freezable_wq,
+				   &tps6131x->torch_refresh_work,
+				   TPS6131X_TORCH_REFRESH_INTERVAL_JIFFIES);
 
 	return 0;
 }
-- 
2.34.1


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

* [PATCH 2/2] leds: cr0014114: queue recount work on freezable workqueue
  2026-10-16 10:04 [PATCH 0/2] leds: freeze delayed hardware access during suspend Jiale Yao
  2026-10-16 10:04 ` [PATCH 1/2] leds: tps6131x: queue torch refresh work on freezable workqueue Jiale Yao
@ 2026-10-16 10:04 ` Jiale Yao
  2026-10-17  7:18   ` jiale yao
  1 sibling, 1 reply; 5+ messages in thread
From: Jiale Yao @ 2026-10-16 10:04 UTC (permalink / raw)
  To: Lee Jones, Pavel Machek, linux-leds, linux-kernel; +Cc: Jiale Yao

The firmware workaround periodically recounts the LED state by issuing
SPI transfers. Its delayed work runs on the non-freezable system
workqueue and can therefore access the controller after it has been
suspended.

Queue the recount work on system_freezable_wq so hardware access is
deferred until devices have resumed.

Signed-off-by: Jiale Yao <yaojiale02@163.com>
---
 drivers/leds/leds-cr0014114.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/leds/leds-cr0014114.c b/drivers/leds/leds-cr0014114.c
index 3f6931ae0bcc..afe3730e1222 100644
--- a/drivers/leds/leds-cr0014114.c
+++ b/drivers/leds/leds-cr0014114.c
@@ -155,7 +155,8 @@ static void cr0014114_recount_work(struct work_struct *work)
 	if (ret)
 		dev_warn(priv->dev, "sync of LEDs failed %d\n", ret);
 
-	schedule_delayed_work(&priv->work, CR_RECOUNT_DELAY);
+	queue_delayed_work(system_freezable_wq, &priv->work,
+			   CR_RECOUNT_DELAY);
 }
 
 static int cr0014114_set_sync(struct led_classdev *ldev,
@@ -256,7 +257,8 @@ static int cr0014114_probe(struct spi_device *spi)
 		return ret;
 
 	/* setup recount work to workaround buggy firmware */
-	schedule_delayed_work(&priv->work, CR_RECOUNT_DELAY);
+	queue_delayed_work(system_freezable_wq, &priv->work,
+			   CR_RECOUNT_DELAY);
 
 	spi_set_drvdata(spi, priv);
 
-- 
2.34.1


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

* Re:[PATCH 1/2] leds: tps6131x: queue torch refresh work on freezable workqueue
  2026-10-16 10:04 ` [PATCH 1/2] leds: tps6131x: queue torch refresh work on freezable workqueue Jiale Yao
@ 2026-10-17  7:16   ` jiale yao
  0 siblings, 0 replies; 5+ messages in thread
From: jiale yao @ 2026-10-17  7:16 UTC (permalink / raw)
  To: Matthias Fend, Lee Jones, Pavel Machek, linux-leds, linux-kernel

At 2026-10-16 18:04:34, "Jiale Yao" <yaojiale02@163.com> wrote:
>The torch watchdog refresh work performs I2C register writes and
>reschedules itself every ten seconds while the torch is enabled. Since
>schedule_delayed_work() uses the non-freezable system workqueue, the
>callback can run after the I2C adapter has been suspended.
>
>Queue the refresh on system_freezable_wq so it is frozen before devices
>are suspended and resumed only after they become available again.
>

Fixes: b338a2ae9b31 ("leds: tps6131x: Add support for Texas Instruments TPS6131X flash LED driver")

>Signed-off-by: Jiale Yao <yaojiale02@163.com>
>---
> drivers/leds/flash/leds-tps6131x.c | 11 +++++++----
> 1 file changed, 7 insertions(+), 4 deletions(-)
>
>diff --git a/drivers/leds/flash/leds-tps6131x.c b/drivers/leds/flash/leds-tps6131x.c
>index 5c9a5af5af05..841a6538e75e 100644
>--- a/drivers/leds/flash/leds-tps6131x.c
>+++ b/drivers/leds/flash/leds-tps6131x.c
>@@ -11,6 +11,7 @@
> #include <linux/leds.h>
> #include <linux/module.h>
> #include <linux/regmap.h>
>+#include <linux/workqueue.h>
> #include <media/v4l2-flash-led-class.h>
> 
> #define TPS6131X_REG_0				0x00
>@@ -307,8 +308,9 @@ static void tps6131x_torch_refresh_handler(struct work_struct *work)
> 		return;
> 	}
> 
>-	schedule_delayed_work(&tps6131x->torch_refresh_work,
>-			      TPS6131X_TORCH_REFRESH_INTERVAL_JIFFIES);
>+	queue_delayed_work(system_freezable_wq,
>+			   &tps6131x->torch_refresh_work,
>+			   TPS6131X_TORCH_REFRESH_INTERVAL_JIFFIES);
> }
> 
> static int tps6131x_brightness_set(struct led_classdev *cdev, enum led_brightness brightness)
>@@ -367,8 +369,9 @@ static int tps6131x_brightness_set(struct led_classdev *cdev, enum led_brightnes
> 	 * To prevent this, the mode must be refreshed within the watchdog timeout.
> 	 */
> 	if (brightness)
>-		schedule_delayed_work(&tps6131x->torch_refresh_work,
>-				      TPS6131X_TORCH_REFRESH_INTERVAL_JIFFIES);
>+		queue_delayed_work(system_freezable_wq,
>+				   &tps6131x->torch_refresh_work,
>+				   TPS6131X_TORCH_REFRESH_INTERVAL_JIFFIES);
> 
> 	return 0;
> }
>-- 
>2.34.1

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

* Re:[PATCH 2/2] leds: cr0014114: queue recount work on freezable workqueue
  2026-10-16 10:04 ` [PATCH 2/2] leds: cr0014114: queue recount " Jiale Yao
@ 2026-10-17  7:18   ` jiale yao
  0 siblings, 0 replies; 5+ messages in thread
From: jiale yao @ 2026-10-17  7:18 UTC (permalink / raw)
  To: Lee Jones, Pavel Machek, linux-leds, linux-kernel

At 2026-10-16 18:04:35, "Jiale Yao" <yaojiale02@163.com> wrote:
>The firmware workaround periodically recounts the LED state by issuing
>SPI transfers. Its delayed work runs on the non-freezable system
>workqueue and can therefore access the controller after it has been
>suspended.
>
>Queue the recount work on system_freezable_wq so hardware access is
>deferred until devices have resumed.
>

Fixes: 9e50d5fb0d18 ("leds: add LED driver for CR0014114 board")

>Signed-off-by: Jiale Yao <yaojiale02@163.com>
>---
> drivers/leds/leds-cr0014114.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
>diff --git a/drivers/leds/leds-cr0014114.c b/drivers/leds/leds-cr0014114.c
>index 3f6931ae0bcc..afe3730e1222 100644
>--- a/drivers/leds/leds-cr0014114.c
>+++ b/drivers/leds/leds-cr0014114.c
>@@ -155,7 +155,8 @@ static void cr0014114_recount_work(struct work_struct *work)
> 	if (ret)
> 		dev_warn(priv->dev, "sync of LEDs failed %d\n", ret);
> 
>-	schedule_delayed_work(&priv->work, CR_RECOUNT_DELAY);
>+	queue_delayed_work(system_freezable_wq, &priv->work,
>+			   CR_RECOUNT_DELAY);
> }
> 
> static int cr0014114_set_sync(struct led_classdev *ldev,
>@@ -256,7 +257,8 @@ static int cr0014114_probe(struct spi_device *spi)
> 		return ret;
> 
> 	/* setup recount work to workaround buggy firmware */
>-	schedule_delayed_work(&priv->work, CR_RECOUNT_DELAY);
>+	queue_delayed_work(system_freezable_wq, &priv->work,
>+			   CR_RECOUNT_DELAY);
> 
> 	spi_set_drvdata(spi, priv);
> 
>-- 
>2.34.1

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

end of thread, other threads:[~2026-10-17  7:18 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-16 10:04 [PATCH 0/2] leds: freeze delayed hardware access during suspend Jiale Yao
2026-10-16 10:04 ` [PATCH 1/2] leds: tps6131x: queue torch refresh work on freezable workqueue Jiale Yao
2026-10-17  7:16   ` jiale yao
2026-10-16 10:04 ` [PATCH 2/2] leds: cr0014114: queue recount " Jiale Yao
2026-10-17  7:18   ` jiale yao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®