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>
This commit is contained in:
parent
65f2e753f1
commit
9825022169
1 changed files with 11 additions and 6 deletions
|
@ -93,9 +93,11 @@ static struct bus_type mcp_bus_type = {
|
|||
*/
|
||||
void mcp_set_telecom_divisor(struct mcp *mcp, unsigned int div)
|
||||
{
|
||||
spin_lock_irq(&mcp->lock);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&mcp->lock, flags);
|
||||
mcp->ops->set_telecom_divisor(mcp, div);
|
||||
spin_unlock_irq(&mcp->lock);
|
||||
spin_unlock_irqrestore(&mcp->lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(mcp_set_telecom_divisor);
|
||||
|
||||
|
@ -108,9 +110,11 @@ EXPORT_SYMBOL(mcp_set_telecom_divisor);
|
|||
*/
|
||||
void mcp_set_audio_divisor(struct mcp *mcp, unsigned int div)
|
||||
{
|
||||
spin_lock_irq(&mcp->lock);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&mcp->lock, flags);
|
||||
mcp->ops->set_audio_divisor(mcp, div);
|
||||
spin_unlock_irq(&mcp->lock);
|
||||
spin_unlock_irqrestore(&mcp->lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(mcp_set_audio_divisor);
|
||||
|
||||
|
@ -163,10 +167,11 @@ EXPORT_SYMBOL(mcp_reg_read);
|
|||
*/
|
||||
void mcp_enable(struct mcp *mcp)
|
||||
{
|
||||
spin_lock_irq(&mcp->lock);
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&mcp->lock, flags);
|
||||
if (mcp->use_count++ == 0)
|
||||
mcp->ops->enable(mcp);
|
||||
spin_unlock_irq(&mcp->lock);
|
||||
spin_unlock_irqrestore(&mcp->lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(mcp_enable);
|
||||
|
||||
|
|
Loading…
Reference in a new issue