Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'for-v5.19-rc' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply

Pull power supply fixes from Sebastian Reichel:

- power-supply core temperature interpolation regression fix for
incorrect boundaries

- ab8500 needs to destroy its work queues in error paths

- Fix old DT refcount leak in arm-versatile

* tag 'for-v5.19-rc' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply:
power: supply: core: Fix boundary conditions in interpolation
power/reset: arm-versatile: Fix refcount leak in versatile_reboot_probe
power: supply: ab8500_fg: add missing destroy_workqueue in ab8500_fg_probe

+21 -13
+1
drivers/power/reset/arm-versatile-reboot.c
··· 146 146 versatile_reboot_type = (enum versatile_reboot)reboot_id->data; 147 147 148 148 syscon_regmap = syscon_node_to_regmap(np); 149 + of_node_put(np); 149 150 if (IS_ERR(syscon_regmap)) 150 151 return PTR_ERR(syscon_regmap); 151 152
+8 -1
drivers/power/supply/ab8500_fg.c
··· 3148 3148 ret = ab8500_fg_init_hw_registers(di); 3149 3149 if (ret) { 3150 3150 dev_err(dev, "failed to initialize registers\n"); 3151 + destroy_workqueue(di->fg_wq); 3151 3152 return ret; 3152 3153 } 3153 3154 ··· 3160 3159 di->fg_psy = devm_power_supply_register(dev, &ab8500_fg_desc, &psy_cfg); 3161 3160 if (IS_ERR(di->fg_psy)) { 3162 3161 dev_err(dev, "failed to register FG psy\n"); 3162 + destroy_workqueue(di->fg_wq); 3163 3163 return PTR_ERR(di->fg_psy); 3164 3164 } 3165 3165 ··· 3176 3174 /* Register primary interrupt handlers */ 3177 3175 for (i = 0; i < ARRAY_SIZE(ab8500_fg_irq); i++) { 3178 3176 irq = platform_get_irq_byname(pdev, ab8500_fg_irq[i].name); 3179 - if (irq < 0) 3177 + if (irq < 0) { 3178 + destroy_workqueue(di->fg_wq); 3180 3179 return irq; 3180 + } 3181 3181 3182 3182 ret = devm_request_threaded_irq(dev, irq, NULL, 3183 3183 ab8500_fg_irq[i].isr, ··· 3189 3185 if (ret != 0) { 3190 3186 dev_err(dev, "failed to request %s IRQ %d: %d\n", 3191 3187 ab8500_fg_irq[i].name, irq, ret); 3188 + destroy_workqueue(di->fg_wq); 3192 3189 return ret; 3193 3190 } 3194 3191 dev_dbg(dev, "Requested %s IRQ %d: %d\n", ··· 3205 3200 ret = ab8500_fg_sysfs_init(di); 3206 3201 if (ret) { 3207 3202 dev_err(dev, "failed to create sysfs entry\n"); 3203 + destroy_workqueue(di->fg_wq); 3208 3204 return ret; 3209 3205 } 3210 3206 ··· 3213 3207 if (ret) { 3214 3208 dev_err(dev, "failed to create FG psy\n"); 3215 3209 ab8500_fg_sysfs_exit(di); 3210 + destroy_workqueue(di->fg_wq); 3216 3211 return ret; 3217 3212 } 3218 3213
+12 -12
drivers/power/supply/power_supply_core.c
··· 846 846 { 847 847 int i, high, low; 848 848 849 - /* Break loop at table_len - 1 because that is the highest index */ 850 - for (i = 0; i < table_len - 1; i++) 849 + for (i = 0; i < table_len; i++) 851 850 if (temp > table[i].temp) 852 851 break; 853 852 854 853 /* The library function will deal with high == low */ 855 - if ((i == 0) || (i == (table_len - 1))) 856 - high = i; 854 + if (i == 0) 855 + high = low = i; 856 + else if (i == table_len) 857 + high = low = i - 1; 857 858 else 858 - high = i - 1; 859 - low = i; 859 + high = (low = i) - 1; 860 860 861 861 return fixp_linear_interpolate(table[low].temp, 862 862 table[low].resistance, ··· 958 958 { 959 959 int i, high, low; 960 960 961 - /* Break loop at table_len - 1 because that is the highest index */ 962 - for (i = 0; i < table_len - 1; i++) 961 + for (i = 0; i < table_len; i++) 963 962 if (ocv > table[i].ocv) 964 963 break; 965 964 966 965 /* The library function will deal with high == low */ 967 - if ((i == 0) || (i == (table_len - 1))) 968 - high = i - 1; 966 + if (i == 0) 967 + high = low = i; 968 + else if (i == table_len) 969 + high = low = i - 1; 969 970 else 970 - high = i; /* i.e. i == 0 */ 971 - low = i; 971 + high = (low = i) - 1; 972 972 973 973 return fixp_linear_interpolate(table[low].ocv, 974 974 table[low].capacity,