1 | // SPDX-License-Identifier: GPL-2.0-only |
---|---|
2 | /* |
3 | * omap2-restart.c - code common to all OMAP2xxx machines. |
4 | * |
5 | * Copyright (C) 2012 Texas Instruments |
6 | * Paul Walmsley |
7 | */ |
8 | #include <linux/kernel.h> |
9 | #include <linux/init.h> |
10 | #include <linux/clk.h> |
11 | #include <linux/io.h> |
12 | |
13 | #include "soc.h" |
14 | #include "common.h" |
15 | #include "prm.h" |
16 | |
17 | /* |
18 | * reset_virt_prcm_set_ck, reset_sys_ck: pointers to the virt_prcm_set |
19 | * clock and the sys_ck. Used during the reset process |
20 | */ |
21 | static struct clk *reset_virt_prcm_set_ck, *reset_sys_ck; |
22 | |
23 | /* Reboot handling */ |
24 | |
25 | /** |
26 | * omap2xxx_restart - Set DPLL to bypass mode for reboot to work |
27 | * |
28 | * Set the DPLL to bypass so that reboot completes successfully. No |
29 | * return value. |
30 | */ |
31 | void omap2xxx_restart(enum reboot_mode mode, const char *cmd) |
32 | { |
33 | u32 rate; |
34 | |
35 | rate = clk_get_rate(clk: reset_sys_ck); |
36 | clk_set_rate(clk: reset_virt_prcm_set_ck, rate); |
37 | |
38 | /* XXX Should save the cmd argument for use after the reboot */ |
39 | |
40 | omap_prm_reset_system(); |
41 | } |
42 | |
43 | /** |
44 | * omap2xxx_common_look_up_clks_for_reset - look up clocks needed for restart |
45 | * |
46 | * Some clocks need to be looked up in advance for the SoC restart |
47 | * operation to work - see omap2xxx_restart(). Returns -EINVAL upon |
48 | * error or 0 upon success. |
49 | */ |
50 | static int __init omap2xxx_common_look_up_clks_for_reset(void) |
51 | { |
52 | reset_virt_prcm_set_ck = clk_get(NULL, id: "virt_prcm_set"); |
53 | if (IS_ERR(ptr: reset_virt_prcm_set_ck)) |
54 | return -EINVAL; |
55 | |
56 | reset_sys_ck = clk_get(NULL, id: "sys_ck"); |
57 | if (IS_ERR(ptr: reset_sys_ck)) |
58 | return -EINVAL; |
59 | |
60 | return 0; |
61 | } |
62 | omap_postcore_initcall(omap2xxx_common_look_up_clks_for_reset); |
63 |