summaryrefslogtreecommitdiffstats
path: root/drivers/power/smb347-charger.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/power/smb347-charger.c')
-rw-r--r--drivers/power/smb347-charger.c107
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
1189static 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
1197static 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
1205static 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
1192static int smb347_probe(struct i2c_client *client, 1213static 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