Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1866b545 authored by Janusz Krzysztofik's avatar Janusz Krzysztofik Committed by Tony Lindgren
Browse files

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: default avatarJanusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Acked-by: default avatarJarkko Nikula <jhnikula@gmail.com>
Acked-by: default avatarPeter Ujfalusi <peter.ujfalusi@nokia.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 74d2e4f8
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -436,7 +436,7 @@ int omap_mcbsp_request(unsigned int id)
			dev_err(mcbsp->dev, "Unable to request TX IRQ %d "
					"for McBSP%d\n", mcbsp->tx_irq,
					mcbsp->id);
			return err;
			goto error;
		}

		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 "
					"for McBSP%d\n", mcbsp->rx_irq,
					mcbsp->id);
			free_irq(mcbsp->tx_irq, (void *)mcbsp);
			return err;
			goto tx_irq;
		}
	}

	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);