2022-09-08 09:20:35

by Tilki, Ibrahim

[permalink] [raw]
Subject: [PATCH RESEND v6 0/4] hwmon: Add max31760 fan speed controller

changes in v6:
- update description of hwmon documentation
- add hwmon documentation to index.rst

changes in v5:
- add dt-bindings documentation
- add maintainer

changes in v4:
- use sysfs_emit instead of sprintf
- use kstrtou8 for pwm
- use closest match for pwm1_auto_point_temp_hyst

changes in v3:
- add regmap cache
- remove pwm1_auto_point[1-48]_{temp,temp_hyst} attributes
- add pwm1_auto_point_temp_hyst attribute

changes in v2:
- remove pulse_per_rev variable in tach_to_rpm
- remove temperature max_hyst and crit_hyst
- strict value checking for fan_enable and pwm_enable
- do not clamp pwm value for Look-up table
- add sysfs_attr_init call
- add documentation


Ibrahim Tilki (4):
drivers: hwmon: Add max31760 fan speed controller driver
docs: hwmon: add max31760 documentation
dt-bindings: hwmon: Add bindings for max31760
MAINTAINERS: Add maintainer for hwmon/max31760

.../bindings/hwmon/adi,max31760.yaml | 44 ++
Documentation/hwmon/index.rst | 1 +
Documentation/hwmon/max31760.rst | 77 +++
MAINTAINERS | 9 +
drivers/hwmon/Kconfig | 12 +
drivers/hwmon/Makefile | 1 +
drivers/hwmon/max31760.c | 594 ++++++++++++++++++
7 files changed, 738 insertions(+)
create mode 100644 Documentation/devicetree/bindings/hwmon/adi,max31760.yaml
create mode 100644 Documentation/hwmon/max31760.rst
create mode 100644 drivers/hwmon/max31760.c

--
2.36.1


2022-09-08 09:20:44

by Tilki, Ibrahim

[permalink] [raw]
Subject: [PATCH RESEND v6 1/4] drivers: hwmon: Add max31760 fan speed controller driver

MAX31760 is a precision fan speed controller with nonvolatile lookup table.
Device has one internal and one external temperature sensor support.
Controls two fans and measures their speeds. Generates hardware alerts when
programmable max and critical temperatures are exceeded.

Signed-off-by: Ibrahim Tilki <[email protected]>
Reviewed-by: Nurettin Bolucu <[email protected]>
---
drivers/hwmon/Kconfig | 12 +
drivers/hwmon/Makefile | 1 +
drivers/hwmon/max31760.c | 594 +++++++++++++++++++++++++++++++++++++++
3 files changed, 607 insertions(+)
create mode 100644 drivers/hwmon/max31760.c

diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
index e70d9614b..46ae3c4c4 100644
--- a/drivers/hwmon/Kconfig
+++ b/drivers/hwmon/Kconfig
@@ -1066,6 +1066,18 @@ config SENSORS_MAX31730
This driver can also be built as a module. If so, the module
will be called max31730.

