Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 77aa3585 authored by Alan Tull's avatar Alan Tull Committed by Guenter Roeck
Browse files

hwmon: (ltc2978) Add regulator support



Add simple on/off regulator support for ltc2978 and
other pmbus parts supported by the ltc2978 driver.

Signed-off-by: default avatarAlan Tull <atull@opensource.altera.com>
Cc: Guenter Roeck <linux@roeck-us.net>
Cc: Mark Brown <broonie@kernel.org>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent ddbb4db4
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -47,15 +47,22 @@ config SENSORS_LM25066
	  be called lm25066.

config SENSORS_LTC2978
	tristate "Linear Technologies LTC2974, LTC2978, LTC3880, and LTC3883"
	tristate "Linear Technologies LTC2978 and compatibles"
	default n
	help
	  If you say yes here you get hardware monitoring support for Linear
	  Technology LTC2974, LTC2978, LTC3880, and LTC3883.
	  Technology LTC2974, LTC2977, LTC2978, LTC3880, LTC3883, and LTM4676.

	  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 LTC2978 and compatibles"
	depends on SENSORS_LTC2978 && REGULATOR
	help
	  If you say yes here you get regulator support for Linear
	  Technology LTC2974, LTC2977, LTC2978, LTC3880, LTC3883, and LTM4676.

config SENSORS_MAX16064
	tristate "Maxim MAX16064"
	default n
+38 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <linux/err.h>
#include <linux/slab.h>
#include <linux/i2c.h>
#include <linux/regulator/driver.h>
#include "pmbus.h"

enum chips { ltc2974, ltc2977, ltc2978, ltc3880, ltc3883, ltm4676 };
@@ -374,6 +375,19 @@ static const struct i2c_device_id ltc2978_id[] = {
};
MODULE_DEVICE_TABLE(i2c, ltc2978_id);

#if IS_ENABLED(CONFIG_SENSORS_LTC2978_REGULATOR)
static const struct regulator_desc ltc2978_reg_desc[] = {
	PMBUS_REGULATOR("vout", 0),
	PMBUS_REGULATOR("vout", 1),
	PMBUS_REGULATOR("vout", 2),
	PMBUS_REGULATOR("vout", 3),
	PMBUS_REGULATOR("vout", 4),
	PMBUS_REGULATOR("vout", 5),
	PMBUS_REGULATOR("vout", 6),
	PMBUS_REGULATOR("vout", 7),
};
#endif /* CONFIG_SENSORS_LTC2978_REGULATOR */

static int ltc2978_probe(struct i2c_client *client,
			 const struct i2c_device_id *id)
{
@@ -487,13 +501,36 @@ static int ltc2978_probe(struct i2c_client *client,
	default:
		return -ENODEV;
	}

#if IS_ENABLED(CONFIG_SENSORS_LTC2978_REGULATOR)
	info->num_regulators = info->pages;
	info->reg_desc = ltc2978_reg_desc;
	if (info->num_regulators > ARRAY_SIZE(ltc2978_reg_desc)) {
		dev_err(&client->dev, "num_regulators too large!");
		info->num_regulators = ARRAY_SIZE(ltc2978_reg_desc);
	}
#endif

	return pmbus_do_probe(client, id, info);
}

/* This is the driver that will be inserted */
#ifdef CONFIG_OF
static const struct of_device_id ltc2978_of_match[] = {
	{ .compatible = "lltc,ltc2974" },
	{ .compatible = "lltc,ltc2977" },
	{ .compatible = "lltc,ltc2978" },
	{ .compatible = "lltc,ltc3880" },
	{ .compatible = "lltc,ltc3883" },
	{ .compatible = "lltc,ltm4676" },
	{ }
};
MODULE_DEVICE_TABLE(of, ltc2978_of_match);
#endif

static struct i2c_driver ltc2978_driver = {
	.driver = {
		   .name = "ltc2978",
		   .of_match_table = of_match_ptr(ltc2978_of_match),
		   },
	.probe = ltc2978_probe,
	.remove = pmbus_do_remove,