These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / power / reset / zx-reboot.c
1 /*
2  * ZTE zx296702 SoC reset code
3  *
4  * Copyright (c) 2015 Linaro Ltd.
5  *
6  * Author: Jun Nie <jun.nie@linaro.org>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12
13 #include <linux/delay.h>
14 #include <linux/io.h>
15 #include <linux/module.h>
16 #include <linux/notifier.h>
17 #include <linux/of_address.h>
18 #include <linux/platform_device.h>
19 #include <linux/reboot.h>
20
21 static void __iomem *base;
22 static void __iomem *pcu_base;
23
24 static int zx_restart_handler(struct notifier_block *this,
25                               unsigned long mode, void *cmd)
26 {
27         writel_relaxed(1, base + 0xb0);
28         writel_relaxed(1, pcu_base + 0x34);
29
30         mdelay(50);
31         pr_emerg("Unable to restart system\n");
32
33         return NOTIFY_DONE;
34 }
35
36 static struct notifier_block zx_restart_nb = {
37         .notifier_call = zx_restart_handler,
38         .priority = 128,
39 };
40
41 static int zx_reboot_probe(struct platform_device *pdev)
42 {
43         struct device_node *np = pdev->dev.of_node;
44         int err;
45
46         base = of_iomap(np, 0);
47         if (!base) {
48                 WARN(1, "failed to map base address");
49                 return -ENODEV;
50         }
51
52         np = of_find_compatible_node(NULL, NULL, "zte,zx296702-pcu");
53         pcu_base = of_iomap(np, 0);
54         if (!pcu_base) {
55                 iounmap(base);
56                 WARN(1, "failed to map pcu_base address");
57                 return -ENODEV;
58         }
59
60         err = register_restart_handler(&zx_restart_nb);
61         if (err)
62                 dev_err(&pdev->dev, "Register restart handler failed(err=%d)\n",
63                         err);
64
65         return err;
66 }
67
68 static const struct of_device_id zx_reboot_of_match[] = {
69         { .compatible = "zte,sysctrl" },
70         {}
71 };
72
73 static struct platform_driver zx_reboot_driver = {
74         .probe = zx_reboot_probe,
75         .driver = {
76                 .name = "zx-reboot",
77                 .of_match_table = zx_reboot_of_match,
78         },
79 };
80 module_platform_driver(zx_reboot_driver);