summaryrefslogtreecommitdiff
path: root/drivers/hwmon
diff options
context:
space:
mode:
authorZhikui Ren <zhikui.ren@intel.com>2022-02-19 03:56:11 +0300
committerZhikui Ren <zhikui.ren@intel.com>2022-03-16 22:54:36 +0300
commitdea62fa707259a121d2adf0261249a10221e014a (patch)
tree3612dd050bbffdc21dc15969139663e75886e38f /drivers/hwmon
parent12bcf6254d70528ca1bb41222b608705bdfc4294 (diff)
downloadlinux-dea62fa707259a121d2adf0261249a10221e014a.tar.xz
hwmon: (pmbus) Add Renesas RAA229126 VR driver
Added pmbus driver for the new device Renesas raa229126 voltage regulator. Signed-off-by: Zhikui Ren <zhikui.ren@intel.com>
Diffstat (limited to 'drivers/hwmon')
-rw-r--r--drivers/hwmon/pmbus/Kconfig9
-rw-r--r--drivers/hwmon/pmbus/Makefile1
-rw-r--r--drivers/hwmon/pmbus/raa229126.c92
3 files changed, 102 insertions, 0 deletions
diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
index b56bd8542864..960cc47f4e93 100644
--- a/drivers/hwmon/pmbus/Kconfig
+++ b/drivers/hwmon/pmbus/Kconfig
@@ -321,6 +321,15 @@ config SENSORS_Q54SJ108A2
This driver can also be built as a module. If so, the module will
be called q54sj108a2.
+config SENSORS_RAA229126
+ tristate "Renesas RAA229126"
+ help
+ If you say yes here you get hardware monitoring support for Renesas
+ RAA229126.
+
+ This driver can also be built as a module. If so, the module will
+ be called raa229126.
+
config SENSORS_STPDDC60
tristate "ST STPDDC60"
help
diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile
index 61cdc24b1309..09c73316c0bc 100644
--- a/drivers/hwmon/pmbus/Makefile
+++ b/drivers/hwmon/pmbus/Makefile
@@ -35,6 +35,7 @@ obj-$(CONFIG_SENSORS_MP5023) += mp5023.o
obj-$(CONFIG_SENSORS_PM6764TR) += pm6764tr.o
obj-$(CONFIG_SENSORS_PXE1610) += pxe1610.o
obj-$(CONFIG_SENSORS_Q54SJ108A2) += q54sj108a2.o
+obj-$(CONFIG_SENSORS_RAA229126) += raa229126.o
obj-$(CONFIG_SENSORS_STPDDC60) += stpddc60.o
obj-$(CONFIG_SENSORS_TPS40422) += tps40422.o
obj-$(CONFIG_SENSORS_TPS53679) += tps53679.o
diff --git a/drivers/hwmon/pmbus/raa229126.c b/drivers/hwmon/pmbus/raa229126.c
new file mode 100644
index 000000000000..cd2de3ceb5a2
--- /dev/null
+++ b/drivers/hwmon/pmbus/raa229126.c
@@ -0,0 +1,92 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Hardware monitoring driver for RAA229126
+ *
+ * Copyright (c) 2022 Intel Corporation.
+ */
+
+#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+
+#include "pmbus.h"
+
+#define RAA229126_NUM_PAGES 2
+
+static struct pmbus_driver_info raa229126_info = {
+ .pages = RAA229126_NUM_PAGES,
+ .format[PSC_VOLTAGE_IN] = direct,
+ .format[PSC_VOLTAGE_OUT] = direct,
+ .format[PSC_CURRENT_IN] = direct,
+ .format[PSC_CURRENT_OUT] = direct,
+ .format[PSC_TEMPERATURE] = direct,
+ .format[PSC_POWER] = direct,
+ .m[PSC_TEMPERATURE] = 1,
+ .m[PSC_VOLTAGE_OUT] = 1,
+ .R[PSC_VOLTAGE_OUT] = 3,
+ .m[PSC_CURRENT_OUT] = 1,
+ .m[PSC_POWER] = 1,
+ .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_IIN |
+ PMBUS_HAVE_IOUT | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT |
+ PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_VOUT |
+ PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_STATUS_INPUT |
+ PMBUS_HAVE_STATUS_TEMP,
+ .func[1] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_IIN |
+ PMBUS_HAVE_IOUT | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT |
+ PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_VOUT |
+ PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_STATUS_INPUT |
+ PMBUS_HAVE_STATUS_TEMP,
+};
+
+static int raa229126_probe(struct i2c_client *client)
+{
+ struct pmbus_driver_info *info;
+ u8 buf[I2C_SMBUS_BLOCK_MAX];
+ int ret;
+
+ if (!i2c_check_functionality(client->adapter,
+ I2C_FUNC_SMBUS_READ_BYTE_DATA |
+ I2C_FUNC_SMBUS_READ_WORD_DATA |
+ I2C_FUNC_SMBUS_READ_BLOCK_DATA))
+ return -ENODEV;
+
+ /* Read Manufacturer id */
+ ret = i2c_smbus_read_block_data(client, PMBUS_IC_DEVICE_ID, buf);
+ if (ret < 0) {
+ dev_err(&client->dev, "Failed to read PMBUS_IC_DEVICE_ID\n");
+ return ret;
+ }
+ if (ret != 4 || strncmp(buf, "\x00\x82\xd2\x49", 4)) {
+ dev_err(&client->dev, "DEVICE_ID unrecognized\n");
+ return -ENODEV;
+ }
+
+ info = devm_kmemdup(&client->dev, &raa229126_info, sizeof(*info), GFP_KERNEL);
+ if (!info)
+ return -ENOMEM;
+
+ return pmbus_do_probe(client, info);
+}
+
+static const struct i2c_device_id raa229126_id[] = {
+ {"raa229126", 0},
+ {}
+};
+
+MODULE_DEVICE_TABLE(i2c, raa229126_id);
+
+static struct i2c_driver raa229126_driver = {
+ .driver = {
+ .name = "raa229126",
+ },
+ .probe_new = raa229126_probe,
+ .id_table = raa229126_id,
+};
+
+module_i2c_driver(raa229126_driver);
+
+MODULE_AUTHOR("Zhikui Ren <zhikui.ren@intel.com>");
+MODULE_DESCRIPTION("PMBus driver for Renesas RAA229126");
+MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS(PMBUS);