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

1 // SPDX-License-Identifier: GPL-2.0-or-later
107 #define LTC_POLL_TIMEOUT 100 /* in milli-seconds */
121 enum chips id; member
137 #define has_clear_peaks(d) ((d)->features & FEAT_CLEAR_PEAKS)
138 #define needs_polling(d) ((d)->features & FEAT_NEEDS_POLLING)
140 static int ltc_wait_ready(struct i2c_client *client) in ltc_wait_ready() argument
143 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc_wait_ready()
156 if (data->id != ltc3883) in ltc_wait_ready()
160 status = pmbus_read_byte_data(client, 0, LTC2978_MFR_COMMON); in ltc_wait_ready()
161 if (status == -EBADMSG || status == -ENXIO) { in ltc_wait_ready()
175 return -ETIMEDOUT; in ltc_wait_ready()
178 static int ltc_read_word_data(struct i2c_client *client, int page, int phase, in ltc_read_word_data() argument
183 ret = ltc_wait_ready(client); in ltc_read_word_data()
187 return pmbus_read_word_data(client, page, 0xff, reg); in ltc_read_word_data()
190 static int ltc_read_byte_data(struct i2c_client *client, int page, int reg) in ltc_read_byte_data() argument
194 ret = ltc_wait_ready(client); in ltc_read_byte_data()
198 return pmbus_read_byte_data(client, page, reg); in ltc_read_byte_data()
201 static int ltc_write_byte_data(struct i2c_client *client, int page, int reg, u8 value) in ltc_write_byte_data() argument
205 ret = ltc_wait_ready(client); in ltc_write_byte_data()
209 return pmbus_write_byte_data(client, page, reg, value); in ltc_write_byte_data()
212 static int ltc_write_byte(struct i2c_client *client, int page, u8 byte) in ltc_write_byte() argument
216 ret = ltc_wait_ready(client); in ltc_write_byte()
220 return pmbus_write_byte(client, page, byte); in ltc_write_byte()
233 return (e < 0 ? m >> -e : m << e); in lin11_to_val()
236 static int ltc_get_max(struct ltc2978_data *data, struct i2c_client *client, in ltc_get_max() argument
241 ret = ltc_read_word_data(client, page, 0xff, reg); in ltc_get_max()
250 static int ltc_get_min(struct ltc2978_data *data, struct i2c_client *client, in ltc_get_min() argument
255 ret = ltc_read_word_data(client, page, 0xff, reg); in ltc_get_min()
264 static int ltc2978_read_word_data_common(struct i2c_client *client, int page, in ltc2978_read_word_data_common() argument
267 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc2978_read_word_data_common()
273 ret = ltc_get_max(data, client, page, LTC2978_MFR_VIN_PEAK, in ltc2978_read_word_data_common()
274 &data->vin_max); in ltc2978_read_word_data_common()
277 ret = ltc_read_word_data(client, page, 0xff, in ltc2978_read_word_data_common()
284 if (ret > data->vout_max[page]) in ltc2978_read_word_data_common()
285 data->vout_max[page] = ret; in ltc2978_read_word_data_common()
286 ret = data->vout_max[page]; in ltc2978_read_word_data_common()
290 ret = ltc_get_max(data, client, page, in ltc2978_read_word_data_common()
292 &data->temp_max[page]); in ltc2978_read_word_data_common()
300 ret = ltc_wait_ready(client); in ltc2978_read_word_data_common()
303 ret = -ENODATA; in ltc2978_read_word_data_common()
309 static int ltc2978_read_word_data(struct i2c_client *client, int page, in ltc2978_read_word_data() argument
312 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc2978_read_word_data()
318 ret = ltc_get_min(data, client, page, LTC2978_MFR_VIN_MIN, in ltc2978_read_word_data()
319 &data->vin_min); in ltc2978_read_word_data()
322 ret = ltc_read_word_data(client, page, phase, in ltc2978_read_word_data()
331 if (data->vout_max[page] && ret > data->vout_max[page]) in ltc2978_read_word_data()
332 ret = data->vout_max[page]; in ltc2978_read_word_data()
333 if (ret < data->vout_min[page]) in ltc2978_read_word_data()
334 data->vout_min[page] = ret; in ltc2978_read_word_data()
335 ret = data->vout_min[page]; in ltc2978_read_word_data()
339 ret = ltc_get_min(data, client, page, in ltc2978_read_word_data()
341 &data->temp_min[page]); in ltc2978_read_word_data()
347 ret = -ENXIO; in ltc2978_read_word_data()
350 ret = ltc2978_read_word_data_common(client, page, reg); in ltc2978_read_word_data()
356 static int ltc2974_read_word_data(struct i2c_client *client, int page, in ltc2974_read_word_data() argument
359 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc2974_read_word_data()
365 ret = ltc_get_max(data, client, page, LTC2974_MFR_IOUT_PEAK, in ltc2974_read_word_data()
366 &data->iout_max[page]); in ltc2974_read_word_data()
369 ret = ltc_get_min(data, client, page, LTC2974_MFR_IOUT_MIN, in ltc2974_read_word_data()
370 &data->iout_min[page]); in ltc2974_read_word_data()
376 ret = ltc2978_read_word_data(client, page, phase, reg); in ltc2974_read_word_data()
382 static int ltc2975_read_word_data(struct i2c_client *client, int page, in ltc2975_read_word_data() argument
385 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc2975_read_word_data()
391 ret = ltc_get_max(data, client, page, LTC2975_MFR_IIN_PEAK, in ltc2975_read_word_data()
392 &data->iin_max); in ltc2975_read_word_data()
395 ret = ltc_get_min(data, client, page, LTC2975_MFR_IIN_MIN, in ltc2975_read_word_data()
396 &data->iin_min); in ltc2975_read_word_data()
399 ret = ltc_get_max(data, client, page, LTC2975_MFR_PIN_PEAK, in ltc2975_read_word_data()
400 &data->pin_max); in ltc2975_read_word_data()
403 ret = ltc_get_min(data, client, page, LTC2975_MFR_PIN_MIN, in ltc2975_read_word_data()
404 &data->pin_min); in ltc2975_read_word_data()
411 ret = ltc2978_read_word_data(client, page, phase, reg); in ltc2975_read_word_data()
417 static int ltc3880_read_word_data(struct i2c_client *client, int page, in ltc3880_read_word_data() argument
420 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc3880_read_word_data()
426 ret = ltc_get_max(data, client, page, LTC3880_MFR_IOUT_PEAK, in ltc3880_read_word_data()
427 &data->iout_max[page]); in ltc3880_read_word_data()
430 ret = ltc_get_max(data, client, page, in ltc3880_read_word_data()
432 &data->temp2_max); in ltc3880_read_word_data()
437 ret = -ENXIO; in ltc3880_read_word_data()
444 ret = ltc2978_read_word_data_common(client, page, reg); in ltc3880_read_word_data()
450 static int ltc3883_read_word_data(struct i2c_client *client, int page, in ltc3883_read_word_data() argument
453 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc3883_read_word_data()
459 ret = ltc_get_max(data, client, page, LTC3883_MFR_IIN_PEAK, in ltc3883_read_word_data()
460 &data->iin_max); in ltc3883_read_word_data()
466 ret = ltc3880_read_word_data(client, page, phase, reg); in ltc3883_read_word_data()
473 struct i2c_client *client, int page) in ltc2978_clear_peaks() argument
478 ret = ltc_write_byte(client, 0, LTC3880_MFR_CLEAR_PEAKS); in ltc2978_clear_peaks()
480 ret = ltc_write_byte(client, page, PMBUS_CLEAR_FAULTS); in ltc2978_clear_peaks()
485 static int ltc2978_write_word_data(struct i2c_client *client, int page, in ltc2978_write_word_data() argument
488 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); in ltc2978_write_word_data()
494 data->iin_max = 0x7c00; in ltc2978_write_word_data()
495 data->iin_min = 0x7bff; in ltc2978_write_word_data()
496 ret = ltc2978_clear_peaks(data, client, 0); in ltc2978_write_word_data()
499 data->pin_max = 0x7c00; in ltc2978_write_word_data()
500 data->pin_min = 0x7bff; in ltc2978_write_word_data()
501 ret = ltc2978_clear_peaks(data, client, 0); in ltc2978_write_word_data()
504 data->iout_max[page] = 0x7c00; in ltc2978_write_word_data()
505 data->iout_min[page] = 0xfbff; in ltc2978_write_word_data()
506 ret = ltc2978_clear_peaks(data, client, page); in ltc2978_write_word_data()
509 data->temp2_max = 0x7c00; in ltc2978_write_word_data()
510 ret = ltc2978_clear_peaks(data, client, page); in ltc2978_write_word_data()
513 data->vout_min[page] = 0xffff; in ltc2978_write_word_data()
514 data->vout_max[page] = 0; in ltc2978_write_word_data()
515 ret = ltc2978_clear_peaks(data, client, page); in ltc2978_write_word_data()
518 data->vin_min = 0x7bff; in ltc2978_write_word_data()
519 data->vin_max = 0x7c00; in ltc2978_write_word_data()
520 ret = ltc2978_clear_peaks(data, client, page); in ltc2978_write_word_data()
523 data->temp_min[page] = 0x7bff; in ltc2978_write_word_data()
524 data->temp_max[page] = 0x7c00; in ltc2978_write_word_data()
525 ret = ltc2978_clear_peaks(data, client, page); in ltc2978_write_word_data()
528 ret = ltc_wait_ready(client); in ltc2978_write_word_data()
531 ret = -ENODATA; in ltc2978_write_word_data()
598 static int ltc2978_get_id(struct i2c_client *client) in ltc2978_get_id() argument
602 chip_id = i2c_smbus_read_word_data(client, LTC2978_MFR_SPECIAL_ID); in ltc2978_get_id()
604 const struct i2c_device_id *id; in ltc2978_get_id() local
608 if (!i2c_check_functionality(client->adapter, in ltc2978_get_id()
610 return -ENODEV; in ltc2978_get_id()
612 ret = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, buf); in ltc2978_get_id()
616 return -ENODEV; in ltc2978_get_id()
618 ret = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, buf); in ltc2978_get_id()
621 for (id = &ltc2978_id[0]; strlen(id->name); id++) { in ltc2978_get_id()
622 if (!strncasecmp(id->name, buf, strlen(id->name))) in ltc2978_get_id()
623 return (int)id->driver_data; in ltc2978_get_id()
625 return -ENODEV; in ltc2978_get_id()
684 dev_err(&client->dev, "Unsupported chip ID 0x%x\n", chip_id); in ltc2978_get_id()
685 return -ENODEV; in ltc2978_get_id()
688 static int ltc2978_probe(struct i2c_client *client) in ltc2978_probe() argument
693 const struct i2c_device_id *id; in ltc2978_probe() local
695 if (!i2c_check_functionality(client->adapter, in ltc2978_probe()
697 return -ENODEV; in ltc2978_probe()
699 data = devm_kzalloc(&client->dev, sizeof(struct ltc2978_data), in ltc2978_probe()
702 return -ENOMEM; in ltc2978_probe()
704 chip_id = ltc2978_get_id(client); in ltc2978_probe()
708 data->id = chip_id; in ltc2978_probe()
709 id = i2c_match_id(ltc2978_id, client); in ltc2978_probe()
710 if (data->id != id->driver_data) in ltc2978_probe()
711 dev_warn(&client->dev, in ltc2978_probe()
713 id->name, in ltc2978_probe()
714 (int) id->driver_data, in ltc2978_probe()
717 info = &data->info; in ltc2978_probe()
718 info->write_word_data = ltc2978_write_word_data; in ltc2978_probe()
719 info->write_byte = ltc_write_byte; in ltc2978_probe()
720 info->write_byte_data = ltc_write_byte_data; in ltc2978_probe()
721 info->read_word_data = ltc_read_word_data; in ltc2978_probe()
722 info->read_byte_data = ltc_read_byte_data; in ltc2978_probe()
724 data->vin_min = 0x7bff; in ltc2978_probe()
725 data->vin_max = 0x7c00; in ltc2978_probe()
726 for (i = 0; i < ARRAY_SIZE(data->vout_min); i++) in ltc2978_probe()
727 data->vout_min[i] = 0xffff; in ltc2978_probe()
728 for (i = 0; i < ARRAY_SIZE(data->iout_min); i++) in ltc2978_probe()
729 data->iout_min[i] = 0xfbff; in ltc2978_probe()
730 for (i = 0; i < ARRAY_SIZE(data->iout_max); i++) in ltc2978_probe()
731 data->iout_max[i] = 0x7c00; in ltc2978_probe()
732 for (i = 0; i < ARRAY_SIZE(data->temp_min); i++) in ltc2978_probe()
733 data->temp_min[i] = 0x7bff; in ltc2978_probe()
734 for (i = 0; i < ARRAY_SIZE(data->temp_max); i++) in ltc2978_probe()
735 data->temp_max[i] = 0x7c00; in ltc2978_probe()
736 data->temp2_max = 0x7c00; in ltc2978_probe()
738 switch (data->id) { in ltc2978_probe()
740 info->read_word_data = ltc2975_read_word_data; in ltc2978_probe()
741 info->pages = LTC2972_NUM_PAGES; in ltc2978_probe()
742 info->func[0] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN in ltc2978_probe()
745 for (i = 0; i < info->pages; i++) { in ltc2978_probe()
746 info->func[i] |= PMBUS_HAVE_VOUT in ltc2978_probe()
753 info->read_word_data = ltc2974_read_word_data; in ltc2978_probe()
754 info->pages = LTC2974_NUM_PAGES; in ltc2978_probe()
755 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT in ltc2978_probe()
757 for (i = 0; i < info->pages; i++) { in ltc2978_probe()
758 info->func[i] |= PMBUS_HAVE_VOUT in ltc2978_probe()
765 info->read_word_data = ltc2975_read_word_data; in ltc2978_probe()
766 info->pages = LTC2974_NUM_PAGES; in ltc2978_probe()
767 info->func[0] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN in ltc2978_probe()
770 for (i = 0; i < info->pages; i++) { in ltc2978_probe()
771 info->func[i] |= PMBUS_HAVE_VOUT in ltc2978_probe()
783 info->read_word_data = ltc2978_read_word_data; in ltc2978_probe()
784 info->pages = LTC2978_NUM_PAGES; in ltc2978_probe()
785 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT in ltc2978_probe()
789 info->func[i] = PMBUS_HAVE_VOUT in ltc2978_probe()
799 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING; in ltc2978_probe()
800 info->read_word_data = ltc3880_read_word_data; in ltc2978_probe()
801 info->pages = LTC3880_NUM_PAGES; in ltc2978_probe()
802 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN in ltc2978_probe()
808 info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT in ltc2978_probe()
814 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING; in ltc2978_probe()
815 info->read_word_data = ltc3880_read_word_data; in ltc2978_probe()
816 info->pages = LTC3880_NUM_PAGES; in ltc2978_probe()
817 info->func[0] = PMBUS_HAVE_VIN in ltc2978_probe()
823 info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT in ltc2978_probe()
829 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING; in ltc2978_probe()
830 info->read_word_data = ltc3883_read_word_data; in ltc2978_probe()
831 info->pages = LTC3883_NUM_PAGES; in ltc2978_probe()
832 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN in ltc2978_probe()
848 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING; in ltc2978_probe()
849 info->read_word_data = ltc3883_read_word_data; in ltc2978_probe()
850 info->pages = LTC3880_NUM_PAGES; in ltc2978_probe()
851 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN in ltc2978_probe()
857 info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT in ltc2978_probe()
863 data->features |= FEAT_CLEAR_PEAKS; in ltc2978_probe()
864 info->read_word_data = ltc3883_read_word_data; in ltc2978_probe()
865 info->pages = LTC3883_NUM_PAGES; in ltc2978_probe()
866 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN in ltc2978_probe()
873 return -ENODEV; in ltc2978_probe()
877 info->num_regulators = info->pages; in ltc2978_probe()
878 switch (data->id) { in ltc2978_probe()
887 info->reg_desc = ltc2978_reg_desc; in ltc2978_probe()
888 if (info->num_regulators > ARRAY_SIZE(ltc2978_reg_desc)) { in ltc2978_probe()
889 dev_warn(&client->dev, "num_regulators too large!"); in ltc2978_probe()
890 info->num_regulators = ARRAY_SIZE(ltc2978_reg_desc); in ltc2978_probe()
894 info->reg_desc = ltc2978_reg_desc_default; in ltc2978_probe()
895 if (info->num_regulators > ARRAY_SIZE(ltc2978_reg_desc_default)) { in ltc2978_probe()
896 dev_warn(&client->dev, "num_regulators too large!"); in ltc2978_probe()
897 info->num_regulators = in ltc2978_probe()
904 return pmbus_do_probe(client, info); in ltc2978_probe()