Lines Matching refs:smb
232 static int smb347_update_ps_status(struct smb347_charger *smb) in smb347_update_ps_status() argument
239 ret = regmap_read(smb->regmap, IRQSTAT_E, &val); in smb347_update_ps_status()
247 if (smb->pdata->use_mains) in smb347_update_ps_status()
249 if (smb->pdata->use_usb) in smb347_update_ps_status()
252 mutex_lock(&smb->lock); in smb347_update_ps_status()
253 ret = smb->mains_online != dc || smb->usb_online != usb; in smb347_update_ps_status()
254 smb->mains_online = dc; in smb347_update_ps_status()
255 smb->usb_online = usb; in smb347_update_ps_status()
256 mutex_unlock(&smb->lock); in smb347_update_ps_status()
270 static bool smb347_is_ps_online(struct smb347_charger *smb) in smb347_is_ps_online() argument
274 mutex_lock(&smb->lock); in smb347_is_ps_online()
275 ret = smb->usb_online || smb->mains_online; in smb347_is_ps_online()
276 mutex_unlock(&smb->lock); in smb347_is_ps_online()
288 static int smb347_charging_status(struct smb347_charger *smb) in smb347_charging_status() argument
293 if (!smb347_is_ps_online(smb)) in smb347_charging_status()
296 ret = regmap_read(smb->regmap, STAT_C, &val); in smb347_charging_status()
303 static int smb347_charging_set(struct smb347_charger *smb, bool enable) in smb347_charging_set() argument
307 if (smb->pdata->enable_control != SMB347_CHG_ENABLE_SW) { in smb347_charging_set()
308 dev_dbg(smb->dev, "charging enable/disable in SW disabled\n"); in smb347_charging_set()
312 mutex_lock(&smb->lock); in smb347_charging_set()
313 if (smb->charging_enabled != enable) { in smb347_charging_set()
314 ret = regmap_update_bits(smb->regmap, CMD_A, CMD_A_CHG_ENABLED, in smb347_charging_set()
317 smb->charging_enabled = enable; in smb347_charging_set()
319 mutex_unlock(&smb->lock); in smb347_charging_set()
323 static inline int smb347_charging_enable(struct smb347_charger *smb) in smb347_charging_enable() argument
325 return smb347_charging_set(smb, true); in smb347_charging_enable()
328 static inline int smb347_charging_disable(struct smb347_charger *smb) in smb347_charging_disable() argument
330 return smb347_charging_set(smb, false); in smb347_charging_disable()
333 static int smb347_start_stop_charging(struct smb347_charger *smb) in smb347_start_stop_charging() argument
342 if (smb347_is_ps_online(smb)) { in smb347_start_stop_charging()
343 ret = smb347_charging_enable(smb); in smb347_start_stop_charging()
345 dev_err(smb->dev, "failed to enable charging\n"); in smb347_start_stop_charging()
347 ret = smb347_charging_disable(smb); in smb347_start_stop_charging()
349 dev_err(smb->dev, "failed to disable charging\n"); in smb347_start_stop_charging()
355 static int smb347_set_charge_current(struct smb347_charger *smb) in smb347_set_charge_current() argument
359 if (smb->pdata->max_charge_current) { in smb347_set_charge_current()
361 smb->pdata->max_charge_current); in smb347_set_charge_current()
365 ret = regmap_update_bits(smb->regmap, CFG_CHARGE_CURRENT, in smb347_set_charge_current()
372 if (smb->pdata->pre_charge_current) { in smb347_set_charge_current()
374 smb->pdata->pre_charge_current); in smb347_set_charge_current()
378 ret = regmap_update_bits(smb->regmap, CFG_CHARGE_CURRENT, in smb347_set_charge_current()
385 if (smb->pdata->termination_current) { in smb347_set_charge_current()
387 smb->pdata->termination_current); in smb347_set_charge_current()
391 ret = regmap_update_bits(smb->regmap, CFG_CHARGE_CURRENT, in smb347_set_charge_current()
400 static int smb347_set_current_limits(struct smb347_charger *smb) in smb347_set_current_limits() argument
404 if (smb->pdata->mains_current_limit) { in smb347_set_current_limits()
406 smb->pdata->mains_current_limit); in smb347_set_current_limits()
410 ret = regmap_update_bits(smb->regmap, CFG_CURRENT_LIMIT, in smb347_set_current_limits()
417 if (smb->pdata->usb_hc_current_limit) { in smb347_set_current_limits()
419 smb->pdata->usb_hc_current_limit); in smb347_set_current_limits()
423 ret = regmap_update_bits(smb->regmap, CFG_CURRENT_LIMIT, in smb347_set_current_limits()
432 static int smb347_set_voltage_limits(struct smb347_charger *smb) in smb347_set_voltage_limits() argument
436 if (smb->pdata->pre_to_fast_voltage) { in smb347_set_voltage_limits()
437 ret = smb->pdata->pre_to_fast_voltage; in smb347_set_voltage_limits()
443 ret = regmap_update_bits(smb->regmap, CFG_FLOAT_VOLTAGE, in smb347_set_voltage_limits()
450 if (smb->pdata->max_charge_voltage) { in smb347_set_voltage_limits()
451 ret = smb->pdata->max_charge_voltage; in smb347_set_voltage_limits()
457 ret = regmap_update_bits(smb->regmap, CFG_FLOAT_VOLTAGE, in smb347_set_voltage_limits()
466 static int smb347_set_temp_limits(struct smb347_charger *smb) in smb347_set_temp_limits() argument
472 if (smb->pdata->chip_temp_threshold) { in smb347_set_temp_limits()
473 val = smb->pdata->chip_temp_threshold; in smb347_set_temp_limits()
479 ret = regmap_update_bits(smb->regmap, CFG_OTG, in smb347_set_temp_limits()
486 if (smb->pdata->soft_cold_temp_limit != SMB347_TEMP_USE_DEFAULT) { in smb347_set_temp_limits()
487 val = smb->pdata->soft_cold_temp_limit; in smb347_set_temp_limits()
494 ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT, in smb347_set_temp_limits()
503 if (smb->pdata->soft_hot_temp_limit != SMB347_TEMP_USE_DEFAULT) { in smb347_set_temp_limits()
504 val = smb->pdata->soft_hot_temp_limit; in smb347_set_temp_limits()
509 ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT, in smb347_set_temp_limits()
518 if (smb->pdata->hard_cold_temp_limit != SMB347_TEMP_USE_DEFAULT) { in smb347_set_temp_limits()
519 val = smb->pdata->hard_cold_temp_limit; in smb347_set_temp_limits()
526 ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT, in smb347_set_temp_limits()
535 if (smb->pdata->hard_hot_temp_limit != SMB347_TEMP_USE_DEFAULT) { in smb347_set_temp_limits()
536 val = smb->pdata->hard_hot_temp_limit; in smb347_set_temp_limits()
541 ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT, in smb347_set_temp_limits()
561 ret = regmap_update_bits(smb->regmap, CFG_THERM, in smb347_set_temp_limits()
567 if (smb->pdata->suspend_on_hard_temp_limit) { in smb347_set_temp_limits()
568 ret = regmap_update_bits(smb->regmap, CFG_SYSOK, in smb347_set_temp_limits()
574 if (smb->pdata->soft_temp_limit_compensation != in smb347_set_temp_limits()
576 val = smb->pdata->soft_temp_limit_compensation & 0x3; in smb347_set_temp_limits()
578 ret = regmap_update_bits(smb->regmap, CFG_THERM, in smb347_set_temp_limits()
584 ret = regmap_update_bits(smb->regmap, CFG_THERM, in smb347_set_temp_limits()
591 if (smb->pdata->charge_current_compensation) { in smb347_set_temp_limits()
593 smb->pdata->charge_current_compensation); in smb347_set_temp_limits()
597 ret = regmap_update_bits(smb->regmap, CFG_OTG, in smb347_set_temp_limits()
616 static int smb347_set_writable(struct smb347_charger *smb, bool writable) in smb347_set_writable() argument
618 return regmap_update_bits(smb->regmap, CMD_A, CMD_A_ALLOW_WRITE, in smb347_set_writable()
622 static int smb347_hw_init(struct smb347_charger *smb) in smb347_hw_init() argument
627 ret = smb347_set_writable(smb, true); in smb347_hw_init()
635 ret = smb347_set_charge_current(smb); in smb347_hw_init()
639 ret = smb347_set_current_limits(smb); in smb347_hw_init()
643 ret = smb347_set_voltage_limits(smb); in smb347_hw_init()
647 ret = smb347_set_temp_limits(smb); in smb347_hw_init()
652 if (!smb->pdata->use_usb) { in smb347_hw_init()
653 ret = regmap_update_bits(smb->regmap, CMD_A, in smb347_hw_init()
664 ret = regmap_update_bits(smb->regmap, CFG_OTHER, CFG_OTHER_RID_MASK, in smb347_hw_init()
665 smb->pdata->use_usb_otg ? CFG_OTHER_RID_ENABLED_AUTO_OTG : 0); in smb347_hw_init()
674 switch (smb->pdata->enable_control) { in smb347_hw_init()
686 ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_CTRL_MASK, in smb347_hw_init()
692 ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_APSD_IRQ, 0); in smb347_hw_init()
696 ret = smb347_update_ps_status(smb); in smb347_hw_init()
700 ret = smb347_start_stop_charging(smb); in smb347_hw_init()
703 smb347_set_writable(smb, false); in smb347_hw_init()
709 struct smb347_charger *smb = data; in smb347_interrupt() local
714 ret = regmap_read(smb->regmap, STAT_C, &stat_c); in smb347_interrupt()
716 dev_warn(smb->dev, "reading STAT_C failed\n"); in smb347_interrupt()
720 ret = regmap_read(smb->regmap, IRQSTAT_C, &irqstat_c); in smb347_interrupt()
722 dev_warn(smb->dev, "reading IRQSTAT_C failed\n"); in smb347_interrupt()
726 ret = regmap_read(smb->regmap, IRQSTAT_D, &irqstat_d); in smb347_interrupt()
728 dev_warn(smb->dev, "reading IRQSTAT_D failed\n"); in smb347_interrupt()
732 ret = regmap_read(smb->regmap, IRQSTAT_E, &irqstat_e); in smb347_interrupt()
734 dev_warn(smb->dev, "reading IRQSTAT_E failed\n"); in smb347_interrupt()
743 dev_err(smb->dev, "charging stopped due to charger error\n"); in smb347_interrupt()
744 power_supply_changed(smb->battery); in smb347_interrupt()
755 power_supply_changed(smb->battery); in smb347_interrupt()
756 dev_dbg(smb->dev, "going to HW maintenance mode\n"); in smb347_interrupt()
765 dev_dbg(smb->dev, "total Charge Timeout INT received\n"); in smb347_interrupt()
768 dev_warn(smb->dev, "charging stopped due to timeout\n"); in smb347_interrupt()
769 power_supply_changed(smb->battery); in smb347_interrupt()
778 if (smb347_update_ps_status(smb) > 0) { in smb347_interrupt()
779 smb347_start_stop_charging(smb); in smb347_interrupt()
780 if (smb->pdata->use_mains) in smb347_interrupt()
781 power_supply_changed(smb->mains); in smb347_interrupt()
782 if (smb->pdata->use_usb) in smb347_interrupt()
783 power_supply_changed(smb->usb); in smb347_interrupt()
791 static int smb347_irq_set(struct smb347_charger *smb, bool enable) in smb347_irq_set() argument
795 ret = smb347_set_writable(smb, true); in smb347_irq_set()
806 ret = regmap_update_bits(smb->regmap, CFG_FAULT_IRQ, 0xff, in smb347_irq_set()
811 ret = regmap_update_bits(smb->regmap, CFG_STATUS_IRQ, 0xff, in smb347_irq_set()
817 ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_CHARGER_ERROR, in smb347_irq_set()
820 smb347_set_writable(smb, false); in smb347_irq_set()
824 static inline int smb347_irq_enable(struct smb347_charger *smb) in smb347_irq_enable() argument
826 return smb347_irq_set(smb, true); in smb347_irq_enable()
829 static inline int smb347_irq_disable(struct smb347_charger *smb) in smb347_irq_disable() argument
831 return smb347_irq_set(smb, false); in smb347_irq_disable()
834 static int smb347_irq_init(struct smb347_charger *smb, in smb347_irq_init() argument
837 const struct smb347_charger_platform_data *pdata = smb->pdata; in smb347_irq_init()
846 client->name, smb); in smb347_irq_init()
850 ret = smb347_set_writable(smb, true); in smb347_irq_init()
858 ret = regmap_update_bits(smb->regmap, CFG_STAT, in smb347_irq_init()
864 smb347_set_writable(smb, false); in smb347_irq_init()
869 smb347_set_writable(smb, false); in smb347_irq_init()
871 free_irq(irq, smb); in smb347_irq_init()
883 static int get_const_charge_current(struct smb347_charger *smb) in get_const_charge_current() argument
888 if (!smb347_is_ps_online(smb)) in get_const_charge_current()
891 ret = regmap_read(smb->regmap, STAT_B, &v); in get_const_charge_current()
913 static int get_const_charge_voltage(struct smb347_charger *smb) in get_const_charge_voltage() argument
918 if (!smb347_is_ps_online(smb)) in get_const_charge_voltage()
921 ret = regmap_read(smb->regmap, STAT_A, &v); in get_const_charge_voltage()
938 struct smb347_charger *smb = power_supply_get_drvdata(psy); in smb347_mains_get_property() local
943 val->intval = smb->mains_online; in smb347_mains_get_property()
947 ret = get_const_charge_voltage(smb); in smb347_mains_get_property()
955 ret = get_const_charge_current(smb); in smb347_mains_get_property()
979 struct smb347_charger *smb = power_supply_get_drvdata(psy); in smb347_usb_get_property() local
984 val->intval = smb->usb_online; in smb347_usb_get_property()
988 ret = get_const_charge_voltage(smb); in smb347_usb_get_property()
996 ret = get_const_charge_current(smb); in smb347_usb_get_property()
1016 static int smb347_get_charging_status(struct smb347_charger *smb) in smb347_get_charging_status() argument
1021 if (!smb347_is_ps_online(smb)) in smb347_get_charging_status()
1024 ret = regmap_read(smb->regmap, STAT_C, &val); in smb347_get_charging_status()
1065 struct smb347_charger *smb = power_supply_get_drvdata(psy); in smb347_battery_get_property() local
1066 const struct smb347_charger_platform_data *pdata = smb->pdata; in smb347_battery_get_property()
1069 ret = smb347_update_ps_status(smb); in smb347_battery_get_property()
1075 ret = smb347_get_charging_status(smb); in smb347_battery_get_property()
1082 if (!smb347_is_ps_online(smb)) in smb347_battery_get_property()
1089 switch (smb347_charging_status(smb)) { in smb347_battery_get_property()
1220 struct smb347_charger *smb; in smb347_probe() local
1230 smb = devm_kzalloc(dev, sizeof(*smb), GFP_KERNEL); in smb347_probe()
1231 if (!smb) in smb347_probe()
1234 i2c_set_clientdata(client, smb); in smb347_probe()
1236 mutex_init(&smb->lock); in smb347_probe()
1237 smb->dev = &client->dev; in smb347_probe()
1238 smb->pdata = pdata; in smb347_probe()
1240 smb->regmap = devm_regmap_init_i2c(client, &smb347_regmap); in smb347_probe()
1241 if (IS_ERR(smb->regmap)) in smb347_probe()
1242 return PTR_ERR(smb->regmap); in smb347_probe()
1244 ret = smb347_hw_init(smb); in smb347_probe()
1250 mains_usb_cfg.drv_data = smb; in smb347_probe()
1251 if (smb->pdata->use_mains) { in smb347_probe()
1252 smb->mains = power_supply_register(dev, &smb347_mains_desc, in smb347_probe()
1254 if (IS_ERR(smb->mains)) in smb347_probe()
1255 return PTR_ERR(smb->mains); in smb347_probe()
1258 if (smb->pdata->use_usb) { in smb347_probe()
1259 smb->usb = power_supply_register(dev, &smb347_usb_desc, in smb347_probe()
1261 if (IS_ERR(smb->usb)) { in smb347_probe()
1262 if (smb->pdata->use_mains) in smb347_probe()
1263 power_supply_unregister(smb->mains); in smb347_probe()
1264 return PTR_ERR(smb->usb); in smb347_probe()
1268 battery_cfg.drv_data = smb; in smb347_probe()
1269 smb->battery = power_supply_register(dev, &smb347_battery_desc, in smb347_probe()
1271 if (IS_ERR(smb->battery)) { in smb347_probe()
1272 if (smb->pdata->use_usb) in smb347_probe()
1273 power_supply_unregister(smb->usb); in smb347_probe()
1274 if (smb->pdata->use_mains) in smb347_probe()
1275 power_supply_unregister(smb->mains); in smb347_probe()
1276 return PTR_ERR(smb->battery); in smb347_probe()
1284 ret = smb347_irq_init(smb, client); in smb347_probe()
1289 smb347_irq_enable(smb); in smb347_probe()
1298 struct smb347_charger *smb = i2c_get_clientdata(client); in smb347_remove() local
1301 smb347_irq_disable(smb); in smb347_remove()
1302 free_irq(client->irq, smb); in smb347_remove()
1303 gpio_free(smb->pdata->irq_gpio); in smb347_remove()
1306 power_supply_unregister(smb->battery); in smb347_remove()
1307 if (smb->pdata->use_usb) in smb347_remove()
1308 power_supply_unregister(smb->usb); in smb347_remove()
1309 if (smb->pdata->use_mains) in smb347_remove()
1310 power_supply_unregister(smb->mains); in smb347_remove()