From: Phil Elwell Date: Sat, 12 May 2018 20:35:43 +0000 (+0100) Subject: firmware/raspberrypi: Notify firmware of a reboot X-Git-Tag: accepted/tizen/unified/20190614.051536~550 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=98d8c39dadcee8c56233310412ac79f3b55ba501;p=platform%2Fkernel%2Flinux-rpi3.git 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 --- diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c index a05b00c..4575281 100644 --- a/drivers/firmware/raspberrypi.c +++ b/drivers/firmware/raspberrypi.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #define MBOX_MSG(chan, data28) (((data28) & ~0xf) | ((chan) & 0xf)) @@ -174,6 +175,26 @@ int rpi_firmware_property(struct rpi_firmware *fw, } EXPORT_SYMBOL_GPL(rpi_firmware_property); +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 rpi_firmware_print_firmware_revision(struct rpi_firmware *fw) { @@ -284,15 +305,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);