52 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Power off by restarting and let u-boot keep hold of the machine4 * until the user presses a button for example.5 *6 * Andrew Lunn <andrew@lunn.ch>7 *8 * Copyright (C) 2012 Andrew Lunn9 */10#include <linux/kernel.h>11#include <linux/init.h>12#include <linux/platform_device.h>13#include <linux/of_platform.h>14#include <linux/module.h>15#include <linux/reboot.h>16 17static int restart_poweroff_do_poweroff(struct sys_off_data *data)18{19 reboot_mode = REBOOT_HARD;20 machine_restart(NULL);21 return NOTIFY_DONE;22}23 24static int restart_poweroff_probe(struct platform_device *pdev)25{26 /* Set this handler to low priority to not override an existing handler */27 return devm_register_sys_off_handler(&pdev->dev,28 SYS_OFF_MODE_POWER_OFF,29 SYS_OFF_PRIO_LOW,30 restart_poweroff_do_poweroff,31 NULL);32}33 34static const struct of_device_id of_restart_poweroff_match[] = {35 { .compatible = "restart-poweroff", },36 {},37};38MODULE_DEVICE_TABLE(of, of_restart_poweroff_match);39 40static struct platform_driver restart_poweroff_driver = {41 .probe = restart_poweroff_probe,42 .driver = {43 .name = "poweroff-restart",44 .of_match_table = of_restart_poweroff_match,45 },46};47module_platform_driver(restart_poweroff_driver);48 49MODULE_AUTHOR("Andrew Lunn <andrew@lunn.ch");50MODULE_DESCRIPTION("restart poweroff driver");51MODULE_ALIAS("platform:poweroff-restart");52