xref: /openbmc/linux/drivers/hwmon/pmbus/irps5401.c (revision 9158411b96b14d9d448e978b0fc8a1cffcb8a1c6)
1*9158411bSRobert Hancock // SPDX-License-Identifier: GPL-2.0+
2*9158411bSRobert Hancock /*
3*9158411bSRobert Hancock  * Hardware monitoring driver for the Infineon IRPS5401M PMIC.
4*9158411bSRobert Hancock  *
5*9158411bSRobert Hancock  * Copyright (c) 2019 SED Systems, a division of Calian Ltd.
6*9158411bSRobert Hancock  *
7*9158411bSRobert Hancock  * The device supports VOUT_PEAK, IOUT_PEAK, and TEMPERATURE_PEAK, however
8*9158411bSRobert Hancock  * this driver does not currently support them.
9*9158411bSRobert Hancock  */
10*9158411bSRobert Hancock 
11*9158411bSRobert Hancock #include <linux/err.h>
12*9158411bSRobert Hancock #include <linux/i2c.h>
13*9158411bSRobert Hancock #include <linux/init.h>
14*9158411bSRobert Hancock #include <linux/kernel.h>
15*9158411bSRobert Hancock #include <linux/module.h>
16*9158411bSRobert Hancock #include "pmbus.h"
17*9158411bSRobert Hancock 
18*9158411bSRobert Hancock #define IRPS5401_SW_FUNC (PMBUS_HAVE_VIN | PMBUS_HAVE_IIN | \
19*9158411bSRobert Hancock 			  PMBUS_HAVE_STATUS_INPUT | \
20*9158411bSRobert Hancock 			  PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | \
21*9158411bSRobert Hancock 			  PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | \
22*9158411bSRobert Hancock 			  PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | \
23*9158411bSRobert Hancock 			  PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP)
24*9158411bSRobert Hancock 
25*9158411bSRobert Hancock #define IRPS5401_LDO_FUNC (PMBUS_HAVE_VIN | \
26*9158411bSRobert Hancock 			   PMBUS_HAVE_STATUS_INPUT | \
27*9158411bSRobert Hancock 			   PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | \
28*9158411bSRobert Hancock 			   PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | \
29*9158411bSRobert Hancock 			   PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | \
30*9158411bSRobert Hancock 			   PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP)
31*9158411bSRobert Hancock 
32*9158411bSRobert Hancock static struct pmbus_driver_info irps5401_info = {
33*9158411bSRobert Hancock 	.pages = 5,
34*9158411bSRobert Hancock 	.func[0] = IRPS5401_SW_FUNC,
35*9158411bSRobert Hancock 	.func[1] = IRPS5401_SW_FUNC,
36*9158411bSRobert Hancock 	.func[2] = IRPS5401_SW_FUNC,
37*9158411bSRobert Hancock 	.func[3] = IRPS5401_SW_FUNC,
38*9158411bSRobert Hancock 	.func[4] = IRPS5401_LDO_FUNC,
39*9158411bSRobert Hancock };
40*9158411bSRobert Hancock 
41*9158411bSRobert Hancock static int irps5401_probe(struct i2c_client *client,
42*9158411bSRobert Hancock 			  const struct i2c_device_id *id)
43*9158411bSRobert Hancock {
44*9158411bSRobert Hancock 	return pmbus_do_probe(client, id, &irps5401_info);
45*9158411bSRobert Hancock }
46*9158411bSRobert Hancock 
47*9158411bSRobert Hancock static const struct i2c_device_id irps5401_id[] = {
48*9158411bSRobert Hancock 	{"irps5401", 0},
49*9158411bSRobert Hancock 	{}
50*9158411bSRobert Hancock };
51*9158411bSRobert Hancock 
52*9158411bSRobert Hancock MODULE_DEVICE_TABLE(i2c, irps5401_id);
53*9158411bSRobert Hancock 
54*9158411bSRobert Hancock static struct i2c_driver irps5401_driver = {
55*9158411bSRobert Hancock 	.driver = {
56*9158411bSRobert Hancock 		   .name = "irps5401",
57*9158411bSRobert Hancock 		   },
58*9158411bSRobert Hancock 	.probe = irps5401_probe,
59*9158411bSRobert Hancock 	.remove = pmbus_do_remove,
60*9158411bSRobert Hancock 	.id_table = irps5401_id,
61*9158411bSRobert Hancock };
62*9158411bSRobert Hancock 
63*9158411bSRobert Hancock module_i2c_driver(irps5401_driver);
64*9158411bSRobert Hancock 
65*9158411bSRobert Hancock MODULE_AUTHOR("Robert Hancock");
66*9158411bSRobert Hancock MODULE_DESCRIPTION("PMBus driver for Infineon IRPS5401");
67*9158411bSRobert Hancock MODULE_LICENSE("GPL");
68