Lines Matching refs:cw_bat
118 struct power_supply *cw_bat; member
225 static int cw221X_active(struct cw_battery *cw_bat) in cw221X_active() argument
230 ret = cw_write(cw_bat->client, REG_MODE_CONFIG, ®_val); in cw221X_active()
236 ret = cw_write(cw_bat->client, REG_MODE_CONFIG, ®_val); in cw221X_active()
256 static int cw221X_sleep(struct cw_battery *cw_bat) in cw221X_sleep() argument
261 ret = cw_write(cw_bat->client, REG_MODE_CONFIG, ®_val); in cw221X_sleep()
267 ret = cw_write(cw_bat->client, REG_MODE_CONFIG, ®_val); in cw221X_sleep()
279 static int cw_get_chip_id(struct cw_battery *cw_bat) in cw_get_chip_id() argument
285 ret = cw_read(cw_bat->client, REG_CHIP_ID, ®_val); in cw_get_chip_id()
291 cw_bat->chip_id = chip_id; in cw_get_chip_id()
302 static int cw_get_voltage(struct cw_battery *cw_bat) in cw_get_voltage() argument
308 ret = cw_read_word(cw_bat->client, REG_VCELL_H, reg_val); in cw_get_voltage()
314 cw_bat->voltage = voltage; in cw_get_voltage()
330 static int cw_get_capacity(struct cw_battery *cw_bat) in cw_get_capacity() argument
339 ret = cw_read_word(cw_bat->client, REG_SOC_INT, reg_val); in cw_get_capacity()
350 cw_bat->ic_soc_h = soc_h; in cw_get_capacity()
351 cw_bat->ic_soc_l = soc_l; in cw_get_capacity()
352 cw_bat->ui_soc = ui_soc; in cw_get_capacity()
363 static int cw_get_temp(struct cw_battery *cw_bat) in cw_get_temp() argument
369 ret = cw_read(cw_bat->client, REG_TEMP, ®_val); in cw_get_temp()
374 cw_bat->temp = temp; in cw_get_temp()
408 static int cw_get_current(struct cw_battery *cw_bat) in cw_get_current() argument
415 ret = cw_read_word(cw_bat->client, REG_CURRENT_H, reg_val); in cw_get_current()
422 if (((cw_bat->fw_version & CW2215_MARK) != 0) || ((cw_bat->fw_version & CW2217_MARK) != 0)) in cw_get_current()
424 else if ((cw_bat->fw_version != 0) && ((cw_bat->fw_version & 0xC0) == CW2218_MARK)) in cw_get_current()
427 cw_bat->cw_current = 0; in cw_get_current()
428 dev_err(cw_bat->dev, "error! cw221x firmware read error!\n"); in cw_get_current()
431 cw_bat->cw_current = cw_current; in cw_get_current()
440 static int cw_get_cycle_count(struct cw_battery *cw_bat) in cw_get_cycle_count() argument
446 ret = cw_read_word(cw_bat->client, REG_CYCLE_H, reg_val); in cw_get_cycle_count()
451 cw_bat->cycle = cycle / 16; in cw_get_cycle_count()
462 static int cw_get_soh(struct cw_battery *cw_bat) in cw_get_soh() argument
468 ret = cw_read(cw_bat->client, REG_SOH, ®_val); in cw_get_soh()
473 cw_bat->soh = soh; in cw_get_soh()
485 static int cw_get_fw_version(struct cw_battery *cw_bat) in cw_get_fw_version() argument
491 ret = cw_read(cw_bat->client, REG_FW_VERSION, ®_val); in cw_get_fw_version()
496 cw_bat->fw_version = fw_version; in cw_get_fw_version()
501 static int cw_update_data(struct cw_battery *cw_bat) in cw_update_data() argument
505 ret += cw_get_voltage(cw_bat); in cw_update_data()
506 ret += cw_get_capacity(cw_bat); in cw_update_data()
507 ret += cw_get_temp(cw_bat); in cw_update_data()
508 ret += cw_get_current(cw_bat); in cw_update_data()
509 ret += cw_get_cycle_count(cw_bat); in cw_update_data()
510 ret += cw_get_soh(cw_bat); in cw_update_data()
512 cw_bat->voltage, cw_bat->cw_current, cw_bat->ui_soc, cw_bat->temp); in cw_update_data()
517 static int cw_init_data(struct cw_battery *cw_bat) in cw_init_data() argument
521 ret = cw_get_fw_version(cw_bat); in cw_init_data()
525 ret += cw_get_chip_id(cw_bat); in cw_init_data()
526 ret += cw_get_voltage(cw_bat); in cw_init_data()
527 ret += cw_get_capacity(cw_bat); in cw_init_data()
528 ret += cw_get_temp(cw_bat); in cw_init_data()
529 ret += cw_get_current(cw_bat); in cw_init_data()
530 ret += cw_get_cycle_count(cw_bat); in cw_init_data()
531 ret += cw_get_soh(cw_bat); in cw_init_data()
534 cw_bat->chip_id, cw_bat->voltage, cw_bat->cw_current, in cw_init_data()
535 cw_bat->ui_soc, cw_bat->temp, cw_bat->fw_version); in cw_init_data()
540 static int cw221x_parse_properties(struct cw_battery *cw_bat) in cw221x_parse_properties() argument
542 struct device *dev = cw_bat->dev; in cw221x_parse_properties()
548 dev_warn(cw_bat->dev, in cw221x_parse_properties()
551 dev_err(cw_bat->dev, "battery-profile must be %d bytes\n", in cw221x_parse_properties()
556 cw_bat->bat_profile = devm_kzalloc(dev, length, GFP_KERNEL); in cw221x_parse_properties()
557 if (!cw_bat->bat_profile) in cw221x_parse_properties()
562 cw_bat->bat_profile, in cw221x_parse_properties()
568 static void cw_config_profile_init(struct cw_battery *cw_bat) in cw_config_profile_init() argument
572 ret = cw221x_parse_properties(cw_bat); in cw_config_profile_init()
575 cw_bat->bat_profile = config_profile_info; in cw_config_profile_init()
580 cw_printk("[%d]: 0x%x\n", i, cw_bat->bat_profile[i]); in cw_config_profile_init()
584 static int cw_config_start_ic(struct cw_battery *cw_bat) in cw_config_start_ic() argument
590 ret = cw221X_sleep(cw_bat); in cw_config_start_ic()
595 ret = cw_write_profile(cw_bat->client, cw_bat->bat_profile); in cw_config_start_ic()
601 cw_printk("[%d]: 0x%x\n", i, cw_bat->bat_profile[i]); in cw_config_start_ic()
605 ret = cw_write(cw_bat->client, REG_SOC_ALERT, ®_val); in cw_config_start_ic()
611 ret = cw_write(cw_bat->client, REG_GPIO_CONFIG, ®_val); in cw_config_start_ic()
615 ret = cw221X_active(cw_bat); in cw_config_start_ic()
621 cw_read(cw_bat->client, REG_IC_STATE, ®_val); in cw_config_start_ic()
626 cw221X_sleep(cw_bat); in cw_config_start_ic()
638 static int cw221X_get_state(struct cw_battery *cw_bat) in cw221X_get_state() argument
645 ret = cw_read(cw_bat->client, REG_MODE_CONFIG, ®_val); in cw221X_get_state()
651 ret = cw_read(cw_bat->client, REG_SOC_ALERT, ®_val); in cw221X_get_state()
658 ret = cw_read(cw_bat->client, (REG_BAT_PROFILE + i), ®_val); in cw221X_get_state()
663 if (cw_bat->bat_profile[i] != reg_val) in cw221X_get_state()
673 static int cw_init(struct cw_battery *cw_bat) in cw_init() argument
677 ret = cw_get_chip_id(cw_bat); in cw_init()
679 dev_err(cw_bat->dev, "iic read write error"); in cw_init()
682 if (cw_bat->chip_id != IC_VCHIP_ID) { in cw_init()
683 dev_err(cw_bat->dev, "not cw221X\n"); in cw_init()
687 ret = cw221X_get_state(cw_bat); in cw_init()
689 dev_err(cw_bat->dev, "iic read write error"); in cw_init()
696 ret = cw_config_start_ic(cw_bat); in cw_init()
709 struct cw_battery *cw_bat; in cw_bat_work() local
716 cw_bat = container_of(delay_work, in cw_bat_work()
720 ret = cw_update_data(cw_bat); in cw_bat_work()
722 dev_err(cw_bat->dev, "i2c read error when update data"); in cw_bat_work()
723 if (cw_bat->ui_soc != soc) { in cw_bat_work()
724 soc = cw_bat->ui_soc; in cw_bat_work()
725 power_supply_changed(cw_bat->cw_bat); in cw_bat_work()
727 queue_delayed_work(cw_bat->cwfg_workqueue, in cw_bat_work()
728 &cw_bat->battery_delay_work, in cw_bat_work()
752 struct cw_battery *cw_bat = power_supply_get_drvdata(psy); in cw_battery_get_property() local
757 val->intval = cw_bat->cycle; in cw_battery_get_property()
760 val->intval = cw_bat->ui_soc; in cw_battery_get_property()
763 if ((cw_bat->ui_soc < 1) && (!power_supply_is_system_supplied())) in cw_battery_get_property()
765 else if (cw_bat->ui_soc <= 20) in cw_battery_get_property()
767 else if (cw_bat->ui_soc <= 70) in cw_battery_get_property()
769 else if (cw_bat->ui_soc <= 90) in cw_battery_get_property()
775 if (cw_bat->ui_soc == 100 * 1000) in cw_battery_get_property()
792 val->intval = (cw_bat->voltage <= 0) ? 0 : 1; in cw_battery_get_property()
795 cw_get_voltage(cw_bat); in cw_battery_get_property()
796 val->intval = cw_bat->voltage * CW_VOL_UNIT; in cw_battery_get_property()
799 cw_get_current(cw_bat); in cw_battery_get_property()
800 val->intval = cw_bat->cw_current * 1000; /* uA */ in cw_battery_get_property()
806 val->intval = cw_bat->temp; in cw_battery_get_property()
834 struct cw_battery *cw_bat; in cw221X_probe() local
838 cw_bat = devm_kzalloc(&client->dev, sizeof(*cw_bat), GFP_KERNEL); in cw221X_probe()
839 if (!cw_bat) in cw221X_probe()
842 i2c_set_clientdata(client, cw_bat); in cw221X_probe()
843 cw_bat->client = client; in cw221X_probe()
844 cw_bat->dev = &client->dev; in cw221X_probe()
846 dev_dbg(cw_bat->dev, "cw221X driver versions-%d\n", 20220830); in cw221X_probe()
847 cw_config_profile_init(cw_bat); in cw221X_probe()
848 ret = cw_init(cw_bat); in cw221X_probe()
851 ret = cw_init(cw_bat); in cw221X_probe()
854 dev_err(cw_bat->dev, "cw221X init fail!\n"); in cw221X_probe()
858 ret = cw_init_data(cw_bat); in cw221X_probe()
860 dev_err(cw_bat->dev, "cw221X init data fail!\n"); in cw221X_probe()
867 psy_cfg.drv_data = cw_bat; in cw221X_probe()
874 cw_bat->cw_bat = devm_power_supply_register(&client->dev, psy_desc, &psy_cfg); in cw221X_probe()
875 if (IS_ERR(cw_bat->cw_bat)) { in cw221X_probe()
876 ret = PTR_ERR(cw_bat->cw_bat); in cw221X_probe()
877 dev_err(cw_bat->dev, "failed to register battery: %d\n", ret); in cw221X_probe()
881 cw_bat->cwfg_workqueue = create_singlethread_workqueue("cwfg_gauge"); in cw221X_probe()
882 INIT_DELAYED_WORK(&cw_bat->battery_delay_work, cw_bat_work); in cw221X_probe()
883 queue_delayed_work(cw_bat->cwfg_workqueue, in cw221X_probe()
884 &cw_bat->battery_delay_work, in cw221X_probe()
894 struct cw_battery *cw_bat = i2c_get_clientdata(client); in cw221X_remove() local
896 cancel_delayed_work_sync(&cw_bat->battery_delay_work); in cw221X_remove()
897 destroy_workqueue(cw_bat->cwfg_workqueue); in cw221X_remove()
905 struct cw_battery *cw_bat = i2c_get_clientdata(client); in cw_bat_suspend() local
907 cancel_delayed_work(&cw_bat->battery_delay_work); in cw_bat_suspend()
914 struct cw_battery *cw_bat = i2c_get_clientdata(client); in cw_bat_resume() local
916 queue_delayed_work(cw_bat->cwfg_workqueue, in cw_bat_resume()
917 &cw_bat->battery_delay_work, in cw_bat_resume()