hwmon: (pmbus/core) add wp module param

Add a module parameter to force the write protection mode of pmbus chips.

4 protections modes are provided to start with:
* 0: Remove the write protection
* 1: Disable all writes except to the WRITE_PROTECT, OPERATION,
     PAGE, ON_OFF_CONFIG and VOUT_COMMAND commands
* 2: Disable all writes except to the WRITE_PROTECT, OPERATION and
     PAGE commands
* 3: Disable all writes except to the WRITE_PROTECT command

Of course, if the parameter is not provided, the default write protection
status of the pmbus chips is left untouched.

Suggested-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
Jerome Brunet 2024-12-02 11:28:01 +01:00 committed by Guenter Roeck
parent f404525775
commit 83bed3c159
2 changed files with 50 additions and 0 deletions

View File

@ -387,3 +387,24 @@ PMBUS_VOUT_PROTECTED
Set if the chip VOUT_COMMAND command is protected and protection is not
determined by the standard WRITE_PROTECT command.
Module parameter
----------------
pmbus_core.wp: PMBus write protect forced mode
PMBus may come up with a variety of write protection configuration.
'pmbus_core.wp' may be used if a particular write protection is necessary.
The ability to actually alter the protection may also depend on the chip
so the actual runtime write protection configuration may differ from
the requested one. pmbus_core currently support the following value:
* 0: write protection removed.
* 1: Disable all writes except to the WRITE_PROTECT, OPERATION,
PAGE, ON_OFF_CONFIG and VOUT_COMMAND commands.
* 2: Disable all writes except to the WRITE_PROTECT, OPERATION and
PAGE commands.
* 3: Disable all writes except to the WRITE_PROTECT command. Note that
protection should include the PAGE register. This may be problematic
for multi-page chips, if the chips strictly follows the PMBus
specification, preventing the chip from changing the active page.

View File

@ -31,6 +31,9 @@
#define PMBUS_ATTR_ALLOC_SIZE 32
#define PMBUS_NAME_SIZE 24
static int wp = -1;
module_param(wp, int, 0444);
struct pmbus_sensor {
struct pmbus_sensor *next;
char name[PMBUS_NAME_SIZE]; /* sysfs sensor name */
@ -2669,6 +2672,32 @@ static void pmbus_init_wp(struct i2c_client *client, struct pmbus_data *data)
{
int ret;
switch (wp) {
case 0:
_pmbus_write_byte_data(client, -1,
PMBUS_WRITE_PROTECT, 0);
break;
case 1:
_pmbus_write_byte_data(client, -1,
PMBUS_WRITE_PROTECT, PB_WP_VOUT);
break;
case 2:
_pmbus_write_byte_data(client, -1,
PMBUS_WRITE_PROTECT, PB_WP_OP);
break;
case 3:
_pmbus_write_byte_data(client, -1,
PMBUS_WRITE_PROTECT, PB_WP_ALL);
break;
default:
/* Ignore the other values */
break;
}
ret = _pmbus_read_byte_data(client, -1, PMBUS_WRITE_PROTECT);
if (ret < 0)
return;