+config SENSORS_MAX31760
+ tristate "MAX31760 fan speed controller"
+ depends on I2C
+ select REGMAP_I2C
+ help
+ Support for the Analog Devices MAX31760 Precision Fan-Speed
+ Controller. MAX31760 integrates temperature sensing along with
+ precision PWM fan control.
+
+ This driver can also be built as a module. If so, the module
+ will be called max31760.
+
config SENSORS_MAX6620
tristate "Maxim MAX6620 fan controller"
depends on I2C
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
index 007e829d1..1c0fa4dd8 100644
--- a/drivers/hwmon/Makefile
+++ b/drivers/hwmon/Makefile
@@ -140,6 +140,7 @@ obj-$(CONFIG_SENSORS_MAX1668) += max1668.o
obj-$(CONFIG_SENSORS_MAX197) += max197.o
obj-$(CONFIG_SENSORS_MAX31722) += max31722.o
obj-$(CONFIG_SENSORS_MAX31730) += max31730.o
+obj-$(CONFIG_SENSORS_MAX31760) += max31760.o
obj-$(CONFIG_SENSORS_MAX6620) += max6620.o
obj-$(CONFIG_SENSORS_MAX6621) += max6621.o
obj-$(CONFIG_SENSORS_MAX6639) += max6639.o
diff --git a/drivers/hwmon/max31760.c b/drivers/hwmon/max31760.c
new file mode 100644
index 000000000..7ff542011
--- /dev/null
+++ b/drivers/hwmon/max31760.c
@@ -0,0 +1,594 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <linux/bitfield.h>
+#include <linux/bits.h>
+#include <linux/err.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
+#include <linux/i2c.h>
+#include <linux/regmap.h>
+#include <linux/util_macros.h>
+
+#define REG_CR1 0x00
+#define CR1_HYST BIT(5)
+#define CR1_DRV GENMASK(4, 3)
+#define CR1_TEMP_SRC GENMASK(1, 0)
+#define REG_CR2 0x01
+#define CR2_STBY BIT(7)
+#define CR2_ALERTS BIT(6)
+#define CR2_DFC BIT(0)
+#define REG_CR3 0x02
+#define REG_PWMR 0x50
+#define REG_PWMV 0x51
+#define REG_STATUS 0x5A
+#define STATUS_ALARM_CRIT(ch) BIT(2 + 2 * (ch))
+#define STATUS_ALARM_MAX(ch) BIT(3 + 2 * (ch))
+#define STATUS_RDFA BIT(6)
+
+#define REG_TACH(ch) (0x52 + (ch) * 2)
+#define REG_TEMP_INPUT(ch) (0x56 + (ch) * 2)
+#define REG_TEMP_MAX(ch) (0x06 + (ch) * 2)
+#define REG_TEMP_CRIT(ch) (0x0A + (ch) * 2)
+
+#define TEMP11_FROM_REG(reg) ((reg) / 32 * 125)
+#define TEMP11_TO_REG(val) (DIV_ROUND_CLOSEST(clamp_val((val), -128000, \
+ 127875), 125) * 32)
+
+#define LUT_SIZE 48
+
+#define REG_LUT(index) (0x20 + (index))
+
+struct max31760_state {
+ struct regmap *regmap;
+
+ struct lut_attribute {
+ char name[24];
+ struct sensor_device_attribute sda;
+ } lut[LUT_SIZE];
+
+ struct attribute *attrs[LUT_SIZE + 2];
+ struct attribute_group group;
+ const struct attribute_group *groups[2];
+};
+
+static bool max31760_volatile_reg(struct device *dev, unsigned int reg)
+{
+ return reg > 0x50;
+}
+
+static const struct regmap_config regmap_config = {
+ .reg_bits = 8,
+ .val_bits = 8,
+ .max_register = 0x5B,
+ .cache_type = REGCACHE_RBTREE,
+ .volatile_reg = max31760_volatile_reg,
+};
+
+static const int max31760_pwm_freq[] = {33, 150, 1500, 25000};
+
+static int tach_to_rpm(u16 tach)
+{
+ if (tach == 0)
+ tach = 1;
+
+ return 60 * 100000 / tach / 2;
+}
+
+static int max31760_read(struct device *dev, enum hwmon_sensor_types type,
+ u32 attr, int channel, long *val)
+{
+ struct max31760_state *state = dev_get_drvdata(dev);
+ unsigned int regval;
+ unsigned int reg_temp;
+ s16 temp;
+ u8 reg[2];
+ int ret;
+
+ switch (type) {
+ case hwmon_temp:
+ switch (attr) {
+ case hwmon_temp_fault:
+ ret = regmap_read(state->regmap, REG_STATUS, &regval);
+ if (ret)
+ return ret;
+
+ *val = FIELD_GET(STATUS_RDFA, regval);
+
+ return 0;
+ case hwmon_temp_max_alarm:
+ ret = regmap_read(state->regmap, REG_STATUS, &regval);
+ if (ret)
+ return ret;
+
+ if (channel)
+ *val = FIELD_GET(STATUS_ALARM_MAX(1), regval);
+ else
+ *val = FIELD_GET(STATUS_ALARM_MAX(0), regval);
+
+ return 0;
+ case hwmon_temp_crit_alarm:
+ ret = regmap_read(state->regmap, REG_STATUS, &regval);
+ if (ret)
+ return ret;
+
+ if (channel)
+ *val = FIELD_GET(STATUS_ALARM_CRIT(1), regval);
+ else
+ *val = FIELD_GET(STATUS_ALARM_CRIT(0), regval);
+
+ return 0;
+ case hwmon_temp_input:
+ reg_temp = REG_TEMP_INPUT(channel);
+ break;
+ case hwmon_temp_max:
+ reg_temp = REG_TEMP_MAX(channel);
+ break;
+ case hwmon_temp_crit:
+ reg_temp = REG_TEMP_CRIT(channel);
+ break;
+ default:
+ return -EOPNOTSUPP;
+ }
+
+ ret = regmap_bulk_read(state->regmap, reg_temp, reg, 2);
+ if (ret)
+ return ret;
+
+ temp = (reg[0] << 8) | reg[1];
+
+ *val = TEMP11_FROM_REG(temp);
+
+ return 0;
+ case hwmon_fan:
+ switch (attr) {
+ case hwmon_fan_input:
+ ret = regmap_bulk_read(state->regmap, REG_TACH(channel), reg, 2);
+ if (ret)
+ return ret;
+
+ *val = tach_to_rpm(reg[0] * 256 + reg[1]);
+
+ return 0;
+ case hwmon_fan_fault:
+ ret = regmap_read(state->regmap, REG_STATUS, &regval);
+ if (ret)
+ return ret;
+
+ if (channel)
+ *val = FIELD_GET(BIT(1), regval);
+ else
+ *val = FIELD_GET(BIT(0), regval);
+
+ return 0;
+ case hwmon_fan_enable:
+ ret = regmap_read(state->regmap, REG_CR3, &regval);
+ if (ret)
+ return ret;
+
+ if (channel)
+ *val = FIELD_GET(BIT(1), regval);
+ else
+ *val = FIELD_GET(BIT(0), regval);
+
+ return 0;
+ default:
+ return -EOPNOTSUPP;
+ }
+ case hwmon_pwm:
+ switch (attr) {
+ case hwmon_pwm_input:
+ ret = regmap_read(state->regmap, REG_PWMV, &regval);
+ if (ret)
+ return ret;
+
+ *val = regval;
+
+ return 0;
+ case hwmon_pwm_freq:
+ ret = regmap_read(state->regmap, REG_CR1, &regval);
+ if (ret)
+ return ret;
+
+ regval = FIELD_GET(CR1_DRV, regval);
+ if (regval >= ARRAY_SIZE(max31760_pwm_freq))
+ return -EINVAL;
+
+ *val = max31760_pwm_freq[regval];
+
+ return 0;
+ case hwmon_pwm_enable:
+ ret = regmap_read(state->regmap, REG_CR2, &regval);
+ if (ret)
+ return ret;
+
+ *val = 2 - FIELD_GET(CR2_DFC, regval);
+
+ return 0;
+ case hwmon_pwm_auto_channels_temp:
+ ret = regmap_read(state->regmap, REG_CR1, &regval);
+ if (ret)
+ return ret;
+
+ switch (FIELD_GET(CR1_TEMP_SRC, regval)) {
+ case 0:
+ *val = 2;
+ break;
+ case 1:
+ *val = 1;
+ break;
+ case 2:
+ case 3:
+ *val = 3;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+ default:
+ return -EOPNOTSUPP;
+ }
+ default:
+ return -EOPNOTSUPP;
+ }
+}
+
+static int max31760_write(struct device *dev, enum hwmon_sensor_types type,
+ u32 attr, int channel, long val)
+{
+ struct max31760_state *state = dev_get_drvdata(dev);
+ unsigned int pwm_index;
+ unsigned int reg_temp;
+ int temp;
+ u8 reg_val[2];
+
+ switch (type) {
+ case hwmon_temp:
+ switch (attr) {
+ case hwmon_temp_max:
+ reg_temp = REG_TEMP_MAX(channel);
+ break;
+ case hwmon_temp_crit:
+ reg_temp = REG_TEMP_CRIT(channel);
+ break;
+ default:
+ return -EOPNOTSUPP;
+ }
+
+ temp = TEMP11_TO_REG(val);
+ reg_val[0] = temp >> 8;
+ reg_val[1] = temp & 0xFF;
+
+ return regmap_bulk_write(state->regmap, reg_temp, reg_val, 2);
+ case hwmon_fan:
+ switch (attr) {
+ case hwmon_fan_enable:
+ if (val == 0)
+ return regmap_clear_bits(state->regmap, REG_CR3, BIT(channel));
+
+ if (val == 1)
+ return regmap_set_bits(state->regmap, REG_CR3, BIT(channel));
+
+ return -EOPNOTSUPP;
+ default:
+ return -EOPNOTSUPP;
+ }
+ case hwmon_pwm:
+ switch (attr) {
+ case hwmon_pwm_input:
+ if (val < 0 || val > 255)
+ return -EINVAL;
+
+ return regmap_write(state->regmap, REG_PWMR, val);
+ case hwmon_pwm_enable:
+ if (val == 1)
+ return regmap_set_bits(state->regmap, REG_CR2, CR2_DFC);
+
+ if (val == 2)
+ return regmap_clear_bits(state->regmap, REG_CR2, CR2_DFC);
+
+ return -EOPNOTSUPP;
+ case hwmon_pwm_freq:
+ pwm_index = find_closest(val, max31760_pwm_freq,
+ ARRAY_SIZE(max31760_pwm_freq));
+
+ return regmap_update_bits(state->regmap,
+ REG_CR1, CR1_DRV,
+ FIELD_PREP(CR1_DRV, pwm_index));
+ case hwmon_pwm_auto_channels_temp:
+ switch (val) {
+ case 1:
+ break;
+ case 2:
+ val = 0;
+ break;
+ case 3:
+ val = 2;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return regmap_update_bits(state->regmap, REG_CR1, CR1_TEMP_SRC, val);
+ default:
+ return -EOPNOTSUPP;
+ }
+ default:
+ return -EOPNOTSUPP;
+ }
+}
+
+static const struct hwmon_channel_info *max31760_info[] = {
+ HWMON_CHANNEL_INFO(chip,
+ HWMON_C_REGISTER_TZ),
+ HWMON_CHANNEL_INFO(fan,
+ HWMON_F_INPUT | HWMON_F_FAULT | HWMON_F_ENABLE,
+ HWMON_F_INPUT | HWMON_F_FAULT | HWMON_F_ENABLE),
+ HWMON_CHANNEL_INFO(temp,
+ HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT | HWMON_T_FAULT |
+ HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM | HWMON_T_LABEL,
+ HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT |
+ HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM | HWMON_T_LABEL),
+ HWMON_CHANNEL_INFO(pwm,
+ HWMON_PWM_ENABLE | HWMON_PWM_FREQ | HWMON_PWM_INPUT |
+ HWMON_PWM_AUTO_CHANNELS_TEMP),
+ NULL
+};
+
+static umode_t max31760_is_visible(const void *data,
+ enum hwmon_sensor_types type,
+ u32 attr, int channel)
+{
+ switch (type) {
+ case hwmon_temp:
+ switch (attr) {
+ case hwmon_temp_input:
+ case hwmon_temp_max_alarm:
+ case hwmon_temp_crit_alarm:
+ case hwmon_temp_fault:
+ case hwmon_temp_label:
+ return 0444;
+ case hwmon_temp_max:
+ case hwmon_temp_crit:
+ return 0644;
+ default:
+ return 0;
+ }
+ case hwmon_fan:
+ switch (attr) {
+ case hwmon_fan_input:
+ case hwmon_fan_fault:
+ return 0444;
+ case hwmon_fan_enable:
+ return 0644;
+ default:
+ return 0;
+ }
+ case hwmon_pwm:
+ switch (attr) {
+ case hwmon_pwm_enable:
+ case hwmon_pwm_input:
+ case hwmon_pwm_freq:
+ case hwmon_pwm_auto_channels_temp:
+ return 0644;
+ default:
+ return 0;
+ }
+ default:
+ return 0;
+ }
+}
+
+int max31760_read_string(struct device *dev, enum hwmon_sensor_types type,
+ u32 attr, int channel, const char **str)
+{
+ switch (type) {
+ case hwmon_temp:
+ if (attr != hwmon_temp_label)
+ return -EOPNOTSUPP;
+
+ *str = channel ? "local" : "remote";
+
+ return 0;
+ default:
+ return -EOPNOTSUPP;
+ }
+}
+
+static const struct hwmon_ops max31760_hwmon_ops = {
+ .is_visible = max31760_is_visible,
+ .read = max31760_read,
+ .write = max31760_write,
+ .read_string = max31760_read_string
+};
+
+static const struct hwmon_chip_info max31760_chip_info = {
+ .ops = &max31760_hwmon_ops,
+ .info = max31760_info,
+};
+
+static ssize_t lut_show(struct device *dev,
+ struct device_attribute *devattr, char *buf)
+{
+ struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr);
+ struct max31760_state *state = dev_get_drvdata(dev);
+ int ret;
+ unsigned int regval;
+
+ ret = regmap_read(state->regmap, REG_LUT(sda->index), &regval);
+ if (ret)
+ return ret;
+
+ return sysfs_emit(buf, "%d\n", regval);
+}
+
+static ssize_t lut_store(struct device *dev,
+ struct device_attribute *devattr,
+ const char *buf, size_t count)
+{
+ struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr);
+ struct max31760_state *state = dev_get_drvdata(dev);
+ int ret;
+ u8 pwm;
+
+ ret = kstrtou8(buf, 10, &pwm);
+ if (ret)
+ return ret;
+
+ ret = regmap_write(state->regmap, REG_LUT(sda->index), pwm);
+ if (ret)
+ return ret;
+
+ return count;
+}
+
+static ssize_t pwm1_auto_point_temp_hyst_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct max31760_state *state = dev_get_drvdata(dev);
+ unsigned int regval;
+ int ret;
+
+ ret = regmap_read(state->regmap, REG_CR1, &regval);
+ if (ret)
+ return ret;
+
+ return sysfs_emit(buf, "%d\n", (1 + (int)FIELD_GET(CR1_HYST, regval)) * 2000);
+}
+
+static ssize_t pwm1_auto_point_temp_hyst_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf,
+ size_t count)
+{
+ struct max31760_state *state = dev_get_drvdata(dev);
+ unsigned int hyst;
+ int ret;
+
+ ret = kstrtou32(buf, 10, &hyst);
+ if (ret)
+ return ret;
+
+ if (hyst < 3000)
+ ret = regmap_clear_bits(state->regmap, REG_CR1, CR1_HYST);
+ else
+ ret = regmap_set_bits(state->regmap, REG_CR1, CR1_HYST);
+
+ if (ret)
+ return ret;
+
+ return count;
+}
+
+static DEVICE_ATTR_RW(pwm1_auto_point_temp_hyst);
+
+static void max31760_create_lut_nodes(struct max31760_state *state)
+{
+ int i;
+ struct sensor_device_attribute *sda;
+ struct lut_attribute *lut;
+
+ for (i = 0; i < LUT_SIZE; ++i) {
+ lut = &state->lut[i];
+ sda = &lut->sda;
+
+ snprintf(lut->name, sizeof(lut->name),
+ "pwm1_auto_point%d_pwm", i + 1);
+
+ sda->dev_attr.attr.mode = 0644;
+ sda->index = i;
+ sda->dev_attr.show = lut_show;
+ sda->dev_attr.store = lut_store;
+ sda->dev_attr.attr.name = lut->name;
+
+ sysfs_attr_init(&sda->dev_attr.attr);
+
+ state->attrs[i] = &sda->dev_attr.attr;
+ }
+
+ state->attrs[i] = &dev_attr_pwm1_auto_point_temp_hyst.attr;
+
+ state->group.attrs = state->attrs;
+ state->groups[0] = &state->group;
+}
+
+static int max31760_probe(struct i2c_client *client)
+{
+ struct device *dev = &client->dev;
+ struct max31760_state *state;
+ struct device *hwmon_dev;
+ int ret;
+
+ state = devm_kzalloc(dev, sizeof(struct max31760_state), GFP_KERNEL);
+ if (!state)
+ return -ENOMEM;
+
+ state->regmap = devm_regmap_init_i2c(client, &regmap_config);
+ if (IS_ERR(state->regmap))
+ return dev_err_probe(dev,
+ PTR_ERR(state->regmap),
+ "regmap initialization failed\n");
+
+ dev_set_drvdata(dev, state);
+
+ /* Set alert output to comparator mode */
+ ret = regmap_set_bits(state->regmap, REG_CR2, CR2_ALERTS);
+ if (ret)
+ return dev_err_probe(dev, ret, "cannot write register\n");
+
+ max31760_create_lut_nodes(state);
+
+ hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name,
+ state,
+ &max31760_chip_info,
+ state->groups);
+
+ return PTR_ERR_OR_ZERO(hwmon_dev);
+}
+
+static const struct of_device_id max31760_of_match[] = {
+ {.compatible = "adi,max31760"},
+ { }
+};
+MODULE_DEVICE_TABLE(of, max31760_of_match);
+
+static const struct i2c_device_id max31760_id[] = {
+ {"max31760"},
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, max31760_id);
+
+static int __maybe_unused max31760_suspend(struct device *dev)
+{
+ struct max31760_state *state = dev_get_drvdata(dev);
+
+ return regmap_set_bits(state->regmap, REG_CR2, CR2_STBY);
+}
+
+static int __maybe_unused max31760_resume(struct device *dev)
+{
+ struct max31760_state *state = dev_get_drvdata(dev);
+
+ return regmap_clear_bits(state->regmap, REG_CR2, CR2_STBY);
+}
+
+static SIMPLE_DEV_PM_OPS(max31760_pm_ops, max31760_suspend, max31760_resume);
+
+static struct i2c_driver max31760_driver = {
+ .class = I2C_CLASS_HWMON,
+ .driver = {
+ .name = "max31760",
+ .of_match_table = of_match_ptr(max31760_of_match),
+ .pm = pm_ptr(&max31760_pm_ops)
+ },
+ .probe_new = max31760_probe,
+ .id_table = max31760_id
+};
+module_i2c_driver(max31760_driver);
+
+MODULE_AUTHOR("Ibrahim Tilki <[email protected]>");
+MODULE_DESCRIPTION("Analog Devices MAX31760 Fan Speed Controller");
+MODULE_SOFTDEP("pre: regmap_i2c");
+MODULE_VERSION("1.0");
+MODULE_LICENSE("GPL");
--
2.36.1

