Lines Matching refs:smb
298 static int smb347_update_ps_status(struct smb347_charger *smb) in smb347_update_ps_status() argument
305 ret = regmap_read(smb->regmap, IRQSTAT_E, &val); in smb347_update_ps_status()
313 if (smb->use_mains) in smb347_update_ps_status()
315 if (smb->use_usb) in smb347_update_ps_status()
318 ret = smb->mains_online != dc || smb->usb_online != usb; in smb347_update_ps_status()
319 smb->mains_online = dc; in smb347_update_ps_status()
320 smb->usb_online = usb; in smb347_update_ps_status()
334 static bool smb347_is_ps_online(struct smb347_charger *smb) in smb347_is_ps_online() argument
336 return smb->usb_online || smb->mains_online; in smb347_is_ps_online()
346 static int smb347_charging_status(struct smb347_charger *smb) in smb347_charging_status() argument
351 if (!smb347_is_ps_online(smb)) in smb347_charging_status()
354 ret = regmap_read(smb->regmap, STAT_C, &val); in smb347_charging_status()
361 static int smb347_charging_set(struct smb347_charger *smb, bool enable) in smb347_charging_set() argument
365 if (smb->enable_control != SMB3XX_CHG_ENABLE_SW) { in smb347_charging_set()
366 dev_dbg(smb->dev, "charging enable/disable in SW disabled\n"); in smb347_charging_set()
370 if (smb->charging_enabled != enable) { in smb347_charging_set()
371 ret = regmap_update_bits(smb->regmap, CMD_A, CMD_A_CHG_ENABLED, in smb347_charging_set()
374 smb->charging_enabled = enable; in smb347_charging_set()
380 static inline int smb347_charging_enable(struct smb347_charger *smb) in smb347_charging_enable() argument
382 return smb347_charging_set(smb, true); in smb347_charging_enable()
385 static inline int smb347_charging_disable(struct smb347_charger *smb) in smb347_charging_disable() argument
387 return smb347_charging_set(smb, false); in smb347_charging_disable()
390 static int smb347_start_stop_charging(struct smb347_charger *smb) in smb347_start_stop_charging() argument
399 if (smb347_is_ps_online(smb)) { in smb347_start_stop_charging()
400 ret = smb347_charging_enable(smb); in smb347_start_stop_charging()
402 dev_err(smb->dev, "failed to enable charging\n"); in smb347_start_stop_charging()
404 ret = smb347_charging_disable(smb); in smb347_start_stop_charging()
406 dev_err(smb->dev, "failed to disable charging\n"); in smb347_start_stop_charging()
412 static int smb347_set_charge_current(struct smb347_charger *smb) in smb347_set_charge_current() argument
414 unsigned int id = smb->id; in smb347_set_charge_current()
417 if (smb->max_charge_current) { in smb347_set_charge_current()
419 smb->max_charge_current); in smb347_set_charge_current()
423 ret = regmap_update_bits(smb->regmap, CFG_CHARGE_CURRENT, in smb347_set_charge_current()
430 if (smb->pre_charge_current) { in smb347_set_charge_current()
432 smb->pre_charge_current); in smb347_set_charge_current()
436 ret = regmap_update_bits(smb->regmap, CFG_CHARGE_CURRENT, in smb347_set_charge_current()
443 if (smb->termination_current) { in smb347_set_charge_current()
445 smb->termination_current); in smb347_set_charge_current()
449 ret = regmap_update_bits(smb->regmap, CFG_CHARGE_CURRENT, in smb347_set_charge_current()
458 static int smb347_set_current_limits(struct smb347_charger *smb) in smb347_set_current_limits() argument
460 unsigned int id = smb->id; in smb347_set_current_limits()
463 if (smb->mains_current_limit) { in smb347_set_current_limits()
465 smb->mains_current_limit); in smb347_set_current_limits()
469 ret = regmap_update_bits(smb->regmap, CFG_CURRENT_LIMIT, in smb347_set_current_limits()
476 if (smb->usb_hc_current_limit) { in smb347_set_current_limits()
478 smb->usb_hc_current_limit); in smb347_set_current_limits()
482 ret = regmap_update_bits(smb->regmap, CFG_CURRENT_LIMIT, in smb347_set_current_limits()
491 static int smb347_set_voltage_limits(struct smb347_charger *smb) in smb347_set_voltage_limits() argument
495 if (smb->pre_to_fast_voltage) { in smb347_set_voltage_limits()
496 ret = smb->pre_to_fast_voltage; in smb347_set_voltage_limits()
502 ret = regmap_update_bits(smb->regmap, CFG_FLOAT_VOLTAGE, in smb347_set_voltage_limits()
509 if (smb->max_charge_voltage) { in smb347_set_voltage_limits()
510 ret = smb->max_charge_voltage; in smb347_set_voltage_limits()
516 ret = regmap_update_bits(smb->regmap, CFG_FLOAT_VOLTAGE, in smb347_set_voltage_limits()
525 static int smb347_set_temp_limits(struct smb347_charger *smb) in smb347_set_temp_limits() argument
527 unsigned int id = smb->id; in smb347_set_temp_limits()
532 if (smb->chip_temp_threshold) { in smb347_set_temp_limits()
533 val = smb->chip_temp_threshold; in smb347_set_temp_limits()
539 ret = regmap_update_bits(smb->regmap, CFG_OTG, in smb347_set_temp_limits()
546 if (smb->soft_cold_temp_limit != SMB3XX_TEMP_USE_DEFAULT) { in smb347_set_temp_limits()
547 val = smb->soft_cold_temp_limit; in smb347_set_temp_limits()
554 ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT, in smb347_set_temp_limits()
563 if (smb->soft_hot_temp_limit != SMB3XX_TEMP_USE_DEFAULT) { in smb347_set_temp_limits()
564 val = smb->soft_hot_temp_limit; in smb347_set_temp_limits()
569 ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT, in smb347_set_temp_limits()
578 if (smb->hard_cold_temp_limit != SMB3XX_TEMP_USE_DEFAULT) { in smb347_set_temp_limits()
579 val = smb->hard_cold_temp_limit; in smb347_set_temp_limits()
586 ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT, in smb347_set_temp_limits()
595 if (smb->hard_hot_temp_limit != SMB3XX_TEMP_USE_DEFAULT) { in smb347_set_temp_limits()
596 val = smb->hard_hot_temp_limit; in smb347_set_temp_limits()
601 ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT, in smb347_set_temp_limits()
621 ret = regmap_update_bits(smb->regmap, CFG_THERM, in smb347_set_temp_limits()
627 if (smb->suspend_on_hard_temp_limit) { in smb347_set_temp_limits()
628 ret = regmap_update_bits(smb->regmap, CFG_SYSOK, in smb347_set_temp_limits()
634 if (smb->soft_temp_limit_compensation != in smb347_set_temp_limits()
636 val = smb->soft_temp_limit_compensation & 0x3; in smb347_set_temp_limits()
638 ret = regmap_update_bits(smb->regmap, CFG_THERM, in smb347_set_temp_limits()
644 ret = regmap_update_bits(smb->regmap, CFG_THERM, in smb347_set_temp_limits()
651 if (smb->charge_current_compensation) { in smb347_set_temp_limits()
653 smb->charge_current_compensation); in smb347_set_temp_limits()
657 ret = regmap_update_bits(smb->regmap, CFG_OTG, in smb347_set_temp_limits()
676 static int smb347_set_writable(struct smb347_charger *smb, bool writable) in smb347_set_writable() argument
678 return regmap_update_bits(smb->regmap, CMD_A, CMD_A_ALLOW_WRITE, in smb347_set_writable()
682 static int smb347_hw_init(struct smb347_charger *smb) in smb347_hw_init() argument
687 ret = smb347_set_writable(smb, true); in smb347_hw_init()
695 ret = smb347_set_charge_current(smb); in smb347_hw_init()
699 ret = smb347_set_current_limits(smb); in smb347_hw_init()
703 ret = smb347_set_voltage_limits(smb); in smb347_hw_init()
707 ret = smb347_set_temp_limits(smb); in smb347_hw_init()
712 if (!smb->use_usb) { in smb347_hw_init()
713 ret = regmap_update_bits(smb->regmap, CMD_A, in smb347_hw_init()
724 ret = regmap_update_bits(smb->regmap, CFG_OTHER, CFG_OTHER_RID_MASK, in smb347_hw_init()
725 smb->use_usb_otg ? CFG_OTHER_RID_ENABLED_AUTO_OTG : 0); in smb347_hw_init()
730 switch (smb->enable_control) { in smb347_hw_init()
733 ret = regmap_set_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_CTRL); in smb347_hw_init()
743 switch (smb->enable_control) { in smb347_hw_init()
755 ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_CTRL_MASK, in smb347_hw_init()
761 ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_APSD_IRQ, 0); in smb347_hw_init()
765 ret = smb347_update_ps_status(smb); in smb347_hw_init()
769 ret = smb347_start_stop_charging(smb); in smb347_hw_init()
772 smb347_set_writable(smb, false); in smb347_hw_init()
778 struct smb347_charger *smb = data; in smb347_interrupt() local
786 ret = regmap_read(smb->regmap, STAT_C, &stat_c); in smb347_interrupt()
788 dev_warn(smb->dev, "reading STAT_C failed\n"); in smb347_interrupt()
792 ret = regmap_read(smb->regmap, IRQSTAT_C, &irqstat_c); in smb347_interrupt()
794 dev_warn(smb->dev, "reading IRQSTAT_C failed\n"); in smb347_interrupt()
798 ret = regmap_read(smb->regmap, IRQSTAT_D, &irqstat_d); in smb347_interrupt()
800 dev_warn(smb->dev, "reading IRQSTAT_D failed\n"); in smb347_interrupt()
804 ret = regmap_read(smb->regmap, IRQSTAT_E, &irqstat_e); in smb347_interrupt()
806 dev_warn(smb->dev, "reading IRQSTAT_E failed\n"); in smb347_interrupt()
815 dev_err(smb->dev, "charging stopped due to charger error\n"); in smb347_interrupt()
816 if (smb->use_mains) in smb347_interrupt()
817 power_supply_changed(smb->mains); in smb347_interrupt()
818 if (smb->use_usb) in smb347_interrupt()
819 power_supply_changed(smb->usb); in smb347_interrupt()
830 if (smb->use_mains) in smb347_interrupt()
831 power_supply_changed(smb->mains); in smb347_interrupt()
832 if (smb->use_usb) in smb347_interrupt()
833 power_supply_changed(smb->usb); in smb347_interrupt()
835 dev_dbg(smb->dev, "going to HW maintenance mode\n"); in smb347_interrupt()
844 dev_dbg(smb->dev, "total Charge Timeout INT received\n"); in smb347_interrupt()
847 dev_warn(smb->dev, "charging stopped due to timeout\n"); in smb347_interrupt()
848 if (smb->use_mains) in smb347_interrupt()
849 power_supply_changed(smb->mains); in smb347_interrupt()
850 if (smb->use_usb) in smb347_interrupt()
851 power_supply_changed(smb->usb); in smb347_interrupt()
860 if (smb347_update_ps_status(smb) > 0) { in smb347_interrupt()
861 smb347_start_stop_charging(smb); in smb347_interrupt()
862 if (smb->use_mains) in smb347_interrupt()
863 power_supply_changed(smb->mains); in smb347_interrupt()
864 if (smb->use_usb) in smb347_interrupt()
865 power_supply_changed(smb->usb); in smb347_interrupt()
873 static int smb347_irq_set(struct smb347_charger *smb, bool enable) in smb347_irq_set() argument
877 if (smb->irq_unsupported) in smb347_irq_set()
880 ret = smb347_set_writable(smb, true); in smb347_irq_set()
891 ret = regmap_update_bits(smb->regmap, CFG_FAULT_IRQ, 0xff, in smb347_irq_set()
896 ret = regmap_update_bits(smb->regmap, CFG_STATUS_IRQ, 0xff, in smb347_irq_set()
902 ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_CHARGER_ERROR, in smb347_irq_set()
905 smb347_set_writable(smb, false); in smb347_irq_set()
909 static inline int smb347_irq_enable(struct smb347_charger *smb) in smb347_irq_enable() argument
911 return smb347_irq_set(smb, true); in smb347_irq_enable()
914 static inline int smb347_irq_disable(struct smb347_charger *smb) in smb347_irq_disable() argument
916 return smb347_irq_set(smb, false); in smb347_irq_disable()
919 static int smb347_irq_init(struct smb347_charger *smb, in smb347_irq_init() argument
924 ret = devm_request_threaded_irq(smb->dev, client->irq, NULL, in smb347_irq_init()
926 client->name, smb); in smb347_irq_init()
930 ret = smb347_set_writable(smb, true); in smb347_irq_init()
938 ret = regmap_update_bits(smb->regmap, CFG_STAT, in smb347_irq_init()
942 smb347_set_writable(smb, false); in smb347_irq_init()
951 static int get_const_charge_current(struct smb347_charger *smb) in get_const_charge_current() argument
953 unsigned int id = smb->id; in get_const_charge_current()
957 if (!smb347_is_ps_online(smb)) in get_const_charge_current()
960 ret = regmap_read(smb->regmap, STAT_B, &v); in get_const_charge_current()
984 static int get_const_charge_voltage(struct smb347_charger *smb) in get_const_charge_voltage() argument
989 if (!smb347_is_ps_online(smb)) in get_const_charge_voltage()
992 ret = regmap_read(smb->regmap, STAT_A, &v); in get_const_charge_voltage()
1005 static int smb347_get_charging_status(struct smb347_charger *smb, in smb347_get_charging_status() argument
1012 if (!smb->usb_online) in smb347_get_charging_status()
1015 if (!smb->mains_online) in smb347_get_charging_status()
1019 ret = regmap_read(smb->regmap, STAT_C, &val); in smb347_get_charging_status()
1060 struct smb347_charger *smb = power_supply_get_drvdata(psy); in smb347_get_property_locked() local
1065 ret = smb347_get_charging_status(smb, psy); in smb347_get_property_locked()
1073 if (!smb->usb_online) in smb347_get_property_locked()
1076 if (!smb->mains_online) in smb347_get_property_locked()
1084 switch (smb347_charging_status(smb)) { in smb347_get_property_locked()
1099 val->intval = smb->usb_online; in smb347_get_property_locked()
1101 val->intval = smb->mains_online; in smb347_get_property_locked()
1105 ret = get_const_charge_voltage(smb); in smb347_get_property_locked()
1112 ret = get_const_charge_current(smb); in smb347_get_property_locked()
1129 struct smb347_charger *smb = power_supply_get_drvdata(psy); in smb347_get_property() local
1130 struct i2c_client *client = to_i2c_client(smb->dev); in smb347_get_property()
1191 static void smb347_dt_parse_dev_info(struct smb347_charger *smb) in smb347_dt_parse_dev_info() argument
1193 struct device *dev = smb->dev; in smb347_dt_parse_dev_info()
1195 smb->soft_temp_limit_compensation = in smb347_dt_parse_dev_info()
1201 smb->soft_cold_temp_limit = SMB3XX_TEMP_USE_DEFAULT; in smb347_dt_parse_dev_info()
1202 smb->hard_cold_temp_limit = SMB3XX_TEMP_USE_DEFAULT; in smb347_dt_parse_dev_info()
1203 smb->soft_hot_temp_limit = SMB3XX_TEMP_USE_DEFAULT; in smb347_dt_parse_dev_info()
1204 smb->hard_hot_temp_limit = SMB3XX_TEMP_USE_DEFAULT; in smb347_dt_parse_dev_info()
1208 &smb->pre_to_fast_voltage); in smb347_dt_parse_dev_info()
1210 &smb->mains_current_limit); in smb347_dt_parse_dev_info()
1212 &smb->usb_hc_current_limit); in smb347_dt_parse_dev_info()
1216 &smb->chip_temp_threshold); in smb347_dt_parse_dev_info()
1218 &smb->soft_temp_limit_compensation); in smb347_dt_parse_dev_info()
1220 &smb->charge_current_compensation); in smb347_dt_parse_dev_info()
1223 smb->use_mains = device_property_read_bool(dev, "summit,enable-mains-charging"); in smb347_dt_parse_dev_info()
1224 smb->use_usb = device_property_read_bool(dev, "summit,enable-usb-charging"); in smb347_dt_parse_dev_info()
1225 smb->use_usb_otg = device_property_read_bool(dev, "summit,enable-otg-charging"); in smb347_dt_parse_dev_info()
1229 &smb->enable_control); in smb347_dt_parse_dev_info()
1232 static int smb347_get_battery_info(struct smb347_charger *smb) in smb347_get_battery_info() argument
1238 if (smb->mains) in smb347_get_battery_info()
1239 supply = smb->mains; in smb347_get_battery_info()
1241 supply = smb->usb; in smb347_get_battery_info()
1250 smb->max_charge_current = info.constant_charge_current_max_ua; in smb347_get_battery_info()
1253 smb->max_charge_voltage = info.constant_charge_voltage_max_uv; in smb347_get_battery_info()
1256 smb->pre_charge_current = info.precharge_current_ua; in smb347_get_battery_info()
1259 smb->termination_current = info.charge_term_current_ua; in smb347_get_battery_info()
1262 smb->soft_cold_temp_limit = info.temp_alert_min; in smb347_get_battery_info()
1265 smb->soft_hot_temp_limit = info.temp_alert_max; in smb347_get_battery_info()
1268 smb->hard_cold_temp_limit = info.temp_min; in smb347_get_battery_info()
1271 smb->hard_hot_temp_limit = info.temp_max; in smb347_get_battery_info()
1274 if (smb->hard_cold_temp_limit != SMB3XX_TEMP_USE_DEFAULT || in smb347_get_battery_info()
1275 smb->hard_hot_temp_limit != SMB3XX_TEMP_USE_DEFAULT) in smb347_get_battery_info()
1276 smb->suspend_on_hard_temp_limit = true; in smb347_get_battery_info()
1310 struct smb347_charger *smb; in smb347_probe() local
1313 smb = devm_kzalloc(dev, sizeof(*smb), GFP_KERNEL); in smb347_probe()
1314 if (!smb) in smb347_probe()
1316 smb->dev = &client->dev; in smb347_probe()
1317 smb->id = id->driver_data; in smb347_probe()
1318 i2c_set_clientdata(client, smb); in smb347_probe()
1320 smb347_dt_parse_dev_info(smb); in smb347_probe()
1321 if (!smb->use_mains && !smb->use_usb) in smb347_probe()
1324 smb->regmap = devm_regmap_init_i2c(client, &smb347_regmap); in smb347_probe()
1325 if (IS_ERR(smb->regmap)) in smb347_probe()
1326 return PTR_ERR(smb->regmap); in smb347_probe()
1328 mains_usb_cfg.drv_data = smb; in smb347_probe()
1330 if (smb->use_mains) { in smb347_probe()
1331 smb->mains = devm_power_supply_register(dev, &smb347_mains_desc, in smb347_probe()
1333 if (IS_ERR(smb->mains)) in smb347_probe()
1334 return PTR_ERR(smb->mains); in smb347_probe()
1337 if (smb->use_usb) { in smb347_probe()
1338 smb->usb = devm_power_supply_register(dev, &smb347_usb_desc, in smb347_probe()
1340 if (IS_ERR(smb->usb)) in smb347_probe()
1341 return PTR_ERR(smb->usb); in smb347_probe()
1344 ret = smb347_get_battery_info(smb); in smb347_probe()
1348 ret = smb347_hw_init(smb); in smb347_probe()
1357 ret = smb347_irq_init(smb, client); in smb347_probe()
1361 smb->irq_unsupported = true; in smb347_probe()
1363 smb347_irq_enable(smb); in smb347_probe()
1372 struct smb347_charger *smb = i2c_get_clientdata(client); in smb347_remove() local
1374 smb347_irq_disable(smb); in smb347_remove()