Lines Matching refs:bdi

181 static int bq24190_charger_set_charge_type(struct bq24190_dev_info *bdi,
250 static int bq24190_read(struct bq24190_dev_info *bdi, u8 reg, u8 *data)
254 ret = i2c_smbus_read_byte_data(bdi->client, reg);
262 static int bq24190_write(struct bq24190_dev_info *bdi, u8 reg, u8 data)
264 return i2c_smbus_write_byte_data(bdi->client, reg, data);
267 static int bq24190_read_mask(struct bq24190_dev_info *bdi, u8 reg,
273 ret = bq24190_read(bdi, reg, &v);
284 static int bq24190_write_mask(struct bq24190_dev_info *bdi, u8 reg,
290 ret = bq24190_read(bdi, reg, &v);
297 return bq24190_write(bdi, reg, v);
300 static int bq24190_get_field_val(struct bq24190_dev_info *bdi,
308 ret = bq24190_read_mask(bdi, reg, mask, shift, &v);
318 static int bq24190_set_field_val(struct bq24190_dev_info *bdi,
327 return bq24190_write_mask(bdi, reg, mask, shift, idx);
448 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
458 ret = pm_runtime_resume_and_get(bdi->dev);
462 ret = bq24190_read_mask(bdi, info->reg, info->mask, info->shift, &v);
468 pm_runtime_mark_last_busy(bdi->dev);
469 pm_runtime_put_autosuspend(bdi->dev);
478 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
491 ret = pm_runtime_resume_and_get(bdi->dev);
495 ret = bq24190_write_mask(bdi, info->reg, info->mask, info->shift, v);
499 pm_runtime_mark_last_busy(bdi->dev);
500 pm_runtime_put_autosuspend(bdi->dev);
506 static int bq24190_set_otg_vbus(struct bq24190_dev_info *bdi, bool enable)
508 union power_supply_propval val = { .intval = bdi->charge_type };
511 ret = pm_runtime_resume_and_get(bdi->dev);
513 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
517 bdi->otg_vbus_enabled = enable;
519 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
524 ret = bq24190_charger_set_charge_type(bdi, &val);
526 pm_runtime_mark_last_busy(bdi->dev);
527 pm_runtime_put_autosuspend(bdi->dev);
545 struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
549 ret = pm_runtime_resume_and_get(bdi->dev);
551 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
555 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
559 pm_runtime_mark_last_busy(bdi->dev);
560 pm_runtime_put_autosuspend(bdi->dev);
565 bdi->otg_vbus_enabled = (val == BQ24190_REG_POC_CHG_CONFIG_OTG ||
567 return bdi->otg_vbus_enabled;
592 static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
594 struct bq24190_platform_data *pdata = bdi->dev->platform_data;
599 cfg.dev = bdi->dev;
604 cfg.driver_data = bdi;
605 reg = devm_regulator_register(bdi->dev, &bq24190_vbus_desc, &cfg);
608 dev_err(bdi->dev, "Can't register regulator: %d\n", ret);
614 static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
620 static int bq24190_set_config(struct bq24190_dev_info *bdi)
625 ret = bq24190_read(bdi, BQ24190_REG_CTTC, &v);
629 bdi->watchdog = ((v & BQ24190_REG_CTTC_WATCHDOG_MASK) >>
642 ret = bq24190_write(bdi, BQ24190_REG_CTTC, v);
646 if (bdi->sys_min) {
647 v = bdi->sys_min / 100 - 30; // manual section 9.5.1.2, table 9
648 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
656 if (bdi->iprechg) {
657 v = bdi->iprechg / 128 - 1; // manual section 9.5.1.4, table 11
658 ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
666 if (bdi->iterm) {
667 v = bdi->iterm / 128 - 1; // manual section 9.5.1.4, table 11
668 ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
676 if (bdi->ichg) {
677 ret = bq24190_set_field_val(bdi, BQ24190_REG_CCC,
682 bdi->ichg);
687 if (bdi->vreg) {
688 ret = bq24190_set_field_val(bdi, BQ24190_REG_CVC,
693 bdi->vreg);
701 static int bq24190_register_reset(struct bq24190_dev_info *bdi)
716 if (device_property_read_bool(bdi->dev, "disable-reset"))
720 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
729 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
747 static int bq24190_charger_get_charge_type(struct bq24190_dev_info *bdi,
753 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
764 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
780 static int bq24190_charger_set_charge_type(struct bq24190_dev_info *bdi,
814 bdi->charge_type = val->intval;
819 if (bdi->otg_vbus_enabled)
823 ret = bq24190_write_mask(bdi, BQ24190_REG_CCC,
830 ret = bq24190_write_mask(bdi, BQ24190_REG_CTTC,
838 return bq24190_write_mask(bdi, BQ24190_REG_POC,
843 static int bq24190_charger_get_health(struct bq24190_dev_info *bdi,
849 mutex_lock(&bdi->f_reg_lock);
850 v = bdi->f_reg;
851 mutex_unlock(&bdi->f_reg_lock);
908 static int bq24190_charger_get_online(struct bq24190_dev_info *bdi,
914 ret = bq24190_read_mask(bdi, BQ24190_REG_SS,
920 ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
931 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
933 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
935 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
937 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
940 static int bq24190_charger_set_online(struct bq24190_dev_info *bdi,
943 return bq24190_battery_set_online(bdi, val);
946 static int bq24190_charger_get_status(struct bq24190_dev_info *bdi,
949 return bq24190_battery_get_status(bdi, val);
952 static int bq24190_charger_get_temp_alert_max(struct bq24190_dev_info *bdi,
955 return bq24190_battery_get_temp_alert_max(bdi, val);
958 static int bq24190_charger_set_temp_alert_max(struct bq24190_dev_info *bdi,
961 return bq24190_battery_set_temp_alert_max(bdi, val);
964 static int bq24190_charger_get_precharge(struct bq24190_dev_info *bdi,
970 ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
978 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
993 static int bq24190_charger_get_charge_term(struct bq24190_dev_info *bdi,
999 ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
1009 static int bq24190_charger_get_current(struct bq24190_dev_info *bdi,
1015 ret = bq24190_get_field_val(bdi, BQ24190_REG_CCC,
1022 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
1036 static int bq24190_charger_set_current(struct bq24190_dev_info *bdi,
1042 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
1052 if (curr > bdi->ichg_max)
1055 ret = bq24190_set_field_val(bdi, BQ24190_REG_CCC,
1062 bdi->ichg = curr;
1067 static int bq24190_charger_get_voltage(struct bq24190_dev_info *bdi,
1072 ret = bq24190_get_field_val(bdi, BQ24190_REG_CVC,
1083 static int bq24190_charger_set_voltage(struct bq24190_dev_info *bdi,
1088 if (val->intval > bdi->vreg_max)
1091 ret = bq24190_set_field_val(bdi, BQ24190_REG_CVC,
1098 bdi->vreg = val->intval;
1103 static int bq24190_charger_get_iinlimit(struct bq24190_dev_info *bdi,
1108 ret = bq24190_get_field_val(bdi, BQ24190_REG_ISC,
1120 static int bq24190_charger_set_iinlimit(struct bq24190_dev_info *bdi,
1123 return bq24190_set_field_val(bdi, BQ24190_REG_ISC,
1133 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1136 dev_dbg(bdi->dev, "prop: %d\n", psp);
1138 ret = pm_runtime_resume_and_get(bdi->dev);
1144 ret = bq24190_charger_get_charge_type(bdi, val);
1147 ret = bq24190_charger_get_health(bdi, val);
1150 ret = bq24190_charger_get_online(bdi, val);
1153 ret = bq24190_charger_get_status(bdi, val);
1156 ret = bq24190_charger_get_temp_alert_max(bdi, val);
1159 ret = bq24190_charger_get_precharge(bdi, val);
1162 ret = bq24190_charger_get_charge_term(bdi, val);
1165 ret = bq24190_charger_get_current(bdi, val);
1168 val->intval = bdi->ichg_max;
1172 ret = bq24190_charger_get_voltage(bdi, val);
1175 val->intval = bdi->vreg_max;
1179 ret = bq24190_charger_get_iinlimit(bdi, val);
1186 val->strval = bdi->model_name;
1197 pm_runtime_mark_last_busy(bdi->dev);
1198 pm_runtime_put_autosuspend(bdi->dev);
1207 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1210 dev_dbg(bdi->dev, "prop: %d\n", psp);
1212 ret = pm_runtime_resume_and_get(bdi->dev);
1218 ret = bq24190_charger_set_online(bdi, val);
1221 ret = bq24190_charger_set_temp_alert_max(bdi, val);
1224 ret = bq24190_charger_set_charge_type(bdi, val);
1227 ret = bq24190_charger_set_current(bdi, val);
1230 ret = bq24190_charger_set_voltage(bdi, val);
1233 ret = bq24190_charger_set_iinlimit(bdi, val);
1239 pm_runtime_mark_last_busy(bdi->dev);
1240 pm_runtime_put_autosuspend(bdi->dev);
1263 struct bq24190_dev_info *bdi =
1269 ret = power_supply_get_property_from_supplier(bdi->charger,
1275 bq24190_charger_set_property(bdi->charger,
1278 power_supply_changed(bdi->charger);
1284 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1294 queue_delayed_work(system_wq, &bdi->input_current_limit_work,
1333 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
1339 mutex_lock(&bdi->f_reg_lock);
1340 chrg_fault = bdi->f_reg;
1341 mutex_unlock(&bdi->f_reg_lock);
1346 ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1385 static int bq24190_battery_get_health(struct bq24190_dev_info *bdi,
1391 mutex_lock(&bdi->f_reg_lock);
1392 v = bdi->f_reg;
1393 mutex_unlock(&bdi->f_reg_lock);
1424 static int bq24190_battery_get_online(struct bq24190_dev_info *bdi,
1430 ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
1440 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
1443 return bq24190_write_mask(bdi, BQ24190_REG_MOC,
1448 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
1453 ret = bq24190_get_field_val(bdi, BQ24190_REG_ICTRC,
1465 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
1468 return bq24190_set_field_val(bdi, BQ24190_REG_ICTRC,
1478 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1481 dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1482 dev_dbg(bdi->dev, "prop: %d\n", psp);
1484 ret = pm_runtime_resume_and_get(bdi->dev);
1490 ret = bq24190_battery_get_status(bdi, val);
1493 ret = bq24190_battery_get_health(bdi, val);
1496 ret = bq24190_battery_get_online(bdi, val);
1504 ret = bq24190_battery_get_temp_alert_max(bdi, val);
1514 pm_runtime_mark_last_busy(bdi->dev);
1515 pm_runtime_put_autosuspend(bdi->dev);
1524 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1527 dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1528 dev_dbg(bdi->dev, "prop: %d\n", psp);
1530 ret = pm_runtime_resume_and_get(bdi->dev);
1536 ret = bq24190_battery_set_online(bdi, val);
1539 ret = bq24190_battery_set_temp_alert_max(bdi, val);
1545 pm_runtime_mark_last_busy(bdi->dev);
1546 pm_runtime_put_autosuspend(bdi->dev);
1587 static int bq24190_configure_usb_otg(struct bq24190_dev_info *bdi, u8 ss_reg)
1593 ret = extcon_set_state_sync(bdi->edev, EXTCON_USB, otg_enabled);
1595 dev_err(bdi->dev, "Can't set extcon state to %d: %d\n",
1601 static void bq24190_check_status(struct bq24190_dev_info *bdi)
1610 ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1612 dev_err(bdi->dev, "Can't read SS reg: %d\n", ret);
1618 ret = bq24190_read(bdi, BQ24190_REG_F, &f_reg);
1620 dev_err(bdi->dev, "Can't read F reg: %d\n", ret);
1630 if (f_reg != bdi->f_reg) {
1631 dev_warn(bdi->dev,
1638 mutex_lock(&bdi->f_reg_lock);
1639 if ((bdi->f_reg & battery_mask_f) != (f_reg & battery_mask_f))
1641 if ((bdi->f_reg & ~battery_mask_f) != (f_reg & ~battery_mask_f))
1643 bdi->f_reg = f_reg;
1644 mutex_unlock(&bdi->f_reg_lock);
1647 if (ss_reg != bdi->ss_reg) {
1652 if ((bdi->ss_reg & BQ24190_REG_SS_PG_STAT_MASK) &&
1654 ret = bq24190_write_mask(bdi, BQ24190_REG_ISC,
1659 dev_err(bdi->dev, "Can't access ISC reg: %d\n",
1663 if ((bdi->ss_reg & battery_mask_ss) != (ss_reg & battery_mask_ss))
1665 if ((bdi->ss_reg & ~battery_mask_ss) != (ss_reg & ~battery_mask_ss))
1667 bdi->ss_reg = ss_reg;
1671 power_supply_changed(bdi->charger);
1672 bq24190_configure_usb_otg(bdi, ss_reg);
1674 if (alert_battery && bdi->battery)
1675 power_supply_changed(bdi->battery);
1677 dev_dbg(bdi->dev, "ss_reg: 0x%02x, f_reg: 0x%02x\n", ss_reg, f_reg);
1682 struct bq24190_dev_info *bdi = data;
1685 bdi->irq_event = true;
1686 error = pm_runtime_resume_and_get(bdi->dev);
1688 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1691 bq24190_check_status(bdi);
1692 pm_runtime_mark_last_busy(bdi->dev);
1693 pm_runtime_put_autosuspend(bdi->dev);
1694 bdi->irq_event = false;
1699 static int bq24190_hw_init(struct bq24190_dev_info *bdi)
1705 ret = bq24190_read_mask(bdi, BQ24190_REG_VPRS,
1718 dev_err(bdi->dev, "Error unknown model: 0x%02x\n", v);
1722 ret = bq24190_register_reset(bdi);
1726 ret = bq24190_set_config(bdi);
1730 return bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1733 static int bq24190_get_config(struct bq24190_dev_info *bdi)
1740 bdi->ichg_max = bq24190_ccc_ichg_values[idx];
1743 bdi->vreg_max = bq24190_cvc_vreg_values[idx];
1745 if (device_property_read_u32(bdi->dev, s, &v) == 0) {
1749 bdi->sys_min = v;
1751 dev_warn(bdi->dev, "invalid value for %s: %u\n", s, v);
1754 if (!power_supply_get_battery_info(bdi->charger, &info)) {
1758 bdi->iprechg = v;
1760 dev_warn(bdi->dev, "invalid value for battery:precharge-current-microamp: %d\n",
1766 bdi->iterm = v;
1768 dev_warn(bdi->dev, "invalid value for battery:charge-term-current-microamp: %d\n",
1773 if (v >= bq24190_ccc_ichg_values[0] && v <= bdi->ichg_max)
1774 bdi->ichg = bdi->ichg_max = v;
1777 if (v >= bq24190_cvc_vreg_values[0] && v <= bdi->vreg_max)
1778 bdi->vreg = bdi->vreg_max = v;
1790 struct bq24190_dev_info *bdi;
1798 bdi = devm_kzalloc(dev, sizeof(*bdi), GFP_KERNEL);
1799 if (!bdi) {
1800 dev_err(dev, "Can't alloc bdi struct\n");
1804 bdi->client = client;
1805 bdi->dev = dev;
1806 strncpy(bdi->model_name, id->name, I2C_NAME_SIZE);
1807 mutex_init(&bdi->f_reg_lock);
1808 bdi->charge_type = POWER_SUPPLY_CHARGE_TYPE_FAST;
1809 bdi->f_reg = 0;
1810 bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
1811 INIT_DELAYED_WORK(&bdi->input_current_limit_work,
1814 i2c_set_clientdata(client, bdi);
1821 bdi->edev = devm_extcon_dev_allocate(dev, bq24190_usb_extcon_cable);
1822 if (IS_ERR(bdi->edev))
1823 return PTR_ERR(bdi->edev);
1825 ret = devm_extcon_dev_register(dev, bdi->edev);
1843 charger_cfg.drv_data = bdi;
1847 bdi->charger = power_supply_register(dev, &bq24190_charger_desc,
1849 if (IS_ERR(bdi->charger)) {
1851 ret = PTR_ERR(bdi->charger);
1858 battery_cfg.drv_data = bdi;
1859 bdi->battery = power_supply_register(dev, &bq24190_battery_desc,
1861 if (IS_ERR(bdi->battery)) {
1863 ret = PTR_ERR(bdi->battery);
1868 ret = bq24190_get_config(bdi);
1874 ret = bq24190_hw_init(bdi);
1880 ret = bq24190_configure_usb_otg(bdi, bdi->ss_reg);
1884 bdi->initialized = true;
1889 "bq24190-charger", bdi);
1895 ret = bq24190_register_vbus_regulator(bdi);
1907 if (!IS_ERR_OR_NULL(bdi->battery))
1908 power_supply_unregister(bdi->battery);
1909 power_supply_unregister(bdi->charger);
1920 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1923 cancel_delayed_work_sync(&bdi->input_current_limit_work);
1924 error = pm_runtime_resume_and_get(bdi->dev);
1926 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1928 bq24190_register_reset(bdi);
1929 if (bdi->battery)
1930 power_supply_unregister(bdi->battery);
1931 power_supply_unregister(bdi->charger);
1933 pm_runtime_put_sync(bdi->dev);
1934 pm_runtime_dont_use_autosuspend(bdi->dev);
1935 pm_runtime_disable(bdi->dev);
1940 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1943 bq24190_set_otg_vbus(bdi, false);
1949 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1951 if (!bdi->initialized)
1954 dev_dbg(bdi->dev, "%s\n", __func__);
1962 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1964 if (!bdi->initialized)
1967 if (!bdi->irq_event) {
1968 dev_dbg(bdi->dev, "checking events on possible wakeirq\n");
1969 bq24190_check_status(bdi);
1978 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1981 error = pm_runtime_resume_and_get(bdi->dev);
1983 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1985 bq24190_register_reset(bdi);
1988 pm_runtime_mark_last_busy(bdi->dev);
1989 pm_runtime_put_autosuspend(bdi->dev);
1998 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
2001 bdi->f_reg = 0;
2002 bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
2004 error = pm_runtime_resume_and_get(bdi->dev);
2006 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
2008 bq24190_register_reset(bdi);
2009 bq24190_set_config(bdi);
2010 bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
2013 pm_runtime_mark_last_busy(bdi->dev);
2014 pm_runtime_put_autosuspend(bdi->dev);
2018 power_supply_changed(bdi->charger);
2019 if (bdi->battery)
2020 power_supply_changed(bdi->battery);