History

Merge tag 'for-v3.18-rc' of git://git.infradead.org/battery-2.6

Pull power supply updates from Sebastian Reichel: "Power supply and reset changes for the v3.18-rc: - misc. charger-manager fixes - year 2038 fix in ab8500_fg - fix error handling of bq2415x_charger" * tag 'for-v3.18-rc' of git://git.infradead.org/battery-2.6: power: charger-manager: Fix accessing invalidated power supply after charger unbind power: charger-manager: Fix accessing invalidated power supply after fuel gauge unbind power: charger-manager: Avoid recursive thermal get_temp call power_supply: Add no_thermal property to prevent recursive get_temp calls power: bq2415x_charger: Fix memory leak on DTS parsing error power: bq2415x_charger: Properly handle ENODEV from power_supply_get_by_phandle power: ab8500_fg.c: use 64-bit time types

Linus Torvalds committed 11 years ago

Commit ec7de652 parents e061167 cdaf3e16 files · +144 −72Browse files

Unified · Split

6 files
  1. drivers/power/ab8500_fg.c +9 −8
  2. drivers/power/bq2415x_charger.c +15 −8
  3. drivers/power/charger-manager.c +111 −53
  4. drivers/power/power_supply_core.c +3 −0
  5. include/linux/power/charger-manager.h +0 −3
  6. include/linux/power_supply.h +6 −0
