aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuennadi Liakhovetski <g.liakhovetski@gmx.de>2012-07-05 06:29:40 -0400
committerVinod Koul <vinod.koul@linux.intel.com>2012-07-20 01:53:44 -0400
commitecf90fbbdc66cde6f5fa25d88541112b9baac459 (patch)
treee2998d0c217b07816dec6b22e03885c9fb4731bd
parent1e7f07b5390b4bbf82fe017fcb46682dcf4ab1d0 (diff)
dmaengine: shdma: prepare to stop using struct dma_chan::private
Using struct dma_chan::private is deprecated. To update the shdma driver to stop using it we first have to eliminate internal runtime uses of it. After that we will also be able to stop using it for channel configuration. Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Vinod Koul <vinod.koul@linux.intel.com>
-rw-r--r--drivers/dma/sh/shdma-base.c9
-rw-r--r--drivers/dma/sh/shdma.c24
-rw-r--r--drivers/dma/sh/shdma.h2
-rw-r--r--include/linux/sh_dma.h2
-rw-r--r--include/linux/shdma-base.h1
5 files changed, 18 insertions, 20 deletions
diff --git a/drivers/dma/sh/shdma-base.c b/drivers/dma/sh/shdma-base.c
index ff060d0da908..f75ebfa735c0 100644
--- a/drivers/dma/sh/shdma-base.c
+++ b/drivers/dma/sh/shdma-base.c
@@ -76,7 +76,7 @@ static dma_cookie_t shdma_tx_submit(struct dma_async_tx_descriptor *tx)
76 container_of(tx, struct shdma_desc, async_tx), 76 container_of(tx, struct shdma_desc, async_tx),
77 *last = desc; 77 *last = desc;
78 struct shdma_chan *schan = to_shdma_chan(tx->chan); 78 struct shdma_chan *schan = to_shdma_chan(tx->chan);
79 struct shdma_slave *slave = tx->chan->private; 79 struct shdma_slave *slave = schan->slave;
80 dma_async_tx_callback callback = tx->callback; 80 dma_async_tx_callback callback = tx->callback;
81 dma_cookie_t cookie; 81 dma_cookie_t cookie;
82 bool power_up; 82 bool power_up;
@@ -208,6 +208,7 @@ static int shdma_alloc_chan_resources(struct dma_chan *chan)
208 goto edescalloc; 208 goto edescalloc;
209 } 209 }
210 schan->desc_num = NR_DESCS_PER_CHANNEL; 210 schan->desc_num = NR_DESCS_PER_CHANNEL;
211 schan->slave = slave;
211 212
212 for (i = 0; i < NR_DESCS_PER_CHANNEL; i++) { 213 for (i = 0; i < NR_DESCS_PER_CHANNEL; i++) {
213 desc = ops->embedded_desc(schan->desc, i); 214 desc = ops->embedded_desc(schan->desc, i);
@@ -365,9 +366,9 @@ static void shdma_free_chan_resources(struct dma_chan *chan)
365 if (!list_empty(&schan->ld_queue)) 366 if (!list_empty(&schan->ld_queue))
366 shdma_chan_ld_cleanup(schan, true); 367 shdma_chan_ld_cleanup(schan, true);
367 368
368 if (chan->private) { 369 if (schan->slave) {
369 /* The caller is holding dma_list_mutex */ 370 /* The caller is holding dma_list_mutex */
370 struct shdma_slave *slave = chan->private; 371 struct shdma_slave *slave = schan->slave;
371 clear_bit(slave->slave_id, shdma_slave_used); 372 clear_bit(slave->slave_id, shdma_slave_used);
372 chan->private = NULL; 373 chan->private = NULL;
373 } 374 }
@@ -558,7 +559,7 @@ static struct dma_async_tx_descriptor *shdma_prep_slave_sg(
558 struct shdma_chan *schan = to_shdma_chan(chan); 559 struct shdma_chan *schan = to_shdma_chan(chan);
559 struct shdma_dev *sdev = to_shdma_dev(schan->dma_chan.device); 560 struct shdma_dev *sdev = to_shdma_dev(schan->dma_chan.device);
560 const struct shdma_ops *ops = sdev->ops; 561 const struct shdma_ops *ops = sdev->ops;
561 struct shdma_slave *slave = chan->private; 562 struct shdma_slave *slave = schan->slave;
562 dma_addr_t slave_addr; 563 dma_addr_t slave_addr;
563 564
564 if (!chan) 565 if (!chan)
diff --git a/drivers/dma/sh/shdma.c b/drivers/dma/sh/shdma.c
index f06906f281ac..9f0a2e507ac3 100644
--- a/drivers/dma/sh/shdma.c
+++ b/drivers/dma/sh/shdma.c
@@ -291,10 +291,8 @@ static void sh_dmae_setup_xfer(struct shdma_chan *schan,
291 shdma_chan); 291 shdma_chan);
292 292
293 if (sslave) { 293 if (sslave) {
294 struct sh_dmae_slave *slave = container_of(sslave,
295 struct sh_dmae_slave, shdma_slave);
296 const struct sh_dmae_slave_config *cfg = 294 const struct sh_dmae_slave_config *cfg =
297 slave->config; 295 sh_chan->config;
298 296
299 dmae_set_dmars(sh_chan, cfg->mid_rid); 297 dmae_set_dmars(sh_chan, cfg->mid_rid);
300 dmae_set_chcr(sh_chan, cfg->chcr); 298 dmae_set_chcr(sh_chan, cfg->chcr);
@@ -326,13 +324,11 @@ static int sh_dmae_set_slave(struct shdma_chan *schan,
326{ 324{
327 struct sh_dmae_chan *sh_chan = container_of(schan, struct sh_dmae_chan, 325 struct sh_dmae_chan *sh_chan = container_of(schan, struct sh_dmae_chan,
328 shdma_chan); 326 shdma_chan);
329 struct sh_dmae_slave *slave = container_of(sslave, struct sh_dmae_slave,
330 shdma_slave);
331 const struct sh_dmae_slave_config *cfg = dmae_find_slave(sh_chan, sslave->slave_id); 327 const struct sh_dmae_slave_config *cfg = dmae_find_slave(sh_chan, sslave->slave_id);
332 if (!cfg) 328 if (!cfg)
333 return -ENODEV; 329 return -ENODEV;
334 330
335 slave->config = cfg; 331 sh_chan->config = cfg;
336 332
337 return 0; 333 return 0;
338} 334}
@@ -579,13 +575,12 @@ static int sh_dmae_resume(struct device *dev)
579 575
580 for (i = 0; i < shdev->pdata->channel_num; i++) { 576 for (i = 0; i < shdev->pdata->channel_num; i++) {
581 struct sh_dmae_chan *sh_chan = shdev->chan[i]; 577 struct sh_dmae_chan *sh_chan = shdev->chan[i];
582 struct sh_dmae_slave *param = sh_chan->shdma_chan.dma_chan.private;
583 578
584 if (!sh_chan->shdma_chan.desc_num) 579 if (!sh_chan->shdma_chan.desc_num)
585 continue; 580 continue;
586 581
587 if (param) { 582 if (sh_chan->shdma_chan.slave) {
588 const struct sh_dmae_slave_config *cfg = param->config; 583 const struct sh_dmae_slave_config *cfg = sh_chan->config;
589 dmae_set_dmars(sh_chan, cfg->mid_rid); 584 dmae_set_dmars(sh_chan, cfg->mid_rid);
590 dmae_set_chcr(sh_chan, cfg->chcr); 585 dmae_set_chcr(sh_chan, cfg->chcr);
591 } else { 586 } else {
@@ -609,14 +604,15 @@ const struct dev_pm_ops sh_dmae_pm = {
609 604
610static dma_addr_t sh_dmae_slave_addr(struct shdma_chan *schan) 605static dma_addr_t sh_dmae_slave_addr(struct shdma_chan *schan)
611{ 606{
612 struct sh_dmae_slave *param = schan->dma_chan.private; 607 struct sh_dmae_chan *sh_chan = container_of(schan,
608 struct sh_dmae_chan, shdma_chan);
613 609
614 /* 610 /*
615 * Implicit BUG_ON(!param) 611 * Implicit BUG_ON(!sh_chan->config)
616 * if (param != NULL), this is a successfully requested slave channel, 612 * This is an exclusive slave DMA operation, may only be called after a
617 * therefore param->config != NULL too. 613 * successful slave configuration.
618 */ 614 */
619 return param->config->addr; 615 return sh_chan->config->addr;
620} 616}
621 617
622static struct shdma_desc *sh_dmae_embedded_desc(void *buf, int i) 618static struct shdma_desc *sh_dmae_embedded_desc(void *buf, int i)
diff --git a/drivers/dma/sh/shdma.h b/drivers/dma/sh/shdma.h
index 840e47d1c86c..9314e93225db 100644
--- a/drivers/dma/sh/shdma.h
+++ b/drivers/dma/sh/shdma.h
@@ -13,6 +13,7 @@
13#ifndef __DMA_SHDMA_H 13#ifndef __DMA_SHDMA_H
14#define __DMA_SHDMA_H 14#define __DMA_SHDMA_H
15 15
16#include <linux/sh_dma.h>
16#include <linux/shdma-base.h> 17#include <linux/shdma-base.h>
17#include <linux/dmaengine.h> 18#include <linux/dmaengine.h>
18#include <linux/interrupt.h> 19#include <linux/interrupt.h>
@@ -25,6 +26,7 @@ struct device;
25 26
26struct sh_dmae_chan { 27struct sh_dmae_chan {
27 struct shdma_chan shdma_chan; 28 struct shdma_chan shdma_chan;
29 const struct sh_dmae_slave_config *config; /* Slave DMA configuration */
28 int xmit_shift; /* log_2(bytes_per_xfer) */ 30 int xmit_shift; /* log_2(bytes_per_xfer) */
29 u32 __iomem *base; 31 u32 __iomem *base;
30 char dev_id[16]; /* unique name per DMAC of channel */ 32 char dev_id[16]; /* unique name per DMAC of channel */
diff --git a/include/linux/sh_dma.h b/include/linux/sh_dma.h
index 7c8ca41e60e6..a79f10a32243 100644
--- a/include/linux/sh_dma.h
+++ b/include/linux/sh_dma.h
@@ -20,8 +20,6 @@ struct device;
20/* Used by slave DMA clients to request DMA to/from a specific peripheral */ 20/* Used by slave DMA clients to request DMA to/from a specific peripheral */
21struct sh_dmae_slave { 21struct sh_dmae_slave {
22 struct shdma_slave shdma_slave; /* Set by the platform */ 22 struct shdma_slave shdma_slave; /* Set by the platform */
23 struct device *dma_dev; /* Set by the platform */
24 const struct sh_dmae_slave_config *config; /* Set by the driver */
25}; 23};
26 24
27/* 25/*
diff --git a/include/linux/shdma-base.h b/include/linux/shdma-base.h
index 83efd1332b39..c3a19e9c20c4 100644
--- a/include/linux/shdma-base.h
+++ b/include/linux/shdma-base.h
@@ -66,6 +66,7 @@ struct shdma_chan {
66 size_t max_xfer_len; /* max transfer length */ 66 size_t max_xfer_len; /* max transfer length */
67 int id; /* Raw id of this channel */ 67 int id; /* Raw id of this channel */
68 int irq; /* Channel IRQ */ 68 int irq; /* Channel IRQ */
69 struct shdma_slave *slave; /* Client data for slave DMA */
69 enum shdma_pm_state pm_state; 70 enum shdma_pm_state pm_state;
70}; 71};
71 72