From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ej1-f42.google.com (mail-ej1-f42.google.com [209.85.218.42]) (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 23AE03EFFD7 for ; Tue, 25 Aug 2026 09:25:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.42 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787649962; cv=none; b=gLRGp2A4/cT9Pr2yAaTs32lIrQzKyXyw1dBn4o5XhBN4CaD0ZMP+PAbDp8ArbeP+J5cWY3UNs3U+PzUj+aRomjf0Wvu/pZiBuCwlP1J2o6pzYXc1gPuWFx3JNbp8WsmPHg+mdNhXkxXeCo9aOD2PyQVYh5Ph+2n6kV5jV2CLDRg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787649962; c=relaxed/simple; bh=VYkgLWCJeyiEauXzcozuHqKvw+ZR7o179+bK3zgGtWA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cSCrngFh1kr1WWmNPd9aqP28Vcf4tNvqcQ0pPvMiWpciZJ5Hl1KOw7bSPBscMJtkIXljaUye/JWM1NyVdWIjlC5ntaw794q/qS+nq268N2O+pKc0xp/VaA5zRmo5Nee8v0996gXdThstwluwTOwyIQ2gMSYWX595lNLxAW+kl2I= 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=k6Ajig3x; arc=none smtp.client-ip=209.85.218.42 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="k6Ajig3x" Received: by mail-ej1-f42.google.com with SMTP id a640c23a62f3a-c15e592da74so625987166b.1 for ; Tue, 25 Aug 2026 02:25:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787649958; x=1788254758; 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=dFXySYEtb7Jp90OKqpFBc5Jr23ETazFykOiMX2/lKCk=; b=k6Ajig3xYw+3nqKdjMcaFu3ApIojc7JYmyYV4mLvog4umM7OdYbt9deju5+0nkXLYe NCXghhXo0TIkqqIjM3yTGhmZccDwUCo7+68LWohfc9S9k3UiApkz+R+BXHEMOz04f3XO WGGUYH2g3VX1qXlE12T5gVNO10C/M1r9iQSMJM1X/xPzjgfKGsfYK9wyfrEXQVrCz2Jk O9JLZaH/laTXdLm/JVtD/cLOrWANDQj0GU9ygfb9Oup6nrcJtvWdtFtLh3D/mKLNHZke 1p7nMyY6cpRuBDRAEwrfTO4Hn0I/mRQrmYP++AfPQ0I1KlhNIB3svlUXjhy8dvl7TuKi 4lbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787649958; x=1788254758; 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=dFXySYEtb7Jp90OKqpFBc5Jr23ETazFykOiMX2/lKCk=; b=moqhWRIVmkA5X5XPJ3kXC5jV194Us2iBkbljQ0gAU3OHgkcjitZFLNdHxCsWQPJJ42 5GqfizjDRvdvK2359TgTPATqEy3gfDEdKp/xdL8i86Q/7FvG+iL1wctPDWzSoREUl4CK 4mjJ8/Wyxvp5bw//VnNtUpvfDU6W5hYv8Md+y8D00qT0ouX93JVAoZRdoRqOwXMDm+Ch 2WNnB7Nu4fNHNHlUxRCvv3rCxaVx5S+HtD5z/PBGg2H280/YUTWPtc+YauA7mNUxZ6Tt y4skinzWdKrXvDd+K8nnEU5rRB3aSHdgpP8B3uSD8gY/y2GuArKsH5G+tLEB9Ukj/LZa EtqQ== X-Forwarded-Encrypted: i=1; AHgh+RpEopRx0bXrHlE4Bbi0a8fAWPW4zsU7fkqLxfjkHYi6bjY90jlc0k+DpSw2qplAiz2N8jKUYCPEgM4kXeo=@vger.kernel.org X-Gm-Message-State: AFuF++kVfSixLV6VsbayaYpcLh82SQ6H57Yf8/JsDIIqb4drYqQr7plD HfUtUGK/YYxnE4a955hEuaNBPmAIJUoBdU4co1kuixsiwEAvgaNvLSjV X-Gm-Gg: AR+sD10LYrUuOgY4cwwlD9xLHSizTpNLOyrcpRf+z5h7sn5u1KCjjT6s0KQEtzkZR3N w9VGxjefbPT6TMDTfONADoCk4461f7wyRuLbcUXupJXbbdHidDxwSdaEoZeJtCBnUyAsM5jlVcK aoyCcU4+eBuzvhhHirlrRm2YXDUIO4Kv/7zDO8+8nDDSX2a55Mg+RIGsVK4gs1Ap+cIkB6pYtAy oCWFuNMNY7jboIumw0w9Ifei+66sUI/3JLCOQ02fCujAe4ny8lS5ZyXSoDacL6QA6yJgQK1Q1Vg Mm6v4gQkoWKKrn6tcDfvAsIzh9sZ9T6sjY+GCGNpBFSFnZFT5ZGT7n9P9boaNsMKHH9Cmu+kBTN hv367IgIhjaYZQzfOHlqT36Gs6FrkiGqMMW/hGL6DiT1L+JzcJDZL3yalKIyM00KCWR2Xgw8mbW FKbb0f5ZiBuQ5l1ygykkM7oGL499qIBllG7M8OWi+MiGQB5lL8kJIFH/LUX4bZEaTCzG12tMQqO Gfd4y6RVySLl9dH1UG29bMr7oa6w+4Z4zg4cryAr9DxxZAO0u5KXVvdLW7yY3XtfLRHg9zdVZbC 8ROCoZE7UhC98B558DibZjFLK5Jd X-Received: by 2002:a17:906:f59b:b0:c20:7cb1:9046 with SMTP id a640c23a62f3a-c24924b7508mr2666855366b.8.1787649957973; Tue, 25 Aug 2026 02:25:57 -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.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 02:25:57 -0700 (PDT) From: Johan Dahlin To: Guenter Roeck Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Dahlin Subject: [PATCH 4/5] hwmon: (nct6683) Restore fan control mode on driver removal Date: Tue, 25 Aug 2026 11:25:45 +0200 Message-ID: <20260825092546.669450-5-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 A fan switched to manual mode stays there when the driver is unloaded, leaving it pinned at whatever pwm value was last written with nothing left to update it. Record the fan control mode register during probe and put it back with a devres action, so the EC resumes control of the fans the driver took over while anything the firmware had already set is left alone. The action is registered before the hwmon device, so it runs after the attributes are gone and cannot race with a pwm write, and it is a no-op if probe fails before the driver touches the register. Boards where the driver does not manage the register do not register it. Signed-off-by: Johan Dahlin --- drivers/hwmon/nct6683.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/hwmon/nct6683.c b/drivers/hwmon/nct6683.c index 0324ace707a5..6825e6c3af34 100644 --- a/drivers/hwmon/nct6683.c +++ b/drivers/hwmon/nct6683.c @@ -344,6 +344,7 @@ struct nct6683_data { u16 have_fan; /* some fan inputs can be disabled */ u8 have_pwm; + u8 initial_fan_ctrl_mode; u8 pwm[NCT6683_NUM_REG_PWM]; #ifdef CONFIG_PM @@ -1275,6 +1276,17 @@ static void nct6683_setup_sensors(struct nct6683_data *data) } } +/* Put the fan control mode register back the way probe found it. */ +static void nct6683_restore_fan_control(void *_data) +{ + struct nct6683_data *data = _data; + + mutex_lock(&data->update_lock); + nct6683_write(data, NCT6683_REG_FAN_CTRL_MODE, + data->initial_fan_ctrl_mode); + mutex_unlock(&data->update_lock); +} + static int nct6683_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -1284,6 +1296,7 @@ static int nct6683_probe(struct platform_device *pdev) struct device *hwmon_dev; struct resource *res; int groups = 0; + int err; char build[16]; res = platform_get_resource(pdev, IORESOURCE_IO, 0); @@ -1401,6 +1414,15 @@ static int nct6683_probe(struct platform_device *pdev) nct6683_read(data, NCT6683_REG_VERSION_LO), build); + if (nct6683_has_fan_control(data)) { + data->initial_fan_ctrl_mode = + nct6683_read(data, NCT6683_REG_FAN_CTRL_MODE); + err = devm_add_action_or_reset(dev, nct6683_restore_fan_control, + data); + if (err) + return err; + } + hwmon_dev = devm_hwmon_device_register_with_groups(dev, nct6683_device_names[data->kind], data, data->groups); return PTR_ERR_OR_ZERO(hwmon_dev); -- 2.53.0