* [PATCHv2 1/4] dma: fsl_raid: convert descriptor stores to big-endian
2026-07-16 20:29 [PATCHv2 0/4] dma: fsl_raid: fix sparse warnings and simplify probing Rosen Penev
@ 2026-07-16 20:29 ` Rosen Penev
2026-07-16 20:49 ` Frank Li
2026-07-16 20:29 ` [PATCHv2 2/4] dma: fsl_raid: set final bit via fill_cfd_frame() argument Rosen Penev
` (2 subsequent siblings)
3 siblings, 1 reply; 8+ messages in thread
From: Rosen Penev @ 2026-07-16 20:29 UTC (permalink / raw)
To: dmaengine; +Cc: Vinod Koul, Frank Li, open list
The descriptor structs (fsl_re_cmpnd_frame / fsl_re_hw_desc) are
in-memory but their fields are __be32, because the structures are handed
to the device as big-endian. The driver stored CPU-endian u32 values
into them directly, which is both wrong (the engine would see
byte-swapped lengths/addresses) and flagged by sparse as a base-type
mismatch.
Wrap those stores in cpu_to_be32() so the values are little->big
converted.
Reported-by: kernel test robot <lkp@intel.com>
Fixes: https://lore.kernel.org/oe-kbuild-all/202008111749.yy85rFMD%25lkp@intel.com/
Assisted-by: opencode:hy3-free
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsl_raid.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/drivers/dma/fsl_raid.c b/drivers/dma/fsl_raid.c
index 99945845d8b5..2778d07a05e8 100644
--- a/drivers/dma/fsl_raid.c
+++ b/drivers/dma/fsl_raid.c
@@ -242,9 +242,9 @@ static void fill_cfd_frame(struct fsl_re_cmpnd_frame *cf, u8 index,
u32 efrl = length & FSL_RE_CF_LENGTH_MASK;
efrl |= final << FSL_RE_CF_FINAL_SHIFT;
- cf[index].efrl32 = efrl;
- cf[index].addr_high = upper_32_bits(addr);
- cf[index].addr_low = lower_32_bits(addr);
+ cf[index].efrl32 = cpu_to_be32(efrl);
+ cf[index].addr_high = cpu_to_be32(upper_32_bits(addr));
+ cf[index].addr_low = cpu_to_be32(lower_32_bits(addr));
}
static struct fsl_re_desc *fsl_re_init_desc(struct fsl_re_chan *re_chan,
@@ -256,9 +256,10 @@ static struct fsl_re_desc *fsl_re_init_desc(struct fsl_re_chan *re_chan,
dma_async_tx_descriptor_init(&desc->async_tx, &re_chan->chan);
INIT_LIST_HEAD(&desc->node);
- desc->hwdesc.fmt32 = FSL_RE_FRAME_FORMAT << FSL_RE_HWDESC_FMT_SHIFT;
- desc->hwdesc.lbea32 = upper_32_bits(paddr);
- desc->hwdesc.addr_low = lower_32_bits(paddr);
+ desc->hwdesc.fmt32 = cpu_to_be32(FSL_RE_FRAME_FORMAT <<
+ FSL_RE_HWDESC_FMT_SHIFT);
+ desc->hwdesc.lbea32 = cpu_to_be32(upper_32_bits(paddr));
+ desc->hwdesc.addr_low = cpu_to_be32(lower_32_bits(paddr));
desc->cf_addr = cf;
desc->cf_paddr = paddr;
--
2.55.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCHv2 1/4] dma: fsl_raid: convert descriptor stores to big-endian
2026-07-16 20:29 ` [PATCHv2 1/4] dma: fsl_raid: convert descriptor stores to big-endian Rosen Penev
@ 2026-07-16 20:49 ` Frank Li
0 siblings, 0 replies; 8+ messages in thread
From: Frank Li @ 2026-07-16 20:49 UTC (permalink / raw)
To: Rosen Penev; +Cc: dmaengine, Vinod Koul, Frank Li, open list
On Thu, Jul 16, 2026 at 01:29:46PM -0700, Rosen Penev wrote:
> The descriptor structs (fsl_re_cmpnd_frame / fsl_re_hw_desc) are
> in-memory but their fields are __be32, because the structures are handed
> to the device as big-endian. The driver stored CPU-endian u32 values
> into them directly, which is both wrong (the engine would see
> byte-swapped lengths/addresses) and flagged by sparse as a base-type
> mismatch.
>
> Wrap those stores in cpu_to_be32() so the values are little->big
> converted.
>
> Reported-by: kernel test robot <lkp@intel.com>
> Fixes: https://lore.kernel.org/oe-kbuild-all/202008111749.yy85rFMD%25lkp@intel.com/
> Assisted-by: opencode:hy3-free
> Signed-off-by: Rosen Penev <rosenp@gmail.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> drivers/dma/fsl_raid.c | 13 +++++++------
> 1 file changed, 7 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/dma/fsl_raid.c b/drivers/dma/fsl_raid.c
> index 99945845d8b5..2778d07a05e8 100644
> --- a/drivers/dma/fsl_raid.c
> +++ b/drivers/dma/fsl_raid.c
> @@ -242,9 +242,9 @@ static void fill_cfd_frame(struct fsl_re_cmpnd_frame *cf, u8 index,
> u32 efrl = length & FSL_RE_CF_LENGTH_MASK;
>
> efrl |= final << FSL_RE_CF_FINAL_SHIFT;
> - cf[index].efrl32 = efrl;
> - cf[index].addr_high = upper_32_bits(addr);
> - cf[index].addr_low = lower_32_bits(addr);
> + cf[index].efrl32 = cpu_to_be32(efrl);
> + cf[index].addr_high = cpu_to_be32(upper_32_bits(addr));
> + cf[index].addr_low = cpu_to_be32(lower_32_bits(addr));
> }
>
> static struct fsl_re_desc *fsl_re_init_desc(struct fsl_re_chan *re_chan,
> @@ -256,9 +256,10 @@ static struct fsl_re_desc *fsl_re_init_desc(struct fsl_re_chan *re_chan,
> dma_async_tx_descriptor_init(&desc->async_tx, &re_chan->chan);
> INIT_LIST_HEAD(&desc->node);
>
> - desc->hwdesc.fmt32 = FSL_RE_FRAME_FORMAT << FSL_RE_HWDESC_FMT_SHIFT;
> - desc->hwdesc.lbea32 = upper_32_bits(paddr);
> - desc->hwdesc.addr_low = lower_32_bits(paddr);
> + desc->hwdesc.fmt32 = cpu_to_be32(FSL_RE_FRAME_FORMAT <<
> + FSL_RE_HWDESC_FMT_SHIFT);
> + desc->hwdesc.lbea32 = cpu_to_be32(upper_32_bits(paddr));
> + desc->hwdesc.addr_low = cpu_to_be32(lower_32_bits(paddr));
> desc->cf_addr = cf;
> desc->cf_paddr = paddr;
>
> --
> 2.55.0
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCHv2 2/4] dma: fsl_raid: set final bit via fill_cfd_frame() argument
2026-07-16 20:29 [PATCHv2 0/4] dma: fsl_raid: fix sparse warnings and simplify probing Rosen Penev
2026-07-16 20:29 ` [PATCHv2 1/4] dma: fsl_raid: convert descriptor stores to big-endian Rosen Penev
@ 2026-07-16 20:29 ` Rosen Penev
2026-07-16 20:57 ` Frank Li
2026-07-16 20:29 ` [PATCHv2 3/4] dma: fsl_raid: keep MMIO bases as void __iomem and cast at access Rosen Penev
2026-07-16 20:29 ` [PATCHv2 4/4] dma: fsl_raid: use devm_platform_ioremap_resource Rosen Penev
3 siblings, 1 reply; 8+ messages in thread
From: Rosen Penev @ 2026-07-16 20:29 UTC (permalink / raw)
To: dmaengine; +Cc: Vinod Koul, Frank Li, open list
The final-frame bit is now passed as the "final" argument of
fill_cfd_frame() (as fsl_re_prep_dma_memcpy already did) and set in CPU
order before the single cpu_to_be32() store, replacing the previous
read-modify-write of the __be32 efrl32 field.
Assisted-by: opencode:hy3-free
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsl_raid.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/drivers/dma/fsl_raid.c b/drivers/dma/fsl_raid.c
index 2778d07a05e8..888f55b672a5 100644
--- a/drivers/dma/fsl_raid.c
+++ b/drivers/dma/fsl_raid.c
@@ -375,11 +375,11 @@ static struct dma_async_tx_descriptor *fsl_re_prep_dma_genq(
for (i = 2, j = 0; j < save_src_cnt; i++, j++)
fill_cfd_frame(cf, i, len, src[j], 0);
+ /* Fill the last frame and mark it final */
if (cont_q)
- fill_cfd_frame(cf, i++, len, dest, 0);
-
- /* Setting the final bit in the last source buffer frame in CFD */
- cf[i - 1].efrl32 |= 1 << FSL_RE_CF_FINAL_SHIFT;
+ fill_cfd_frame(cf, i, len, dest, 1);
+ else
+ fill_cfd_frame(cf, i - 1, len, src[j - 1], 1);
return &desc->async_tx;
}
@@ -505,16 +505,16 @@ static struct dma_async_tx_descriptor *fsl_re_prep_dma_pq(
p[save_src_cnt + 2] = 1;
fill_cfd_frame(cf, i++, len, dest[0], 0);
fill_cfd_frame(cf, i++, len, dest[1], 0);
- fill_cfd_frame(cf, i++, len, dest[1], 0);
+ fill_cfd_frame(cf, i++, len, dest[1], 1);
} else {
dev_err(re_chan->dev, "PQ tx continuation error!\n");
return NULL;
}
+ } else {
+ /* Mark the last source buffer frame final */
+ fill_cfd_frame(cf, i - 1, len, src[j - 1], 1);
}
- /* Setting the final bit in the last source buffer frame in CFD */
- cf[i - 1].efrl32 |= 1 << FSL_RE_CF_FINAL_SHIFT;
-
return &desc->async_tx;
}
--
2.55.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCHv2 2/4] dma: fsl_raid: set final bit via fill_cfd_frame() argument
2026-07-16 20:29 ` [PATCHv2 2/4] dma: fsl_raid: set final bit via fill_cfd_frame() argument Rosen Penev
@ 2026-07-16 20:57 ` Frank Li
0 siblings, 0 replies; 8+ messages in thread
From: Frank Li @ 2026-07-16 20:57 UTC (permalink / raw)
To: Rosen Penev; +Cc: dmaengine, Vinod Koul, Frank Li, open list
On Thu, Jul 16, 2026 at 01:29:47PM -0700, Rosen Penev wrote:
> The final-frame bit is now passed as the "final" argument of
> fill_cfd_frame() (as fsl_re_prep_dma_memcpy already did) and set in CPU
> order before the single cpu_to_be32() store, replacing the previous
> read-modify-write of the __be32 efrl32 field.
>
> Assisted-by: opencode:hy3-free
> Signed-off-by: Rosen Penev <rosenp@gmail.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> drivers/dma/fsl_raid.c | 16 ++++++++--------
> 1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/dma/fsl_raid.c b/drivers/dma/fsl_raid.c
> index 2778d07a05e8..888f55b672a5 100644
> --- a/drivers/dma/fsl_raid.c
> +++ b/drivers/dma/fsl_raid.c
> @@ -375,11 +375,11 @@ static struct dma_async_tx_descriptor *fsl_re_prep_dma_genq(
> for (i = 2, j = 0; j < save_src_cnt; i++, j++)
> fill_cfd_frame(cf, i, len, src[j], 0);
>
> + /* Fill the last frame and mark it final */
> if (cont_q)
> - fill_cfd_frame(cf, i++, len, dest, 0);
> -
> - /* Setting the final bit in the last source buffer frame in CFD */
> - cf[i - 1].efrl32 |= 1 << FSL_RE_CF_FINAL_SHIFT;
> + fill_cfd_frame(cf, i, len, dest, 1);
> + else
> + fill_cfd_frame(cf, i - 1, len, src[j - 1], 1);
>
> return &desc->async_tx;
> }
> @@ -505,16 +505,16 @@ static struct dma_async_tx_descriptor *fsl_re_prep_dma_pq(
> p[save_src_cnt + 2] = 1;
> fill_cfd_frame(cf, i++, len, dest[0], 0);
> fill_cfd_frame(cf, i++, len, dest[1], 0);
> - fill_cfd_frame(cf, i++, len, dest[1], 0);
> + fill_cfd_frame(cf, i++, len, dest[1], 1);
> } else {
> dev_err(re_chan->dev, "PQ tx continuation error!\n");
> return NULL;
> }
> + } else {
> + /* Mark the last source buffer frame final */
> + fill_cfd_frame(cf, i - 1, len, src[j - 1], 1);
> }
>
> - /* Setting the final bit in the last source buffer frame in CFD */
> - cf[i - 1].efrl32 |= 1 << FSL_RE_CF_FINAL_SHIFT;
> -
> return &desc->async_tx;
> }
>
> --
> 2.55.0
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCHv2 3/4] dma: fsl_raid: keep MMIO bases as void __iomem and cast at access
2026-07-16 20:29 [PATCHv2 0/4] dma: fsl_raid: fix sparse warnings and simplify probing Rosen Penev
2026-07-16 20:29 ` [PATCHv2 1/4] dma: fsl_raid: convert descriptor stores to big-endian Rosen Penev
2026-07-16 20:29 ` [PATCHv2 2/4] dma: fsl_raid: set final bit via fill_cfd_frame() argument Rosen Penev
@ 2026-07-16 20:29 ` Rosen Penev
2026-07-16 21:02 ` Frank Li
2026-07-16 20:29 ` [PATCHv2 4/4] dma: fsl_raid: use devm_platform_ioremap_resource Rosen Penev
3 siblings, 1 reply; 8+ messages in thread
From: Rosen Penev @ 2026-07-16 20:29 UTC (permalink / raw)
To: dmaengine; +Cc: Vinod Koul, Frank Li, open list
The fsl_re_ctrl and fsl_re_chan_cfg structures describe memory-mapped
RAID Engine registers accessed only via ioread32be()/iowrite32be(), yet
the pointers to them (re_regs in struct fsl_re_drv_private, and jrregs
in struct fsl_re_chan) were not __iomem-qualified, so sparse emitted
"different address spaces" warnings for every register access.
Store both MMIO bases as a plain void __iomem * and derive jrregs with
void __iomem * arithmetic from re_regs, rather than carrying typed
register struct pointers through the driver. Each function that touches
the registers introduces a local typed pointer (struct fsl_re_ctrl
__iomem *ctrl) and uses ->field, which is the idiomatic kernel pattern
and keeps the registers' __iomem qualification intact.
Reported-by: kernel test robot <lkp@intel.com>
Fixes: https://lore.kernel.org/oe-kbuild-all/202008111749.yy85rFMD%25lkp@intel.com/
Assisted-by: opencode:hy3-free
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsl_raid.c | 19 ++++++++++---------
drivers/dma/fsl_raid.h | 4 ++--
2 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/drivers/dma/fsl_raid.c b/drivers/dma/fsl_raid.c
index 888f55b672a5..524f83faf3da 100644
--- a/drivers/dma/fsl_raid.c
+++ b/drivers/dma/fsl_raid.c
@@ -657,8 +657,7 @@ static int fsl_re_chan_probe(struct platform_device *ofdev,
goto err_free;
}
- chan->jrregs = (struct fsl_re_chan_cfg *)((u8 *)re_priv->re_regs +
- off + ptr);
+ chan->jrregs = re_priv->base + off + ptr;
/* read irq property from dts */
chan->irq = irq_of_parse_and_map(np, 0);
@@ -746,6 +745,7 @@ static int fsl_re_chan_probe(struct platform_device *ofdev,
/* Probe function for RAID Engine */
static int fsl_re_probe(struct platform_device *ofdev)
{
+ struct fsl_re_ctrl __iomem *re_regs;
struct fsl_re_drv_private *re_priv;
struct device_node *child;
u32 off;
@@ -764,20 +764,21 @@ static int fsl_re_probe(struct platform_device *ofdev)
return -ENODEV;
/* IOMAP the entire RAID Engine region */
- re_priv->re_regs = devm_ioremap(dev, res->start, resource_size(res));
- if (!re_priv->re_regs)
+ re_regs = devm_ioremap(dev, res->start, resource_size(res));
+ if (!re_regs)
return -EBUSY;
+ re_priv->base = re_regs;
/* Program the RE mode */
- out_be32(&re_priv->re_regs->global_config, FSL_RE_NON_DPAA_MODE);
+ out_be32(&re_regs->global_config, FSL_RE_NON_DPAA_MODE);
/* Program Galois Field polynomial */
- out_be32(&re_priv->re_regs->galois_field_config, FSL_RE_GFM_POLY);
+ out_be32(&re_regs->galois_field_config, FSL_RE_GFM_POLY);
dev_info(dev, "version %x, mode %x, gfp %x\n",
- in_be32(&re_priv->re_regs->re_version_id),
- in_be32(&re_priv->re_regs->global_config),
- in_be32(&re_priv->re_regs->galois_field_config));
+ in_be32(&re_regs->re_version_id),
+ in_be32(&re_regs->global_config),
+ in_be32(&re_regs->galois_field_config));
dma_dev = &re_priv->dma_dev;
dma_dev->dev = dev;
diff --git a/drivers/dma/fsl_raid.h b/drivers/dma/fsl_raid.h
index 69d743c04973..adbfede330a7 100644
--- a/drivers/dma/fsl_raid.h
+++ b/drivers/dma/fsl_raid.h
@@ -256,7 +256,7 @@ struct fsl_re_hw_desc {
struct fsl_re_drv_private {
u8 total_chans;
struct dma_device dma_dev;
- struct fsl_re_ctrl *re_regs;
+ void __iomem *base;
struct fsl_re_chan *re_jrs[FSL_RE_MAX_CHANS];
struct dma_pool *cf_desc_pool;
struct dma_pool *hw_desc_pool;
@@ -273,7 +273,7 @@ struct fsl_re_chan {
struct device *dev;
struct fsl_re_drv_private *re_dev;
struct dma_chan chan;
- struct fsl_re_chan_cfg *jrregs;
+ struct fsl_re_chan_cfg __iomem *jrregs;
int irq;
struct tasklet_struct irqtask;
u32 alloc_count;
--
2.55.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCHv2 3/4] dma: fsl_raid: keep MMIO bases as void __iomem and cast at access
2026-07-16 20:29 ` [PATCHv2 3/4] dma: fsl_raid: keep MMIO bases as void __iomem and cast at access Rosen Penev
@ 2026-07-16 21:02 ` Frank Li
0 siblings, 0 replies; 8+ messages in thread
From: Frank Li @ 2026-07-16 21:02 UTC (permalink / raw)
To: Rosen Penev; +Cc: dmaengine, Vinod Koul, Frank Li, open list
On Thu, Jul 16, 2026 at 01:29:48PM -0700, Rosen Penev wrote:
> The fsl_re_ctrl and fsl_re_chan_cfg structures describe memory-mapped
> RAID Engine registers accessed only via ioread32be()/iowrite32be(), yet
> the pointers to them (re_regs in struct fsl_re_drv_private, and jrregs
> in struct fsl_re_chan) were not __iomem-qualified, so sparse emitted
> "different address spaces" warnings for every register access.
>
> Store both MMIO bases as a plain void __iomem * and derive jrregs with
> void __iomem * arithmetic from re_regs, rather than carrying typed
^ base
> register struct pointers through the driver. Each function that touches
> the registers introduces a local typed pointer (struct fsl_re_ctrl
> __iomem *ctrl) and uses ->field, which is the idiomatic kernel pattern
> and keeps the registers' __iomem qualification intact.
>
> Reported-by: kernel test robot <lkp@intel.com>
> Fixes: https://lore.kernel.org/oe-kbuild-all/202008111749.yy85rFMD%25lkp@intel.com/
> Assisted-by: opencode:hy3-free
> Signed-off-by: Rosen Penev <rosenp@gmail.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> drivers/dma/fsl_raid.c | 19 ++++++++++---------
> drivers/dma/fsl_raid.h | 4 ++--
> 2 files changed, 12 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/dma/fsl_raid.c b/drivers/dma/fsl_raid.c
> index 888f55b672a5..524f83faf3da 100644
> --- a/drivers/dma/fsl_raid.c
> +++ b/drivers/dma/fsl_raid.c
> @@ -657,8 +657,7 @@ static int fsl_re_chan_probe(struct platform_device *ofdev,
> goto err_free;
> }
>
> - chan->jrregs = (struct fsl_re_chan_cfg *)((u8 *)re_priv->re_regs +
> - off + ptr);
> + chan->jrregs = re_priv->base + off + ptr;
>
> /* read irq property from dts */
> chan->irq = irq_of_parse_and_map(np, 0);
> @@ -746,6 +745,7 @@ static int fsl_re_chan_probe(struct platform_device *ofdev,
> /* Probe function for RAID Engine */
> static int fsl_re_probe(struct platform_device *ofdev)
> {
> + struct fsl_re_ctrl __iomem *re_regs;
> struct fsl_re_drv_private *re_priv;
> struct device_node *child;
> u32 off;
> @@ -764,20 +764,21 @@ static int fsl_re_probe(struct platform_device *ofdev)
> return -ENODEV;
>
> /* IOMAP the entire RAID Engine region */
> - re_priv->re_regs = devm_ioremap(dev, res->start, resource_size(res));
> - if (!re_priv->re_regs)
> + re_regs = devm_ioremap(dev, res->start, resource_size(res));
> + if (!re_regs)
> return -EBUSY;
> + re_priv->base = re_regs;
>
> /* Program the RE mode */
> - out_be32(&re_priv->re_regs->global_config, FSL_RE_NON_DPAA_MODE);
> + out_be32(&re_regs->global_config, FSL_RE_NON_DPAA_MODE);
>
> /* Program Galois Field polynomial */
> - out_be32(&re_priv->re_regs->galois_field_config, FSL_RE_GFM_POLY);
> + out_be32(&re_regs->galois_field_config, FSL_RE_GFM_POLY);
>
> dev_info(dev, "version %x, mode %x, gfp %x\n",
> - in_be32(&re_priv->re_regs->re_version_id),
> - in_be32(&re_priv->re_regs->global_config),
> - in_be32(&re_priv->re_regs->galois_field_config));
> + in_be32(&re_regs->re_version_id),
> + in_be32(&re_regs->global_config),
> + in_be32(&re_regs->galois_field_config));
>
> dma_dev = &re_priv->dma_dev;
> dma_dev->dev = dev;
> diff --git a/drivers/dma/fsl_raid.h b/drivers/dma/fsl_raid.h
> index 69d743c04973..adbfede330a7 100644
> --- a/drivers/dma/fsl_raid.h
> +++ b/drivers/dma/fsl_raid.h
> @@ -256,7 +256,7 @@ struct fsl_re_hw_desc {
> struct fsl_re_drv_private {
> u8 total_chans;
> struct dma_device dma_dev;
> - struct fsl_re_ctrl *re_regs;
> + void __iomem *base;
> struct fsl_re_chan *re_jrs[FSL_RE_MAX_CHANS];
> struct dma_pool *cf_desc_pool;
> struct dma_pool *hw_desc_pool;
> @@ -273,7 +273,7 @@ struct fsl_re_chan {
> struct device *dev;
> struct fsl_re_drv_private *re_dev;
> struct dma_chan chan;
> - struct fsl_re_chan_cfg *jrregs;
> + struct fsl_re_chan_cfg __iomem *jrregs;
> int irq;
> struct tasklet_struct irqtask;
> u32 alloc_count;
> --
> 2.55.0
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCHv2 4/4] dma: fsl_raid: use devm_platform_ioremap_resource
2026-07-16 20:29 [PATCHv2 0/4] dma: fsl_raid: fix sparse warnings and simplify probing Rosen Penev
` (2 preceding siblings ...)
2026-07-16 20:29 ` [PATCHv2 3/4] dma: fsl_raid: keep MMIO bases as void __iomem and cast at access Rosen Penev
@ 2026-07-16 20:29 ` Rosen Penev
3 siblings, 0 replies; 8+ messages in thread
From: Rosen Penev @ 2026-07-16 20:29 UTC (permalink / raw)
To: dmaengine; +Cc: Vinod Koul, Frank Li, open list
Replace the open-coded platform_get_resource() plus devm_ioremap()
sequence with devm_platform_ioremap_resource(), which fetches the
resource, requests the region and maps it in one call. Switch the error
check to IS_ERR()/PTR_ERR() and drop the now-unused struct resource
pointer.
The raideng node has a single reg region (0x320000, 0x10000); the
job-queue/ring children are separate OF devices probed independently, so
the region reservation added by devm_ioremap_resource() is exclusive and
does not introduce overlap failures.
Assisted-by: opencode:hy3-free
Signed-off-by: Rosen Penev <rosenp@gmail.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
---
drivers/dma/fsl_raid.c | 14 +++++---------
1 file changed, 5 insertions(+), 9 deletions(-)
diff --git a/drivers/dma/fsl_raid.c b/drivers/dma/fsl_raid.c
index 524f83faf3da..2d86f61105e5 100644
--- a/drivers/dma/fsl_raid.c
+++ b/drivers/dma/fsl_raid.c
@@ -751,22 +751,18 @@ static int fsl_re_probe(struct platform_device *ofdev)
u32 off;
u8 ridx = 0;
struct dma_device *dma_dev;
- struct resource *res;
int rc;
struct device *dev = &ofdev->dev;
+ /* IOMAP the entire RAID Engine region */
+ re_regs = devm_platform_ioremap_resource(ofdev, 0);
+ if (IS_ERR(re_regs))
+ return PTR_ERR(re_regs);
+
re_priv = devm_kzalloc(dev, sizeof(*re_priv), GFP_KERNEL);
if (!re_priv)
return -ENOMEM;
- res = platform_get_resource(ofdev, IORESOURCE_MEM, 0);
- if (!res)
- return -ENODEV;
-
- /* IOMAP the entire RAID Engine region */
- re_regs = devm_ioremap(dev, res->start, resource_size(res));
- if (!re_regs)
- return -EBUSY;
re_priv->base = re_regs;
/* Program the RE mode */
--
2.55.0
^ permalink raw reply related [flat|nested] 8+ messages in thread