104f17595SRadu Sabau // SPDX-License-Identifier: GPL-2.0
204f17595SRadu Sabau /*
304f17595SRadu Sabau * Hardware monitoring driver for Analog Devices ADP1050
404f17595SRadu Sabau *
504f17595SRadu Sabau * Copyright (C) 2024 Analog Devices, Inc.
604f17595SRadu Sabau */
704f17595SRadu Sabau #include <linux/bits.h>
804f17595SRadu Sabau #include <linux/i2c.h>
99c379362SAndy Shevchenko #include <linux/mod_devicetable.h>
1004f17595SRadu Sabau #include <linux/module.h>
119c379362SAndy Shevchenko
1204f17595SRadu Sabau #include "pmbus.h"
1304f17595SRadu Sabau
14*e09ef2feSCedric Encarnacion #if IS_ENABLED(CONFIG_SENSORS_ADP1050_REGULATOR)
15*e09ef2feSCedric Encarnacion static const struct regulator_desc adp1050_reg_desc[] = {
16*e09ef2feSCedric Encarnacion PMBUS_REGULATOR_ONE("vout"),
17*e09ef2feSCedric Encarnacion };
18*e09ef2feSCedric Encarnacion #endif /* CONFIG_SENSORS_ADP1050_REGULATOR */
19*e09ef2feSCedric Encarnacion
2004f17595SRadu Sabau static struct pmbus_driver_info adp1050_info = {
2104f17595SRadu Sabau .pages = 1,
2204f17595SRadu Sabau .format[PSC_VOLTAGE_IN] = linear,
2304f17595SRadu Sabau .format[PSC_VOLTAGE_OUT] = linear,
2404f17595SRadu Sabau .format[PSC_CURRENT_IN] = linear,
2504f17595SRadu Sabau .format[PSC_TEMPERATURE] = linear,
2604f17595SRadu Sabau .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
2704f17595SRadu Sabau | PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
2804f17595SRadu Sabau | PMBUS_HAVE_IIN | PMBUS_HAVE_TEMP
2904f17595SRadu Sabau | PMBUS_HAVE_STATUS_TEMP,
3004f17595SRadu Sabau };
3104f17595SRadu Sabau
323e5f73a0SCedric Encarnacion static struct pmbus_driver_info adp1051_info = {
333e5f73a0SCedric Encarnacion .pages = 1,
343e5f73a0SCedric Encarnacion .format[PSC_VOLTAGE_IN] = linear,
353e5f73a0SCedric Encarnacion .format[PSC_VOLTAGE_OUT] = linear,
363e5f73a0SCedric Encarnacion .format[PSC_CURRENT_IN] = linear,
373e5f73a0SCedric Encarnacion .format[PSC_TEMPERATURE] = linear,
383e5f73a0SCedric Encarnacion .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
393e5f73a0SCedric Encarnacion | PMBUS_HAVE_VOUT | PMBUS_HAVE_IOUT
403e5f73a0SCedric Encarnacion | PMBUS_HAVE_TEMP
413e5f73a0SCedric Encarnacion | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_STATUS_IOUT
423e5f73a0SCedric Encarnacion | PMBUS_HAVE_STATUS_INPUT
433e5f73a0SCedric Encarnacion | PMBUS_HAVE_STATUS_TEMP,
443e5f73a0SCedric Encarnacion };
453e5f73a0SCedric Encarnacion
463e5f73a0SCedric Encarnacion static struct pmbus_driver_info adp1055_info = {
473e5f73a0SCedric Encarnacion .pages = 1,
483e5f73a0SCedric Encarnacion .format[PSC_VOLTAGE_IN] = linear,
493e5f73a0SCedric Encarnacion .format[PSC_VOLTAGE_OUT] = linear,
503e5f73a0SCedric Encarnacion .format[PSC_CURRENT_IN] = linear,
513e5f73a0SCedric Encarnacion .format[PSC_TEMPERATURE] = linear,
523e5f73a0SCedric Encarnacion .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
533e5f73a0SCedric Encarnacion | PMBUS_HAVE_VOUT | PMBUS_HAVE_IOUT
543e5f73a0SCedric Encarnacion | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_TEMP3
553e5f73a0SCedric Encarnacion | PMBUS_HAVE_POUT
563e5f73a0SCedric Encarnacion | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_STATUS_IOUT
573e5f73a0SCedric Encarnacion | PMBUS_HAVE_STATUS_INPUT
583e5f73a0SCedric Encarnacion | PMBUS_HAVE_STATUS_TEMP,
593e5f73a0SCedric Encarnacion };
603e5f73a0SCedric Encarnacion
613e5f73a0SCedric Encarnacion static struct pmbus_driver_info ltp8800_info = {
623e5f73a0SCedric Encarnacion .pages = 1,
633e5f73a0SCedric Encarnacion .format[PSC_VOLTAGE_IN] = linear,
643e5f73a0SCedric Encarnacion .format[PSC_VOLTAGE_OUT] = linear,
653e5f73a0SCedric Encarnacion .format[PSC_CURRENT_IN] = linear,
663e5f73a0SCedric Encarnacion .format[PSC_TEMPERATURE] = linear,
673e5f73a0SCedric Encarnacion .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
683e5f73a0SCedric Encarnacion | PMBUS_HAVE_VOUT | PMBUS_HAVE_IOUT
693e5f73a0SCedric Encarnacion | PMBUS_HAVE_TEMP
703e5f73a0SCedric Encarnacion | PMBUS_HAVE_POUT
713e5f73a0SCedric Encarnacion | PMBUS_HAVE_STATUS_VOUT
723e5f73a0SCedric Encarnacion | PMBUS_HAVE_STATUS_INPUT
733e5f73a0SCedric Encarnacion | PMBUS_HAVE_STATUS_TEMP,
74*e09ef2feSCedric Encarnacion #if IS_ENABLED(CONFIG_SENSORS_ADP1050_REGULATOR)
75*e09ef2feSCedric Encarnacion .num_regulators = 1,
76*e09ef2feSCedric Encarnacion .reg_desc = adp1050_reg_desc,
77*e09ef2feSCedric Encarnacion #endif
783e5f73a0SCedric Encarnacion };
793e5f73a0SCedric Encarnacion
adp1050_probe(struct i2c_client * client)8004f17595SRadu Sabau static int adp1050_probe(struct i2c_client *client)
8104f17595SRadu Sabau {
823e5f73a0SCedric Encarnacion struct pmbus_driver_info *info;
833e5f73a0SCedric Encarnacion
843e5f73a0SCedric Encarnacion info = (struct pmbus_driver_info *)i2c_get_match_data(client);
853e5f73a0SCedric Encarnacion if (!info)
863e5f73a0SCedric Encarnacion return -ENODEV;
873e5f73a0SCedric Encarnacion
883e5f73a0SCedric Encarnacion return pmbus_do_probe(client, info);
8904f17595SRadu Sabau }
9004f17595SRadu Sabau
9104f17595SRadu Sabau static const struct i2c_device_id adp1050_id[] = {
923e5f73a0SCedric Encarnacion { .name = "adp1050", .driver_data = (kernel_ulong_t)&adp1050_info },
933e5f73a0SCedric Encarnacion { .name = "adp1051", .driver_data = (kernel_ulong_t)&adp1051_info },
943e5f73a0SCedric Encarnacion { .name = "adp1055", .driver_data = (kernel_ulong_t)&adp1055_info },
953e5f73a0SCedric Encarnacion { .name = "ltp8800", .driver_data = (kernel_ulong_t)<p8800_info },
9604f17595SRadu Sabau {}
9704f17595SRadu Sabau };
9804f17595SRadu Sabau MODULE_DEVICE_TABLE(i2c, adp1050_id);
9904f17595SRadu Sabau
10004f17595SRadu Sabau static const struct of_device_id adp1050_of_match[] = {
1013e5f73a0SCedric Encarnacion { .compatible = "adi,adp1050", .data = &adp1050_info },
1023e5f73a0SCedric Encarnacion { .compatible = "adi,adp1051", .data = &adp1051_info },
1033e5f73a0SCedric Encarnacion { .compatible = "adi,adp1055", .data = &adp1055_info },
1043e5f73a0SCedric Encarnacion { .compatible = "adi,ltp8800", .data = <p8800_info },
10504f17595SRadu Sabau {}
10604f17595SRadu Sabau };
10704f17595SRadu Sabau MODULE_DEVICE_TABLE(of, adp1050_of_match);
10804f17595SRadu Sabau
10904f17595SRadu Sabau static struct i2c_driver adp1050_driver = {
11004f17595SRadu Sabau .driver = {
11104f17595SRadu Sabau .name = "adp1050",
11204f17595SRadu Sabau .of_match_table = adp1050_of_match,
11304f17595SRadu Sabau },
11404f17595SRadu Sabau .probe = adp1050_probe,
11504f17595SRadu Sabau .id_table = adp1050_id,
11604f17595SRadu Sabau };
11704f17595SRadu Sabau module_i2c_driver(adp1050_driver);
11804f17595SRadu Sabau
11904f17595SRadu Sabau MODULE_AUTHOR("Radu Sabau <radu.sabau@analog.com>");
12004f17595SRadu Sabau MODULE_DESCRIPTION("Analog Devices ADP1050 HWMON PMBus Driver");
12104f17595SRadu Sabau MODULE_LICENSE("GPL");
122cdd30ebbSPeter Zijlstra MODULE_IMPORT_NS("PMBUS");
123