ARM: OMAP2+: board files: use SoC-specific system restart functions
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-omap2 / prcm.c
1 /*
2  * linux/arch/arm/mach-omap2/prcm.c
3  *
4  * OMAP 24xx Power Reset and Clock Management (PRCM) functions
5  *
6  * Copyright (C) 2005 Nokia Corporation
7  *
8  * Written by Tony Lindgren <tony.lindgren@nokia.com>
9  *
10  * Copyright (C) 2007 Texas Instruments, Inc.
11  * Rajendra Nayak <rnayak@ti.com>
12  *
13  * Some pieces of code Copyright (C) 2005 Texas Instruments, Inc.
14  * Upgraded with OMAP4 support by Abhijit Pagare <abhijitpagare@ti.com>
15  *
16  * This program is free software; you can redistribute it and/or modify
17  * it under the terms of the GNU General Public License version 2 as
18  * published by the Free Software Foundation.
19  */
20
21 #include <linux/kernel.h>
22 #include <linux/init.h>
23 #include <linux/clk.h>
24 #include <linux/io.h>
25 #include <linux/delay.h>
26 #include <linux/export.h>
27
28 #include "common.h"
29 #include <plat/prcm.h>
30
31 #include "soc.h"
32 #include "clock.h"
33 #include "clock2xxx.h"
34 #include "cm2xxx_3xxx.h"
35 #include "prm2xxx_3xxx.h"
36 #include "prm44xx.h"
37 #include "prminst44xx.h"
38 #include "cminst44xx.h"
39 #include "prm-regbits-24xx.h"
40 #include "prm-regbits-44xx.h"
41 #include "control.h"
42
43 void __iomem *prm_base;
44 void __iomem *cm_base;
45 void __iomem *cm2_base;
46 void __iomem *prcm_mpu_base;
47
48 #define MAX_MODULE_ENABLE_WAIT          100000
49
50 /**
51  * omap2_cm_wait_idlest - wait for IDLEST bit to indicate module readiness
52  * @reg: physical address of module IDLEST register
53  * @mask: value to mask against to determine if the module is active
54  * @idlest: idle state indicator (0 or 1) for the clock
55  * @name: name of the clock (for printk)
56  *
57  * Returns 1 if the module indicated readiness in time, or 0 if it
58  * failed to enable in roughly MAX_MODULE_ENABLE_WAIT microseconds.
59  *
60  * XXX This function is deprecated.  It should be removed once the
61  * hwmod conversion is complete.
62  */
63 int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, u8 idlest,
64                                 const char *name)
65 {
66         int i = 0;
67         int ena = 0;
68
69         if (idlest)
70                 ena = 0;
71         else
72                 ena = mask;
73
74         /* Wait for lock */
75         omap_test_timeout(((__raw_readl(reg) & mask) == ena),
76                           MAX_MODULE_ENABLE_WAIT, i);
77
78         if (i < MAX_MODULE_ENABLE_WAIT)
79                 pr_debug("cm: Module associated with clock %s ready after %d loops\n",
80                          name, i);
81         else
82                 pr_err("cm: Module associated with clock %s didn't enable in %d tries\n",
83                        name, MAX_MODULE_ENABLE_WAIT);
84
85         return (i < MAX_MODULE_ENABLE_WAIT) ? 1 : 0;
86 };
87
88 void __init omap2_set_globals_prcm(void __iomem *prm, void __iomem *cm,
89                                    void __iomem *cm2, void __iomem *prcm_mpu)
90 {
91         prm_base = prm;
92         cm_base = cm;
93         cm2_base = cm2;
94         prcm_mpu_base = prcm_mpu;
95
96         if (cpu_is_omap44xx() || soc_is_omap54xx()) {
97                 omap_prm_base_init();
98                 omap_cm_base_init();
99         }
100 }
101
102 /*
103  * Stubbed functions so that common files continue to build when
104  * custom builds are used
105  * XXX These are temporary and should be removed at the earliest possible
106  * opportunity
107  */
108 int __weak omap4_cminst_wait_module_idle(u8 part, u16 inst, s16 cdoffs,
109                                         u16 clkctrl_offs)
110 {
111         return 0;
112 }
113
114 void __weak omap4_cminst_module_enable(u8 mode, u8 part, u16 inst,
115                                 s16 cdoffs, u16 clkctrl_offs)
116 {
117 }
118
119 void __weak omap4_cminst_module_disable(u8 part, u16 inst, s16 cdoffs,
120                                  u16 clkctrl_offs)
121 {
122 }