提交 ca68225d 编写于 作者: P Phil Elwell 提交者: Zheng Zengkai

firmware/raspberrypi: Notify firmware of a reboot

raspberrypi inclusion
category: feature
bugzilla: 50432

--------------------------------

Register for reboot notifications, sending RPI_FIRMWARE_NOTIFY_REBOOT
over the mailbox interface on reception.
Signed-off-by: NPhil Elwell <phil@raspberrypi.org>
Signed-off-by: NFang Yafen <yafen@iscas.ac.cn>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 c15be8cc
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/reboot.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <soc/bcm2835/raspberrypi-firmware.h> #include <soc/bcm2835/raspberrypi-firmware.h>
...@@ -177,6 +178,26 @@ int rpi_firmware_property(struct rpi_firmware *fw, ...@@ -177,6 +178,26 @@ int rpi_firmware_property(struct rpi_firmware *fw,
} }
EXPORT_SYMBOL_GPL(rpi_firmware_property); 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 static void
rpi_firmware_print_firmware_revision(struct rpi_firmware *fw) rpi_firmware_print_firmware_revision(struct rpi_firmware *fw)
{ {
...@@ -318,15 +339,32 @@ static struct platform_driver rpi_firmware_driver = { ...@@ -318,15 +339,32 @@ static struct platform_driver rpi_firmware_driver = {
.remove = rpi_firmware_remove, .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) 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); subsys_initcall(rpi_firmware_init);
static void __init rpi_firmware_exit(void) static void __init rpi_firmware_exit(void)
{ {
platform_driver_unregister(&rpi_firmware_driver); platform_driver_unregister(&rpi_firmware_driver);
unregister_reboot_notifier(&rpi_firmware_reboot_notifier);
} }
module_exit(rpi_firmware_exit); module_exit(rpi_firmware_exit);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册