From nobody Mon May 25 07:35:48 2026 Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.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 F37DB3624C4 for ; Sat, 16 May 2026 19:16:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778958979; cv=none; b=JoXx5GCsBSvCugl4UL+RaGzDVCp6MjTvcXETOnsFaU9Ln6oeByxYpvJO4vUbxkAUPK/FLCGR070DmfiWbE/SeifdDrfDZTIH9V7XtzT/ZXkpCJuezUuSjofEOEk7MhJQtdtKxbH+eTuUop8IN5WxSKBHIeHNbhhXk2Hglivc9yU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778958979; c=relaxed/simple; bh=MRPV5zUu6yyUdxum0e8Ue6sn/wJJi1vCfLPQouP7Bo4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QDtq49FmQaYDM3sm2HU419yuyUy8dsmEuSmpauwQtPi5xYp2vbTC/uD71ZwJi4uKGeSacsv4EJ2fx2/ykaS89G8HeAX6+4RqzJg/wBBh/n+x5LrVTV41q5okcLxnhJg+jVi9G2UJ9Q3E8ewobrBGu2P4XWV1AsoFpg37DoTxUVg= 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=KFt45YnW; arc=none smtp.client-ip=209.85.210.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="KFt45YnW" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-8354461da74so407385b3a.1 for ; Sat, 16 May 2026 12:16:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778958977; x=1779563777; 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=A7JFWJeo/pdX1qMY2KKRekWYJYWmJZk+1tkiUe+PVAk=; b=KFt45YnWqo7F+zO3SCctwisCK5KUv2v7So6efS5tquxDQ8MHreTLKDbvBi6Lf2axCb poHv1e+LYFW8S+InNjjBkMPqrJ9Yst7SzshdYL82J6K4e31kKZVH2Et4LYm2C7pj7RFt BCmhPsqABLteMmMQAt/6c9Tu4WbZrXaWuPEd4/XUZoWmVzXuz2LZXGcvzOyiw1sXmQMr 36HAuozw8KhfV6Vfh2QiImenGDN614iiyYxMmDMGT8DA39Zah40q5ZANUh1huUWcfYhv xkcTUkHIda5wm0jVI90eWI9xwpPPWL838atd919lHKay0hi8s0Vc4GrNKsQVpW6HQ+T5 P7cA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778958977; x=1779563777; 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=A7JFWJeo/pdX1qMY2KKRekWYJYWmJZk+1tkiUe+PVAk=; b=sxzifacoTEmDv3BKj4NNWktTl+9q+bHl+TXDrWpxuQaCLDqMo/WRTPRK8IOXF22LBg 9KTTB7IMLiHnM1UrL8ISDGbZ56Ku4hehvuBUhKkTCTITqx57e4Gdio8rOWh3WuBq88CQ OGTOMnsg+gNRWHTUoGU00xotLFF/Xm7aukKh4g4/O3GBD8jLCmt2I36Xotc0GU4+ZRm7 eFMJTDZ+p3qvHrY7RoVNbn6N4dGnlBbeax4DHs/UdUqZT2XThiKpiArXHbTlw7iT5n4K GsahrDRDQGu+XnB8mZAcij42v3Qn8hiDWU24FY9NAZ7/KKg54K0ijNwXwkvnAueQmpYM b/sw== X-Forwarded-Encrypted: i=1; AFNElJ8+20nhFbBpjIxrY13HQ5ouBGT1Epwr62+YE244c1aY3HH2/KYLV3zvRL0oaJTaM91fPWz5WZbcCXpzlC8=@vger.kernel.org X-Gm-Message-State: AOJu0YwI34b2x8JU/dtmpWtUzb2b8aBGPUyCHKXoN35cMngwEGsq3eNw qVUvHIwEM5uC+hj6JM5IgtFBDv8A5Pj62GrsRz1z9ZbbAFt8sqzhRBf6 X-Gm-Gg: Acq92OEn4Q0j7HB6JSLeCM8Egl2Fhi++Htb+NwZ2F1Wgh9JfTp8bq596HQdnFUnGlrB FYvamuav6FSc6yBCo+fK5pspKZn9rlesG9pQwNO1JQc6nQeDBcJzqG/9ls7ebTpN27s9OsiNCsu bgE6/WjGycnDYMy7ITQfvvwLzJqWUdnMuTUvUdk5jBm4bd6AMckxmymfRmxj/Qcss8SEmzWMLfm swisNFkfoIiiArp90P9EZomfKzWQZc5SgY+ytUmj2yoXBuSYRRZ+hV8QhanVQ5OU/5teagMD+2u cJSOSJ/QhuM9EZCgSECNAvQNChrz4za4hyjFvzCEIf8735wLkkJZE6mmWXMcgJwqJ1TRrsYvEf+ GNZWh6R+3FVpUTquCxyj9w/vERch2vrvQDp1jZG0PvvBR8P4Gb3h2lZSS4EdkOK/jMw2UUWKk8Q 5NszW9XCqm5w9j3Bo/n+VnxfYEdgb+BaMGMz6quGhoJP7ZMWGRx1dfYMcksQ== X-Received: by 2002:a05:6a00:44c3:b0:82c:6da7:2d3d with SMTP id d2e1a72fcca58-83f33c2a8fdmr8270653b3a.11.1778958977236; Sat, 16 May 2026 12:16:17 -0700 (PDT) Received: from fedora.taildae27b.ts.net ([2409:40e5:100a:b5ee:87c:e578:2b2e:422b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19661261sm12297625b3a.3.2026.05.16.12.16.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 May 2026 12:16:16 -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 v2 1/2] soc: bcm2835: raspberrypi-firmware: Add voltage domain IDs Date: Sun, 17 May 2026 00:45:54 +0530 Message-ID: <20260516191555.17978-2-chakrabortyshubham66@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260516191555.17978-1-chakrabortyshubham66@gmail.com> References: <20260516164407.25255-1-chakrabortyshubham66@gmail.com> <20260516191555.17978-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 firmware voltage domain identifiers for the Raspberry Pi mailbox property interface. These IDs are used by firmware clients to query voltage rails through the RPI_FIRMWARE_GET_VOLTAGE property. Signed-off-by: Shubham Chakraborty --- include/soc/bcm2835/raspberrypi-firmware.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm28= 35/raspberrypi-firmware.h index e1f87fbfe554..fd2e051ce05b 100644 --- a/include/soc/bcm2835/raspberrypi-firmware.h +++ b/include/soc/bcm2835/raspberrypi-firmware.h @@ -156,6 +156,14 @@ enum rpi_firmware_clk_id { RPI_FIRMWARE_NUM_CLK_ID, }; =20 +enum rpi_firmware_volt_id { + RPI_FIRMWARE_VOLT_ID_RESERVED =3D 0, + RPI_FIRMWARE_VOLT_ID_CORE =3D 1, + RPI_FIRMWARE_VOLT_ID_SDRAM_C =3D 2, + RPI_FIRMWARE_VOLT_ID_SDRAM_I =3D 3, + RPI_FIRMWARE_VOLT_ID_SDRAM_P =3D 4, +}; + /** * 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 07:35:48 2026 Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) (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 87EAE329C57 for ; Sat, 16 May 2026 19:16:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778958996; cv=none; b=P0HEeu8PVWMYtXB4WJHsa1kRj/gSOQTbigeIuJloO+Tf5AtZHnRoOYkMMJeBGavvwh/IEaPlczz2UCevsotLXwOisnWLxGgc8LW/5+16e4fPNnLEVmDVpwqYwTwANKfOeAB3TBdkYPnFRJtRi3//PRRzjxQoXUu2Z48O6An7ueU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778958996; c=relaxed/simple; bh=msGHrG0N31BgvzjdtZs3pUL1RS6TzKsZz51sy/aaMro=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=RAoApSAVqtG4n1dQpSRkkl8lLnEVdGkDAUHkgowK9dY8nfWdP02YS7dIfPEuOA/36cZcWUGQ1f2irng4fUIY4YluM8uABCqHUbSZFQQ9oZ+d8HHck4JCpWayTyQIQ9Haq+1wGsLjj9+EfWn5VaufBYhtse3900MuFSUg1SxtDdk= 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=QQxnoC6S; arc=none smtp.client-ip=209.85.210.173 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="QQxnoC6S" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-838d0b7c950so684212b3a.3 for ; Sat, 16 May 2026 12:16:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778958992; x=1779563792; 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=ybAe4Yq5WnbodBsCF6/CHnT6jJ3uUESQY3Wg7H337Q8=; b=QQxnoC6Sqyf8jzEwpTCoasfHOpXgMj4V1XGT4cuYZToXQNXjRSnATbmtLk5iW/zn8G eA8hT6EAfsnrAeu69wgOJpPgfmq6oO7Zh7P/9WF/KCsEc0jHfHAOsSCO8Hww+LdEo1pt wlogc5obsXauILF4FxM9RyYjVa3ftDysHJ4vlNfh1DG/sX8QSdT96UB1trW/YhmKq3iw Wr4BIxCvtYK/E2pEpKNmTzzz24ImoBC9V1/qgo12EWNnCiXbaKL9AM+OOD56AvBHrfU9 135MPvKJSS6CpNHuaPF8Mr/MeOz3rHZnEv4UIS2Lq984t0VlC4Z9ABPDiLse5tJqLERq 9cdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778958992; x=1779563792; 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=ybAe4Yq5WnbodBsCF6/CHnT6jJ3uUESQY3Wg7H337Q8=; b=DPlYZmqoPxHfEixcPqQOEpxpRQ/kgEK6MGBiao5LgI7D5PVMerL0TOoiaIUe5Tn300 OLNMiC2DkS2UL/I4Sb9tuRVquhNVE4Qx/70y3muEEwwkf9kUvJSuW/o1DPyrcphy1zXC zIVYqBDoz9slbZLuIXkqUAVHNJ5djRlhBoniab3gPJK5BvIOcB6ljUVUQnR8Vg9NeT/a Ncsl7wpM8Ji+pOBCnfUrnYcP2bIErqKzERI7pEnvCBmlSe9mZx+eBKnbvxx06tVxvtBv wBr6Hkk0HucqMwx2DHzLBFFAWDQ+9fOw5uFHtqNCnyOUhbe7s41XQOqnNoTvwmvFAsRw Tjlg== X-Forwarded-Encrypted: i=1; AFNElJ84ZYGxIDr3FLZ+2Fpqv0APH9E3spQR5NvlIwo3bcs3XZJXc3sFOq0TNSX3szh0ua/clqkIh4jdhozabVg=@vger.kernel.org X-Gm-Message-State: AOJu0YyNw0mZB9lzguuAjjKrJetkMnv7dX3PLhAgtyGJvQRi0l/RFFOV G0iTxe/icHZcKDAu5jrUdUjw8qcUheI7jtkmyV9uAdrOfCChd1/HAAew X-Gm-Gg: Acq92OEEBUWooG6cdynRnkw5P2pdyRDFMX4hsp8tOCZaSsRVTwC+8r/hR0/1Qwyt+dO ktC3kTu5lg6bBVUZ9f9E8Wzl5TaO/XxAkNB0rDmpgk3lhIQ0yhfEoMNsaRdAFj8EvI7Ah6sVrPO WxSKwUtET2/q4e2mp+DCGpEaOJDzGGK3VXNi4U3e0/uXmZ+xFRtXJu9kCq9odOh+bbLn+DB0KZH lcQA3kgIu3gzgiE/4p8omlSZJMvswyo5hS8nOjUJGK0JDvdXwWeU7PSNfnqubPnDrU7V2IY/SdB KWTTyoR2MvRjvqr25UYEoBp/NNv8qTOC/7jXu73Bk/k3ZsB1O33Ev/AKp/BYXnmYNxRx2zh04jV JuFTQLg8c62ekMOiHd/386ILnpAZU+IlnRGy3imO3jrbVnhlosJM/4jxTv9Z4L/Kbdp41mAV+nH LWohtOx1Ay29veSpxf8rMexuTu+CoCZTYbTSiZdne+yzkS2B1PFR18r9QTUPsNyNswZ3/z X-Received: by 2002:a05:6a00:340c:b0:83b:aa29:3415 with SMTP id d2e1a72fcca58-83f33cb5e9bmr9160316b3a.17.1778958991872; Sat, 16 May 2026 12:16:31 -0700 (PDT) Received: from fedora.taildae27b.ts.net ([2409:40e5:100a:b5ee:87c:e578:2b2e:422b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19661261sm12297625b3a.3.2026.05.16.12.16.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 May 2026 12:16:31 -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 v2 2/2] hwmon: raspberrypi: Add voltage input support Date: Sun, 17 May 2026 00:45:55 +0530 Message-ID: <20260516191555.17978-3-chakrabortyshubham66@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260516191555.17978-1-chakrabortyshubham66@gmail.com> References: <20260516164407.25255-1-chakrabortyshubham66@gmail.com> <20260516191555.17978-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 --- Documentation/hwmon/raspberrypi-hwmon.rst | 15 ++- drivers/hwmon/raspberrypi-hwmon.c | 134 +++++++++++++++++++++- 2 files changed, 144 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..4f96f37116f3 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 @@ -18,13 +19,26 @@ =20 #define UNDERVOLTAGE_STICKY_BIT BIT(16) =20 +struct rpi_firmware_get_value { + __le32 id; + __le32 val; +} __packed; + 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 +70,23 @@ 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_value packet; + int ret; + + packet.id =3D cpu_to_le32(id); + packet.val =3D 0; + ret =3D rpi_firmware_property(data->fw, RPI_FIRMWARE_GET_VOLTAGE, + &packet, sizeof(packet)); + if (ret) + return ret; + + *val =3D le32_to_cpu(packet.val) / 1000; + return 0; +} + static void get_values_poll(struct work_struct *work) { struct rpi_hwmon_data *data; @@ -77,19 +108,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 +207,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 +217,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 +286,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