aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/power/charger-manager.c64
-rw-r--r--include/linux/power/charger-manager.h2
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)
144static bool is_ext_pwr_online(struct charger_manager *cm) 151static 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