Lines Matching refs:di

83 	int (*read)(struct bq27xxx_device_info *di, u8 reg, bool single);
456 static inline int bq27xxx_read(struct bq27xxx_device_info *di, int reg_index, in bq27xxx_read() argument
460 if (!di || di->regs[reg_index] == INVALID_REG_ADDR) in bq27xxx_read()
463 return di->bus.read(di, di->regs[reg_index], single); in bq27xxx_read()
470 static int bq27xxx_battery_read_soc(struct bq27xxx_device_info *di) in bq27xxx_battery_read_soc() argument
474 soc = bq27xxx_read(di, BQ27XXX_REG_SOC, false); in bq27xxx_battery_read_soc()
477 dev_dbg(di->dev, "error reading State-of-Charge\n"); in bq27xxx_battery_read_soc()
486 static int bq27xxx_battery_read_charge(struct bq27xxx_device_info *di, u8 reg) in bq27xxx_battery_read_charge() argument
490 charge = bq27xxx_read(di, reg, false); in bq27xxx_battery_read_charge()
492 dev_dbg(di->dev, "error reading charge register %02x: %d\n", in bq27xxx_battery_read_charge()
497 if (di->chip == BQ27000 || di->chip == BQ27010) in bq27xxx_battery_read_charge()
509 static inline int bq27xxx_battery_read_nac(struct bq27xxx_device_info *di) in bq27xxx_battery_read_nac() argument
513 if (di->chip == BQ27000 || di->chip == BQ27010) { in bq27xxx_battery_read_nac()
514 flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, true); in bq27xxx_battery_read_nac()
519 return bq27xxx_battery_read_charge(di, BQ27XXX_REG_NAC); in bq27xxx_battery_read_nac()
526 static inline int bq27xxx_battery_read_fcc(struct bq27xxx_device_info *di) in bq27xxx_battery_read_fcc() argument
528 return bq27xxx_battery_read_charge(di, BQ27XXX_REG_FCC); in bq27xxx_battery_read_fcc()
535 static int bq27xxx_battery_read_dcap(struct bq27xxx_device_info *di) in bq27xxx_battery_read_dcap() argument
539 dcap = bq27xxx_read(di, BQ27XXX_REG_DCAP, false); in bq27xxx_battery_read_dcap()
542 dev_dbg(di->dev, "error reading initial last measured discharge\n"); in bq27xxx_battery_read_dcap()
546 if (di->chip == BQ27000 || di->chip == BQ27010) in bq27xxx_battery_read_dcap()
558 static int bq27xxx_battery_read_energy(struct bq27xxx_device_info *di) in bq27xxx_battery_read_energy() argument
562 ae = bq27xxx_read(di, BQ27XXX_REG_AE, false); in bq27xxx_battery_read_energy()
564 dev_dbg(di->dev, "error reading available energy\n"); in bq27xxx_battery_read_energy()
568 if (di->chip == BQ27000 || di->chip == BQ27010) in bq27xxx_battery_read_energy()
580 static int bq27xxx_battery_read_temperature(struct bq27xxx_device_info *di) in bq27xxx_battery_read_temperature() argument
584 temp = bq27xxx_read(di, BQ27XXX_REG_TEMP, false); in bq27xxx_battery_read_temperature()
586 dev_err(di->dev, "error reading temperature\n"); in bq27xxx_battery_read_temperature()
590 if (di->chip == BQ27000 || di->chip == BQ27010) in bq27xxx_battery_read_temperature()
600 static int bq27xxx_battery_read_cyct(struct bq27xxx_device_info *di) in bq27xxx_battery_read_cyct() argument
604 cyct = bq27xxx_read(di, BQ27XXX_REG_CYCT, false); in bq27xxx_battery_read_cyct()
606 dev_err(di->dev, "error reading cycle count total\n"); in bq27xxx_battery_read_cyct()
615 static int bq27xxx_battery_read_time(struct bq27xxx_device_info *di, u8 reg) in bq27xxx_battery_read_time() argument
619 tval = bq27xxx_read(di, reg, false); in bq27xxx_battery_read_time()
621 dev_dbg(di->dev, "error reading time register %02x: %d\n", in bq27xxx_battery_read_time()
636 static int bq27xxx_battery_read_pwr_avg(struct bq27xxx_device_info *di) in bq27xxx_battery_read_pwr_avg() argument
640 tval = bq27xxx_read(di, BQ27XXX_REG_AP, false); in bq27xxx_battery_read_pwr_avg()
642 dev_err(di->dev, "error reading average power register %02x: %d\n", in bq27xxx_battery_read_pwr_avg()
647 if (di->chip == BQ27000 || di->chip == BQ27010) in bq27xxx_battery_read_pwr_avg()
656 static bool bq27xxx_battery_overtemp(struct bq27xxx_device_info *di, u16 flags) in bq27xxx_battery_overtemp() argument
658 if (di->chip == BQ27500 || di->chip == BQ27541 || di->chip == BQ27545) in bq27xxx_battery_overtemp()
660 if (di->chip == BQ27530 || di->chip == BQ27421) in bq27xxx_battery_overtemp()
669 static bool bq27xxx_battery_undertemp(struct bq27xxx_device_info *di, u16 flags) in bq27xxx_battery_undertemp() argument
671 if (di->chip == BQ27530 || di->chip == BQ27421) in bq27xxx_battery_undertemp()
680 static bool bq27xxx_battery_dead(struct bq27xxx_device_info *di, u16 flags) in bq27xxx_battery_dead() argument
682 if (di->chip == BQ27000 || di->chip == BQ27010) in bq27xxx_battery_dead()
692 static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di) in bq27xxx_battery_read_health() argument
696 flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, false); in bq27xxx_battery_read_health()
698 dev_err(di->dev, "error reading flag register:%d\n", flags); in bq27xxx_battery_read_health()
703 if (unlikely(bq27xxx_battery_overtemp(di, flags))) in bq27xxx_battery_read_health()
705 if (unlikely(bq27xxx_battery_undertemp(di, flags))) in bq27xxx_battery_read_health()
707 if (unlikely(bq27xxx_battery_dead(di, flags))) in bq27xxx_battery_read_health()
713 static void bq27xxx_battery_update(struct bq27xxx_device_info *di) in bq27xxx_battery_update() argument
716 bool has_ci_flag = di->chip == BQ27000 || di->chip == BQ27010; in bq27xxx_battery_update()
717 bool has_singe_flag = di->chip == BQ27000 || di->chip == BQ27010; in bq27xxx_battery_update()
719 cache.flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, has_singe_flag); in bq27xxx_battery_update()
723 cache.temperature = bq27xxx_battery_read_temperature(di); in bq27xxx_battery_update()
725 dev_info(di->dev, "battery is not calibrated! ignoring capacity values\n"); in bq27xxx_battery_update()
734 if (di->regs[BQ27XXX_REG_TTE] != INVALID_REG_ADDR) in bq27xxx_battery_update()
735 cache.time_to_empty = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTE); in bq27xxx_battery_update()
736 if (di->regs[BQ27XXX_REG_TTECP] != INVALID_REG_ADDR) in bq27xxx_battery_update()
737 cache.time_to_empty_avg = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTECP); in bq27xxx_battery_update()
738 if (di->regs[BQ27XXX_REG_TTF] != INVALID_REG_ADDR) in bq27xxx_battery_update()
739 cache.time_to_full = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTF); in bq27xxx_battery_update()
740 cache.charge_full = bq27xxx_battery_read_fcc(di); in bq27xxx_battery_update()
741 cache.capacity = bq27xxx_battery_read_soc(di); in bq27xxx_battery_update()
742 if (di->regs[BQ27XXX_REG_AE] != INVALID_REG_ADDR) in bq27xxx_battery_update()
743 cache.energy = bq27xxx_battery_read_energy(di); in bq27xxx_battery_update()
744 cache.health = bq27xxx_battery_read_health(di); in bq27xxx_battery_update()
746 if (di->regs[BQ27XXX_REG_CYCT] != INVALID_REG_ADDR) in bq27xxx_battery_update()
747 cache.cycle_count = bq27xxx_battery_read_cyct(di); in bq27xxx_battery_update()
748 if (di->regs[BQ27XXX_REG_AP] != INVALID_REG_ADDR) in bq27xxx_battery_update()
749 cache.power_avg = bq27xxx_battery_read_pwr_avg(di); in bq27xxx_battery_update()
752 if (di->charge_design_full <= 0) in bq27xxx_battery_update()
753 di->charge_design_full = bq27xxx_battery_read_dcap(di); in bq27xxx_battery_update()
756 if (di->cache.capacity != cache.capacity) in bq27xxx_battery_update()
757 power_supply_changed(di->bat); in bq27xxx_battery_update()
759 if (memcmp(&di->cache, &cache, sizeof(cache)) != 0) in bq27xxx_battery_update()
760 di->cache = cache; in bq27xxx_battery_update()
762 di->last_update = jiffies; in bq27xxx_battery_update()
767 struct bq27xxx_device_info *di = in bq27xxx_battery_poll() local
771 bq27xxx_battery_update(di); in bq27xxx_battery_poll()
775 set_timer_slack(&di->work.timer, poll_interval * HZ / 4); in bq27xxx_battery_poll()
776 schedule_delayed_work(&di->work, poll_interval * HZ); in bq27xxx_battery_poll()
785 static int bq27xxx_battery_current(struct bq27xxx_device_info *di, in bq27xxx_battery_current() argument
791 curr = bq27xxx_read(di, BQ27XXX_REG_AI, false); in bq27xxx_battery_current()
793 dev_err(di->dev, "error reading current\n"); in bq27xxx_battery_current()
797 if (di->chip == BQ27000 || di->chip == BQ27010) { in bq27xxx_battery_current()
798 flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, false); in bq27xxx_battery_current()
800 dev_dbg(di->dev, "negative current!\n"); in bq27xxx_battery_current()
813 static int bq27xxx_battery_status(struct bq27xxx_device_info *di, in bq27xxx_battery_status() argument
818 if (di->chip == BQ27000 || di->chip == BQ27010) { in bq27xxx_battery_status()
819 if (di->cache.flags & BQ27000_FLAG_FC) in bq27xxx_battery_status()
821 else if (di->cache.flags & BQ27000_FLAG_CHGS) in bq27xxx_battery_status()
823 else if (power_supply_am_i_supplied(di->bat)) in bq27xxx_battery_status()
828 if (di->cache.flags & BQ27XXX_FLAG_FC) in bq27xxx_battery_status()
830 else if (di->cache.flags & BQ27XXX_FLAG_DSC) in bq27xxx_battery_status()
841 static int bq27xxx_battery_capacity_level(struct bq27xxx_device_info *di, in bq27xxx_battery_capacity_level() argument
846 if (di->chip == BQ27000 || di->chip == BQ27010) { in bq27xxx_battery_capacity_level()
847 if (di->cache.flags & BQ27000_FLAG_FC) in bq27xxx_battery_capacity_level()
849 else if (di->cache.flags & BQ27000_FLAG_EDV1) in bq27xxx_battery_capacity_level()
851 else if (di->cache.flags & BQ27000_FLAG_EDVF) in bq27xxx_battery_capacity_level()
856 if (di->cache.flags & BQ27XXX_FLAG_FC) in bq27xxx_battery_capacity_level()
858 else if (di->cache.flags & BQ27XXX_FLAG_SOC1) in bq27xxx_battery_capacity_level()
860 else if (di->cache.flags & BQ27XXX_FLAG_SOCF) in bq27xxx_battery_capacity_level()
875 static int bq27xxx_battery_voltage(struct bq27xxx_device_info *di, in bq27xxx_battery_voltage() argument
880 volt = bq27xxx_read(di, BQ27XXX_REG_VOLT, false); in bq27xxx_battery_voltage()
882 dev_err(di->dev, "error reading voltage\n"); in bq27xxx_battery_voltage()
907 struct bq27xxx_device_info *di = power_supply_get_drvdata(psy); in bq27xxx_battery_get_property() local
909 mutex_lock(&di->lock); in bq27xxx_battery_get_property()
910 if (time_is_before_jiffies(di->last_update + 5 * HZ)) { in bq27xxx_battery_get_property()
911 cancel_delayed_work_sync(&di->work); in bq27xxx_battery_get_property()
912 bq27xxx_battery_poll(&di->work.work); in bq27xxx_battery_get_property()
914 mutex_unlock(&di->lock); in bq27xxx_battery_get_property()
916 if (psp != POWER_SUPPLY_PROP_PRESENT && di->cache.flags < 0) in bq27xxx_battery_get_property()
921 ret = bq27xxx_battery_status(di, val); in bq27xxx_battery_get_property()
924 ret = bq27xxx_battery_voltage(di, val); in bq27xxx_battery_get_property()
927 val->intval = di->cache.flags < 0 ? 0 : 1; in bq27xxx_battery_get_property()
930 ret = bq27xxx_battery_current(di, val); in bq27xxx_battery_get_property()
933 ret = bq27xxx_simple_value(di->cache.capacity, val); in bq27xxx_battery_get_property()
936 ret = bq27xxx_battery_capacity_level(di, val); in bq27xxx_battery_get_property()
939 ret = bq27xxx_simple_value(di->cache.temperature, val); in bq27xxx_battery_get_property()
944 ret = bq27xxx_simple_value(di->cache.time_to_empty, val); in bq27xxx_battery_get_property()
947 ret = bq27xxx_simple_value(di->cache.time_to_empty_avg, val); in bq27xxx_battery_get_property()
950 ret = bq27xxx_simple_value(di->cache.time_to_full, val); in bq27xxx_battery_get_property()
956 ret = bq27xxx_simple_value(bq27xxx_battery_read_nac(di), val); in bq27xxx_battery_get_property()
959 ret = bq27xxx_simple_value(di->cache.charge_full, val); in bq27xxx_battery_get_property()
962 ret = bq27xxx_simple_value(di->charge_design_full, val); in bq27xxx_battery_get_property()
965 ret = bq27xxx_simple_value(di->cache.cycle_count, val); in bq27xxx_battery_get_property()
968 ret = bq27xxx_simple_value(di->cache.energy, val); in bq27xxx_battery_get_property()
971 ret = bq27xxx_simple_value(di->cache.power_avg, val); in bq27xxx_battery_get_property()
974 ret = bq27xxx_simple_value(di->cache.health, val); in bq27xxx_battery_get_property()
988 struct bq27xxx_device_info *di = power_supply_get_drvdata(psy); in bq27xxx_external_power_changed() local
990 cancel_delayed_work_sync(&di->work); in bq27xxx_external_power_changed()
991 schedule_delayed_work(&di->work, 0); in bq27xxx_external_power_changed()
994 static int bq27xxx_powersupply_init(struct bq27xxx_device_info *di, in bq27xxx_powersupply_init() argument
999 struct power_supply_config psy_cfg = { .drv_data = di, }; in bq27xxx_powersupply_init()
1001 psy_desc = devm_kzalloc(di->dev, sizeof(*psy_desc), GFP_KERNEL); in bq27xxx_powersupply_init()
1007 psy_desc->properties = bq27xxx_battery_props[di->chip].props; in bq27xxx_powersupply_init()
1008 psy_desc->num_properties = bq27xxx_battery_props[di->chip].size; in bq27xxx_powersupply_init()
1012 INIT_DELAYED_WORK(&di->work, bq27xxx_battery_poll); in bq27xxx_powersupply_init()
1013 mutex_init(&di->lock); in bq27xxx_powersupply_init()
1015 di->bat = power_supply_register_no_ws(di->dev, psy_desc, &psy_cfg); in bq27xxx_powersupply_init()
1016 if (IS_ERR(di->bat)) { in bq27xxx_powersupply_init()
1017 ret = PTR_ERR(di->bat); in bq27xxx_powersupply_init()
1018 dev_err(di->dev, "failed to register battery: %d\n", ret); in bq27xxx_powersupply_init()
1022 dev_info(di->dev, "support ver. %s enabled\n", DRIVER_VERSION); in bq27xxx_powersupply_init()
1024 bq27xxx_battery_update(di); in bq27xxx_powersupply_init()
1029 static void bq27xxx_powersupply_unregister(struct bq27xxx_device_info *di) in bq27xxx_powersupply_unregister() argument
1039 cancel_delayed_work_sync(&di->work); in bq27xxx_powersupply_unregister()
1041 power_supply_unregister(di->bat); in bq27xxx_powersupply_unregister()
1043 mutex_destroy(&di->lock); in bq27xxx_powersupply_unregister()
1057 struct bq27xxx_device_info *di = data; in bq27xxx_battery_irq_handler_thread() local
1059 bq27xxx_battery_update(di); in bq27xxx_battery_irq_handler_thread()
1064 static int bq27xxx_battery_i2c_read(struct bq27xxx_device_info *di, u8 reg, in bq27xxx_battery_i2c_read() argument
1067 struct i2c_client *client = to_i2c_client(di->dev); in bq27xxx_battery_i2c_read()
1103 struct bq27xxx_device_info *di; in bq27xxx_battery_i2c_probe() local
1120 di = devm_kzalloc(&client->dev, sizeof(*di), GFP_KERNEL); in bq27xxx_battery_i2c_probe()
1121 if (!di) { in bq27xxx_battery_i2c_probe()
1126 di->id = num; in bq27xxx_battery_i2c_probe()
1127 di->dev = &client->dev; in bq27xxx_battery_i2c_probe()
1128 di->chip = id->driver_data; in bq27xxx_battery_i2c_probe()
1129 di->bus.read = &bq27xxx_battery_i2c_read; in bq27xxx_battery_i2c_probe()
1130 di->regs = bq27xxx_regs[di->chip]; in bq27xxx_battery_i2c_probe()
1132 retval = bq27xxx_powersupply_init(di, name); in bq27xxx_battery_i2c_probe()
1137 schedule_delayed_work(&di->work, 60 * HZ); in bq27xxx_battery_i2c_probe()
1139 i2c_set_clientdata(client, di); in bq27xxx_battery_i2c_probe()
1145 name, di); in bq27xxx_battery_i2c_probe()
1166 struct bq27xxx_device_info *di = i2c_get_clientdata(client); in bq27xxx_battery_i2c_remove() local
1168 bq27xxx_powersupply_unregister(di); in bq27xxx_battery_i2c_remove()
1171 idr_remove(&battery_id, di->id); in bq27xxx_battery_i2c_remove()
1232 static int bq27xxx_battery_platform_read(struct bq27xxx_device_info *di, u8 reg, in bq27xxx_battery_platform_read() argument
1235 struct device *dev = di->dev; in bq27xxx_battery_platform_read()
1268 struct bq27xxx_device_info *di; in bq27xxx_battery_platform_probe() local
1287 di = devm_kzalloc(&pdev->dev, sizeof(*di), GFP_KERNEL); in bq27xxx_battery_platform_probe()
1288 if (!di) in bq27xxx_battery_platform_probe()
1291 platform_set_drvdata(pdev, di); in bq27xxx_battery_platform_probe()
1293 di->dev = &pdev->dev; in bq27xxx_battery_platform_probe()
1294 di->chip = pdata->chip; in bq27xxx_battery_platform_probe()
1295 di->regs = bq27xxx_regs[di->chip]; in bq27xxx_battery_platform_probe()
1298 di->bus.read = &bq27xxx_battery_platform_read; in bq27xxx_battery_platform_probe()
1300 return bq27xxx_powersupply_init(di, name); in bq27xxx_battery_platform_probe()
1305 struct bq27xxx_device_info *di = platform_get_drvdata(pdev); in bq27xxx_battery_platform_remove() local
1307 bq27xxx_powersupply_unregister(di); in bq27xxx_battery_platform_remove()