Patch "power: supply: Fix logic checking if system is running from battery" has been added to the 6.3-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    power: supply: Fix logic checking if system is running from battery

to the 6.3-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     power-supply-fix-logic-checking-if-system-is-running.patch
and it can be found in the queue-6.3 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 24259b318b4d4173a15372ea3c495867cd1cba9e
Author: Mario Limonciello <mario.limonciello@xxxxxxx>
Date:   Tue May 16 13:25:40 2023 -0500

    power: supply: Fix logic checking if system is running from battery
    
    [ Upstream commit 95339f40a8b652b5b1773def31e63fc53c26378a ]
    
    The logic used for power_supply_is_system_supplied() counts all power
    supplies and assumes that the system is running from AC if there is
    either a non-battery power-supply reporting to be online or if no
    power-supplies exist at all.
    
    The second rule is for desktop systems, that don't have any
    battery/charger devices. These systems will incorrectly report to be
    powered from battery once a device scope power-supply is registered
    (e.g. a HID device), since these power-supplies increase the counter.
    
    Apart from HID devices, recent dGPUs provide UCSI power supplies on a
    desktop systems. The dGPU by default doesn't have anything plugged in so
    it's 'offline'. This makes power_supply_is_system_supplied() return 0
    with a count of 1 meaning all drivers that use this get a wrong judgement.
    
    To fix this case adjust the logic to also examine the scope of the power
    supply. If the power supply is deemed a device power supply, then don't
    count it.
    
    Cc: Evan Quan <Evan.Quan@xxxxxxx>
    Suggested-by: Lijo Lazar <Lijo.Lazar@xxxxxxx>
    Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c
index f3d7c1da299fe..d325e6dbc7709 100644
--- a/drivers/power/supply/power_supply_core.c
+++ b/drivers/power/supply/power_supply_core.c
@@ -348,6 +348,10 @@ static int __power_supply_is_system_supplied(struct device *dev, void *data)
 	struct power_supply *psy = dev_get_drvdata(dev);
 	unsigned int *count = data;
 
+	if (!psy->desc->get_property(psy, POWER_SUPPLY_PROP_SCOPE, &ret))
+		if (ret.intval == POWER_SUPPLY_SCOPE_DEVICE)
+			return 0;
+
 	(*count)++;
 	if (psy->desc->type != POWER_SUPPLY_TYPE_BATTERY)
 		if (!psy->desc->get_property(psy, POWER_SUPPLY_PROP_ONLINE,
@@ -366,8 +370,8 @@ int power_supply_is_system_supplied(void)
 				      __power_supply_is_system_supplied);
 
 	/*
-	 * If no power class device was found at all, most probably we are
-	 * running on a desktop system, so assume we are on mains power.
+	 * If no system scope power class device was found at all, most probably we
+	 * are running on a desktop system, so assume we are on mains power.
 	 */
 	if (count == 0)
 		return 1;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux