aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2012-01-14 03:49:46 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2012-01-20 12:57:35 -0500
commit98250221691f728b7cad6deed98866f8847e683f (patch)
treeb0d75ec3f7ef11545f1d79c7384bf6d3630f4a9a
parent65f2e753f1eb09d3a7e2a0d16408a5433b4097b2 (diff)
MFD: mcp-core: fix complaints from the genirq layer
The genirq layer complains if an interrupt handler returns with interrupts enabled. The UCB1x00 handler does just this, because ucb1x00_enable() calls mcp_enable(), which uses spin_lock_irq() rather than spin_lock_irqsave(). Convert this, and the divisor setting functions to use spin_lock_irqsave(). Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r--drivers/mfd/mcp-core.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/drivers/mfd/mcp-core.c b/drivers/mfd/mcp-core.c
index 84815f9ef636..86cc3f7841cd 100644
--- a/drivers/mfd/mcp-core.c
+++ b/drivers/mfd/mcp-core.c
@@ -93,9 +93,11 @@ static struct bus_type mcp_bus_type = {
93 */ 93 */
94void mcp_set_telecom_divisor(struct mcp *mcp, unsigned int div) 94void mcp_set_telecom_divisor(struct mcp *mcp, unsigned int div)
95{ 95{
96 spin_lock_irq(&mcp->lock); 96 unsigned long flags;
97
98 spin_lock_irqsave(&mcp->lock, flags);
97 mcp->ops->set_telecom_divisor(mcp, div); 99 mcp->ops->set_telecom_divisor(mcp, div);
98 spin_unlock_irq(&mcp->lock); 100 spin_unlock_irqrestore(&mcp->lock, flags);
99} 101}
100EXPORT_SYMBOL(mcp_set_telecom_divisor); 102EXPORT_SYMBOL(mcp_set_telecom_divisor);
101 103
@@ -108,9 +110,11 @@ EXPORT_SYMBOL(mcp_set_telecom_divisor);
108 */ 110 */
109void mcp_set_audio_divisor(struct mcp *mcp, unsigned int div) 111void mcp_set_audio_divisor(struct mcp *mcp, unsigned int div)
110{ 112{
111 spin_lock_irq(&mcp->lock); 113 unsigned long flags;
114
115 spin_lock_irqsave(&mcp->lock, flags);
112 mcp->ops->set_audio_divisor(mcp, div); 116 mcp->ops->set_audio_divisor(mcp, div);
113 spin_unlock_irq(&mcp->lock); 117 spin_unlock_irqrestore(&mcp->lock, flags);
114} 118}
115EXPORT_SYMBOL(mcp_set_audio_divisor); 119EXPORT_SYMBOL(mcp_set_audio_divisor);
116 120
@@ -163,10 +167,11 @@ EXPORT_SYMBOL(mcp_reg_read);
163 */ 167 */
164void mcp_enable(struct mcp *mcp) 168void mcp_enable(struct mcp *mcp)
165{ 169{
166 spin_lock_irq(&mcp->lock); 170 unsigned long flags;
171 spin_lock_irqsave(&mcp->lock, flags);
167 if (mcp->use_count++ == 0) 172 if (mcp->use_count++ == 0)
168 mcp->ops->enable(mcp); 173 mcp->ops->enable(mcp);
169 spin_unlock_irq(&mcp->lock); 174 spin_unlock_irqrestore(&mcp->lock, flags);
170} 175}
171EXPORT_SYMBOL(mcp_enable); 176EXPORT_SYMBOL(mcp_enable);
172 177