diff options
-rw-r--r-- | drivers/power/charger-manager.c | 64 | ||||
-rw-r--r-- | include/linux/power/charger-manager.h | 2 |
2 files changed, 39 insertions, 27 deletions
diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c index 7ae8cb70204a..ef8094a61f1e 100644 --- a/drivers/power/charger-manager.c +++ b/drivers/power/charger-manager.c | |||
@@ -118,10 +118,17 @@ static bool is_batt_present(struct charger_manager *cm) | |||
118 | present = true; | 118 | present = true; |
119 | break; | 119 | break; |
120 | case CM_CHARGER_STAT: | 120 | case CM_CHARGER_STAT: |
121 | for (i = 0; cm->charger_stat[i]; i++) { | 121 | for (i = 0; cm->desc->psy_charger_stat[i]; i++) { |
122 | ret = cm->charger_stat[i]->get_property( | 122 | psy = power_supply_get_by_name( |
123 | cm->charger_stat[i], | 123 | cm->desc->psy_charger_stat[i]); |
124 | POWER_SUPPLY_PROP_PRESENT, &val); | 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); | ||
125 | if (ret == 0 && val.intval) { | 132 | if (ret == 0 && val.intval) { |
126 | present = true; | 133 | present = true; |
127 | break; | 134 | break; |
@@ -144,14 +151,20 @@ static bool is_batt_present(struct charger_manager *cm) | |||
144 | static bool is_ext_pwr_online(struct charger_manager *cm) | 151 | static bool is_ext_pwr_online(struct charger_manager *cm) |
145 | { | 152 | { |
146 | union power_supply_propval val; | 153 | union power_supply_propval val; |
154 | struct power_supply *psy; | ||
147 | bool online = false; | 155 | bool online = false; |
148 | int i, ret; | 156 | int i, ret; |
149 | 157 | ||
150 | /* If at least one of them has one, it's yes. */ | 158 | /* If at least one of them has one, it's yes. */ |
151 | for (i = 0; cm->charger_stat[i]; i++) { | 159 | for (i = 0; cm->desc->psy_charger_stat[i]; i++) { |
152 | ret = cm->charger_stat[i]->get_property( | 160 | psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]); |
153 | cm->charger_stat[i], | 161 | if (!psy) { |
154 | POWER_SUPPLY_PROP_ONLINE, &val); | 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); | ||
155 | if (ret == 0 && val.intval) { | 168 | if (ret == 0 && val.intval) { |
156 | online = true; | 169 | online = true; |
157 | break; | 170 | break; |
@@ -196,6 +209,7 @@ static bool is_charging(struct charger_manager *cm) | |||
196 | { | 209 | { |
197 | int i, ret; | 210 | int i, ret; |
198 | bool charging = false; | 211 | bool charging = false; |
212 | struct power_supply *psy; | ||
199 | union power_supply_propval val; | 213 | union power_supply_propval val; |
200 | 214 | ||
201 | /* If there is no battery, it cannot be charged */ | 215 | /* If there is no battery, it cannot be charged */ |
@@ -203,17 +217,22 @@ static bool is_charging(struct charger_manager *cm) | |||
203 | return false; | 217 | return false; |
204 | 218 | ||
205 | /* If at least one of the charger is charging, return yes */ | 219 | /* If at least one of the charger is charging, return yes */ |
206 | for (i = 0; cm->charger_stat[i]; i++) { | 220 | for (i = 0; cm->desc->psy_charger_stat[i]; i++) { |
207 | /* 1. The charger sholuld not be DISABLED */ | 221 | /* 1. The charger sholuld not be DISABLED */ |
208 | if (cm->emergency_stop) | 222 | if (cm->emergency_stop) |
209 | continue; | 223 | continue; |
210 | if (!cm->charger_enabled) | 224 | if (!cm->charger_enabled) |
211 | continue; | 225 | continue; |
212 | 226 | ||
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 | |||
213 | /* 2. The charger should be online (ext-power) */ | 234 | /* 2. The charger should be online (ext-power) */ |
214 | ret = cm->charger_stat[i]->get_property( | 235 | ret = psy->get_property(psy, POWER_SUPPLY_PROP_ONLINE, &val); |
215 | cm->charger_stat[i], | ||
216 | POWER_SUPPLY_PROP_ONLINE, &val); | ||
217 | if (ret) { | 236 | if (ret) { |
218 | dev_warn(cm->dev, "Cannot read ONLINE value from %s\n", | 237 | dev_warn(cm->dev, "Cannot read ONLINE value from %s\n", |
219 | cm->desc->psy_charger_stat[i]); | 238 | cm->desc->psy_charger_stat[i]); |
@@ -226,9 +245,7 @@ static bool is_charging(struct charger_manager *cm) | |||
226 | * 3. The charger should not be FULL, DISCHARGING, | 245 | * 3. The charger should not be FULL, DISCHARGING, |
227 | * or NOT_CHARGING. | 246 | * or NOT_CHARGING. |
228 | */ | 247 | */ |
229 | ret = cm->charger_stat[i]->get_property( | 248 | ret = psy->get_property(psy, POWER_SUPPLY_PROP_STATUS, &val); |
230 | cm->charger_stat[i], | ||
231 | POWER_SUPPLY_PROP_STATUS, &val); | ||
232 | if (ret) { | 249 | if (ret) { |
233 | dev_warn(cm->dev, "Cannot read STATUS value from %s\n", | 250 | dev_warn(cm->dev, "Cannot read STATUS value from %s\n", |
234 | cm->desc->psy_charger_stat[i]); | 251 | cm->desc->psy_charger_stat[i]); |
@@ -1773,15 +1790,12 @@ static int charger_manager_probe(struct platform_device *pdev) | |||
1773 | while (desc->psy_charger_stat[i]) | 1790 | while (desc->psy_charger_stat[i]) |
1774 | i++; | 1791 | i++; |
1775 | 1792 | ||
1776 | cm->charger_stat = devm_kzalloc(&pdev->dev, | 1793 | /* Check if charger's supplies are present at probe */ |
1777 | sizeof(struct power_supply *) * i, GFP_KERNEL); | ||
1778 | if (!cm->charger_stat) | ||
1779 | return -ENOMEM; | ||
1780 | |||
1781 | for (i = 0; desc->psy_charger_stat[i]; i++) { | 1794 | for (i = 0; desc->psy_charger_stat[i]; i++) { |
1782 | cm->charger_stat[i] = power_supply_get_by_name( | 1795 | struct power_supply *psy; |
1783 | desc->psy_charger_stat[i]); | 1796 | |
1784 | if (!cm->charger_stat[i]) { | 1797 | psy = power_supply_get_by_name(desc->psy_charger_stat[i]); |
1798 | if (!psy) { | ||
1785 | dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n", | 1799 | dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n", |
1786 | desc->psy_charger_stat[i]); | 1800 | desc->psy_charger_stat[i]); |
1787 | return -ENODEV; | 1801 | return -ENODEV; |
@@ -2110,8 +2124,8 @@ static bool find_power_supply(struct charger_manager *cm, | |||
2110 | int i; | 2124 | int i; |
2111 | bool found = false; | 2125 | bool found = false; |
2112 | 2126 | ||
2113 | for (i = 0; cm->charger_stat[i]; i++) { | 2127 | for (i = 0; cm->desc->psy_charger_stat[i]; i++) { |
2114 | if (psy == cm->charger_stat[i]) { | 2128 | if (!strcmp(psy->name, cm->desc->psy_charger_stat[i])) { |
2115 | found = true; | 2129 | found = true; |
2116 | break; | 2130 | break; |
2117 | } | 2131 | } |
diff --git a/include/linux/power/charger-manager.h b/include/linux/power/charger-manager.h index 5d90d329e0ba..e97fc656a058 100644 --- a/include/linux/power/charger-manager.h +++ b/include/linux/power/charger-manager.h | |||
@@ -253,8 +253,6 @@ struct charger_manager { | |||
253 | struct device *dev; | 253 | struct device *dev; |
254 | struct charger_desc *desc; | 254 | struct charger_desc *desc; |
255 | 255 | ||
256 | struct power_supply **charger_stat; | ||
257 | |||
258 | #ifdef CONFIG_THERMAL | 256 | #ifdef CONFIG_THERMAL |
259 | struct thermal_zone_device *tzd_batt; | 257 | struct thermal_zone_device *tzd_batt; |
260 | #endif | 258 | #endif |