Lines Matching +full:enable +full:- +full:charge +full:- +full:control
1 // SPDX-License-Identifier: GPL-2.0-only
76 int charge; /* Last charge register content */ member
84 return ((Q * (info->Qlsb / 10))) / 100; in convert_bin_to_uAh()
92 Q = (uAh * 100) / (info->Qlsb/10); in convert_uAh_to_bin()
103 msgs[0].addr = client->addr; in ltc294x_read_regs()
107 msgs[1].addr = client->addr; in ltc294x_read_regs()
112 ret = i2c_transfer(client->adapter, &msgs[0], 2); in ltc294x_read_regs()
114 dev_err(&client->dev, "ltc2941 read_reg failed!\n"); in ltc294x_read_regs()
118 dev_dbg(&client->dev, "%s (%#x, %d) -> %#x\n", in ltc294x_read_regs()
132 dev_err(&client->dev, "ltc2941 write_reg failed!\n"); in ltc294x_write_regs()
136 dev_dbg(&client->dev, "%s (%#x, %d) -> %#x\n", in ltc294x_write_regs()
146 u8 control; in ltc294x_reset() local
148 /* Read status and control registers */ in ltc294x_reset()
149 ret = ltc294x_read_regs(info->client, LTC294X_REG_CONTROL, &value, 1); in ltc294x_reset()
151 dev_err(&info->client->dev, in ltc294x_reset()
156 control = LTC294X_REG_CONTROL_PRESCALER_SET(prescaler_exp) | in ltc294x_reset()
159 switch (info->id) { in ltc294x_reset()
161 control |= LTC2942_REG_CONTROL_MODE_SCAN; in ltc294x_reset()
165 control |= LTC2943_REG_CONTROL_MODE_SCAN; in ltc294x_reset()
171 if (value != control) { in ltc294x_reset()
172 ret = ltc294x_write_regs(info->client, in ltc294x_reset()
173 LTC294X_REG_CONTROL, &control, 1); in ltc294x_reset()
175 dev_err(&info->client->dev, in ltc294x_reset()
193 ret = ltc294x_read_regs(info->client, reg, &datar[0], 2); in ltc294x_read_charge_register()
207 if (info->Qlsb < 0) in ltc294x_get_charge()
208 value -= 0xFFFF; in ltc294x_get_charge()
221 /* Direction depends on how sense+/- were connected */ in ltc294x_set_charge_now()
222 if (info->Qlsb < 0) in ltc294x_set_charge_now()
225 return -EINVAL; in ltc294x_set_charge_now()
227 /* Read control register */ in ltc294x_set_charge_now()
228 ret = ltc294x_read_regs(info->client, in ltc294x_set_charge_now()
234 ret = ltc294x_write_regs(info->client, in ltc294x_set_charge_now()
238 /* Set new charge value */ in ltc294x_set_charge_now()
241 ret = ltc294x_write_regs(info->client, in ltc294x_set_charge_now()
245 /* Enable analog section */ in ltc294x_set_charge_now()
248 ret = ltc294x_write_regs(info->client, in ltc294x_set_charge_now()
261 /* Direction depends on how sense+/- were connected */ in ltc294x_set_charge_thr()
262 if (info->Qlsb < 0) in ltc294x_set_charge_thr()
265 return -EINVAL; in ltc294x_set_charge_thr()
267 /* Set new charge value */ in ltc294x_set_charge_thr()
270 return ltc294x_write_regs(info->client, reg, &dataw[0], 2); in ltc294x_set_charge_thr()
280 value -= LTC294X_MID_SUPPLY; in ltc294x_get_charge_counter()
291 ret = ltc294x_read_regs(info->client, in ltc294x_get_voltage()
294 switch (info->id) { in ltc294x_get_voltage()
321 ret = ltc294x_read_regs(info->client, in ltc294x_get_current()
324 value -= 0x7FFF; in ltc294x_get_current()
325 if (info->id == LTC2944_ID) in ltc294x_get_current()
329 /* Value is in range -32k..+32k, r_sense is usually 10..50 mOhm, in ltc294x_get_current()
332 *val = 1000 * (value / (info->r_sense * 0x7FFF)); /* in uA */ in ltc294x_get_current()
343 if (info->id == LTC2942_ID) { in ltc294x_get_temperature()
345 value = 6000; /* Full-scale is 600 Kelvin */ in ltc294x_get_temperature()
348 value = 5100; /* Full-scale is 510 Kelvin */ in ltc294x_get_temperature()
350 ret = ltc294x_read_regs(info->client, reg, &datar[0], 2); in ltc294x_get_temperature()
353 *val = value / 0xFFFF - 2722; in ltc294x_get_temperature()
366 &val->intval); in ltc294x_get_property()
369 &val->intval); in ltc294x_get_property()
372 &val->intval); in ltc294x_get_property()
374 return ltc294x_get_charge_counter(info, &val->intval); in ltc294x_get_property()
376 return ltc294x_get_voltage(info, &val->intval); in ltc294x_get_property()
378 return ltc294x_get_current(info, &val->intval); in ltc294x_get_property()
380 return ltc294x_get_temperature(info, &val->intval); in ltc294x_get_property()
382 return -EINVAL; in ltc294x_get_property()
395 LTC294X_REG_CHARGE_THR_HIGH_MSB, val->intval); in ltc294x_set_property()
398 LTC294X_REG_CHARGE_THR_LOW_MSB, val->intval); in ltc294x_set_property()
400 return ltc294x_set_charge_now(info, val->intval); in ltc294x_set_property()
402 return -EPERM; in ltc294x_set_property()
421 int charge = ltc294x_read_charge_register(info, LTC294X_REG_ACC_CHARGE_MSB); in ltc294x_update() local
423 if (charge != info->charge) { in ltc294x_update()
424 info->charge = charge; in ltc294x_update()
425 power_supply_changed(info->supply); in ltc294x_update()
435 schedule_delayed_work(&info->work, LTC294X_WORK_DELAY * HZ); in ltc294x_work()
452 cancel_delayed_work_sync(&info->work); in ltc294x_i2c_remove()
453 power_supply_unregister(info->supply); in ltc294x_i2c_remove()
468 info = devm_kzalloc(&client->dev, sizeof(*info), GFP_KERNEL); in ltc294x_i2c_probe()
470 return -ENOMEM; in ltc294x_i2c_probe()
474 np = of_node_get(client->dev.of_node); in ltc294x_i2c_probe()
476 info->id = (enum ltc294x_id) (uintptr_t) of_device_get_match_data( in ltc294x_i2c_probe()
477 &client->dev); in ltc294x_i2c_probe()
478 info->supply_desc.name = np->name; in ltc294x_i2c_probe()
481 * instead of the sense-. This results in reversed measurements. */ in ltc294x_i2c_probe()
482 ret = of_property_read_u32(np, "lltc,resistor-sense", &r_sense); in ltc294x_i2c_probe()
484 dev_err(&client->dev, in ltc294x_i2c_probe()
485 "Could not find lltc,resistor-sense in devicetree\n"); in ltc294x_i2c_probe()
488 info->r_sense = r_sense; in ltc294x_i2c_probe()
490 ret = of_property_read_u32(np, "lltc,prescaler-exponent", in ltc294x_i2c_probe()
493 dev_warn(&client->dev, in ltc294x_i2c_probe()
494 "lltc,prescaler-exponent not in devicetree\n"); in ltc294x_i2c_probe()
498 if (info->id == LTC2943_ID) { in ltc294x_i2c_probe()
501 info->Qlsb = ((340 * 50000) / r_sense) / in ltc294x_i2c_probe()
506 info->Qlsb = ((85 * 50000) / r_sense) / in ltc294x_i2c_probe()
511 if (info->id == LTC2941_ID || info->id == LTC2942_ID) { in ltc294x_i2c_probe()
514 dev_err(&client->dev, in ltc294x_i2c_probe()
519 info->id = LTC2941_ID; in ltc294x_i2c_probe()
521 info->id = LTC2942_ID; in ltc294x_i2c_probe()
524 info->client = client; in ltc294x_i2c_probe()
525 info->supply_desc.type = POWER_SUPPLY_TYPE_BATTERY; in ltc294x_i2c_probe()
526 info->supply_desc.properties = ltc294x_properties; in ltc294x_i2c_probe()
527 switch (info->id) { in ltc294x_i2c_probe()
530 info->supply_desc.num_properties = in ltc294x_i2c_probe()
534 info->supply_desc.num_properties = in ltc294x_i2c_probe()
535 ARRAY_SIZE(ltc294x_properties) - 1; in ltc294x_i2c_probe()
539 info->supply_desc.num_properties = in ltc294x_i2c_probe()
540 ARRAY_SIZE(ltc294x_properties) - 3; in ltc294x_i2c_probe()
543 info->supply_desc.get_property = ltc294x_get_property; in ltc294x_i2c_probe()
544 info->supply_desc.set_property = ltc294x_set_property; in ltc294x_i2c_probe()
545 info->supply_desc.property_is_writeable = ltc294x_property_is_writeable; in ltc294x_i2c_probe()
546 info->supply_desc.external_power_changed = NULL; in ltc294x_i2c_probe()
550 INIT_DELAYED_WORK(&info->work, ltc294x_work); in ltc294x_i2c_probe()
554 dev_err(&client->dev, "Communication with chip failed\n"); in ltc294x_i2c_probe()
558 info->supply = power_supply_register(&client->dev, &info->supply_desc, in ltc294x_i2c_probe()
560 if (IS_ERR(info->supply)) { in ltc294x_i2c_probe()
561 dev_err(&client->dev, "failed to register ltc2941\n"); in ltc294x_i2c_probe()
562 return PTR_ERR(info->supply); in ltc294x_i2c_probe()
564 schedule_delayed_work(&info->work, LTC294X_WORK_DELAY * HZ); in ltc294x_i2c_probe()
575 u8 control; in ltc294x_i2c_shutdown() local
578 if (info->id == LTC2941_ID) in ltc294x_i2c_shutdown()
581 /* Read control register */ in ltc294x_i2c_shutdown()
582 ret = ltc294x_read_regs(info->client, LTC294X_REG_CONTROL, &value, 1); in ltc294x_i2c_shutdown()
587 control = LTC294X_REG_CONTROL_ADC_DISABLE(value); in ltc294x_i2c_shutdown()
588 if (control != value) in ltc294x_i2c_shutdown()
589 ltc294x_write_regs(info->client, LTC294X_REG_CONTROL, in ltc294x_i2c_shutdown()
590 &control, 1); in ltc294x_i2c_shutdown()
600 cancel_delayed_work(&info->work); in ltc294x_suspend()
609 schedule_delayed_work(&info->work, LTC294X_WORK_DELAY * HZ); in ltc294x_resume()