From nobody Sun Feb 8 08:27:48 2026 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 28411274658 for ; Fri, 26 Dec 2025 22:20:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766787606; cv=none; b=WYs42O9V+jP8ILax3b5FLpU2aYE3phrkF70Qo6KdDu/ggTe/7mgC8pZUj1lRc7V5R6EGSTT/NAsFtV53xV/LyICAsJGuUG8EVZJR8oddxXf4oRDuvOycHBWj16Cri2DM1c6g0OMtKMQeJmD24FosOP3+9WlI6EKiSwciFldYN4k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766787606; c=relaxed/simple; bh=uLXmu+Bz9vHtv4KmcPQFbu1wlU7Z7qZ1GKxfEIdc2TY=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=HDL8AHkpj+dken0Ex8ZEb9ssa/oB9Q+r8cCJxYrI74UQcp+juCxHHOkdCgKJw0gT1euVuSweGKZyeM0itMkpkUwrbKrImukRUz1S4wF482C9+sbn3AEvauVcvMBR6SDTmQZ5P49Bo03JO9QSvOhPQze1ZpbRnrGbTUMJ2DaUm0o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=perenite.com; spf=pass smtp.mailfrom=perenite.com; dkim=pass (2048-bit key) header.d=perenite-com.20230601.gappssmtp.com header.i=@perenite-com.20230601.gappssmtp.com header.b=qJxt8XNC; arc=none smtp.client-ip=209.85.128.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=perenite.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=perenite.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=perenite-com.20230601.gappssmtp.com header.i=@perenite-com.20230601.gappssmtp.com header.b="qJxt8XNC" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-47bdbc90dcaso47481515e9.1 for ; Fri, 26 Dec 2025 14:20:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=perenite-com.20230601.gappssmtp.com; s=20230601; t=1766787602; x=1767392402; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=A8NVY+5EI1kKLr7cLyAGHn3PAbDsBLYNdL+yfvbhJFY=; b=qJxt8XNC3D2F3w5BC0w3zhg5HUhIvYRu6L1vmNQpgX/3bgacOIFlNs6FvEe/KFNsXS suWJznbykRXnnkEoRNM2T5c6+as9J1XnmUlNr8CxtPls0tcm1tjKw9tALortlM/gaReM UOX3gRLRt46mgPcfGfnsPq16bfmpesvbXUxV4obcyqyG1ELOQlZFOR5/WOLye8hhD1I+ XteqP7TdTbCGaFxWYDtgJ/RyUglYbDpXpIZzYphK/l3jJk+X2FU0pblsk0I9YnWhZebn TC6w+TDv0e/aBRoOkSbo7pB/QiXwdjc8P3Qtd4pp6l7cbntGl7j+dzIB+srTXW+ZNL50 Hs2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766787602; x=1767392402; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=A8NVY+5EI1kKLr7cLyAGHn3PAbDsBLYNdL+yfvbhJFY=; b=AB1YGfrYE6+pi8Ktr9PVQNqj4bBbBn6OFI6eTH5bL1+g6EwlcJawjFtB6/rvArxk66 52+xKlb96sfYPKeK7X4SxHqVxvaoe6Sbirv1DcAhJ1WA32TyboBMf8mssWKY0yHgK1y1 YE+2GqFoSLQFY03s3ERcy6fwz84RQRnDbdWmT8y6Embw/aWxQctCJx4t+1IMQXaJ+ACs iD8v28catFJ9gl4+aG7D0hGByHgHODuCVGrCJjuQkwxXn3oHwGLFPXdssmEA9hhBuCTe Edxee4BF4ndgNY8ApKBmfR2rvyVAvc4kSfyG3rYdF4qKD0IK4PeeqEJusELAnks/CDjZ GFAg== X-Forwarded-Encrypted: i=1; AJvYcCXazMnRsJ9uO/2B2mUqXGpShc3+MKq9ZLTnWJf3Sy4JQY1Re266WmTxIbXc7AqIe8xLNTzIJinBfIQ6a/k=@vger.kernel.org X-Gm-Message-State: AOJu0Yz3m14/hREwS2UaVKustkYjWlRekCrLo0ICjKI9nWsfoG+BZ+ki h7PIwaspSbqTp2qZVOuGVRmFZm7CT6A9dTrGBcc7++ui2pEvzrSHaLga6IQwnhWcEiFoUQ3xWcH ZQTE= X-Gm-Gg: AY/fxX4pfJ8DfOzeTthmVsR9ENvq1qSlwSar/WE0EdBXx82BWN1Z9u8OV+VMto0CrTP mdva4UlDwA96CRqbODy5+c5it5A5+fUn2T8FfPhjxV9N91cnLUvCHsviT578/8I2A5olKvQwnZ5 OLZKn9KL3l8ZztNMRZcMDl4u8ZYjfZ6KkovS3lfZIKBo0S+0nmkrzqDlig7EqiX60oNVPbSK19I o10M+ewZYGJrZk7boq1Vhse3FPY59V/rdP6Fi+/6nlrlQSASasxcs9RbCHf1TpEDWg6cJx7kuJm 5QiSaItm+PbdokEqMPWjGtjZ8YdMOTBSrsJ7eUfdqyxAgmgn49R7edclzrv8ZYqP1eus4Bal9Vr 0l90DvzNuXJGmq9gc90rDlRI89NWCS8YbTE7/hjWLOc4ClGcl+zeFggg5+C/FlbH+WM36DXlNOJ jMdAonPBTKgHCYxdXrvfnihz28pk+l X-Google-Smtp-Source: AGHT+IFAoRtZWg9y9OwSHRs1BbVxiTBqizdeW2Wsay8CteURMJUw/v+E8EPEtwdfIO9Exr+/Fdm/Tg== X-Received: by 2002:a05:600c:c494:b0:479:35e7:a0e3 with SMTP id 5b1f17b1804b1-47d19582aacmr270256265e9.30.1766787602418; Fri, 26 Dec 2025 14:20:02 -0800 (PST) Received: from mac.net ([2001:861:8b92:2c50:e0be:8639:3d60:4c9f]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-47be273f147sm472599915e9.7.2025.12.26.14.20.01 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 26 Dec 2025 14:20:02 -0800 (PST) From: "benoit.masson" To: jdelvare@suse.com, linux@roeck-us.net Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, "benoit.masson" Subject: [PATCH] hwmon: it87: expose additional temperature limits Date: Fri, 26 Dec 2025 23:20:01 +0100 Message-ID: <20251226222001.41914-1-yahoo@perenite.com> X-Mailer: git-send-email 2.50.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: benoit.masson --- drivers/hwmon/it87.c | 91 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 76 insertions(+), 15 deletions(-) diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index 1107039d2b6a..d50c40f8607f 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c @@ -246,7 +246,9 @@ static const u8 IT87_REG_FAN[] =3D { 0x0d, 0x0e= , 0x0f, 0x80, 0x82, 0x4c }; static const u8 IT87_REG_FAN_MIN[] =3D { 0x10, 0x11, 0x12, 0x84, 0x86,= 0x4e }; static const u8 IT87_REG_FANX[] =3D { 0x18, 0x19, 0x1a, 0x81, 0x83,= 0x4d }; static const u8 IT87_REG_FANX_MIN[] =3D { 0x1b, 0x1c, 0x1d, 0x85, 0x87,= 0x4f }; -static const u8 IT87_REG_TEMP_OFFSET[] =3D { 0x56, 0x57, 0x59 }; +static const u8 IT87_REG_TEMP_OFFSET[] =3D { 0x56, 0x57, 0x59, 0x5a, 0x90,= 0x91 }; +static const u8 IT87_REG_TEMP_OFFSET_8686[] =3D + { 0x56, 0x57, 0x59, 0x90, 0x91, 0x92 }; =20 #define IT87_REG_FAN_MAIN_CTRL 0x13 #define IT87_REG_FAN_CTL 0x14 @@ -260,8 +262,12 @@ static const u8 IT87_REG_VIN[] =3D { 0x20, 0x21, 0x22,= 0x23, 0x24, 0x25, 0x26, =20 #define IT87_REG_VIN_MAX(nr) (0x30 + (nr) * 2) #define IT87_REG_VIN_MIN(nr) (0x31 + (nr) * 2) -#define IT87_REG_TEMP_HIGH(nr) (0x40 + (nr) * 2) -#define IT87_REG_TEMP_LOW(nr) (0x41 + (nr) * 2) +static const u8 IT87_REG_TEMP_HIGH[] =3D { 0x40, 0x42, 0x44, 0x46, 0xb4,= 0xb6 }; +static const u8 IT87_REG_TEMP_HIGH_8686[] =3D + { 0x40, 0x42, 0x44, 0xb4, 0xb6, 0xb8 }; +static const u8 IT87_REG_TEMP_LOW[] =3D { 0x41, 0x43, 0x45, 0x47, 0xb5,= 0xb7 }; +static const u8 IT87_REG_TEMP_LOW_8686[] =3D + { 0x41, 0x43, 0x45, 0xb5, 0xb7, 0xb9 }; =20 #define IT87_REG_VIN_ENABLE 0x50 #define IT87_REG_TEMP_ENABLE 0x51 @@ -610,6 +616,9 @@ struct it87_data { u16 fan[NUM_FAN][2]; /* Register values, [nr][0]=3Dfan, [1]=3Dmin */ u8 has_temp; /* Bitfield, temp sensors enabled */ s8 temp[NUM_TEMP][4]; /* [nr][0]=3Dtemp, [1]=3Dmin, [2]=3Dmax, [3]=3Doffs= et */ + const u8 *reg_temp_low; + const u8 *reg_temp_high; + const u8 *reg_temp_offset; u8 sensor; /* Register value (IT87_REG_TEMP_ENABLE) */ u8 extra; /* Register value (IT87_REG_TEMP_EXTRA) */ u8 fan_div[NUM_FAN_DIV];/* Register encoding, shifted right */ @@ -1011,15 +1020,15 @@ static struct it87_data *it87_update_device(struct = device *dev) i < data->num_temp_offset) data->temp[i][3] =3D it87_read_value(data, - IT87_REG_TEMP_OFFSET[i]); + data->reg_temp_offset[i]); =20 if (i >=3D data->num_temp_limit) continue; =20 data->temp[i][1] =3D - it87_read_value(data, IT87_REG_TEMP_LOW(i)); + it87_read_value(data, data->reg_temp_low[i]); data->temp[i][2] =3D - it87_read_value(data, IT87_REG_TEMP_HIGH(i)); + it87_read_value(data, data->reg_temp_high[i]); } =20 /* Newer chips don't have clock dividers */ @@ -1199,10 +1208,10 @@ static ssize_t set_temp(struct device *dev, struct = device_attribute *attr, switch (index) { default: case 1: - reg =3D IT87_REG_TEMP_LOW(nr); + reg =3D data->reg_temp_low[nr]; break; case 2: - reg =3D IT87_REG_TEMP_HIGH(nr); + reg =3D data->reg_temp_high[nr]; break; case 3: regval =3D it87_read_value(data, IT87_REG_BEEP_ENABLE); @@ -1211,7 +1220,7 @@ static ssize_t set_temp(struct device *dev, struct de= vice_attribute *attr, it87_write_value(data, IT87_REG_BEEP_ENABLE, regval); } data->valid =3D false; - reg =3D IT87_REG_TEMP_OFFSET[nr]; + reg =3D data->reg_temp_offset[nr]; break; } =20 @@ -1243,8 +1252,26 @@ static SENSOR_DEVICE_ATTR_2(temp3_max, S_IRUGO | S_I= WUSR, show_temp, set_temp, static SENSOR_DEVICE_ATTR_2(temp3_offset, S_IRUGO | S_IWUSR, show_temp, set_temp, 2, 3); static SENSOR_DEVICE_ATTR_2(temp4_input, S_IRUGO, show_temp, NULL, 3, 0); +static SENSOR_DEVICE_ATTR_2(temp4_min, S_IRUGO | S_IWUSR, show_temp, set_t= emp, + 3, 1); +static SENSOR_DEVICE_ATTR_2(temp4_max, S_IRUGO | S_IWUSR, show_temp, set_t= emp, + 3, 2); +static SENSOR_DEVICE_ATTR_2(temp4_offset, S_IRUGO | S_IWUSR, show_temp, + set_temp, 3, 3); static SENSOR_DEVICE_ATTR_2(temp5_input, S_IRUGO, show_temp, NULL, 4, 0); +static SENSOR_DEVICE_ATTR_2(temp5_min, S_IRUGO | S_IWUSR, show_temp, set_t= emp, + 4, 1); +static SENSOR_DEVICE_ATTR_2(temp5_max, S_IRUGO | S_IWUSR, show_temp, set_t= emp, + 4, 2); +static SENSOR_DEVICE_ATTR_2(temp5_offset, S_IRUGO | S_IWUSR, show_temp, + set_temp, 4, 3); static SENSOR_DEVICE_ATTR_2(temp6_input, S_IRUGO, show_temp, NULL, 5, 0); +static SENSOR_DEVICE_ATTR_2(temp6_min, S_IRUGO | S_IWUSR, show_temp, set_t= emp, + 5, 1); +static SENSOR_DEVICE_ATTR_2(temp6_max, S_IRUGO | S_IWUSR, show_temp, set_t= emp, + 5, 2); +static SENSOR_DEVICE_ATTR_2(temp6_offset, S_IRUGO | S_IWUSR, show_temp, + set_temp, 5, 3); =20 static int get_temp_type(struct it87_data *data, int index) { @@ -2415,24 +2442,46 @@ static umode_t it87_temp_is_visible(struct kobject = *kobj, { struct device *dev =3D kobj_to_dev(kobj); struct it87_data *data =3D dev_get_drvdata(dev); - int i =3D index / 7; /* temperature index */ - int a =3D index % 7; /* attribute index */ + int i, a; =20 - if (index >=3D 21) { + if (index < 21) { + i =3D index / 7; /* temperature index */ + a =3D index % 7; /* attribute index */ + } else if (index < 24) { i =3D index - 21 + 3; a =3D 0; + } else { + int off =3D index - 24; + + i =3D 3 + off / 3; + switch (off % 3) { + case 0: + a =3D 1; + break; + case 1: + a =3D 2; + break; + default: + a =3D 5; + break; + } } =20 if (!(data->has_temp & BIT(i))) return 0; =20 + if ((a =3D=3D 1 || a =3D=3D 2 || a =3D=3D 4) && + i >=3D data->num_temp_limit) + return 0; + if (a =3D=3D 3) { if (get_temp_type(data, i) =3D=3D 0) return 0; return attr->mode; } =20 - if (a =3D=3D 5 && !has_temp_offset(data)) + if (a =3D=3D 5 && + (!has_temp_offset(data) || i >=3D data->num_temp_offset)) return 0; =20 if (a =3D=3D 6 && !data->has_beep) @@ -2467,8 +2516,17 @@ static struct attribute *it87_attributes_temp[] =3D { &sensor_dev_attr_temp3_beep.dev_attr.attr, =20 &sensor_dev_attr_temp4_input.dev_attr.attr, /* 21 */ + &sensor_dev_attr_temp4_max.dev_attr.attr, + &sensor_dev_attr_temp4_min.dev_attr.attr, + &sensor_dev_attr_temp4_offset.dev_attr.attr, &sensor_dev_attr_temp5_input.dev_attr.attr, + &sensor_dev_attr_temp5_max.dev_attr.attr, + &sensor_dev_attr_temp5_min.dev_attr.attr, + &sensor_dev_attr_temp5_offset.dev_attr.attr, &sensor_dev_attr_temp6_input.dev_attr.attr, + &sensor_dev_attr_temp6_max.dev_attr.attr, + &sensor_dev_attr_temp6_min.dev_attr.attr, + &sensor_dev_attr_temp6_offset.dev_attr.attr, NULL }; =20 @@ -3277,9 +3335,9 @@ static void it87_check_limit_regs(struct it87_data *d= ata) it87_write_value(data, IT87_REG_VIN_MIN(i), 0); } for (i =3D 0; i < data->num_temp_limit; i++) { - reg =3D it87_read_value(data, IT87_REG_TEMP_HIGH(i)); + reg =3D it87_read_value(data, data->reg_temp_high[i]); if (reg =3D=3D 0xff) - it87_write_value(data, IT87_REG_TEMP_HIGH(i), 127); + it87_write_value(data, data->reg_temp_high[i], 127); } } =20 @@ -3514,6 +3572,9 @@ static int it87_probe(struct platform_device *pdev) data->num_temp_offset =3D 0; data->num_temp_map =3D chip->num_temp_map ? chip->num_temp_map : IT87_TEMP_MAP_DEFAULT; + data->reg_temp_low =3D IT87_REG_TEMP_LOW; + data->reg_temp_high =3D IT87_REG_TEMP_HIGH; + data->reg_temp_offset =3D IT87_REG_TEMP_OFFSET; if (has_new_tempmap(data)) { data->pwm_temp_map_mask =3D 0x07; data->pwm_temp_map_shift =3D 3; --=20 2.50.1 (Apple Git-155)