From: Amelie Delaunay <amelie.delaunay@foss.st.com>
To: Vinod Koul <vkoul@kernel.org>,
Maxime Coquelin <mcoquelin.stm32@gmail.com>,
Alexandre Torgue <alexandre.torgue@foss.st.com>
Cc: <dmaengine@vger.kernel.org>,
<linux-stm32@st-md-mailman.stormreply.com>,
<linux-arm-kernel@lists.infradead.org>,
<linux-kernel@vger.kernel.org>,
Amelie Delaunay <amelie.delaunay@foss.st.com>
Subject: [PATCH 2/4] dmaengine: stm32-dma3: introduce channel semaphore helpers
Date: Mon, 3 Nov 2025 11:15:11 +0100 [thread overview]
Message-ID: <20251103-dma3_improv-v1-2-57f048bf2877@foss.st.com> (raw)
In-Reply-To: <20251103-dma3_improv-v1-0-57f048bf2877@foss.st.com>
Before restoring semaphore status after suspend, introduce new functions
to handle semaphore operations :
- stm32_dma3_get_chan_sem() to take the semaphore
- stm32_dma3_put_chan_sem() to release the semaphore
Also, use a new boolean variable semaphore_taken, which is true when the
semaphore has been taken and false when it has been released.
Signed-off-by: Amelie Delaunay <amelie.delaunay@foss.st.com>
---
drivers/dma/stm32/stm32-dma3.c | 55 +++++++++++++++++++++++++++++++++---------
1 file changed, 44 insertions(+), 11 deletions(-)
diff --git a/drivers/dma/stm32/stm32-dma3.c b/drivers/dma/stm32/stm32-dma3.c
index 9500164c8f68..a1583face7ec 100644
--- a/drivers/dma/stm32/stm32-dma3.c
+++ b/drivers/dma/stm32/stm32-dma3.c
@@ -288,6 +288,7 @@ struct stm32_dma3_chan {
u32 fifo_size;
u32 max_burst;
bool semaphore_mode;
+ bool semaphore_taken;
struct stm32_dma3_dt_conf dt_config;
struct dma_slave_config dma_config;
u8 config_set;
@@ -1063,11 +1064,50 @@ static irqreturn_t stm32_dma3_chan_irq(int irq, void *devid)
return IRQ_HANDLED;
}
+static int stm32_dma3_get_chan_sem(struct stm32_dma3_chan *chan)
+{
+ struct stm32_dma3_ddata *ddata = to_stm32_dma3_ddata(chan);
+ u32 csemcr, ccid;
+
+ csemcr = readl_relaxed(ddata->base + STM32_DMA3_CSEMCR(chan->id));
+ /* Make an attempt to take the channel semaphore if not already taken */
+ if (!(csemcr & CSEMCR_SEM_MUTEX)) {
+ writel_relaxed(CSEMCR_SEM_MUTEX, ddata->base + STM32_DMA3_CSEMCR(chan->id));
+ csemcr = readl_relaxed(ddata->base + STM32_DMA3_CSEMCR(chan->id));
+ }
+
+ /* Check if channel is under CID1 control */
+ ccid = FIELD_GET(CSEMCR_SEM_CCID, csemcr);
+ if (!(csemcr & CSEMCR_SEM_MUTEX) || ccid != CCIDCFGR_CID1)
+ goto bad_cid;
+
+ chan->semaphore_taken = true;
+ dev_dbg(chan2dev(chan), "under CID1 control (semcr=0x%08x)\n", csemcr);
+
+ return 0;
+
+bad_cid:
+ chan->semaphore_taken = false;
+ dev_err(chan2dev(chan), "not under CID1 control (in-use by CID%d)\n", ccid);
+
+ return -EACCES;
+}
+
+static void stm32_dma3_put_chan_sem(struct stm32_dma3_chan *chan)
+{
+ struct stm32_dma3_ddata *ddata = to_stm32_dma3_ddata(chan);
+
+ if (chan->semaphore_taken) {
+ writel_relaxed(0, ddata->base + STM32_DMA3_CSEMCR(chan->id));
+ chan->semaphore_taken = false;
+ dev_dbg(chan2dev(chan), "no more under CID1 control\n");
+ }
+}
+
static int stm32_dma3_alloc_chan_resources(struct dma_chan *c)
{
struct stm32_dma3_chan *chan = to_stm32_dma3_chan(c);
struct stm32_dma3_ddata *ddata = to_stm32_dma3_ddata(chan);
- u32 id = chan->id, csemcr, ccid;
int ret;
ret = pm_runtime_resume_and_get(ddata->dma_dev.dev);
@@ -1092,16 +1132,9 @@ static int stm32_dma3_alloc_chan_resources(struct dma_chan *c)
/* Take the channel semaphore */
if (chan->semaphore_mode) {
- writel_relaxed(CSEMCR_SEM_MUTEX, ddata->base + STM32_DMA3_CSEMCR(id));
- csemcr = readl_relaxed(ddata->base + STM32_DMA3_CSEMCR(id));
- ccid = FIELD_GET(CSEMCR_SEM_CCID, csemcr);
- /* Check that the channel is well taken */
- if (ccid != CCIDCFGR_CID1) {
- dev_err(chan2dev(chan), "Not under CID1 control (in-use by CID%d)\n", ccid);
- ret = -EPERM;
+ ret = stm32_dma3_get_chan_sem(chan);
+ if (ret)
goto err_pool_destroy;
- }
- dev_dbg(chan2dev(chan), "Under CID1 control (semcr=0x%08x)\n", csemcr);
}
return 0;
@@ -1135,7 +1168,7 @@ static void stm32_dma3_free_chan_resources(struct dma_chan *c)
/* Release the channel semaphore */
if (chan->semaphore_mode)
- writel_relaxed(0, ddata->base + STM32_DMA3_CSEMCR(chan->id));
+ stm32_dma3_put_chan_sem(chan);
pm_runtime_put_sync(ddata->dma_dev.dev);
--
2.43.0
next prev parent reply other threads:[~2025-11-03 10:15 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-03 10:15 [PATCH 0/4] dmaengine: stm32-dma3: improvements and helper functions Amelie Delaunay
2025-11-03 10:15 ` [PATCH 1/4] dmaengine: stm32-dma3: use module_platform_driver Amelie Delaunay
2025-11-03 10:15 ` Amelie Delaunay [this message]
2025-11-03 10:15 ` [PATCH 3/4] dmaengine: stm32-dma3: restore channel semaphore status after suspend Amelie Delaunay
2025-11-03 10:15 ` [PATCH 4/4] dmaengine: stm32-dma3: introduce ddata2dev helper Amelie Delaunay
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251103-dma3_improv-v1-2-57f048bf2877@foss.st.com \
--to=amelie.delaunay@foss.st.com \
--cc=alexandre.torgue@foss.st.com \
--cc=dmaengine@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-stm32@st-md-mailman.stormreply.com \
--cc=mcoquelin.stm32@gmail.com \
--cc=vkoul@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).