mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			89 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 39f45c408ab8f9cc9b9980f165e62eb92293b927 Mon Sep 17 00:00:00 2001
 | 
						|
From: Phil Elwell <phil@raspberrypi.org>
 | 
						|
Date: Sat, 12 May 2018 21:35:43 +0100
 | 
						|
Subject: [PATCH 334/340] firmware/raspberrypi: Notify firmware of a reboot
 | 
						|
 | 
						|
Register for reboot notifications, sending RPI_FIRMWARE_NOTIFY_REBOOT
 | 
						|
over the mailbox interface on reception.
 | 
						|
 | 
						|
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 | 
						|
---
 | 
						|
 drivers/firmware/raspberrypi.c | 40 +++++++++++++++++++++++++++++++++++++++-
 | 
						|
 1 file changed, 39 insertions(+), 1 deletion(-)
 | 
						|
 | 
						|
diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c
 | 
						|
index d1943a7e68cf..a82819a78f53 100644
 | 
						|
--- a/drivers/firmware/raspberrypi.c
 | 
						|
+++ b/drivers/firmware/raspberrypi.c
 | 
						|
@@ -14,6 +14,7 @@
 | 
						|
 #include <linux/module.h>
 | 
						|
 #include <linux/of_platform.h>
 | 
						|
 #include <linux/platform_device.h>
 | 
						|
+#include <linux/reboot.h>
 | 
						|
 #include <linux/workqueue.h>
 | 
						|
 #include <soc/bcm2835/raspberrypi-firmware.h>
 | 
						|
 
 | 
						|
@@ -275,6 +276,26 @@ static int rpi_firmware_get_throttled(struct rpi_firmware *fw, u32 *value)
 | 
						|
 	return 0;
 | 
						|
 }
 | 
						|
 
 | 
						|
+static int rpi_firmware_notify_reboot(struct notifier_block *nb,
 | 
						|
+				      unsigned long action,
 | 
						|
+				      void *data)
 | 
						|
+{
 | 
						|
+	struct rpi_firmware *fw;
 | 
						|
+	struct platform_device *pdev = g_pdev;
 | 
						|
+
 | 
						|
+	if (!pdev)
 | 
						|
+		return 0;
 | 
						|
+
 | 
						|
+	fw = platform_get_drvdata(pdev);
 | 
						|
+	if (!fw)
 | 
						|
+		return 0;
 | 
						|
+
 | 
						|
+	(void)rpi_firmware_property(fw, RPI_FIRMWARE_NOTIFY_REBOOT,
 | 
						|
+				    0, 0);
 | 
						|
+
 | 
						|
+	return 0;
 | 
						|
+}
 | 
						|
+
 | 
						|
 static void get_throttled_poll(struct work_struct *work)
 | 
						|
 {
 | 
						|
 	struct rpi_firmware *fw = container_of(work, struct rpi_firmware,
 | 
						|
@@ -416,15 +437,32 @@ static struct platform_driver rpi_firmware_driver = {
 | 
						|
 	.remove		= rpi_firmware_remove,
 | 
						|
 };
 | 
						|
 
 | 
						|
+static struct notifier_block rpi_firmware_reboot_notifier = {
 | 
						|
+	.notifier_call = rpi_firmware_notify_reboot,
 | 
						|
+};
 | 
						|
+
 | 
						|
 static int __init rpi_firmware_init(void)
 | 
						|
 {
 | 
						|
-	return platform_driver_register(&rpi_firmware_driver);
 | 
						|
+	int ret = register_reboot_notifier(&rpi_firmware_reboot_notifier);
 | 
						|
+	if (ret)
 | 
						|
+		goto out1;
 | 
						|
+	ret = platform_driver_register(&rpi_firmware_driver);
 | 
						|
+	if (ret)
 | 
						|
+		goto out2;
 | 
						|
+
 | 
						|
+	return 0;
 | 
						|
+
 | 
						|
+out2:
 | 
						|
+	unregister_reboot_notifier(&rpi_firmware_reboot_notifier);
 | 
						|
+out1:
 | 
						|
+	return ret;
 | 
						|
 }
 | 
						|
 subsys_initcall(rpi_firmware_init);
 | 
						|
 
 | 
						|
 static void __init rpi_firmware_exit(void)
 | 
						|
 {
 | 
						|
 	platform_driver_unregister(&rpi_firmware_driver);
 | 
						|
+	unregister_reboot_notifier(&rpi_firmware_reboot_notifier);
 | 
						|
 }
 | 
						|
 module_exit(rpi_firmware_exit);
 | 
						|
 
 | 
						|
-- 
 | 
						|
2.16.1
 | 
						|
 |