From nobody Mon May 25 06:42:08 2026 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (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 1787C405C5D for ; Sun, 17 May 2026 08:05:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779005106; cv=none; b=Aoy88DBU1/A9OMDLD6ye2WSN95E4BpgQ6N+oVfZ8zKZC0jnGlaqavXSVa1KA8EkZFW4ncI0LuCSxmm3NrTwD3RlUZTXqbAoW+hZcD/0D7FVSnPU5SDD0Symt+ruJ8jHvfa5/VbI3zkKh76qa5vr/9GIprVtTTn/XaKunI3T/sO0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779005106; c=relaxed/simple; bh=DDnLVn9KE0r6n+8qdAW6um++L3c2y7QGNd7NAvWSOzc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JFEnQEnusXWzYs2YnjSOlWKUP5VX+LXh5cHq7YmehTe9YMHkMHtSC+24SduJYEsMOGBxavV+LhlEk5RVQKTm5rqm2LtptCmtsNPDcDVXQXJndsGnRy09k3GIJFX4hKxdE+AAvAFDvKg7teXi+mvg7Bzu2uEaamw7tR3bpdw74us= 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=dZzIkHyJ; arc=none smtp.client-ip=209.85.214.170 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="dZzIkHyJ" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-2bc85eda6b6so5468455ad.1 for ; Sun, 17 May 2026 01:05:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779005104; x=1779609904; 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; bh=Rx2QX5K9is5rKmLAU+EuwGG/waj5UvUtwnyY95MhkWg=; b=dZzIkHyJwIwKjRtAACmqjHKejKi6O+KAouItx2LW0EzOK6kz/wjPaoF2EO0TjPTsVr zkR0M6TnHN8SSPl7YJGeYPTVJwgS2eOSXUGgD24hOVrXbGsGQ1lRRBwp6+jtyh1ytMLO iplwYaUmFDKxgvyFW7XfEG/5puhGRGCW942tTRqUbxyYkFaiJg95EMWtkH1zRnu3jGxw OrrZukARW8WxIcoWsQEvz8yN1aHHBxg9DPGojgQFuKMcI6vRgNbKR4OWk8fsuZ3Jfwfp yb4Il7J3hWXkurOiEaHz9VAtmD89cZAy2sVw/7B0lWpqABbhzMKPBMDpah9mIrOXT3fi ojRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779005104; x=1779609904; 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; bh=Rx2QX5K9is5rKmLAU+EuwGG/waj5UvUtwnyY95MhkWg=; b=U2PUEUbbQ+iC1zqvZ1t+sl0tY3cauEZnW9ZyIPSIfycO6xHLT58PVeXHYbJUHMKiFy 4SkiiaALupv5EX2ufCrsIFV+uhzjehDC7jW2NE4xPcM5UZTxUAp/DcbnD0YHAugfvP/v 0Q+ek3mj1X+7PssMXxYLGBGa4+xeUXhbkgTrz3j2Rz44fV/KY9J9Z2WEyA3HELNKvrci P11oqf2DKTdk+yvnPUVP6CHm6Z/rOaTvNNeK3jHhTmI/t25ZFKiLyzsqvCygRo2caoDE LzloqiwH4JqWeH9B9098N8Wh5Wfm++5muIyNCJvJd6c3FJWdS7tHbnBCAU8FYxA+AvxH qUOg== X-Forwarded-Encrypted: i=1; AFNElJ/UxlxQlEMOJx89au3UZGA5h/liJjpxNGSkAN5Aq7HicgezoRAmxxlB/uiCDAmKtZRD5Y3i9y2Ch0QQcJc=@vger.kernel.org X-Gm-Message-State: AOJu0Yxb1TBRHLu/1VxVgK/Ji7cQw6zdZKolIaQp5kkbS4GBPhY48kKQ /KqQDJuPtgXxPTThsurYXIouYPlZAskxEvR0GHihGMMAABlqpsydnbYj X-Gm-Gg: Acq92OE66coAl5VhEk/3gtkdjn7DIp/pv4WYdrI0eUCYBcL5DrzlsYqjr7BY/XjNVEd tVFcAVYuQjlG8xzCWz1ODel7Wp+yG8Sw1dW3+4B29Q/OkZ2+dBY2IvFrdWdUJTlqMz3iRNRYvDQ eHdXfjHbW82O+UA/0ftxGy4Dzwttw9C8V46u9WLDR15OlK4J5HgL6sjTczlngb3K2bz054rbhDO YFL90XhosONdNIcdiICSyV73KYTmBR5nZfkixIMANT2jRu/JWOOQ/iKGL38GEPq+JHQ2nVO4ikY 8B0CmfMQdwjZ/uTZMEf+1jbTnqk6MBJ/l/0oaohxahjaYi+b9QI4pePZ5CbpHI4fXgsFMRpOn6R /hwpGlbKD/xRjclD2cCaauM97ku5dlRcFk3ORMTFZ3deJJkN8lq1vuTZUyyVD1YPYPHN3urerRj vbUbLrj+QwEL7SylLkgHAY0xP8rV95ldzDERV/u/mncW3/c4G4ViHXWHaNSDX9pbQqVg7WnEU= X-Received: by 2002:a17:903:2ec5:b0:2bd:9061:d544 with SMTP id d9443c01a7336-2bd9061d6bbmr91383835ad.34.1779005104454; Sun, 17 May 2026 01:05:04 -0700 (PDT) Received: from fedora.taildae27b.ts.net ([2409:4064:2d80:75ca:8541:272f:2bb3:5e55]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2bd5bd5fb17sm109834595ad.1.2026.05.17.01.04.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 17 May 2026 01:05:03 -0700 (PDT) From: Shubham Chakraborty To: Guenter Roeck , Florian Fainelli , Jonathan Corbet Cc: Shuah Khan , Broadcom internal kernel review list , Ray Jui , Scott Branden , linux-hwmon@vger.kernel.org, linux-doc@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Shubham Chakraborty Subject: [PATCH v3 1/3] soc: bcm2835: raspberrypi-firmware: Add voltage domain IDs Date: Sun, 17 May 2026 13:34:43 +0530 Message-ID: <20260517080445.103962-2-chakrabortyshubham66@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260517080445.103962-1-chakrabortyshubham66@gmail.com> References: <20260516164407.25255-1-chakrabortyshubham66@gmail.com> <20260517080445.103962-1-chakrabortyshubham66@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: quoted-printable Content-Type: text/plain; charset="utf-8" Add Raspberry Pi firmware voltage domain identifiers for the mailbox property interface. Also add the voltage request structure used with RPI_FIRMWARE_GET_VOLTAGE so firmware clients can share the common API definition from the firmware header. Signed-off-by: Shubham Chakraborty Acked-by: Florian Fainelli --- include/soc/bcm2835/raspberrypi-firmware.h | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm28= 35/raspberrypi-firmware.h index e1f87fbfe554..975bef529854 100644 --- a/include/soc/bcm2835/raspberrypi-firmware.h +++ b/include/soc/bcm2835/raspberrypi-firmware.h @@ -156,6 +156,31 @@ enum rpi_firmware_clk_id { RPI_FIRMWARE_NUM_CLK_ID, }; =20 +enum rpi_firmware_volt_id { + RPI_FIRMWARE_VOLT_ID_CORE =3D 1, + RPI_FIRMWARE_VOLT_ID_SDRAM_C =3D 2, + RPI_FIRMWARE_VOLT_ID_SDRAM_P =3D 3, + RPI_FIRMWARE_VOLT_ID_SDRAM_I =3D 4, + RPI_FIRMWARE_NUM_VOLT_ID, +}; + +/** + * struct rpi_firmware_get_voltage_request - Firmware request for a voltage + * @id: ID of the voltage being queried + * @value: Voltage in microvolts. Set by the firmware. + * + * Used by @RPI_FIRMWARE_GET_VOLTAGE. + */ +struct rpi_firmware_get_voltage_request { + __le32 id; + __le32 value; +} __packed; + +#define RPI_FIRMWARE_GET_VOLTAGE_REQUEST(_id) \ + { \ + .id =3D cpu_to_le32(_id), \ + } + /** * struct rpi_firmware_clk_rate_request - Firmware Request for a rate * @id: ID of the clock being queried --=20 2.54.0 From nobody Mon May 25 06:42:08 2026 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.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 CAC222E1F06 for ; Sun, 17 May 2026 08:05:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779005114; cv=none; b=cpaHEhy7ZZQLTZlkvmeS3nDznXIvFbxFwUvu+I4vfAc2vMqUw/KG10gIWdEy/G/zwXbzjJ+b1pyHY8kol5T27cv6F21SvdPRfTe+W/t8w4+XehyhwTLZVSolRQvoMcnRU2vXK029e8v4XnNH8966SxHtzxbUMxGjpkmqRVHi0/8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779005114; c=relaxed/simple; bh=CQnnrNz3QaLer4rIvuR5rcsVjjt1zgl/QceRPjuqaRM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=OzFdMAYEyc9jRNTznSLxlfY7cbvRK8wYmAVy5YzEvIQQcCWDWpj3faGJffXnHKK98bFFbYKKCwcsx7rQnvEoBfshuJyhL7x5kKdMVj6yg7VHyh0/hYFXMVd8FCtVhmRp7GGQeZ+eMR5wP8GIifmhPt8mgXuRikhY48AXSnCL2RM= 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=FMrRZzm9; arc=none smtp.client-ip=209.85.214.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="FMrRZzm9" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-2ba4a1a0325so8753775ad.0 for ; Sun, 17 May 2026 01:05:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779005112; x=1779609912; 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; bh=sCKAo/jf8xEPgNkV5gsPWnBJjgGBXqxhdGGblYeVH98=; b=FMrRZzm986YjqNCDhkXsmQJz5OrtqGKBioVtFnkAAAXteEaU8O5/20H3t2uH6z4O2X 6TygKTE+D9pIprpVfdnhTxN/fpU4U6CgryY/68euXQBgjNst5k2qo55kpfHH9tE8uJ6X Z15RIICPhtMc57pbT5XUn5lGNRHoYU5Rk1zurPxMnw6J4DSEHhLB367BFActaaMLnqX9 WMMFD309rNyiIRN+LdF0czoNXvcEXNJeD8CWjAThbBGz9qqJhAavuBs8Fd/BHVfMuM87 4zE+ItHdVJUbc/OXTnqQnnN14OsTu+MGyefjXrUwGPIQb/JBrqBgB3EPFCaGBQ1uA1C8 +4gg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779005112; x=1779609912; 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; bh=sCKAo/jf8xEPgNkV5gsPWnBJjgGBXqxhdGGblYeVH98=; b=ObuVE5ojQc4RpO8hdhhm+FgvBE+XcFsHbF7+Nio9G3cj77caTk0CLL/ka/WE9zDR9V LTnWeRVzAVR8c1FXmeU/nbqzAueFyEYZ7ZdqewHi2CS72hmd8cYvraP3SeEDjGWDjUTQ HurbC7nYdXJu/FTNY1ybT4JFyRsRbyHB1v8wBYRW9hsy/cZ/uUoFqhl/pZ5Z6jse4w6C IgeGM7TQgOu753eMJfXi3M/lPXGLy25hjvYM9tBgHx+jsauuIEsu0rffEHy12IU5VDMy RqeGIXyKC3nOZ3PDFbSHjSEQHCz4oyl9qfCYEPkxhlQ0m4Inb6Hw3+qpbr5FVQuM/4RN BM6w== X-Forwarded-Encrypted: i=1; AFNElJ8H5YU+P7eNInRadoMIcheX0njvcDg+Jpq3IbR/IYw03GdR10eh2nDZm9SoCDh2A99PO23dWGkYzDLvKGo=@vger.kernel.org X-Gm-Message-State: AOJu0YzQxR4G3nBbu3N5ctYUSAEKnv3IP0bf7nkSCa4rC4bHhwooN36T KMAFNzWb3Wqv1XSDAlEHD0/tiduadT/UuQeXWG73JyemLND/DGuPI4B0 X-Gm-Gg: Acq92OErn+Oq5HelT6KxXY0AmIXwnn3y0RmsbMxTXhE4CnHB2ECRMVM+obkhNh0egWQ YyPL05sP/N0iN0Gxi9/6FGtiEjdJ/rfsH0ie84N/+WDBiQZ6Fvfn8k4dMxgU1jPMVO8snpxywdy yu7k6gOF1rliRBCfdh+KPtvz37O5bcDJg8nbSUHwgJIrpCX4J+rVzwjDD2FcTw9mEM6v0w7j7yy ytCbhQprkmJdxMAA63rTBRpRLVreGZu2CX4M7jbi0G0E7Atc/s8rRHbUqM+09mJg2pqM7drUGoe E0AQ924c3S9ro+727as5Qt8s28H5J7XZ9+X7Ncq9h3W5c2TgzVxzIcRIi6foB4Zjdgr3pqc2rGl j1eNK4tjCe9/kFJX6lxcEhOJuy9PDB6scCZUembAh6L9pU5JzUiohCO+Ou7hLCUvX6gExgTSEcQ BXVvoRfyyl2FrzSJ8B1a4vJ/0eamu/D3ijf2VmcMDFEF4BCsBojSuK9OxTYGLAEj4gge+qOxo= X-Received: by 2002:a17:902:b090:b0:2b4:5cea:f61c with SMTP id d9443c01a7336-2bd7e77a4ccmr84321965ad.4.1779005112119; Sun, 17 May 2026 01:05:12 -0700 (PDT) Received: from fedora.taildae27b.ts.net ([2409:4064:2d80:75ca:8541:272f:2bb3:5e55]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2bd5bd5fb17sm109834595ad.1.2026.05.17.01.05.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 17 May 2026 01:05:11 -0700 (PDT) From: Shubham Chakraborty To: Guenter Roeck , Florian Fainelli , Jonathan Corbet Cc: Shuah Khan , Broadcom internal kernel review list , Ray Jui , Scott Branden , linux-hwmon@vger.kernel.org, linux-doc@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Shubham Chakraborty Subject: [PATCH v3 2/3] hwmon: raspberrypi: Add voltage input support Date: Sun, 17 May 2026 13:34:44 +0530 Message-ID: <20260517080445.103962-3-chakrabortyshubham66@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260517080445.103962-1-chakrabortyshubham66@gmail.com> References: <20260516164407.25255-1-chakrabortyshubham66@gmail.com> <20260517080445.103962-1-chakrabortyshubham66@gmail.com> 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 Extend the raspberrypi-hwmon driver to expose firmware-provided voltage measurements through the hwmon subsystem. The driver now exports the following voltage inputs: - in0_input (core) - in1_input (sdram_c) - in2_input (sdram_i) - in3_input (sdram_p) Voltage values returned by firmware are converted from microvolts to millivolts as expected by the hwmon subsystem. Update the documentation related to it. The existing undervoltage sticky alarm handling is preserved and associated with the first voltage channel. Tested in - - Raspberry Pi 3b+ (Linux raspberrypi 6.12.75+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.75-1+rpt1 (2026-03-11) aarch64 GNU/Linux) Signed-off-by: Shubham Chakraborty Reviewed-by: Florian Fainelli --- Documentation/hwmon/raspberrypi-hwmon.rst | 15 ++- drivers/hwmon/raspberrypi-hwmon.c | 127 +++++++++++++++++++++- 2 files changed, 137 insertions(+), 5 deletions(-) diff --git a/Documentation/hwmon/raspberrypi-hwmon.rst b/Documentation/hwmo= n/raspberrypi-hwmon.rst index 8038ade36490..db315184b861 100644 --- a/Documentation/hwmon/raspberrypi-hwmon.rst +++ b/Documentation/hwmon/raspberrypi-hwmon.rst @@ -20,6 +20,17 @@ undervoltage conditions. Sysfs entries ------------- =20 -=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D +in0_input Core voltage in millivolts +in1_input SDRAM controller voltage in millivolts +in2_input SDRAM I/O voltage in millivolts +in3_input SDRAM PHY voltage in millivolts +in0_label "core" +in1_label "sdram_c" +in2_label "sdram_i" +in3_label "sdram_p" in0_lcrit_alarm Undervoltage alarm -=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D + +The voltage inputs and labels are only exposed if the firmware reports sup= port +for the corresponding voltage ID. diff --git a/drivers/hwmon/raspberrypi-hwmon.c b/drivers/hwmon/raspberrypi-= hwmon.c index a2938881ccd2..8ce6dacc19b0 100644 --- a/drivers/hwmon/raspberrypi-hwmon.c +++ b/drivers/hwmon/raspberrypi-hwmon.c @@ -5,6 +5,7 @@ * Based on firmware/raspberrypi.c by Noralf Tr=C3=B8nnes * * Copyright (C) 2018 Stefan Wahren + * Copyright (C) 2026 Shubham Chakraborty */ #include #include @@ -21,10 +22,18 @@ struct rpi_hwmon_data { struct device *hwmon_dev; struct rpi_firmware *fw; + u32 valid_inputs; u32 last_throttled; struct delayed_work get_values_poll_work; }; =20 +static const char * const rpi_hwmon_labels[] =3D { + "core", + "sdram_c", + "sdram_i", + "sdram_p", +}; + static void rpi_firmware_get_throttled(struct rpi_hwmon_data *data) { u32 new_uv, old_uv, value; @@ -56,6 +65,21 @@ static void rpi_firmware_get_throttled(struct rpi_hwmon_= data *data) hwmon_notify_event(data->hwmon_dev, hwmon_in, hwmon_in_lcrit_alarm, 0); } =20 +static int rpi_firmware_get_voltage(struct rpi_hwmon_data *data, u32 id, + long *val) +{ + struct rpi_firmware_get_voltage_request packet =3D + RPI_FIRMWARE_GET_VOLTAGE_REQUEST(id); + int ret; + ret =3D rpi_firmware_property(data->fw, RPI_FIRMWARE_GET_VOLTAGE, + &packet, sizeof(packet)); + if (ret) + return ret; + + *val =3D le32_to_cpu(packet.value) / 1000; + return 0; +} + static void get_values_poll(struct work_struct *work) { struct rpi_hwmon_data *data; @@ -77,19 +101,94 @@ static int rpi_read(struct device *dev, enum hwmon_sen= sor_types type, { struct rpi_hwmon_data *data =3D dev_get_drvdata(dev); =20 - *val =3D !!(data->last_throttled & UNDERVOLTAGE_STICKY_BIT); + if (type =3D=3D hwmon_in) { + switch (attr) { + case hwmon_in_input: + switch (channel) { + case 0: + return rpi_firmware_get_voltage(data, + RPI_FIRMWARE_VOLT_ID_CORE, + val); + case 1: + return rpi_firmware_get_voltage(data, + RPI_FIRMWARE_VOLT_ID_SDRAM_C, + val); + case 2: + return rpi_firmware_get_voltage(data, + RPI_FIRMWARE_VOLT_ID_SDRAM_I, + val); + case 3: + return rpi_firmware_get_voltage(data, + RPI_FIRMWARE_VOLT_ID_SDRAM_P, + val); + default: + return -EOPNOTSUPP; + } + case hwmon_in_lcrit_alarm: + if (channel =3D=3D 0) { + *val =3D !!(data->last_throttled & UNDERVOLTAGE_STICKY_BIT); + return 0; + } + return -EOPNOTSUPP; + default: + return -EOPNOTSUPP; + } + } + + return -EOPNOTSUPP; +} + +static int rpi_read_string(struct device *dev, enum hwmon_sensor_types typ= e, + u32 attr, int channel, const char **str) +{ + if (type =3D=3D hwmon_in && attr =3D=3D hwmon_in_label) { + if (channel >=3D ARRAY_SIZE(rpi_hwmon_labels)) + return -EOPNOTSUPP; + + *str =3D rpi_hwmon_labels[channel]; + return 0; + } + + return -EOPNOTSUPP; +} + +static umode_t rpi_is_visible(const void *_data, enum hwmon_sensor_types t= ype, + u32 attr, int channel) +{ + const struct rpi_hwmon_data *data =3D _data; + + if (type =3D=3D hwmon_in) { + switch (attr) { + case hwmon_in_input: + case hwmon_in_label: + if (!(data->valid_inputs & BIT(channel))) + return 0; + return 0444; + case hwmon_in_lcrit_alarm: + if (channel =3D=3D 0) + return 0444; + return 0; + default: + return 0; + } + } + return 0; } =20 static const struct hwmon_channel_info * const rpi_info[] =3D { HWMON_CHANNEL_INFO(in, - HWMON_I_LCRIT_ALARM), + HWMON_I_INPUT | HWMON_I_LABEL | HWMON_I_LCRIT_ALARM, + HWMON_I_INPUT | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_LABEL), NULL }; =20 static const struct hwmon_ops rpi_hwmon_ops =3D { - .visible =3D 0444, + .is_visible =3D rpi_is_visible, .read =3D rpi_read, + .read_string =3D rpi_read_string, }; =20 static const struct hwmon_chip_info rpi_chip_info =3D { @@ -101,6 +200,7 @@ static int rpi_hwmon_probe(struct platform_device *pdev) { struct device *dev =3D &pdev->dev; struct rpi_hwmon_data *data; + long voltage; int ret; =20 data =3D devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); @@ -110,6 +210,26 @@ static int rpi_hwmon_probe(struct platform_device *pde= v) /* Parent driver assure that firmware is correct */ data->fw =3D dev_get_drvdata(dev->parent); =20 + ret =3D rpi_firmware_get_voltage(data, RPI_FIRMWARE_VOLT_ID_CORE, + &voltage); + if (!ret) + data->valid_inputs |=3D BIT(0); + + ret =3D rpi_firmware_get_voltage(data, RPI_FIRMWARE_VOLT_ID_SDRAM_C, + &voltage); + if (!ret) + data->valid_inputs |=3D BIT(1); + + ret =3D rpi_firmware_get_voltage(data, RPI_FIRMWARE_VOLT_ID_SDRAM_I, + &voltage); + if (!ret) + data->valid_inputs |=3D BIT(2); + + ret =3D rpi_firmware_get_voltage(data, RPI_FIRMWARE_VOLT_ID_SDRAM_P, + &voltage); + if (!ret) + data->valid_inputs |=3D BIT(3); + data->hwmon_dev =3D devm_hwmon_device_register_with_info(dev, "rpi_volt", data, &rpi_chip_info, @@ -159,6 +279,7 @@ static struct platform_driver rpi_hwmon_driver =3D { module_platform_driver(rpi_hwmon_driver); =20 MODULE_AUTHOR("Stefan Wahren "); +MODULE_AUTHOR("Shubham Chakraborty "); MODULE_DESCRIPTION("Raspberry Pi voltage sensor driver"); MODULE_LICENSE("GPL v2"); MODULE_ALIAS("platform:raspberrypi-hwmon"); --=20 2.54.0 From nobody Mon May 25 06:42:08 2026 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) (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 61DFC2DCF67 for ; Sun, 17 May 2026 08:05:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779005122; cv=none; b=UoMNNbyNaIYv6dBePT9rtGnXrBqLX567YL0YucvLMnQQnfg8OT+aHLs6Ljhj91faaY/szfn6C5H6ArZUdJbEOOl9scFMDM7crePcsPxv4BC1l+eWoXNF7s5/KI5HHOY33q5rqHFETFnawwUtGJ5uMuyStDsgNgo8PwK7wlrO7gs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779005122; c=relaxed/simple; bh=NGMb25quMJA/qmhqXGV0PuyWAv1LkEiCtHZF83T9J/Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=G9jqw6HJN0WEup8J6Na4/wxSXg79HBo9xAdyFo+c/Ij4vKTZ4AdkSVIeu4Eh8Yw58641x0KSSnr/zW49NqTFEL7SnfkQfztx99/TkhV3s4MSvm85ZDmY0jY45Z2yMUlE084Ej6Phz2Tray3tVo5uzehqX+oe04w/IqIw+CbTf+U= 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=dX9kROA7; arc=none smtp.client-ip=209.85.214.172 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="dX9kROA7" Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-2bd2c147abaso7303765ad.3 for ; Sun, 17 May 2026 01:05:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779005121; x=1779609921; 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; bh=yMtYakkWg6xW89eWo2V/gAFSemUpeEFr7/GQfm8tsfU=; b=dX9kROA7A82iVIFYb1z97RYdleh5cBn7EHgQ3KYhRKjOmWeUu581VaJpX+J98LIqIS PvTYGF9Hdaipk0QhkKbCUm4YAfff95W+k13r8mjdw1xemczO3PfZdNZgNb+Ql3NkW7k+ CjF1gihNTes2g2OdLMhaREbiCpJu8Icwz/vUzMpB4EjDVu9IGgsiH93z2tLNDWDGDaFX WUHvdtMw5rmyNQjRaCUCxSMHoisdzVXSfurJaQVG0/uluRuP7UKUcIRuHoKtYIzMtQ0h 8DXlvfVwiXQFgEnPu7i6hXj24XpjCMdSzWgUhamD45rFK709gc7kcUguDvaLlD456EN6 +cNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779005121; x=1779609921; 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; bh=yMtYakkWg6xW89eWo2V/gAFSemUpeEFr7/GQfm8tsfU=; b=QCrtoM3d6gsOF6Qfk/qm+Jje6xgduJQYrGzOhhZ4CMzs3PtCi6aKbjdQor5UTcnqXG 2sOjOG0V4iB0ojkhKlBOtHwm0/eCqnaa3gxtN56mU9Dq0X8xoK7LnI+kxTz8hAdDp5s2 xPM6YKczbNlKbj0NsxWca3SP90NOzvxqsqgG331wF3iF4HnBPqt3ySXeSmLUvxKwhHnP vs0pLQj1BeENaVPDVNJPGSWBkz+uvZPN/n66bGxFDKQsFEzijj92DIM63s/A1OUzce6a /VPm/2ByhDMoAjxhEnPKj6+P7LZNDqfp1AIIDw9GgEfjL7H4iEO+hny8KMI/wmKir0zw z+9g== X-Forwarded-Encrypted: i=1; AFNElJ/pBnYJbEp4w0PPhWmsn3uF8Z8rZZbgMUUrM8L3dgV40Q3VF6BBtSTeDt803HsZtZ7BhurypQfm+a4vsUM=@vger.kernel.org X-Gm-Message-State: AOJu0YyxLtz1yq2WJd6xMr27pWdkqxLElzTIwmXetDmLj6BGm2GJ64fb MSATSbIeZ5uJPtMQ2VciR0sPmMSLzd1MozHAE5+OlskMseew1QsTPrTPrdCFuMpDGZA= X-Gm-Gg: Acq92OGX4FlDAEbds/FXr7RZVve7D8GhoEwCevjlrIOXAb9cuAzlG1JaYdDVD9A267A BM6mLQvEs15uUHXF4/Lxt1rFmkjwXt4MwRbEoHQVEbJ7NFq5l919irSnFvMOknWcnmU0NTF1Uf0 CF+wUrNrF1DxTzwRfhMbhuEP8/x7UMPk4oYb35g9MoPgusd/khK2CVe+FruTJN8LOpAhwM7K7kM wizlIT8XHVMcMEEthRbtViWBBnAgCbJR8WaSRfzgFQcatoGiJVyxqRMxX8BrWHr7M6duB+z2xMM yTprbrDwtyC3PMJgggqS+I5yVBBY7ivcqPFhMxNitRV+eqZQZIycrbcCFmJqL+ZsG+e04/BgBj5 RShlyAwH+yV2AFln4G1CqHNfEEGz5S2hTapffXd8EwRjj3cYx8vuGxhFl3+xgNYlu+HT6qsXB6l +uAizzHAUEGLSk/DhvsJdruCF2zcv2YFmVJIOLiujRqIGzo6qsf62Pie4s2fAl X-Received: by 2002:a17:902:7d86:b0:2bc:7486:21cf with SMTP id d9443c01a7336-2bd7e9056dfmr70871815ad.36.1779005120658; Sun, 17 May 2026 01:05:20 -0700 (PDT) Received: from fedora.taildae27b.ts.net ([2409:4064:2d80:75ca:8541:272f:2bb3:5e55]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2bd5bd5fb17sm109834595ad.1.2026.05.17.01.05.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 17 May 2026 01:05:20 -0700 (PDT) From: Shubham Chakraborty To: Guenter Roeck , Florian Fainelli , Jonathan Corbet Cc: Shuah Khan , Broadcom internal kernel review list , Ray Jui , Scott Branden , linux-hwmon@vger.kernel.org, linux-doc@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Shubham Chakraborty Subject: [PATCH v3 3/3] hwmon: raspberrypi: Fix delayed-work teardown race Date: Sun, 17 May 2026 13:34:45 +0530 Message-ID: <20260517080445.103962-4-chakrabortyshubham66@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260517080445.103962-1-chakrabortyshubham66@gmail.com> References: <20260516164407.25255-1-chakrabortyshubham66@gmail.com> <20260517080445.103962-1-chakrabortyshubham66@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: quoted-printable Content-Type: text/plain; charset="utf-8" The delayed polling work rearms itself from the work function, so use explicit delayed-work setup and cleanup instead of devm_delayed_work_autocancel(). Initialize the delayed work with INIT_DELAYED_WORK() and register a devres cleanup action that calls disable_delayed_work_sync() during teardown. This addresses the concern raised during review about the polling work being able to requeue itself while the driver is being removed. Signed-off-by: Shubham Chakraborty --- drivers/hwmon/raspberrypi-hwmon.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/hwmon/raspberrypi-hwmon.c b/drivers/hwmon/raspberrypi-= hwmon.c index 8ce6dacc19b0..0bbc735f74a4 100644 --- a/drivers/hwmon/raspberrypi-hwmon.c +++ b/drivers/hwmon/raspberrypi-hwmon.c @@ -8,7 +8,6 @@ * Copyright (C) 2026 Shubham Chakraborty */ #include -#include #include #include #include @@ -96,6 +95,13 @@ static void get_values_poll(struct work_struct *work) schedule_delayed_work(&data->get_values_poll_work, 2 * HZ); } =20 +static void rpi_hwmon_cancel_poll_work(void *res) +{ + struct rpi_hwmon_data *data =3D res; + + disable_delayed_work_sync(&data->get_values_poll_work); +} + static int rpi_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, long *val) { @@ -237,8 +243,8 @@ static int rpi_hwmon_probe(struct platform_device *pdev) if (IS_ERR(data->hwmon_dev)) return PTR_ERR(data->hwmon_dev); =20 - ret =3D devm_delayed_work_autocancel(dev, &data->get_values_poll_work, - get_values_poll); + INIT_DELAYED_WORK(&data->get_values_poll_work, get_values_poll); + ret =3D devm_add_action_or_reset(dev, rpi_hwmon_cancel_poll_work, data); if (ret) return ret; platform_set_drvdata(pdev, data); --=20 2.54.0