The function sti_channel_write_trace can be run from process and interrupt context. It has to be completed before other sti_channel_write_trace calls. Prevent sdti writing when SDTI module is not initialized. Signed-off-by: Roman Tereshonkov <roman.tereshonkov@xxxxxxxxx> --- drivers/misc/sti/sdti.c | 15 ++++++++++++--- 1 files changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/misc/sti/sdti.c b/drivers/misc/sti/sdti.c index 8c27504..31780de 100644 --- a/drivers/misc/sti/sdti.c +++ b/drivers/misc/sti/sdti.c @@ -37,20 +37,25 @@ static struct clk *sdti_fck, *sdti_ick; void __iomem *sti_base, *sti_channel_base; static DEFINE_SPINLOCK(sdti_lock); +static int sdti_initialized; void sti_channel_write_trace(int len, int id, void *data, unsigned int channel) { const u8 *tpntr = data; + unsigned long flags; - spin_lock_irq(&sdti_lock); + spin_lock_irqsave(&sdti_lock, flags); + + if (unlikely(!sdti_initialized)) + goto skip; sti_channel_writeb(id, channel); while (len--) sti_channel_writeb(*tpntr++, channel); sti_channel_flush(channel); - - spin_unlock_irq(&sdti_lock); + skip: + spin_unlock_irqrestore(&sdti_lock, flags); } EXPORT_SYMBOL(sti_channel_write_trace); @@ -117,6 +122,10 @@ static int __init omap_sdti_init(void) /* Enable SDTI */ sti_writel((1 << 31) | (i & 0x3FFFFFFF), SDTI_WINCTRL); + spin_lock_irq(&sdti_lock); + sdti_initialized = 1; + spin_unlock_irq(&sdti_lock); + i = sti_readl(SDTI_REVISION); snprintf(buf, sizeof(buf), "OMAP SDTI support loaded (HW v%u.%u)\n", (i >> 4) & 0x0f, i & 0x0f); -- 1.5.5.1 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html