drivers/power/ab8500_fg.c+9−8
@@ -25,6 +25,7 @@ · 24 unmodified lines
2525 #include <linux/slab.h>
2626 #include <linux/delay.h>
2727 #include <linux/time.h>
28+#include <linux/time64.h>
2829 #include <linux/of.h>
2930 #include <linux/completion.h>
3031 #include <linux/mfd/core.h>
@@ -108,7 +109,7 @@ enum ab8500_fg_calibration_state { · 77 unmodified lines
108109 struct ab8500_fg_avg_cap {
109110 int avg;
110111 int samples[NBR_AVG_SAMPLES];
111− __kernel_time_t time_stamps[NBR_AVG_SAMPLES];
112+ time64_t time_stamps[NBR_AVG_SAMPLES];
112113 int pos;
113114 int nbr_samples;
114115 int sum;
@@ -386,15 +387,15 @@ static int ab8500_fg_is_low_curr(struct ab8500_fg *di, int curr) · 271 unmodified lines
386387 */
387388 static int ab8500_fg_add_cap_sample(struct ab8500_fg *di, int sample)
388389 {
389− struct timespec ts;
390+ struct timespec64 ts64;
390391 struct ab8500_fg_avg_cap *avg = &di->avg_cap;
391392
392− getnstimeofday(&ts);
393+ getnstimeofday64(&ts64);
393394
394395 do {
395396 avg->sum += sample - avg->samples[avg->pos];
396397 avg->samples[avg->pos] = sample;
397− avg->time_stamps[avg->pos] = ts.tv_sec;
398+ avg->time_stamps[avg->pos] = ts64.tv_sec;
398399 avg->pos++;
399400
400401 if (avg->pos == NBR_AVG_SAMPLES)
@@ -407,7 +408,7 @@ static int ab8500_fg_add_cap_sample(struct ab8500_fg *di, int sample) · 6 unmodified lines
407408 * Check the time stamp for each sample. If too old,
408409 * replace with latest sample
409410 */
410− } while (ts.tv_sec - VALID_CAPACITY_SEC > avg->time_stamps[avg->pos]);
411+ } while (ts64.tv_sec - VALID_CAPACITY_SEC > avg->time_stamps[avg->pos]);
411412
412413 avg->avg = avg->sum / avg->nbr_samples;
413414
@@ -446,14 +447,14 @@ static void ab8500_fg_clear_cap_samples(struct ab8500_fg *di) · 32 unmodified lines
446447 static void ab8500_fg_fill_cap_sample(struct ab8500_fg *di, int sample)
447448 {
448449 int i;
449− struct timespec ts;
450+ struct timespec64 ts64;
450451 struct ab8500_fg_avg_cap *avg = &di->avg_cap;
451452
452− getnstimeofday(&ts);
453+ getnstimeofday64(&ts64);
453454
454455 for (i = 0; i < NBR_AVG_SAMPLES; i++) {
455456 avg->samples[i] = sample;
456− avg->time_stamps[i] = ts.tv_sec;
457+ avg->time_stamps[i] = ts64.tv_sec;
457458 }
458459
459460 avg->pos = 0;
drivers/power/bq2415x_charger.c+15−8
@@ -1579,8 +1579,15 @@ static int bq2415x_probe(struct i2c_client *client, · 1578 unmodified lines
15791579 if (np) {
15801580 bq->notify_psy = power_supply_get_by_phandle(np, "ti,usb-charger-detection");
15811581
1582− if (!bq->notify_psy)
1583− return -EPROBE_DEFER;
1582+ if (IS_ERR(bq->notify_psy)) {
1583+ dev_info(&client->dev,
1584+ "no 'ti,usb-charger-detection' property (err=%ld)\n",
1585+ PTR_ERR(bq->notify_psy));
1586+ bq->notify_psy = NULL;
1587+ } else if (!bq->notify_psy) {
1588+ ret = -EPROBE_DEFER;
1589+ goto error_2;
1590+ }
15841591 }
15851592 else if (pdata->notify_device)
15861593 bq->notify_psy = power_supply_get_by_name(pdata->notify_device);
@@ -1602,27 +1609,27 @@ static int bq2415x_probe(struct i2c_client *client, · 15 unmodified lines
16021609 ret = of_property_read_u32(np, "ti,current-limit",
16031610 &bq->init_data.current_limit);
16041611 if (ret)
1605− return ret;
1612+ goto error_2;
16061613 ret = of_property_read_u32(np, "ti,weak-battery-voltage",
16071614 &bq->init_data.weak_battery_voltage);
16081615 if (ret)
1609− return ret;
1616+ goto error_2;
16101617 ret = of_property_read_u32(np, "ti,battery-regulation-voltage",
16111618 &bq->init_data.battery_regulation_voltage);
16121619 if (ret)
1613− return ret;
1620+ goto error_2;
16141621 ret = of_property_read_u32(np, "ti,charge-current",
16151622 &bq->init_data.charge_current);
16161623 if (ret)
1617− return ret;
1624+ goto error_2;
16181625 ret = of_property_read_u32(np, "ti,termination-current",
16191626 &bq->init_data.termination_current);
16201627 if (ret)
1621− return ret;
1628+ goto error_2;
16221629 ret = of_property_read_u32(np, "ti,resistor-sense",
16231630 &bq->init_data.resistor_sense);
16241631 if (ret)
1625− return ret;
1632+ goto error_2;
16261633 } else {
16271634 memcpy(&bq->init_data, pdata, sizeof(bq->init_data));
16281635 }
drivers/power/charger-manager.c+111−53
@@ -97,6 +97,7 @@ static struct charger_global_desc *g_desc; /* init with setup_charger_manager */ · 96 unmodified lines
9797 static bool is_batt_present(struct charger_manager *cm)
9898 {
9999 union power_supply_propval val;
100+ struct power_supply *psy;
100101 bool present = false;
101102 int i, ret;
102103
@@ -107,16 +108,27 @@ static bool is_batt_present(struct charger_manager *cm) · 4 unmodified lines
107108 case CM_NO_BATTERY:
108109 break;
109110 case CM_FUEL_GAUGE:
110− ret = cm->fuel_gauge->get_property(cm->fuel_gauge,
111+ psy = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
112+ if (!psy)
113+ break;
114+
115+ ret = psy->get_property(psy,
111116 POWER_SUPPLY_PROP_PRESENT, &val);
112117 if (ret == 0 && val.intval)
113118 present = true;
114119 break;
115120 case CM_CHARGER_STAT:
116− for (i = 0; cm->charger_stat[i]; i++) {
117− ret = cm->charger_stat[i]->get_property(
118− cm->charger_stat[i],
119− POWER_SUPPLY_PROP_PRESENT, &val);
121+ for (i = 0; cm->desc->psy_charger_stat[i]; i++) {
122+ psy = power_supply_get_by_name(
123+ cm->desc->psy_charger_stat[i]);
124+ if (!psy) {
125+ dev_err(cm->dev, "Cannot find power supply \"%s\"\n",
126+ cm->desc->psy_charger_stat[i]);
127+ continue;
128+ }
129+
130+ ret = psy->get_property(psy, POWER_SUPPLY_PROP_PRESENT,
131+ &val);
120132 if (ret == 0 && val.intval) {
121133 present = true;
122134 break;
@@ -139,14 +151,20 @@ static bool is_batt_present(struct charger_manager *cm) · 16 unmodified lines
139151 static bool is_ext_pwr_online(struct charger_manager *cm)
140152 {
141153 union power_supply_propval val;
154+ struct power_supply *psy;
142155 bool online = false;
143156 int i, ret;
144157
145158 /* If at least one of them has one, it's yes. */
146− for (i = 0; cm->charger_stat[i]; i++) {
147− ret = cm->charger_stat[i]->get_property(
148− cm->charger_stat[i],
149− POWER_SUPPLY_PROP_ONLINE, &val);
159+ for (i = 0; cm->desc->psy_charger_stat[i]; i++) {
160+ psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]);
161+ if (!psy) {
162+ dev_err(cm->dev, "Cannot find power supply \"%s\"\n",
163+ cm->desc->psy_charger_stat[i]);
164+ continue;
165+ }
166+
167+ ret = psy->get_property(psy, POWER_SUPPLY_PROP_ONLINE, &val);
150168 if (ret == 0 && val.intval) {
151169 online = true;
152170 break;
@@ -167,12 +185,14 @@ static bool is_ext_pwr_online(struct charger_manager *cm) · 14 unmodified lines
167185 static int get_batt_uV(struct charger_manager *cm, int *uV)
168186 {
169187 union power_supply_propval val;
188+ struct power_supply *fuel_gauge;
170189 int ret;
171190
172− if (!cm->fuel_gauge)
191+ fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
192+ if (!fuel_gauge)
173193 return -ENODEV;
174194
175− ret = cm->fuel_gauge->get_property(cm->fuel_gauge,
195+ ret = fuel_gauge->get_property(fuel_gauge,
176196 POWER_SUPPLY_PROP_VOLTAGE_NOW, &val);
177197 if (ret)
178198 return ret;
@@ -189,6 +209,7 @@ static bool is_charging(struct charger_manager *cm) · 10 unmodified lines
189209 {
190210 int i, ret;
191211 bool charging = false;
212+ struct power_supply *psy;
192213 union power_supply_propval val;
193214
194215 /* If there is no battery, it cannot be charged */
@@ -196,17 +217,22 @@ static bool is_charging(struct charger_manager *cm) · 1 unmodified line
196217 return false;
197218
198219 /* If at least one of the charger is charging, return yes */
199− for (i = 0; cm->charger_stat[i]; i++) {
220+ for (i = 0; cm->desc->psy_charger_stat[i]; i++) {
200221 /* 1. The charger sholuld not be DISABLED */
201222 if (cm->emergency_stop)
202223 continue;
203224 if (!cm->charger_enabled)
204225 continue;
205226
227+ psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]);
228+ if (!psy) {
229+ dev_err(cm->dev, "Cannot find power supply \"%s\"\n",
230+ cm->desc->psy_charger_stat[i]);
231+ continue;
232+ }
233+
206234 /* 2. The charger should be online (ext-power) */
207− ret = cm->charger_stat[i]->get_property(
208− cm->charger_stat[i],
209− POWER_SUPPLY_PROP_ONLINE, &val);
235+ ret = psy->get_property(psy, POWER_SUPPLY_PROP_ONLINE, &val);
210236 if (ret) {
211237 dev_warn(cm->dev, "Cannot read ONLINE value from %s\n",
212238 cm->desc->psy_charger_stat[i]);
@@ -219,9 +245,7 @@ static bool is_charging(struct charger_manager *cm) · 6 unmodified lines
219245 * 3. The charger should not be FULL, DISCHARGING,
220246 * or NOT_CHARGING.
221247 */
222− ret = cm->charger_stat[i]->get_property(
223− cm->charger_stat[i],
224− POWER_SUPPLY_PROP_STATUS, &val);
248+ ret = psy->get_property(psy, POWER_SUPPLY_PROP_STATUS, &val);
225249 if (ret) {
226250 dev_warn(cm->dev, "Cannot read STATUS value from %s\n",
227251 cm->desc->psy_charger_stat[i]);
@@ -248,6 +272,7 @@ static bool is_full_charged(struct charger_manager *cm) · 20 unmodified lines
248272 {
249273 struct charger_desc *desc = cm->desc;
250274 union power_supply_propval val;
275+ struct power_supply *fuel_gauge;
251276 int ret = 0;
252277 int uV;
253278
@@ -255,11 +280,15 @@ static bool is_full_charged(struct charger_manager *cm) · 1 unmodified line
255280 if (!is_batt_present(cm))
256281 return false;
257282
258− if (cm->fuel_gauge && desc->fullbatt_full_capacity > 0) {
283+ fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
284+ if (!fuel_gauge)
285+ return false;
286+
287+ if (desc->fullbatt_full_capacity > 0) {
259288 val.intval = 0;
260289
261290 /* Not full if capacity of fuel gauge isn't full */
262− ret = cm->fuel_gauge->get_property(cm->fuel_gauge,
291+ ret = fuel_gauge->get_property(fuel_gauge,
263292 POWER_SUPPLY_PROP_CHARGE_FULL, &val);
264293 if (!ret && val.intval > desc->fullbatt_full_capacity)
265294 return true;
@@ -273,10 +302,10 @@ static bool is_full_charged(struct charger_manager *cm) · 7 unmodified lines
273302 }
274303
275304 /* Full, if the capacity is more than fullbatt_soc */
276− if (cm->fuel_gauge && desc->fullbatt_soc > 0) {
305+ if (desc->fullbatt_soc > 0) {
277306 val.intval = 0;
278307
279− ret = cm->fuel_gauge->get_property(cm->fuel_gauge,
308+ ret = fuel_gauge->get_property(fuel_gauge,
280309 POWER_SUPPLY_PROP_CAPACITY, &val);
281310 if (!ret && val.intval >= desc->fullbatt_soc)
282311 return true;
@@ -551,6 +580,20 @@ static int check_charging_duration(struct charger_manager *cm) · 268 unmodified lines
551580 return ret;
552581 }
553582
583+static int cm_get_battery_temperature_by_psy(struct charger_manager *cm,
584+ int *temp)
585+{
586+ struct power_supply *fuel_gauge;
587+
588+ fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
589+ if (!fuel_gauge)
590+ return -ENODEV;
591+
592+ return fuel_gauge->get_property(fuel_gauge,
593+ POWER_SUPPLY_PROP_TEMP,
594+ (union power_supply_propval *)temp);
595+}
596+
554597 static int cm_get_battery_temperature(struct charger_manager *cm,
555598 int *temp)
556599 {
@@ -560,15 +603,18 @@ static int cm_get_battery_temperature(struct charger_manager *cm, · 3 unmodified lines
560603 return -ENODEV;
561604
562605 #ifdef CONFIG_THERMAL
563− ret = thermal_zone_get_temp(cm->tzd_batt, (unsigned long *)temp);
564− if (!ret)
565− /* Calibrate temperature unit */
566− *temp /= 100;
567−#else
568− ret = cm->fuel_gauge->get_property(cm->fuel_gauge,
569− POWER_SUPPLY_PROP_TEMP,
570− (union power_supply_propval *)temp);
606+ if (cm->tzd_batt) {
607+ ret = thermal_zone_get_temp(cm->tzd_batt, (unsigned long *)temp);
608+ if (!ret)
609+ /* Calibrate temperature unit */
610+ *temp /= 100;
611+ } else
571612 #endif
613+ {
614+ /* if-else continued from CONFIG_THERMAL */
615+ ret = cm_get_battery_temperature_by_psy(cm, temp);
616+ }
617+
572618 return ret;
573619 }
574620
@@ -827,6 +873,7 @@ static int charger_get_property(struct power_supply *psy, · 252 unmodified lines
827873 struct charger_manager *cm = container_of(psy,
828874 struct charger_manager, charger_psy);
829875 struct charger_desc *desc = cm->desc;
876+ struct power_supply *fuel_gauge;
830877 int ret = 0;
831878 int uV;
832879
@@ -857,14 +904,20 @@ static int charger_get_property(struct power_supply *psy, · 24 unmodified lines
857904 ret = get_batt_uV(cm, &val->intval);
858905 break;
859906 case POWER_SUPPLY_PROP_CURRENT_NOW:
860− ret = cm->fuel_gauge->get_property(cm->fuel_gauge,
907+ fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
908+ if (!fuel_gauge) {
909+ ret = -ENODEV;
910+ break;
911+ }
912+ ret = fuel_gauge->get_property(fuel_gauge,
861913 POWER_SUPPLY_PROP_CURRENT_NOW, val);
862914 break;
863915 case POWER_SUPPLY_PROP_TEMP:
864916 case POWER_SUPPLY_PROP_TEMP_AMBIENT:
865917 return cm_get_battery_temperature(cm, &val->intval);
866918 case POWER_SUPPLY_PROP_CAPACITY:
867− if (!cm->fuel_gauge) {
919+ fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
920+ if (!fuel_gauge) {
868921 ret = -ENODEV;
869922 break;
870923 }
@@ -875,7 +928,7 @@ static int charger_get_property(struct power_supply *psy, · 4 unmodified lines
875928 break;
876929 }
877930
878− ret = cm->fuel_gauge->get_property(cm->fuel_gauge,
931+ ret = fuel_gauge->get_property(fuel_gauge,
879932 POWER_SUPPLY_PROP_CAPACITY, val);
880933 if (ret)
881934 break;
@@ -924,7 +977,14 @@ static int charger_get_property(struct power_supply *psy, · 42 unmodified lines
924977 break;
925978 case POWER_SUPPLY_PROP_CHARGE_NOW:
926979 if (is_charging(cm)) {
927− ret = cm->fuel_gauge->get_property(cm->fuel_gauge,
980+ fuel_gauge = power_supply_get_by_name(
981+ cm->desc->psy_fuel_gauge);
982+ if (!fuel_gauge) {
983+ ret = -ENODEV;
984+ break;
985+ }
986+
987+ ret = fuel_gauge->get_property(fuel_gauge,
928988 POWER_SUPPLY_PROP_CHARGE_NOW,
929989 val);
930990 if (ret) {
@@ -970,6 +1030,7 @@ static struct power_supply psy_default = { · 39 unmodified lines
9701030 .properties = default_charger_props,
9711031 .num_properties = ARRAY_SIZE(default_charger_props),
9721032 .get_property = charger_get_property,
1033+ .no_thermal = true,
9731034 };
9741035
9751036 /**
@@ -1485,14 +1546,15 @@ err: · 509 unmodified lines
14851546 return ret;
14861547 }
14871548
1488−static int cm_init_thermal_data(struct charger_manager *cm)
1549+static int cm_init_thermal_data(struct charger_manager *cm,
1550+ struct power_supply *fuel_gauge)
14891551 {
14901552 struct charger_desc *desc = cm->desc;
14911553 union power_supply_propval val;
14921554 int ret;
14931555
14941556 /* Verify whether fuel gauge provides battery temperature */
1495− ret = cm->fuel_gauge->get_property(cm->fuel_gauge,
1557+ ret = fuel_gauge->get_property(fuel_gauge,
14961558 POWER_SUPPLY_PROP_TEMP, &val);
14971559
14981560 if (!ret) {
@@ -1502,8 +1564,6 @@ static int cm_init_thermal_data(struct charger_manager *cm) · 3 unmodified lines
15021564 cm->desc->measure_battery_temp = true;
15031565 }
15041566 #ifdef CONFIG_THERMAL
1505− cm->tzd_batt = cm->fuel_gauge->tzd;
1506−
15071567 if (ret && desc->thermal_zone) {
15081568 cm->tzd_batt =
15091569 thermal_zone_get_zone_by_name(desc->thermal_zone);
@@ -1666,6 +1726,7 @@ static int charger_manager_probe(struct platform_device *pdev) · 156 unmodified lines
16661726 int ret = 0, i = 0;
16671727 int j = 0;
16681728 union power_supply_propval val;
1729+ struct power_supply *fuel_gauge;
16691730
16701731 if (g_desc && !rtc_dev && g_desc->rtc_name) {
16711732 rtc_dev = rtc_class_open(g_desc->rtc_name);
@@ -1729,23 +1790,20 @@ static int charger_manager_probe(struct platform_device *pdev) · 57 unmodified lines
17291790 while (desc->psy_charger_stat[i])
17301791 i++;
17311792
1732− cm->charger_stat = devm_kzalloc(&pdev->dev,
1733− sizeof(struct power_supply *) * i, GFP_KERNEL);
1734− if (!cm->charger_stat)
1735− return -ENOMEM;
1736−
1793+ /* Check if charger's supplies are present at probe */
17371794 for (i = 0; desc->psy_charger_stat[i]; i++) {
1738− cm->charger_stat[i] = power_supply_get_by_name(
1739− desc->psy_charger_stat[i]);
1740− if (!cm->charger_stat[i]) {
1795+ struct power_supply *psy;
1796+
1797+ psy = power_supply_get_by_name(desc->psy_charger_stat[i]);
1798+ if (!psy) {
17411799 dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n",
17421800 desc->psy_charger_stat[i]);
17431801 return -ENODEV;
17441802 }
17451803 }
17461804
1747− cm->fuel_gauge = power_supply_get_by_name(desc->psy_fuel_gauge);
1748− if (!cm->fuel_gauge) {
1805+ fuel_gauge = power_supply_get_by_name(desc->psy_fuel_gauge);
1806+ if (!fuel_gauge) {
17491807 dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n",
17501808 desc->psy_fuel_gauge);
17511809 return -ENODEV;
@@ -1788,13 +1846,13 @@ static int charger_manager_probe(struct platform_device *pdev) · 36 unmodified lines
17881846 cm->charger_psy.num_properties = psy_default.num_properties;
17891847
17901848 /* Find which optional psy-properties are available */
1791− if (!cm->fuel_gauge->get_property(cm->fuel_gauge,
1849+ if (!fuel_gauge->get_property(fuel_gauge,
17921850 POWER_SUPPLY_PROP_CHARGE_NOW, &val)) {
17931851 cm->charger_psy.properties[cm->charger_psy.num_properties] =
17941852 POWER_SUPPLY_PROP_CHARGE_NOW;
17951853 cm->charger_psy.num_properties++;
17961854 }
1797− if (!cm->fuel_gauge->get_property(cm->fuel_gauge,
1855+ if (!fuel_gauge->get_property(fuel_gauge,
17981856 POWER_SUPPLY_PROP_CURRENT_NOW,
17991857 &val)) {
18001858 cm->charger_psy.properties[cm->charger_psy.num_properties] =
@@ -1802,7 +1860,7 @@ static int charger_manager_probe(struct platform_device *pdev) · 1 unmodified line
18021860 cm->charger_psy.num_properties++;
18031861 }
18041862
1805− ret = cm_init_thermal_data(cm);
1863+ ret = cm_init_thermal_data(cm, fuel_gauge);
18061864 if (ret) {
18071865 dev_err(&pdev->dev, "Failed to initialize thermal data\n");
18081866 cm->desc->measure_battery_temp = false;
@@ -2066,8 +2124,8 @@ static bool find_power_supply(struct charger_manager *cm, · 257 unmodified lines
20662124 int i;
20672125 bool found = false;
20682126
2069− for (i = 0; cm->charger_stat[i]; i++) {
2070− if (psy == cm->charger_stat[i]) {
2127+ for (i = 0; cm->desc->psy_charger_stat[i]; i++) {
2128+ if (!strcmp(psy->name, cm->desc->psy_charger_stat[i])) {
20712129 found = true;
20722130 break;
20732131 }
drivers/power/power_supply_core.c+3−0
@@ -417,6 +417,9 @@ static int psy_register_thermal(struct power_supply *psy) · 416 unmodified lines
417417 {
418418 int i;
419419
420+ if (psy->no_thermal)
421+ return 0;
422+
420423 /* Register battery zone device psy reports temperature */
421424 for (i = 0; i < psy->num_properties; i++) {
422425 if (psy->properties[i] == POWER_SUPPLY_PROP_TEMP) {
include/linux/power/charger-manager.h+0−3
@@ -253,9 +253,6 @@ struct charger_manager { · 252 unmodified lines
253253 struct device *dev;
254254 struct charger_desc *desc;
255255
256− struct power_supply *fuel_gauge;
257− struct power_supply **charger_stat;
258−
259256 #ifdef CONFIG_THERMAL
260257 struct thermal_zone_device *tzd_batt;
261258 #endif
include/linux/power_supply.h+6−0
@@ -200,6 +200,12 @@ struct power_supply { · 199 unmodified lines
200200 void (*external_power_changed)(struct power_supply *psy);
201201 void (*set_charged)(struct power_supply *psy);
202202
203+ /*
204+ * Set if thermal zone should not be created for this power supply.
205+ * For example for virtual supplies forwarding calls to actual
206+ * sensors or other supplies.
207+ */
208+ bool no_thermal;
203209 /* For APM emulation, think legacy userspace. */
204210 int use_for_apm;
205211