From aa8baef48684dbb24a0ae200efa8492aedbdc318 Mon Sep 17 00:00:00 2001 From: Russell King Date: Fri, 25 May 2012 11:32:45 +0100 Subject: [PATCH] --- yaml --- r: 321151 b: refs/heads/master c: 5e2479bd0e0dc41f2b9f6b4345bc5d4557837056 h: refs/heads/master i: 321149: 7e1069ec6836ba3d3a7d642e4598c4a60b9f8800 321147: 5cbd489248b8b967d31e2bfec2c1955d7eef2996 321143: 9d6d597a7e879e2ada6375043589faf336effa1c 321135: 36f654cde49b409599deedf9ac318be9454e318f 321119: a27e2c58cd4cf0c4e86bf15f27b58e31fa30b4ff 321087: db7025c55fd20854e5e5ba344ff16d8dbaaf1f3c 321023: 23639312041f42b8c0506280605e457c896dac14 v: v3 --- [refs] | 2 +- trunk/drivers/dma/amba-pl08x.c | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index fb29fcc337e1..0d733bf825d6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ad0de2ac3218d372149d89d9d5c5058aca6aa29b +refs/heads/master: 5e2479bd0e0dc41f2b9f6b4345bc5d4557837056 diff --git a/trunk/drivers/dma/amba-pl08x.c b/trunk/drivers/dma/amba-pl08x.c index c203d2f22bca..ac9fdccb2c19 100644 --- a/trunk/drivers/dma/amba-pl08x.c +++ b/trunk/drivers/dma/amba-pl08x.c @@ -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,9 +328,13 @@ 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) { - pd->put_signal(plchan->cd, plchan->signal); - plchan->signal = -1; + 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; + } } }