Add a device tree bindings for ltc4286 driver.
Signed-off-by: Delphine CC Chiu <Delphine_CC_Chiu@Wiwynn.com>
---
.../bindings/hwmon/lltc,ltc4286.yaml | 49 +++++++++++++++++++
MAINTAINERS | 9 ++++
2 files changed, 58 insertions(+)
create mode 100644 Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml
diff --git a/Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml b/Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml
new file mode 100644
index 000000000000..ad7f6ad888e4
--- /dev/null
+++ b/Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml
@@ -0,0 +1,49 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/hwmon/lltc,ltc4286.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: LTC4286 power monitors
+
+maintainers:
+ - Delphine CC Chiu <Delphine_CC_Chiu@Wiwynn.com>
+
+properties:
+ compatible:
+ enum:
+ - lltc,ltc4286
+ - lltc,ltc4287
+
+ reg:
+ maxItems: 1
+
+ vrange_select_25p6:
+ description:
+ This property is a bool parameter to represent the
+ voltage range is 25.6 or not for this chip.
+
+ shunt-resistor-micro-ohms:
+ description:
+ Resistor value in micro-Ohm
+
+required:
+ - compatible
+ - reg
+ - shunt-resistor-micro-ohms
+
+additionalProperties: false
+
+examples:
+ - |
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ power-sensor@40 {
+ compatible = "lltc,ltc4286";
+ reg = <0x40>;
+ vrange_select_25p6;
+ shunt-resistor-micro-ohms = <300>;
+ };
+ };
diff --git a/MAINTAINERS b/MAINTAINERS
index d516295978a4..7c1cb9bd4f45 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -12344,6 +12344,15 @@ S: Maintained
F: Documentation/hwmon/ltc4261.rst
F: drivers/hwmon/ltc4261.c
+LTC4286 HARDWARE MONITOR DRIVER
+M: Delphine CC Chiu <Delphine_CC_Chiu@Wiwynn.com>
+L: linux-i2c@vger.kernel.org
+S: Maintained
+F: Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml
+F: drivers/hwmon/pmbus/Kconfig
+F: drivers/hwmon/pmbus/Makefile
+F: drivers/hwmon/pmbus/ltc4286.c
+
LTC4306 I2C MULTIPLEXER DRIVER
M: Michael Hennerich <michael.hennerich@analog.com>
L: linux-i2c@vger.kernel.org
--
2.25.1
On Mon, Jul 24, 2023 at 06:05:11PM +0800, Delphine CC Chiu wrote:
> Add a device tree bindings for ltc4286 driver.
>
> Signed-off-by: Delphine CC Chiu <Delphine_CC_Chiu@Wiwynn.com>
> ---
> .../bindings/hwmon/lltc,ltc4286.yaml | 49 +++++++++++++++++++
> MAINTAINERS | 9 ++++
> 2 files changed, 58 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml
>
> diff --git a/Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml b/Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml
> new file mode 100644
> index 000000000000..ad7f6ad888e4
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml
> @@ -0,0 +1,49 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/hwmon/lltc,ltc4286.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: LTC4286 power monitors
> +
> +maintainers:
> + - Delphine CC Chiu <Delphine_CC_Chiu@Wiwynn.com>
> +
> +properties:
> + compatible:
> + enum:
> + - lltc,ltc4286
> + - lltc,ltc4287
> +
> + reg:
> + maxItems: 1
> +
> + vrange_select_25p6:
Needs a vendor prefix and don't use '_'.
> + description:
> + This property is a bool parameter to represent the
We have types, don't define the type in free form text.
> + voltage range is 25.6 or not for this chip.
> +
> + shunt-resistor-micro-ohms:
> + description:
> + Resistor value in micro-Ohm
> +
> +required:
> + - compatible
> + - reg
> + - shunt-resistor-micro-ohms
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + i2c {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + power-sensor@40 {
> + compatible = "lltc,ltc4286";
> + reg = <0x40>;
> + vrange_select_25p6;
> + shunt-resistor-micro-ohms = <300>;
> + };
> + };
> diff --git a/MAINTAINERS b/MAINTAINERS
> index d516295978a4..7c1cb9bd4f45 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -12344,6 +12344,15 @@ S: Maintained
> F: Documentation/hwmon/ltc4261.rst
> F: drivers/hwmon/ltc4261.c
>
> +LTC4286 HARDWARE MONITOR DRIVER
> +M: Delphine CC Chiu <Delphine_CC_Chiu@Wiwynn.com>
> +L: linux-i2c@vger.kernel.org
> +S: Maintained
> +F: Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml
> +F: drivers/hwmon/pmbus/Kconfig
> +F: drivers/hwmon/pmbus/Makefile
> +F: drivers/hwmon/pmbus/ltc4286.c
> +
> LTC4306 I2C MULTIPLEXER DRIVER
> M: Michael Hennerich <michael.hennerich@analog.com>
> L: linux-i2c@vger.kernel.org
> --
> 2.25.1
>
> -----Original Message-----
> From: Rob Herring <robh@kernel.org>
> Sent: Thursday, July 27, 2023 12:44 AM
> To: Delphine_CC_Chiu/WYHQ/Wiwynn <Delphine_CC_Chiu@wiwynn.com>
> Cc: patrick@stwcx.xyz; Jean Delvare <jdelvare@suse.com>; Guenter Roeck
> <linux@roeck-us.net>; Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>;
> Conor Dooley <conor+dt@kernel.org>; linux-i2c@vger.kernel.org;
> linux-hwmon@vger.kernel.org; devicetree@vger.kernel.org;
> linux-kernel@vger.kernel.org
> Subject: Re: [PATCH 1/2] dt-bindings: hwmon: Add lltc ltc4286 driver bindings
>
> Security Reminder: Please be aware that this email is sent by an external
> sender.
>
> On Mon, Jul 24, 2023 at 06:05:11PM +0800, Delphine CC Chiu wrote:
> > Add a device tree bindings for ltc4286 driver.
> >
> > Signed-off-by: Delphine CC Chiu <Delphine_CC_Chiu@Wiwynn.com>
> > ---
> > .../bindings/hwmon/lltc,ltc4286.yaml | 49
> +++++++++++++++++++
> > MAINTAINERS | 9 ++++
> > 2 files changed, 58 insertions(+)
> > create mode 100644
> > Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml
> >
> > diff --git a/Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml
> > b/Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml
> > new file mode 100644
> > index 000000000000..ad7f6ad888e4
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml
> > @@ -0,0 +1,49 @@
> > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) %YAML 1.2
> > +---
> > +$id:
> > +https://apc01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fdevi
> >
> +cetree.org%2Fschemas%2Fhwmon%2Flltc%2Cltc4286.yaml%23&data=05%7C
> 01%7C
> >
> +Wayne_SC_Liu%40wiwynn.com%7Cd2e29aed8bdc47a743e508db8df786ac%7
> Cda6e06
> >
> +28fc834caf9dd273061cbab167%7C0%7C0%7C638259866495880680%7CUnkn
> own%7CT
> >
> +WFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJ
> XVC
> >
> +I6Mn0%3D%7C3000%7C%7C%7C&sdata=n%2FyZyYnSEoCOcUgQFI6BERAgkKa
> zYA%2FmAt
> > +2NAlr1Xdo%3D&reserved=0
> > +$schema:
> > +https://apc01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fdevi
> >
> +cetree.org%2Fmeta-schemas%2Fcore.yaml%23&data=05%7C01%7CWayne_S
> C_Liu%
> >
> +40wiwynn.com%7Cd2e29aed8bdc47a743e508db8df786ac%7Cda6e0628fc834
> caf9dd
> >
> +273061cbab167%7C0%7C0%7C638259866495880680%7CUnknown%7CTWFp
> bGZsb3d8ey
> >
> +JWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%
> 7C30
> >
> +00%7C%7C%7C&sdata=fAA2CUAxdK6MJugvQ1ZRZ1hvB%2FfS%2B8SEOwQ3R
> Z2HEXo%3D&
> > +reserved=0
> > +
> > +title: LTC4286 power monitors
> > +
> > +maintainers:
> > + - Delphine CC Chiu <Delphine_CC_Chiu@Wiwynn.com>
> > +
> > +properties:
> > + compatible:
> > + enum:
> > + - lltc,ltc4286
> > + - lltc,ltc4287
> > +
> > + reg:
> > + maxItems: 1
> > +
> > + vrange_select_25p6:
>
> Needs a vendor prefix and don't use '_'.
We will revise as adi,vrange-select-25p6
>
> > + description:
> > + This property is a bool parameter to represent the
>
> We have types, don't define the type in free form text.
We will revise as below
description:
Specifies which voltage range is used, 25.6 or 102.4.
type: boolean
>
> > + voltage range is 25.6 or not for this chip.
> > +
> > + shunt-resistor-micro-ohms:
> > + description:
> > + Resistor value in micro-Ohm
> > +
> > +required:
> > + - compatible
> > + - reg
> > + - shunt-resistor-micro-ohms
> > +
> > +additionalProperties: false
> > +
> > +examples:
> > + - |
> > + i2c {
> > + #address-cells = <1>;
> > + #size-cells = <0>;
> > +
> > + power-sensor@40 {
> > + compatible = "lltc,ltc4286";
> > + reg = <0x40>;
> > + vrange_select_25p6;
> > + shunt-resistor-micro-ohms = <300>;
> > + };
> > + };
> > diff --git a/MAINTAINERS b/MAINTAINERS index
> > d516295978a4..7c1cb9bd4f45 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -12344,6 +12344,15 @@ S: Maintained
> > F: Documentation/hwmon/ltc4261.rst
> > F: drivers/hwmon/ltc4261.c
> >
> > +LTC4286 HARDWARE MONITOR DRIVER
> > +M: Delphine CC Chiu <Delphine_CC_Chiu@Wiwynn.com>
> > +L: linux-i2c@vger.kernel.org
> > +S: Maintained
> > +F: Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml
> > +F: drivers/hwmon/pmbus/Kconfig
> > +F: drivers/hwmon/pmbus/Makefile
> > +F: drivers/hwmon/pmbus/ltc4286.c
> > +
> > LTC4306 I2C MULTIPLEXER DRIVER
> > M: Michael Hennerich <michael.hennerich@analog.com>
> > L: linux-i2c@vger.kernel.org
> > --
> > 2.25.1
> >
On 24/07/2023 12:05, Delphine CC Chiu wrote: > Add a device tree bindings for ltc4286 driver. > > Signed-off-by: Delphine CC Chiu <Delphine_CC_Chiu@Wiwynn.com> > --- > .../bindings/hwmon/lltc,ltc4286.yaml | 49 +++++++++++++++++++ > MAINTAINERS | 9 ++++ > 2 files changed, 58 insertions(+) > create mode 100644 Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml > You already sent it, so why this duplicate? I also don't understand why this is attached to previous thread. Do not attach (thread) your patchsets to some other threads (unrelated or older versions). This buries them deep in the mailbox and might interfere with applying entire sets. Best regards, Krzysztof
Add a driver to support ltc4286 chip
Signed-off-by: Delphine CC Chiu <Delphine_CC_Chiu@Wiwynn.com>
---
drivers/hwmon/pmbus/Kconfig | 9 +++
drivers/hwmon/pmbus/Makefile | 1 +
drivers/hwmon/pmbus/ltc4286.c | 147 ++++++++++++++++++++++++++++++++++
3 files changed, 157 insertions(+)
create mode 100644 drivers/hwmon/pmbus/ltc4286.c
diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
index 270b6336b76d..7cb9cbff587d 100644
--- a/drivers/hwmon/pmbus/Kconfig
+++ b/drivers/hwmon/pmbus/Kconfig
@@ -226,6 +226,15 @@ config SENSORS_LTC3815
This driver can also be built as a module. If so, the module will
be called ltc3815.
+config SENSORS_LTC4286
+ bool "Analog Devices LTC4286"
+ help
+ LTC4286 is an integrated solution for hot swap applications that
+ allows a board to be safely inserted and removed from a
+ live backplane.
+ This chip could be used to monitor voltage, current, ...etc.
+ If you say yes here you get hardware monitoring support for Analog
+ Devices LTC4286.
config SENSORS_MAX15301
tristate "Maxim MAX15301"
diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile
index 84ee960a6c2d..94e28f6d6a61 100644
--- a/drivers/hwmon/pmbus/Makefile
+++ b/drivers/hwmon/pmbus/Makefile
@@ -24,6 +24,7 @@ obj-$(CONFIG_SENSORS_LM25066) += lm25066.o
obj-$(CONFIG_SENSORS_LT7182S) += lt7182s.o
obj-$(CONFIG_SENSORS_LTC2978) += ltc2978.o
obj-$(CONFIG_SENSORS_LTC3815) += ltc3815.o
+obj-$(CONFIG_SENSORS_LTC4286) += ltc4286.o
obj-$(CONFIG_SENSORS_MAX15301) += max15301.o
obj-$(CONFIG_SENSORS_MAX16064) += max16064.o
obj-$(CONFIG_SENSORS_MAX16601) += max16601.o
diff --git a/drivers/hwmon/pmbus/ltc4286.c b/drivers/hwmon/pmbus/ltc4286.c
new file mode 100644
index 000000000000..b86bf31cfbae
--- /dev/null
+++ b/drivers/hwmon/pmbus/ltc4286.c
@@ -0,0 +1,147 @@
+#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/pmbus.h>
+#include "pmbus.h"
+
+/* LTC4286 register */
+#define LTC4286_MFR_CONFIG1 0xF2
+
+/* LTC4286 configuration */
+#define VRANGE_SELECT_BIT BIT(1)
+
+#define LTC4286_MFR_ID_SIZE 3
+
+enum chips { ltc4286, ltc4287 };
+
+/*
+ * Initialize the MBR as default settings which is referred to LTC4286 datasheet
+ * (March 22, 2022 version) table 3 page 16
+ */
+static struct pmbus_driver_info ltc4286_info = {
+ .pages = 1,
+ .format[PSC_VOLTAGE_IN] = direct,
+ .format[PSC_VOLTAGE_OUT] = direct,
+ .format[PSC_CURRENT_OUT] = direct,
+ .format[PSC_POWER] = direct,
+ .format[PSC_TEMPERATURE] = direct,
+ .m[PSC_VOLTAGE_IN] = 32,
+ .b[PSC_VOLTAGE_IN] = 0,
+ .R[PSC_VOLTAGE_IN] = 1,
+ .m[PSC_VOLTAGE_OUT] = 32,
+ .b[PSC_VOLTAGE_OUT] = 0,
+ .R[PSC_VOLTAGE_OUT] = 1,
+ .m[PSC_CURRENT_OUT] = 1024,
+ .b[PSC_CURRENT_OUT] = 0,
+ .R[PSC_CURRENT_OUT] = 3 - 6, /* To support small shunt resistor value */
+ .m[PSC_POWER] = 1,
+ .b[PSC_POWER] = 0,
+ .R[PSC_POWER] = 4 - 6, /* To support small shunt resistor value */
+ .m[PSC_TEMPERATURE] = 1,
+ .b[PSC_TEMPERATURE] = 273,
+ .R[PSC_TEMPERATURE] = 0,
+ .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_IOUT |
+ PMBUS_HAVE_PIN | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_VOUT |
+ PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_STATUS_TEMP,
+};
+
+static const struct i2c_device_id ltc4286_id[] = { { "ltc4286", ltc4286 },
+ { "ltc4287", ltc4287 },
+ {} };
+MODULE_DEVICE_TABLE(i2c, ltc4286_id);
+
+static int ltc4286_probe(struct i2c_client *client)
+{
+ int ret;
+ u8 block_buffer[I2C_SMBUS_BLOCK_MAX + 1];
+ struct pmbus_driver_info *info;
+ u32 rsense;
+
+ ret = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, block_buffer);
+ if (ret < 0) {
+ dev_err(&client->dev, "failed to read manufacturer id\n");
+ return ret;
+ }
+
+ /*
+ * Refer to ltc4286 datasheet page 20
+ * the manufacturer id is LTC
+ */
+ if (ret != LTC4286_MFR_ID_SIZE ||
+ strncmp(block_buffer, "LTC", LTC4286_MFR_ID_SIZE)) {
+ return dev_err_probe(&client->dev, err,
+ "failed to read manufacturer id\n");
+ }
+
+ ret = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, block_buffer);
+ if (ret < 0) {
+ dev_err(&client->dev, "failed to read manufacturer model\n");
+ return ret;
+ }
+
+ for (mid = ltc4286_id; mid->name[0]; mid++) {
+ if (!strncasecmp(mid->name, block_buffer, strlen(mid->name)))
+ break;
+ }
+
+ ret = of_property_read_u32(client->dev.of_node,
+ "shunt-resistor-micro-ohms", &rsense);
+ if (ret < 0)
+ return ret;
+
+ if (rsense == 0)
+ return -EINVAL;
+
+ info = <c4286_info;
+
+ /* Default of VRANGE_SELECT = 1, 102.4V */
+ if (device_property_read_bool(client->dev, "vrange_select_25p6")) {
+ /* Setup MFR1 CONFIG register bit 1 VRANGE_SELECT */
+ ret = i2c_smbus_read_word_data(client, LTC4286_MFR_CONFIG1);
+ if (ret < 0) {
+ dev_err(&client->dev,
+ "failed to read manufacturer configuration one\n");
+ return ret;
+ }
+
+ ret &= ~VRANGE_SELECT; /* VRANGE_SELECT = 0, 25.6V */
+ ret = i2c_smbus_write_word_data(client, LTC4286_MFR_CONFIG1,
+ ret);
+ if (ret < 0) {
+ dev_err(&client->dev, "failed to set vrange\n");
+ return ret;
+ }
+
+ info->m[PSC_VOLTAGE_IN] = 128;
+ info->m[PSC_VOLTAGE_OUT] = 128;
+ info->m[PSC_POWER] = 4 * rsense;
+ } else
+ info->m[PSC_POWER] = rsense;
+
+ info->m[PSC_CURRENT_OUT] = 1024 * rsense;
+
+ return pmbus_do_probe(client, info);
+}
+
+static const struct of_device_id ltc4286_of_match[] = {
+ { .compatible = "lltc,ltc4286" },
+ { .compatible = "lltc,ltc4287" },
+ {}
+};
+
+static struct i2c_driver ltc4286_driver = {
+ .driver = {
+ .name = "ltc4286",
+ .of_match_table = ltc4286_of_match,
+ },
+ .probe = ltc4286_probe,
+ .id_table = ltc4286_id,
+};
+
+module_i2c_driver(ltc4286_driver);
+
+MODULE_AUTHOR("Delphine CC Chiu <Delphine_CC_Chiu@wiwynn.com>");
+MODULE_DESCRIPTION("PMBUS driver for LTC4286 and compatibles");
+MODULE_LICENSE("GPL");
--
2.25.1
Hi Delphine, On Mon, Jul 24, 2023 at 06:05:12PM +0800, Delphine CC Chiu wrote: > Add a driver to support ltc4286 chip > > Signed-off-by: Delphine CC Chiu <Delphine_CC_Chiu@Wiwynn.com> please resend this series withour using in-reply-to. Please read carefully the comments in v1, add a good description in the commit log, add versioning and changelog in the cover letter and run checkpatch.pl before sending. Thank you, Andi
On 7/24/23 03:05, Delphine CC Chiu wrote:
> Add a driver to support ltc4286 chip
>
No change log, no versioning, did not address all feedback,
sent as reply to previous version instead of independently.
I am not going to re-review this patch. Address all feedback
comments, provide change log and patch versions, and do not
send as reply to previous patch series.
Guenter
> Signed-off-by: Delphine CC Chiu <Delphine_CC_Chiu@Wiwynn.com>
> ---
> drivers/hwmon/pmbus/Kconfig | 9 +++
> drivers/hwmon/pmbus/Makefile | 1 +
> drivers/hwmon/pmbus/ltc4286.c | 147 ++++++++++++++++++++++++++++++++++
> 3 files changed, 157 insertions(+)
> create mode 100644 drivers/hwmon/pmbus/ltc4286.c
>
> diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
> index 270b6336b76d..7cb9cbff587d 100644
> --- a/drivers/hwmon/pmbus/Kconfig
> +++ b/drivers/hwmon/pmbus/Kconfig
> @@ -226,6 +226,15 @@ config SENSORS_LTC3815
>
> This driver can also be built as a module. If so, the module will
> be called ltc3815.
> +config SENSORS_LTC4286
> + bool "Analog Devices LTC4286"
> + help
> + LTC4286 is an integrated solution for hot swap applications that
> + allows a board to be safely inserted and removed from a
> + live backplane.
> + This chip could be used to monitor voltage, current, ...etc.
> + If you say yes here you get hardware monitoring support for Analog
> + Devices LTC4286.
>
> config SENSORS_MAX15301
> tristate "Maxim MAX15301"
> diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile
> index 84ee960a6c2d..94e28f6d6a61 100644
> --- a/drivers/hwmon/pmbus/Makefile
> +++ b/drivers/hwmon/pmbus/Makefile
> @@ -24,6 +24,7 @@ obj-$(CONFIG_SENSORS_LM25066) += lm25066.o
> obj-$(CONFIG_SENSORS_LT7182S) += lt7182s.o
> obj-$(CONFIG_SENSORS_LTC2978) += ltc2978.o
> obj-$(CONFIG_SENSORS_LTC3815) += ltc3815.o
> +obj-$(CONFIG_SENSORS_LTC4286) += ltc4286.o
> obj-$(CONFIG_SENSORS_MAX15301) += max15301.o
> obj-$(CONFIG_SENSORS_MAX16064) += max16064.o
> obj-$(CONFIG_SENSORS_MAX16601) += max16601.o
> diff --git a/drivers/hwmon/pmbus/ltc4286.c b/drivers/hwmon/pmbus/ltc4286.c
> new file mode 100644
> index 000000000000..b86bf31cfbae
> --- /dev/null
> +++ b/drivers/hwmon/pmbus/ltc4286.c
> @@ -0,0 +1,147 @@
> +#include <linux/err.h>
> +#include <linux/i2c.h>
> +#include <linux/init.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/pmbus.h>
> +#include "pmbus.h"
> +
> +/* LTC4286 register */
> +#define LTC4286_MFR_CONFIG1 0xF2
> +
> +/* LTC4286 configuration */
> +#define VRANGE_SELECT_BIT BIT(1)
> +
> +#define LTC4286_MFR_ID_SIZE 3
> +
> +enum chips { ltc4286, ltc4287 };
> +
> +/*
> + * Initialize the MBR as default settings which is referred to LTC4286 datasheet
> + * (March 22, 2022 version) table 3 page 16
> + */
> +static struct pmbus_driver_info ltc4286_info = {
> + .pages = 1,
> + .format[PSC_VOLTAGE_IN] = direct,
> + .format[PSC_VOLTAGE_OUT] = direct,
> + .format[PSC_CURRENT_OUT] = direct,
> + .format[PSC_POWER] = direct,
> + .format[PSC_TEMPERATURE] = direct,
> + .m[PSC_VOLTAGE_IN] = 32,
> + .b[PSC_VOLTAGE_IN] = 0,
> + .R[PSC_VOLTAGE_IN] = 1,
> + .m[PSC_VOLTAGE_OUT] = 32,
> + .b[PSC_VOLTAGE_OUT] = 0,
> + .R[PSC_VOLTAGE_OUT] = 1,
> + .m[PSC_CURRENT_OUT] = 1024,
> + .b[PSC_CURRENT_OUT] = 0,
> + .R[PSC_CURRENT_OUT] = 3 - 6, /* To support small shunt resistor value */
> + .m[PSC_POWER] = 1,
> + .b[PSC_POWER] = 0,
> + .R[PSC_POWER] = 4 - 6, /* To support small shunt resistor value */
> + .m[PSC_TEMPERATURE] = 1,
> + .b[PSC_TEMPERATURE] = 273,
> + .R[PSC_TEMPERATURE] = 0,
> + .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_IOUT |
> + PMBUS_HAVE_PIN | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_VOUT |
> + PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_STATUS_TEMP,
> +};
> +
> +static const struct i2c_device_id ltc4286_id[] = { { "ltc4286", ltc4286 },
> + { "ltc4287", ltc4287 },
> + {} };
> +MODULE_DEVICE_TABLE(i2c, ltc4286_id);
> +
> +static int ltc4286_probe(struct i2c_client *client)
> +{
> + int ret;
> + u8 block_buffer[I2C_SMBUS_BLOCK_MAX + 1];
> + struct pmbus_driver_info *info;
> + u32 rsense;
> +
> + ret = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, block_buffer);
> + if (ret < 0) {
> + dev_err(&client->dev, "failed to read manufacturer id\n");
> + return ret;
> + }
> +
> + /*
> + * Refer to ltc4286 datasheet page 20
> + * the manufacturer id is LTC
> + */
> + if (ret != LTC4286_MFR_ID_SIZE ||
> + strncmp(block_buffer, "LTC", LTC4286_MFR_ID_SIZE)) {
> + return dev_err_probe(&client->dev, err,
> + "failed to read manufacturer id\n");
> + }
> +
> + ret = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, block_buffer);
> + if (ret < 0) {
> + dev_err(&client->dev, "failed to read manufacturer model\n");
> + return ret;
> + }
> +
> + for (mid = ltc4286_id; mid->name[0]; mid++) {
> + if (!strncasecmp(mid->name, block_buffer, strlen(mid->name)))
> + break;
> + }
> +
> + ret = of_property_read_u32(client->dev.of_node,
> + "shunt-resistor-micro-ohms", &rsense);
> + if (ret < 0)
> + return ret;
> +
> + if (rsense == 0)
> + return -EINVAL;
> +
> + info = <c4286_info;
> +
> + /* Default of VRANGE_SELECT = 1, 102.4V */
> + if (device_property_read_bool(client->dev, "vrange_select_25p6")) {
> + /* Setup MFR1 CONFIG register bit 1 VRANGE_SELECT */
> + ret = i2c_smbus_read_word_data(client, LTC4286_MFR_CONFIG1);
> + if (ret < 0) {
> + dev_err(&client->dev,
> + "failed to read manufacturer configuration one\n");
> + return ret;
> + }
> +
> + ret &= ~VRANGE_SELECT; /* VRANGE_SELECT = 0, 25.6V */
> + ret = i2c_smbus_write_word_data(client, LTC4286_MFR_CONFIG1,
> + ret);
> + if (ret < 0) {
> + dev_err(&client->dev, "failed to set vrange\n");
> + return ret;
> + }
> +
> + info->m[PSC_VOLTAGE_IN] = 128;
> + info->m[PSC_VOLTAGE_OUT] = 128;
> + info->m[PSC_POWER] = 4 * rsense;
> + } else
> + info->m[PSC_POWER] = rsense;
> +
> + info->m[PSC_CURRENT_OUT] = 1024 * rsense;
> +
> + return pmbus_do_probe(client, info);
> +}
> +
> +static const struct of_device_id ltc4286_of_match[] = {
> + { .compatible = "lltc,ltc4286" },
> + { .compatible = "lltc,ltc4287" },
> + {}
> +};
> +
> +static struct i2c_driver ltc4286_driver = {
> + .driver = {
> + .name = "ltc4286",
> + .of_match_table = ltc4286_of_match,
> + },
> + .probe = ltc4286_probe,
> + .id_table = ltc4286_id,
> +};
> +
> +module_i2c_driver(ltc4286_driver);
> +
> +MODULE_AUTHOR("Delphine CC Chiu <Delphine_CC_Chiu@wiwynn.com>");
> +MODULE_DESCRIPTION("PMBUS driver for LTC4286 and compatibles");
> +MODULE_LICENSE("GPL");
© 2016 - 2026 Red Hat, Inc.