Lines Matching +full:client +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0-only
3 * I2C client/driver for the Linear Technology LTC2941, LTC2942, LTC2943
71 struct i2c_client *client; /* I2C Client pointer */ member
75 enum ltc294x_id id; /* Chip type */ 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()
96 static int ltc294x_read_regs(struct i2c_client *client, in ltc294x_read_regs() argument
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()
124 static int ltc294x_write_regs(struct i2c_client *client, in ltc294x_write_regs() argument
130 ret = i2c_smbus_write_i2c_block_data(client, reg_start, num_regs, buf); in ltc294x_write_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()
149 ret = ltc294x_read_regs(info->client, LTC294X_REG_CONTROL, &value, 1); in ltc294x_reset()
151 dev_err(&info->client->dev, in ltc294x_reset()
159 switch (info->id) { in ltc294x_reset()
172 ret = ltc294x_write_regs(info->client, 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()
228 ret = ltc294x_read_regs(info->client, in ltc294x_set_charge_now()
234 ret = ltc294x_write_regs(info->client, in ltc294x_set_charge_now()
241 ret = ltc294x_write_regs(info->client, 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()
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()
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()
448 static int ltc294x_i2c_remove(struct i2c_client *client) in ltc294x_i2c_remove() argument
450 struct ltc294x_info *info = i2c_get_clientdata(client); in ltc294x_i2c_remove()
452 cancel_delayed_work_sync(&info->work); in ltc294x_i2c_remove()
453 power_supply_unregister(info->supply); in ltc294x_i2c_remove()
457 static int ltc294x_i2c_probe(struct i2c_client *client, in ltc294x_i2c_probe() argument
458 const struct i2c_device_id *id) in ltc294x_i2c_probe() argument
468 info = devm_kzalloc(&client->dev, sizeof(*info), GFP_KERNEL); in ltc294x_i2c_probe()
470 return -ENOMEM; in ltc294x_i2c_probe()
472 i2c_set_clientdata(client, info); 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()
512 ret = ltc294x_read_regs(client, LTC294X_REG_STATUS, &status, 1); 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()
570 static void ltc294x_i2c_shutdown(struct i2c_client *client) in ltc294x_i2c_shutdown() argument
572 struct ltc294x_info *info = i2c_get_clientdata(client); in ltc294x_i2c_shutdown()
578 if (info->id == LTC2941_ID) in ltc294x_i2c_shutdown()
582 ret = ltc294x_read_regs(info->client, LTC294X_REG_CONTROL, &value, 1); in ltc294x_i2c_shutdown()
589 ltc294x_write_regs(info->client, LTC294X_REG_CONTROL, in ltc294x_i2c_shutdown()
597 struct i2c_client *client = to_i2c_client(dev); in ltc294x_suspend() local
598 struct ltc294x_info *info = i2c_get_clientdata(client); in ltc294x_suspend()
600 cancel_delayed_work(&info->work); in ltc294x_suspend()
606 struct i2c_client *client = to_i2c_client(dev); in ltc294x_resume() local
607 struct ltc294x_info *info = i2c_get_clientdata(client); in ltc294x_resume()
609 schedule_delayed_work(&info->work, LTC294X_WORK_DELAY * HZ); in ltc294x_resume()