* [PATCH] hwmon: it87: describe per-chip temperature resources
@ 2025-12-26 20:30 benoit.masson
2025-12-26 20:54 ` Benoit Masson
2026-01-05 10:10 ` Dan Carpenter
0 siblings, 2 replies; 8+ messages in thread
From: benoit.masson @ 2025-12-26 20:30 UTC (permalink / raw)
To: jdelvare, linux; +Cc: linux-hwmon, linux-kernel, benoit.masson
Signed-off-by: benoit.masson <yahoo@perenite.com>
---
drivers/hwmon/it87.c | 50 ++++++++++++++++++++++++++++++++------------
1 file changed, 37 insertions(+), 13 deletions(-)
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c
index e233aafa8856..f9eca0bc02bc 100644
--- a/drivers/hwmon/it87.c
+++ b/drivers/hwmon/it87.c
@@ -54,6 +54,7 @@
#include <linux/hwmon-vid.h>
#include <linux/err.h>
#include <linux/mutex.h>
+#include <linux/minmax.h>
#include <linux/sysfs.h>
#include <linux/string.h>
#include <linux/dmi.h>
@@ -279,8 +280,9 @@ static const u8 IT87_REG_AUTO_BASE[] = { 0x60, 0x68, 0x70, 0x78, 0xa0, 0xa8 };
#define NUM_VIN ARRAY_SIZE(IT87_REG_VIN)
#define NUM_VIN_LIMIT 8
#define NUM_TEMP 6
-#define NUM_TEMP_OFFSET ARRAY_SIZE(IT87_REG_TEMP_OFFSET)
-#define NUM_TEMP_LIMIT 3
+#define IT87_TEMP_OFFSET_MAX ARRAY_SIZE(IT87_REG_TEMP_OFFSET)
+#define IT87_TEMP_LIMIT_DEFAULT 3
+#define IT87_TEMP_MAP_DEFAULT 3
#define NUM_FAN ARRAY_SIZE(IT87_REG_FAN)
#define NUM_FAN_DIV 3
#define NUM_PWM ARRAY_SIZE(IT87_REG_PWM)
@@ -290,6 +292,9 @@ struct it87_devices {
const char *name;
const char * const model;
u32 features;
+ u8 num_temp_limit;
+ u8 num_temp_offset;
+ u8 num_temp_map;
u8 peci_mask;
u8 old_peci_mask;
u8 smbus_bitmap; /* SMBus enable bits in extra config register */
@@ -578,6 +583,9 @@ struct it87_data {
int sioaddr;
enum chips type;
u32 features;
+ u8 num_temp_limit;
+ u8 num_temp_offset;
+ u8 num_temp_map;
u8 peci_mask;
u8 old_peci_mask;
@@ -926,12 +934,13 @@ static struct it87_data *it87_update_device(struct device *dev)
data->temp[i][0] =
it87_read_value(data, IT87_REG_TEMP(i));
- if (has_temp_offset(data) && i < NUM_TEMP_OFFSET)
+ if (has_temp_offset(data) &&
+ i < data->num_temp_offset)
data->temp[i][3] =
it87_read_value(data,
IT87_REG_TEMP_OFFSET[i]);
- if (i >= NUM_TEMP_LIMIT)
+ if (i >= data->num_temp_limit)
continue;
data->temp[i][1] =
@@ -1679,16 +1688,17 @@ static ssize_t show_pwm_temp_map(struct device *dev,
struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
struct it87_data *data = it87_update_device(dev);
int nr = sensor_attr->index;
+ u8 num_map = data->num_temp_map ?: IT87_TEMP_MAP_DEFAULT;
int map;
if (IS_ERR(data))
return PTR_ERR(data);
map = data->pwm_temp_map[nr];
- if (map >= 3)
+ if (map >= num_map)
map = 0; /* Should never happen */
- if (nr >= 3) /* pwm channels 3..6 map to temp4..6 */
- map += 3;
+ if (nr >= num_map) /* pwm channels 3..6 map to temp4..6 */
+ map += num_map;
return sprintf(buf, "%d\n", (int)BIT(map));
}
@@ -1700,6 +1710,7 @@ static ssize_t set_pwm_temp_map(struct device *dev,
struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
struct it87_data *data = dev_get_drvdata(dev);
int nr = sensor_attr->index;
+ u8 num_map = data->num_temp_map ?: IT87_TEMP_MAP_DEFAULT;
long val;
int err;
u8 reg;
@@ -1707,8 +1718,8 @@ static ssize_t set_pwm_temp_map(struct device *dev,
if (kstrtol(buf, 10, &val) < 0)
return -EINVAL;
- if (nr >= 3)
- val -= 3;
+ if (nr >= num_map)
+ val -= num_map;
switch (val) {
case BIT(0):
@@ -3206,7 +3217,7 @@ static void it87_check_limit_regs(struct it87_data *data)
if (reg == 0xff)
it87_write_value(data, IT87_REG_VIN_MIN(i), 0);
}
- for (i = 0; i < NUM_TEMP_LIMIT; i++) {
+ for (i = 0; i < data->num_temp_limit; i++) {
reg = it87_read_value(data, IT87_REG_TEMP_HIGH(i));
if (reg == 0xff)
it87_write_value(data, IT87_REG_TEMP_HIGH(i), 127);
@@ -3399,6 +3410,7 @@ static int it87_probe(struct platform_device *pdev)
struct resource *res;
struct device *dev = &pdev->dev;
struct it87_sio_data *sio_data = dev_get_platdata(dev);
+ const struct it87_devices *chip;
int enable_pwm_interface;
struct device *hwmon_dev;
int err;
@@ -3421,9 +3433,21 @@ static int it87_probe(struct platform_device *pdev)
data->type = sio_data->type;
data->smbus_bitmap = sio_data->smbus_bitmap;
data->ec_special_config = sio_data->ec_special_config;
- data->features = it87_devices[sio_data->type].features;
- data->peci_mask = it87_devices[sio_data->type].peci_mask;
- data->old_peci_mask = it87_devices[sio_data->type].old_peci_mask;
+ chip = &it87_devices[sio_data->type];
+ data->features = chip->features;
+ data->peci_mask = chip->peci_mask;
+ data->old_peci_mask = chip->old_peci_mask;
+ data->num_temp_limit = chip->num_temp_limit ?
+ chip->num_temp_limit : IT87_TEMP_LIMIT_DEFAULT;
+ if (chip->num_temp_offset)
+ data->num_temp_offset = min(chip->num_temp_offset,
+ (u8)IT87_TEMP_OFFSET_MAX);
+ else if (has_temp_offset(data))
+ data->num_temp_offset = IT87_TEMP_OFFSET_MAX;
+ else
+ data->num_temp_offset = 0;
+ data->num_temp_map = chip->num_temp_map ?
+ chip->num_temp_map : IT87_TEMP_MAP_DEFAULT;
/*
* IT8705F Datasheet 0.4.1, 3h == Version G.
* IT8712F Datasheet 0.9.1, section 8.3.5 indicates 8h == Version J.
--
2.50.1 (Apple Git-155)
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] hwmon: it87: describe per-chip temperature resources
2025-12-26 20:30 [PATCH] hwmon: it87: describe per-chip temperature resources benoit.masson
@ 2025-12-26 20:54 ` Benoit Masson
2025-12-28 19:33 ` Guenter Roeck
2026-01-05 10:10 ` Dan Carpenter
1 sibling, 1 reply; 8+ messages in thread
From: Benoit Masson @ 2025-12-26 20:54 UTC (permalink / raw)
To: jdelvare, linux; +Cc: linux-hwmon, linux-kernel
This patch is intended to be part of a series to help with support of
newer IT chipp which have new more dynamic options, and make the
review easier.
This patch is about making the number of:
- temperature limit registers,
- temperature offset registers, and
- temperature-to-PWM mapping slots (per PWM bank)
configurable per chip, instead of hard-coded constants.
for all existing chips in the in-tree driver this patch does not
change behavior because you:
- keep the old defaults (3 temp limits, 3 offsets, “3+3” PWM temp
mapping banks),
- and only prepare per-chip fields without actually changing any
it87_devices[] initialisers yet.
Thanks
Benoit
On Fri, Dec 26, 2025 at 9:30 PM benoit.masson <yahoo@perenite.com> wrote:
>
> Signed-off-by: benoit.masson <yahoo@perenite.com>
> ---
> drivers/hwmon/it87.c | 50 ++++++++++++++++++++++++++++++++------------
> 1 file changed, 37 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c
> index e233aafa8856..f9eca0bc02bc 100644
> --- a/drivers/hwmon/it87.c
> +++ b/drivers/hwmon/it87.c
> @@ -54,6 +54,7 @@
> #include <linux/hwmon-vid.h>
> #include <linux/err.h>
> #include <linux/mutex.h>
> +#include <linux/minmax.h>
> #include <linux/sysfs.h>
> #include <linux/string.h>
> #include <linux/dmi.h>
> @@ -279,8 +280,9 @@ static const u8 IT87_REG_AUTO_BASE[] = { 0x60, 0x68, 0x70, 0x78, 0xa0, 0xa8 };
> #define NUM_VIN ARRAY_SIZE(IT87_REG_VIN)
> #define NUM_VIN_LIMIT 8
> #define NUM_TEMP 6
> -#define NUM_TEMP_OFFSET ARRAY_SIZE(IT87_REG_TEMP_OFFSET)
> -#define NUM_TEMP_LIMIT 3
> +#define IT87_TEMP_OFFSET_MAX ARRAY_SIZE(IT87_REG_TEMP_OFFSET)
> +#define IT87_TEMP_LIMIT_DEFAULT 3
> +#define IT87_TEMP_MAP_DEFAULT 3
> #define NUM_FAN ARRAY_SIZE(IT87_REG_FAN)
> #define NUM_FAN_DIV 3
> #define NUM_PWM ARRAY_SIZE(IT87_REG_PWM)
> @@ -290,6 +292,9 @@ struct it87_devices {
> const char *name;
> const char * const model;
> u32 features;
> + u8 num_temp_limit;
> + u8 num_temp_offset;
> + u8 num_temp_map;
> u8 peci_mask;
> u8 old_peci_mask;
> u8 smbus_bitmap; /* SMBus enable bits in extra config register */
> @@ -578,6 +583,9 @@ struct it87_data {
> int sioaddr;
> enum chips type;
> u32 features;
> + u8 num_temp_limit;
> + u8 num_temp_offset;
> + u8 num_temp_map;
> u8 peci_mask;
> u8 old_peci_mask;
>
> @@ -926,12 +934,13 @@ static struct it87_data *it87_update_device(struct device *dev)
> data->temp[i][0] =
> it87_read_value(data, IT87_REG_TEMP(i));
>
> - if (has_temp_offset(data) && i < NUM_TEMP_OFFSET)
> + if (has_temp_offset(data) &&
> + i < data->num_temp_offset)
> data->temp[i][3] =
> it87_read_value(data,
> IT87_REG_TEMP_OFFSET[i]);
>
> - if (i >= NUM_TEMP_LIMIT)
> + if (i >= data->num_temp_limit)
> continue;
>
> data->temp[i][1] =
> @@ -1679,16 +1688,17 @@ static ssize_t show_pwm_temp_map(struct device *dev,
> struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
> struct it87_data *data = it87_update_device(dev);
> int nr = sensor_attr->index;
> + u8 num_map = data->num_temp_map ?: IT87_TEMP_MAP_DEFAULT;
> int map;
>
> if (IS_ERR(data))
> return PTR_ERR(data);
>
> map = data->pwm_temp_map[nr];
> - if (map >= 3)
> + if (map >= num_map)
> map = 0; /* Should never happen */
> - if (nr >= 3) /* pwm channels 3..6 map to temp4..6 */
> - map += 3;
> + if (nr >= num_map) /* pwm channels 3..6 map to temp4..6 */
> + map += num_map;
>
> return sprintf(buf, "%d\n", (int)BIT(map));
> }
> @@ -1700,6 +1710,7 @@ static ssize_t set_pwm_temp_map(struct device *dev,
> struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
> struct it87_data *data = dev_get_drvdata(dev);
> int nr = sensor_attr->index;
> + u8 num_map = data->num_temp_map ?: IT87_TEMP_MAP_DEFAULT;
> long val;
> int err;
> u8 reg;
> @@ -1707,8 +1718,8 @@ static ssize_t set_pwm_temp_map(struct device *dev,
> if (kstrtol(buf, 10, &val) < 0)
> return -EINVAL;
>
> - if (nr >= 3)
> - val -= 3;
> + if (nr >= num_map)
> + val -= num_map;
>
> switch (val) {
> case BIT(0):
> @@ -3206,7 +3217,7 @@ static void it87_check_limit_regs(struct it87_data *data)
> if (reg == 0xff)
> it87_write_value(data, IT87_REG_VIN_MIN(i), 0);
> }
> - for (i = 0; i < NUM_TEMP_LIMIT; i++) {
> + for (i = 0; i < data->num_temp_limit; i++) {
> reg = it87_read_value(data, IT87_REG_TEMP_HIGH(i));
> if (reg == 0xff)
> it87_write_value(data, IT87_REG_TEMP_HIGH(i), 127);
> @@ -3399,6 +3410,7 @@ static int it87_probe(struct platform_device *pdev)
> struct resource *res;
> struct device *dev = &pdev->dev;
> struct it87_sio_data *sio_data = dev_get_platdata(dev);
> + const struct it87_devices *chip;
> int enable_pwm_interface;
> struct device *hwmon_dev;
> int err;
> @@ -3421,9 +3433,21 @@ static int it87_probe(struct platform_device *pdev)
> data->type = sio_data->type;
> data->smbus_bitmap = sio_data->smbus_bitmap;
> data->ec_special_config = sio_data->ec_special_config;
> - data->features = it87_devices[sio_data->type].features;
> - data->peci_mask = it87_devices[sio_data->type].peci_mask;
> - data->old_peci_mask = it87_devices[sio_data->type].old_peci_mask;
> + chip = &it87_devices[sio_data->type];
> + data->features = chip->features;
> + data->peci_mask = chip->peci_mask;
> + data->old_peci_mask = chip->old_peci_mask;
> + data->num_temp_limit = chip->num_temp_limit ?
> + chip->num_temp_limit : IT87_TEMP_LIMIT_DEFAULT;
> + if (chip->num_temp_offset)
> + data->num_temp_offset = min(chip->num_temp_offset,
> + (u8)IT87_TEMP_OFFSET_MAX);
> + else if (has_temp_offset(data))
> + data->num_temp_offset = IT87_TEMP_OFFSET_MAX;
> + else
> + data->num_temp_offset = 0;
> + data->num_temp_map = chip->num_temp_map ?
> + chip->num_temp_map : IT87_TEMP_MAP_DEFAULT;
> /*
> * IT8705F Datasheet 0.4.1, 3h == Version G.
> * IT8712F Datasheet 0.9.1, section 8.3.5 indicates 8h == Version J.
> --
> 2.50.1 (Apple Git-155)
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] hwmon: it87: describe per-chip temperature resources
2025-12-26 20:54 ` Benoit Masson
@ 2025-12-28 19:33 ` Guenter Roeck
2025-12-28 20:21 ` Benoit Masson
2025-12-29 15:36 ` Benoit Masson
0 siblings, 2 replies; 8+ messages in thread
From: Guenter Roeck @ 2025-12-28 19:33 UTC (permalink / raw)
To: Benoit Masson; +Cc: jdelvare, linux-hwmon, linux-kernel
On Fri, Dec 26, 2025 at 09:54:44PM +0100, Benoit Masson wrote:
> This patch is intended to be part of a series to help with support of
> newer IT chipp which have new more dynamic options, and make the
> review easier.
>
Then why don't you send it as series with this as patch 0 of the series ?
You are saying this would be to make reviews easier, but in reality you
are making it more difficult.
Guenter
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] hwmon: it87: describe per-chip temperature resources
2025-12-28 19:33 ` Guenter Roeck
@ 2025-12-28 20:21 ` Benoit Masson
2025-12-29 15:36 ` Benoit Masson
1 sibling, 0 replies; 8+ messages in thread
From: Benoit Masson @ 2025-12-28 20:21 UTC (permalink / raw)
To: Guenter Roeck; +Cc: jdelvare, linux-hwmon, linux-kernel
They are intended to be added to add feature needed by new chipset one
by one not breaking the current ones. So you can review and discuss
feature by feature.
Benoit
On Sun, Dec 28, 2025 at 8:33 PM Guenter Roeck <linux@roeck-us.net> wrote:
>
> On Fri, Dec 26, 2025 at 09:54:44PM +0100, Benoit Masson wrote:
> > This patch is intended to be part of a series to help with support of
> > newer IT chipp which have new more dynamic options, and make the
> > review easier.
> >
>
> Then why don't you send it as series with this as patch 0 of the series ?
> You are saying this would be to make reviews easier, but in reality you
> are making it more difficult.
>
> Guenter
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] hwmon: it87: describe per-chip temperature resources
2025-12-28 19:33 ` Guenter Roeck
2025-12-28 20:21 ` Benoit Masson
@ 2025-12-29 15:36 ` Benoit Masson
1 sibling, 0 replies; 8+ messages in thread
From: Benoit Masson @ 2025-12-29 15:36 UTC (permalink / raw)
To: Guenter Roeck; +Cc: jdelvare, linux-hwmon, linux-kernel
On Sun, Dec 28, 2025 at 8:33 PM Guenter Roeck <linux@roeck-us.net> wrote:
> Then why don't you send it as series with this as patch 0 of the series ?
> You are saying this would be to make reviews easier, but in reality you
> are making it more difficult.
>
Hi Guenter,
Thank you for the feedback - you're absolutely right, and I apologize
for the confusing submission approach. My previous reply was probably
too quick and didn't properly address your concerns.
I want to make sure I handle this correctly going forward. Would you
prefer that I:
- Resubmit everything as a proper patch series (0/N with cover letter
explaining the overall goals and how each patch adds support
incrementally), or
- Is there another approach you'd recommend given the current state?
I'm happy to discard the previous 4 patches and start fresh in
whatever format works best for your review process. The goal is to add
support for newer IT87xx variants that many Linux users have in their
systems, and I want to ensure the submission respects both your time
as maintainer and kernel development practices.
I appreciate your guidance on the best path forward.
Best regards,
Benoit
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] hwmon: it87: describe per-chip temperature resources
2025-12-26 20:30 [PATCH] hwmon: it87: describe per-chip temperature resources benoit.masson
2025-12-26 20:54 ` Benoit Masson
@ 2026-01-05 10:10 ` Dan Carpenter
2026-01-07 19:18 ` Benoit Masson
1 sibling, 1 reply; 8+ messages in thread
From: Dan Carpenter @ 2026-01-05 10:10 UTC (permalink / raw)
To: oe-kbuild, benoit.masson, jdelvare, linux
Cc: lkp, oe-kbuild-all, linux-hwmon, linux-kernel, benoit.masson
Hi benoit.masson,
kernel test robot noticed the following build warnings:
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/benoit-masson/hwmon-it87-describe-per-chip-temperature-resources/20251227-043108
base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next
patch link: https://lore.kernel.org/r/20251226203021.27244-1-yahoo%40perenite.com
patch subject: [PATCH] hwmon: it87: describe per-chip temperature resources
config: x86_64-randconfig-161-20251229 (https://download.01.org/0day-ci/archive/20251230/202512300415.VRCQoZYs-lkp@intel.com/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
| Closes: https://lore.kernel.org/r/202512300415.VRCQoZYs-lkp@intel.com/
smatch warnings:
drivers/hwmon/it87.c:1694 show_pwm_temp_map() warn: variable dereferenced before IS_ERR check 'data' (see line 1691)
vim +/data +1694 drivers/hwmon/it87.c
94ac7ee616809d Jean Delvare 2010-03-05 1685 static ssize_t show_pwm_temp_map(struct device *dev,
94ac7ee616809d Jean Delvare 2010-03-05 1686 struct device_attribute *attr, char *buf)
94ac7ee616809d Jean Delvare 2010-03-05 1687 {
94ac7ee616809d Jean Delvare 2010-03-05 1688 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
94ac7ee616809d Jean Delvare 2010-03-05 1689 struct it87_data *data = it87_update_device(dev);
c962024e306ed5 Guenter Roeck 2015-04-04 1690 int nr = sensor_attr->index;
542f1e57c17849 benoit.masson 2025-12-26 @1691 u8 num_map = data->num_temp_map ?: IT87_TEMP_MAP_DEFAULT;
^^^^^^^^^^^^^^^^^^
Unchecked dereference
94ac7ee616809d Jean Delvare 2010-03-05 1692 int map;
94ac7ee616809d Jean Delvare 2010-03-05 1693
0282ba4a4fe6c8 Frank Crawford 2023-04-16 @1694 if (IS_ERR(data))
^^^^
Checked too late.
0282ba4a4fe6c8 Frank Crawford 2023-04-16 1695 return PTR_ERR(data);
0282ba4a4fe6c8 Frank Crawford 2023-04-16 1696
0624d861983c2c Guenter Roeck 2015-04-06 1697 map = data->pwm_temp_map[nr];
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] hwmon: it87: describe per-chip temperature resources
2026-01-05 10:10 ` Dan Carpenter
@ 2026-01-07 19:18 ` Benoit Masson
2026-01-07 19:43 ` Dan Carpenter
0 siblings, 1 reply; 8+ messages in thread
From: Benoit Masson @ 2026-01-07 19:18 UTC (permalink / raw)
To: Dan Carpenter
Cc: oe-kbuild, jdelvare, Guenter Roeck, lkp, oe-kbuild-all,
linux-hwmon, linux-kernel
On Mon, Jan 5, 2026 at 11:10 AM Dan Carpenter <dan.carpenter@linaro.org> wrote:
>
> Hi benoit.masson,
>
> kernel test robot noticed the following build warnings:
>
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>
> url: https://github.com/intel-lab-lkp/linux/commits/benoit-masson/hwmon-it87-describe-per-chip-temperature-resources/20251227-043108
> base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next
> patch link: https://lore.kernel.org/r/20251226203021.27244-1-yahoo%40perenite.com
> patch subject: [PATCH] hwmon: it87: describe per-chip temperature resources
> config: x86_64-randconfig-161-20251229 (https://download.01.org/0day-ci/archive/20251230/202512300415.VRCQoZYs-lkp@intel.com/config)
> compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
> | Closes: https://lore.kernel.org/r/202512300415.VRCQoZYs-lkp@intel.com/
>
> smatch warnings:
> drivers/hwmon/it87.c:1694 show_pwm_temp_map() warn: variable dereferenced before IS_ERR check 'data' (see line 1691)
>
> vim +/data +1694 drivers/hwmon/it87.c
>
> 94ac7ee616809d Jean Delvare 2010-03-05 1685 static ssize_t show_pwm_temp_map(struct device *dev,
> 94ac7ee616809d Jean Delvare 2010-03-05 1686 struct device_attribute *attr, char *buf)
> 94ac7ee616809d Jean Delvare 2010-03-05 1687 {
> 94ac7ee616809d Jean Delvare 2010-03-05 1688 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
> 94ac7ee616809d Jean Delvare 2010-03-05 1689 struct it87_data *data = it87_update_device(dev);
> c962024e306ed5 Guenter Roeck 2015-04-04 1690 int nr = sensor_attr->index;
> 542f1e57c17849 benoit.masson 2025-12-26 @1691 u8 num_map = data->num_temp_map ?: IT87_TEMP_MAP_DEFAULT;
> ^^^^^^^^^^^^^^^^^^
> Unchecked dereference
>
> 94ac7ee616809d Jean Delvare 2010-03-05 1692 int map;
> 94ac7ee616809d Jean Delvare 2010-03-05 1693
> 0282ba4a4fe6c8 Frank Crawford 2023-04-16 @1694 if (IS_ERR(data))
> ^^^^
> Checked too late.
>
> 0282ba4a4fe6c8 Frank Crawford 2023-04-16 1695 return PTR_ERR(data);
> 0282ba4a4fe6c8 Frank Crawford 2023-04-16 1696
> 0624d861983c2c Guenter Roeck 2015-04-06 1697 map = data->pwm_temp_map[nr];
>
Hi Dan,
Indeed I’d move the num_map assignment below the IS_ERR(data)
Is proposing a new patch V2 below the right appraoch ?
Thanks
[PATCH v2] hwmon: it87: describe per-chip temperature resources
Signed-off-by: benoit.masson <yahoo@perenite.com>
---
drivers/hwmon/it87.c | 51 ++++++++++++++++++++++++++++++++++-----------
1 file changed, 38 insertions(+), 13 deletions(-)
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c
index e233aafa8856..f9eca0bc02bc 100644
--- a/drivers/hwmon/it87.c
+++ b/drivers/hwmon/it87.c
@@ -54,6 +54,7 @@
#include <linux/hwmon-vid.h>
#include <linux/err.h>
#include <linux/mutex.h>
+#include <linux/minmax.h>
#include <linux/sysfs.h>
#include <linux/string.h>
#include <linux/dmi.h>
@@ -279,8 +280,9 @@ static const u8 IT87_REG_AUTO_BASE[] = { 0x60,
0x68, 0x70, 0x78, 0xa0, 0xa8 };
#define NUM_VIN ARRAY_SIZE(IT87_REG_VIN)
#define NUM_VIN_LIMIT 8
#define NUM_TEMP 6
-#define NUM_TEMP_OFFSET ARRAY_SIZE(IT87_REG_TEMP_OFFSET)
-#define NUM_TEMP_LIMIT 3
+#define IT87_TEMP_OFFSET_MAX ARRAY_SIZE(IT87_REG_TEMP_OFFSET)
+#define IT87_TEMP_LIMIT_DEFAULT 3
+#define IT87_TEMP_MAP_DEFAULT 3
#define NUM_FAN ARRAY_SIZE(IT87_REG_FAN)
#define NUM_FAN_DIV 3
#define NUM_PWM ARRAY_SIZE(IT87_REG_PWM)
@@ -290,6 +292,9 @@ struct it87_devices {
const char *name;
const char * const model;
u32 features;
+ u8 num_temp_limit;
+ u8 num_temp_offset;
+ u8 num_temp_map;
u8 peci_mask;
u8 old_peci_mask;
u8 smbus_bitmap; /* SMBus enable bits in extra config register */
@@ -578,6 +583,9 @@ struct it87_data {
int sioaddr;
enum chips type;
u32 features;
+ u8 num_temp_limit;
+ u8 num_temp_offset;
+ u8 num_temp_map;
u8 peci_mask;
u8 old_peci_mask;
@@ -926,12 +934,13 @@ static struct it87_data
*it87_update_device(struct device *dev)
data->temp[i][0] =
it87_read_value(data, IT87_REG_TEMP(i));
- if (has_temp_offset(data) && i < NUM_TEMP_OFFSET)
+ if (has_temp_offset(data) &&
+ i < data->num_temp_offset)
data->temp[i][3] =
it87_read_value(data,
IT87_REG_TEMP_OFFSET[i]);
- if (i >= NUM_TEMP_LIMIT)
+ if (i >= data->num_temp_limit)
continue;
data->temp[i][1] =
@@ -1679,16 +1688,18 @@ static ssize_t show_pwm_temp_map(struct device *dev,
struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
struct it87_data *data = it87_update_device(dev);
int nr = sensor_attr->index;
+ u8 num_map;
int map;
if (IS_ERR(data))
return PTR_ERR(data);
+ num_map = data->num_temp_map ?: IT87_TEMP_MAP_DEFAULT;
map = data->pwm_temp_map[nr];
- if (map >= 3)
+ if (map >= num_map)
map = 0; /* Should never happen */
- if (nr >= 3) /* pwm channels 3..6 map to temp4..6 */
- map += 3;
+ if (nr >= num_map) /* pwm channels 3..6 map to temp4..6 */
+ map += num_map;
return sprintf(buf, "%d\n", (int)BIT(map));
}
@@ -1700,6 +1710,7 @@ static ssize_t set_pwm_temp_map(struct device *dev,
struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
struct it87_data *data = dev_get_drvdata(dev);
int nr = sensor_attr->index;
+ u8 num_map = data->num_temp_map ?: IT87_TEMP_MAP_DEFAULT;
long val;
int err;
u8 reg;
@@ -1707,8 +1718,8 @@ static ssize_t set_pwm_temp_map(struct device *dev,
if (kstrtol(buf, 10, &val) < 0)
return -EINVAL;
- if (nr >= 3)
- val -= 3;
+ if (nr >= num_map)
+ val -= num_map;
switch (val) {
case BIT(0):
@@ -3206,7 +3217,7 @@ static void it87_check_limit_regs(struct it87_data *data)
if (reg == 0xff)
it87_write_value(data, IT87_REG_VIN_MIN(i), 0);
}
- for (i = 0; i < NUM_TEMP_LIMIT; i++) {
+ for (i = 0; i < data->num_temp_limit; i++) {
reg = it87_read_value(data, IT87_REG_TEMP_HIGH(i));
if (reg == 0xff)
it87_write_value(data, IT87_REG_TEMP_HIGH(i), 127);
@@ -3399,6 +3410,7 @@ static int it87_probe(struct platform_device *pdev)
struct resource *res;
struct device *dev = &pdev->dev;
struct it87_sio_data *sio_data = dev_get_platdata(dev);
+ const struct it87_devices *chip;
int enable_pwm_interface;
struct device *hwmon_dev;
int err;
@@ -3421,9 +3433,21 @@ static int it87_probe(struct platform_device *pdev)
data->type = sio_data->type;
data->smbus_bitmap = sio_data->smbus_bitmap;
data->ec_special_config = sio_data->ec_special_config;
- data->features = it87_devices[sio_data->type].features;
- data->peci_mask = it87_devices[sio_data->type].peci_mask;
- data->old_peci_mask = it87_devices[sio_data->type].old_peci_mask;
+ chip = &it87_devices[sio_data->type];
+ data->features = chip->features;
+ data->peci_mask = chip->peci_mask;
+ data->old_peci_mask = chip->old_peci_mask;
+ data->num_temp_limit = chip->num_temp_limit ?
+ chip->num_temp_limit : IT87_TEMP_LIMIT_DEFAULT;
+ if (chip->num_temp_offset)
+ data->num_temp_offset = min(chip->num_temp_offset,
+ (u8)IT87_TEMP_OFFSET_MAX);
+ else if (has_temp_offset(data))
+ data->num_temp_offset = IT87_TEMP_OFFSET_MAX;
+ else
+ data->num_temp_offset = 0;
+ data->num_temp_map = chip->num_temp_map ?
+ chip->num_temp_map : IT87_TEMP_MAP_DEFAULT;
/*
* IT8705F Datasheet 0.4.1, 3h == Version G.
* IT8712F Datasheet 0.9.1, section 8.3.5 indicates 8h == Version J.
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] hwmon: it87: describe per-chip temperature resources
2026-01-07 19:18 ` Benoit Masson
@ 2026-01-07 19:43 ` Dan Carpenter
0 siblings, 0 replies; 8+ messages in thread
From: Dan Carpenter @ 2026-01-07 19:43 UTC (permalink / raw)
To: Benoit Masson
Cc: oe-kbuild, jdelvare, Guenter Roeck, lkp, oe-kbuild-all,
linux-hwmon, linux-kernel
On Wed, Jan 07, 2026 at 08:18:53PM +0100, Benoit Masson wrote:
> On Mon, Jan 5, 2026 at 11:10 AM Dan Carpenter <dan.carpenter@linaro.org> wrote:
> >
> > Hi benoit.masson,
> >
> > kernel test robot noticed the following build warnings:
> >
> > https://git-scm.com/docs/git-format-patch#_base_tree_information]
> >
> > url: https://github.com/intel-lab-lkp/linux/commits/benoit-masson/hwmon-it87-describe-per-chip-temperature-resources/20251227-043108
> > base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next
> > patch link: https://lore.kernel.org/r/20251226203021.27244-1-yahoo%40perenite.com
> > patch subject: [PATCH] hwmon: it87: describe per-chip temperature resources
> > config: x86_64-randconfig-161-20251229 (https://download.01.org/0day-ci/archive/20251230/202512300415.VRCQoZYs-lkp@intel.com/config)
> > compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
> >
> > If you fix the issue in a separate patch/commit (i.e. not just a new version of
> > the same patch/commit), kindly add following tags
> > | Reported-by: kernel test robot <lkp@intel.com>
> > | Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
> > | Closes: https://lore.kernel.org/r/202512300415.VRCQoZYs-lkp@intel.com/
> >
> > smatch warnings:
> > drivers/hwmon/it87.c:1694 show_pwm_temp_map() warn: variable dereferenced before IS_ERR check 'data' (see line 1691)
> >
> > vim +/data +1694 drivers/hwmon/it87.c
> >
> > 94ac7ee616809d Jean Delvare 2010-03-05 1685 static ssize_t show_pwm_temp_map(struct device *dev,
> > 94ac7ee616809d Jean Delvare 2010-03-05 1686 struct device_attribute *attr, char *buf)
> > 94ac7ee616809d Jean Delvare 2010-03-05 1687 {
> > 94ac7ee616809d Jean Delvare 2010-03-05 1688 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
> > 94ac7ee616809d Jean Delvare 2010-03-05 1689 struct it87_data *data = it87_update_device(dev);
> > c962024e306ed5 Guenter Roeck 2015-04-04 1690 int nr = sensor_attr->index;
> > 542f1e57c17849 benoit.masson 2025-12-26 @1691 u8 num_map = data->num_temp_map ?: IT87_TEMP_MAP_DEFAULT;
> > ^^^^^^^^^^^^^^^^^^
> > Unchecked dereference
> >
> > 94ac7ee616809d Jean Delvare 2010-03-05 1692 int map;
> > 94ac7ee616809d Jean Delvare 2010-03-05 1693
> > 0282ba4a4fe6c8 Frank Crawford 2023-04-16 @1694 if (IS_ERR(data))
> > ^^^^
> > Checked too late.
> >
> > 0282ba4a4fe6c8 Frank Crawford 2023-04-16 1695 return PTR_ERR(data);
> > 0282ba4a4fe6c8 Frank Crawford 2023-04-16 1696
> > 0624d861983c2c Guenter Roeck 2015-04-06 1697 map = data->pwm_temp_map[nr];
> >
>
> Hi Dan,
>
> Indeed I’d move the num_map assignment below the IS_ERR(data)
>
> Is proposing a new patch V2 below the right appraoch ?
This doesn't seem to have hit linux-next yet, so sending a v2 sounds
good.
regards,
dan carpenter
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-01-07 19:43 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-26 20:30 [PATCH] hwmon: it87: describe per-chip temperature resources benoit.masson
2025-12-26 20:54 ` Benoit Masson
2025-12-28 19:33 ` Guenter Roeck
2025-12-28 20:21 ` Benoit Masson
2025-12-29 15:36 ` Benoit Masson
2026-01-05 10:10 ` Dan Carpenter
2026-01-07 19:18 ` Benoit Masson
2026-01-07 19:43 ` Dan Carpenter
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox