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

1 // SPDX-License-Identifier: GPL-2.0-or-later
110 #define LTC_POLL_TIMEOUT 100 /* in milli-seconds */
124 enum chips id; member
140 #define has_clear_peaks(d) ((d)->features & FEAT_CLEAR_PEAKS)
141 #define needs_polling(d) ((d)->features & FEAT_NEEDS_POLLING)
143 static int ltc_wait_ready(struct i2c_client *client) in ltc_wait_ready() argument
146 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc_wait_ready()
159 if (data->id != ltc3883) in ltc_wait_ready()
163 status = pmbus_read_byte_data(client, 0, LTC2978_MFR_COMMON); in ltc_wait_ready()
164 if (status == -EBADMSG || status == -ENXIO) { in ltc_wait_ready()
178 return -ETIMEDOUT; in ltc_wait_ready()
181 static int ltc_read_word_data(struct i2c_client *client, int page, int phase, in ltc_read_word_data() argument
186 ret = ltc_wait_ready(client); in ltc_read_word_data()
190 return pmbus_read_word_data(client, page, 0xff, reg); in ltc_read_word_data()
193 static int ltc_read_byte_data(struct i2c_client *client, int page, int reg) in ltc_read_byte_data() argument
197 ret = ltc_wait_ready(client); in ltc_read_byte_data()
201 return pmbus_read_byte_data(client, page, reg); in ltc_read_byte_data()
204 static int ltc_write_byte_data(struct i2c_client *client, int page, int reg, u8 value) in ltc_write_byte_data() argument
208 ret = ltc_wait_ready(client); in ltc_write_byte_data()
212 return pmbus_write_byte_data(client, page, reg, value); in ltc_write_byte_data()
215 static int ltc_write_byte(struct i2c_client *client, int page, u8 byte) in ltc_write_byte() argument
219 ret = ltc_wait_ready(client); in ltc_write_byte()
223 return pmbus_write_byte(client, page, byte); in ltc_write_byte()
236 return (e < 0 ? m >> -e : m << e); in lin11_to_val()
239 static int ltc_get_max(struct ltc2978_data *data, struct i2c_client *client, in ltc_get_max() argument
244 ret = ltc_read_word_data(client, page, 0xff, reg); in ltc_get_max()
253 static int ltc_get_min(struct ltc2978_data *data, struct i2c_client *client, in ltc_get_min() argument
258 ret = ltc_read_word_data(client, page, 0xff, reg); in ltc_get_min()
267 static int ltc2978_read_word_data_common(struct i2c_client *client, int page, in ltc2978_read_word_data_common() argument
270 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc2978_read_word_data_common()
276 ret = ltc_get_max(data, client, page, LTC2978_MFR_VIN_PEAK, in ltc2978_read_word_data_common()
277 &data->vin_max); in ltc2978_read_word_data_common()
280 ret = ltc_read_word_data(client, page, 0xff, in ltc2978_read_word_data_common()
287 if (ret > data->vout_max[page]) in ltc2978_read_word_data_common()
288 data->vout_max[page] = ret; in ltc2978_read_word_data_common()
289 ret = data->vout_max[page]; in ltc2978_read_word_data_common()
293 ret = ltc_get_max(data, client, page, in ltc2978_read_word_data_common()
295 &data->temp_max[page]); in ltc2978_read_word_data_common()
303 ret = ltc_wait_ready(client); in ltc2978_read_word_data_common()
306 ret = -ENODATA; in ltc2978_read_word_data_common()
312 static int ltc2978_read_word_data(struct i2c_client *client, int page, in ltc2978_read_word_data() argument
315 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc2978_read_word_data()
321 ret = ltc_get_min(data, client, page, LTC2978_MFR_VIN_MIN, in ltc2978_read_word_data()
322 &data->vin_min); in ltc2978_read_word_data()
325 ret = ltc_read_word_data(client, page, phase, in ltc2978_read_word_data()
334 if (data->vout_max[page] && ret > data->vout_max[page]) in ltc2978_read_word_data()
335 ret = data->vout_max[page]; in ltc2978_read_word_data()
336 if (ret < data->vout_min[page]) in ltc2978_read_word_data()
337 data->vout_min[page] = ret; in ltc2978_read_word_data()
338 ret = data->vout_min[page]; in ltc2978_read_word_data()
342 ret = ltc_get_min(data, client, page, in ltc2978_read_word_data()
344 &data->temp_min[page]); in ltc2978_read_word_data()
350 ret = -ENXIO; in ltc2978_read_word_data()
353 ret = ltc2978_read_word_data_common(client, page, reg); in ltc2978_read_word_data()
359 static int ltc2974_read_word_data(struct i2c_client *client, int page, in ltc2974_read_word_data() argument
362 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc2974_read_word_data()
368 ret = ltc_get_max(data, client, page, LTC2974_MFR_IOUT_PEAK, in ltc2974_read_word_data()
369 &data->iout_max[page]); in ltc2974_read_word_data()
372 ret = ltc_get_min(data, client, page, LTC2974_MFR_IOUT_MIN, in ltc2974_read_word_data()
373 &data->iout_min[page]); in ltc2974_read_word_data()
379 ret = ltc2978_read_word_data(client, page, phase, reg); in ltc2974_read_word_data()
385 static int ltc2975_read_word_data(struct i2c_client *client, int page, in ltc2975_read_word_data() argument
388 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc2975_read_word_data()
394 ret = ltc_get_max(data, client, page, LTC2975_MFR_IIN_PEAK, in ltc2975_read_word_data()
395 &data->iin_max); in ltc2975_read_word_data()
398 ret = ltc_get_min(data, client, page, LTC2975_MFR_IIN_MIN, in ltc2975_read_word_data()
399 &data->iin_min); in ltc2975_read_word_data()
402 ret = ltc_get_max(data, client, page, LTC2975_MFR_PIN_PEAK, in ltc2975_read_word_data()
403 &data->pin_max); in ltc2975_read_word_data()
406 ret = ltc_get_min(data, client, page, LTC2975_MFR_PIN_MIN, in ltc2975_read_word_data()
407 &data->pin_min); in ltc2975_read_word_data()
414 ret = ltc2978_read_word_data(client, page, phase, reg); in ltc2975_read_word_data()
420 static int ltc3880_read_word_data(struct i2c_client *client, int page, in ltc3880_read_word_data() argument
423 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc3880_read_word_data()
429 ret = ltc_get_max(data, client, page, LTC3880_MFR_IOUT_PEAK, in ltc3880_read_word_data()
430 &data->iout_max[page]); in ltc3880_read_word_data()
433 ret = ltc_get_max(data, client, page, in ltc3880_read_word_data()
435 &data->temp2_max); in ltc3880_read_word_data()
440 ret = -ENXIO; in ltc3880_read_word_data()
447 ret = ltc2978_read_word_data_common(client, page, reg); in ltc3880_read_word_data()
453 static int ltc3883_read_word_data(struct i2c_client *client, int page, in ltc3883_read_word_data() argument
456 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc3883_read_word_data()
462 ret = ltc_get_max(data, client, page, LTC3883_MFR_IIN_PEAK, in ltc3883_read_word_data()
463 &data->iin_max); in ltc3883_read_word_data()
469 ret = ltc3880_read_word_data(client, page, phase, reg); in ltc3883_read_word_data()
476 struct i2c_client *client, int page) in ltc2978_clear_peaks() argument
481 ret = ltc_write_byte(client, 0, LTC3880_MFR_CLEAR_PEAKS); in ltc2978_clear_peaks()
483 ret = ltc_write_byte(client, page, PMBUS_CLEAR_FAULTS); in ltc2978_clear_peaks()
488 static int ltc2978_write_word_data(struct i2c_client *client, int page, in ltc2978_write_word_data() argument
491 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc2978_write_word_data()
497 data->iin_max = 0x7c00; in ltc2978_write_word_data()
498 data->iin_min = 0x7bff; in ltc2978_write_word_data()
499 ret = ltc2978_clear_peaks(data, client, 0); in ltc2978_write_word_data()
502 data->pin_max = 0x7c00; in ltc2978_write_word_data()
503 data->pin_min = 0x7bff; in ltc2978_write_word_data()
504 ret = ltc2978_clear_peaks(data, client, 0); in ltc2978_write_word_data()
507 data->iout_max[page] = 0x7c00; in ltc2978_write_word_data()
508 data->iout_min[page] = 0xfbff; in ltc2978_write_word_data()
509 ret = ltc2978_clear_peaks(data, client, page); in ltc2978_write_word_data()
512 data->temp2_max = 0x7c00; in ltc2978_write_word_data()
513 ret = ltc2978_clear_peaks(data, client, page); in ltc2978_write_word_data()
516 data->vout_min[page] = 0xffff; in ltc2978_write_word_data()
517 data->vout_max[page] = 0; in ltc2978_write_word_data()
518 ret = ltc2978_clear_peaks(data, client, page); in ltc2978_write_word_data()
521 data->vin_min = 0x7bff; in ltc2978_write_word_data()
522 data->vin_max = 0x7c00; in ltc2978_write_word_data()
523 ret = ltc2978_clear_peaks(data, client, page); in ltc2978_write_word_data()
526 data->temp_min[page] = 0x7bff; in ltc2978_write_word_data()
527 data->temp_max[page] = 0x7c00; in ltc2978_write_word_data()
528 ret = ltc2978_clear_peaks(data, client, page); in ltc2978_write_word_data()
531 ret = ltc_wait_ready(client); in ltc2978_write_word_data()
534 ret = -ENODATA; in ltc2978_write_word_data()
604 static int ltc2978_get_id(struct i2c_client *client) in ltc2978_get_id() argument
608 chip_id = i2c_smbus_read_word_data(client, LTC2978_MFR_SPECIAL_ID); in ltc2978_get_id()
610 const struct i2c_device_id *id; in ltc2978_get_id() local
614 if (!i2c_check_functionality(client->adapter, in ltc2978_get_id()
616 return -ENODEV; in ltc2978_get_id()
618 ret = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, buf); in ltc2978_get_id()
622 return -ENODEV; in ltc2978_get_id()
624 ret = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, buf); in ltc2978_get_id()
627 for (id = &ltc2978_id[0]; strlen(id->name); id++) { in ltc2978_get_id()
628 if (!strncasecmp(id->name, buf, strlen(id->name))) in ltc2978_get_id()
629 return (int)id->driver_data; in ltc2978_get_id()
631 return -ENODEV; in ltc2978_get_id()
640 ret = i2c_smbus_read_i2c_block_data(client, PMBUS_IC_DEVICE_ID, in ltc2978_get_id()
646 !strncmp(buf + 1, "LT7170-1", 8)) in ltc2978_get_id()
649 !strncmp(buf + 1, "LT7171-1", 8)) in ltc2978_get_id()
652 return -ENODEV; in ltc2978_get_id()
711 dev_err(&client->dev, "Unsupported chip ID 0x%x\n", chip_id); in ltc2978_get_id()
712 return -ENODEV; in ltc2978_get_id()
715 static int ltc2978_probe(struct i2c_client *client) in ltc2978_probe() argument
720 const struct i2c_device_id *id; in ltc2978_probe() local
722 if (!i2c_check_functionality(client->adapter, in ltc2978_probe()
724 return -ENODEV; in ltc2978_probe()
726 data = devm_kzalloc(&client->dev, sizeof(struct ltc2978_data), in ltc2978_probe()
729 return -ENOMEM; in ltc2978_probe()
731 chip_id = ltc2978_get_id(client); in ltc2978_probe()
735 data->id = chip_id; in ltc2978_probe()
736 id = i2c_match_id(ltc2978_id, client); in ltc2978_probe()
737 if (data->id != id->driver_data) in ltc2978_probe()
738 dev_warn(&client->dev, in ltc2978_probe()
740 id->name, in ltc2978_probe()
741 (int) id->driver_data, in ltc2978_probe()
744 info = &data->info; in ltc2978_probe()
745 info->write_word_data = ltc2978_write_word_data; in ltc2978_probe()
746 info->write_byte = ltc_write_byte; in ltc2978_probe()
747 info->write_byte_data = ltc_write_byte_data; in ltc2978_probe()
748 info->read_word_data = ltc_read_word_data; in ltc2978_probe()
749 info->read_byte_data = ltc_read_byte_data; in ltc2978_probe()
751 data->vin_min = 0x7bff; in ltc2978_probe()
752 data->vin_max = 0x7c00; in ltc2978_probe()
753 for (i = 0; i < ARRAY_SIZE(data->vout_min); i++) in ltc2978_probe()
754 data->vout_min[i] = 0xffff; in ltc2978_probe()
755 for (i = 0; i < ARRAY_SIZE(data->iout_min); i++) in ltc2978_probe()
756 data->iout_min[i] = 0xfbff; in ltc2978_probe()
757 for (i = 0; i < ARRAY_SIZE(data->iout_max); i++) in ltc2978_probe()
758 data->iout_max[i] = 0x7c00; in ltc2978_probe()
759 for (i = 0; i < ARRAY_SIZE(data->temp_min); i++) in ltc2978_probe()
760 data->temp_min[i] = 0x7bff; in ltc2978_probe()
761 for (i = 0; i < ARRAY_SIZE(data->temp_max); i++) in ltc2978_probe()
762 data->temp_max[i] = 0x7c00; in ltc2978_probe()
763 data->temp2_max = 0x7c00; in ltc2978_probe()
765 switch (data->id) { in ltc2978_probe()
768 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING; in ltc2978_probe()
769 info->read_word_data = ltc3883_read_word_data; in ltc2978_probe()
770 info->pages = LTC3883_NUM_PAGES; in ltc2978_probe()
771 info->format[PSC_VOLTAGE_IN] = ieee754; in ltc2978_probe()
772 info->format[PSC_VOLTAGE_OUT] = ieee754; in ltc2978_probe()
773 info->format[PSC_CURRENT_OUT] = ieee754; in ltc2978_probe()
774 info->format[PSC_TEMPERATURE] = ieee754; in ltc2978_probe()
775 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT in ltc2978_probe()
781 info->read_word_data = ltc2975_read_word_data; in ltc2978_probe()
782 info->pages = LTC2972_NUM_PAGES; in ltc2978_probe()
783 info->func[0] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN in ltc2978_probe()
786 for (i = 0; i < info->pages; i++) { in ltc2978_probe()
787 info->func[i] |= PMBUS_HAVE_VOUT in ltc2978_probe()
794 info->read_word_data = ltc2974_read_word_data; in ltc2978_probe()
795 info->pages = LTC2974_NUM_PAGES; in ltc2978_probe()
796 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT in ltc2978_probe()
798 for (i = 0; i < info->pages; i++) { in ltc2978_probe()
799 info->func[i] |= PMBUS_HAVE_VOUT in ltc2978_probe()
806 info->read_word_data = ltc2975_read_word_data; in ltc2978_probe()
807 info->pages = LTC2974_NUM_PAGES; in ltc2978_probe()
808 info->func[0] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN in ltc2978_probe()
811 for (i = 0; i < info->pages; i++) { in ltc2978_probe()
812 info->func[i] |= PMBUS_HAVE_VOUT in ltc2978_probe()
824 info->read_word_data = ltc2978_read_word_data; in ltc2978_probe()
825 info->pages = LTC2978_NUM_PAGES; in ltc2978_probe()
826 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT in ltc2978_probe()
830 info->func[i] = PMBUS_HAVE_VOUT in ltc2978_probe()
840 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING; in ltc2978_probe()
841 info->read_word_data = ltc3880_read_word_data; in ltc2978_probe()
842 info->pages = LTC3880_NUM_PAGES; in ltc2978_probe()
843 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN in ltc2978_probe()
849 info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT in ltc2978_probe()
855 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING; in ltc2978_probe()
856 info->read_word_data = ltc3880_read_word_data; in ltc2978_probe()
857 info->pages = LTC3880_NUM_PAGES; in ltc2978_probe()
858 info->func[0] = PMBUS_HAVE_VIN in ltc2978_probe()
864 info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT in ltc2978_probe()
870 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING; in ltc2978_probe()
871 info->read_word_data = ltc3883_read_word_data; in ltc2978_probe()
872 info->pages = LTC3883_NUM_PAGES; in ltc2978_probe()
873 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN in ltc2978_probe()
889 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING; in ltc2978_probe()
890 info->read_word_data = ltc3883_read_word_data; in ltc2978_probe()
891 info->pages = LTC3880_NUM_PAGES; in ltc2978_probe()
892 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN in ltc2978_probe()
898 info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT in ltc2978_probe()
904 data->features |= FEAT_CLEAR_PEAKS; in ltc2978_probe()
905 info->read_word_data = ltc3883_read_word_data; in ltc2978_probe()
906 info->pages = LTC3883_NUM_PAGES; in ltc2978_probe()
907 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN in ltc2978_probe()
914 data->features |= FEAT_NEEDS_POLLING; in ltc2978_probe()
915 info->read_word_data = ltc2975_read_word_data; in ltc2978_probe()
916 info->pages = LTC2974_NUM_PAGES; in ltc2978_probe()
917 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT in ltc2978_probe()
919 for (i = 0; i < info->pages; i++) { in ltc2978_probe()
920 info->func[i] |= PMBUS_HAVE_IIN in ltc2978_probe()
929 return -ENODEV; in ltc2978_probe()
933 info->num_regulators = info->pages; in ltc2978_probe()
934 switch (data->id) { in ltc2978_probe()
943 info->reg_desc = ltc2978_reg_desc; in ltc2978_probe()
944 if (info->num_regulators > ARRAY_SIZE(ltc2978_reg_desc)) { in ltc2978_probe()
945 dev_warn(&client->dev, "num_regulators too large!"); in ltc2978_probe()
946 info->num_regulators = ARRAY_SIZE(ltc2978_reg_desc); in ltc2978_probe()
950 info->reg_desc = ltc2978_reg_desc_default; in ltc2978_probe()
951 if (info->num_regulators > ARRAY_SIZE(ltc2978_reg_desc_default)) { in ltc2978_probe()
952 dev_warn(&client->dev, "num_regulators too large!"); in ltc2978_probe()
953 info->num_regulators = in ltc2978_probe()
960 return pmbus_do_probe(client, info); in ltc2978_probe()