2022-09-08 09:21:43

by Tilki, Ibrahim

[permalink] [raw]
Subject: [PATCH RESEND v6 3/4] dt-bindings: hwmon: Add bindings for max31760

Adding bindings for Analog Devices MAX31760 Fan-Speed Controller

Signed-off-by: Ibrahim Tilki <[email protected]>
---
.../bindings/hwmon/adi,max31760.yaml | 44 +++++++++++++++++++
1 file changed, 44 insertions(+)
create mode 100644 Documentation/devicetree/bindings/hwmon/adi,max31760.yaml

diff --git a/Documentation/devicetree/bindings/hwmon/adi,max31760.yaml b/Documentation/devicetree/bindings/hwmon/adi,max31760.yaml
new file mode 100644
index 000000000..003ec1317
--- /dev/null
+++ b/Documentation/devicetree/bindings/hwmon/adi,max31760.yaml
@@ -0,0 +1,44 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/hwmon/adi,max31760.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Analog Devices MAX31760 Fan-Speed Controller
+
+maintainers:
+ - Ibrahim Tilki <[email protected]>
+
+description: |
+ Analog Devices MAX31760 Fan-Speed Controller
+ https://datasheets.maximintegrated.com/en/ds/MAX31760.pdf
+
+properties:
+ compatible:
+ enum:
+ - adi,max31760
+
+ reg:
+ description: |
+ I2C address of slave device.
+ items:
+ minimum: 0x50
+ maximum: 0x57
+
+required:
+ - compatible
+ - reg
+
+additionalProperties: false
+
+examples:
+ - |
+ i2c0 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ max31760@50 {
+ reg = <0x50>;
+ compatible = "adi,max31760";
+ };
+ };
--
2.36.1

