Commit | Line | Data |
---|---|---|
b824efae TL |
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 | * Some pieces of code Copyright (C) 2005 Texas Instruments, Inc. | |
11 | * | |
12 | * This program is free software; you can redistribute it and/or modify | |
13 | * it under the terms of the GNU General Public License version 2 as | |
14 | * published by the Free Software Foundation. | |
15 | */ | |
b824efae TL |
16 | #include <linux/module.h> |
17 | #include <linux/init.h> | |
18 | #include <linux/clk.h> | |
a58caad1 | 19 | #include <linux/io.h> |
b824efae | 20 | |
a09e64fb RK |
21 | #include <mach/common.h> |
22 | #include <mach/prcm.h> | |
44595982 | 23 | |
a58caad1 | 24 | #include "clock.h" |
44595982 PW |
25 | #include "prm.h" |
26 | #include "prm-regbits-24xx.h" | |
b824efae | 27 | |
a58caad1 TL |
28 | static void __iomem *prm_base; |
29 | static void __iomem *cm_base; | |
30 | ||
b824efae TL |
31 | u32 omap_prcm_get_reset_sources(void) |
32 | { | |
ff00fcc9 | 33 | /* XXX This presumably needs modification for 34XX */ |
44595982 | 34 | return prm_read_mod_reg(WKUP_MOD, RM_RSTST) & 0x7f; |
b824efae TL |
35 | } |
36 | EXPORT_SYMBOL(omap_prcm_get_reset_sources); | |
37 | ||
38 | /* Resets clock rates and reboots the system. Only called from system.h */ | |
39 | void omap_prcm_arch_reset(char mode) | |
40 | { | |
ff00fcc9 | 41 | s16 prcm_offs; |
ae78dcf7 | 42 | omap2_clk_prepare_for_reboot(); |
44595982 | 43 | |
ff00fcc9 TL |
44 | if (cpu_is_omap24xx()) |
45 | prcm_offs = WKUP_MOD; | |
46 | else if (cpu_is_omap34xx()) | |
47 | prcm_offs = OMAP3430_GR_MOD; | |
48 | else | |
49 | WARN_ON(1); | |
50 | ||
51 | prm_set_mod_reg_bits(OMAP_RST_DPLL3, prcm_offs, RM_RSTCTRL); | |
b824efae | 52 | } |
a58caad1 TL |
53 | |
54 | static inline u32 __omap_prcm_read(void __iomem *base, s16 module, u16 reg) | |
55 | { | |
56 | BUG_ON(!base); | |
57 | return __raw_readl(base + module + reg); | |
58 | } | |
59 | ||
60 | static inline void __omap_prcm_write(u32 value, void __iomem *base, | |
61 | s16 module, u16 reg) | |
62 | { | |
63 | BUG_ON(!base); | |
64 | __raw_writel(value, base + module + reg); | |
65 | } | |
66 | ||
67 | /* Read a register in a PRM module */ | |
68 | u32 prm_read_mod_reg(s16 module, u16 idx) | |
69 | { | |
70 | return __omap_prcm_read(prm_base, module, idx); | |
71 | } | |
72 | EXPORT_SYMBOL(prm_read_mod_reg); | |
73 | ||
74 | /* Write into a register in a PRM module */ | |
75 | void prm_write_mod_reg(u32 val, s16 module, u16 idx) | |
76 | { | |
77 | __omap_prcm_write(val, prm_base, module, idx); | |
78 | } | |
79 | EXPORT_SYMBOL(prm_write_mod_reg); | |
80 | ||
ff00fcc9 TL |
81 | /* Read-modify-write a register in a PRM module. Caller must lock */ |
82 | u32 prm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx) | |
83 | { | |
84 | u32 v; | |
85 | ||
86 | v = prm_read_mod_reg(module, idx); | |
87 | v &= ~mask; | |
88 | v |= bits; | |
89 | prm_write_mod_reg(v, module, idx); | |
90 | ||
91 | return v; | |
92 | } | |
93 | EXPORT_SYMBOL(prm_rmw_mod_reg_bits); | |
94 | ||
a58caad1 TL |
95 | /* Read a register in a CM module */ |
96 | u32 cm_read_mod_reg(s16 module, u16 idx) | |
97 | { | |
98 | return __omap_prcm_read(cm_base, module, idx); | |
99 | } | |
100 | EXPORT_SYMBOL(cm_read_mod_reg); | |
101 | ||
102 | /* Write into a register in a CM module */ | |
103 | void cm_write_mod_reg(u32 val, s16 module, u16 idx) | |
104 | { | |
105 | __omap_prcm_write(val, cm_base, module, idx); | |
106 | } | |
107 | EXPORT_SYMBOL(cm_write_mod_reg); | |
108 | ||
ff00fcc9 TL |
109 | /* Read-modify-write a register in a CM module. Caller must lock */ |
110 | u32 cm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx) | |
111 | { | |
112 | u32 v; | |
113 | ||
114 | v = cm_read_mod_reg(module, idx); | |
115 | v &= ~mask; | |
116 | v |= bits; | |
117 | cm_write_mod_reg(v, module, idx); | |
118 | ||
119 | return v; | |
120 | } | |
121 | EXPORT_SYMBOL(cm_rmw_mod_reg_bits); | |
122 | ||
a58caad1 TL |
123 | void __init omap2_set_globals_prcm(struct omap_globals *omap2_globals) |
124 | { | |
125 | prm_base = omap2_globals->prm; | |
126 | cm_base = omap2_globals->cm; | |
127 | } |