root/drivers/power/reset/hisi-reboot.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. hisi_restart_handler
  2. hisi_reboot_probe

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * Hisilicon SoC reset code
   4  *
   5  * Copyright (c) 2014 Hisilicon Ltd.
   6  * Copyright (c) 2014 Linaro Ltd.
   7  *
   8  * Author: Haojian Zhuang <haojian.zhuang@linaro.org>
   9  */
  10 
  11 #include <linux/delay.h>
  12 #include <linux/io.h>
  13 #include <linux/module.h>
  14 #include <linux/notifier.h>
  15 #include <linux/of_address.h>
  16 #include <linux/platform_device.h>
  17 #include <linux/reboot.h>
  18 
  19 #include <asm/proc-fns.h>
  20 
  21 static void __iomem *base;
  22 static u32 reboot_offset;
  23 
  24 static int hisi_restart_handler(struct notifier_block *this,
  25                                 unsigned long mode, void *cmd)
  26 {
  27         writel_relaxed(0xdeadbeef, base + reboot_offset);
  28 
  29         while (1)
  30                 cpu_do_idle();
  31 
  32         return NOTIFY_DONE;
  33 }
  34 
  35 static struct notifier_block hisi_restart_nb = {
  36         .notifier_call = hisi_restart_handler,
  37         .priority = 128,
  38 };
  39 
  40 static int hisi_reboot_probe(struct platform_device *pdev)
  41 {
  42         struct device_node *np = pdev->dev.of_node;
  43         int err;
  44 
  45         base = of_iomap(np, 0);
  46         if (!base) {
  47                 WARN(1, "failed to map base address");
  48                 return -ENODEV;
  49         }
  50 
  51         if (of_property_read_u32(np, "reboot-offset", &reboot_offset) < 0) {
  52                 pr_err("failed to find reboot-offset property\n");
  53                 iounmap(base);
  54                 return -EINVAL;
  55         }
  56 
  57         err = register_restart_handler(&hisi_restart_nb);
  58         if (err) {
  59                 dev_err(&pdev->dev, "cannot register restart handler (err=%d)\n",
  60                         err);
  61                 iounmap(base);
  62         }
  63 
  64         return err;
  65 }
  66 
  67 static const struct of_device_id hisi_reboot_of_match[] = {
  68         { .compatible = "hisilicon,sysctrl" },
  69         {}
  70 };
  71 
  72 static struct platform_driver hisi_reboot_driver = {
  73         .probe = hisi_reboot_probe,
  74         .driver = {
  75                 .name = "hisi-reboot",
  76                 .of_match_table = hisi_reboot_of_match,
  77         },
  78 };
  79 module_platform_driver(hisi_reboot_driver);

/* [<][>][^][v][top][bottom][index][help] */