2022-09-08 15:38:50

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH RESEND v6 1/4] drivers: hwmon: Add max31760 fan speed controller driver

Hi Ibrahim,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on groeck-staging/hwmon-next]
[also build test WARNING on linus/master v6.0-rc4 next-20220908]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Ibrahim-Tilki/hwmon-Add-max31760-fan-speed-controller/20220908-162723
base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next
config: i386-allyesconfig
compiler: gcc-11 (Debian 11.3.0-5) 11.3.0
reproduce (this is a W=1 build):
# https://github.com/intel-lab-lkp/linux/commit/a7a9956fb85372f1d08a355df3af7d64c927a987
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Ibrahim-Tilki/hwmon-Add-max31760-fan-speed-controller/20220908-162723
git checkout a7a9956fb85372f1d08a355df3af7d64c927a987
# save the config file
mkdir build_dir && cp config build_dir/.config
make W=1 O=build_dir ARCH=i386 SHELL=/bin/bash drivers/hwmon/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <[email protected]>

All warnings (new ones prefixed by >>):

>> drivers/hwmon/max31760.c:382:5: warning: no previous prototype for 'max31760_read_string' [-Wmissing-prototypes]
382 | int max31760_read_string(struct device *dev, enum hwmon_sensor_types type,
| ^~~~~~~~~~~~~~~~~~~~


vim +/max31760_read_string +382 drivers/hwmon/max31760.c

381
> 382 int max31760_read_string(struct device *dev, enum hwmon_sensor_types type,
383 u32 attr, int channel, const char **str)
384 {
385 switch (type) {
386 case hwmon_temp:
387 if (attr != hwmon_temp_label)
388 return -EOPNOTSUPP;
389
390 *str = channel ? "local" : "remote";
391
392 return 0;
393 default:
394 return -EOPNOTSUPP;
395 }
396 }
397

--
0-DAY CI Kernel Test Service
https://01.org/lkp


Attachments:
(No filename) (2.15 kB)
config (291.47 kB)
Download all attachments

2022-09-08 16:02:17

by Guenter Roeck

[permalink] [raw]
Subject: Re: [PATCH RESEND v6 3/4] dt-bindings: hwmon: Add bindings for max31760

On 9/8/22 01:23, Ibrahim Tilki wrote:
> Adding bindings for Analog Devices MAX31760 Fan-Speed Controller
>
> Signed-off-by: Ibrahim Tilki <[email protected]>

This time you dropped the maintainers from Cc:. Why ?

Guenter

> ---
> .../bindings/hwmon/adi,max31760.yaml | 44 +++++++++++++++++++
> 1 file changed, 44 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/hwmon/adi,max31760.yaml
>
> diff --git a/Documentation/devicetree/bindings/hwmon/adi,max31760.yaml b/Documentation/devicetree/bindings/hwmon/adi,max31760.yaml
> new file mode 100644
> index 000000000..003ec1317
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/hwmon/adi,max31760.yaml
> @@ -0,0 +1,44 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/hwmon/adi,max31760.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Analog Devices MAX31760 Fan-Speed Controller
> +
> +maintainers:
> + - Ibrahim Tilki <[email protected]>
> +
> +description: |
> + Analog Devices MAX31760 Fan-Speed Controller
> + https://datasheets.maximintegrated.com/en/ds/MAX31760.pdf
> +
> +properties:
> + compatible:
> + enum:
> + - adi,max31760
> +
> + reg:
> + description: |
> + I2C address of slave device.
> + items:
> + minimum: 0x50
> + maximum: 0x57
> +
> +required:
> + - compatible
> + - reg
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + i2c0 {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + max31760@50 {
> + reg = <0x50>;
> + compatible = "adi,max31760";
> + };
> + };

2022-09-08 16:06:56

by Tilki, Ibrahim

[permalink] [raw]
Subject: RE: [PATCH RESEND v6 3/4] dt-bindings: hwmon: Add bindings for max31760


> On 9/8/22 01:23, Ibrahim Tilki wrote:
> > Adding bindings for Analog Devices MAX31760 Fan-Speed Controller
> >
> > Signed-off-by: Ibrahim Tilki <[email protected]>
>
> This time you dropped the maintainers from Cc:. Why ?
>
> Guenter
>

I thought I need to send the patch to devicetree list <[email protected]>
instead of sending directly to maintainers as per Rob's reply.
Should I add them to Cc as well and resend again?

Ibrahim


> > ---
> > .../bindings/hwmon/adi,max31760.yaml | 44 +++++++++++++++++++
> > 1 file changed, 44 insertions(+)
> > create mode 100644
> > Documentation/devicetree/bindings/hwmon/adi,max31760.yaml
> >
> > diff --git a/Documentation/devicetree/bindings/hwmon/adi,max31760.yaml
> > b/Documentation/devicetree/bindings/hwmon/adi,max31760.yaml
> > new file mode 100644
> > index 000000000..003ec1317
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/hwmon/adi,max31760.yaml
> > @@ -0,0 +1,44 @@
> > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) %YAML 1.2
> > +---
> > +$id:
> > +https://urldefense.com/v3/__http://devicetree.org/schemas/hwmon/adi,m
> > +ax31760.yaml*__;Iw!!A3Ni8CS0y2Y!4jxXOqgSL2JDA_zhVxa1gDg-X3GvtxnISuyIJ
> > +0fz_0Blfkx3tzqwICgIVHzIxrv7-7nDoCZqZgYJ0OtFP8A$
> > +$schema:
> > +https://urldefense.com/v3/__http://devicetree.org/meta-schemas/core.y
> > +aml*__;Iw!!A3Ni8CS0y2Y!4jxXOqgSL2JDA_zhVxa1gDg-X3GvtxnISuyIJ0fz_0Blfk
> > +x3tzqwICgIVHzIxrv7-7nDoCZqZgYJ5GeDd5g$
> > +
> > +title: Analog Devices MAX31760 Fan-Speed Controller
> > +
> > +maintainers:
> > + - Ibrahim Tilki <[email protected]>
> > +
> > +description: |
> > + Analog Devices MAX31760 Fan-Speed Controller
> > + https://datasheets.maximintegrated.com/en/ds/MAX31760.pdf
> > +
> > +properties:
> > + compatible:
> > + enum:
> > + - adi,max31760
> > +
> > + reg:
> > + description: |
> > + I2C address of slave device.
> > + items:
> > + minimum: 0x50
> > + maximum: 0x57
> > +
> > +required:
> > + - compatible
> > + - reg
> > +
> > +additionalProperties: false
> > +
> > +examples:
> > + - |
> > + i2c0 {
> > + #address-cells = <1>;
> > + #size-cells = <0>;
> > +
> > + max31760@50 {
> > + reg = <0x50>;
> > + compatible = "adi,max31760";
> > + };
> > + };

