aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2
diff options
context:
space:
mode:
authorPaul Walmsley <paul@pwsan.com>2011-12-16 16:36:58 -0500
committerPaul Walmsley <paul@pwsan.com>2011-12-16 16:36:58 -0500
commit26c98c561c02f3c08fd6182d16de0c2857d0644c (patch)
tree72a2ea8b6ae05dd35e17420073b3c0f83c024659 /arch/arm/mach-omap2
parenteceec00914e3a74b94eea832f9e829c3efcea9bc (diff)
ARM: OMAP3/4: PRM: add functions to read pending IRQs, PRM barrier
Add PRM functions to test for pending PRM IRQs. This will be used in a subsequent patch to implement the PRM interrupt handler on the MPU. Add PRM functions to ensure that all outstanding writes from the MPU to the PRM IP block have completed before continuing execution. This will be used in a subsequent patch to ensure that all PRM interrupt status bits are cleared in the hardware before exiting the ISR. Normally we would not expose such a low-level function to other code. But the current implementation of the PRM interrupt code, which uses the generic IRQ chip code, doesn't give us a choice. The pending PRM IRQ functions are based on code originally written by Tero Kristo <t-kristo@ti.com>. Signed-off-by: Paul Walmsley <paul@pwsan.com> Cc: Tero Kristo <t-kristo@ti.com>
Diffstat (limited to 'arch/arm/mach-omap2')
-rw-r--r--arch/arm/mach-omap2/prm2xxx_3xxx.c34
-rw-r--r--arch/arm/mach-omap2/prm2xxx_3xxx.h7
-rw-r--r--arch/arm/mach-omap2/prm44xx.c42
-rw-r--r--arch/arm/mach-omap2/prm44xx.h6
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 */
224void 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 */
243void 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);
314extern u32 omap3_prm_vcvp_read(u8 offset); 314extern u32 omap3_prm_vcvp_read(u8 offset);
315extern void omap3_prm_vcvp_write(u32 val, u8 offset); 315extern void omap3_prm_vcvp_write(u32 val, u8 offset);
316extern u32 omap3_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset); 316extern u32 omap3_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset);
317
318/* PRM interrupt-related functions */
319extern void omap3xxx_prm_read_pending_irqs(unsigned long *events);
320extern 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
125static 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 */
144void 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 */
161void 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);
763extern void omap4_prm_vcvp_write(u32 val, u8 offset); 763extern void omap4_prm_vcvp_write(u32 val, u8 offset);
764extern u32 omap4_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset); 764extern u32 omap4_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset);
765 765
766/* PRM interrupt-related functions */
767extern void omap44xx_prm_read_pending_irqs(unsigned long *events);
768extern void omap44xx_prm_ocp_barrier(void);
769
766# endif 770# endif
767 771
768#endif 772#endif