From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-yw1-f169.google.com (mail-yw1-f169.google.com [209.85.128.169]) (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 B31A31A680B for ; Tue, 28 Jul 2026 00:22:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.169 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785198158; cv=none; b=Yx2EjKJ7B10+5y76sfbstnYMztO9caGJ1jGM8681ZKfoNilOkZ+xnePqMDUO7XmsoiU0l38vDNF8MnRPQsdtbvCGuB9Vl50OkvVHGwfx7risNPZwnCJ802qBTjRCGdo9wjI3vJxKpw2Of1MXZRtX5IcZL32oVCFH+I2MiVJAE6I= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785198158; c=relaxed/simple; bh=w1Hv0r2r6jSycHFUZO7pD+HmNcQNoWtICO6sg/Lwaxs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sWZVAs3RxSRBTcr2NgqBGQ2xe0D58DX4wsfHN6KEhzyRsgI/ZedyGh6EpZXof59m8BohhajT0lpPacOf1X+bEsLzRt/TKykvbo4U7t2DIVqYQZnkKXGTg21ljbktvA7fNh2C9L28HThfANlFmgPPYgxAWLodB1DQ6I4oosy5W5g= 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=sP+wOSmI; arc=none smtp.client-ip=209.85.128.169 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="sP+wOSmI" Received: by mail-yw1-f169.google.com with SMTP id 00721157ae682-81062fdeaf5so7029677b3.0 for ; Mon, 27 Jul 2026 17:22:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785198156; x=1785802956; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=sc68CqtTOQLhSPfGgDFsVsO0c0+MZYn4nDNljvauFns=; b=sP+wOSmIZC9CowfynQ86ETdir2JMrdMhfxUz95iXPyEW++JmemcQnSe/sqlAcCoLr7 Z0hUJwR87vBKA6Faicw2c+HrzajDH5D4DpALaXU3OyUoX5sL+1TXjFVwcWsBIl9jZ5dv 3TreQYzHHphTIzgp/Q3IG5gvUgRUOhXFteMo9CWtN92/JZ7c90ivIZSegWXpKwR+zaR8 Fdw8m8lbxIq0bf5VU12olSaS4G08Ms5V4aknvyA0rBBztD0gjAmEvJ2abt5XOTnBCBdE E7a+axk+5y6Cgyd+/fE+FPH70UmALxDSkyZ8Jxji0bX/fDJV14Gc+vHErs4ikZVrPtyC blBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785198156; x=1785802956; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=sc68CqtTOQLhSPfGgDFsVsO0c0+MZYn4nDNljvauFns=; b=FrEFYwXdrXc8s3FQrDsAqKw+QQvchYd400BQ0wtLkhnQd8sZEKyFlpkn//DVuZbPR+ GMp266cZX1BA+m81eSY3hLHJy8VuRUY8e+706Ty3kK4wiDpnM7Y9XwlwR1kc9JT1n3lE EUCSnjIjJuLiH7EjPMaa5VjOQRkJOGhjLQQM2RPMDxAUJjEdJnLP1QzvaikwamcdtMZj P6y556pmBfxBEtElkN6BuSNspWUXEcN6IKqgkquARUyKEQbDkTV8Nd7f4M0UUcY4HLxP yAdDgE046lZCZJIzx6FISOz9UpyfaRR8MUEYfXGCE+YJFHNHpAT90zZQDI8ifJ/ASjjX J04g== X-Forwarded-Encrypted: i=1; AHgh+RqsTYApvYeMsKrzwwbA8vX/nz9ue4eHepUkwrv2w3lUNOdxbJX4jJc7KVy8Z3T3hio+5PkvWpvWMLtIhrk=@vger.kernel.org X-Gm-Message-State: AOJu0YwnIK61JsLifnSGsc3iyDCsbm13PXAOeHy8twDHZT3RulqpoDNX xAKmndySzh37NVfo+VWqLOlpRKvVK/OD6SBhWYlFMNpGrVO9cUHLrAT0 X-Gm-Gg: AR+sD11zZIWAvR1nw3R1i7cqz2xOM106zez7K2U1ON6NSNT4ZaPpGKvivVX5Xemm/f+ +aN6ldSDEsVYGV7fsgqSH6yGFLWmrVZTU5K7TRgb2bt1ZW4vC69zPocXFdngyaqpAuAEG4xBJJ+ PqIqG43WYPA0UbcdFJdeqnGPG15qyRnnN1WGNZ3AsQt2JM/6mZu2PzS6bVVMDFU9z4LDiw79HSJ mCw+wVGD7GHqNN+GFaeG3Ky+uUeveYiGsvYJnMrGxtXRjWUH2fjR31SxYMlBxKH992t1kQVkfR/ OzbF2Ob8zwe5xISx/2Tbx+Gkv2O7tabWTEPnEkjeuUcDHjrPc64QkTU4XM3wyXDbP3ruHJcojGE AKVnBsG4H6BZiLGEvatN4ky905LgSBWuKLigRYTIHHGj3oSeoa1RqlA+2RAeer7nlRst12xj1+o gY+bG7SH9Ru6qe/ahuvaggzLSpSgTKQtxZWldaZr7m9EZpan09bUb39DZq7bNyO2Vqrf1TqaSYF K1mpAY1gS/RAvo= X-Received: by 2002:a05:690c:e255:10b0:81e:94bd:6473 with SMTP id 00721157ae682-81f993e072dmr236667b3.30.1785198155733; Mon, 27 Jul 2026 17:22:35 -0700 (PDT) Received: from tresc054937.tre-sc.gov.br ([187.65.210.13]) by smtp.gmail.com with ESMTPSA id 00721157ae682-81f655acc7csm39583707b3.0.2026.07.27.17.22.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Jul 2026 17:22:33 -0700 (PDT) From: Luiz Angelo Daros de Luca Date: Mon, 27 Jul 2026 21:22:17 -0300 Subject: [hwmon PATCH v2 1/8] hwmon: (adt7470) Fix fans stuck in manual mode on I2C errors Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260727-adt7470_fixes-v2-1-598e38a46ba6@gmail.com> References: <20260727-adt7470_fixes-v2-0-598e38a46ba6@gmail.com> In-Reply-To: <20260727-adt7470_fixes-v2-0-598e38a46ba6@gmail.com> To: Guenter Roeck , Chris Packham , Andrew Morton , "Darrick J. Wong" , "Mark M. Hoffman" Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, Luiz Angelo Daros de Luca , sashiko-bot@kernel.org X-Mailer: b4 0.15.2 During adt7470_read_temperatures(), the driver temporarily switches the PWM channels to manual mode, performs the temperature collection, and then restores the original configuration registers. However, if an I2C transaction fails at any point after entering manual mode, the function aborts and returns immediately. This leaves the configuration registers un-restored, permanently trapping the fans in manual mode. Introduce a recovery path to ensure that the original PWM configuration registers are always restored, even when intermediate I2C operations fail. Reported-by: sashiko-bot@kernel.org Closes: https://lore.kernel.org/r/20260716213252.EACA71F000E9@smtp.kernel.org Fixes: ef67959c4253 ("hwmon: (adt7470) Convert to use regmap") Signed-off-by: Luiz Angelo Daros de Luca --- drivers/hwmon/adt7470.c | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/drivers/hwmon/adt7470.c b/drivers/hwmon/adt7470.c index 664349756dc2..481d51617f4b 100644 --- a/drivers/hwmon/adt7470.c +++ b/drivers/hwmon/adt7470.c @@ -205,11 +205,12 @@ static inline int adt7470_write_word_data(struct adt7470_data *data, unsigned in /* Probe for temperature sensors. Assumes lock is held */ static int adt7470_read_temperatures(struct adt7470_data *data) { - unsigned long res; + struct device *dev = regmap_get_device(data->regmap); + u8 pwm[ADT7470_FAN_COUNT]; unsigned int pwm_cfg[2]; - int err; + unsigned long res; + int err, err2; int i; - u8 pwm[ADT7470_FAN_COUNT]; /* save pwm[1-4] config register */ err = regmap_read(data->regmap, ADT7470_REG_PWM_CFG(0), &pwm_cfg[0]); @@ -233,19 +234,19 @@ static int adt7470_read_temperatures(struct adt7470_data *data) err = regmap_update_bits(data->regmap, ADT7470_REG_PWM_CFG(2), ADT7470_PWM_AUTO_MASK, 0); if (err < 0) - return err; + goto out_restore; /* write pwm control to whatever it was */ err = regmap_bulk_write(data->regmap, ADT7470_REG_PWM(0), &pwm[0], ADT7470_PWM_COUNT); if (err < 0) - return err; + goto out_restore; /* start reading temperature sensors */ err = regmap_update_bits(data->regmap, ADT7470_REG_CFG, ADT7470_T05_STB_MASK, ADT7470_T05_STB_MASK); if (err < 0) - return err; + goto out_restore; /* Delay is 200ms * number of temp sensors. */ res = msleep_interruptible((data->num_temp_sensors >= 0 ? @@ -256,13 +257,30 @@ static int adt7470_read_temperatures(struct adt7470_data *data) err = regmap_update_bits(data->regmap, ADT7470_REG_CFG, ADT7470_T05_STB_MASK, 0); if (err < 0) - return err; + goto out_restore; +out_restore: /* restore pwm[1-4] config registers */ - err = regmap_write(data->regmap, ADT7470_REG_PWM_CFG(0), pwm_cfg[0]); - if (err < 0) - return err; - err = regmap_write(data->regmap, ADT7470_REG_PWM_CFG(2), pwm_cfg[1]); + err2 = regmap_write(data->regmap, ADT7470_REG_PWM_CFG(0), pwm_cfg[0]); + if (err2 < 0) { + dev_warn_ratelimited(dev, + "failed to restore PWM{1,2} config (%d)\n", + err2); + + if (!err) + err = err2; + } + + err2 = regmap_write(data->regmap, ADT7470_REG_PWM_CFG(2), pwm_cfg[1]); + if (err2 < 0) { + dev_warn_ratelimited(dev, + "failed to restore PWM{3,4} config (%d)\n", + err2); + + if (!err) + err = err2; + } + if (err < 0) return err; -- 2.55.0