2022-09-08 16:42:51

by Guenter Roeck

[permalink] [raw]
Subject: Re: [PATCH RESEND v6 3/4] dt-bindings: hwmon: Add bindings for max31760

On 9/8/22 08:46, Tilki, Ibrahim wrote:
>
>> On 9/8/22 01:23, Ibrahim Tilki wrote:
>>> Adding bindings for Analog Devices MAX31760 Fan-Speed Controller
>>>
>>> Signed-off-by: Ibrahim Tilki <[email protected]>
>>
>> This time you dropped the maintainers from Cc:. Why ?
>>
>> Guenter
>>
>
> I thought I need to send the patch to devicetree list <[email protected]>
> instead of sending directly to maintainers as per Rob's reply.

I don't think Rob said "instead" in his e-mail. He asked you to send
the patches to the recipients listed by the get_maintainers script.

> Should I add them to Cc as well and resend again?
>

You'll wee if/when he replies. Note that you got a 0-day report,
so you'll have to send another version of your series anyway
with the reported problem fixed.

Thanks,
Guenter

> Ibrahim
>
>
>>> ---
>>> .../bindings/hwmon/adi,max31760.yaml | 44 +++++++++++++++++++
>>> 1 file changed, 44 insertions(+)
>>> create mode 100644
>>> Documentation/devicetree/bindings/hwmon/adi,max31760.yaml
>>>
>>> diff --git a/Documentation/devicetree/bindings/hwmon/adi,max31760.yaml
>>> b/Documentation/devicetree/bindings/hwmon/adi,max31760.yaml
>>> new file mode 100644
>>> index 000000000..003ec1317
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/hwmon/adi,max31760.yaml
>>> @@ -0,0 +1,44 @@
>>> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) %YAML 1.2
>>> +---
>>> +$id:
>>> +https://urldefense.com/v3/__http://devicetree.org/schemas/hwmon/adi,m
>>> +ax31760.yaml*__;Iw!!A3Ni8CS0y2Y!4jxXOqgSL2JDA_zhVxa1gDg-X3GvtxnISuyIJ
>>> +0fz_0Blfkx3tzqwICgIVHzIxrv7-7nDoCZqZgYJ0OtFP8A$
>>> +$schema:
>>> +https://urldefense.com/v3/__http://devicetree.org/meta-schemas/core.y
>>> +aml*__;Iw!!A3Ni8CS0y2Y!4jxXOqgSL2JDA_zhVxa1gDg-X3GvtxnISuyIJ0fz_0Blfk
>>> +x3tzqwICgIVHzIxrv7-7nDoCZqZgYJ5GeDd5g$
>>> +
>>> +title: Analog Devices MAX31760 Fan-Speed Controller
>>> +
>>> +maintainers:
>>> + - Ibrahim Tilki <[email protected]>
>>> +
>>> +description: |
>>> + Analog Devices MAX31760 Fan-Speed Controller
>>> + https://datasheets.maximintegrated.com/en/ds/MAX31760.pdf
>>> +
>>> +properties:
>>> + compatible:
>>> + enum:
>>> + - adi,max31760
>>> +
>>> + reg:
>>> + description: |
>>> + I2C address of slave device.
>>> + items:
>>> + minimum: 0x50
>>> + maximum: 0x57
>>> +
>>> +required:
>>> + - compatible
>>> + - reg
>>> +
>>> +additionalProperties: false
>>> +
>>> +examples:
>>> + - |
>>> + i2c0 {
>>> + #address-cells = <1>;
>>> + #size-cells = <0>;
>>> +
>>> + max31760@50 {
>>> + reg = <0x50>;
>>> + compatible = "adi,max31760";
>>> + };
>>> + };

