diff options
Diffstat (limited to 'target/linux/brcm2708/patches-4.14/950-0303-firmware-raspberrypi-Notify-firmware-of-a-reboot.patch')
-rw-r--r-- | target/linux/brcm2708/patches-4.14/950-0303-firmware-raspberrypi-Notify-firmware-of-a-reboot.patch | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/target/linux/brcm2708/patches-4.14/950-0303-firmware-raspberrypi-Notify-firmware-of-a-reboot.patch b/target/linux/brcm2708/patches-4.14/950-0303-firmware-raspberrypi-Notify-firmware-of-a-reboot.patch new file mode 100644 index 0000000000..09a2f68c15 --- /dev/null +++ b/target/linux/brcm2708/patches-4.14/950-0303-firmware-raspberrypi-Notify-firmware-of-a-reboot.patch @@ -0,0 +1,84 @@ +From ae200d1bf8417e24ae3445092d75fc10dd7319b7 Mon Sep 17 00:00:00 2001 +From: Phil Elwell <phil@raspberrypi.org> +Date: Sat, 12 May 2018 21:35:43 +0100 +Subject: [PATCH 303/454] 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(-) + +--- 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(st + 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_firmwa + .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); + |