diff options
Diffstat (limited to 'drivers/power/smb347-charger.c')
-rw-r--r-- | drivers/power/smb347-charger.c | 107 |
1 files changed, 58 insertions, 49 deletions
diff --git a/drivers/power/smb347-charger.c b/drivers/power/smb347-charger.c index 4396a1ffeb1a..0b60a0b5878b 100644 --- a/drivers/power/smb347-charger.c +++ b/drivers/power/smb347-charger.c | |||
@@ -139,9 +139,9 @@ struct smb347_charger { | |||
139 | struct mutex lock; | 139 | struct mutex lock; |
140 | struct device *dev; | 140 | struct device *dev; |
141 | struct regmap *regmap; | 141 | struct regmap *regmap; |
142 | struct power_supply mains; | 142 | struct power_supply *mains; |
143 | struct power_supply usb; | 143 | struct power_supply *usb; |
144 | struct power_supply battery; | 144 | struct power_supply *battery; |
145 | bool mains_online; | 145 | bool mains_online; |
146 | bool usb_online; | 146 | bool usb_online; |
147 | bool charging_enabled; | 147 | bool charging_enabled; |
@@ -741,7 +741,7 @@ static irqreturn_t smb347_interrupt(int irq, void *data) | |||
741 | */ | 741 | */ |
742 | if (stat_c & STAT_C_CHARGER_ERROR) { | 742 | if (stat_c & STAT_C_CHARGER_ERROR) { |
743 | dev_err(smb->dev, "charging stopped due to charger error\n"); | 743 | dev_err(smb->dev, "charging stopped due to charger error\n"); |
744 | power_supply_changed(&smb->battery); | 744 | power_supply_changed(smb->battery); |
745 | handled = true; | 745 | handled = true; |
746 | } | 746 | } |
747 | 747 | ||
@@ -752,7 +752,7 @@ static irqreturn_t smb347_interrupt(int irq, void *data) | |||
752 | */ | 752 | */ |
753 | if (irqstat_c & (IRQSTAT_C_TERMINATION_IRQ | IRQSTAT_C_TAPER_IRQ)) { | 753 | if (irqstat_c & (IRQSTAT_C_TERMINATION_IRQ | IRQSTAT_C_TAPER_IRQ)) { |
754 | if (irqstat_c & IRQSTAT_C_TERMINATION_STAT) | 754 | if (irqstat_c & IRQSTAT_C_TERMINATION_STAT) |
755 | power_supply_changed(&smb->battery); | 755 | power_supply_changed(smb->battery); |
756 | dev_dbg(smb->dev, "going to HW maintenance mode\n"); | 756 | dev_dbg(smb->dev, "going to HW maintenance mode\n"); |
757 | handled = true; | 757 | handled = true; |
758 | } | 758 | } |
@@ -766,7 +766,7 @@ static irqreturn_t smb347_interrupt(int irq, void *data) | |||
766 | 766 | ||
767 | if (irqstat_d & IRQSTAT_D_CHARGE_TIMEOUT_STAT) | 767 | if (irqstat_d & IRQSTAT_D_CHARGE_TIMEOUT_STAT) |
768 | dev_warn(smb->dev, "charging stopped due to timeout\n"); | 768 | dev_warn(smb->dev, "charging stopped due to timeout\n"); |
769 | power_supply_changed(&smb->battery); | 769 | power_supply_changed(smb->battery); |
770 | handled = true; | 770 | handled = true; |
771 | } | 771 | } |
772 | 772 | ||
@@ -778,9 +778,9 @@ static irqreturn_t smb347_interrupt(int irq, void *data) | |||
778 | if (smb347_update_ps_status(smb) > 0) { | 778 | if (smb347_update_ps_status(smb) > 0) { |
779 | smb347_start_stop_charging(smb); | 779 | smb347_start_stop_charging(smb); |
780 | if (smb->pdata->use_mains) | 780 | if (smb->pdata->use_mains) |
781 | power_supply_changed(&smb->mains); | 781 | power_supply_changed(smb->mains); |
782 | if (smb->pdata->use_usb) | 782 | if (smb->pdata->use_usb) |
783 | power_supply_changed(&smb->usb); | 783 | power_supply_changed(smb->usb); |
784 | } | 784 | } |
785 | handled = true; | 785 | handled = true; |
786 | } | 786 | } |
@@ -935,8 +935,7 @@ static int smb347_mains_get_property(struct power_supply *psy, | |||
935 | enum power_supply_property prop, | 935 | enum power_supply_property prop, |
936 | union power_supply_propval *val) | 936 | union power_supply_propval *val) |
937 | { | 937 | { |
938 | struct smb347_charger *smb = | 938 | struct smb347_charger *smb = power_supply_get_drvdata(psy); |
939 | container_of(psy, struct smb347_charger, mains); | ||
940 | int ret; | 939 | int ret; |
941 | 940 | ||
942 | switch (prop) { | 941 | switch (prop) { |
@@ -977,8 +976,7 @@ static int smb347_usb_get_property(struct power_supply *psy, | |||
977 | enum power_supply_property prop, | 976 | enum power_supply_property prop, |
978 | union power_supply_propval *val) | 977 | union power_supply_propval *val) |
979 | { | 978 | { |
980 | struct smb347_charger *smb = | 979 | struct smb347_charger *smb = power_supply_get_drvdata(psy); |
981 | container_of(psy, struct smb347_charger, usb); | ||
982 | int ret; | 980 | int ret; |
983 | 981 | ||
984 | switch (prop) { | 982 | switch (prop) { |
@@ -1064,8 +1062,7 @@ static int smb347_battery_get_property(struct power_supply *psy, | |||
1064 | enum power_supply_property prop, | 1062 | enum power_supply_property prop, |
1065 | union power_supply_propval *val) | 1063 | union power_supply_propval *val) |
1066 | { | 1064 | { |
1067 | struct smb347_charger *smb = | 1065 | struct smb347_charger *smb = power_supply_get_drvdata(psy); |
1068 | container_of(psy, struct smb347_charger, battery); | ||
1069 | const struct smb347_charger_platform_data *pdata = smb->pdata; | 1066 | const struct smb347_charger_platform_data *pdata = smb->pdata; |
1070 | int ret; | 1067 | int ret; |
1071 | 1068 | ||
@@ -1189,12 +1186,36 @@ static const struct regmap_config smb347_regmap = { | |||
1189 | .readable_reg = smb347_readable_reg, | 1186 | .readable_reg = smb347_readable_reg, |
1190 | }; | 1187 | }; |
1191 | 1188 | ||
1189 | static const struct power_supply_desc smb347_mains_desc = { | ||
1190 | .name = "smb347-mains", | ||
1191 | .type = POWER_SUPPLY_TYPE_MAINS, | ||
1192 | .get_property = smb347_mains_get_property, | ||
1193 | .properties = smb347_mains_properties, | ||
1194 | .num_properties = ARRAY_SIZE(smb347_mains_properties), | ||
1195 | }; | ||
1196 | |||
1197 | static const struct power_supply_desc smb347_usb_desc = { | ||
1198 | .name = "smb347-usb", | ||
1199 | .type = POWER_SUPPLY_TYPE_USB, | ||
1200 | .get_property = smb347_usb_get_property, | ||
1201 | .properties = smb347_usb_properties, | ||
1202 | .num_properties = ARRAY_SIZE(smb347_usb_properties), | ||
1203 | }; | ||
1204 | |||
1205 | static const struct power_supply_desc smb347_battery_desc = { | ||
1206 | .name = "smb347-battery", | ||
1207 | .type = POWER_SUPPLY_TYPE_BATTERY, | ||
1208 | .get_property = smb347_battery_get_property, | ||
1209 | .properties = smb347_battery_properties, | ||
1210 | .num_properties = ARRAY_SIZE(smb347_battery_properties), | ||
1211 | }; | ||
1212 | |||
1192 | static int smb347_probe(struct i2c_client *client, | 1213 | static int smb347_probe(struct i2c_client *client, |
1193 | const struct i2c_device_id *id) | 1214 | const struct i2c_device_id *id) |
1194 | { | 1215 | { |
1195 | static char *battery[] = { "smb347-battery" }; | 1216 | static char *battery[] = { "smb347-battery" }; |
1196 | const struct smb347_charger_platform_data *pdata; | 1217 | const struct smb347_charger_platform_data *pdata; |
1197 | struct power_supply_config psy_cfg = {}; /* Only for mains and usb */ | 1218 | struct power_supply_config mains_usb_cfg = {}, battery_cfg = {}; |
1198 | struct device *dev = &client->dev; | 1219 | struct device *dev = &client->dev; |
1199 | struct smb347_charger *smb; | 1220 | struct smb347_charger *smb; |
1200 | int ret; | 1221 | int ret; |
@@ -1224,47 +1245,35 @@ static int smb347_probe(struct i2c_client *client, | |||
1224 | if (ret < 0) | 1245 | if (ret < 0) |
1225 | return ret; | 1246 | return ret; |
1226 | 1247 | ||
1227 | psy_cfg.supplied_to = battery; | 1248 | mains_usb_cfg.supplied_to = battery; |
1228 | psy_cfg.num_supplicants = ARRAY_SIZE(battery); | 1249 | mains_usb_cfg.num_supplicants = ARRAY_SIZE(battery); |
1250 | mains_usb_cfg.drv_data = smb; | ||
1229 | if (smb->pdata->use_mains) { | 1251 | if (smb->pdata->use_mains) { |
1230 | smb->mains.name = "smb347-mains"; | 1252 | smb->mains = power_supply_register(dev, &smb347_mains_desc, |
1231 | smb->mains.type = POWER_SUPPLY_TYPE_MAINS; | 1253 | &mains_usb_cfg); |
1232 | smb->mains.get_property = smb347_mains_get_property; | 1254 | if (IS_ERR(smb->mains)) |
1233 | smb->mains.properties = smb347_mains_properties; | 1255 | return PTR_ERR(smb->mains); |
1234 | smb->mains.num_properties = ARRAY_SIZE(smb347_mains_properties); | ||
1235 | ret = power_supply_register(dev, &smb->mains, &psy_cfg); | ||
1236 | if (ret < 0) | ||
1237 | return ret; | ||
1238 | } | 1256 | } |
1239 | 1257 | ||
1240 | if (smb->pdata->use_usb) { | 1258 | if (smb->pdata->use_usb) { |
1241 | smb->usb.name = "smb347-usb"; | 1259 | smb->usb = power_supply_register(dev, &smb347_usb_desc, |
1242 | smb->usb.type = POWER_SUPPLY_TYPE_USB; | 1260 | &mains_usb_cfg); |
1243 | smb->usb.get_property = smb347_usb_get_property; | 1261 | if (IS_ERR(smb->usb)) { |
1244 | smb->usb.properties = smb347_usb_properties; | ||
1245 | smb->usb.num_properties = ARRAY_SIZE(smb347_usb_properties); | ||
1246 | ret = power_supply_register(dev, &smb->usb, &psy_cfg); | ||
1247 | if (ret < 0) { | ||
1248 | if (smb->pdata->use_mains) | 1262 | if (smb->pdata->use_mains) |
1249 | power_supply_unregister(&smb->mains); | 1263 | power_supply_unregister(smb->mains); |
1250 | return ret; | 1264 | return PTR_ERR(smb->usb); |
1251 | } | 1265 | } |
1252 | } | 1266 | } |
1253 | 1267 | ||
1254 | smb->battery.name = "smb347-battery"; | 1268 | battery_cfg.drv_data = smb; |
1255 | smb->battery.type = POWER_SUPPLY_TYPE_BATTERY; | 1269 | smb->battery = power_supply_register(dev, &smb347_battery_desc, |
1256 | smb->battery.get_property = smb347_battery_get_property; | 1270 | &battery_cfg); |
1257 | smb->battery.properties = smb347_battery_properties; | 1271 | if (IS_ERR(smb->battery)) { |
1258 | smb->battery.num_properties = ARRAY_SIZE(smb347_battery_properties); | ||
1259 | |||
1260 | |||
1261 | ret = power_supply_register(dev, &smb->battery, NULL); | ||
1262 | if (ret < 0) { | ||
1263 | if (smb->pdata->use_usb) | 1272 | if (smb->pdata->use_usb) |
1264 | power_supply_unregister(&smb->usb); | 1273 | power_supply_unregister(smb->usb); |
1265 | if (smb->pdata->use_mains) | 1274 | if (smb->pdata->use_mains) |
1266 | power_supply_unregister(&smb->mains); | 1275 | power_supply_unregister(smb->mains); |
1267 | return ret; | 1276 | return PTR_ERR(smb->battery); |
1268 | } | 1277 | } |
1269 | 1278 | ||
1270 | /* | 1279 | /* |
@@ -1294,11 +1303,11 @@ static int smb347_remove(struct i2c_client *client) | |||
1294 | gpio_free(smb->pdata->irq_gpio); | 1303 | gpio_free(smb->pdata->irq_gpio); |
1295 | } | 1304 | } |
1296 | 1305 | ||
1297 | power_supply_unregister(&smb->battery); | 1306 | power_supply_unregister(smb->battery); |
1298 | if (smb->pdata->use_usb) | 1307 | if (smb->pdata->use_usb) |
1299 | power_supply_unregister(&smb->usb); | 1308 | power_supply_unregister(smb->usb); |
1300 | if (smb->pdata->use_mains) | 1309 | if (smb->pdata->use_mains) |
1301 | power_supply_unregister(&smb->mains); | 1310 | power_supply_unregister(smb->mains); |
1302 | return 0; | 1311 | return 0; |
1303 | } | 1312 | } |
1304 | 1313 | ||