Lines Matching +full:client +full:- +full:id

1 // SPDX-License-Identifier: GPL-2.0-or-later
105 #define LTC_POLL_TIMEOUT 100 /* in milli-seconds */
119 enum chips id; member
135 #define has_clear_peaks(d) ((d)->features & FEAT_CLEAR_PEAKS)
136 #define needs_polling(d) ((d)->features & FEAT_NEEDS_POLLING)
138 static int ltc_wait_ready(struct i2c_client *client) in ltc_wait_ready() argument
141 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc_wait_ready()
154 if (data->id != ltc3883) in ltc_wait_ready()
158 status = pmbus_read_byte_data(client, 0, LTC2978_MFR_COMMON); in ltc_wait_ready()
159 if (status == -EBADMSG || status == -ENXIO) { in ltc_wait_ready()
173 return -ETIMEDOUT; in ltc_wait_ready()
176 static int ltc_read_word_data(struct i2c_client *client, int page, int phase, in ltc_read_word_data() argument
181 ret = ltc_wait_ready(client); in ltc_read_word_data()
185 return pmbus_read_word_data(client, page, 0xff, reg); in ltc_read_word_data()
188 static int ltc_read_byte_data(struct i2c_client *client, int page, int reg) in ltc_read_byte_data() argument
192 ret = ltc_wait_ready(client); in ltc_read_byte_data()
196 return pmbus_read_byte_data(client, page, reg); in ltc_read_byte_data()
199 static int ltc_write_byte(struct i2c_client *client, int page, u8 byte) in ltc_write_byte() argument
203 ret = ltc_wait_ready(client); in ltc_write_byte()
207 return pmbus_write_byte(client, page, byte); in ltc_write_byte()
220 return (e < 0 ? m >> -e : m << e); in lin11_to_val()
223 static int ltc_get_max(struct ltc2978_data *data, struct i2c_client *client, in ltc_get_max() argument
228 ret = ltc_read_word_data(client, page, 0xff, reg); in ltc_get_max()
237 static int ltc_get_min(struct ltc2978_data *data, struct i2c_client *client, in ltc_get_min() argument
242 ret = ltc_read_word_data(client, page, 0xff, reg); in ltc_get_min()
251 static int ltc2978_read_word_data_common(struct i2c_client *client, int page, in ltc2978_read_word_data_common() argument
254 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc2978_read_word_data_common()
260 ret = ltc_get_max(data, client, page, LTC2978_MFR_VIN_PEAK, in ltc2978_read_word_data_common()
261 &data->vin_max); in ltc2978_read_word_data_common()
264 ret = ltc_read_word_data(client, page, 0xff, in ltc2978_read_word_data_common()
271 if (ret > data->vout_max[page]) in ltc2978_read_word_data_common()
272 data->vout_max[page] = ret; in ltc2978_read_word_data_common()
273 ret = data->vout_max[page]; in ltc2978_read_word_data_common()
277 ret = ltc_get_max(data, client, page, in ltc2978_read_word_data_common()
279 &data->temp_max[page]); in ltc2978_read_word_data_common()
287 ret = ltc_wait_ready(client); in ltc2978_read_word_data_common()
290 ret = -ENODATA; in ltc2978_read_word_data_common()
296 static int ltc2978_read_word_data(struct i2c_client *client, int page, in ltc2978_read_word_data() argument
299 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc2978_read_word_data()
305 ret = ltc_get_min(data, client, page, LTC2978_MFR_VIN_MIN, in ltc2978_read_word_data()
306 &data->vin_min); in ltc2978_read_word_data()
309 ret = ltc_read_word_data(client, page, phase, in ltc2978_read_word_data()
318 if (data->vout_max[page] && ret > data->vout_max[page]) in ltc2978_read_word_data()
319 ret = data->vout_max[page]; in ltc2978_read_word_data()
320 if (ret < data->vout_min[page]) in ltc2978_read_word_data()
321 data->vout_min[page] = ret; in ltc2978_read_word_data()
322 ret = data->vout_min[page]; in ltc2978_read_word_data()
326 ret = ltc_get_min(data, client, page, in ltc2978_read_word_data()
328 &data->temp_min[page]); in ltc2978_read_word_data()
334 ret = -ENXIO; in ltc2978_read_word_data()
337 ret = ltc2978_read_word_data_common(client, page, reg); in ltc2978_read_word_data()
343 static int ltc2974_read_word_data(struct i2c_client *client, int page, in ltc2974_read_word_data() argument
346 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc2974_read_word_data()
352 ret = ltc_get_max(data, client, page, LTC2974_MFR_IOUT_PEAK, in ltc2974_read_word_data()
353 &data->iout_max[page]); in ltc2974_read_word_data()
356 ret = ltc_get_min(data, client, page, LTC2974_MFR_IOUT_MIN, in ltc2974_read_word_data()
357 &data->iout_min[page]); in ltc2974_read_word_data()
363 ret = ltc2978_read_word_data(client, page, phase, reg); in ltc2974_read_word_data()
369 static int ltc2975_read_word_data(struct i2c_client *client, int page, in ltc2975_read_word_data() argument
372 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc2975_read_word_data()
378 ret = ltc_get_max(data, client, page, LTC2975_MFR_IIN_PEAK, in ltc2975_read_word_data()
379 &data->iin_max); in ltc2975_read_word_data()
382 ret = ltc_get_min(data, client, page, LTC2975_MFR_IIN_MIN, in ltc2975_read_word_data()
383 &data->iin_min); in ltc2975_read_word_data()
386 ret = ltc_get_max(data, client, page, LTC2975_MFR_PIN_PEAK, in ltc2975_read_word_data()
387 &data->pin_max); in ltc2975_read_word_data()
390 ret = ltc_get_min(data, client, page, LTC2975_MFR_PIN_MIN, in ltc2975_read_word_data()
391 &data->pin_min); in ltc2975_read_word_data()
398 ret = ltc2978_read_word_data(client, page, phase, reg); in ltc2975_read_word_data()
404 static int ltc3880_read_word_data(struct i2c_client *client, int page, in ltc3880_read_word_data() argument
407 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc3880_read_word_data()
413 ret = ltc_get_max(data, client, page, LTC3880_MFR_IOUT_PEAK, in ltc3880_read_word_data()
414 &data->iout_max[page]); in ltc3880_read_word_data()
417 ret = ltc_get_max(data, client, page, in ltc3880_read_word_data()
419 &data->temp2_max); in ltc3880_read_word_data()
424 ret = -ENXIO; in ltc3880_read_word_data()
431 ret = ltc2978_read_word_data_common(client, page, reg); in ltc3880_read_word_data()
437 static int ltc3883_read_word_data(struct i2c_client *client, int page, in ltc3883_read_word_data() argument
440 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc3883_read_word_data()
446 ret = ltc_get_max(data, client, page, LTC3883_MFR_IIN_PEAK, in ltc3883_read_word_data()
447 &data->iin_max); in ltc3883_read_word_data()
453 ret = ltc3880_read_word_data(client, page, phase, reg); in ltc3883_read_word_data()
460 struct i2c_client *client, int page) in ltc2978_clear_peaks() argument
465 ret = ltc_write_byte(client, 0, LTC3880_MFR_CLEAR_PEAKS); in ltc2978_clear_peaks()
467 ret = ltc_write_byte(client, page, PMBUS_CLEAR_FAULTS); in ltc2978_clear_peaks()
472 static int ltc2978_write_word_data(struct i2c_client *client, int page, in ltc2978_write_word_data() argument
475 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc2978_write_word_data()
481 data->iin_max = 0x7c00; in ltc2978_write_word_data()
482 data->iin_min = 0x7bff; in ltc2978_write_word_data()
483 ret = ltc2978_clear_peaks(data, client, 0); in ltc2978_write_word_data()
486 data->pin_max = 0x7c00; in ltc2978_write_word_data()
487 data->pin_min = 0x7bff; in ltc2978_write_word_data()
488 ret = ltc2978_clear_peaks(data, client, 0); in ltc2978_write_word_data()
491 data->iout_max[page] = 0x7c00; in ltc2978_write_word_data()
492 data->iout_min[page] = 0xfbff; in ltc2978_write_word_data()
493 ret = ltc2978_clear_peaks(data, client, page); in ltc2978_write_word_data()
496 data->temp2_max = 0x7c00; in ltc2978_write_word_data()
497 ret = ltc2978_clear_peaks(data, client, page); in ltc2978_write_word_data()
500 data->vout_min[page] = 0xffff; in ltc2978_write_word_data()
501 data->vout_max[page] = 0; in ltc2978_write_word_data()
502 ret = ltc2978_clear_peaks(data, client, page); in ltc2978_write_word_data()
505 data->vin_min = 0x7bff; in ltc2978_write_word_data()
506 data->vin_max = 0x7c00; in ltc2978_write_word_data()
507 ret = ltc2978_clear_peaks(data, client, page); in ltc2978_write_word_data()
510 data->temp_min[page] = 0x7bff; in ltc2978_write_word_data()
511 data->temp_max[page] = 0x7c00; in ltc2978_write_word_data()
512 ret = ltc2978_clear_peaks(data, client, page); in ltc2978_write_word_data()
515 ret = ltc_wait_ready(client); in ltc2978_write_word_data()
518 ret = -ENODATA; in ltc2978_write_word_data()
566 static int ltc2978_get_id(struct i2c_client *client) in ltc2978_get_id() argument
570 chip_id = i2c_smbus_read_word_data(client, LTC2978_MFR_SPECIAL_ID); in ltc2978_get_id()
572 const struct i2c_device_id *id; in ltc2978_get_id() local
576 if (!i2c_check_functionality(client->adapter, in ltc2978_get_id()
578 return -ENODEV; in ltc2978_get_id()
580 ret = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, buf); in ltc2978_get_id()
584 return -ENODEV; in ltc2978_get_id()
586 ret = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, buf); in ltc2978_get_id()
589 for (id = &ltc2978_id[0]; strlen(id->name); id++) { in ltc2978_get_id()
590 if (!strncasecmp(id->name, buf, strlen(id->name))) in ltc2978_get_id()
591 return (int)id->driver_data; in ltc2978_get_id()
593 return -ENODEV; in ltc2978_get_id()
648 dev_err(&client->dev, "Unsupported chip ID 0x%x\n", chip_id); in ltc2978_get_id()
649 return -ENODEV; in ltc2978_get_id()
652 static int ltc2978_probe(struct i2c_client *client) in ltc2978_probe() argument
657 const struct i2c_device_id *id; in ltc2978_probe() local
659 if (!i2c_check_functionality(client->adapter, in ltc2978_probe()
661 return -ENODEV; in ltc2978_probe()
663 data = devm_kzalloc(&client->dev, sizeof(struct ltc2978_data), in ltc2978_probe()
666 return -ENOMEM; in ltc2978_probe()
668 chip_id = ltc2978_get_id(client); in ltc2978_probe()
672 data->id = chip_id; in ltc2978_probe()
673 id = i2c_match_id(ltc2978_id, client); in ltc2978_probe()
674 if (data->id != id->driver_data) in ltc2978_probe()
675 dev_warn(&client->dev, in ltc2978_probe()
677 id->name, in ltc2978_probe()
678 (int) id->driver_data, in ltc2978_probe()
681 info = &data->info; in ltc2978_probe()
682 info->write_word_data = ltc2978_write_word_data; in ltc2978_probe()
683 info->write_byte = ltc_write_byte; in ltc2978_probe()
684 info->read_word_data = ltc_read_word_data; in ltc2978_probe()
685 info->read_byte_data = ltc_read_byte_data; in ltc2978_probe()
687 data->vin_min = 0x7bff; in ltc2978_probe()
688 data->vin_max = 0x7c00; in ltc2978_probe()
689 for (i = 0; i < ARRAY_SIZE(data->vout_min); i++) in ltc2978_probe()
690 data->vout_min[i] = 0xffff; in ltc2978_probe()
691 for (i = 0; i < ARRAY_SIZE(data->iout_min); i++) in ltc2978_probe()
692 data->iout_min[i] = 0xfbff; in ltc2978_probe()
693 for (i = 0; i < ARRAY_SIZE(data->iout_max); i++) in ltc2978_probe()
694 data->iout_max[i] = 0x7c00; in ltc2978_probe()
695 for (i = 0; i < ARRAY_SIZE(data->temp_min); i++) in ltc2978_probe()
696 data->temp_min[i] = 0x7bff; in ltc2978_probe()
697 for (i = 0; i < ARRAY_SIZE(data->temp_max); i++) in ltc2978_probe()
698 data->temp_max[i] = 0x7c00; in ltc2978_probe()
699 data->temp2_max = 0x7c00; in ltc2978_probe()
701 switch (data->id) { in ltc2978_probe()
703 info->read_word_data = ltc2975_read_word_data; in ltc2978_probe()
704 info->pages = LTC2972_NUM_PAGES; in ltc2978_probe()
705 info->func[0] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN in ltc2978_probe()
708 for (i = 0; i < info->pages; i++) { in ltc2978_probe()
709 info->func[i] |= PMBUS_HAVE_VOUT in ltc2978_probe()
716 info->read_word_data = ltc2974_read_word_data; in ltc2978_probe()
717 info->pages = LTC2974_NUM_PAGES; in ltc2978_probe()
718 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT in ltc2978_probe()
720 for (i = 0; i < info->pages; i++) { in ltc2978_probe()
721 info->func[i] |= PMBUS_HAVE_VOUT in ltc2978_probe()
728 info->read_word_data = ltc2975_read_word_data; in ltc2978_probe()
729 info->pages = LTC2974_NUM_PAGES; in ltc2978_probe()
730 info->func[0] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN in ltc2978_probe()
733 for (i = 0; i < info->pages; i++) { in ltc2978_probe()
734 info->func[i] |= PMBUS_HAVE_VOUT in ltc2978_probe()
746 info->read_word_data = ltc2978_read_word_data; in ltc2978_probe()
747 info->pages = LTC2978_NUM_PAGES; in ltc2978_probe()
748 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT in ltc2978_probe()
752 info->func[i] = PMBUS_HAVE_VOUT in ltc2978_probe()
762 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING; in ltc2978_probe()
763 info->read_word_data = ltc3880_read_word_data; in ltc2978_probe()
764 info->pages = LTC3880_NUM_PAGES; in ltc2978_probe()
765 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN in ltc2978_probe()
771 info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT in ltc2978_probe()
777 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING; in ltc2978_probe()
778 info->read_word_data = ltc3880_read_word_data; in ltc2978_probe()
779 info->pages = LTC3880_NUM_PAGES; in ltc2978_probe()
780 info->func[0] = PMBUS_HAVE_VIN in ltc2978_probe()
786 info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT in ltc2978_probe()
792 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING; in ltc2978_probe()
793 info->read_word_data = ltc3883_read_word_data; in ltc2978_probe()
794 info->pages = LTC3883_NUM_PAGES; in ltc2978_probe()
795 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN in ltc2978_probe()
810 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING; in ltc2978_probe()
811 info->read_word_data = ltc3883_read_word_data; in ltc2978_probe()
812 info->pages = LTC3880_NUM_PAGES; in ltc2978_probe()
813 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN in ltc2978_probe()
819 info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT in ltc2978_probe()
825 return -ENODEV; in ltc2978_probe()
829 info->num_regulators = info->pages; in ltc2978_probe()
830 info->reg_desc = ltc2978_reg_desc; in ltc2978_probe()
831 if (info->num_regulators > ARRAY_SIZE(ltc2978_reg_desc)) { in ltc2978_probe()
832 dev_err(&client->dev, "num_regulators too large!"); in ltc2978_probe()
833 info->num_regulators = ARRAY_SIZE(ltc2978_reg_desc); in ltc2978_probe()
837 return pmbus_do_probe(client, info); in ltc2978_probe()