From: plaes@plaes•org (Priit Laes)
To: linux-arm-kernel@lists•infradead.org
Subject: [linux-sunxi] [PATCH] dma: sun4i: expose block size and wait cycle configuration to DMA users
Date: Mon, 07 Mar 2016 17:30:41 +0200 [thread overview]
Message-ID: <1457364641.20836.5.camel@plaes.org> (raw)
In-Reply-To: <1457344771-12946-1-git-send-email-boris.brezillon@free-electrons.com>
On Mon, 2016-03-07 at 10:59 +0100, Boris Brezillon wrote:
> Some drivers might need to tweak the block size and wait cycles
> values
> to get better performances.
> Create and export the sun4i_dma_set_chan_config() to do that.
>
> Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons•com>
> ---
> drivers/dma/sun4i-dma.c | 44 ++++++++++++++++++++++++++++++---
> ----------
> include/linux/dma/sun4i-dma.h | 38
> +++++++++++++++++++++++++++++++++++++
> 2 files changed, 69 insertions(+), 13 deletions(-)
> create mode 100644 include/linux/dma/sun4i-dma.h
>
> diff --git a/drivers/dma/sun4i-dma.c b/drivers/dma/sun4i-dma.c
> index 1661d518..e48f537 100644
> --- a/drivers/dma/sun4i-dma.c
> +++ b/drivers/dma/sun4i-dma.c
> @@ -12,6 +12,7 @@
> #include <linux/bitops.h>
> #include <linux/clk.h>
> #include <linux/dmaengine.h>
> +#include <linux/dma/sun4i-dma.h>
> #include <linux/dmapool.h>
> #include <linux/interrupt.h>
> #include <linux/module.h>
> @@ -138,6 +139,7 @@ struct sun4i_dma_pchan {
> struct sun4i_dma_vchan {
> struct virt_dma_chan vc;
> struct dma_slave_config cfg;
> + struct sun4i_dma_chan_config scfg;
> struct sun4i_dma_pchan *pchan;
> struct sun4i_dma_promise *processing;
> struct sun4i_dma_contract *contract;
> @@ -779,7 +781,7 @@ sun4i_dma_prep_slave_sg(struct dma_chan *chan,
> struct scatterlist *sgl,
> u8 ram_type, io_mode, linear_mode;
> struct scatterlist *sg;
> dma_addr_t srcaddr, dstaddr;
> - u32 endpoints, para;
> + u32 endpoints;
> int i;
>
> if (!sgl)
> @@ -825,17 +827,6 @@ sun4i_dma_prep_slave_sg(struct dma_chan *chan,
> struct scatterlist *sgl,
> dstaddr = sg_dma_address(sg);
> }
>
> - /*
> - * These are the magic DMA engine timings that keep
> SPI going.
> - * I haven't seen any interface on DMAEngine to
> configure
> - * timings, and so far they seem to work for
> everything we
> - * support, so I've kept them here. I don't know if
> other
> - * devices need different timings because, as usual,
> we only
> - * have the "para" bitfield meanings, but no comment
> on what
> - * the values should be when doing a certain
> operation :|
> - */
> - para = SUN4I_DDMA_MAGIC_SPI_PARAMETERS;
> -
> /* And make a suitable promise */
> if (vchan->is_dedicated)
> promise = generate_ddma_promise(chan,
> srcaddr, dstaddr,
> @@ -850,7 +841,7 @@ sun4i_dma_prep_slave_sg(struct dma_chan *chan,
> struct scatterlist *sgl,
> return NULL; /* TODO: should we free
> everything? */
>
> promise->cfg |= endpoints;
> - promise->para = para;
> + promise->para = vchan->scfg.para;
>
> /* Then add it to the contract */
> list_add_tail(&promise->list, &contract->demands);
> @@ -908,6 +899,21 @@ static int sun4i_dma_config(struct dma_chan
> *chan,
> return 0;
> }
>
> +int sun4i_dma_set_chan_config(struct dma_chan *dchan,
> + const struct sun4i_dma_chan_config
> *cfg)
> +{
> + struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(dchan);
> +
> + if (!vchan->is_dedicated)
> + return -ENOTSUPP;
> +
> + /* TODO: control cfg value */
> + vchan->scfg = *cfg;
> +
> + return 0;
> +}
> +EXPORT_SYMBOL_GPL(sun4i_dma_set_chan_config);
> +
> static struct dma_chan *sun4i_dma_of_xlate(struct of_phandle_args
> *dma_spec,
> struct of_dma *ofdma)
> {
> @@ -1206,6 +1212,18 @@ static int sun4i_dma_probe(struct
> platform_device *pdev)
> spin_lock_init(&vchan->vc.lock);
> vchan->vc.desc_free = sun4i_dma_free_contract;
> vchan_init(&vchan->vc, &priv->slave);
> +
> + /*
> + * These are the magic DMA engine timings that keep
> SPI going.
> + * I haven't seen any interface on DMAEngine to
> configure
> + * timings, and so far they seem to work for
> everything we
> + * support, so I've kept them here. I don't know if
> other
> + * devices need different timings because, as usual,
> we only
> + * have the "para" bitfield meanings, but no comment
> on what
> + * the values should be when doing a certain
> operation :|
> + */
> + vchan->scfg.para = SUN4I_DDMA_MAGIC_SPI_PARAMETERS;
Does SPI refer the Serial Peripheral Interface?
If yes, then I would point out that current sun4i SPI driver doesn't
actually use DMA [1]
http://lists.infradead.org/pipermail/linux-arm-kernel/2016-February/411
722.html
> +
> }
>
> ret = clk_prepare_enable(priv->clk);
> diff --git a/include/linux/dma/sun4i-dma.h b/include/linux/dma/sun4i
> -dma.h
> new file mode 100644
> index 0000000..f643539
> --- /dev/null
> +++ b/include/linux/dma/sun4i-dma.h
> @@ -0,0 +1,38 @@
> +/*
> + * Sun4i DMA Engine drivers support header file
> + *
> + * Copyright (C) 2016 Free Electrons. All rights reserved.
> + *
> + * This is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published
> by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + */
> +
> +#ifndef _SUN4I_DMA_H
> +#define _SUN4I_DMA_H
> +
> +#include <linux/dma-mapping.h>
> +#include <linux/dmaengine.h>
> +
> +/* Dedicated DMA parameter register layout */
> +#define SUN4I_DDMA_PARA_DST_DATA_BLK_SIZE(n) (((n) - 1) <<
> 24)
> +#define SUN4I_DDMA_PARA_DST_WAIT_CYCLES(n) (((n) - 1) << 16)
> +#define SUN4I_DDMA_PARA_SRC_DATA_BLK_SIZE(n) (((n) - 1) << 8)
> +#define SUN4I_DDMA_PARA_SRC_WAIT_CYCLES(n) (((n) - 1) << 0)
> +
> +/**
> + * struct sun4i_dma_chan_config - DMA channel config
> + *
> + * @para: contains information about block size and time before
> checking
> + * DRQ line. This is device specific and only applicable to
> dedicated
> + * DMA channels
> + */
> +struct sun4i_dma_chan_config {
> + u32 para;
> +};
> +
> +int sun4i_dma_set_chan_config(struct dma_chan *dchan,
> + const struct sun4i_dma_chan_config
> *cfg);
> +
> +#endif /* _SUN4I_DMA_H */
> --
> 2.1.4
>
next prev parent reply other threads:[~2016-03-07 15:30 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-07 9:59 [PATCH] dma: sun4i: expose block size and wait cycle configuration to DMA users Boris Brezillon
2016-03-07 14:54 ` Vinod Koul
2016-03-07 15:08 ` Boris Brezillon
2016-03-07 20:30 ` Maxime Ripard
2016-03-08 2:55 ` Vinod Koul
2016-03-08 2:59 ` Vinod Koul
2016-03-08 7:51 ` Maxime Ripard
2016-03-08 8:42 ` [linux-sunxi] " Hans de Goede
2016-03-08 10:05 ` Vinod Koul
2016-03-09 10:58 ` Maxime Ripard
2016-03-08 8:46 ` Boris Brezillon
2016-03-08 9:10 ` [linux-sunxi] " Priit Laes
2016-03-08 10:04 ` Vinod Koul
2016-03-09 10:08 ` [linux-sunxi] " LABBE Corentin
2016-03-08 9:59 ` Vinod Koul
2016-03-09 10:14 ` Boris Brezillon
2016-03-11 6:24 ` Vinod Koul
2016-03-11 9:40 ` Boris Brezillon
2016-03-11 10:06 ` Vinod Koul
2016-03-11 10:26 ` Boris Brezillon
2016-03-11 11:21 ` Vinod Koul
2016-03-09 11:06 ` Boris Brezillon
2016-03-11 6:26 ` Vinod Koul
2016-03-11 9:45 ` Boris Brezillon
2016-03-11 10:09 ` Vinod Koul
2016-03-11 10:55 ` Maxime Ripard
2016-03-11 11:18 ` Vinod Koul
2016-03-14 11:46 ` Maxime Ripard
2016-03-16 3:22 ` Vinod Koul
2016-03-07 15:30 ` Priit Laes [this message]
2016-03-07 15:47 ` [linux-sunxi] " Boris Brezillon
2016-03-07 17:15 ` Emilio López
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=1457364641.20836.5.camel@plaes.org \
--to=plaes@plaes$(echo .)org \
--cc=linux-arm-kernel@lists$(echo .)infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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