From: Tomasz Bojanowski <tomasz@bojanowski.me>
To: Guenter Roeck <linux@roeck-us.net>
Cc: linux-hwmon@vger.kernel.org,
Hamza Mahfooz <someguy@effective-light.com>,
Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
Randy Dunlap <rdunlap@infradead.org>,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH 1/2] hwmon: (nct6683) Factor out the NCT6687D-R fan configuration transaction
Date: Mon, 9 Nov 2026 23:34:41 +0100 [thread overview]
Message-ID: <20261109223442.509238-2-tomasz@bojanowski.me> (raw)
In-Reply-To: <20261109223442.509238-1-tomasz@bojanowski.me>
Move the configuration phase and its retries out of
nct6683_fan_ctrl_update() into a helper which calls back for the
register writes, so that the next patch can use it for writing the fan
curves.
No functional change: the EC accesses and the returned errors are the
same.
Signed-off-by: Tomasz Bojanowski <tomasz@bojanowski.me>
---
drivers/hwmon/nct6683.c | 56 +++++++++++++++++++++++++++++++----------
1 file changed, 43 insertions(+), 13 deletions(-)
diff --git a/drivers/hwmon/nct6683.c b/drivers/hwmon/nct6683.c
index de5b0194c256..ce22f1e06600 100644
--- a/drivers/hwmon/nct6683.c
+++ b/drivers/hwmon/nct6683.c
@@ -1025,28 +1025,22 @@ static int nct6687dr_fan_cfg_finish(struct nct6683_data *data)
}
/*
- * Select manual or automatic mode for a fan channel and, if cmd is not
- * negative, set its duty cycle for manual mode.
+ * Change fan configuration registers in a configuration phase. fn() is
+ * called once per attempt, with the phase open.
*/
-static int nct6683_fan_ctrl_update(struct nct6683_data *data, int ch,
- bool manual, int cmd)
+static int
+nct6687dr_fan_cfg_transaction(struct nct6683_data *data,
+ void (*fn)(struct nct6683_data *data, void *ctx),
+ void *ctx)
{
- u16 mode_reg = nct6683_mode_reg(ch);
- u16 cmd_reg = nct6683_cmd_reg(ch);
- u8 mask = BIT(ch % 8);
int attempt, err;
- u8 mode;
for (attempt = 0; attempt < 3; attempt++) {
err = nct6687dr_fan_cfg_start(data);
if (err)
return err;
- mode = nct6683_read(data, mode_reg);
- if (cmd >= 0)
- nct6683_write(data, cmd_reg, cmd);
- nct6683_write(data, mode_reg,
- manual ? mode | mask : mode & ~mask);
+ fn(data, ctx);
/* Retry if the configuration phase was lost or rejected */
err = nct6687dr_fan_cfg_finish(data);
@@ -1057,6 +1051,42 @@ static int nct6683_fan_ctrl_update(struct nct6683_data *data, int ch,
return -EIO;
}
+struct nct6683_fan_ctrl {
+ int ch;
+ bool manual;
+ int cmd;
+};
+
+static void nct6683_fan_ctrl_write(struct nct6683_data *data, void *ctx)
+{
+ const struct nct6683_fan_ctrl *fc = ctx;
+ u16 mode_reg = nct6683_mode_reg(fc->ch);
+ u8 mask = BIT(fc->ch % 8);
+ u8 mode;
+
+ mode = nct6683_read(data, mode_reg);
+ if (fc->cmd >= 0)
+ nct6683_write(data, nct6683_cmd_reg(fc->ch), fc->cmd);
+ nct6683_write(data, mode_reg,
+ fc->manual ? mode | mask : mode & ~mask);
+}
+
+/*
+ * Select manual or automatic mode for a fan channel and, if cmd is not
+ * negative, set its duty cycle for manual mode.
+ */
+static int nct6683_fan_ctrl_update(struct nct6683_data *data, int ch,
+ bool manual, int cmd)
+{
+ struct nct6683_fan_ctrl fc = {
+ .ch = ch,
+ .manual = manual,
+ .cmd = cmd,
+ };
+
+ return nct6687dr_fan_cfg_transaction(data, nct6683_fan_ctrl_write, &fc);
+}
+
static int nct6683_set_pwm(struct nct6683_data *data, int ch, u8 val)
{
int err;
--
2.56.0
next prev parent reply other threads:[~2026-11-09 22:34 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-09 22:34 [PATCH 0/2] hwmon: (nct6683) Writable fan curves for NCT6687D-R Tomasz Bojanowski
2026-11-09 22:34 ` Tomasz Bojanowski [this message]
2026-11-14 16:02 ` [PATCH 1/2] hwmon: (nct6683) Factor out the NCT6687D-R fan configuration transaction Guenter Roeck
2026-11-09 22:34 ` [PATCH 2/2] hwmon: (nct6683) Make the fan curves of NCT6687D-R writable Tomasz Bojanowski
2026-11-14 16:03 ` Guenter Roeck
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=20261109223442.509238-2-tomasz@bojanowski.me \
--to=tomasz@bojanowski.me \
--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 \
--cc=skhan@linuxfoundation.org \
--cc=someguy@effective-light.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®