From nobody Wed Sep 17 10:16:15 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 62BA7C001B2 for ; Tue, 20 Dec 2022 00:05:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232556AbiLTAFu (ORCPT ); Mon, 19 Dec 2022 19:05:50 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51740 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231356AbiLTAFq (ORCPT ); Mon, 19 Dec 2022 19:05:46 -0500 Received: from mail-vk1-xa2a.google.com (mail-vk1-xa2a.google.com [IPv6:2607:f8b0:4864:20::a2a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 57858B19 for ; Mon, 19 Dec 2022 16:05:44 -0800 (PST) Received: by mail-vk1-xa2a.google.com with SMTP id l17so5063321vkk.3 for ; Mon, 19 Dec 2022 16:05:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=criticallink.com; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=G59VUoYCYBv5qqU0FdCva5W7yGEol89ZbTDgHWp0E9c=; b=kDGDteB5WOxEchK4gxDFhktVnxnr/Tpl/pqw7FQIf7ZksP/JUXPMxV3UygnBcu7eJc 6PiE+rvGqhG/EYXR9RjbMcICv68jocI/wgZgs+9U+ViiZCVKPopHJXYX429QcC38algI 93AXg33hENRyzvNuUampu9TV0RrfUAp8SREVAV4tIwjg9Lx4c6wYQ9L0MV5+XeAvT8E8 vcW1iI1dzuihxd2UgCWOelipEVe187KUlCy8OlrDHpxBN74UFMpojSINk0coyKrRFm/Q Q0S+hm1y5fKP7uObK2x9toZM4Cz+XPuX3lw+G8tEHXdbeUt7XtV0JUrVD0EhRW7tXXBI uLjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=G59VUoYCYBv5qqU0FdCva5W7yGEol89ZbTDgHWp0E9c=; b=fPrYFerE2OEZQuN3Ky4t8YM3koG1ixOJtaCH9qBwxIhO2/UhoONue+taFuTga8UMDs rr+5pVlfitNwrDA7nQPQmCeS0UvQCm6Q9XiuP6THQcGaZNWMUfgWk8fgPWCvncy/HUED ruENgdvewJY+BdK6lV/9Ud4mynDB/pL97q3kY1fOfMw/KedMmWvAsF3x4QnWEEFxiRJx QfapxzpE0EMet0PTuwPcWb/TOBZpfI4CpmUXVGCifvLlQCFNFblCUBsLw44DQKrAVXik xCPrk6s5X4KQsBvy7haj2F4O8qI/N2b/E96PhjDVzrTeiAe4AQ4UX/YVbheYz0txvJb4 f3Sw== X-Gm-Message-State: ANoB5pm+XotfiElEpdvJuX8gDLZQ5eTTnp1BoQU8s9g1+XBAt0RNd2w7 vIfVioRhKlFWBGcKxgwvXRPx6SSFN0iUc+9u X-Google-Smtp-Source: AA0mqf6nr9rPIT/93wH9Wwojg6ZgmajQ77U368ipgDhyVv57qjtoc6a7dYHFA0JFocabVfPzGN997A== X-Received: by 2002:a1f:ab85:0:b0:3c0:f9ac:51e1 with SMTP id u127-20020a1fab85000000b003c0f9ac51e1mr20909923vke.1.1671494743378; Mon, 19 Dec 2022 16:05:43 -0800 (PST) Received: from jcormier-MS-7A93.syr.criticallink.com (static-72-90-70-109.syrcny.fios.verizon.net. [72.90.70.109]) by smtp.gmail.com with ESMTPSA id o70-20020a374149000000b006e702033b15sm7721430qka.66.2022.12.19.16.05.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Dec 2022 16:05:42 -0800 (PST) From: "Cormier, Jonathan" To: linux-hwmon@vger.kernel.org Cc: "Cormier, Jonathan" , Jean Delvare , Guenter Roeck , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Rob Herring , Krzysztof Kozlowski , Bob Duke , John Pruitt Subject: [PATCH v2 1/4] dt-bindings: hwmon: adi,ltc2945: Add binding Date: Mon, 19 Dec 2022 19:04:54 -0500 Message-Id: <20221220000457.1163446-2-jcormier@criticallink.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221220000457.1163446-1-jcormier@criticallink.com> References: <20221214220727.1350784-1-jcormier@criticallink.com> <20221220000457.1163446-1-jcormier@criticallink.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Create initial binding for the LTC2945 I2C power monitor. Also adds shunt-resistor-micro-ohms parameter Signed-off-by: "Cormier, Jonathan" --- .../bindings/hwmon/adi,ltc2945.yaml | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 Documentation/devicetree/bindings/hwmon/adi,ltc2945.yaml diff --git a/Documentation/devicetree/bindings/hwmon/adi,ltc2945.yaml b/Doc= umentation/devicetree/bindings/hwmon/adi,ltc2945.yaml new file mode 100644 index 000000000000..f90d40919ee6 --- /dev/null +++ b/Documentation/devicetree/bindings/hwmon/adi,ltc2945.yaml @@ -0,0 +1,50 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/hwmon/adi,ltc2945.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Analog Devices LTC2945 wide range i2c power monitor + +maintainers: + - Guenter Roeck + +description: | + Analog Devices LTC2945 wide range i2c power monitor over I2C. + + https://www.analog.com/media/en/technical-documentation/data-sheets/LTC2= 945.pdf + +properties: + compatible: + enum: + - adi,ltc2945 + + reg: + maxItems: 1 + + shunt-resistor-micro-ohms: + description: + Shunt resistor value in micro-Ohms + default: 1000 + +required: + - compatible + - reg + + +additionalProperties: false + +examples: + - | + i2c { + #address-cells =3D <1>; + #size-cells =3D <0>; + + power-monitor@6e { + compatible =3D "adi,ltc2945"; + reg =3D <0x6e>; + /* 10 milli-Ohm shunt resistor */ + shunt-resistor-micro-ohms =3D <10000>; + }; + }; +... -- 2.25.1 From nobody Wed Sep 17 10:16:15 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1D2B8C4332F for ; Tue, 20 Dec 2022 00:06:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232832AbiLTAGA (ORCPT ); Mon, 19 Dec 2022 19:06:00 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51796 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232577AbiLTAFr (ORCPT ); Mon, 19 Dec 2022 19:05:47 -0500 Received: from mail-vk1-xa34.google.com (mail-vk1-xa34.google.com [IPv6:2607:f8b0:4864:20::a34]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 75FD128D for ; Mon, 19 Dec 2022 16:05:45 -0800 (PST) Received: by mail-vk1-xa34.google.com with SMTP id t191so5066356vkb.4 for ; Mon, 19 Dec 2022 16:05:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=criticallink.com; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=LJMGVx/c3dHDkaRWc2L4bcsVUSNNmncwpOKzTe9TVL4=; b=Ofzaz35lynvdnSiVHvcRnf9yKy6m1B644SLmuzdMMIXjSlGONBbNGyWZxmhelAA821 9Gkgbwj3AWCKPYaeEHqgFJzszxBDUeRSRog7ByMZTfLlfcC37gU2gaZ7SDNKkVCRJ/hq QiM8yeOQx4LSCfWYiW5RjGQEVznzRaYzfzkKRfZnmyj/oT3pJDxW3q3LZRxxMlEsZCww qUnkB3k5fttcGXz5zP2sITuTrE51/15enY8Ed7LHYGbmXlEwJqKBDtuTveAsMAAr7Yu6 Z7r2qQdeLMqvROT02KT1SzpkFTmXV/K4JHfSafNb+3z6AKGeCLJfLncE77xCJ2mOoKEI xffg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LJMGVx/c3dHDkaRWc2L4bcsVUSNNmncwpOKzTe9TVL4=; b=kGfvBQQtZccl/Dle3vMh2KbTDzDlQcIVIHwee7lvfiIrRGk+oMAEy/PHyQEUwl1G4v cyD/EIvQgpQOaTG9VEiZ3KlqLlFcRIS3sQeVeChGzjftqQBTsuNz3ja6RuHAue2k5+r7 Ot5VTWrQdos3c36sKraEmftpM/2Ew7J7j1nfyGHdcPiBoUuBmLybIGKUpQgwIECY3D5k oEv1wNX4QuIv9YK6Bscyey5v4AuykjYEag3vgkYc0CiWajAJ6gvBVQrcTOGo8mf3wMNW 1Ayat+33s1pfti6zB3CYKwV3KgykjZVT8B0QKHaMLWL3FmSWyLR5ipdvn/GZhFiJZuw0 vHzw== X-Gm-Message-State: AFqh2krEmsPC+isTgc81Nai6LGhsolIRM6gjVjulMP3FO7m4gTE7Mdu8 T/K22Q0O5m3tz9YReBvqcMDdQA== X-Google-Smtp-Source: AMrXdXvSPx43BorZHVkyiUnmAzJzGL1p82hYUfox9RY15Fdm7ViTbM2ltazSaxSD+qOxQt7rNf59kg== X-Received: by 2002:a05:6122:45d:b0:3c6:bdf4:695b with SMTP id f29-20020a056122045d00b003c6bdf4695bmr9378658vkk.5.1671494744542; Mon, 19 Dec 2022 16:05:44 -0800 (PST) Received: from jcormier-MS-7A93.syr.criticallink.com (static-72-90-70-109.syrcny.fios.verizon.net. [72.90.70.109]) by smtp.gmail.com with ESMTPSA id o70-20020a374149000000b006e702033b15sm7721430qka.66.2022.12.19.16.05.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Dec 2022 16:05:44 -0800 (PST) From: "Cormier, Jonathan" To: linux-hwmon@vger.kernel.org Cc: "Cormier, Jonathan" , Jean Delvare , Guenter Roeck , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Rob Herring , Krzysztof Kozlowski , Bob Duke , John Pruitt Subject: [PATCH v2 2/4] hwmon: ltc2945: Add devicetree match table Date: Mon, 19 Dec 2022 19:04:55 -0500 Message-Id: <20221220000457.1163446-3-jcormier@criticallink.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221220000457.1163446-1-jcormier@criticallink.com> References: <20221214220727.1350784-1-jcormier@criticallink.com> <20221220000457.1163446-1-jcormier@criticallink.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Signed-off-by: "Cormier, Jonathan" --- drivers/hwmon/ltc2945.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/hwmon/ltc2945.c b/drivers/hwmon/ltc2945.c index 9adebb59f604..9af3e3821152 100644 --- a/drivers/hwmon/ltc2945.c +++ b/drivers/hwmon/ltc2945.c @@ -58,6 +58,12 @@ #define CONTROL_MULT_SELECT (1 << 0) #define CONTROL_TEST_MODE (1 << 4) +static const struct of_device_id __maybe_unused ltc2945_of_match[] =3D { + { .compatible =3D "adi,ltc2945" }, + { } +}; +MODULE_DEVICE_TABLE(of, ltc2945_of_match); + static inline bool is_power_reg(u8 reg) { return reg < LTC2945_SENSE_H; @@ -475,8 +481,9 @@ MODULE_DEVICE_TABLE(i2c, ltc2945_id); static struct i2c_driver ltc2945_driver =3D { .driver =3D { - .name =3D "ltc2945", - }, + .name =3D "ltc2945", + .of_match_table =3D of_match_ptr(ltc2945_of_match), + }, .probe_new =3D ltc2945_probe, .id_table =3D ltc2945_id, }; -- 2.25.1 From nobody Wed Sep 17 10:16:15 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 02CB6C4332F for ; Tue, 20 Dec 2022 00:06:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232671AbiLTAGH (ORCPT ); Mon, 19 Dec 2022 19:06:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51866 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232683AbiLTAFs (ORCPT ); Mon, 19 Dec 2022 19:05:48 -0500 Received: from mail-yw1-x1129.google.com (mail-yw1-x1129.google.com [IPv6:2607:f8b0:4864:20::1129]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 224341166 for ; Mon, 19 Dec 2022 16:05:46 -0800 (PST) Received: by mail-yw1-x1129.google.com with SMTP id 00721157ae682-4407c61433bso105982227b3.9 for ; Mon, 19 Dec 2022 16:05:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=criticallink.com; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=GdJqSX2G2zw0Vj3PmkjTC4cwbi3aa13NSHPDTsl1J+I=; b=fkXAdZn91R0RYe5eyEr7h0qBxh4XaS9GCJku1R38NQkWi6RyFAybKqhz7bNctPbcuC j2+u5vQHsMWhX6dI+EhhTaknK2q0br1LDeNI+0EAVlFI4tCZgUdzZnQjci7axTp6B19D WpeEur7Ej6AJjpijR9vhIvQJ/RZ4vTb5/0j1p8LaEhJicoCQsVGGNbUJ8JtDGQJePh0W PnO4yfX8wFdrTmM6D3Lwxejk1t4vT1PK/ebIze14pvitG5KKH055VzDpJOn0wUt3EG9t UXZfnURZVUqA9m66hEtzvD0Fhf9ckF1RiiMK+1eKv+uA1vpFRcF29bLhm4iv17NnkZj2 b4LQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=GdJqSX2G2zw0Vj3PmkjTC4cwbi3aa13NSHPDTsl1J+I=; b=GLqRgs5fal9hQUjw/ayYuo0yjGNbsW5aoATuxPdmDTeGkhNwB4zboW41Ksum3geo10 iMGxOl9nhurl5MH6HXFGOCkq8FcfvhCDJ0lId8haAMkVEFk4h8thhdFv3MgM/baQUNII V8Z+MS32gMpovUx3Dbm2Nigv3LRUkq6qJY4PTSa+hPQkId5rxr4Oeo0gSlqNCLNwgSiN 16s6et78oBcuXWQso7c5H0n+Zze3JIOBIp/v3ngURkiAou8INsGl8POaXu2XZVehhkq1 JiPHm8jdWx84jt+19/Tq0Oz6YugQhjh4xy7UVslTMNAgnxWtnH3D6L4q4a+zmOzHJcyx 71UA== X-Gm-Message-State: ANoB5pmFxiQKARfJdRPbxNvn4L3yqNEc3qH7wFlbZ3fuQA2CiUX1w/KT SceXaLxfJmHgwy5gf0k4MACisg== X-Google-Smtp-Source: AA0mqf5LTN8DHah6oM83AyHQOGC75QHe+IZ5VXtogmysJmmTdV3ufndrh4LjCwVdv8r7cs2XDXczSA== X-Received: by 2002:a05:7500:1d8f:b0:ea:51d4:37a2 with SMTP id dv15-20020a0575001d8f00b000ea51d437a2mr4022846gab.49.1671494745752; Mon, 19 Dec 2022 16:05:45 -0800 (PST) Received: from jcormier-MS-7A93.syr.criticallink.com (static-72-90-70-109.syrcny.fios.verizon.net. [72.90.70.109]) by smtp.gmail.com with ESMTPSA id o70-20020a374149000000b006e702033b15sm7721430qka.66.2022.12.19.16.05.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Dec 2022 16:05:45 -0800 (PST) From: "Cormier, Jonathan" To: linux-hwmon@vger.kernel.org Cc: John Pruitt , Jean Delvare , Guenter Roeck , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Rob Herring , Krzysztof Kozlowski , Bob Duke , "Cormier, Jonathan" Subject: [PATCH v2 3/4] hwmon: ltc2945: Allow setting shunt resistor Date: Mon, 19 Dec 2022 19:04:56 -0500 Message-Id: <20221220000457.1163446-4-jcormier@criticallink.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221220000457.1163446-1-jcormier@criticallink.com> References: <20221214220727.1350784-1-jcormier@criticallink.com> <20221220000457.1163446-1-jcormier@criticallink.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: John Pruitt Added the ability to specify the value of the shunt resistor in the device tree instead of assuming it is 1 milliOhm. The value in the device tree has the name shunt-resistor-micro-ohms and the default value is 1000 micro-ohms in order to preserve the current behavior. Signed-off-by: "Cormier, Jonathan" Signed-off-by: John Pruitt --- drivers/hwmon/ltc2945.c | 80 +++++++++++++++++++++++++---------------- 1 file changed, 50 insertions(+), 30 deletions(-) diff --git a/drivers/hwmon/ltc2945.c b/drivers/hwmon/ltc2945.c index 9af3e3821152..fc7d399b2c85 100644 --- a/drivers/hwmon/ltc2945.c +++ b/drivers/hwmon/ltc2945.c @@ -64,6 +64,16 @@ static const struct of_device_id __maybe_unused ltc2945_= of_match[] =3D { }; MODULE_DEVICE_TABLE(of, ltc2945_of_match); +/** + * struct ltc2945_data - LTC2945 device data + * @regmap: regmap device + * @shunt_resistor: shunt resistor value in micro ohms (1000 by default) + */ +struct ltc2945_data { + struct regmap *regmap; + u32 shunt_resistor; +}; + static inline bool is_power_reg(u8 reg) { return reg < LTC2945_SENSE_H; @@ -72,7 +82,9 @@ static inline bool is_power_reg(u8 reg) /* Return the value from the given register in uW, mV, or mA */ static long long ltc2945_reg_to_val(struct device *dev, u8 reg) { - struct regmap *regmap =3D dev_get_drvdata(dev); + struct ltc2945_data *data =3D dev_get_drvdata(dev); + struct regmap *regmap =3D data->regmap; + u32 shunt_resistor =3D data->shunt_resistor; unsigned int control; u8 buf[3]; long long val; @@ -98,9 +110,7 @@ static long long ltc2945_reg_to_val(struct device *dev, = u8 reg) case LTC2945_MAX_POWER_THRES_H: case LTC2945_MIN_POWER_THRES_H: /* - * Convert to uW by assuming current is measured with - * an 1mOhm sense resistor, similar to current - * measurements. + * Convert to uW * Control register bit 0 selects if voltage at SENSE+/VDD * or voltage at ADIN is used to measure power. */ @@ -114,6 +124,8 @@ static long long ltc2945_reg_to_val(struct device *dev,= u8 reg) /* 0.5 mV * 25 uV =3D 0.0125 uV resolution. */ val =3D (val * 25LL) >> 1; } + val *=3D 1000; + val =3D DIV_ROUND_CLOSEST_ULL(val, shunt_resistor); break; case LTC2945_VIN_H: case LTC2945_MAX_VIN_H: @@ -136,14 +148,9 @@ static long long ltc2945_reg_to_val(struct device *dev= , u8 reg) case LTC2945_MIN_SENSE_H: case LTC2945_MAX_SENSE_THRES_H: case LTC2945_MIN_SENSE_THRES_H: - /* - * 25 uV resolution. Convert to current as measured with - * an 1 mOhm sense resistor, in mA. If a different sense - * resistor is installed, calculate the actual current by - * dividing the reported current by the sense resistor value - * in mOhm. - */ - val *=3D 25; + /* 25 uV resolution. Convert to mA. */ + val *=3D 25 * 1000; + val =3D DIV_ROUND_CLOSEST_ULL(val, shunt_resistor); break; default: return -EINVAL; @@ -154,7 +161,9 @@ static long long ltc2945_reg_to_val(struct device *dev,= u8 reg) static int ltc2945_val_to_reg(struct device *dev, u8 reg, unsigned long val) { - struct regmap *regmap =3D dev_get_drvdata(dev); + struct ltc2945_data *data =3D dev_get_drvdata(dev); + struct regmap *regmap =3D data->regmap; + u32 shunt_resistor =3D data->shunt_resistor; unsigned int control; int ret; @@ -165,9 +174,6 @@ static int ltc2945_val_to_reg(struct device *dev, u8 re= g, case LTC2945_MAX_POWER_THRES_H: case LTC2945_MIN_POWER_THRES_H: /* - * Convert to register value by assuming current is measured - * with an 1mOhm sense resistor, similar to current - * measurements. * Control register bit 0 selects if voltage at SENSE+/VDD * or voltage at ADIN is used to measure power, which in turn * determines register calculations. @@ -177,14 +183,16 @@ static int ltc2945_val_to_reg(struct device *dev, u8 = reg, return ret; if (control & CONTROL_MULT_SELECT) { /* 25 mV * 25 uV =3D 0.625 uV resolution. */ - val =3D DIV_ROUND_CLOSEST(val, 625); + val *=3D shunt_resistor; + val =3D DIV_ROUND_CLOSEST(val, 625 * 1000); } else { /* * 0.5 mV * 25 uV =3D 0.0125 uV resolution. * Divide first to avoid overflow; * accept loss of accuracy. */ - val =3D DIV_ROUND_CLOSEST(val, 25) * 2; + val *=3D shunt_resistor; + val =3D DIV_ROUND_CLOSEST(val, 25 * 1000) * 2; } break; case LTC2945_VIN_H: @@ -208,14 +216,9 @@ static int ltc2945_val_to_reg(struct device *dev, u8 r= eg, case LTC2945_MIN_SENSE_H: case LTC2945_MAX_SENSE_THRES_H: case LTC2945_MIN_SENSE_THRES_H: - /* - * 25 uV resolution. Convert to current as measured with - * an 1 mOhm sense resistor, in mA. If a different sense - * resistor is installed, calculate the actual current by - * dividing the reported current by the sense resistor value - * in mOhm. - */ - val =3D DIV_ROUND_CLOSEST(val, 25); + /* 25 uV resolution. Convert to mA. */ + val *=3D shunt_resistor; + val =3D DIV_ROUND_CLOSEST(val, 25 * 1000); break; default: return -EINVAL; @@ -240,7 +243,8 @@ static ssize_t ltc2945_value_store(struct device *dev, const char *buf, size_t count) { struct sensor_device_attribute *attr =3D to_sensor_dev_attr(da); - struct regmap *regmap =3D dev_get_drvdata(dev); + struct ltc2945_data *data =3D dev_get_drvdata(dev); + struct regmap *regmap =3D data->regmap; u8 reg =3D attr->index; unsigned long val; u8 regbuf[3]; @@ -275,7 +279,8 @@ static ssize_t ltc2945_history_store(struct device *dev, const char *buf, size_t count) { struct sensor_device_attribute *attr =3D to_sensor_dev_attr(da); - struct regmap *regmap =3D dev_get_drvdata(dev); + struct ltc2945_data *data =3D dev_get_drvdata(dev); + struct regmap *regmap =3D data->regmap; u8 reg =3D attr->index; int num_regs =3D is_power_reg(reg) ? 3 : 2; u8 buf_min[3] =3D { 0xff, 0xff, 0xff }; @@ -327,7 +332,8 @@ static ssize_t ltc2945_bool_show(struct device *dev, struct device_attribute *da, char *buf) { struct sensor_device_attribute *attr =3D to_sensor_dev_attr(da); - struct regmap *regmap =3D dev_get_drvdata(dev); + struct ltc2945_data *data =3D dev_get_drvdata(dev); + struct regmap *regmap =3D data->regmap; unsigned int fault; int ret; @@ -456,6 +462,12 @@ static int ltc2945_probe(struct i2c_client *client) struct device *dev =3D &client->dev; struct device *hwmon_dev; struct regmap *regmap; + struct ltc2945_data *data; + + data =3D devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + dev_set_drvdata(dev, data); regmap =3D devm_regmap_init_i2c(client, <c2945_regmap_config); if (IS_ERR(regmap)) { @@ -463,11 +475,19 @@ static int ltc2945_probe(struct i2c_client *client) return PTR_ERR(regmap); } + data->regmap =3D regmap; + if (device_property_read_u32(dev, "shunt-resistor-micro-ohms", + &data->shunt_resistor)) + data->shunt_resistor =3D 1000; + + if (data->shunt_resistor =3D=3D 0) + return -EINVAL; + /* Clear faults */ regmap_write(regmap, LTC2945_FAULT, 0x00); hwmon_dev =3D devm_hwmon_device_register_with_groups(dev, client->name, - regmap, + data, ltc2945_groups); return PTR_ERR_OR_ZERO(hwmon_dev); } -- 2.25.1 From nobody Wed Sep 17 10:16:15 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6E02AC001B2 for ; Tue, 20 Dec 2022 00:06:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232878AbiLTAGL (ORCPT ); Mon, 19 Dec 2022 19:06:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51880 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232455AbiLTAFt (ORCPT ); Mon, 19 Dec 2022 19:05:49 -0500 Received: from mail-yw1-x1135.google.com (mail-yw1-x1135.google.com [IPv6:2607:f8b0:4864:20::1135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 095F2C37 for ; Mon, 19 Dec 2022 16:05:48 -0800 (PST) Received: by mail-yw1-x1135.google.com with SMTP id 00721157ae682-3b10392c064so149768257b3.0 for ; Mon, 19 Dec 2022 16:05:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=criticallink.com; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=bLlc7QfWYSwhEPXevanfM/J17xcjG7QbxYgYWgfuSbs=; b=L6fludGALr816IQEcsLG5CKJL99qb7vbg9Za3eDAXs31j7Z4+mej3LnSey8IvNKQUW KGn9kDOFk6YegAX5kFF8xNBuiAOjdZynbmQOX0VvlTDm1lRiv6hgBJGuiJc8GodiKg68 QfeLOcbeAJG0RPs+MvH+TetN/fSrn3Xv6x/JxFDxVmWQe2egMHt32vYzQU5xTl+XG27z gm5GqIoQeLN72/mX7VFwG8p8mwoHB3NAbHjKnEIUHxkwG1hbGgIt1oOfovBcCrJAB4fm nErLujaoPwbKFtS600ER+TxQnYZPsKeWgKWtEw6zeqsMtsJ7T+zwXV2aJsoUdnwLPnQP E8Kg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=bLlc7QfWYSwhEPXevanfM/J17xcjG7QbxYgYWgfuSbs=; b=YhL1NsIpmQ47hhYzqjAQym2vkz3ZJK/djX63E5EmEOPFwucv/UpoUEpM3AyrywjezF Xh7hEEHJvL7OKGEkXNWl5mHqaNK/YjrPm49yVwZqs1/2aFEFkpuOzn6IsT59n9piTcou vlVWIN8zUFoCBj5LIQnmZzxqurV9Dv1bG7rcRwuE/fiBrn51rIMZbjV2e1E0KvrgBrFt z0Ry7qYHiMslxLiVMMeWjZX2l4s1WYOjhWhilTDGO0bmqVvVWqTS5bFgF5iI8Bqrcj6m C5Vl6vcMLQFAeB68xN8JA3Fv+Amu0uwkpEy84rJ1s5yFzaRTdLduPifV2So2ua6LbNLw Rllw== X-Gm-Message-State: AFqh2krEAZv6dNVjTSAlcCGB50h836xOoHx0uDdQyH35FII0XGRLaeLh 1XZ2GvKIz2Xo7Rsqq+MPMNCBMA== X-Google-Smtp-Source: AMrXdXtq6B2lyfUWipnsaxJbnCjl3OmnmZxDDLAMGMiW2C7JTWrPi7OmxPJzwoOHN1GMu0imH3aylA== X-Received: by 2002:a81:4e57:0:b0:38f:91bf:7783 with SMTP id c84-20020a814e57000000b0038f91bf7783mr8802927ywb.25.1671494747189; Mon, 19 Dec 2022 16:05:47 -0800 (PST) Received: from jcormier-MS-7A93.syr.criticallink.com (static-72-90-70-109.syrcny.fios.verizon.net. [72.90.70.109]) by smtp.gmail.com with ESMTPSA id o70-20020a374149000000b006e702033b15sm7721430qka.66.2022.12.19.16.05.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Dec 2022 16:05:46 -0800 (PST) From: "Cormier, Jonathan" To: linux-hwmon@vger.kernel.org Cc: John Pruitt , Jean Delvare , Guenter Roeck , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Rob Herring , Krzysztof Kozlowski , Bob Duke , "Cormier, Jonathan" Subject: [PATCH v2 4/4] hwmon: ltc2945: Fix possible overflows Date: Mon, 19 Dec 2022 19:04:57 -0500 Message-Id: <20221220000457.1163446-5-jcormier@criticallink.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221220000457.1163446-1-jcormier@criticallink.com> References: <20221214220727.1350784-1-jcormier@criticallink.com> <20221220000457.1163446-1-jcormier@criticallink.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: John Pruitt Use 64-bit values for intermediate calculations. Check for overflows and return INT_MAX if overflows happened. Signed-off-by: John Pruitt Signed-off-by: "Cormier, Jonathan" --- drivers/hwmon/ltc2945.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/drivers/hwmon/ltc2945.c b/drivers/hwmon/ltc2945.c index fc7d399b2c85..7239422fc6db 100644 --- a/drivers/hwmon/ltc2945.c +++ b/drivers/hwmon/ltc2945.c @@ -126,6 +126,10 @@ static long long ltc2945_reg_to_val(struct device *dev= , u8 reg) } val *=3D 1000; val =3D DIV_ROUND_CLOSEST_ULL(val, shunt_resistor); + /* check for overflow, use MAX value if it happened */ + if (val > INT_MAX) + val =3D INT_MAX; + break; case LTC2945_VIN_H: case LTC2945_MAX_VIN_H: @@ -159,12 +163,14 @@ static long long ltc2945_reg_to_val(struct device *de= v, u8 reg) } static int ltc2945_val_to_reg(struct device *dev, u8 reg, - unsigned long val) + unsigned long val_32) { struct ltc2945_data *data =3D dev_get_drvdata(dev); struct regmap *regmap =3D data->regmap; u32 shunt_resistor =3D data->shunt_resistor; unsigned int control; + /* use 64-bit val for intermediate calculations */ + unsigned long long val =3D val_32; int ret; switch (reg) { @@ -184,7 +190,7 @@ static int ltc2945_val_to_reg(struct device *dev, u8 re= g, if (control & CONTROL_MULT_SELECT) { /* 25 mV * 25 uV =3D 0.625 uV resolution. */ val *=3D shunt_resistor; - val =3D DIV_ROUND_CLOSEST(val, 625 * 1000); + val =3D DIV_ROUND_CLOSEST_ULL(val, 625LL * 1000LL); } else { /* * 0.5 mV * 25 uV =3D 0.0125 uV resolution. @@ -192,7 +198,7 @@ static int ltc2945_val_to_reg(struct device *dev, u8 re= g, * accept loss of accuracy. */ val *=3D shunt_resistor; - val =3D DIV_ROUND_CLOSEST(val, 25 * 1000) * 2; + val =3D DIV_ROUND_CLOSEST_ULL(val, 25LL * 1000LL) * 2; } break; case LTC2945_VIN_H: @@ -201,7 +207,7 @@ static int ltc2945_val_to_reg(struct device *dev, u8 re= g, case LTC2945_MAX_VIN_THRES_H: case LTC2945_MIN_VIN_THRES_H: /* 25 mV resolution. */ - val /=3D 25; + val =3D DIV_ROUND_CLOSEST_ULL(val, 25LL); break; case LTC2945_ADIN_H: case LTC2945_MAX_ADIN_H: @@ -218,11 +224,15 @@ static int ltc2945_val_to_reg(struct device *dev, u8 = reg, case LTC2945_MIN_SENSE_THRES_H: /* 25 uV resolution. Convert to mA. */ val *=3D shunt_resistor; - val =3D DIV_ROUND_CLOSEST(val, 25 * 1000); + val =3D DIV_ROUND_CLOSEST_ULL(val, 25LL * 1000LL); break; default: return -EINVAL; } + /* If val is too large, just return the max value */ + if (val > INT_MAX) + return INT_MAX; + return val; } -- 2.25.1