From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ej1-f43.google.com (mail-ej1-f43.google.com [209.85.218.43]) (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 6871B3F0770 for ; Tue, 25 Aug 2026 09:25:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.43 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787649959; cv=none; b=WARgxpe07MlbDrFD9FOZKaO5zJQcPyclmWylmbed76MTnVXr87UJxG7OfpjCDR/2h9VDABqzTHHpsszGbwrY68ZjoHEiOoemD5h/zGsxa86IahH3mHkb6scTBZFUg+IWU4MOwdVlEkbJBSY53YPYKq2B4IfVMzVLujnW41kadFc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787649959; c=relaxed/simple; bh=l76oCLpiCkP1+fv2wQD3Bwww2nvMdP8ddihNpJ7IhJc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r+DDnAdt43bi3x5TLZrNguvjiQvbY3hcpf7yXbdZCFL3t6w5zv9rqB25lfMM4X3hWCUbJakqeQvfgONg6YVkEM0yCg+JRmYTtHbkRtONfRyWk6TX3mafhcZS+W7iXlQO+wBGg1sleK/CnMs8xwhRc2dOd+zZPko/GEamhYbyv6k= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=C608NQAP; arc=none smtp.client-ip=209.85.218.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="C608NQAP" Received: by mail-ej1-f43.google.com with SMTP id a640c23a62f3a-c20e70a0962so684064766b.2 for ; Tue, 25 Aug 2026 02:25:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787649956; x=1788254756; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=WmqhkbstVUIAv6coMLpxvuSdMjsljUC7sCwH3KLVIHQ=; b=C608NQAPpsG6CnsVQnrIxgNLkrYlDwVqGAKujI7sO3Jxqaek/Bl6+qG0UTAuhv9EhS ubkZyRGWOqeB2HjNcljiSszo3KwtkWZu3CRyep7kPiBpYdu4Q1iSzdJ3ROHXuBKM8rTD LZIEJheDtIw+q8ONPn/ejMsvK2h+elcna/Fnu6RtQ342NrjlRiDlgOLwH37QFs/J86py tj8kulgGk1vtQoByXwhI4jyTKvxWa1wyO36b2+uV+GXqtpY3GrdvXDVfdU4Z4ywrnvtP mVEozZTftDWuF1w2PjkD5Z75W6Z8NDJHrX5pJa9glP7UVmWrIhKO7lmYPdEEUj5ggoBR 0gPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787649956; x=1788254756; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=WmqhkbstVUIAv6coMLpxvuSdMjsljUC7sCwH3KLVIHQ=; b=TCXusmfMsOmDpEc7GY6zIY1sI+OJHkYNcMle9dR4SLavHV9AyBcuCNYJb3G61dylNc bRbYSw0zz49pcdMilSlfD02gmuCSsV47otTRAw//MmtqVVzsUMf6G6haaHXfbHSjIqg5 VWREovqM/JuzVDjGo396oARxwTEm11/lONh3Ul6ODNOCyyntcGVWlVxvZs1uPAiHwDEI miwtjzTOmOpAfZWcDyaxHmtu9SUZ0dR0+gigUoiVTtWthyV/XjKuUMfLgCgV8B5/hhO7 y+8Uj8dmGXCKg4zc6m2SWfqvyKble9gWlUNUvOAkU1EWJrnBRgI+KN1/lekljV0ertu6 rP2Q== X-Forwarded-Encrypted: i=1; AHgh+RqXw/MeJ9fbFdd/IbEnsHURVlOhtMp9SY251tN3eISPCFajym7FUY2g+3ivtoWTKrXqoOdD1H64MLFGcT0=@vger.kernel.org X-Gm-Message-State: AFuF++kp/p/3gM+TErGqYN83jTDx+0mnIZ3EzehhcfvppTQgvrBpKbff AR/N6+D5UBB5bwwKyFpKAy9nl3Oy2vZH35FgJzTwlkJ75jHUJK28G6Fi X-Gm-Gg: AR+sD12Vt587LDlDtsuzG31A2ClRHF8+M7nQ2qB1md3EtN6Npw2j01cEodYdvdBELb0 tEQe5rrGqFbLZl6gRb+DBKxH9B++hkg8Syp2OgFPGjgbwjI3Ybq3S3uklX/wtkXfhMuGbE/fCWs lZkaKJughjKw+TGlnT6qzhlxnk7fwjPIzLIl+mUmoSefkMear+odweYVSz1plywMReJNBLkRYQ2 CH+qG+cpt7Uv4lwaqjJj8p0XqGiJ4VsPqI0IDuSAc0HTOWJbnUFYgCqWfQltgmz9zV3eBZRf7b6 xCEll2W0wUxezm/sPmu+GErNw2TLG4foz2OXxlo8CLNHbCc211vtrQ20SNqWXJGNZiSL3Oxt7tM 6ZKWQcPJVG97Bcv0NB1JBU8StXR05XOK3tSA5TkrivPgR3ikU/0nrhuN9t7k4xMHLEsjPgKtLlH x4f25hKfU7GYH0S4qGHTctYXBgDrEPGTZUVPeNmBKlanoIVc17IJ6j2c3RYZP3yNaijfLqDQzS0 Ff6/gZMg2P/1uRpTKrRofdFFxqfzaa7qlGFFkNyXS8bYj2E4lQGzRpWatRZzdTAbTV3fB72Jlmd wqRqxsA8bmEoXzlJQZwUBYc= X-Received: by 2002:a17:906:fe48:b0:c15:fc59:cdf3 with SMTP id a640c23a62f3a-c24b3ebee48mr2064957566b.12.1787649955545; Tue, 25 Aug 2026 02:25:55 -0700 (PDT) Received: from fractal.tuxedo-gray.ts.net (c-78-82-25-228.bbcust.telenor.se. [78.82.25.228]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c249606bd05sm1612570866b.2.2026.08.25.02.25.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 02:25:55 -0700 (PDT) From: Johan Dahlin To: Guenter Roeck Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Dahlin Subject: [PATCH 1/5] hwmon: (nct6683) Retry pwm writes until they take effect Date: Tue, 25 Aug 2026 11:25:42 +0200 Message-ID: <20260825092546.669450-2-jdahlin@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260825092546.669450-1-jdahlin@gmail.com> References: <20260825092546.669450-1-jdahlin@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit store_pwm() waits a fixed 1-2 ms for the EC to hand over the fan configuration registers before writing. That delay dates back to commit 91918d13eb17 ("hwmon: (nct6683) Add basic support for NCT6683 on Mitac boards") and, pwm being read-only elsewhere, has never been exercised against other firmware. It is too short for at least one of them: on an ASRock B850 Steel Legend WiFi (NCT6686D), two of six consecutive pwm writes were silently discarded, leaving the fan on its previous setting. Read the value back and repeat the sequence when it did not stick, waiting longer each time and reporting -EIO if it never does. Raising the delay for everyone would penalise boards that work today, while a write that succeeds first time issues the same register sequence as before. Signed-off-by: Johan Dahlin --- drivers/hwmon/nct6683.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/drivers/hwmon/nct6683.c b/drivers/hwmon/nct6683.c index e1c36c95affb..b524a45b1471 100644 --- a/drivers/hwmon/nct6683.c +++ b/drivers/hwmon/nct6683.c @@ -934,18 +934,29 @@ store_pwm(struct device *dev, struct device_attribute *attr, const char *buf, struct nct6683_data *data = dev_get_drvdata(dev); int index = sattr->index; unsigned long val; + int tries; if (kstrtoul(buf, 10, &val) || val > 255) return -EINVAL; + /* + * The EC does not always release the fan configuration registers + * within the settling delay, and a write issued before it does is + * silently discarded. Repeat the sequence until the value sticks. + */ mutex_lock(&data->update_lock); - nct6683_write(data, NCT6683_REG_FAN_CFG_CTRL, NCT6683_FAN_CFG_REQ); - usleep_range(1000, 2000); - nct6683_write(data, NCT6683_REG_PWM_WRITE(index), val); - nct6683_write(data, NCT6683_REG_FAN_CFG_CTRL, NCT6683_FAN_CFG_DONE); + for (tries = 0; tries < 3; tries++) { + nct6683_write(data, NCT6683_REG_FAN_CFG_CTRL, NCT6683_FAN_CFG_REQ); + /* A failed attempt means the EC needed longer than we waited */ + usleep_range(1000 * (tries + 1), 2000 * (tries + 1)); + nct6683_write(data, NCT6683_REG_PWM_WRITE(index), val); + nct6683_write(data, NCT6683_REG_FAN_CFG_CTRL, NCT6683_FAN_CFG_DONE); + if (nct6683_read(data, NCT6683_REG_PWM_WRITE(index)) == val) + break; + } mutex_unlock(&data->update_lock); - return count; + return tries == 3 ? -EIO : count; } SENSOR_TEMPLATE(pwm, "pwm%d", S_IRUGO, show_pwm, store_pwm, 0); -- 2.53.0