From nobody Sat Jun 13 03:31:34 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 572762F8EAE; Mon, 11 May 2026 04:48:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778474918; cv=none; b=MhH0lVhwE5vLHY9cfNdTG5euANzLkd2t+A7pZ9ST6+653/WY0NbzQp0OGDKl40t73g4WV44el/Y5iCtsp5S6PVwlUJ3mplOz7459IF9hu1zS3N0MVtoOidWgq4sVgCq67eOi/J+PZPEyoh9bYXXfU9/mqrgCT6PWhJVxL3SzDKU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778474918; c=relaxed/simple; bh=kp8AMKL3NQmcajNlthJgbsGq6Wqbf9MTD+qAs8cGVCI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mb2raR7tTNu0pOZR/7tZAxFDQC+RjDM1YK/SDXYrXNSvWPYgT8mVhRxarhgZ5T8qCb6q1b+1gMNHX5KwnjPfm+vmhGkoQRsMatB5mYYdCx1lywZr5xLLbZ25kcFgXxc2rsOY4cbBcwHGCj4am/mdy3gMcaBQ0XW4te0DTGZAyyA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=r3ajJFra; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="r3ajJFra" Received: by smtp.kernel.org (Postfix) with ESMTPS id 1DD8CC2BCF6; Mon, 11 May 2026 04:48:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778474918; bh=kp8AMKL3NQmcajNlthJgbsGq6Wqbf9MTD+qAs8cGVCI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=r3ajJFraYTVg7Q9UtUHmy2r0sIsACjznwINpTCzv7ls1DfGgajc8s8zk+nNnjR6TS Pq/xDpdfDNIYgEmTmuvtvYctp2pxXqkKYMMt+siFxuBOnISzM0MFIJK6XrBBrto7qA 7Wt8gDCB2zlfB4r7XY4m6ZGBTRJx0uRYMFjtwudKuatNafHprg29pdQr9lNPtBHcd9 +5jD0tXgX9/1A94e93rXijJ9BngyIIEbz5T2uEdeelFi7PacmdiRW23HVi3DKnyEtV CDcUVm0ooLLy+vo4p7e1I1pgXI6kStkBiPiWcEM9s45qztsOqlDk2M3XNNRTKODbH2 1yqOcgtZvHI6Q== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0568ACD3427; Mon, 11 May 2026 04:48:38 +0000 (UTC) From: Abdurrahman Hussain via B4 Relay Date: Sun, 10 May 2026 21:48:07 -0700 Subject: [PATCH v2 1/5] hwmon: (pmbus/adm1266) add firmware_revision debugfs entry 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: <20260510-adm1266-v2-1-3a22b903c2f1@nexthop.ai> References: <20260510-adm1266-v2-0-3a22b903c2f1@nexthop.ai> In-Reply-To: <20260510-adm1266-v2-0-3a22b903c2f1@nexthop.ai> To: Guenter Roeck , Alexandru Tachici Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, Abdurrahman Hussain X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2492; i=abdurrahman@nexthop.ai; h=from:subject:message-id; bh=6vBEHLMLOSh3PUQH6ftcKyQ9NFmKypGaweZdjAsCnfo=; b=owJ4nJvAy8zAJbYltPXv6rsCXxhPqyUxZDHGL1l17nXQx33LmJd98VQ756K6Yy7r059z01keJ Aetnyi7X6umo5SFQYyLQVZMkWXOI/83bR1tERtiDtnDzGFlAhnCwMUpABNR72H4K5TQasqgxecW NZPta3kf38HaOS/fVFgbPN/g89VrlijQIf8s37Qfj1ow9XCSDFee8VyHe2WP+memVZkz3q5/Z/i ZuZkTANB1THc= X-Developer-Key: i=abdurrahman@nexthop.ai; a=openpgp; fpr=9CE24FEC86888658B05CC23FB45585FDABDD10F4 X-Endpoint-Received: by B4 Relay for abdurrahman@nexthop.ai/default with auth_id=756 X-Original-From: Abdurrahman Hussain Reply-To: abdurrahman@nexthop.ai From: Abdurrahman Hussain The ADM1266 reports its firmware revision via the IC_DEVICE_REV manufacturer-specific block-read command (0xAE, datasheet Rev. D Table 80). The first three returned bytes are the firmware major.minor.patch fields. This is useful when correlating field behaviour against ADI release notes; expose it through debugfs alongside the existing sequencer_state entry. The standard PMBus MFR_REVISION (0x9B) register is already exposed by pmbus_core's debugfs auto-create path and reports the manufacturer revision, which is a separate thing from the firmware running on the device. Signed-off-by: Abdurrahman Hussain --- drivers/hwmon/pmbus/adm1266.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/drivers/hwmon/pmbus/adm1266.c b/drivers/hwmon/pmbus/adm1266.c index d90f8f80be8e..7b8433226176 100644 --- a/drivers/hwmon/pmbus/adm1266.c +++ b/drivers/hwmon/pmbus/adm1266.c @@ -21,6 +21,7 @@ #include #include =20 +#define ADM1266_IC_DEVICE_REV 0xAE #define ADM1266_BLACKBOX_CONFIG 0xD3 #define ADM1266_PDIO_CONFIG 0xD4 #define ADM1266_READ_STATE 0xD9 @@ -331,6 +332,30 @@ static int adm1266_state_read(struct seq_file *s, void= *pdata) return 0; } =20 +/* + * IC_DEVICE_REV (0xAE) returns an 8-byte block (datasheet Rev. D, Table 8= 0): + * [2:0] firmware revision major.minor.patch + * [5:3] bootloader revision major.minor.patch + * [7:6] silicon revision two ASCII characters + */ +static int adm1266_firmware_revision_read(struct seq_file *s, void *pdata) +{ + struct device *dev =3D s->private; + struct i2c_client *client =3D to_i2c_client(dev); + u8 buf[I2C_SMBUS_BLOCK_MAX]; + int ret; + + ret =3D i2c_smbus_read_block_data(client, ADM1266_IC_DEVICE_REV, buf); + if (ret < 0) + return ret; + if (ret < 3) + return -EIO; + + seq_printf(s, "%u.%u.%u\n", buf[0], buf[1], buf[2]); + + return 0; +} + static void adm1266_init_debugfs(struct adm1266_data *data) { struct dentry *root; @@ -343,6 +368,8 @@ static void adm1266_init_debugfs(struct adm1266_data *d= ata) =20 debugfs_create_devm_seqfile(&data->client->dev, "sequencer_state", data->= debugfs_dir, adm1266_state_read); + debugfs_create_devm_seqfile(&data->client->dev, "firmware_revision", data= ->debugfs_dir, + adm1266_firmware_revision_read); } =20 static int adm1266_nvmem_read_blackbox(struct adm1266_data *data, u8 *read= _buff) --=20 2.53.0 From nobody Sat Jun 13 03:31:34 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 5734018FC97; Mon, 11 May 2026 04:48:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778474918; cv=none; b=GQFqyvpSRpmxQ7Ok6fapMscdcowG2IarAt6HF5lxlgx4pcG4pUVE+4A2dJj6Ulgw+gvX7w1nFOkWfWwWULwhWe/JGvHQP/Kse116JQvDxtINX58LmqFz9xe9Aj+Rk1jAsC977p2T7u9d9ZZmsYFiZ48CJXMg9M3ZjzXFZhLG3WE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778474918; c=relaxed/simple; bh=/T9ROO3CVva2hKIuVrUoFLfTEH8bY6pGixuquZOSFgU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ngXBgdOq3yzF2Se8XZQZSzKEO2GJmAj2s/UWK+XrAaCpk61h3Q57t60pYrbuYmmrm192sxddOJhlXy0aQT3Hdk40xbsgImZ1WmMXjtoH0twrXvH3ineCUWBRk3FwpojIgtiIlVBK9QM8KCh7Ef/4PThX+JTXDfrnGoBeLKiwGMk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UMAQXeoO; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UMAQXeoO" Received: by smtp.kernel.org (Postfix) with ESMTPS id 22A7BC2BCF5; Mon, 11 May 2026 04:48:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778474918; bh=/T9ROO3CVva2hKIuVrUoFLfTEH8bY6pGixuquZOSFgU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=UMAQXeoOiNtWpqTtDGz0Je1VDIOLkks7bSDDWJVsE2/n7cahhzZ231klgVVQH5/ym GhtrABHawJ6oCH/sPYyqC37rQ9pIo04aLDd5/27LIYGI/DQiXv2KYfQSfGgDAGRorR Ty7AhXWfYQwRB4KqyIkA9so/iohXKIjO1uU1nb7EDlXVRTUZflKYhMd7ha+c5crLEA 5QNLOSWpZDPdkptktS0YHP+qwQxj2Xo7NReGul7lWEOQ709rfnWLtjn7Ra9xGeDP+a YuUJcCE9Jeid2imIueR/OoQiUBNr2KFr4VV51+EKGreaoiJvGePKIQbwMIhpKD8eTA F4qLHg5ccrFOA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 17CB5CD37AC; Mon, 11 May 2026 04:48:38 +0000 (UTC) From: Abdurrahman Hussain via B4 Relay Date: Sun, 10 May 2026 21:48:08 -0700 Subject: [PATCH v2 2/5] hwmon: (pmbus/adm1266) add clear_blackbox debugfs entry 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: <20260510-adm1266-v2-2-3a22b903c2f1@nexthop.ai> References: <20260510-adm1266-v2-0-3a22b903c2f1@nexthop.ai> In-Reply-To: <20260510-adm1266-v2-0-3a22b903c2f1@nexthop.ai> To: Guenter Roeck , Alexandru Tachici Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, Abdurrahman Hussain X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2640; i=abdurrahman@nexthop.ai; h=from:subject:message-id; bh=+s7AraqSSLTzzLZprtX85wFGz+qaFHzAS/LVroao8Pw=; b=owJ4nJvAy8zAJbYltPXv6rsCXxhPqyUxZDHGL5nl8y10OeOe+8rJPx62/Y46HVCdo/Rfxvxsg OIHEa8Fn/I7SlkYxLgYZMUUWeY88n/T1tEWsSHmkD3MHFYmkCEMXJwCMBEVVkaGjxWr18mGBfQv e76nJ+Hoh5alv3viRKcuqtg3IVaG3f9oIMM/pfK2Bys+dnwVN3rUkLWNg0dvxoYHhcUdsdfe7ik +rKbOBAA3709+ X-Developer-Key: i=abdurrahman@nexthop.ai; a=openpgp; fpr=9CE24FEC86888658B05CC23FB45585FDABDD10F4 X-Endpoint-Received: by B4 Relay for abdurrahman@nexthop.ai/default with auth_id=756 X-Original-From: Abdurrahman Hussain Reply-To: abdurrahman@nexthop.ai From: Abdurrahman Hussain The ADM1266 blackbox can be configured in two recording modes via BLACKBOX_CONFIG[0]: cyclic, where the device overwrites the oldest record once the 32-record buffer fills, and single, where it stops recording until the buffer is cleared. Deployments that need to preserve the full record history across multiple fault episodes typically run in single mode and need a way to clear the buffer after the records have been collected. Expose a write-only debugfs file alongside sequencer_state. Writing any data to it issues the documented clear-blackbox sub-command: a 2-byte block-write to READ_BLACKBOX (0xDE) with payload {0xFE, 0x00} (datasheet Rev. D). Signed-off-by: Abdurrahman Hussain --- drivers/hwmon/pmbus/adm1266.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/drivers/hwmon/pmbus/adm1266.c b/drivers/hwmon/pmbus/adm1266.c index 7b8433226176..31aefa8fc75f 100644 --- a/drivers/hwmon/pmbus/adm1266.c +++ b/drivers/hwmon/pmbus/adm1266.c @@ -356,6 +356,36 @@ static int adm1266_firmware_revision_read(struct seq_f= ile *s, void *pdata) return 0; } =20 +/* + * Clearing the blackbox is required when the device is configured in + * single-recording mode (BLACKBOX_CONFIG[0] =3D 0): once the 32-record + * buffer is full the device stops recording until cleared. + * + * The clear is issued as a 2-byte block-write to READ_BLACKBOX with + * payload {0xFE, 0x00} per the datasheet. + */ +static ssize_t adm1266_clear_blackbox_write(struct file *file, const char = __user *ubuf, + size_t count, loff_t *ppos) +{ + struct i2c_client *client =3D file->private_data; + u8 payload[2] =3D { 0xFE, 0x00 }; + int ret; + + ret =3D i2c_smbus_write_block_data(client, ADM1266_READ_BLACKBOX, + sizeof(payload), payload); + if (ret < 0) + return ret; + + return count; +} + +static const struct file_operations adm1266_clear_blackbox_fops =3D { + .owner =3D THIS_MODULE, + .open =3D simple_open, + .write =3D adm1266_clear_blackbox_write, + .llseek =3D noop_llseek, +}; + static void adm1266_init_debugfs(struct adm1266_data *data) { struct dentry *root; @@ -370,6 +400,8 @@ static void adm1266_init_debugfs(struct adm1266_data *d= ata) adm1266_state_read); debugfs_create_devm_seqfile(&data->client->dev, "firmware_revision", data= ->debugfs_dir, adm1266_firmware_revision_read); + debugfs_create_file("clear_blackbox", 0200, data->debugfs_dir, data->clie= nt, + &adm1266_clear_blackbox_fops); } =20 static int adm1266_nvmem_read_blackbox(struct adm1266_data *data, u8 *read= _buff) --=20 2.53.0 From nobody Sat Jun 13 03:31:34 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 572C181ACA; Mon, 11 May 2026 04:48:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778474918; cv=none; b=T2oEznFIxtdurVq0LCD5J81bD47LBEAnW6JTnIT1/SKmYe/Y463c3mBlGo/CtmaUzWYjlg3mgxJiRKkPdumyszVpd7N/wZPpIFVES/lFPM508o184Eg69KuHP5CW8kxR6CSpikUw4+Vljw62tZqFV0A3r/bvfE/ovHDmg1VxZ0I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778474918; c=relaxed/simple; bh=GefOk+OHHigiHix1aFTpMpOR85/uGPkITtr+1eIS3gs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=K2lrAJykAo4JcHFQWf3YK+e9Gvo+P0lwwYFuwNszdnexRH+/qwidXCYlgVE9f14BwY2fIQR3z/92/rPNmWLZI/ovY+IIQmtl9TNxUs0POsCo28ABmWP9gJncVdHKzKH9DHVB7NJhutMY5CVMPKiBCXKbiDb7nlD7oZuI0VTomCY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Xmu3UcrP; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Xmu3UcrP" Received: by smtp.kernel.org (Postfix) with ESMTPS id 35738C2BCFA; Mon, 11 May 2026 04:48:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778474918; bh=GefOk+OHHigiHix1aFTpMpOR85/uGPkITtr+1eIS3gs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=Xmu3UcrPlfhTT2BeENIrY6PQokc/0q52rP6hXzoFdIr4oTUXSUiKl0YcKlohjVGYt hP/B6pbGsC7Fys7GHkH0EVOYktL/8e2k5zQkZ0uE/tR1h4BePi5ThhY4cc7W3G1km6 0JSMaQUBnGHX5Qi9V41Eo1p6BMm26/swn9tFxw8LwOXKLdCVsFgO0YDAnyvdSMf0dH JqV/xymppgd5V/x4mJkDOhmZ9zCAYjN8UKw6YJcvgLkt4C1vj6hoqeDJBP/pFXdRQu W3v5vRIvVkIExCrl2whi9q0awOFChIhuHkFXOXPHKdVfqePbFHp9fFkuZnJ5rNcurR QjoXyi/P0ovCQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 272ECCD4840; Mon, 11 May 2026 04:48:38 +0000 (UTC) From: Abdurrahman Hussain via B4 Relay Date: Sun, 10 May 2026 21:48:09 -0700 Subject: [PATCH v2 3/5] hwmon: (pmbus/adm1266) add powerup_counter debugfs entry 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: <20260510-adm1266-v2-3-3a22b903c2f1@nexthop.ai> References: <20260510-adm1266-v2-0-3a22b903c2f1@nexthop.ai> In-Reply-To: <20260510-adm1266-v2-0-3a22b903c2f1@nexthop.ai> To: Guenter Roeck , Alexandru Tachici Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, Abdurrahman Hussain X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2726; i=abdurrahman@nexthop.ai; h=from:subject:message-id; bh=Fvs4izgDZLwvwAFpe9E0YJJPp97a8WERWKXmnjgLvo4=; b=owJ4nJvAy8zAJbYltPXv6rsCXxhPqyUxZDHGLw35elgxt/ybAsPUKVXcllc7Nd8Xvgv4u3y9y ef3fGJnk5I6SlkYxLgYZMUUWeY88n/T1tEWsSHmkD3MHFYmkCEMXJwCMJFXUgz/qwyKWG3XJ6ve vrdGat4Wnq2ajDry2c+XbtRwrO7LZDHfwMjQoRn040pLieR9njZ7tel3GfZUauod+/Gr8M9CL+F jHusZAWV7S4M= X-Developer-Key: i=abdurrahman@nexthop.ai; a=openpgp; fpr=9CE24FEC86888658B05CC23FB45585FDABDD10F4 X-Endpoint-Received: by B4 Relay for abdurrahman@nexthop.ai/default with auth_id=756 X-Original-From: Abdurrahman Hussain Reply-To: abdurrahman@nexthop.ai From: Abdurrahman Hussain The ADM1266 maintains a 16-bit non-volatile POWERUP_COUNTER register (0xE4, datasheet Rev. D, Table 93) that increments on every power cycle and cannot be reset by the host. Each blackbox record already embeds the counter at record time, so the standalone live value is primarily useful for matching a captured record back to the boot it came from when correlating logs. Expose it as a read-only debugfs file alongside firmware_revision. The block-read returns two payload bytes in little-endian order. Signed-off-by: Abdurrahman Hussain --- drivers/hwmon/pmbus/adm1266.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/drivers/hwmon/pmbus/adm1266.c b/drivers/hwmon/pmbus/adm1266.c index 31aefa8fc75f..99e92a8365fb 100644 --- a/drivers/hwmon/pmbus/adm1266.c +++ b/drivers/hwmon/pmbus/adm1266.c @@ -28,6 +28,7 @@ #define ADM1266_READ_BLACKBOX 0xDE #define ADM1266_SET_RTC 0xDF #define ADM1266_GPIO_CONFIG 0xE1 +#define ADM1266_POWERUP_COUNTER 0xE4 #define ADM1266_BLACKBOX_INFO 0xE6 #define ADM1266_PDIO_STATUS 0xE9 #define ADM1266_GPIO_STATUS 0xEA @@ -356,6 +357,31 @@ static int adm1266_firmware_revision_read(struct seq_f= ile *s, void *pdata) return 0; } =20 +/* + * POWERUP_COUNTER (0xE4) is a 2-byte little-endian non-volatile counter + * that increments on every device power cycle (datasheet Rev. D, Table + * 93). It saturates at 65535 and cannot be reset by the host. Each + * blackbox record embeds the counter value at record time, so this live + * read is mainly useful for matching a record back to its boot. + */ +static int adm1266_powerup_counter_read(struct seq_file *s, void *pdata) +{ + struct device *dev =3D s->private; + struct i2c_client *client =3D to_i2c_client(dev); + u8 buf[I2C_SMBUS_BLOCK_MAX]; + int ret; + + ret =3D i2c_smbus_read_block_data(client, ADM1266_POWERUP_COUNTER, buf); + if (ret < 0) + return ret; + if (ret !=3D 2) + return -EIO; + + seq_printf(s, "%u\n", buf[0] | (buf[1] << 8)); + + return 0; +} + /* * Clearing the blackbox is required when the device is configured in * single-recording mode (BLACKBOX_CONFIG[0] =3D 0): once the 32-record @@ -400,6 +426,8 @@ static void adm1266_init_debugfs(struct adm1266_data *d= ata) adm1266_state_read); debugfs_create_devm_seqfile(&data->client->dev, "firmware_revision", data= ->debugfs_dir, adm1266_firmware_revision_read); + debugfs_create_devm_seqfile(&data->client->dev, "powerup_counter", data->= debugfs_dir, + adm1266_powerup_counter_read); debugfs_create_file("clear_blackbox", 0200, data->debugfs_dir, data->clie= nt, &adm1266_clear_blackbox_fops); } --=20 2.53.0 From nobody Sat Jun 13 03:31:34 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 5DA88355F3A; Mon, 11 May 2026 04:48:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778474918; cv=none; b=JFPnNHRJvXIw92P8kvV0LTivyOLA3YsTDRoO6qKlcFftl9g3lBZcmCgFSGxJQbN6rMeGS19x2OjEXDvza/usWToXYqMIjJDeuAevYN5CJ9yS7qsMFszM4ByhX9JTqmx30qX66Tqc6t5CJCW06182fy+v38E5O/d5RSlj9jF+b08= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778474918; c=relaxed/simple; bh=nuDq6G7gm6QJxy32WG2Qe/bPDCAPB9vssEDwtKSqx7I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZkykmUPGlMKipIpKMPQQJKgCTzvRGDRD9KNFS7isVpu9nf+4UQ37t7I/p1h2lLdXeQSim6K9EClvtS7cnx7T1XLxFaf1dPD/qfXWpHyQA5HILENj99FhiQAWs2hBaupbgVem5EPnozjCS6y/LnBK5fQ7553Srce2fbWQWFpQQqY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CyP0r8T3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="CyP0r8T3" Received: by smtp.kernel.org (Postfix) with ESMTPS id 3F2CEC2BCFC; Mon, 11 May 2026 04:48:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778474918; bh=nuDq6G7gm6QJxy32WG2Qe/bPDCAPB9vssEDwtKSqx7I=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=CyP0r8T3Tg10R7hPXG8M5HDH/x2RQlI/P3/Y2tA5oSGW1E/5yz5zx3qO8eRmGYhjj XrCz2aZoWDkQQU9IIs2yjBDznfw+35AhTbfVHZHl8f7wsgzchEirZLvNw68RLNMjCB yeU7AQsm+249dbmn98+T/eD7FHDN2/a+ivGVc6/6IkgpySyrBaGzsrcEVit42ttBRA DEtCVmGvRn8UMGSKS0SHHrp2sutOiV3WTMrrGSxiu2jDfnWRsNrvNGevbaWI4fKI9r SezEAN24+SVwYSQQzuc1g8No3lqe7xT5PJLiIZ6cZ2ENWsjcViopIVtTTap4pSmK2H mXEXL5VkCIuaA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 381ECCD37B7; Mon, 11 May 2026 04:48:38 +0000 (UTC) From: Abdurrahman Hussain via B4 Relay Date: Sun, 10 May 2026 21:48:10 -0700 Subject: [PATCH v2 4/5] hwmon: (pmbus/adm1266) replace probe-time RTC seed with rtc_class device 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: <20260510-adm1266-v2-4-3a22b903c2f1@nexthop.ai> References: <20260510-adm1266-v2-0-3a22b903c2f1@nexthop.ai> In-Reply-To: <20260510-adm1266-v2-0-3a22b903c2f1@nexthop.ai> To: Guenter Roeck , Alexandru Tachici Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, Abdurrahman Hussain X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4478; i=abdurrahman@nexthop.ai; h=from:subject:message-id; bh=4ibCJKgh5O0PlQIzarHRly8PpVR0ik1+YJcgF8LKXcQ=; b=owJ4nJvAy8zAJbYltPXv6rsCXxhPqyUxZDHGL+UMLP8XKXzDPS2PU7T/hJqxqVLqkoNrbZtfd DNMvqa3cnpHKQuDGBeDrJgiy5xH/m/aOtoiNsQcsoeZw8oEMoSBi1MAJrLIn+F/rt71itWvv1XH Lb1fJqjfNrF7QVlGxPLVZ/Yd2n5mN99sO4b/6cFx2Ybimy9xVEwu+pRjHyBvudRUf8NTq8aZhYr r2R+zAwDp+0xS X-Developer-Key: i=abdurrahman@nexthop.ai; a=openpgp; fpr=9CE24FEC86888658B05CC23FB45585FDABDD10F4 X-Endpoint-Received: by B4 Relay for abdurrahman@nexthop.ai/default with auth_id=756 X-Original-From: Abdurrahman Hussain Reply-To: abdurrahman@nexthop.ai From: Abdurrahman Hussain The driver currently writes the device's internal RTC at probe with ktime_get_seconds(), which returns CLOCK_MONOTONIC seconds since boot and is not a wall-clock value. The resulting timestamps embedded in blackbox records are therefore meaningless across reboots, defeating the cross-reboot record-correlation use case the field exists for. Switching the seed to ktime_get_real_seconds() does not actually fix this: at probe the system wall clock may not yet have been set (no external RTC, no userspace NTP), and seeding unconditionally also clobbers whatever valid time the ADM1266 retained across a warm reboot. The data sheet (Rev. D, p. 22) recommends "frequently send the time stamp to the ADM1266 to synchronize the UNIX time and reduce the time from drifting" when running on the internal oscillator. The clean way to expose that policy is an rtc_class device backed by SET_RTC, so that userspace tooling (hwclock, chrony, systemd-timesyncd) can drive the re-sync against /dev/rtcN once it trusts the system clock - with no driver-specific sysfs ABI. Drop the probe-time seed and adm1266_set_rtc() entirely. Add an rtc_class device whose ->read_time and ->set_time callbacks read and write the SET_RTC frame. The rtc_class API is second-precision, so the SET_RTC fractional-seconds bytes are always written as zero. Fixes: 15609d189302 ("hwmon: (pmbus/adm1266) read blackbox") Signed-off-by: Abdurrahman Hussain --- drivers/hwmon/pmbus/adm1266.c | 70 ++++++++++++++++++++++++++++++++++++---= ---- 1 file changed, 60 insertions(+), 10 deletions(-) diff --git a/drivers/hwmon/pmbus/adm1266.c b/drivers/hwmon/pmbus/adm1266.c index 99e92a8365fb..0dfb02db8683 100644 --- a/drivers/hwmon/pmbus/adm1266.c +++ b/drivers/hwmon/pmbus/adm1266.c @@ -18,8 +18,8 @@ #include #include #include "pmbus.h" +#include #include -#include =20 #define ADM1266_IC_DEVICE_REV 0xAE #define ADM1266_BLACKBOX_CONFIG 0xD3 @@ -513,21 +513,71 @@ static int adm1266_config_nvmem(struct adm1266_data *= data) return 0; } =20 -static int adm1266_set_rtc(struct adm1266_data *data) +/* + * SET_RTC frame layout (datasheet Rev. D, Table 84): + * bytes [1:0] =3D fractional seconds, LSB =3D 1/65536 s + * bytes [5:2] =3D seconds since 1970-01-01 UTC + * The rtc_class API is second-precision, so the fractional bytes are + * always written as zero. + */ +static int adm1266_write_rtc(struct i2c_client *client, time64_t secs) { - time64_t kt; - char write_buf[6]; + u8 buf[6] =3D { 0 }; int i; =20 - kt =3D ktime_get_seconds(); + for (i =3D 0; i < 4; i++) + buf[2 + i] =3D (secs >> (i * 8)) & 0xFF; + + return i2c_smbus_write_block_data(client, ADM1266_SET_RTC, sizeof(buf), b= uf); +} + +static int adm1266_rtc_read_time(struct device *dev, struct rtc_time *tm) +{ + struct i2c_client *client =3D to_i2c_client(dev); + u8 buf[I2C_SMBUS_BLOCK_MAX]; + u32 secs; + int ret; + int i; =20 - memset(write_buf, 0, sizeof(write_buf)); + ret =3D i2c_smbus_read_block_data(client, ADM1266_SET_RTC, buf); + if (ret < 0) + return ret; + if (ret !=3D 6) + return -EIO; =20 + secs =3D 0; for (i =3D 0; i < 4; i++) - write_buf[2 + i] =3D (kt >> (i * 8)) & 0xFF; + secs |=3D (u32)buf[2 + i] << (i * 8); + + rtc_time64_to_tm(secs, tm); + return 0; +} + +static int adm1266_rtc_set_time(struct device *dev, struct rtc_time *tm) +{ + struct i2c_client *client =3D to_i2c_client(dev); + + return adm1266_write_rtc(client, rtc_tm_to_time64(tm)); +} + +static const struct rtc_class_ops adm1266_rtc_ops =3D { + .read_time =3D adm1266_rtc_read_time, + .set_time =3D adm1266_rtc_set_time, +}; + +static int adm1266_register_rtc(struct adm1266_data *data) +{ + struct rtc_device *rtc; + + rtc =3D devm_rtc_allocate_device(&data->client->dev); + if (IS_ERR(rtc)) + return PTR_ERR(rtc); + + rtc->ops =3D &adm1266_rtc_ops; + rtc->range_min =3D 0; + rtc->range_max =3D U32_MAX; =20 - return i2c_smbus_write_block_data(data->client, ADM1266_SET_RTC, sizeof(w= rite_buf), - write_buf); + return devm_rtc_register_device(rtc); } =20 static int adm1266_probe(struct i2c_client *client) @@ -553,7 +603,7 @@ static int adm1266_probe(struct i2c_client *client) if (ret < 0) return ret; =20 - ret =3D adm1266_set_rtc(data); + ret =3D adm1266_register_rtc(data); if (ret < 0) return ret; =20 --=20 2.53.0 From nobody Sat Jun 13 03:31:34 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 7D6EF3624A3; Mon, 11 May 2026 04:48:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778474918; cv=none; b=F02UBaDc/UdiagOS+E7f0Ogo3CUB803uOt4Gk73L9Z5Pbd5D7XWV3yltThkCWzO4AGsnuTQk1klj5+SCQRNWrlM1UV15kCzkKu56TzeXTdE4XCNUVVsYmIVulgMrU4jUJjDwyA/oDmqxhbAQAvnxBupQyOuwsq+Bf/09P/HFfDk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778474918; c=relaxed/simple; bh=X++SZUVp4SFmjlGT62fuZ/FmC03jyGdQZkXkLLxkvyw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IPKy29geu9Cn0oexJMQSntW/iukvnaNeXIPvj1moeaZD+DuOQ6Uho2PqjwwQFlAqjBsU29mYZyfltc651aW6Vk6HXESNfZm2D+sjHQVcF4uRCD6/WWIoi/W+ySS6vWRE5ByoABxByo6ncaymp8LJ+F+wOfRHQB/845etxkbsWUw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TfuCgJuw; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="TfuCgJuw" Received: by smtp.kernel.org (Postfix) with ESMTPS id 4CD24C2BCFB; Mon, 11 May 2026 04:48:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778474918; bh=X++SZUVp4SFmjlGT62fuZ/FmC03jyGdQZkXkLLxkvyw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=TfuCgJuwwxptCcWASpyWarKPWkmJaagOZIhJC8U5/kY0jQf9vMp/mPvJgy2MALalZ a7yhB5or5si2T+fzhP16efav+B6VTyvY5KBz0ZS657omzU6LDcaiMLQ0AW/xQRFqp6 QMICPpQLOBYb/RhEzXDfpPO33T4JmoN/KYVuicmQ1TJMJeLZGZdF69vHzNDLcs8ePj sFXJXxmFfwFnau0Jv/W1I7PxNc1FRIywkt5oozX8h8opObz8co/IenTr7fmGG6PuGf 1fHku0OrYZPZgDsnT+Nl79S6gCAO7iay9x3yYfikHzTzreAXZpoZNCzlgJeIOopcrn 3uMzqDqZq6DSA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4826DCD37BE; Mon, 11 May 2026 04:48:38 +0000 (UTC) From: Abdurrahman Hussain via B4 Relay Date: Sun, 10 May 2026 21:48:11 -0700 Subject: [PATCH v2 5/5] hwmon: (pmbus/adm1266) include adapter number in GPIO line label 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: <20260510-adm1266-v2-5-3a22b903c2f1@nexthop.ai> References: <20260510-adm1266-v2-0-3a22b903c2f1@nexthop.ai> In-Reply-To: <20260510-adm1266-v2-0-3a22b903c2f1@nexthop.ai> To: Guenter Roeck , Alexandru Tachici Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, Abdurrahman Hussain X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1498; i=abdurrahman@nexthop.ai; h=from:subject:message-id; bh=XbXHyUmmSPnlINR9vCvpAV0eATuZ1frtfzVXW5r+IYw=; b=owJ4nJvAy8zAJbYltPXv6rsCXxhPqyUxZDHGL33a+6og+vNDExPDBc8KP8Va+z+I6Ll7/86xD 5a51g7C+p87SlkYxLgYZMUUWeY88n/T1tEWsSHmkD3MHFYmkCEMXJwCMBEDA4b/occa9wj9DbkZ PvW1tovw810abttnX72gEb35r/SDx2tbkhkZtjzK3KG6vFFo282DFtt1ebJPzw/V8O+bZ1CrfMb zx4GLTAD/MFEc X-Developer-Key: i=abdurrahman@nexthop.ai; a=openpgp; fpr=9CE24FEC86888658B05CC23FB45585FDABDD10F4 X-Endpoint-Received: by B4 Relay for abdurrahman@nexthop.ai/default with auth_id=756 X-Original-From: Abdurrahman Hussain Reply-To: abdurrahman@nexthop.ai From: Abdurrahman Hussain Platforms that fit more than one ADM1266 on different I2C buses at the same 7-bit slave address (a common shelf-management pattern, e.g. one device per power domain) end up with duplicate GPIO line labels because the existing format only includes the slave address. Including the adapter number disambiguates them. The adapter number is formatted as decimal to match the i2c-N convention used elsewhere in Linux (sysfs paths, dev nodes); the slave address keeps its conventional hexadecimal form. The label is purely informational (visible via gpioinfo and the gpiochip /sys/class/gpio name); no DT or ABI consumer parses it. Signed-off-by: Abdurrahman Hussain --- drivers/hwmon/pmbus/adm1266.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/hwmon/pmbus/adm1266.c b/drivers/hwmon/pmbus/adm1266.c index 0dfb02db8683..479e768ff87c 100644 --- a/drivers/hwmon/pmbus/adm1266.c +++ b/drivers/hwmon/pmbus/adm1266.c @@ -292,8 +292,9 @@ static int adm1266_config_gpio(struct adm1266_data *dat= a) int i; =20 for (i =3D 0; i < ARRAY_SIZE(data->gpio_names); i++) { - gpio_name =3D devm_kasprintf(&data->client->dev, GFP_KERNEL, "adm1266-%x= -%s", - data->client->addr, adm1266_names[i]); + gpio_name =3D devm_kasprintf(&data->client->dev, GFP_KERNEL, "adm1266-%d= -%x-%s", + data->client->adapter->nr, data->client->addr, + adm1266_names[i]); if (!gpio_name) return -ENOMEM; =20 --=20 2.53.0