mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Triet Hoang <triet.hoang.dev@gmail.com>
To: Florian Fainelli <florian.fainelli@broadcom.com>
Cc: Broadcom internal kernel review list
	<bcm-kernel-feedback-list@broadcom.com>,
	linux-rpi-kernel@lists.infradead.org,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, Stefan Wahren <wahrenst@gmx.net>,
	Triet Hoang <triet.hoang.dev@gmail.com>
Subject: [PATCH 1/2] firmware: raspberrypi: Handle device registration errors
Date: Sat, 19 Sep 2026 03:48:39 +0000	[thread overview]
Message-ID: <20260919034840.28593-2-triet.hoang.dev@gmail.com> (raw)
In-Reply-To: <20260919034840.28593-1-triet.hoang.dev@gmail.com>

Check the return value of platform_device_register_data() when
registering the hwmon and clock devices. Propagate registration failures
to the firmware probe instead of silently ignoring them.

Use local platform device pointers so the global pointers are only
updated after successful registration. If clock registration fails,
unregister the previously registered hwmon device before releasing the
firmware instance.

Keep the existing behavior of skipping hwmon registration when the
RPI_FIRMWARE_GET_THROTTLED request fails.

Fixes: 70eea1bbb556 ("firmware: raspberrypi: Register hwmon driver")
Fixes: 91f2cf4a6b21 ("firmware: raspberrypi: register clk device")
Signed-off-by: Triet Hoang <triet.hoang.dev@gmail.com>
---
 drivers/firmware/raspberrypi.c | 57 ++++++++++++++++++++++++++--------
 1 file changed, 44 insertions(+), 13 deletions(-)

diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c
index 0aa322e9a2e7..88c3de9ce67a 100644
--- a/drivers/firmware/raspberrypi.c
+++ b/drivers/firmware/raspberrypi.c
@@ -197,22 +197,31 @@ rpi_firmware_print_firmware_revision(struct rpi_firmware *fw)
 	dev_info(fw->cl.dev, "Attached to firmware from %ptT\n", &date_and_time);
 }
 
-static void
+static int
 rpi_register_hwmon_driver(struct device *dev, struct rpi_firmware *fw)
 {
+	struct platform_device *pdev;
 	u32 packet;
-	int ret = rpi_firmware_property(fw, RPI_FIRMWARE_GET_THROTTLED,
-					&packet, sizeof(packet));
+	int ret;
 
+	ret = rpi_firmware_property(fw, RPI_FIRMWARE_GET_THROTTLED,
+				    &packet, sizeof(packet));
 	if (ret)
-		return;
+		return 0;
+
+	pdev = platform_device_register_data(dev, "raspberrypi-hwmon",
+					     -1, NULL, 0);
+	if (IS_ERR(pdev))
+		return PTR_ERR(pdev);
 
-	rpi_hwmon = platform_device_register_data(dev, "raspberrypi-hwmon",
-						  -1, NULL, 0);
+	rpi_hwmon = pdev;
+
+	return 0;
 }
 
-static void rpi_register_clk_driver(struct device *dev)
+static int rpi_register_clk_driver(struct device *dev)
 {
+	struct platform_device *pdev;
 	struct device_node *firmware;
 
 	/*
@@ -224,11 +233,17 @@ static void rpi_register_clk_driver(struct device *dev)
 					   "raspberrypi,firmware-clocks");
 	if (firmware) {
 		of_node_put(firmware);
-		return;
+		return 0;
 	}
 
-	rpi_clk = platform_device_register_data(dev, "raspberrypi-clk",
-						-1, NULL, 0);
+	pdev = platform_device_register_data(dev, "raspberrypi-clk",
+					     -1, NULL, 0);
+	if (IS_ERR(pdev))
+		return PTR_ERR(pdev);
+
+	rpi_clk = pdev;
+
+	return 0;
 }
 
 unsigned int rpi_firmware_clk_get_max_rate(struct rpi_firmware *fw, unsigned int id)
@@ -277,6 +292,7 @@ static int rpi_firmware_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
 	struct rpi_firmware *fw;
+	int ret;
 
 	/*
 	 * Memory will be freed by rpi_firmware_delete() once all users have
@@ -292,7 +308,7 @@ static int rpi_firmware_probe(struct platform_device *pdev)
 
 	fw->chan = mbox_request_channel(&fw->cl, 0);
 	if (IS_ERR(fw->chan)) {
-		int ret = PTR_ERR(fw->chan);
+		ret = PTR_ERR(fw->chan);
 		kfree(fw);
 		return dev_err_probe(dev, ret, "Failed to get mbox channel\n");
 	}
@@ -303,10 +319,25 @@ static int rpi_firmware_probe(struct platform_device *pdev)
 	platform_set_drvdata(pdev, fw);
 
 	rpi_firmware_print_firmware_revision(fw);
-	rpi_register_hwmon_driver(dev, fw);
-	rpi_register_clk_driver(dev);
+
+	ret = rpi_register_hwmon_driver(dev, fw);
+	if (ret)
+		goto err_put_fw;
+
+	ret = rpi_register_clk_driver(dev);
+	if (ret)
+		goto err_unregister_hwmon;
 
 	return 0;
+
+err_unregister_hwmon:
+	platform_device_unregister(rpi_hwmon);
+	rpi_hwmon = NULL;
+err_put_fw:
+	platform_set_drvdata(pdev, NULL);
+	rpi_firmware_put(fw);
+
+	return ret;
 }
 
 static void rpi_firmware_shutdown(struct platform_device *pdev)
-- 
2.53.0


  reply	other threads:[~2026-09-19  3:49 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-19  3:48 [PATCH 0/2] " Triet Hoang
2026-09-19  3:48 ` Triet Hoang [this message]
2026-09-19 16:05   ` [PATCH 1/2] " Stefan Wahren
2026-09-19  3:48 ` [PATCH 2/2] firmware: raspberrypi: Clean up local formatting Triet Hoang
2026-09-19 16:06   ` Stefan Wahren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260919034840.28593-2-triet.hoang.dev@gmail.com \
    --to=triet.hoang.dev@gmail.com \
    --cc=bcm-kernel-feedback-list@broadcom.com \
    --cc=florian.fainelli@broadcom.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rpi-kernel@lists.infradead.org \
    --cc=wahrenst@gmx.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®