lkml.org 
[lkml]   [2017]   [Sep]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 03/10] dmaengine: sun6i: Restructure code to allow extension for new SoCs
    Date
    The current code mixes three distinct operations when transforming
    the slave config to register settings:

    1. special handling of DMA_SLAVE_BUSWIDTH_UNDEFINED, maxburst == 0
    2. range checking
    3. conversion of raw to register values

    As the range checks depend on the specific SoC, move these out of the
    conversion to distinct operations.

    Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
    ---
    drivers/dma/sun6i-dma.c | 58 +++++++++++++++++++++++++------------------------
    1 file changed, 30 insertions(+), 28 deletions(-)

    diff --git a/drivers/dma/sun6i-dma.c b/drivers/dma/sun6i-dma.c
    index f1a139f0102f..c5644bd0f91a 100644
    --- a/drivers/dma/sun6i-dma.c
    +++ b/drivers/dma/sun6i-dma.c
    @@ -185,6 +185,8 @@ struct sun6i_dma_dev {
    struct sun6i_pchan *pchans;
    struct sun6i_vchan *vchans;
    const struct sun6i_dma_config *cfg;
    + u32 src_burst_lengths;
    + u32 dst_burst_lengths;
    };

    static struct device *chan2dev(struct dma_chan *chan)
    @@ -270,10 +272,6 @@ static inline s8 convert_burst(u32 maxburst)

    static inline s8 convert_buswidth(enum dma_slave_buswidth addr_width)
    {
    - if ((addr_width < DMA_SLAVE_BUSWIDTH_1_BYTE) ||
    - (addr_width > DMA_SLAVE_BUSWIDTH_4_BYTES))
    - return -EINVAL;
    -
    return addr_width >> 1;
    }

    @@ -520,41 +518,43 @@ static int set_config(struct sun6i_dma_dev *sdev,
    enum dma_transfer_direction direction,
    u32 *p_cfg)
    {
    + enum dma_slave_buswidth src_addr_width, dst_addr_width;
    + u32 src_maxburst, dst_maxburst;
    s8 src_width, dst_width, src_burst, dst_burst;

    + src_addr_width = sconfig->src_addr_width;
    + dst_addr_width = sconfig->dst_addr_width;
    + src_maxburst = sconfig->src_maxburst;
    + dst_maxburst = sconfig->dst_maxburst;
    +
    switch (direction) {
    case DMA_MEM_TO_DEV:
    - src_burst = convert_burst(sconfig->src_maxburst ?
    - sconfig->src_maxburst : 8);
    - src_width = convert_buswidth(sconfig->src_addr_width !=
    - DMA_SLAVE_BUSWIDTH_UNDEFINED ?
    - sconfig->src_addr_width :
    - DMA_SLAVE_BUSWIDTH_4_BYTES);
    - dst_burst = convert_burst(sconfig->dst_maxburst);
    - dst_width = convert_buswidth(sconfig->dst_addr_width);
    + if (src_addr_width == DMA_SLAVE_BUSWIDTH_UNDEFINED)
    + src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
    + src_maxburst = src_maxburst ? src_maxburst : 8;
    break;
    case DMA_DEV_TO_MEM:
    - src_burst = convert_burst(sconfig->src_maxburst);
    - src_width = convert_buswidth(sconfig->src_addr_width);
    - dst_burst = convert_burst(sconfig->dst_maxburst ?
    - sconfig->dst_maxburst : 8);
    - dst_width = convert_buswidth(sconfig->dst_addr_width !=
    - DMA_SLAVE_BUSWIDTH_UNDEFINED ?
    - sconfig->dst_addr_width :
    - DMA_SLAVE_BUSWIDTH_4_BYTES);
    + if (dst_addr_width == DMA_SLAVE_BUSWIDTH_UNDEFINED)
    + dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
    + dst_maxburst = dst_maxburst ? dst_maxburst : 8;
    break;
    default:
    return -EINVAL;
    }

    - if (src_burst < 0)
    - return src_burst;
    - if (src_width < 0)
    - return src_width;
    - if (dst_burst < 0)
    - return dst_burst;
    - if (dst_width < 0)
    - return dst_width;
    + if (!(BIT(src_addr_width) & sdev->slave.src_addr_widths))
    + return -EINVAL;
    + if (!(BIT(dst_addr_width) & sdev->slave.dst_addr_widths))
    + return -EINVAL;
    + if (!(BIT(src_maxburst) & sdev->src_burst_lengths))
    + return -EINVAL;
    + if (!(BIT(dst_maxburst) & sdev->dst_burst_lengths))
    + return -EINVAL;
    +
    + src_width = convert_buswidth(src_addr_width);
    + dst_width = convert_buswidth(dst_addr_width);
    + dst_burst = convert_burst(dst_maxburst);
    + src_burst = convert_burst(src_maxburst);

    *p_cfg = DMA_CHAN_CFG_SRC_WIDTH(src_width) |
    DMA_CHAN_CFG_DST_WIDTH(dst_width);
    @@ -1150,6 +1150,8 @@ static int sun6i_dma_probe(struct platform_device *pdev)
    sdc->slave.dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) |
    BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) |
    BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
    + sdc->src_burst_lengths = BIT(1) | BIT(8);
    + sdc->dst_burst_lengths = BIT(1) | BIT(8);
    sdc->slave.directions = BIT(DMA_DEV_TO_MEM) |
    BIT(DMA_MEM_TO_DEV);
    sdc->slave.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;
    --
    2.14.1
    \
     
     \ /
      Last update: 2017-09-04 00:45    [W:3.288 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site