xref: /linux/drivers/hwmon/pmbus/adp1050.c (revision be413ec746afc951c79d5907cf62ab6757330bdb)
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)&ltp8800_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 = &ltp8800_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