2022-09-08 21:55:53

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH RESEND v6 1/4] drivers: hwmon: Add max31760 fan speed controller driver

Hi Ibrahim,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on groeck-staging/hwmon-next]
[also build test WARNING on linus/master v6.0-rc4 next-20220908]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Ibrahim-Tilki/hwmon-Add-max31760-fan-speed-controller/20220908-162723
base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next
config: hexagon-allmodconfig (https://download.01.org/0day-ci/archive/20220909/[email protected]/config)
compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 1546df49f5a6d09df78f569e4137ddb365a3e827)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/a7a9956fb85372f1d08a355df3af7d64c927a987
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Ibrahim-Tilki/hwmon-Add-max31760-fan-speed-controller/20220908-162723
git checkout a7a9956fb85372f1d08a355df3af7d64c927a987
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash drivers/hwmon/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <[email protected]>

All warnings (new ones prefixed by >>):

>> drivers/hwmon/max31760.c:382:5: warning: no previous prototype for function 'max31760_read_string' [-Wmissing-prototypes]
int max31760_read_string(struct device *dev, enum hwmon_sensor_types type,
^
drivers/hwmon/max31760.c:382:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int max31760_read_string(struct device *dev, enum hwmon_sensor_types type,
^
static
1 warning generated.


vim +/max31760_read_string +382 drivers/hwmon/max31760.c

381
> 382 int max31760_read_string(struct device *dev, enum hwmon_sensor_types type,
383 u32 attr, int channel, const char **str)
384 {
385 switch (type) {
386 case hwmon_temp:
387 if (attr != hwmon_temp_label)
388 return -EOPNOTSUPP;
389
390 *str = channel ? "local" : "remote";
391
392 return 0;
393 default:
394 return -EOPNOTSUPP;
395 }
396 }
397

--
0-DAY CI Kernel Test Service
https://01.org/lkp