From bae581556e0d04fd166e01f4cdb93e0311cac8ea Mon Sep 17 00:00:00 2001 From: Sven Willett Date: Tue, 23 Dec 2025 16:03:12 +1100 Subject: [PATCH 1/3] Add basic functionality Will try and set the charge type for all batteries detected Signed-off-by: Sven Willett --- func.d/35-tlp-func-batt | 36 ++++++++++++++++++++++++++++++++++++ tlp.in | 7 +++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/func.d/35-tlp-func-batt b/func.d/35-tlp-func-batt index 0c7504b4..5c2fd5e1 100644 --- a/func.d/35-tlp-func-batt +++ b/func.d/35-tlp-func-batt @@ -311,5 +311,41 @@ soc_gt_stop_recommendation () { fi done + return 0 +} + +init_batteries_charge_mode() { + # apply charge mode from configuration to all batteries + # - called from bg tasks tlp init [re]start/auto and tlp start + # rc: 0=ok/ + # 1=battery not present/ + # 2=charge_type not supported + # 3=read error/ + # 4=write error/ + # 255=no charge_types api + local rc + local bat + new_mode="${CHARGE_MODE:-}" + if [ -z "$new_mode" ]; then + return 0 + fi + for bat in /sys/class/power_supply/*[Bb][Aa][Tt]*/ ; do + if [ ! -d $bat ]; then + return 1 + elif supported_modes=$(read_sysf "$bat/charge_types"); then + if [[ "$supported_modes" == *"$new_mode"* ]]; then + old_chtype="$(echo "$supported_modes" | sed -r 's/.*\[([A-Z][a-z]+)\].*/\1/')" + if [ "$new_mode" != "$old_chtype" ]; then + write_sysf "$new_mode" "$bat/charge_types" || return 4 + fi + else + return 2 + fi + else + return 3 + fi + done + + return 0 } diff --git a/tlp.in b/tlp.in index f097b32f..33e2fddc 100644 --- a/tlp.in +++ b/tlp.in @@ -279,8 +279,9 @@ case "$_cmd" in echo "done." # apply battery settings - printf "Setting battery charge thresholds..." + printf "Applying battery settings..." init_batteries_thresholds + init_batteries_charge_mode echo "done." # apply radio states @@ -298,8 +299,9 @@ case "$_cmd" in echo "done." # apply battery settings - printf "Setting battery charge thresholds..." + printf "Applying battery settings..." init_batteries_thresholds + init_batteries_charge_mode echo "done." ;; @@ -364,6 +366,7 @@ case "$_cmd" in poweroff_drivebay "$_pp_next" 0 set_usb_suspend 0 auto init_batteries_thresholds + init_batteries_charge_mode set_radio_device_states "$_pp_next" save_runconf unlock_tlp From 4a35a3d6133c91f8ac034bc41005ca0c26c5feb0 Mon Sep 17 00:00:00 2001 From: Sven Willett Date: Sun, 28 Dec 2025 11:14:46 +1100 Subject: [PATCH 2/3] Add debug to function Signed-off-by: Sven Willett --- func.d/35-tlp-func-batt | 30 ++++++++++++++++++------------ tlp.in | 6 +++--- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/func.d/35-tlp-func-batt b/func.d/35-tlp-func-batt index 5c2fd5e1..76020be0 100644 --- a/func.d/35-tlp-func-batt +++ b/func.d/35-tlp-func-batt @@ -314,38 +314,44 @@ soc_gt_stop_recommendation () { return 0 } -init_batteries_charge_mode() { +set_batteries_charge_mode() { # apply charge mode from configuration to all batteries # - called from bg tasks tlp init [re]start/auto and tlp start - # rc: 0=ok/ - # 1=battery not present/ - # 2=charge_type not supported - # 3=read error/ - # 4=write error/ - # 255=no charge_types api + local rc local bat new_mode="${CHARGE_MODE:-}" + if [ -z "$new_mode" ]; then + echo_debug "bat" "set_batteries_charge_mode.not_configured" return 0 fi + for bat in /sys/class/power_supply/*[Bb][Aa][Tt]*/ ; do if [ ! -d $bat ]; then - return 1 + echo_debug "bat" "set_batteries_charge_mode.battery_not_present" + return 0 elif supported_modes=$(read_sysf "$bat/charge_types"); then if [[ "$supported_modes" == *"$new_mode"* ]]; then old_chtype="$(echo "$supported_modes" | sed -r 's/.*\[([A-Z][a-z]+)\].*/\1/')" if [ "$new_mode" != "$old_chtype" ]; then - write_sysf "$new_mode" "$bat/charge_types" || return 4 + if write_sysf "$new_mode" "$bat/charge_types"; then + echo_debug "bat" "set_batteries_charge_mode: $new_mode" + else + echo_debug "bat" "set_batteries_charge_mode.write_error" + return 0 + fi fi else - return 2 + echo_message "Charge mode $new_mode not supported on system" + echo_debug "bat" "set_batteries_charge_mode.charge_mode_not_supported" + return 0 fi else - return 3 + echo_debug "bat" "set_batteries_charge_mode.read_error" + return 0 fi done - return 0 } diff --git a/tlp.in b/tlp.in index 33e2fddc..bb3584b1 100644 --- a/tlp.in +++ b/tlp.in @@ -281,7 +281,7 @@ case "$_cmd" in # apply battery settings printf "Applying battery settings..." init_batteries_thresholds - init_batteries_charge_mode + set_batteries_charge_mode echo "done." # apply radio states @@ -301,7 +301,7 @@ case "$_cmd" in # apply battery settings printf "Applying battery settings..." init_batteries_thresholds - init_batteries_charge_mode + set_batteries_charge_mode echo "done." ;; @@ -366,7 +366,7 @@ case "$_cmd" in poweroff_drivebay "$_pp_next" 0 set_usb_suspend 0 auto init_batteries_thresholds - init_batteries_charge_mode + set_batteries_charge_mode set_radio_device_states "$_pp_next" save_runconf unlock_tlp From 25ee82be98bd501fa2f2e2c1e64bf169c637f6cc Mon Sep 17 00:00:00 2001 From: Sven Willett Date: Sun, 28 Dec 2025 13:06:53 +1100 Subject: [PATCH 3/3] Fix globbing and bashisms --- func.d/35-tlp-func-batt | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/func.d/35-tlp-func-batt b/func.d/35-tlp-func-batt index 76020be0..6eb32553 100644 --- a/func.d/35-tlp-func-batt +++ b/func.d/35-tlp-func-batt @@ -318,7 +318,6 @@ set_batteries_charge_mode() { # apply charge mode from configuration to all batteries # - called from bg tasks tlp init [re]start/auto and tlp start - local rc local bat new_mode="${CHARGE_MODE:-}" @@ -328,25 +327,28 @@ set_batteries_charge_mode() { fi for bat in /sys/class/power_supply/*[Bb][Aa][Tt]*/ ; do - if [ ! -d $bat ]; then + if [ ! -d "$bat" ]; then echo_debug "bat" "set_batteries_charge_mode.battery_not_present" return 0 elif supported_modes=$(read_sysf "$bat/charge_types"); then - if [[ "$supported_modes" == *"$new_mode"* ]]; then - old_chtype="$(echo "$supported_modes" | sed -r 's/.*\[([A-Z][a-z]+)\].*/\1/')" - if [ "$new_mode" != "$old_chtype" ]; then - if write_sysf "$new_mode" "$bat/charge_types"; then - echo_debug "bat" "set_batteries_charge_mode: $new_mode" - else - echo_debug "bat" "set_batteries_charge_mode.write_error" - return 0 + case $supported_modes in + *"$new_mode"*) + old_chtype="$(echo "$supported_modes" | sed -r 's/.*\[([A-Z][a-z]+)\].*/\1/')" + if [ "$new_mode" != "$old_chtype" ]; then + if write_sysf "$new_mode" "$bat/charge_types"; then + echo_debug "bat" "set_batteries_charge_mode: $new_mode" + else + echo_debug "bat" "set_batteries_charge_mode.write_error" + return 0 + fi fi - fi - else - echo_message "Charge mode $new_mode not supported on system" - echo_debug "bat" "set_batteries_charge_mode.charge_mode_not_supported" - return 0 - fi + ;; + *) + echo_message "Charge mode $new_mode not supported on system" + echo_debug "bat" "set_batteries_charge_mode.charge_mode_not_supported" + return 0 + ;; + esac else echo_debug "bat" "set_batteries_charge_mode.read_error" return 0