From: Hamza Mahfooz <someguy@effective-light.com>
To: linux-hwmon@vger.kernel.org
Cc: Guenter Roeck <linux@roeck-us.net>,
Jonathan Corbet <corbet@lwn.net>,
Randy Dunlap <rdunlap@infradead.org>,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
Hamza Mahfooz <someguy@effective-light.com>
Subject: [PATCH 1/2] hwmon: (nct6683) Report the duty cycle of NCT6687D-R system fans
Date: Sun, 4 Oct 2026 11:32:49 -0400 [thread overview]
Message-ID: <20261004153250.516730-2-someguy@effective-light.com> (raw)
In-Reply-To: <20261004153250.516730-1-someguy@effective-light.com>
Recent MSI boards (customer ID 0x20d) use an NCT6687D-R. Its system fans
are connected to channels 10-15, which have no fan output configuration
register, so their duty cycle is not reported.
According to a reverse engineered register map, the duty cycle of these
channels is reported in register (0xe00 + channel - 10). Report it for the
system fans that are present, so that pwmN matches fanN. To do so,
support up to 16 pwm channels, indexed by fan channel.
Signed-off-by: Hamza Mahfooz <someguy@effective-light.com>
---
drivers/hwmon/nct6683.c | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/drivers/hwmon/nct6683.c b/drivers/hwmon/nct6683.c
index e1c36c95a..a43e23c65 100644
--- a/drivers/hwmon/nct6683.c
+++ b/drivers/hwmon/nct6683.c
@@ -22,6 +22,7 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/acpi.h>
+#include <linux/bits.h>
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/init.h>
@@ -169,6 +170,8 @@ superio_exit(int ioreg)
#define NCT6683_FAN_CFG_REQ 0x80
#define NCT6683_FAN_CFG_DONE 0x40
+#define NCT6687DR_REG_PWM_SYS(x) (0xe00 + (x) - 10) /* channels 10-15 */
+
#define NCT6683_REG_CUSTOMER_ID 0x602
#define NCT6683_CUSTOMER_ID_INTEL 0x805
#define NCT6683_CUSTOMER_ID_MITAC 0xa0e
@@ -341,8 +344,8 @@ struct nct6683_data {
u8 fanout_cfg[NCT6683_NUM_REG_FAN];
u16 have_fan; /* some fan inputs can be disabled */
- u8 have_pwm;
- u8 pwm[NCT6683_NUM_REG_PWM];
+ u16 have_pwm;
+ u8 pwm[NCT6683_NUM_REG_FAN]; /* indexed by fan channel */
#ifdef CONFIG_PM
/* Remember extra register values over suspend/resume */
@@ -588,15 +591,21 @@ static int get_temp_reg(struct nct6683_data *data, int nr, int index)
return reg;
}
+/* Channels 8-15 are only used on NCT6687D-R */
+static u16 nct6683_pwm_reg(int ch)
+{
+ return ch < 8 ? NCT6683_REG_PWM(ch) : NCT6687DR_REG_PWM_SYS(ch);
+}
+
static void nct6683_update_pwm(struct device *dev)
{
struct nct6683_data *data = dev_get_drvdata(dev);
int i;
- for (i = 0; i < NCT6683_NUM_REG_PWM; i++) {
+ for (i = 0; i < ARRAY_SIZE(data->pwm); i++) {
if (!(data->have_pwm & (1 << i)))
continue;
- data->pwm[i] = nct6683_read(data, NCT6683_REG_PWM(i));
+ data->pwm[i] = nct6683_read(data, nct6683_pwm_reg(i));
}
}
@@ -1149,6 +1158,15 @@ nct6683_setup_fans(struct nct6683_data *data)
data->have_pwm |= 1 << i;
data->fanout_cfg[i] = reg;
}
+
+ if (data->kind == nct6687 &&
+ data->customer_id == NCT6683_CUSTOMER_ID_MSI4) {
+ /*
+ * The system fan channels (10-15) have no fan output
+ * configuration register, so check their fan input instead.
+ */
+ data->have_pwm |= data->have_fan & GENMASK(15, 10);
+ }
}
/*
--
2.56.0
next prev parent reply other threads:[~2026-10-04 15:34 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-04 15:32 [PATCH 0/2] hwmon: (nct6683) Add fan control support for MSI boards with NCT6687D-R Hamza Mahfooz
2026-10-04 15:32 ` Hamza Mahfooz [this message]
2026-10-04 15:54 ` [PATCH 1/2] hwmon: (nct6683) Report the duty cycle of NCT6687D-R system fans sashiko-bot
2026-10-04 15:32 ` [PATCH 2/2] hwmon: (nct6683) Add fan control support for MSI boards with NCT6687D-R Hamza Mahfooz
2026-10-04 15:48 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261004153250.516730-2-someguy@effective-light.com \
--to=someguy@effective-light.com \
--cc=corbet@lwn.net \
--cc=linux-doc@vger.kernel.org \
--cc=linux-hwmon@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=rdunlap@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.