omap: McBSP: Fix possible port lockout
In its current form, the omap_mcbsp_request() function can return after irq_request() failure without any cleanups, effectively locking out the port forever with clocks left running. Fix it. Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl> Acked-by: Jarkko Nikula <jhnikula@gmail.com> Acked-by: Peter Ujfalusi <peter.ujfalusi@nokia.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
This commit is contained in:
parent
74d2e4f8d7
commit
1866b54525
|
@ -436,7 +436,7 @@ int omap_mcbsp_request(unsigned int id)
|
||||||
dev_err(mcbsp->dev, "Unable to request TX IRQ %d "
|
dev_err(mcbsp->dev, "Unable to request TX IRQ %d "
|
||||||
"for McBSP%d\n", mcbsp->tx_irq,
|
"for McBSP%d\n", mcbsp->tx_irq,
|
||||||
mcbsp->id);
|
mcbsp->id);
|
||||||
return err;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
init_completion(&mcbsp->rx_irq_completion);
|
init_completion(&mcbsp->rx_irq_completion);
|
||||||
|
@ -446,12 +446,26 @@ int omap_mcbsp_request(unsigned int id)
|
||||||
dev_err(mcbsp->dev, "Unable to request RX IRQ %d "
|
dev_err(mcbsp->dev, "Unable to request RX IRQ %d "
|
||||||
"for McBSP%d\n", mcbsp->rx_irq,
|
"for McBSP%d\n", mcbsp->rx_irq,
|
||||||
mcbsp->id);
|
mcbsp->id);
|
||||||
free_irq(mcbsp->tx_irq, (void *)mcbsp);
|
goto tx_irq;
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
tx_irq:
|
||||||
|
free_irq(mcbsp->tx_irq, (void *)mcbsp);
|
||||||
|
error:
|
||||||
|
if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free)
|
||||||
|
mcbsp->pdata->ops->free(id);
|
||||||
|
|
||||||
|
/* Do procedure specific to omap34xx arch, if applicable */
|
||||||
|
omap34xx_mcbsp_free(mcbsp);
|
||||||
|
|
||||||
|
clk_disable(mcbsp->fclk);
|
||||||
|
clk_disable(mcbsp->iclk);
|
||||||
|
|
||||||
|
mcbsp->free = 1;
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(omap_mcbsp_request);
|
EXPORT_SYMBOL(omap_mcbsp_request);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue