hwmon: (pmbus/core) Implement regulator get_status
authorPatrick Rudolph <patrick.rudolph@9elements.com>
Thu, 24 Nov 2022 19:36:42 +0000 (20:36 +0100)
committerGuenter Roeck <linux@roeck-us.net>
Mon, 5 Dec 2022 00:45:03 +0000 (16:45 -0800)
Add get_status for pmbus_regulator_ops.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Signed-off-by: Naresh Solanki <Naresh.Solanki@9elements.com>
Link: https://lore.kernel.org/r/20221124193642.4081054-1-Naresh.Solanki@9elements.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/pmbus/pmbus_core.c

index 20ca26e..95e9578 100644 (file)
@@ -2855,6 +2855,49 @@ static int pmbus_regulator_get_error_flags(struct regulator_dev *rdev, unsigned
        return 0;
 }
 
+static int pmbus_regulator_get_status(struct regulator_dev *rdev)
+{
+       struct device *dev = rdev_get_dev(rdev);
+       struct i2c_client *client = to_i2c_client(dev->parent);
+       struct pmbus_data *data = i2c_get_clientdata(client);
+       u8 page = rdev_get_id(rdev);
+       int status, ret;
+
+       mutex_lock(&data->update_lock);
+       status = pmbus_get_status(client, page, PMBUS_STATUS_WORD);
+       if (status < 0) {
+               ret = status;
+               goto unlock;
+       }
+
+       if (status & PB_STATUS_OFF) {
+               ret = REGULATOR_STATUS_OFF;
+               goto unlock;
+       }
+
+       /* If regulator is ON & reports power good then return ON */
+       if (!(status & PB_STATUS_POWER_GOOD_N)) {
+               ret = REGULATOR_STATUS_ON;
+               goto unlock;
+       }
+
+       ret = pmbus_regulator_get_error_flags(rdev, &status);
+       if (ret)
+               goto unlock;
+
+       if (status & (REGULATOR_ERROR_UNDER_VOLTAGE | REGULATOR_ERROR_OVER_CURRENT |
+          REGULATOR_ERROR_REGULATION_OUT | REGULATOR_ERROR_FAIL | REGULATOR_ERROR_OVER_TEMP)) {
+               ret = REGULATOR_STATUS_ERROR;
+               goto unlock;
+       }
+
+       ret = REGULATOR_STATUS_UNDEFINED;
+
+unlock:
+       mutex_unlock(&data->update_lock);
+       return ret;
+}
+
 static int pmbus_regulator_get_low_margin(struct i2c_client *client, int page)
 {
        struct pmbus_data *data = i2c_get_clientdata(client);
@@ -2995,6 +3038,7 @@ const struct regulator_ops pmbus_regulator_ops = {
        .disable = pmbus_regulator_disable,
        .is_enabled = pmbus_regulator_is_enabled,
        .get_error_flags = pmbus_regulator_get_error_flags,
+       .get_status = pmbus_regulator_get_status,
        .get_voltage = pmbus_regulator_get_voltage,
        .set_voltage = pmbus_regulator_set_voltage,
        .list_voltage = pmbus_regulator_list_voltage,