Commit 9158411b authored by Robert Hancock's avatar Robert Hancock Committed by Guenter Roeck
Browse files

hwmon: (pmbus) Add Infineon IRPS5401 driver



Add a driver to support the Infineon IRPS5401 PMIC. This chip has 5
pages corresponding to 4 switching outputs and one linear (LDO) output.
The switching and LDO outputs have slightly different supported
parameters.

Signed-off-by: default avatarRobert Hancock <hancock@sedsystems.ca>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent b67b7356
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -64,6 +64,15 @@ config SENSORS_IR38064
	  This driver can also be built as a module. If so, the module will
	  be called ir38064.

config SENSORS_IRPS5401
	tristate "Infineon IRPS5401"
	help
	  If you say yes here you get hardware monitoring support for the
	  Infineon IRPS5401 controller.

	  This driver can also be built as a module. If so, the module will
	  be called irps5401.

config SENSORS_ISL68137
	tristate "Intersil ISL68137"
	help
+1 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ obj-$(CONFIG_SENSORS_ADM1275) += adm1275.o
obj-$(CONFIG_SENSORS_IBM_CFFPS)	+= ibm-cffps.o
obj-$(CONFIG_SENSORS_IR35221)	+= ir35221.o
obj-$(CONFIG_SENSORS_IR38064)	+= ir38064.o
obj-$(CONFIG_SENSORS_IRPS5401)	+= irps5401.o
obj-$(CONFIG_SENSORS_ISL68137)	+= isl68137.o
obj-$(CONFIG_SENSORS_LM25066)	+= lm25066.o
obj-$(CONFIG_SENSORS_LTC2978)	+= ltc2978.o
+67 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0+
/*
 * Hardware monitoring driver for the Infineon IRPS5401M PMIC.
 *
 * Copyright (c) 2019 SED Systems, a division of Calian Ltd.
 *
 * The device supports VOUT_PEAK, IOUT_PEAK, and TEMPERATURE_PEAK, however
 * this driver does not currently support them.
 */

#include <linux/err.h>
#include <linux/i2c.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include "pmbus.h"

#define IRPS5401_SW_FUNC (PMBUS_HAVE_VIN | PMBUS_HAVE_IIN | \
			  PMBUS_HAVE_STATUS_INPUT | \
			  PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | \
			  PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | \
			  PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | \
			  PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP)

#define IRPS5401_LDO_FUNC (PMBUS_HAVE_VIN | \
			   PMBUS_HAVE_STATUS_INPUT | \
			   PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | \
			   PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | \
			   PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | \
			   PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP)

static struct pmbus_driver_info irps5401_info = {
	.pages = 5,
	.func[0] = IRPS5401_SW_FUNC,
	.func[1] = IRPS5401_SW_FUNC,
	.func[2] = IRPS5401_SW_FUNC,
	.func[3] = IRPS5401_SW_FUNC,
	.func[4] = IRPS5401_LDO_FUNC,
};

static int irps5401_probe(struct i2c_client *client,
			  const struct i2c_device_id *id)
{
	return pmbus_do_probe(client, id, &irps5401_info);
}

static const struct i2c_device_id irps5401_id[] = {
	{"irps5401", 0},
	{}
};

MODULE_DEVICE_TABLE(i2c, irps5401_id);

static struct i2c_driver irps5401_driver = {
	.driver = {
		   .name = "irps5401",
		   },
	.probe = irps5401_probe,
	.remove = pmbus_do_remove,
	.id_table = irps5401_id,
};

module_i2c_driver(irps5401_driver);

MODULE_AUTHOR("Robert Hancock");
MODULE_DESCRIPTION("PMBus driver for Infineon IRPS5401");
MODULE_LICENSE("GPL");