dmaengine: at_xdmac: In at_xdmac_prep_dma_memset, treat value as a single byte
authorBen Walker <benjamin.walker@intel.com>
Tue, 1 Mar 2022 18:25:50 +0000 (11:25 -0700)
committerVinod Koul <vkoul@kernel.org>
Wed, 20 Apr 2022 11:58:12 +0000 (17:28 +0530)
The value passed in to .prep_dma_memset is to be treated as a single
byte repeating pattern.

Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Cc: Ludovic Desroches <ludovic.desroches@microchip.com>
Cc: Tudor Ambarus <tudor.ambarus@microchip.com>
Link: https://lore.kernel.org/r/20220301182551.883474-4-benjamin.walker@intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/at_xdmac.c

index 1476156..1911861 100644 (file)
@@ -1202,6 +1202,7 @@ static struct at_xdmac_desc *at_xdmac_memset_create_desc(struct dma_chan *chan,
        unsigned long           flags;
        size_t                  ublen;
        u32                     dwidth;
+       char                    pattern;
        /*
         * WARNING: The channel configuration is set here since there is no
         * dmaengine_slave_config call in this case. Moreover we don't know the
@@ -1244,10 +1245,16 @@ static struct at_xdmac_desc *at_xdmac_memset_create_desc(struct dma_chan *chan,
 
        chan_cc |= AT_XDMAC_CC_DWIDTH(dwidth);
 
+       /* Only the first byte of value is to be used according to dmaengine */
+       pattern = (char)value;
+
        ublen = len >> dwidth;
 
        desc->lld.mbr_da = dst_addr;
-       desc->lld.mbr_ds = value;
+       desc->lld.mbr_ds = (pattern << 24) |
+                          (pattern << 16) |
+                          (pattern << 8) |
+                          pattern;
        desc->lld.mbr_ubc = AT_XDMAC_MBR_UBC_NDV3
                | AT_XDMAC_MBR_UBC_NDEN
                | AT_XDMAC_MBR_UBC_NSEN