From: Alan Tull <atull@xxxxxxxxxxxxxxxxxxxxx> Add regulator with support for enabling or disabling all supplies. Signed-off-by: Alan Tull <atull@xxxxxxxxxxxxxxxxxxxxx> v2: Remove '#include <linux/regulator/machine.h>' Kconfig fixes Remove hardwired regulator_init_data --- drivers/hwmon/pmbus/Kconfig | 7 +++++ drivers/hwmon/pmbus/ltc2978.c | 60 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig index 6e1e493..79117b7 100644 --- a/drivers/hwmon/pmbus/Kconfig +++ b/drivers/hwmon/pmbus/Kconfig @@ -56,6 +56,13 @@ config SENSORS_LTC2978 This driver can also be built as a module. If so, the module will be called ltc2978. +config SENSORS_LTC2978_REGULATOR + boolean "Regulator support for LTC2974, LTC2978, LTC3880, and LTC3883" + depends on SENSORS_LTC2978 && REGULATOR + help + If you say yes here you get regulator support for Linear + Technology LTC2974, LTC2978, LTC3880, and LTC3883. + config SENSORS_MAX16064 tristate "Maxim MAX16064" default n diff --git a/drivers/hwmon/pmbus/ltc2978.c b/drivers/hwmon/pmbus/ltc2978.c index e24ed52..2bdcfe2 100644 --- a/drivers/hwmon/pmbus/ltc2978.c +++ b/drivers/hwmon/pmbus/ltc2978.c @@ -20,6 +20,7 @@ #include <linux/module.h> #include <linux/init.h> #include <linux/err.h> +#include <linux/regulator/driver.h> #include <linux/slab.h> #include <linux/i2c.h> #include "pmbus.h" @@ -151,6 +152,60 @@ static int ltc2978_read_word_data_common(struct i2c_client *client, int page, return ret; } +#if IS_ENABLED(CONFIG_SENSORS_LTC2978_REGULATOR) +static int ltc2978_write_pmbus_operation(struct regulator_dev *rdev, u8 value) +{ + struct device *dev = rdev_get_dev(rdev); + struct i2c_client *client = to_i2c_client(dev->parent); + int ret; + + ret = pmbus_set_page(client, 0xff); + if (ret < 0) + return ret; + + return i2c_smbus_write_byte_data(client, PMBUS_OPERATION, value); +} + +static int ltc2978_enable_all(struct regulator_dev *rdev) +{ + return ltc2978_write_pmbus_operation(rdev, 0x80); +} + +static int ltc2978_disable_all(struct regulator_dev *rdev) +{ + return ltc2978_write_pmbus_operation(rdev, 0); +} + +static int ltc2978_is_enabled(struct regulator_dev *rdev) +{ + struct device *dev = rdev_get_dev(rdev); + struct i2c_client *client = to_i2c_client(dev->parent); + int ret; + + ret = pmbus_set_page(client, 0xff); + if (ret < 0) + return ret; + + ret = i2c_smbus_read_byte_data(client, PMBUS_OPERATION); + if (ret < 0) + return ret; + + return !!(ret & 0x80); +} + +static struct regulator_ops ltc2978_regulator_ops = { + .enable = ltc2978_enable_all, + .disable = ltc2978_disable_all, + .is_enabled = ltc2978_is_enabled, +}; + +static const struct regulator_desc ltc2978_reg_desc = { + .name = "ltc2978", + .ops = <c2978_regulator_ops, + .owner = THIS_MODULE, +}; +#endif + static int ltc2978_read_word_data(struct i2c_client *client, int page, int reg) { const struct pmbus_driver_info *info = pmbus_get_driver_info(client); @@ -487,6 +542,11 @@ static int ltc2978_probe(struct i2c_client *client, default: return -ENODEV; } + +#if IS_ENABLED(CONFIG_SENSORS_LTC2978_REGULATOR) + info->reg_desc = <c2978_reg_desc; +#endif + return pmbus_do_probe(client, id, info); } -- 1.7.9.5 _______________________________________________ lm-sensors mailing list lm-sensors@xxxxxxxxxxxxxx http://lists.lm-sensors.org/mailman/listinfo/lm-sensors