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

Commit 5e2479bd authored by Russell King's avatar Russell King
Browse files

dmaengine: PL08x: track mux usage on a per-channel basis.



Keep track of the number of descriptors currently using a MUX setting
on a per-channel basis.  This allows us to know when we have descriptors
queued somewhere which have been assigned a DMA request signal.

Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Tested-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent ad0de2ac
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -227,6 +227,7 @@ enum pl08x_dma_chan_state {
 * @waiting: a TX descriptor on this channel which is waiting for a physical
 * channel to become available
 * @signal: the physical DMA request signal which this channel is using
 * @mux_use: count of descriptors using this DMA request signal setting
 */
struct pl08x_dma_chan {
	struct dma_chan chan;
@@ -244,6 +245,7 @@ struct pl08x_dma_chan {
	bool slave;
	struct pl08x_txd *waiting;
	int signal;
	unsigned mux_use;
};

/**
@@ -310,10 +312,12 @@ static int pl08x_request_mux(struct pl08x_dma_chan *plchan)
	const struct pl08x_platform_data *pd = plchan->host->pd;
	int ret;

	if (pd->get_signal) {
	if (plchan->mux_use++ == 0 && pd->get_signal) {
		ret = pd->get_signal(plchan->cd);
		if (ret < 0)
		if (ret < 0) {
			plchan->mux_use = 0;
			return ret;
		}

		plchan->signal = ret;
	}
@@ -324,11 +328,15 @@ static void pl08x_release_mux(struct pl08x_dma_chan *plchan)
{
	const struct pl08x_platform_data *pd = plchan->host->pd;

	if (plchan->signal >= 0 && pd->put_signal) {
	if (plchan->signal >= 0) {
		WARN_ON(plchan->mux_use == 0);

		if (--plchan->mux_use == 0 && pd->put_signal) {
			pd->put_signal(plchan->cd, plchan->signal);
			plchan->signal = -1;
		}
	}
}

/*
 * Physical channel handling