Lines Matching refs:di
89 int (*read)(struct bq27x00_device_info *di, u8 reg, bool single);
206 static inline int bq27x00_read(struct bq27x00_device_info *di, u8 reg, in bq27x00_read() argument
209 if (di->chip == BQ27425) in bq27x00_read()
210 return di->bus.read(di, reg - BQ27425_REG_OFFSET, single); in bq27x00_read()
211 return di->bus.read(di, reg, single); in bq27x00_read()
219 static bool bq27xxx_is_chip_version_higher(struct bq27x00_device_info *di) in bq27xxx_is_chip_version_higher() argument
221 if (di->chip == BQ27425 || di->chip == BQ27500 || di->chip == BQ27742 in bq27xxx_is_chip_version_higher()
222 || di->chip == BQ27510) in bq27xxx_is_chip_version_higher()
231 static int bq27x00_battery_read_rsoc(struct bq27x00_device_info *di) in bq27x00_battery_read_rsoc() argument
235 if (di->chip == BQ27500 || di->chip == BQ27742) in bq27x00_battery_read_rsoc()
236 rsoc = bq27x00_read(di, BQ27500_REG_SOC, false); in bq27x00_battery_read_rsoc()
237 else if (di->chip == BQ27510) in bq27x00_battery_read_rsoc()
238 rsoc = bq27x00_read(di, BQ27510_REG_SOC, false); in bq27x00_battery_read_rsoc()
239 else if (di->chip == BQ27425) in bq27x00_battery_read_rsoc()
240 rsoc = bq27x00_read(di, BQ27425_REG_SOC, false); in bq27x00_battery_read_rsoc()
242 rsoc = bq27x00_read(di, BQ27000_REG_RSOC, true); in bq27x00_battery_read_rsoc()
245 dev_dbg(di->dev, "error reading relative State-of-Charge\n"); in bq27x00_battery_read_rsoc()
254 static int bq27x00_battery_read_charge(struct bq27x00_device_info *di, u8 reg) in bq27x00_battery_read_charge() argument
258 charge = bq27x00_read(di, reg, false); in bq27x00_battery_read_charge()
260 dev_dbg(di->dev, "error reading charge register %02x: %d\n", in bq27x00_battery_read_charge()
265 if (bq27xxx_is_chip_version_higher(di)) in bq27x00_battery_read_charge()
277 static inline int bq27x00_battery_read_nac(struct bq27x00_device_info *di) in bq27x00_battery_read_nac() argument
280 bool is_bq27500 = di->chip == BQ27500; in bq27x00_battery_read_nac()
281 bool is_bq27742 = di->chip == BQ27742; in bq27x00_battery_read_nac()
282 bool is_higher = bq27xxx_is_chip_version_higher(di); in bq27x00_battery_read_nac()
285 flags = bq27x00_read(di, BQ27x00_REG_FLAGS, flags_1b); in bq27x00_battery_read_nac()
289 return bq27x00_battery_read_charge(di, BQ27x00_REG_NAC); in bq27x00_battery_read_nac()
296 static inline int bq27x00_battery_read_lmd(struct bq27x00_device_info *di) in bq27x00_battery_read_lmd() argument
298 return bq27x00_battery_read_charge(di, BQ27x00_REG_LMD); in bq27x00_battery_read_lmd()
305 static int bq27x00_battery_read_ilmd(struct bq27x00_device_info *di) in bq27x00_battery_read_ilmd() argument
309 if (bq27xxx_is_chip_version_higher(di)) { in bq27x00_battery_read_ilmd()
310 if (di->chip == BQ27425) in bq27x00_battery_read_ilmd()
311 ilmd = bq27x00_read(di, BQ27425_REG_DCAP, false); in bq27x00_battery_read_ilmd()
312 else if (di->chip == BQ27510) in bq27x00_battery_read_ilmd()
313 ilmd = bq27x00_read(di, BQ27510_REG_DCAP, false); in bq27x00_battery_read_ilmd()
315 ilmd = bq27x00_read(di, BQ27500_REG_DCAP, false); in bq27x00_battery_read_ilmd()
317 ilmd = bq27x00_read(di, BQ27000_REG_ILMD, true); in bq27x00_battery_read_ilmd()
320 dev_dbg(di->dev, "error reading initial last measured discharge\n"); in bq27x00_battery_read_ilmd()
324 if (bq27xxx_is_chip_version_higher(di)) in bq27x00_battery_read_ilmd()
336 static int bq27x00_battery_read_energy(struct bq27x00_device_info *di) in bq27x00_battery_read_energy() argument
340 ae = bq27x00_read(di, BQ27x00_REG_AE, false); in bq27x00_battery_read_energy()
342 dev_dbg(di->dev, "error reading available energy\n"); in bq27x00_battery_read_energy()
346 if (di->chip == BQ27500) in bq27x00_battery_read_energy()
358 static int bq27x00_battery_read_temperature(struct bq27x00_device_info *di) in bq27x00_battery_read_temperature() argument
362 temp = bq27x00_read(di, BQ27x00_REG_TEMP, false); in bq27x00_battery_read_temperature()
364 dev_err(di->dev, "error reading temperature\n"); in bq27x00_battery_read_temperature()
368 if (!bq27xxx_is_chip_version_higher(di)) in bq27x00_battery_read_temperature()
378 static int bq27x00_battery_read_cyct(struct bq27x00_device_info *di) in bq27x00_battery_read_cyct() argument
382 if (di->chip == BQ27510) in bq27x00_battery_read_cyct()
383 cyct = bq27x00_read(di, BQ27510_REG_CYCT, false); in bq27x00_battery_read_cyct()
385 cyct = bq27x00_read(di, BQ27x00_REG_CYCT, false); in bq27x00_battery_read_cyct()
387 dev_err(di->dev, "error reading cycle count total\n"); in bq27x00_battery_read_cyct()
396 static int bq27x00_battery_read_time(struct bq27x00_device_info *di, u8 reg) in bq27x00_battery_read_time() argument
400 tval = bq27x00_read(di, reg, false); in bq27x00_battery_read_time()
402 dev_dbg(di->dev, "error reading time register %02x: %d\n", in bq27x00_battery_read_time()
417 static int bq27x00_battery_read_pwr_avg(struct bq27x00_device_info *di, u8 reg) in bq27x00_battery_read_pwr_avg() argument
421 tval = bq27x00_read(di, reg, false); in bq27x00_battery_read_pwr_avg()
423 dev_err(di->dev, "error reading power avg rgister %02x: %d\n", in bq27x00_battery_read_pwr_avg()
428 if (di->chip == BQ27500) in bq27x00_battery_read_pwr_avg()
438 static int bq27x00_battery_read_health(struct bq27x00_device_info *di) in bq27x00_battery_read_health() argument
442 tval = bq27x00_read(di, BQ27x00_REG_FLAGS, false); in bq27x00_battery_read_health()
444 dev_err(di->dev, "error reading flag register:%d\n", tval); in bq27x00_battery_read_health()
448 if ((di->chip == BQ27500)) { in bq27x00_battery_read_health()
456 } else if (di->chip == BQ27510) { in bq27x00_battery_read_health()
471 static void bq27x00_update(struct bq27x00_device_info *di) in bq27x00_update() argument
474 bool is_bq27500 = di->chip == BQ27500; in bq27x00_update()
475 bool is_bq27510 = di->chip == BQ27510; in bq27x00_update()
476 bool is_bq27425 = di->chip == BQ27425; in bq27x00_update()
477 bool is_bq27742 = di->chip == BQ27742; in bq27x00_update()
480 cache.flags = bq27x00_read(di, BQ27x00_REG_FLAGS, flags_1b); in bq27x00_update()
487 dev_info(di->dev, "battery is not calibrated! ignoring capacity values\n"); in bq27x00_update()
496 cache.capacity = bq27x00_battery_read_rsoc(di); in bq27x00_update()
499 bq27x00_battery_read_time(di, in bq27x00_update()
502 cache.energy = bq27x00_battery_read_energy(di); in bq27x00_update()
504 bq27x00_battery_read_time(di, in bq27x00_update()
507 bq27x00_battery_read_time(di, in bq27x00_update()
510 bq27x00_battery_read_time(di, in bq27x00_update()
513 cache.charge_full = bq27x00_battery_read_lmd(di); in bq27x00_update()
514 cache.health = bq27x00_battery_read_health(di); in bq27x00_update()
516 cache.temperature = bq27x00_battery_read_temperature(di); in bq27x00_update()
518 cache.cycle_count = bq27x00_battery_read_cyct(di); in bq27x00_update()
521 bq27x00_battery_read_pwr_avg(di, in bq27x00_update()
525 bq27x00_battery_read_pwr_avg(di, in bq27x00_update()
529 if (di->charge_design_full <= 0) in bq27x00_update()
530 di->charge_design_full = bq27x00_battery_read_ilmd(di); in bq27x00_update()
533 if (di->cache.capacity != cache.capacity) in bq27x00_update()
534 power_supply_changed(di->bat); in bq27x00_update()
536 if (memcmp(&di->cache, &cache, sizeof(cache)) != 0) in bq27x00_update()
537 di->cache = cache; in bq27x00_update()
539 di->last_update = jiffies; in bq27x00_update()
544 struct bq27x00_device_info *di = in bq27x00_battery_poll() local
547 bq27x00_update(di); in bq27x00_battery_poll()
551 set_timer_slack(&di->work.timer, poll_interval * HZ / 4); in bq27x00_battery_poll()
552 schedule_delayed_work(&di->work, poll_interval * HZ); in bq27x00_battery_poll()
561 static int bq27x00_battery_current(struct bq27x00_device_info *di, in bq27x00_battery_current() argument
567 curr = bq27x00_read(di, BQ27x00_REG_AI, false); in bq27x00_battery_current()
569 dev_err(di->dev, "error reading current\n"); in bq27x00_battery_current()
573 if (bq27xxx_is_chip_version_higher(di)) { in bq27x00_battery_current()
577 flags = bq27x00_read(di, BQ27x00_REG_FLAGS, false); in bq27x00_battery_current()
579 dev_dbg(di->dev, "negative current!\n"); in bq27x00_battery_current()
589 static int bq27x00_battery_status(struct bq27x00_device_info *di, in bq27x00_battery_status() argument
594 if (bq27xxx_is_chip_version_higher(di)) { in bq27x00_battery_status()
595 if (di->cache.flags & BQ27500_FLAG_FC) in bq27x00_battery_status()
597 else if (di->cache.flags & BQ27500_FLAG_DSC) in bq27x00_battery_status()
602 if (di->cache.flags & BQ27000_FLAG_FC) in bq27x00_battery_status()
604 else if (di->cache.flags & BQ27000_FLAG_CHGS) in bq27x00_battery_status()
606 else if (power_supply_am_i_supplied(di->bat)) in bq27x00_battery_status()
617 static int bq27x00_battery_capacity_level(struct bq27x00_device_info *di, in bq27x00_battery_capacity_level() argument
622 if (bq27xxx_is_chip_version_higher(di)) { in bq27x00_battery_capacity_level()
623 if (di->cache.flags & BQ27500_FLAG_FC) in bq27x00_battery_capacity_level()
625 else if (di->cache.flags & BQ27500_FLAG_SOC1) in bq27x00_battery_capacity_level()
627 else if (di->cache.flags & BQ27500_FLAG_SOCF) in bq27x00_battery_capacity_level()
632 if (di->cache.flags & BQ27000_FLAG_FC) in bq27x00_battery_capacity_level()
634 else if (di->cache.flags & BQ27000_FLAG_EDV1) in bq27x00_battery_capacity_level()
636 else if (di->cache.flags & BQ27000_FLAG_EDVF) in bq27x00_battery_capacity_level()
651 static int bq27x00_battery_voltage(struct bq27x00_device_info *di, in bq27x00_battery_voltage() argument
656 volt = bq27x00_read(di, BQ27x00_REG_VOLT, false); in bq27x00_battery_voltage()
658 dev_err(di->dev, "error reading voltage\n"); in bq27x00_battery_voltage()
683 struct bq27x00_device_info *di = power_supply_get_drvdata(psy); in bq27x00_battery_get_property() local
685 mutex_lock(&di->lock); in bq27x00_battery_get_property()
686 if (time_is_before_jiffies(di->last_update + 5 * HZ)) { in bq27x00_battery_get_property()
687 cancel_delayed_work_sync(&di->work); in bq27x00_battery_get_property()
688 bq27x00_battery_poll(&di->work.work); in bq27x00_battery_get_property()
690 mutex_unlock(&di->lock); in bq27x00_battery_get_property()
692 if (psp != POWER_SUPPLY_PROP_PRESENT && di->cache.flags < 0) in bq27x00_battery_get_property()
697 ret = bq27x00_battery_status(di, val); in bq27x00_battery_get_property()
700 ret = bq27x00_battery_voltage(di, val); in bq27x00_battery_get_property()
703 val->intval = di->cache.flags < 0 ? 0 : 1; in bq27x00_battery_get_property()
706 ret = bq27x00_battery_current(di, val); in bq27x00_battery_get_property()
709 ret = bq27x00_simple_value(di->cache.capacity, val); in bq27x00_battery_get_property()
712 ret = bq27x00_battery_capacity_level(di, val); in bq27x00_battery_get_property()
715 ret = bq27x00_simple_value(di->cache.temperature, val); in bq27x00_battery_get_property()
720 ret = bq27x00_simple_value(di->cache.time_to_empty, val); in bq27x00_battery_get_property()
723 ret = bq27x00_simple_value(di->cache.time_to_empty_avg, val); in bq27x00_battery_get_property()
726 ret = bq27x00_simple_value(di->cache.time_to_full, val); in bq27x00_battery_get_property()
732 ret = bq27x00_simple_value(bq27x00_battery_read_nac(di), val); in bq27x00_battery_get_property()
735 ret = bq27x00_simple_value(di->cache.charge_full, val); in bq27x00_battery_get_property()
738 ret = bq27x00_simple_value(di->charge_design_full, val); in bq27x00_battery_get_property()
741 ret = bq27x00_simple_value(di->cache.cycle_count, val); in bq27x00_battery_get_property()
744 ret = bq27x00_simple_value(di->cache.energy, val); in bq27x00_battery_get_property()
747 ret = bq27x00_simple_value(di->cache.power_avg, val); in bq27x00_battery_get_property()
750 ret = bq27x00_simple_value(di->cache.health, val); in bq27x00_battery_get_property()
761 struct bq27x00_device_info *di = power_supply_get_drvdata(psy); in bq27x00_external_power_changed() local
763 cancel_delayed_work_sync(&di->work); in bq27x00_external_power_changed()
764 schedule_delayed_work(&di->work, 0); in bq27x00_external_power_changed()
767 static int bq27x00_powersupply_init(struct bq27x00_device_info *di, in bq27x00_powersupply_init() argument
772 struct power_supply_config psy_cfg = { .drv_data = di, }; in bq27x00_powersupply_init()
774 psy_desc = devm_kzalloc(di->dev, sizeof(*psy_desc), GFP_KERNEL); in bq27x00_powersupply_init()
780 if (di->chip == BQ27425) { in bq27x00_powersupply_init()
783 } else if (di->chip == BQ27742) { in bq27x00_powersupply_init()
786 } else if (di->chip == BQ27510) { in bq27x00_powersupply_init()
796 INIT_DELAYED_WORK(&di->work, bq27x00_battery_poll); in bq27x00_powersupply_init()
797 mutex_init(&di->lock); in bq27x00_powersupply_init()
799 di->bat = power_supply_register_no_ws(di->dev, psy_desc, &psy_cfg); in bq27x00_powersupply_init()
800 if (IS_ERR(di->bat)) { in bq27x00_powersupply_init()
801 ret = PTR_ERR(di->bat); in bq27x00_powersupply_init()
802 dev_err(di->dev, "failed to register battery: %d\n", ret); in bq27x00_powersupply_init()
806 dev_info(di->dev, "support ver. %s enabled\n", DRIVER_VERSION); in bq27x00_powersupply_init()
808 bq27x00_update(di); in bq27x00_powersupply_init()
813 static void bq27x00_powersupply_unregister(struct bq27x00_device_info *di) in bq27x00_powersupply_unregister() argument
823 cancel_delayed_work_sync(&di->work); in bq27x00_powersupply_unregister()
825 power_supply_unregister(di->bat); in bq27x00_powersupply_unregister()
827 mutex_destroy(&di->lock); in bq27x00_powersupply_unregister()
840 static int bq27x00_read_i2c(struct bq27x00_device_info *di, u8 reg, bool single) in bq27x00_read_i2c() argument
842 struct i2c_client *client = to_i2c_client(di->dev); in bq27x00_read_i2c()
878 struct bq27x00_device_info *di; in bq27x00_battery_probe() local
896 di = devm_kzalloc(&client->dev, sizeof(*di), GFP_KERNEL); in bq27x00_battery_probe()
897 if (!di) { in bq27x00_battery_probe()
903 di->id = num; in bq27x00_battery_probe()
904 di->dev = &client->dev; in bq27x00_battery_probe()
905 di->chip = id->driver_data; in bq27x00_battery_probe()
906 di->bus.read = &bq27x00_read_i2c; in bq27x00_battery_probe()
908 retval = bq27x00_powersupply_init(di, name); in bq27x00_battery_probe()
912 i2c_set_clientdata(client, di); in bq27x00_battery_probe()
926 struct bq27x00_device_info *di = i2c_get_clientdata(client); in bq27x00_battery_remove() local
928 bq27x00_powersupply_unregister(di); in bq27x00_battery_remove()
931 idr_remove(&battery_id, di->id); in bq27x00_battery_remove()
980 static int bq27000_read_platform(struct bq27x00_device_info *di, u8 reg, in bq27000_read_platform() argument
983 struct device *dev = di->dev; in bq27000_read_platform()
1016 struct bq27x00_device_info *di; in bq27000_battery_probe() local
1030 di = devm_kzalloc(&pdev->dev, sizeof(*di), GFP_KERNEL); in bq27000_battery_probe()
1031 if (!di) { in bq27000_battery_probe()
1036 platform_set_drvdata(pdev, di); in bq27000_battery_probe()
1038 di->dev = &pdev->dev; in bq27000_battery_probe()
1039 di->chip = BQ27000; in bq27000_battery_probe()
1042 di->bus.read = &bq27000_read_platform; in bq27000_battery_probe()
1044 return bq27x00_powersupply_init(di, name); in bq27000_battery_probe()
1049 struct bq27x00_device_info *di = platform_get_drvdata(pdev); in bq27000_battery_remove() local
1051 bq27x00_powersupply_unregister(di); in bq27000_battery_remove()