Hello Chaitanya,

thanks for the report. This should be a fix:
https://lore.kernel.org/all/20260724-power-supply-triggers-lockdep-v1-1-9b451b1f1...@beckhoff.com/T/#u

Regards
Steffen

On Fri, 2026-07-24 at 11:28 +0530, Borah, Chaitanya Kumar wrote:
> Hello Steffen,
> On 6/25/2026 10:37 PM, Steffen Dirkwinkel wrote:
> > From: Steffen Dirkwinkel <[email protected]>
> > 
> > Currently only battery power supplies get triggers for other properties
> > and other supplies only get the online trigger.
> > 
> > This changes it to provide the triggers for any power supply depending
> > on what properties are available. Batteries will still get the same
> > triggers if the properties are there, but now other power supplies can
> > get the triggers too.
> > 
> 
> This seems to be causing regression in our linux-next CI [1] since 
> next-20260722.
> 
> <6>[   11.206334] ------------[ cut here ]------------
> <4>[   11.206341] WARNING: drivers/power/supply/power_supply_core.c:1384 
> at power_supply_has_property+0xed/0x100, CPU#2: (udev-worker)/324
> ...
> <4>[   11.206524] Call Trace:
> <4>[   11.206526]  <TASK>
> <4>[   11.206532]  power_supply_create_triggers+0x4b/0x150
> <4>[   11.206541]  __power_supply_register.part.0+0x3b0/0x510
> <4>[   11.206547]  ? __pfx_devm_power_supply_release+0x10/0x10
> <4>[   11.206560]  devm_power_supply_register+0x75/0x100
> <4>[   11.206569]  tps6598x_probe+0x34c/0x6c0 [tps6598x]
> <4>[   11.206592]  i2c_device_probe+0x19c/0x3b0
> <4>[   11.206604]  really_probe+0xf1/0x420
> <4>[   11.206612]  __driver_probe_device+0xa2/0x1e0
> <4>[   11.206620]  driver_probe_device+0x24/0xb0
> <4>[   11.206627]  __driver_attach+0x110/0x240
> <4>[   11.206632]  ? __pfx___driver_attach+0x10/0x10
> <4>[   11.206638]  bus_for_each_dev+0x7f/0xe0
> ...
> 
> Detailed log can be seen found in [2].
> 
> We confirmed that reverting the patch solves the issue.
> 
> Could you please check why the patch causes this regression and provide
> a fix if necessary?
> 
> Regards
> Chaitanya
> 
> [1] https://intel-gfx-ci.01.org/tree/linux-next/combined-alt.html?
> [2] 
> https://intel-gfx-ci.01.org/tree/linux-next/next-20260722/fi-kbl-8809g/boot0.txt
> 
> --Bisect Logs--
> 
> git bisect start
> # status: waiting for both good and bad commits
> # good: [842870cdfa33b9191b46484a3264bd5126a90570] net: Enable BIG TCP 
> with partial GSO
> git bisect good 842870cdfa33b9191b46484a3264bd5126a90570
> # status: waiting for bad commit, 1 good commit known
> # bad: [b4515cf4156356e8f4fe6e0fdc17f59adab9772f] Add linux-next 
> specific files for 20260722
> git bisect bad b4515cf4156356e8f4fe6e0fdc17f59adab9772f
> # good: [ce3befa9786f3e9eb3990cb6f6b497710bd10ec5] Merge branch 'master' 
> of 
> https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git
> git bisect good ce3befa9786f3e9eb3990cb6f6b497710bd10ec5
> # good: [efac7c4cbbafdd21f9866476e3f4e5e5bfae8912] Merge branch 
> 'for-next' of 
> https://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git
> git bisect good efac7c4cbbafdd21f9866476e3f4e5e5bfae8912
> # bad: [a91e6d5412453d44dc4d59d62d3ce50b53122ad8] Merge branch 
> 'usb-next' of https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
> git bisect bad a91e6d5412453d44dc4d59d62d3ce50b53122ad8
> # bad: [b828bb5abe65b8b73fcd49d3c92cdd3af45bfe6f] Merge branch 
> 'kexec-next' of 
> https://git.kernel.org/pub/scm/linux/kernel/git/liveupdate/linux.git
> git bisect bad b828bb5abe65b8b73fcd49d3c92cdd3af45bfe6f
> # bad: [8a3f0f5b2aadc94d6300cfdd8daf3971decc1961] Merge branch 
> 'for-next' of 
> https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git
> git bisect bad 8a3f0f5b2aadc94d6300cfdd8daf3971decc1961
> # bad: [5e64a0d36112c45c8ae0c6903ce2b1b49bea04dd] Merge branch 
> 'for-next' of 
> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git
> git bisect bad 5e64a0d36112c45c8ae0c6903ce2b1b49bea04dd
> # good: [db30c3e3e3c247b0b1e73449b7ead5dd19044c26] Merge branch 
> 'for-mfd-next' of 
> https://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git
> git bisect good db30c3e3e3c247b0b1e73449b7ead5dd19044c26
> # good: [406b652bf9c47d6e784fd2ab723e6798d322ef47] power: supply: 
> rt9455_charger: Remove redundant dev_err()/dev_err_probe()
> git bisect good 406b652bf9c47d6e784fd2ab723e6798d322ef47
> # good: [5ec27fa6b9d937188a81724f09df82707cca944e] selftests: helpers: 
> handle multi line in test_sysfs_prop_optional_list
> git bisect good 5ec27fa6b9d937188a81724f09df82707cca944e
> # bad: [353438b3107d56e36a642f117c2b4accc963abbd] dt-bindings: power: 
> supply: maxim,max8903: add DC and USB input current-limit controls
> git bisect bad 353438b3107d56e36a642f117c2b4accc963abbd
> # bad: [741a9b09775517c76a5029c58a03725b414d7e20] dt-bindings: power: 
> reset: qcom,pon: Narrow allowed reboot modes
> git bisect bad 741a9b09775517c76a5029c58a03725b414d7e20
> # good: [f97d9166048ddea147b5673330f9900bf08c725d] power: supply: 
> sbs-battery: Add PbAc, NiZn, RAM, and ZnAr support
> git bisect good f97d9166048ddea147b5673330f9900bf08c725d
> # bad: [b04510c3af6dd34b2e8dcf303114d77d5e443cac] power: supply: leds: 
> create triggers based on properties, not type
> git bisect bad b04510c3af6dd34b2e8dcf303114d77d5e443cac
> # first bad commit: [b04510c3af6dd34b2e8dcf303114d77d5e443cac] power: 
> supply: leds: create triggers based on properties, not type
> 
> 
> > Signed-off-by: Steffen Dirkwinkel <[email protected]>
> > ---
> >   drivers/power/supply/power_supply_leds.c | 88 
> > ++++++++++++++++----------------
> >   include/linux/power_supply.h             |  3 +-
> >   2 files changed, 45 insertions(+), 46 deletions(-)
> > 
> > diff --git a/drivers/power/supply/power_supply_leds.c 
> > b/drivers/power/supply/power_supply_leds.c
> > index 1548aaba3362..538cc0440e53 100644
> > --- a/drivers/power/supply/power_supply_leds.c
> > +++ b/drivers/power/supply/power_supply_leds.c
> > @@ -17,8 +17,6 @@
> >   
> >   #include "power_supply.h"
> >   
> > -/* Battery specific LEDs triggers. */
> > -
> >   struct power_supply_led_trigger {
> >     struct led_trigger trig;
> >     struct power_supply *psy;
> > @@ -89,7 +87,7 @@ static void power_supply_unregister_led_trigger(struct 
> > led_trigger *trig)
> >     kfree(psy_trig);
> >   }
> >   
> > -static void power_supply_update_bat_leds(struct power_supply *psy)
> > +static void power_supply_update_status_leds(struct power_supply *psy)
> >   {
> >     union power_supply_propval status;
> >     unsigned int intensity_green[3] = { 0, 255, 0 };
> > @@ -102,7 +100,7 @@ static void power_supply_update_bat_leds(struct 
> > power_supply *psy)
> >   
> >     switch (status.intval) {
> >     case POWER_SUPPLY_STATUS_FULL:
> > -           led_trigger_event(psy->trig, LED_FULL);
> > +           led_trigger_event(psy->charging_or_full_trig, LED_FULL);
> >             led_trigger_event(psy->charging_trig, LED_OFF);
> >             led_trigger_event(psy->full_trig, LED_FULL);
> >             /* Going from blink to LED on requires a LED_OFF event to stop 
> > blink */
> > @@ -114,7 +112,7 @@ static void power_supply_update_bat_leds(struct 
> > power_supply *psy)
> >                                  LED_FULL);
> >             break;
> >     case POWER_SUPPLY_STATUS_CHARGING:
> > -           led_trigger_event(psy->trig, LED_FULL);
> > +           led_trigger_event(psy->charging_or_full_trig, LED_FULL);
> >             led_trigger_event(psy->charging_trig, LED_FULL);
> >             led_trigger_event(psy->full_trig, LED_OFF);
> >             led_trigger_blink(psy->charging_blink_full_solid_trig, 0, 0);
> > @@ -124,7 +122,7 @@ static void power_supply_update_bat_leds(struct 
> > power_supply *psy)
> >                                  LED_FULL);
> >             break;
> >     default:
> > -           led_trigger_event(psy->trig, LED_OFF);
> > +           led_trigger_event(psy->charging_or_full_trig, LED_OFF);
> >             led_trigger_event(psy->charging_trig, LED_OFF);
> >             led_trigger_event(psy->full_trig, LED_OFF);
> >             led_trigger_event(psy->charging_blink_full_solid_trig,
> > @@ -135,21 +133,15 @@ static void power_supply_update_bat_leds(struct 
> > power_supply *psy)
> >     }
> >   }
> >   
> > -static void power_supply_remove_bat_triggers(struct power_supply *psy)
> > -{
> > -   power_supply_unregister_led_trigger(psy->trig);
> > -   power_supply_unregister_led_trigger(psy->charging_trig);
> > -   power_supply_unregister_led_trigger(psy->full_trig);
> > -   
> > power_supply_unregister_led_trigger(psy->charging_blink_full_solid_trig);
> > -   
> > power_supply_unregister_led_trigger(psy->charging_orange_full_green_trig);
> > -}
> > -
> > -static int power_supply_create_bat_triggers(struct power_supply *psy)
> > +static int power_supply_create_status_triggers(struct power_supply *psy)
> >   {
> >     int err = 0;
> >   
> > +   if (!power_supply_has_property(psy, POWER_SUPPLY_PROP_STATUS))
> > +           return 0;
> > +
> >     power_supply_register_led_trigger(psy, "%s-charging-or-full",
> > -                                     &psy->trig, &err);
> > +                                     &psy->charging_or_full_trig, &err);
> >     power_supply_register_led_trigger(psy, "%s-charging",
> >                                       &psy->charging_trig, &err);
> >     power_supply_register_led_trigger(psy, "%s-full",
> > @@ -158,15 +150,11 @@ static int power_supply_create_bat_triggers(struct 
> > power_supply *psy)
> >                                       &psy->charging_blink_full_solid_trig, 
> > &err);
> >     power_supply_register_led_trigger(psy, "%s-charging-orange-full-green",
> >                                       
> > &psy->charging_orange_full_green_trig, &err);
> > -   if (err)
> > -           power_supply_remove_bat_triggers(psy);
> >   
> >     return err;
> >   }
> >   
> > -/* Generated power specific LEDs triggers. */
> > -
> > -static void power_supply_update_gen_leds(struct power_supply *psy)
> > +static void power_supply_update_online_leds(struct power_supply *psy)
> >   {
> >     union power_supply_propval online;
> >   
> > @@ -175,43 +163,53 @@ static void power_supply_update_gen_leds(struct 
> > power_supply *psy)
> >   
> >     dev_dbg(&psy->dev, "%s %d\n", __func__, online.intval);
> >   
> > -   if (online.intval)
> > -           led_trigger_event(psy->trig, LED_FULL);
> > -   else
> > -           led_trigger_event(psy->trig, LED_OFF);
> > +   led_trigger_event(psy->online_trig, online.intval ? LED_FULL : LED_OFF);
> >   }
> >   
> > -static int power_supply_create_gen_triggers(struct power_supply *psy)
> > +static int power_supply_create_online_trigger(struct power_supply *psy)
> >   {
> > -   return power_supply_register_led_trigger(psy, "%s-online", &psy->trig, 
> > NULL);
> > -}
> > +   int err = 0;
> >   
> > -static void power_supply_remove_gen_triggers(struct power_supply *psy)
> > -{
> > -   power_supply_unregister_led_trigger(psy->trig);
> > -}
> > +   if (!power_supply_has_property(psy, POWER_SUPPLY_PROP_ONLINE))
> > +           return 0;
> >   
> > -/* Choice what triggers to create&update. */
> > +   power_supply_register_led_trigger(psy, "%s-online", &psy->online_trig,
> > +                                     &err);
> > +
> > +   return err;
> > +}
> >   
> >   void power_supply_update_leds(struct power_supply *psy)
> >   {
> > -   if (psy->desc->type == POWER_SUPPLY_TYPE_BATTERY)
> > -           power_supply_update_bat_leds(psy);
> > -   else
> > -           power_supply_update_gen_leds(psy);
> > +   power_supply_update_online_leds(psy);
> > +   power_supply_update_status_leds(psy);
> >   }
> >   
> >   int power_supply_create_triggers(struct power_supply *psy)
> >   {
> > -   if (psy->desc->type == POWER_SUPPLY_TYPE_BATTERY)
> > -           return power_supply_create_bat_triggers(psy);
> > -   return power_supply_create_gen_triggers(psy);
> > +   int err;
> > +
> > +   err = power_supply_create_online_trigger(psy);
> > +   if (err)
> > +           goto err_remove;
> > +
> > +   err = power_supply_create_status_triggers(psy);
> > +   if (err)
> > +           goto err_remove;
> > +
> > +   return 0;
> > +
> > +err_remove:
> > +   power_supply_remove_triggers(psy);
> > +   return err;
> >   }
> >   
> >   void power_supply_remove_triggers(struct power_supply *psy)
> >   {
> > -   if (psy->desc->type == POWER_SUPPLY_TYPE_BATTERY)
> > -           power_supply_remove_bat_triggers(psy);
> > -   else
> > -           power_supply_remove_gen_triggers(psy);
> > +   power_supply_unregister_led_trigger(psy->online_trig);
> > +   power_supply_unregister_led_trigger(psy->charging_or_full_trig);
> > +   power_supply_unregister_led_trigger(psy->charging_trig);
> > +   power_supply_unregister_led_trigger(psy->full_trig);
> > +   
> > power_supply_unregister_led_trigger(psy->charging_blink_full_solid_trig);
> > +   
> > power_supply_unregister_led_trigger(psy->charging_orange_full_green_trig);
> >   }
> > diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h
> > index 7a5e4c3242a0..68b65682b14d 100644
> > --- a/include/linux/power_supply.h
> > +++ b/include/linux/power_supply.h
> > @@ -346,7 +346,8 @@ struct power_supply {
> >   #endif
> >   
> >   #ifdef CONFIG_LEDS_TRIGGERS
> > -   struct led_trigger *trig;
> > +   struct led_trigger *charging_or_full_trig;
> > +   struct led_trigger *online_trig;
> >     struct led_trigger *charging_trig;
> >     struct led_trigger *full_trig;
> >     struct led_trigger *charging_blink_full_solid_trig;
> > 

Reply via email to