diff options
-rw-r--r-- | arch/arm/mach-omap2/prm2xxx_3xxx.c | 34 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prm2xxx_3xxx.h | 7 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prm44xx.c | 42 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prm44xx.h | 6 |
4 files changed, 86 insertions, 3 deletions
diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.c b/arch/arm/mach-omap2/prm2xxx_3xxx.c index f02d87f68e54..177c3ddba788 100644 --- a/arch/arm/mach-omap2/prm2xxx_3xxx.c +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * OMAP2/3 PRM module functions | 2 | * OMAP2/3 PRM module functions |
3 | * | 3 | * |
4 | * Copyright (C) 2010 Texas Instruments, Inc. | 4 | * Copyright (C) 2010-2011 Texas Instruments, Inc. |
5 | * Copyright (C) 2010 Nokia Corporation | 5 | * Copyright (C) 2010 Nokia Corporation |
6 | * Benoît Cousson | 6 | * Benoît Cousson |
7 | * Paul Walmsley | 7 | * Paul Walmsley |
@@ -212,3 +212,35 @@ u32 omap3_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset) | |||
212 | { | 212 | { |
213 | return omap2_prm_rmw_mod_reg_bits(mask, bits, OMAP3430_GR_MOD, offset); | 213 | return omap2_prm_rmw_mod_reg_bits(mask, bits, OMAP3430_GR_MOD, offset); |
214 | } | 214 | } |
215 | |||
216 | /** | ||
217 | * omap3xxx_prm_read_pending_irqs - read pending PRM MPU IRQs into @events | ||
218 | * @events: ptr to a u32, preallocated by caller | ||
219 | * | ||
220 | * Read PRM_IRQSTATUS_MPU bits, AND'ed with the currently-enabled PRM | ||
221 | * MPU IRQs, and store the result into the u32 pointed to by @events. | ||
222 | * No return value. | ||
223 | */ | ||
224 | void omap3xxx_prm_read_pending_irqs(unsigned long *events) | ||
225 | { | ||
226 | u32 mask, st; | ||
227 | |||
228 | /* XXX Can the mask read be avoided (e.g., can it come from RAM?) */ | ||
229 | mask = omap2_prm_read_mod_reg(OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET); | ||
230 | st = omap2_prm_read_mod_reg(OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | ||
231 | |||
232 | events[0] = mask & st; | ||
233 | } | ||
234 | |||
235 | /** | ||
236 | * omap3xxx_prm_ocp_barrier - force buffered MPU writes to the PRM to complete | ||
237 | * | ||
238 | * Force any buffered writes to the PRM IP block to complete. Needed | ||
239 | * by the PRM IRQ handler, which reads and writes directly to the IP | ||
240 | * block, to avoid race conditions after acknowledging or clearing IRQ | ||
241 | * bits. No return value. | ||
242 | */ | ||
243 | void omap3xxx_prm_ocp_barrier(void) | ||
244 | { | ||
245 | omap2_prm_read_mod_reg(OCP_MOD, OMAP3_PRM_REVISION_OFFSET); | ||
246 | } | ||
diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.h b/arch/arm/mach-omap2/prm2xxx_3xxx.h index cef533df0861..3ef0e77ff936 100644 --- a/arch/arm/mach-omap2/prm2xxx_3xxx.h +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * OMAP2/3 Power/Reset Management (PRM) register definitions | 2 | * OMAP2/3 Power/Reset Management (PRM) register definitions |
3 | * | 3 | * |
4 | * Copyright (C) 2007-2009 Texas Instruments, Inc. | 4 | * Copyright (C) 2007-2009, 2011 Texas Instruments, Inc. |
5 | * Copyright (C) 2008-2010 Nokia Corporation | 5 | * Copyright (C) 2008-2010 Nokia Corporation |
6 | * Paul Walmsley | 6 | * Paul Walmsley |
7 | * | 7 | * |
@@ -314,6 +314,11 @@ void omap3_prm_vp_clear_txdone(u8 vp_id); | |||
314 | extern u32 omap3_prm_vcvp_read(u8 offset); | 314 | extern u32 omap3_prm_vcvp_read(u8 offset); |
315 | extern void omap3_prm_vcvp_write(u32 val, u8 offset); | 315 | extern void omap3_prm_vcvp_write(u32 val, u8 offset); |
316 | extern u32 omap3_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset); | 316 | extern u32 omap3_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset); |
317 | |||
318 | /* PRM interrupt-related functions */ | ||
319 | extern void omap3xxx_prm_read_pending_irqs(unsigned long *events); | ||
320 | extern void omap3xxx_prm_ocp_barrier(void); | ||
321 | |||
317 | #endif /* CONFIG_ARCH_OMAP4 */ | 322 | #endif /* CONFIG_ARCH_OMAP4 */ |
318 | 323 | ||
319 | #endif | 324 | #endif |
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index 495a31a7e8a7..9b21154f0162 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c | |||
@@ -121,3 +121,45 @@ u32 omap4_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset) | |||
121 | OMAP4430_PRM_DEVICE_INST, | 121 | OMAP4430_PRM_DEVICE_INST, |
122 | offset); | 122 | offset); |
123 | } | 123 | } |
124 | |||
125 | static inline u32 _read_pending_irq_reg(u16 irqen_offs, u16 irqst_offs) | ||
126 | { | ||
127 | u32 mask, st; | ||
128 | |||
129 | /* XXX read mask from RAM? */ | ||
130 | mask = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, irqen_offs); | ||
131 | st = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, irqst_offs); | ||
132 | |||
133 | return mask & st; | ||
134 | } | ||
135 | |||
136 | /** | ||
137 | * omap44xx_prm_read_pending_irqs - read pending PRM MPU IRQs into @events | ||
138 | * @events: ptr to two consecutive u32s, preallocated by caller | ||
139 | * | ||
140 | * Read PRM_IRQSTATUS_MPU* bits, AND'ed with the currently-enabled PRM | ||
141 | * MPU IRQs, and store the result into the two u32s pointed to by @events. | ||
142 | * No return value. | ||
143 | */ | ||
144 | void omap44xx_prm_read_pending_irqs(unsigned long *events) | ||
145 | { | ||
146 | events[0] = _read_pending_irq_reg(OMAP4_PRM_IRQENABLE_MPU_OFFSET, | ||
147 | OMAP4_PRM_IRQSTATUS_MPU_OFFSET); | ||
148 | |||
149 | events[1] = _read_pending_irq_reg(OMAP4_PRM_IRQENABLE_MPU_2_OFFSET, | ||
150 | OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET); | ||
151 | } | ||
152 | |||
153 | /** | ||
154 | * omap44xx_prm_ocp_barrier - force buffered MPU writes to the PRM to complete | ||
155 | * | ||
156 | * Force any buffered writes to the PRM IP block to complete. Needed | ||
157 | * by the PRM IRQ handler, which reads and writes directly to the IP | ||
158 | * block, to avoid race conditions after acknowledging or clearing IRQ | ||
159 | * bits. No return value. | ||
160 | */ | ||
161 | void omap44xx_prm_ocp_barrier(void) | ||
162 | { | ||
163 | omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, | ||
164 | OMAP4_REVISION_PRM_OFFSET); | ||
165 | } | ||
diff --git a/arch/arm/mach-omap2/prm44xx.h b/arch/arm/mach-omap2/prm44xx.h index 3d66ccd849d2..bd7f2486e8b6 100644 --- a/arch/arm/mach-omap2/prm44xx.h +++ b/arch/arm/mach-omap2/prm44xx.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * OMAP44xx PRM instance offset macros | 2 | * OMAP44xx PRM instance offset macros |
3 | * | 3 | * |
4 | * Copyright (C) 2009-2010 Texas Instruments, Inc. | 4 | * Copyright (C) 2009-2011 Texas Instruments, Inc. |
5 | * Copyright (C) 2009-2010 Nokia Corporation | 5 | * Copyright (C) 2009-2010 Nokia Corporation |
6 | * | 6 | * |
7 | * Paul Walmsley (paul@pwsan.com) | 7 | * Paul Walmsley (paul@pwsan.com) |
@@ -763,6 +763,10 @@ extern u32 omap4_prm_vcvp_read(u8 offset); | |||
763 | extern void omap4_prm_vcvp_write(u32 val, u8 offset); | 763 | extern void omap4_prm_vcvp_write(u32 val, u8 offset); |
764 | extern u32 omap4_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset); | 764 | extern u32 omap4_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset); |
765 | 765 | ||
766 | /* PRM interrupt-related functions */ | ||
767 | extern void omap44xx_prm_read_pending_irqs(unsigned long *events); | ||
768 | extern void omap44xx_prm_ocp_barrier(void); | ||
769 | |||
766 | # endif | 770 | # endif |
767 | 771 | ||
768 | #endif | 772 | #endif |