hwmon: (pmbus) Add support for pli1209bc
PLI1209BC is a Digital Supervisor from Vicor Corporation. Signed-off-by: Marcello Sylvester Bauer <sylv@sylv.io> Link: https://lore.kernel.org/r/4e016e66275bc46c90974aec18b150c874e64787.1645435888.git.sylv@sylv.io Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
parent
b7b94f15e5
commit
d0cd978513
|
@ -161,6 +161,7 @@ Hardware Monitoring Kernel Drivers
|
||||||
pc87427
|
pc87427
|
||||||
pcf8591
|
pcf8591
|
||||||
pim4328
|
pim4328
|
||||||
|
pli1209bc
|
||||||
pm6764tr
|
pm6764tr
|
||||||
pmbus
|
pmbus
|
||||||
powr1220
|
powr1220
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
Kernel driver pli1209bc
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Supported chips:
|
||||||
|
|
||||||
|
* Digital Supervisor PLI1209BC
|
||||||
|
|
||||||
|
Prefix: 'pli1209bc'
|
||||||
|
|
||||||
|
Addresses scanned: 0x50 - 0x5F
|
||||||
|
|
||||||
|
Datasheet: https://www.vicorpower.com/documents/datasheets/ds-PLI1209BCxyzz-VICOR.pdf
|
||||||
|
|
||||||
|
Authors:
|
||||||
|
- Marcello Sylvester Bauer <sylv@sylv.io>
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
|
||||||
|
The Vicor PLI1209BC is an isolated digital power system supervisor that provides
|
||||||
|
a communication interface between a host processor and one Bus Converter Module
|
||||||
|
(BCM). The PLI communicates with a system controller via a PMBus compatible
|
||||||
|
interface over an isolated UART interface. Through the PLI, the host processor
|
||||||
|
can configure, set protection limits, and monitor the BCM.
|
||||||
|
|
||||||
|
Sysfs entries
|
||||||
|
-------------
|
||||||
|
|
||||||
|
======================= ========================================================
|
||||||
|
in1_label "vin2"
|
||||||
|
in1_input Input voltage.
|
||||||
|
in1_rated_min Minimum rated input voltage.
|
||||||
|
in1_rated_max Maximum rated input voltage.
|
||||||
|
in1_max Maximum input voltage.
|
||||||
|
in1_max_alarm Input voltage high alarm.
|
||||||
|
in1_crit Critical input voltage.
|
||||||
|
in1_crit_alarm Input voltage critical alarm.
|
||||||
|
|
||||||
|
in2_label "vout2"
|
||||||
|
in2_input Output voltage.
|
||||||
|
in2_rated_min Minimum rated output voltage.
|
||||||
|
in2_rated_max Maximum rated output voltage.
|
||||||
|
in2_alarm Output voltage alarm
|
||||||
|
|
||||||
|
curr1_label "iin2"
|
||||||
|
curr1_input Input current.
|
||||||
|
curr1_max Maximum input current.
|
||||||
|
curr1_max_alarm Maximum input current high alarm.
|
||||||
|
curr1_crit Critical input current.
|
||||||
|
curr1_crit_alarm Input current critical alarm.
|
||||||
|
|
||||||
|
curr2_label "iout2"
|
||||||
|
curr2_input Output current.
|
||||||
|
curr2_crit Critical output current.
|
||||||
|
curr2_crit_alarm Output current critical alarm.
|
||||||
|
curr2_max Maximum output current.
|
||||||
|
curr2_max_alarm Output current high alarm.
|
||||||
|
|
||||||
|
power1_label "pin2"
|
||||||
|
power1_input Input power.
|
||||||
|
power1_alarm Input power alarm.
|
||||||
|
|
||||||
|
power2_label "pout2"
|
||||||
|
power2_input Output power.
|
||||||
|
power2_rated_max Maximum rated output power.
|
||||||
|
|
||||||
|
temp1_input Die temperature.
|
||||||
|
temp1_alarm Die temperature alarm.
|
||||||
|
temp1_max Maximum die temperature.
|
||||||
|
temp1_max_alarm Die temperature high alarm.
|
||||||
|
temp1_crit Critical die temperature.
|
||||||
|
temp1_crit_alarm Die temperature critical alarm.
|
||||||
|
======================= ========================================================
|
|
@ -317,6 +317,15 @@ config SENSORS_PIM4328
|
||||||
This driver can also be built as a module. If so, the module will
|
This driver can also be built as a module. If so, the module will
|
||||||
be called pim4328.
|
be called pim4328.
|
||||||
|
|
||||||
|
config SENSORS_PLI1209BC
|
||||||
|
tristate "Vicor PLI1209BC"
|
||||||
|
help
|
||||||
|
If you say yes here you get hardware monitoring support for Vicor
|
||||||
|
PLI1209BC Digital Supervisor.
|
||||||
|
|
||||||
|
This driver can also be built as a module. If so, the module will
|
||||||
|
be called pli1209bc.
|
||||||
|
|
||||||
config SENSORS_PM6764TR
|
config SENSORS_PM6764TR
|
||||||
tristate "ST PM6764TR"
|
tristate "ST PM6764TR"
|
||||||
help
|
help
|
||||||
|
|
|
@ -33,6 +33,7 @@ obj-$(CONFIG_SENSORS_MAX8688) += max8688.o
|
||||||
obj-$(CONFIG_SENSORS_MP2888) += mp2888.o
|
obj-$(CONFIG_SENSORS_MP2888) += mp2888.o
|
||||||
obj-$(CONFIG_SENSORS_MP2975) += mp2975.o
|
obj-$(CONFIG_SENSORS_MP2975) += mp2975.o
|
||||||
obj-$(CONFIG_SENSORS_MP5023) += mp5023.o
|
obj-$(CONFIG_SENSORS_MP5023) += mp5023.o
|
||||||
|
obj-$(CONFIG_SENSORS_PLI1209BC) += pli1209bc.o
|
||||||
obj-$(CONFIG_SENSORS_PM6764TR) += pm6764tr.o
|
obj-$(CONFIG_SENSORS_PM6764TR) += pm6764tr.o
|
||||||
obj-$(CONFIG_SENSORS_PXE1610) += pxe1610.o
|
obj-$(CONFIG_SENSORS_PXE1610) += pxe1610.o
|
||||||
obj-$(CONFIG_SENSORS_Q54SJ108A2) += q54sj108a2.o
|
obj-$(CONFIG_SENSORS_Q54SJ108A2) += q54sj108a2.o
|
||||||
|
|
|
@ -0,0 +1,115 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
/*
|
||||||
|
* Hardware monitoring driver for Vicor PLI1209BC Digital Supervisor
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022 9elements GmbH
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/i2c.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/pmbus.h>
|
||||||
|
#include "pmbus.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The capability command is only supported at page 0. Probing the device while
|
||||||
|
* the page register is set to 1 will falsely enable PEC support. Disable
|
||||||
|
* capability probing accordingly, since the PLI1209BC does not have any
|
||||||
|
* additional capabilities.
|
||||||
|
*/
|
||||||
|
static struct pmbus_platform_data pli1209bc_plat_data = {
|
||||||
|
.flags = PMBUS_NO_CAPABILITY,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int pli1209bc_read_word_data(struct i2c_client *client, int page,
|
||||||
|
int phase, int reg)
|
||||||
|
{
|
||||||
|
int data;
|
||||||
|
|
||||||
|
switch (reg) {
|
||||||
|
/* PMBUS_READ_POUT uses a direct format with R=0 */
|
||||||
|
case PMBUS_READ_POUT:
|
||||||
|
data = pmbus_read_word_data(client, page, phase, reg);
|
||||||
|
if (data < 0)
|
||||||
|
return data;
|
||||||
|
data = sign_extend32(data, 15) * 10;
|
||||||
|
return clamp_val(data, -32768, 32767) & 0xffff;
|
||||||
|
default:
|
||||||
|
return -ENODATA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct pmbus_driver_info pli1209bc_info = {
|
||||||
|
.pages = 2,
|
||||||
|
.format[PSC_VOLTAGE_IN] = direct,
|
||||||
|
.format[PSC_VOLTAGE_OUT] = direct,
|
||||||
|
.format[PSC_CURRENT_IN] = direct,
|
||||||
|
.format[PSC_CURRENT_OUT] = direct,
|
||||||
|
.format[PSC_POWER] = direct,
|
||||||
|
.format[PSC_TEMPERATURE] = direct,
|
||||||
|
.m[PSC_VOLTAGE_IN] = 1,
|
||||||
|
.b[PSC_VOLTAGE_IN] = 0,
|
||||||
|
.R[PSC_VOLTAGE_IN] = 1,
|
||||||
|
.m[PSC_VOLTAGE_OUT] = 1,
|
||||||
|
.b[PSC_VOLTAGE_OUT] = 0,
|
||||||
|
.R[PSC_VOLTAGE_OUT] = 1,
|
||||||
|
.m[PSC_CURRENT_IN] = 1,
|
||||||
|
.b[PSC_CURRENT_IN] = 0,
|
||||||
|
.R[PSC_CURRENT_IN] = 3,
|
||||||
|
.m[PSC_CURRENT_OUT] = 1,
|
||||||
|
.b[PSC_CURRENT_OUT] = 0,
|
||||||
|
.R[PSC_CURRENT_OUT] = 2,
|
||||||
|
.m[PSC_POWER] = 1,
|
||||||
|
.b[PSC_POWER] = 0,
|
||||||
|
.R[PSC_POWER] = 1,
|
||||||
|
.m[PSC_TEMPERATURE] = 1,
|
||||||
|
.b[PSC_TEMPERATURE] = 0,
|
||||||
|
.R[PSC_TEMPERATURE] = 0,
|
||||||
|
/*
|
||||||
|
* Page 0 sums up all attributes except voltage readings.
|
||||||
|
* The pli1209 digital supervisor only contains a single BCM, making
|
||||||
|
* page 0 redundant.
|
||||||
|
*/
|
||||||
|
.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_TEMP
|
||||||
|
| PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_STATUS_INPUT,
|
||||||
|
.read_word_data = pli1209bc_read_word_data,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int pli1209bc_probe(struct i2c_client *client)
|
||||||
|
{
|
||||||
|
client->dev.platform_data = &pli1209bc_plat_data;
|
||||||
|
return pmbus_do_probe(client, &pli1209bc_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct i2c_device_id pli1209bc_id[] = {
|
||||||
|
{"pli1209bc", 0},
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
MODULE_DEVICE_TABLE(i2c, pli1209bc_id);
|
||||||
|
|
||||||
|
#ifdef CONFIG_OF
|
||||||
|
static const struct of_device_id pli1209bc_of_match[] = {
|
||||||
|
{ .compatible = "vicor,pli1209bc" },
|
||||||
|
{ },
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, pli1209bc_of_match);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static struct i2c_driver pli1209bc_driver = {
|
||||||
|
.driver = {
|
||||||
|
.name = "pli1209bc",
|
||||||
|
.of_match_table = of_match_ptr(pli1209bc_of_match),
|
||||||
|
},
|
||||||
|
.probe_new = pli1209bc_probe,
|
||||||
|
.id_table = pli1209bc_id,
|
||||||
|
};
|
||||||
|
|
||||||
|
module_i2c_driver(pli1209bc_driver);
|
||||||
|
|
||||||
|
MODULE_AUTHOR("Marcello Sylvester Bauer <sylv@sylv.io>");
|
||||||
|
MODULE_DESCRIPTION("PMBus driver for Vicor PLI1209BC");
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
MODULE_IMPORT_NS(PMBUS);
|
Loading…
Reference in New Issue