Skip to content

Commit 2450ce2

Browse files
committed
dma_mcux_edma: Extract dmamux code to helpers
Extract and group dmamux related code together for readability. Signed-off-by: Declan Snyder <[email protected]>
1 parent ebb69e6 commit 2450ce2

File tree

1 file changed

+42
-38
lines changed

1 file changed

+42
-38
lines changed

drivers/dma/dma_mcux_edma.c

Lines changed: 42 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,45 @@ static void dma_mcux_edma_multi_channels_irq_handler(const struct device *dev, u
272272
}
273273
#endif
274274

275+
#if defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT
276+
static void edma_configure_dmamux(const struct device *dev, uint32_t channel,
277+
struct dma_config *config, edma_transfer_type_t transfer_type)
278+
{
279+
uint32_t slot = config->dma_slot;
280+
uint8_t dmamux_idx, dmamux_channel;
281+
282+
dmamux_idx = DEV_DMAMUX_IDX(dev, channel);
283+
dmamux_channel = DEV_DMAMUX_CHANNEL(dev, channel);
284+
285+
#if DT_INST_PROP(0, nxp_a_on)
286+
if (config->source_handshake || config->dest_handshake ||
287+
transfer_type == kEDMA_MemoryToMemory) {
288+
/*software trigger make the channel always on*/
289+
LOG_DBG("ALWAYS ON");
290+
DMAMUX_EnableAlwaysOn(DEV_DMAMUX_BASE(dev, dmamux_idx), dmamux_channel, true);
291+
} else {
292+
DMAMUX_SetSource(DEV_DMAMUX_BASE(dev, dmamux_idx), dmamux_channel, slot);
293+
}
294+
#else
295+
DMAMUX_SetSource(DEV_DMAMUX_BASE(dev, dmamux_idx), dmamux_channel, slot);
296+
#endif /* nxp_a_on */
297+
298+
/* dam_imx_rt_set_channel_priority(dev, channel, config); */
299+
DMAMUX_EnableChannel(DEV_DMAMUX_BASE(dev, dmamux_idx), dmamux_channel);
300+
}
301+
302+
static void edma_log_dmamux(const struct device *dev, uint32_t channel)
303+
{
304+
uint8_t dmamux_idx = DEV_DMAMUX_IDX(dev, channel);
305+
uint8_t dmamux_channel = DEV_DMAMUX_CHANNEL(dev, channel);
306+
307+
LOG_DBG("DMAMUX CHCFG 0x%x", DEV_DMAMUX_BASE(dev, dmamux_idx)->CHCFG[dmamux_channel]);
308+
}
309+
#else
310+
#define edma_configure_dmamux(...)
311+
#define edma_log_dmamux(...)
312+
#endif /* FSL_FEATURE_SOC_DMA_MUX_COUNT */
313+
275314
static int dma_mcux_edma_configure_sg_loop(const struct device *dev,
276315
uint32_t channel,
277316
struct dma_config *config,
@@ -438,7 +477,6 @@ static int dma_mcux_edma_configure_basic(const struct device *dev,
438477
return ret;
439478
}
440479

441-
442480
/* Configure a channel */
443481
static int dma_mcux_edma_configure(const struct device *dev, uint32_t channel,
444482
struct dma_config *config)
@@ -468,12 +506,6 @@ static int dma_mcux_edma_configure(const struct device *dev, uint32_t channel,
468506
return -EINVAL;
469507
}
470508

471-
#if defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT
472-
uint8_t dmamux_idx, dmamux_channel;
473-
474-
dmamux_idx = DEV_DMAMUX_IDX(dev, channel);
475-
dmamux_channel = DEV_DMAMUX_CHANNEL(dev, channel);
476-
#endif
477509
data->transfer_settings.valid = false;
478510

479511
switch (config->channel_direction) {
@@ -523,25 +555,7 @@ static int dma_mcux_edma_configure(const struct device *dev, uint32_t channel,
523555
/* Lock and page in the channel configuration */
524556
key = irq_lock();
525557

526-
#if defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT
527-
528-
#if DT_INST_PROP(0, nxp_a_on)
529-
if (config->source_handshake || config->dest_handshake ||
530-
transfer_type == kEDMA_MemoryToMemory) {
531-
/*software trigger make the channel always on*/
532-
LOG_DBG("ALWAYS ON");
533-
DMAMUX_EnableAlwaysOn(DEV_DMAMUX_BASE(dev, dmamux_idx), dmamux_channel, true);
534-
} else {
535-
DMAMUX_SetSource(DEV_DMAMUX_BASE(dev, dmamux_idx), dmamux_channel, slot);
536-
}
537-
#else
538-
DMAMUX_SetSource(DEV_DMAMUX_BASE(dev, dmamux_idx), dmamux_channel, slot);
539-
#endif
540-
541-
/* dam_imx_rt_set_channel_priority(dev, channel, config); */
542-
DMAMUX_EnableChannel(DEV_DMAMUX_BASE(dev, dmamux_idx), dmamux_channel);
543-
544-
#endif
558+
edma_configure_dmamux(dev, channel, config, transfer_type);
545559

546560
if (data->busy) {
547561
EDMA_AbortTransfer(p_handle);
@@ -603,12 +617,7 @@ static int dma_mcux_edma_start(const struct device *dev, uint32_t channel)
603617

604618
LOG_DBG("START TRANSFER");
605619

606-
#if defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT
607-
uint8_t dmamux_idx = DEV_DMAMUX_IDX(dev, channel);
608-
uint8_t dmamux_channel = DEV_DMAMUX_CHANNEL(dev, channel);
609-
610-
LOG_DBG("DMAMUX CHCFG 0x%x", DEV_DMAMUX_BASE(dev, dmamux_idx)->CHCFG[dmamux_channel]);
611-
#endif
620+
edma_log_dmamux(dev, channel);
612621

613622
#if !defined(CONFIG_DMA_MCUX_EDMA_V3) && !defined(CONFIG_DMA_MCUX_EDMA_V4) \
614623
&& !defined(CONFIG_DMA_MCUX_EDMA_V5)
@@ -857,12 +866,7 @@ static int dma_mcux_edma_get_status(const struct device *dev, uint32_t channel,
857866
}
858867
status->dir = DEV_CHANNEL_DATA(dev, channel)->transfer_settings.direction;
859868

860-
#if defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT
861-
uint8_t dmamux_idx = DEV_DMAMUX_IDX(dev, channel);
862-
uint8_t dmamux_channel = DEV_DMAMUX_CHANNEL(dev, channel);
863-
864-
LOG_DBG("DMAMUX CHCFG 0x%x", DEV_DMAMUX_BASE(dev, dmamux_idx)->CHCFG[dmamux_channel]);
865-
#endif
869+
edma_log_dmamux(dev, channel);
866870

867871
#if defined(CONFIG_DMA_MCUX_EDMA_V3) || defined(CONFIG_DMA_MCUX_EDMA_V4)
868872
LOG_DBG("DMA MP_CSR 0x%x", DEV_BASE(dev)->MP_CSR);

0 commit comments

Comments
 (0)