forked from torvalds/linux
Permalink
Show file tree
Hide file tree
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
pmbus: Add support for pli1209bc
PLI1209BC is a Digital Supervisor from Vicor Corporation. Signed-off-by: Marcello Sylvester Bauer <sylv@sylv.io>
- Loading branch information
1 parent
2deb921
commit 0b0d15e123c13b2eb898502661b18d81ed87e325
Showing
4 changed files
with
187 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,73 @@ | ||
| 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 thatprovides | ||
| 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. | ||
| ======================= ======================================================== |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,104 @@ | ||
| // 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_PIN uses a direct format with R=1 */ | ||
| case PMBUS_READ_PIN: | ||
| data = pmbus_read_word_data(client, page, phase, reg); | ||
| if (data < 0) | ||
| return data; | ||
| return div_s64(data + 5LL, 10L); | ||
| 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] = linear, | ||
| .format[PSC_TEMPERATURE] = linear, | ||
| .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, | ||
| .func[0] = 0, /* supervisor summing page without voltage readings */ | ||
| .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 | ||
|
|
||
| /* This is the driver that will be inserted */ | ||
| 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"); |