* [PATCH v4 0/5] hwmon: ltc2945: Add binding and shunt resistor support @ 2023-01-26 22:32 Jonathan Cormier 2023-01-26 22:32 ` [PATCH v4 1/5] dt-bindings: hwmon: adi,ltc2945: Add binding Jonathan Cormier ` (4 more replies) 0 siblings, 5 replies; 10+ messages in thread From: Jonathan Cormier @ 2023-01-26 22:32 UTC (permalink / raw) To: Jean Delvare, Guenter Roeck, Rob Herring, Krzysztof Kozlowski Cc: linux-hwmon, devicetree, linux-kernel, Bob Duke, John Pruitt, Jonathan Cormier, Krzysztof Kozlowski Added the ability to specify the value of the shunt resistor in the device tree instead of assuming it is 1 milliOhm. Would be good to backport as well Changes since v3: - Remove shunt-resistor-micro-ohms in binding commit message - Simplify ltc2945_value_store fix - Validate overflow - ltc2945_value_store accept only 32-bit uint from user to avoid overflow - Link to v3: https://lore.kernel.org/r/20230109233534.1932370-1-jcormier@criticallink.com Changes since v2: - Remove newline - Combined overflow fix with "Allow setting shunt resistor" commit - Add description to "Add devicetree match table" - Add fix for unhandled error case in ltc2945_value_store - Use imperative in descriptions - Remove unneeded overflow check from ltc2945_reg_to_val - Fix up DIV_ROUND_CLOSEST_ULL calls, per docs divisor should be 32-bit - Split one DIV_ROUND_CLOSEST_ULL change into separate commit per Guenter Roeck's comment Changes since v1: - Add devicetree match table - Add kerneldoc for the ltc2945_data struct - Cleanup excesive comments about the shunt resistor - Switch to device_property_read_u32() Signed-off-by: Jonathan Cormier <jcormier@criticallink.com> --- John Pruitt (1): hwmon: ltc2945: Allow setting shunt resistor Jonathan Cormier (4): dt-bindings: hwmon: adi,ltc2945: Add binding hwmon: ltc2945: Add devicetree match table hwmon: ltc2945: Handle error case in ltc2945_value_store hwmon: ltc2945: Convert division to DIV_ROUND_CLOSEST_ULL .../devicetree/bindings/hwmon/adi,ltc2945.yaml | 49 ++++++++ drivers/hwmon/ltc2945.c | 132 ++++++++++++++------- 2 files changed, 136 insertions(+), 45 deletions(-) --- base-commit: 93f875a8526a291005e7f38478079526c843cbec change-id: 20230126-b4-ltc2945_shunt_resistor-f64955044365 Best regards, -- Jonathan Cormier <jcormier@criticallink.com> ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v4 1/5] dt-bindings: hwmon: adi,ltc2945: Add binding 2023-01-26 22:32 [PATCH v4 0/5] hwmon: ltc2945: Add binding and shunt resistor support Jonathan Cormier @ 2023-01-26 22:32 ` Jonathan Cormier 2023-01-29 20:16 ` Guenter Roeck 2023-01-26 22:32 ` [PATCH v4 2/5] hwmon: ltc2945: Add devicetree match table Jonathan Cormier ` (3 subsequent siblings) 4 siblings, 1 reply; 10+ messages in thread From: Jonathan Cormier @ 2023-01-26 22:32 UTC (permalink / raw) To: Jean Delvare, Guenter Roeck, Rob Herring, Krzysztof Kozlowski Cc: linux-hwmon, devicetree, linux-kernel, Bob Duke, John Pruitt, Jonathan Cormier, Krzysztof Kozlowski Create initial binding for the LTC2945 I2C power monitor. Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Signed-off-by: Jonathan Cormier <jcormier@criticallink.com> --- .../devicetree/bindings/hwmon/adi,ltc2945.yaml | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/Documentation/devicetree/bindings/hwmon/adi,ltc2945.yaml b/Documentation/devicetree/bindings/hwmon/adi,ltc2945.yaml new file mode 100644 index 000000000000..5cb66e97e816 --- /dev/null +++ b/Documentation/devicetree/bindings/hwmon/adi,ltc2945.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/adi,ltc2945.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Analog Devices LTC2945 wide range i2c power monitor + +maintainers: + - Guenter Roeck <linux@roeck-us.net> + +description: | + Analog Devices LTC2945 wide range i2c power monitor over I2C. + + https://www.analog.com/media/en/technical-documentation/data-sheets/LTC2945.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 = <1>; + #size-cells = <0>; + + power-monitor@6e { + compatible = "adi,ltc2945"; + reg = <0x6e>; + /* 10 milli-Ohm shunt resistor */ + shunt-resistor-micro-ohms = <10000>; + }; + }; +... -- 2.25.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v4 1/5] dt-bindings: hwmon: adi,ltc2945: Add binding 2023-01-26 22:32 ` [PATCH v4 1/5] dt-bindings: hwmon: adi,ltc2945: Add binding Jonathan Cormier @ 2023-01-29 20:16 ` Guenter Roeck 2023-01-30 15:19 ` Jon Cormier 0 siblings, 1 reply; 10+ messages in thread From: Guenter Roeck @ 2023-01-29 20:16 UTC (permalink / raw) To: Jonathan Cormier Cc: Jean Delvare, Rob Herring, Krzysztof Kozlowski, linux-hwmon, devicetree, linux-kernel, Bob Duke, John Pruitt, Krzysztof Kozlowski On Thu, Jan 26, 2023 at 05:32:23PM -0500, Jonathan Cormier wrote: > Create initial binding for the LTC2945 I2C power monitor. > > Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> > Signed-off-by: Jonathan Cormier <jcormier@criticallink.com> Series applied, after merging patch 4/5 and 5/5 of the series to avoid spurious 32-bit build failures, and after fixing a continuation line alignment. In the future, please run checkpatch --strict on your patches, and please provide change logs. Thanks, Guenter ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v4 1/5] dt-bindings: hwmon: adi,ltc2945: Add binding 2023-01-29 20:16 ` Guenter Roeck @ 2023-01-30 15:19 ` Jon Cormier 2023-01-30 15:25 ` Jon Cormier 0 siblings, 1 reply; 10+ messages in thread From: Jon Cormier @ 2023-01-30 15:19 UTC (permalink / raw) To: Guenter Roeck Cc: Jean Delvare, Rob Herring, Krzysztof Kozlowski, linux-hwmon, devicetree, linux-kernel, Bob Duke, John Pruitt, Krzysztof Kozlowski On Sun, Jan 29, 2023 at 3:16 PM Guenter Roeck <linux@roeck-us.net> wrote: > > On Thu, Jan 26, 2023 at 05:32:23PM -0500, Jonathan Cormier wrote: > > Create initial binding for the LTC2945 I2C power monitor. > > > > Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> > > Signed-off-by: Jonathan Cormier <jcormier@criticallink.com> > > Series applied, Great > after merging patch 4/5 and 5/5 of the series > to avoid spurious 32-bit build failures, Huh, I split these per request, curious why they'd cause build failures when separated... > and after fixing a continuation line alignment. > > In the future, please run checkpatch --strict on your patches, Will do. I didn't know about this option. > and please provide change logs. This I did do in every cover letter. > > Thanks, > Guenter -- Jonathan Cormier Software Engineer Voice: 315.425.4045 x222 http://www.CriticalLink.com 6712 Brooklawn Parkway, Syracuse, NY 13211 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v4 1/5] dt-bindings: hwmon: adi,ltc2945: Add binding 2023-01-30 15:19 ` Jon Cormier @ 2023-01-30 15:25 ` Jon Cormier 0 siblings, 0 replies; 10+ messages in thread From: Jon Cormier @ 2023-01-30 15:25 UTC (permalink / raw) To: Guenter Roeck Cc: Jean Delvare, Rob Herring, Krzysztof Kozlowski, linux-hwmon, devicetree, linux-kernel, Bob Duke, John Pruitt, Krzysztof Kozlowski On Mon, Jan 30, 2023 at 10:19 AM Jon Cormier <jcormier@criticallink.com> wrote: > > On Sun, Jan 29, 2023 at 3:16 PM Guenter Roeck <linux@roeck-us.net> wrote: > > > > On Thu, Jan 26, 2023 at 05:32:23PM -0500, Jonathan Cormier wrote: > > > Create initial binding for the LTC2945 I2C power monitor. > > > > > > Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> > > > Signed-off-by: Jonathan Cormier <jcormier@criticallink.com> > > > > Series applied, > Great > > after merging patch 4/5 and 5/5 of the series > > to avoid spurious 32-bit build failures, > Huh, I split these per request, curious why they'd cause build > failures when separated... Nevermind, I see your other response. > > and after fixing a continuation line alignment. > > > > In the future, please run checkpatch --strict on your patches, > Will do. I didn't know about this option. > > and please provide change logs. > This I did do in every cover letter. > > > > Thanks, > > Guenter > > -- > Jonathan Cormier > Software Engineer > > Voice: 315.425.4045 x222 > > > > http://www.CriticalLink.com > 6712 Brooklawn Parkway, Syracuse, NY 13211 -- Jonathan Cormier Software Engineer Voice: 315.425.4045 x222 http://www.CriticalLink.com 6712 Brooklawn Parkway, Syracuse, NY 13211 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v4 2/5] hwmon: ltc2945: Add devicetree match table 2023-01-26 22:32 [PATCH v4 0/5] hwmon: ltc2945: Add binding and shunt resistor support Jonathan Cormier 2023-01-26 22:32 ` [PATCH v4 1/5] dt-bindings: hwmon: adi,ltc2945: Add binding Jonathan Cormier @ 2023-01-26 22:32 ` Jonathan Cormier 2023-01-26 22:32 ` [PATCH v4 3/5] hwmon: ltc2945: Handle error case in ltc2945_value_store Jonathan Cormier ` (2 subsequent siblings) 4 siblings, 0 replies; 10+ messages in thread From: Jonathan Cormier @ 2023-01-26 22:32 UTC (permalink / raw) To: Jean Delvare, Guenter Roeck, Rob Herring, Krzysztof Kozlowski Cc: linux-hwmon, devicetree, linux-kernel, Bob Duke, John Pruitt, Jonathan Cormier Add adi,ltc2945 compatible Signed-off-by: Jonathan Cormier <jcormier@criticallink.com> --- 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[] = { + { .compatible = "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 = { .driver = { - .name = "ltc2945", - }, + .name = "ltc2945", + .of_match_table = of_match_ptr(ltc2945_of_match), + }, .probe_new = ltc2945_probe, .id_table = ltc2945_id, }; -- 2.25.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v4 3/5] hwmon: ltc2945: Handle error case in ltc2945_value_store 2023-01-26 22:32 [PATCH v4 0/5] hwmon: ltc2945: Add binding and shunt resistor support Jonathan Cormier 2023-01-26 22:32 ` [PATCH v4 1/5] dt-bindings: hwmon: adi,ltc2945: Add binding Jonathan Cormier 2023-01-26 22:32 ` [PATCH v4 2/5] hwmon: ltc2945: Add devicetree match table Jonathan Cormier @ 2023-01-26 22:32 ` Jonathan Cormier 2023-01-26 22:32 ` [PATCH v4 4/5] hwmon: ltc2945: Allow setting shunt resistor Jonathan Cormier 2023-01-26 22:32 ` [PATCH v4 5/5] hwmon: ltc2945: Convert division to DIV_ROUND_CLOSEST_ULL Jonathan Cormier 4 siblings, 0 replies; 10+ messages in thread From: Jonathan Cormier @ 2023-01-26 22:32 UTC (permalink / raw) To: Jean Delvare, Guenter Roeck, Rob Herring, Krzysztof Kozlowski Cc: linux-hwmon, devicetree, linux-kernel, Bob Duke, John Pruitt, Jonathan Cormier ltc2945_val_to_reg errors were not being handled which would have resulted in register being set to 0 (clamped) instead of being left alone. Fixes: 6700ce035f83 ("hwmon: Driver for Linear Technologies LTC2945") Signed-off-by: Jonathan Cormier <jcormier@criticallink.com> --- drivers/hwmon/ltc2945.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/hwmon/ltc2945.c b/drivers/hwmon/ltc2945.c index 9af3e3821152..ac15298a6558 100644 --- a/drivers/hwmon/ltc2945.c +++ b/drivers/hwmon/ltc2945.c @@ -254,6 +254,8 @@ static ssize_t ltc2945_value_store(struct device *dev, /* convert to register value, then clamp and write result */ regval = ltc2945_val_to_reg(dev, reg, val); + if (regval < 0) + return regval; if (is_power_reg(reg)) { regval = clamp_val(regval, 0, 0xffffff); regbuf[0] = regval >> 16; -- 2.25.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v4 4/5] hwmon: ltc2945: Allow setting shunt resistor 2023-01-26 22:32 [PATCH v4 0/5] hwmon: ltc2945: Add binding and shunt resistor support Jonathan Cormier ` (2 preceding siblings ...) 2023-01-26 22:32 ` [PATCH v4 3/5] hwmon: ltc2945: Handle error case in ltc2945_value_store Jonathan Cormier @ 2023-01-26 22:32 ` Jonathan Cormier 2023-01-26 22:32 ` [PATCH v4 5/5] hwmon: ltc2945: Convert division to DIV_ROUND_CLOSEST_ULL Jonathan Cormier 4 siblings, 0 replies; 10+ messages in thread From: Jonathan Cormier @ 2023-01-26 22:32 UTC (permalink / raw) To: Jean Delvare, Guenter Roeck, Rob Herring, Krzysztof Kozlowski Cc: linux-hwmon, devicetree, linux-kernel, Bob Duke, John Pruitt, Jonathan Cormier From: John Pruitt <jpruitt@criticallink.com> Add 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: Jonathan Cormier <jcormier@criticallink.com> Signed-off-by: John Pruitt <jpruitt@criticallink.com> --- drivers/hwmon/ltc2945.c | 117 +++++++++++++++++++++++++++++++----------------- 1 file changed, 75 insertions(+), 42 deletions(-) diff --git a/drivers/hwmon/ltc2945.c b/drivers/hwmon/ltc2945.c index ac15298a6558..0b5e448b4f12 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[] = { }; 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 = dev_get_drvdata(dev); + struct ltc2945_data *data = dev_get_drvdata(dev); + struct regmap *regmap = data->regmap; + u32 shunt_resistor = data->shunt_resistor; unsigned int control; u8 buf[3]; long long val; @@ -84,10 +96,10 @@ static long long ltc2945_reg_to_val(struct device *dev, u8 reg) return ret; if (is_power_reg(reg)) { - /* power */ + /* 24-bit power */ val = (buf[0] << 16) + (buf[1] << 8) + buf[2]; } else { - /* current, voltage */ + /* 12-bit current, voltage */ val = (buf[0] << 4) + (buf[1] >> 4); } @@ -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,14 @@ static long long ltc2945_reg_to_val(struct device *dev, u8 reg) /* 0.5 mV * 25 uV = 0.0125 uV resolution. */ val = (val * 25LL) >> 1; } + val *= 1000; + /* Overflow check: Assuming max 24-bit power, val is at most 53 bits right now. */ + val = DIV_ROUND_CLOSEST_ULL(val, shunt_resistor); + /* + * Overflow check: After division, depending on shunt resistor, + * val can still be > 32 bits so returning long long makes sense + */ + break; case LTC2945_VIN_H: case LTC2945_MAX_VIN_H: @@ -136,14 +154,11 @@ 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 *= 25; + /* 25 uV resolution. Convert to mA. */ + val *= 25 * 1000; + /* Overflow check: Assuming max 12-bit sense, val is at most 27 bits right now */ + val = DIV_ROUND_CLOSEST_ULL(val, shunt_resistor); + /* Overflow check: After division, <= 27 bits */ break; default: return -EINVAL; @@ -151,13 +166,18 @@ static long long ltc2945_reg_to_val(struct device *dev, u8 reg) return val; } -static int ltc2945_val_to_reg(struct device *dev, u8 reg, - unsigned long val) +static long long ltc2945_val_to_reg(struct device *dev, u8 reg, + unsigned long long val) { - struct regmap *regmap = dev_get_drvdata(dev); + struct ltc2945_data *data = dev_get_drvdata(dev); + struct regmap *regmap = data->regmap; + u32 shunt_resistor = data->shunt_resistor; unsigned int control; int ret; + /* Ensure we don't overflow */ + val = clamp_val(val, 0, U32_MAX); + switch (reg) { case LTC2945_POWER_H: case LTC2945_MAX_POWER_H: @@ -165,9 +185,6 @@ static int ltc2945_val_to_reg(struct device *dev, u8 reg, 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 +194,16 @@ static int ltc2945_val_to_reg(struct device *dev, u8 reg, return ret; if (control & CONTROL_MULT_SELECT) { /* 25 mV * 25 uV = 0.625 uV resolution. */ - val = DIV_ROUND_CLOSEST(val, 625); + val *= shunt_resistor; + /* Overflow check: Assuming 32-bit val and shunt resistor, val <= 64bits */ + val = DIV_ROUND_CLOSEST_ULL(val, 625 * 1000); + /* Overflow check: val is now <= 44 bits */ } else { - /* - * 0.5 mV * 25 uV = 0.0125 uV resolution. - * Divide first to avoid overflow; - * accept loss of accuracy. - */ - val = DIV_ROUND_CLOSEST(val, 25) * 2; + /* 0.5 mV * 25 uV = 0.0125 uV resolution. */ + val *= shunt_resistor; + /* Overflow check: Assuming 32-bit val and shunt resistor, val <= 64bits */ + val = DIV_ROUND_CLOSEST_ULL(val, 25 * 1000) * 2; + /* Overflow check: val is now <= 51 bits */ } break; case LTC2945_VIN_H: @@ -208,14 +227,11 @@ static int ltc2945_val_to_reg(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 = DIV_ROUND_CLOSEST(val, 25); + /* 25 uV resolution. Convert to mA. */ + val *= shunt_resistor; + /* Overflow check: Assuming 32-bit val and 32-bit shunt resistor, val is 64bits */ + val = DIV_ROUND_CLOSEST_ULL(val, 25 * 1000); + /* Overflow check: val is now <= 50 bits */ break; default: return -EINVAL; @@ -240,15 +256,16 @@ static ssize_t ltc2945_value_store(struct device *dev, const char *buf, size_t count) { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct regmap *regmap = dev_get_drvdata(dev); + struct ltc2945_data *data = dev_get_drvdata(dev); + struct regmap *regmap = data->regmap; u8 reg = attr->index; - unsigned long val; + unsigned int val; u8 regbuf[3]; int num_regs; - int regval; + long long regval; int ret; - ret = kstrtoul(buf, 10, &val); + ret = kstrtouint(buf, 10, &val); if (ret) return ret; @@ -277,7 +294,8 @@ static ssize_t ltc2945_history_store(struct device *dev, const char *buf, size_t count) { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct regmap *regmap = dev_get_drvdata(dev); + struct ltc2945_data *data = dev_get_drvdata(dev); + struct regmap *regmap = data->regmap; u8 reg = attr->index; int num_regs = is_power_reg(reg) ? 3 : 2; u8 buf_min[3] = { 0xff, 0xff, 0xff }; @@ -329,7 +347,8 @@ static ssize_t ltc2945_bool_show(struct device *dev, struct device_attribute *da, char *buf) { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct regmap *regmap = dev_get_drvdata(dev); + struct ltc2945_data *data = dev_get_drvdata(dev); + struct regmap *regmap = data->regmap; unsigned int fault; int ret; @@ -458,6 +477,12 @@ static int ltc2945_probe(struct i2c_client *client) struct device *dev = &client->dev; struct device *hwmon_dev; struct regmap *regmap; + struct ltc2945_data *data; + + data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + dev_set_drvdata(dev, data); regmap = devm_regmap_init_i2c(client, <c2945_regmap_config); if (IS_ERR(regmap)) { @@ -465,11 +490,19 @@ static int ltc2945_probe(struct i2c_client *client) return PTR_ERR(regmap); } + data->regmap = regmap; + if (device_property_read_u32(dev, "shunt-resistor-micro-ohms", + &data->shunt_resistor)) + data->shunt_resistor = 1000; + + if (data->shunt_resistor == 0) + return -EINVAL; + /* Clear faults */ regmap_write(regmap, LTC2945_FAULT, 0x00); hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, - regmap, + data, ltc2945_groups); return PTR_ERR_OR_ZERO(hwmon_dev); } -- 2.25.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v4 5/5] hwmon: ltc2945: Convert division to DIV_ROUND_CLOSEST_ULL 2023-01-26 22:32 [PATCH v4 0/5] hwmon: ltc2945: Add binding and shunt resistor support Jonathan Cormier ` (3 preceding siblings ...) 2023-01-26 22:32 ` [PATCH v4 4/5] hwmon: ltc2945: Allow setting shunt resistor Jonathan Cormier @ 2023-01-26 22:32 ` Jonathan Cormier 2023-01-29 19:55 ` Guenter Roeck 4 siblings, 1 reply; 10+ messages in thread From: Jonathan Cormier @ 2023-01-26 22:32 UTC (permalink / raw) To: Jean Delvare, Guenter Roeck, Rob Herring, Krzysztof Kozlowski Cc: linux-hwmon, devicetree, linux-kernel, Bob Duke, John Pruitt, Jonathan Cormier Convert division to DIV_ROUND_CLOSEST_ULL to match code in same function. Signed-off-by: Jonathan Cormier <jcormier@criticallink.com> --- drivers/hwmon/ltc2945.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/hwmon/ltc2945.c b/drivers/hwmon/ltc2945.c index 0b5e448b4f12..33341d01f1f7 100644 --- a/drivers/hwmon/ltc2945.c +++ b/drivers/hwmon/ltc2945.c @@ -212,7 +212,7 @@ static long long ltc2945_val_to_reg(struct device *dev, u8 reg, case LTC2945_MAX_VIN_THRES_H: case LTC2945_MIN_VIN_THRES_H: /* 25 mV resolution. */ - val /= 25; + val = DIV_ROUND_CLOSEST_ULL(val, 25); break; case LTC2945_ADIN_H: case LTC2945_MAX_ADIN_H: -- 2.25.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v4 5/5] hwmon: ltc2945: Convert division to DIV_ROUND_CLOSEST_ULL 2023-01-26 22:32 ` [PATCH v4 5/5] hwmon: ltc2945: Convert division to DIV_ROUND_CLOSEST_ULL Jonathan Cormier @ 2023-01-29 19:55 ` Guenter Roeck 0 siblings, 0 replies; 10+ messages in thread From: Guenter Roeck @ 2023-01-29 19:55 UTC (permalink / raw) To: Jonathan Cormier Cc: Jean Delvare, Rob Herring, Krzysztof Kozlowski, linux-hwmon, devicetree, linux-kernel, Bob Duke, John Pruitt On Thu, Jan 26, 2023 at 05:32:27PM -0500, Jonathan Cormier wrote: > Convert division to DIV_ROUND_CLOSEST_ULL to match code > in same function. > > Signed-off-by: Jonathan Cormier <jcormier@criticallink.comi > --- > drivers/hwmon/ltc2945.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/hwmon/ltc2945.c b/drivers/hwmon/ltc2945.c > index 0b5e448b4f12..33341d01f1f7 100644 > --- a/drivers/hwmon/ltc2945.c > +++ b/drivers/hwmon/ltc2945.c > @@ -212,7 +212,7 @@ static long long ltc2945_val_to_reg(struct device *dev, u8 reg, > case LTC2945_MAX_VIN_THRES_H: > case LTC2945_MIN_VIN_THRES_H: > /* 25 mV resolution. */ > - val /= 25; > + val = DIV_ROUND_CLOSEST_ULL(val, 25); This needs to be combined with the previous patch since that patch changes 'val' from unsigned long to unsigned long long, causing a compile failure on 32-bit builds. I'll do that unless some other 32 bit build failure shows up. Guenter > break; > case LTC2945_ADIN_H: > case LTC2945_MAX_ADIN_H: > > -- > 2.25.1 > ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2023-01-30 15:25 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-01-26 22:32 [PATCH v4 0/5] hwmon: ltc2945: Add binding and shunt resistor support Jonathan Cormier 2023-01-26 22:32 ` [PATCH v4 1/5] dt-bindings: hwmon: adi,ltc2945: Add binding Jonathan Cormier 2023-01-29 20:16 ` Guenter Roeck 2023-01-30 15:19 ` Jon Cormier 2023-01-30 15:25 ` Jon Cormier 2023-01-26 22:32 ` [PATCH v4 2/5] hwmon: ltc2945: Add devicetree match table Jonathan Cormier 2023-01-26 22:32 ` [PATCH v4 3/5] hwmon: ltc2945: Handle error case in ltc2945_value_store Jonathan Cormier 2023-01-26 22:32 ` [PATCH v4 4/5] hwmon: ltc2945: Allow setting shunt resistor Jonathan Cormier 2023-01-26 22:32 ` [PATCH v4 5/5] hwmon: ltc2945: Convert division to DIV_ROUND_CLOSEST_ULL Jonathan Cormier 2023-01-29 19:55 ` Guenter Roeck
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).