From nobody Wed Nov 5 05:32:52 2025 Received: from smtp-relay-canonical-1.canonical.com (smtp-relay-canonical-1.canonical.com [185.125.188.121]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BA5AE231A55; Wed, 16 Apr 2025 06:55:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.125.188.121 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744786506; cv=none; b=bp/DOgfBtI5YzAAjVrKMbPvm+ch9aqbMfo4C9fuH/8cH9/nzACS5OvHo6j9OqGgFuzA40tUZaO+afLKQ/S3GSlyYcLXDkXV1CpfKF7GBOpLg+XV0EQpTIe/iMA63H7O9rfHHPSzOdSALSUH6ikcqtgC24+ABvjlMyctVIhCZSJw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744786506; c=relaxed/simple; bh=LdqJZkfsrO3LCmSC/7OtcVJEOkHFEt8gdt49MCebZzo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=R/ir2dyX+RxrZyaO7brlW0ieEjHLVQS4SmiSsn8DJgDjK3GQ2k0UqikLq+HNtI5PUO2yUsQc86hoOR4LddUN9eZMko5jI7gyepDn7OcteW9K60fQiHyjI0y1O1tSdSl1A6VL76Ej2+XLoFxS+RrUm8Og7Iajdlq/3A0C2/jv/RQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com; spf=pass smtp.mailfrom=canonical.com; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b=Nk5GKatR; arc=none smtp.client-ip=185.125.188.121 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=canonical.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b="Nk5GKatR" Received: from 2001-b400-e2a9-54f6-6e67-7778-9cb9-7043.emome-ip6.hinet.net (unknown [10.101.200.229]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-canonical-1.canonical.com (Postfix) with ESMTPSA id 2A06242463; Wed, 16 Apr 2025 06:46:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1744786018; bh=sM6chi8lTFnRlrr86zejeakRXpamF60oS2LkgrHrDug=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Nk5GKatRHD4qM1Pzl/Hj5YyNwjLh6doA8x+xlD4uX8jilA5dbtS9q6oHQ8fr4vRQL WwfZXJO0syHyGE7LMOavRdCZEUGkMzMK2QmD6S6JTXnTMkgfQmaRH/NBvJ8C8xCIwM SYSwnwyFvCrIbl189vq/IBvSChoo6Yv0+9qf9dWBqDTh9eYsoOannJMTEgagBXvo5E xxGXcU4oujOQ3LyJ+2TJKzKrW5gEcsfFpZr7lG2mwCGM/xNbP4lbmdB7WieBpweueS uUJbA46f5p14R2Ilc9SguDJS9UiQJSX/DonkjCU66YoEtEfOjJ1kH+lCGt5bGdX6fu l1SGqwvlseqGA== From: "Yo-Jung (Leo) Lin" Date: Wed, 16 Apr 2025 14:46:26 +0800 Subject: [PATCH 1/2] hwmon: (spd5118) pass spd5118_data to hwmon callbacks 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: quoted-printable Message-Id: <20250416-for-upstream-spd5118-spd-write-prot-detect-v1-1-8b3bcafe9dad@canonical.com> References: <20250416-for-upstream-spd5118-spd-write-prot-detect-v1-0-8b3bcafe9dad@canonical.com> In-Reply-To: <20250416-for-upstream-spd5118-spd-write-prot-detect-v1-0-8b3bcafe9dad@canonical.com> To: Jean Delvare , Guenter Roeck Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, "Yo-Jung Lin (Leo)" X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1876; i=leo.lin@canonical.com; h=from:subject:message-id; bh=LdqJZkfsrO3LCmSC/7OtcVJEOkHFEt8gdt49MCebZzo=; b=owEBbQKS/ZANAwAKAV8XsZZKKe6GAcsmYgBn/1JbyttZ5/3ZC32UnKPNvHukuYm+MvtCw75gT j6Q751LKUWJAjMEAAEKAB0WIQQzqV4kW+yguuqHrw5fF7GWSinuhgUCZ/9SWwAKCRBfF7GWSinu hjnUD/wOB4mCzbrbcgGgMPd7cl5EJ2hUIsNRpALZG6OBW84wgEF4JOzAIPm+MiJLLoZQ9vA0pIq 3tj6QIeqFS8oaAXnvC2lw1hDa89Eewl7cLD2P9nnFzV3GBL8Gw8b66rR4KzGMF62wv3t7Z7cf+q LmN7MgT759T07YWlJCZCqFcXdWm+7gLd+jy6+iUG3DqBot4Yr/XMdiSLeQ2+sRrRL6dg6j+BopK ehhK2K9/C69dFd+jjh9sAX+06ABH2iYBkXTx2QTK8K+kD9ppVIP68g6i46ZpRXsM/iB8VsnBAEe Cjga2s9EnmkLqsBhrkfziRNfHWzzmU7iglHxtZy62ewZfx+TDaHEkEdiJ2COYt+4iAi2vBX4mEi rabXZaWZPDAAgwHnYEpjWHhNPiUYGAUyODLtZLttUyunP4ZCaU35ZuZ0xOMdW+y2bwIzV7E+eb3 F0yWXeNMT4L9bATHOSkvXyrRXnBzqs3aSzyKH00zC4juZ41YLOLGVzmpr32InF6h5d5bHhzQCw0 DM3u2TYEHl2/VcJm1v++gpVvLSWS1jYosGuPe3COdwwP8+iyFDtfrpGVpfEbFqdtJQqAivdeNc8 tyBhjF8/crmA8pp6cToAUa4Nc9r7hsiHi4mpMqAB4gGE71fiX8TDfrToiPMHmIGUuDZdRyKww2d +caeNwBJQgZBH4g== X-Developer-Key: i=leo.lin@canonical.com; a=openpgp; fpr=33A95E245BECA0BAEA87AF0E5F17B1964A29EE86 Currently only the regcache is passed to the hwmon device. Pass the whole spd5118_data for better flexibility. Signed-off-by: Yo-Jung (Leo) Lin --- drivers/hwmon/spd5118.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/hwmon/spd5118.c b/drivers/hwmon/spd5118.c index 358152868d96..3cb2eb2e0227 100644 --- a/drivers/hwmon/spd5118.c +++ b/drivers/hwmon/spd5118.c @@ -174,7 +174,8 @@ static int spd5118_read_enable(struct regmap *regmap, l= ong *val) static int spd5118_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, long *val) { - struct regmap *regmap =3D dev_get_drvdata(dev); + struct spd5118_data *data =3D dev_get_drvdata(dev); + struct regmap *regmap =3D data->regmap; =20 if (type !=3D hwmon_temp) return -EOPNOTSUPP; @@ -256,7 +257,8 @@ static int spd5118_temp_write(struct regmap *regmap, u3= 2 attr, long val) static int spd5118_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, long val) { - struct regmap *regmap =3D dev_get_drvdata(dev); + struct spd5118_data *data =3D dev_get_drvdata(dev); + struct regmap *regmap =3D data->regmap; =20 switch (type) { case hwmon_temp: @@ -269,6 +271,8 @@ static int spd5118_write(struct device *dev, enum hwmon= _sensor_types type, static umode_t spd5118_is_visible(const void *_data, enum hwmon_sensor_typ= es type, u32 attr, int channel) { + struct spd5118_data *data =3D (struct spd5118_data *)_data; + if (type !=3D hwmon_temp) return 0; =20 @@ -611,7 +615,7 @@ static int spd5118_probe(struct i2c_client *client) } =20 hwmon_dev =3D devm_hwmon_device_register_with_info(dev, "spd5118", - regmap, &spd5118_chip_info, + data, &spd5118_chip_info, NULL); if (IS_ERR(hwmon_dev)) return PTR_ERR(hwmon_dev); --=20 2.43.0 From nobody Wed Nov 5 05:32:52 2025 Received: from smtp-relay-canonical-1.canonical.com (smtp-relay-canonical-1.canonical.com [185.125.188.121]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BA542231A51; Wed, 16 Apr 2025 06:55:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.125.188.121 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744786506; cv=none; b=duJJ8JmwLMj8SKLE2DZsebxV7ku26bh3/1Zo4oNox+ivUKAnVBMiJOZo80Shj6zcHl20crZJWao9bapwp2vdhgEK/jVypelI6a93qCZMxds1kFv4tnvyEmUwcLt2bg/lOArPVsmBDr1ulIw4QHW71mbeKU/jVjWo2MIWTS54/Zw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744786506; c=relaxed/simple; bh=f5MvPPgZzNQoUwNLf8pjd+gK69ncgfdoDGlBlbgMevI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fRR8gmk8+OnLpo9gahlplL1mHH8hC7LhA5PeHIxa6kyseGUrDSbt8uTPFZMHMBGmbRndr3gufouanYyr8dsmVkYGc+BIe7837N++WSXzJUvymrfxL6KoIJio6Z6ga/n0ouf0JtQW6X30/birxX7NW5iCFrSI0pKvFl5ptvp43uc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com; spf=pass smtp.mailfrom=canonical.com; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b=GOGescOE; arc=none smtp.client-ip=185.125.188.121 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=canonical.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b="GOGescOE" Received: from 2001-b400-e2a9-54f6-6e67-7778-9cb9-7043.emome-ip6.hinet.net (unknown [10.101.200.229]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-canonical-1.canonical.com (Postfix) with ESMTPSA id DE35B42465; Wed, 16 Apr 2025 06:46:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1744786020; bh=HXmdxN4qv8qUN/AmjmYz54sxkDkoxDt0ewKZemJZ36g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GOGescOEvY87ayDp1JcSqQxuzXw3u5PtCzkLHHTkFdWM6cO37CvYDOP95Qm+d9eU7 kXX5YDzJFmc0L6TqoZ6UiUqPNpfddpoIswqixBH3VXB4F8V/KL379/lyigAWSayO/2 cbfpt7cedrTDkZl/DTpGAGnsE32GUUUd5DTYfywCzLcHE+z3Wl5vMfUuGbmY82nKca 4dFvqkhMQz5/zJ1VpPqOuZ6YMlHB2f8nkTVDFrl1MQQPjKIBDzCJME+yPqTlMm/mg7 7V/9Z8M8tARrO+Tdbn2uSmAQyA2hEFu0O8P1Fo+0dSA64VSxbe0Obrx66TGNr4Pzys fbiAgaiDTpJrQ== From: "Yo-Jung (Leo) Lin" Date: Wed, 16 Apr 2025 14:46:27 +0800 Subject: [PATCH 2/2] hwmon: (spd5118) restrict writes under SPD write protection 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: quoted-printable Message-Id: <20250416-for-upstream-spd5118-spd-write-prot-detect-v1-2-8b3bcafe9dad@canonical.com> References: <20250416-for-upstream-spd5118-spd-write-prot-detect-v1-0-8b3bcafe9dad@canonical.com> In-Reply-To: <20250416-for-upstream-spd5118-spd-write-prot-detect-v1-0-8b3bcafe9dad@canonical.com> To: Jean Delvare , Guenter Roeck Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, "Yo-Jung Lin (Leo)" X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3515; i=leo.lin@canonical.com; h=from:subject:message-id; bh=f5MvPPgZzNQoUwNLf8pjd+gK69ncgfdoDGlBlbgMevI=; b=owEBbQKS/ZANAwAKAV8XsZZKKe6GAcsmYgBn/1JbViDIxPHR4QLCCYOn0QykrbyNLeW87IG9j l/cbSDmN0SJAjMEAAEKAB0WIQQzqV4kW+yguuqHrw5fF7GWSinuhgUCZ/9SWwAKCRBfF7GWSinu hjA/D/wMjsVRiYEMRj7NWnhGDeQLuKLfS8Jh3+ARwbt90Wq6TlBLb9py/krsK8AX0jIUHnNf+VB yRZVa5s6tMV+IFG5kbt0yh0iDJX8Tz1OD0c7Ls1kMm2gLBpME1STkapX+Je9EFxuGMt7YVNhPoQ 4NnylGcFhKprDKsADoioY/D+eDHAWJYM0YqgBV5Ith8cyVw/i/iX7BTw5fgSUldYd/yuO/GNW95 zbzqAGnp5+i0xqR8bFX/FYwM5StNOPlxSRF8TskkWryy14hyHQiZCyp93leId5RjDdqzlTBGydn xqqjfzUPsM9AFf9XJpVJ+QWBOeALOdcd1FPmoNHGbIujUuEQQNNPIYXWipkmqgbN4D8aVY5bwlj MbU2gJwZXQqy3Xguxhn/YMt6lL1MB3P5HugyuFKfkNJ9u6SQlfpIpkuXn3mA76RHvYCFNBa05TQ /Ul7Pakos16+FhWBmQjkW8NyZ6KxO/oRcgYjSpsH+qI+HnDBH34xYHcMEIgLY3Y21s/p8BuEBG1 r8cneXRds8J3zoJ3c2w6JvwUkUNTumHOmRLtQmGVW9Dno7J2RWyQsOyqOlzlDPtGmt6xNp2rhzO eutzYzYv4/xSI1aJJK1WQxgmoAcM66nuLXSj2rMaFYU50VeCHT9rQDHymmvXw3kVJRcEQYEE5m2 OD3IgtBv1OAbgag== X-Developer-Key: i=leo.lin@canonical.com; a=openpgp; fpr=33A95E245BECA0BAEA87AF0E5F17B1964A29EE86 On some platforms, SPD Write Protection for the SMBus controller may be enabled. For the i801 family, this will forbid writing data to devices residing on addresses from 0x50 to 0x57. This may lead to the following issues: 1) Writes to the sensor hwmon sysfs attributes will always result in ENXIO. 2) System-wide resume will encounter errors during regcache sync back, resulting in the following messages during resume: kernel: spd5118 1-0050: Failed to write b =3D 0: -6 kernel: spd5118 1-0050: PM: dpm_run_callback(): spd5118_resume [spd511= 8] returns -6 kernel: spd5118 1-0050: PM: failed to resume async: error -6 To address this, check if the sensor can be written to at probe, and bypass write-related functions if writing to the sensor is not possible. Signed-off-by: Yo-Jung (Leo) Lin --- drivers/hwmon/spd5118.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/drivers/hwmon/spd5118.c b/drivers/hwmon/spd5118.c index 3cb2eb2e0227..9dd5342c31dd 100644 --- a/drivers/hwmon/spd5118.c +++ b/drivers/hwmon/spd5118.c @@ -75,6 +75,7 @@ static const unsigned short normal_i2c[] =3D { struct spd5118_data { struct regmap *regmap; struct mutex nvmem_lock; + bool write_protected; }; =20 /* hwmon */ @@ -284,7 +285,7 @@ static umode_t spd5118_is_visible(const void *_data, en= um hwmon_sensor_types typ case hwmon_temp_lcrit: case hwmon_temp_crit: case hwmon_temp_enable: - return 0644; + return data->write_protected ? 0444 : 0644; case hwmon_temp_min_alarm: case hwmon_temp_max_alarm: case hwmon_temp_crit_alarm: @@ -499,7 +500,7 @@ static const struct regmap_range_cfg spd5118_regmap_ran= ge_cfg[] =3D { }, }; =20 -static const struct regmap_config spd5118_regmap_config =3D { +static struct regmap_config spd5118_regmap_config =3D { .reg_bits =3D 8, .val_bits =3D 8, .max_register =3D 0x7ff, @@ -563,6 +564,21 @@ static int spd5118_init(struct i2c_client *client) return 0; } =20 +static bool spd5118_write_protected(struct i2c_client *client) +{ + struct device *dev =3D &client->dev; + int mode =3D 0; + int err =3D 0; + + mode =3D i2c_smbus_read_byte_data(client, SPD5118_REG_I2C_LEGACY_MODE); + if (mode < 0) + dev_warn(dev, "Failed to read MR11: %d", mode); + + err =3D i2c_smbus_write_byte_data(client, SPD5118_REG_I2C_LEGACY_MODE, mo= de); + + return (err < 0); +} + static int spd5118_probe(struct i2c_client *client) { struct device *dev =3D &client->dev; @@ -580,6 +596,11 @@ static int spd5118_probe(struct i2c_client *client) if (!data) return -ENOMEM; =20 + if (spd5118_write_protected(client)) { + data->write_protected =3D true; + spd5118_regmap_config.cache_type =3D REGCACHE_NONE; + } + regmap =3D devm_regmap_init_i2c(client, &spd5118_regmap_config); if (IS_ERR(regmap)) return dev_err_probe(dev, PTR_ERR(regmap), "regmap init failed\n"); @@ -638,6 +659,9 @@ static int spd5118_suspend(struct device *dev) u32 regval; int err; =20 + if (data->write_protected) + return 0; + /* * Make sure the configuration register in the regmap cache is current * before bypassing it. @@ -662,6 +686,9 @@ static int spd5118_resume(struct device *dev) struct spd5118_data *data =3D dev_get_drvdata(dev); struct regmap *regmap =3D data->regmap; =20 + if (data->write_protected) + return 0; + regcache_cache_only(regmap, false); return regcache_sync(regmap); } --=20 2.43.0