From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Viresh Kumar <viresh.linux@gmail.com>,
Vinod Koul <vinod.koul@intel.com>,
spear-devel@list.st.com, linux-kernel@vger.kernel.org,
Hein Tibosch <hein_tibosch@yahoo.es>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Subject: [PATCH 6/7] dw_dmac: check if controller supports LLP
Date: Mon, 17 Sep 2012 10:39:36 +0300 [thread overview]
Message-ID: <1347867577-13170-7-git-send-email-andriy.shevchenko@linux.intel.com> (raw)
In-Reply-To: <1347867577-13170-1-git-send-email-andriy.shevchenko@linux.intel.com>
Some controllers have the reduced functionality where the LLP multi block
transfers are not supported. This patch introduces a check and refuses to deal
with such devices.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/dma/dw_dmac.c | 35 ++++++++++++++++++++++++++++++++++-
drivers/dma/dw_dmac_regs.h | 4 ++++
2 files changed, 38 insertions(+), 1 deletion(-)
diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
index fdb7d5a..00958ad 100644
--- a/drivers/dma/dw_dmac.c
+++ b/drivers/dma/dw_dmac.c
@@ -647,6 +647,12 @@ dwc_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
unsigned int dst_width;
u32 ctllo;
+ if (dwc->nollp) {
+ dev_dbg(chan2dev(&dwc->chan),
+ "channel doesn't support LLP transfers\n");
+ return NULL;
+ }
+
dev_vdbg(chan2dev(chan),
"%s: d0x%llx s0x%llx l0x%zx f0x%lx\n", __func__,
(unsigned long long)dest, (unsigned long long)src,
@@ -741,6 +747,12 @@ dwc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
if (unlikely(!dws || !sg_len))
return NULL;
+ if (dwc->nollp) {
+ dev_dbg(chan2dev(&dwc->chan),
+ "channel doesn't support LLP transfers\n");
+ return NULL;
+ }
+
prev = first = NULL;
switch (direction) {
@@ -1202,6 +1214,13 @@ struct dw_cyclic_desc *dw_dma_cyclic_prep(struct dma_chan *chan,
unsigned long flags;
spin_lock_irqsave(&dwc->lock, flags);
+ if (dwc->nollp) {
+ spin_unlock_irqrestore(&dwc->lock, flags);
+ dev_dbg(chan2dev(&dwc->chan),
+ "channel doesn't support LLP transfers\n");
+ return ERR_PTR(-EINVAL);
+ }
+
if (!list_empty(&dwc->queue) || !list_empty(&dwc->active_list)) {
spin_unlock_irqrestore(&dwc->lock, flags);
dev_dbg(chan2dev(&dwc->chan),
@@ -1469,6 +1488,7 @@ static int __devinit dw_probe(struct platform_device *pdev)
INIT_LIST_HEAD(&dw->dma.channels);
for (i = 0; i < nr_channels; i++) {
struct dw_dma_chan *dwc = &dw->chan[i];
+ int r = nr_channels - i - 1;
dwc->chan.device = &dw->dma;
dma_cookie_init(&dwc->chan);
@@ -1480,7 +1500,7 @@ static int __devinit dw_probe(struct platform_device *pdev)
/* 7 is highest priority & 0 is lowest. */
if (pdata->chan_priority == CHAN_PRIORITY_ASCENDING)
- dwc->priority = nr_channels - i - 1;
+ dwc->priority = r;
else
dwc->priority = i;
@@ -1498,10 +1518,23 @@ static int __devinit dw_probe(struct platform_device *pdev)
/* hardware configuration */
if (autocfg) {
+ unsigned int dwc_params;
+
+ dwc_params = dma_raw_readl(regs + r * sizeof(u32),
+ DWC_PARAMS);
+
dwc->block_size =
(4 << ((max_blk_size >> 4 * i) & 0xf)) - 1;
+ dwc->nollp =
+ (dwc_params >> DWC_PARAMS_MBLK_EN & 0x1) == 0;
} else {
dwc->block_size = pdata->block_size;
+
+ /* Check if channel supports multi block transfer */
+ channel_writel(dwc, LLP, 0xfffffffc);
+ dwc->nollp =
+ (channel_readl(dwc, LLP) & 0xfffffffc) == 0;
+ channel_writel(dwc, LLP, 0);
}
}
diff --git a/drivers/dma/dw_dmac_regs.h b/drivers/dma/dw_dmac_regs.h
index 9beaef0..b66a716 100644
--- a/drivers/dma/dw_dmac_regs.h
+++ b/drivers/dma/dw_dmac_regs.h
@@ -114,6 +114,9 @@ struct dw_dma_regs {
#define DW_PARAMS_DATA_WIDTH4 21 /* master 4 data width */
#define DW_PARAMS_EN 28 /* encoded parameters */
+/* Bitfields in DWC_PARAMS */
+#define DWC_PARAMS_MBLK_EN 11 /* multi block transfer */
+
/* Bitfields in CTL_LO */
#define DWC_CTLL_INT_EN (1 << 0) /* irqs enabled? */
#define DWC_CTLL_DST_WIDTH(n) ((n)<<1) /* bytes per element */
@@ -194,6 +197,7 @@ struct dw_dma_chan {
/* hardware configuration */
unsigned short block_size;
+ bool nollp;
/* configuration passed via DMA_SLAVE_CONFIG */
struct dma_slave_config dma_sconfig;
--
1.7.10.4
next prev parent reply other threads:[~2012-09-17 7:39 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-17 7:39 [PATCH 0/7] dw_dmac: introduce autoconfiguration Andy Shevchenko
2012-09-17 7:39 ` [PATCH 1/7] dw_dmac: mark dwc_dump_chan_regs as inline Andy Shevchenko
2012-09-18 6:35 ` viresh kumar
2012-09-17 7:39 ` [PATCH 2/7] dw_dmac: fill optional encoded parameters in register structure Andy Shevchenko
2012-09-18 6:39 ` viresh kumar
2012-09-18 6:55 ` Andy Shevchenko
2012-09-18 7:59 ` viresh kumar
2012-09-20 9:30 ` Andy Shevchenko
2012-09-20 9:32 ` viresh kumar
2012-09-20 9:51 ` Andy Shevchenko
2012-09-17 7:39 ` [PATCH 3/7] dw_dmac: get number of channels from hardware if possible Andy Shevchenko
2012-09-18 6:50 ` viresh kumar
2012-09-20 9:35 ` Andy Shevchenko
2012-09-20 9:40 ` viresh kumar
2012-09-21 6:04 ` viresh kumar
2012-09-17 7:39 ` [PATCH 4/7] dw_dmac: autoconfigure block_size or use platform data Andy Shevchenko
2012-09-18 6:57 ` viresh kumar
2012-09-20 9:38 ` Andy Shevchenko
2012-09-17 7:39 ` [PATCH 5/7] dw_dmac: autoconfigure data_width or get it via " Andy Shevchenko
2012-09-18 7:11 ` viresh kumar
2012-09-20 9:42 ` Andy Shevchenko
2012-09-20 9:46 ` viresh kumar
2012-09-20 9:53 ` Andy Shevchenko
2012-09-17 7:39 ` Andy Shevchenko [this message]
2012-09-18 7:13 ` [PATCH 6/7] dw_dmac: check if controller supports LLP viresh kumar
2012-09-20 9:43 ` Andy Shevchenko
2012-09-17 7:39 ` [PATCH 7/7] dw_dmac: introduce software emulation of LLP transfers Andy Shevchenko
2012-09-18 7:17 ` viresh kumar
2012-09-20 9:46 ` Andy Shevchenko
2012-09-17 16:50 ` [PATCH 0/7] dw_dmac: introduce autoconfiguration Hein Tibosch
2012-09-18 6:11 ` Hein Tibosch
2012-09-18 7:18 ` viresh kumar
2012-09-20 9:48 ` Andy Shevchenko
2012-09-21 12:05 ` [PATCHv2 0/6] " Andy Shevchenko
2012-09-21 12:05 ` [PATCHv2 1/6] dw_dmac: mark dwc_dump_chan_regs as inline Andy Shevchenko
2012-09-21 12:05 ` [PATCHv2 2/6] dw_dmac: fill optional encoded parameters in register structure Andy Shevchenko
2012-09-21 13:55 ` viresh kumar
2012-09-21 12:05 ` [PATCHv2 3/6] dw_dmac: get number of channels from hardware if possible Andy Shevchenko
2012-09-21 13:56 ` viresh kumar
2012-09-21 12:05 ` [PATCHv2 4/6] dw_dmac: autoconfigure block_size or use platform data Andy Shevchenko
2012-09-21 14:00 ` viresh kumar
2012-09-21 15:09 ` Andy Shevchenko
2012-09-21 15:30 ` Viresh Kumar
2012-09-21 12:05 ` [PATCHv2 5/6] dw_dmac: autoconfigure data_width or get it via " Andy Shevchenko
2012-09-21 14:02 ` viresh kumar
2012-09-25 11:39 ` [PATCHv3] " Andy Shevchenko
2012-09-26 3:29 ` viresh kumar
2012-09-27 10:06 ` Vinod Koul
2012-09-27 10:33 ` Vinod Koul
2012-09-27 13:10 ` Andy Shevchenko
2012-10-01 9:04 ` Andy Shevchenko
2012-10-01 9:45 ` Vinod Koul
2012-10-01 10:07 ` Andy Shevchenko
2012-09-27 14:00 ` Andy Shevchenko
2012-09-27 14:27 ` Vinod Koul
2012-09-21 12:05 ` [PATCHv2 6/6] dw_dmac: introduce software emulation of LLP transfers Andy Shevchenko
2012-09-21 14:03 ` viresh kumar
2012-09-27 10:05 ` [PATCHv2 0/6] dw_dmac: introduce autoconfiguration Vinod Koul
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=1347867577-13170-7-git-send-email-andriy.shevchenko@linux.intel.com \
--to=andriy.shevchenko@linux.intel.com \
--cc=hein_tibosch@yahoo.es \
--cc=linux-kernel@vger.kernel.org \
--cc=spear-devel@list.st.com \
--cc=vinod.koul@intel.com \
--cc=viresh.linux@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
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
Powered by JetHome