aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/prm44xx.c
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/prm44xx.c
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/prm44xx.c')
-rw-r--r--arch/arm/mach-omap2/prm44xx.c42
1 files changed, 42 insertions, 0 deletions
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}