diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2012-05-16 06:33:31 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2012-07-01 09:15:47 -0400 |
| commit | 800d683e6b8f0ba630470a56b61ff6742ad129ad (patch) | |
| tree | d99a4be8cd9ad1f423293771507acb6a6c80a95b | |
| parent | 9862ba17b7b6866cbee90547ff1f58d055c13f97 (diff) | |
dmaengine: PL08x: ignore 'direction' argument in dma_slave_config
Ignore the direction argument in dma_slave_config, and configure both
directions independently. We still check that the configuration for
the intended direction is valid; this check will eventually be dropped.
This check is just for debugging at present.
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Tested-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
| -rw-r--r-- | drivers/dma/amba-pl08x.c | 56 |
1 files changed, 18 insertions, 38 deletions
diff --git a/drivers/dma/amba-pl08x.c b/drivers/dma/amba-pl08x.c index fde801f787cd..50b9a839e9c3 100644 --- a/drivers/dma/amba-pl08x.c +++ b/drivers/dma/amba-pl08x.c | |||
| @@ -218,8 +218,6 @@ enum pl08x_dma_chan_state { | |||
| 218 | * @name: name of channel | 218 | * @name: name of channel |
| 219 | * @cd: channel platform data | 219 | * @cd: channel platform data |
| 220 | * @runtime_addr: address for RX/TX according to the runtime config | 220 | * @runtime_addr: address for RX/TX according to the runtime config |
| 221 | * @runtime_direction: current direction of this channel according to | ||
| 222 | * runtime config | ||
| 223 | * @pend_list: queued transactions pending on this channel | 221 | * @pend_list: queued transactions pending on this channel |
| 224 | * @at: active transaction on this channel | 222 | * @at: active transaction on this channel |
| 225 | * @lock: a lock for this channel data | 223 | * @lock: a lock for this channel data |
| @@ -239,7 +237,6 @@ struct pl08x_dma_chan { | |||
| 239 | struct dma_slave_config cfg; | 237 | struct dma_slave_config cfg; |
| 240 | u32 src_cctl; | 238 | u32 src_cctl; |
| 241 | u32 dst_cctl; | 239 | u32 dst_cctl; |
| 242 | enum dma_transfer_direction runtime_direction; | ||
| 243 | struct list_head pend_list; | 240 | struct list_head pend_list; |
| 244 | struct pl08x_txd *at; | 241 | struct pl08x_txd *at; |
| 245 | spinlock_t lock; | 242 | spinlock_t lock; |
| @@ -1239,50 +1236,31 @@ static int dma_set_runtime_config(struct dma_chan *chan, | |||
| 1239 | { | 1236 | { |
| 1240 | struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); | 1237 | struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); |
| 1241 | struct pl08x_driver_data *pl08x = plchan->host; | 1238 | struct pl08x_driver_data *pl08x = plchan->host; |
| 1242 | enum dma_slave_buswidth addr_width; | 1239 | u32 src_cctl, dst_cctl; |
| 1243 | u32 maxburst, cctl = 0; | ||
| 1244 | 1240 | ||
| 1245 | if (!plchan->slave) | 1241 | if (!plchan->slave) |
| 1246 | return -EINVAL; | 1242 | return -EINVAL; |
| 1247 | 1243 | ||
| 1248 | /* Transfer direction */ | 1244 | dst_cctl = pl08x_get_cctl(plchan, config->dst_addr_width, |
| 1249 | plchan->runtime_direction = config->direction; | 1245 | config->dst_maxburst); |
| 1250 | if (config->direction == DMA_MEM_TO_DEV) { | 1246 | if (dst_cctl == ~0 && config->direction == DMA_MEM_TO_DEV) { |
| 1251 | addr_width = config->dst_addr_width; | ||
| 1252 | maxburst = config->dst_maxburst; | ||
| 1253 | } else if (config->direction == DMA_DEV_TO_MEM) { | ||
| 1254 | addr_width = config->src_addr_width; | ||
| 1255 | maxburst = config->src_maxburst; | ||
| 1256 | } else { | ||
| 1257 | dev_err(&pl08x->adev->dev, | 1247 | dev_err(&pl08x->adev->dev, |
| 1258 | "bad runtime_config: alien transfer direction\n"); | 1248 | "bad runtime_config: alien address width (M2D)\n"); |
| 1259 | return -EINVAL; | 1249 | return -EINVAL; |
| 1260 | } | 1250 | } |
| 1261 | 1251 | ||
| 1262 | cctl = pl08x_get_cctl(plchan, addr_width, maxburst); | 1252 | src_cctl = pl08x_get_cctl(plchan, config->src_addr_width, |
| 1263 | if (cctl == ~0) { | 1253 | config->src_maxburst); |
| 1254 | if (src_cctl == ~0 && config->direction == DMA_DEV_TO_MEM) { | ||
| 1264 | dev_err(&pl08x->adev->dev, | 1255 | dev_err(&pl08x->adev->dev, |
| 1265 | "bad runtime_config: alien address width\n"); | 1256 | "bad runtime_config: alien address width (D2M)\n"); |
| 1266 | return -EINVAL; | 1257 | return -EINVAL; |
| 1267 | } | 1258 | } |
| 1268 | 1259 | ||
| 1260 | plchan->dst_cctl = dst_cctl; | ||
| 1261 | plchan->src_cctl = src_cctl; | ||
| 1269 | plchan->cfg = *config; | 1262 | plchan->cfg = *config; |
| 1270 | 1263 | ||
| 1271 | if (plchan->runtime_direction == DMA_DEV_TO_MEM) { | ||
| 1272 | plchan->src_cctl = cctl; | ||
| 1273 | } else { | ||
| 1274 | plchan->dst_cctl = cctl; | ||
| 1275 | } | ||
| 1276 | |||
| 1277 | dev_dbg(&pl08x->adev->dev, | ||
| 1278 | "configured channel %s (%s) for %s, data width %d, " | ||
| 1279 | "maxburst %d words, LE, CCTL=0x%08x\n", | ||
| 1280 | dma_chan_name(chan), plchan->name, | ||
| 1281 | (config->direction == DMA_DEV_TO_MEM) ? "RX" : "TX", | ||
| 1282 | addr_width, | ||
| 1283 | maxburst, | ||
| 1284 | cctl); | ||
| 1285 | |||
| 1286 | return 0; | 1264 | return 0; |
| 1287 | } | 1265 | } |
| 1288 | 1266 | ||
| @@ -1470,11 +1448,6 @@ static struct dma_async_tx_descriptor *pl08x_prep_slave_sg( | |||
| 1470 | return NULL; | 1448 | return NULL; |
| 1471 | } | 1449 | } |
| 1472 | 1450 | ||
| 1473 | if (direction != plchan->runtime_direction) | ||
| 1474 | dev_err(&pl08x->adev->dev, "%s DMA setup does not match " | ||
| 1475 | "the direction configured for the PrimeCell\n", | ||
| 1476 | __func__); | ||
| 1477 | |||
| 1478 | /* | 1451 | /* |
| 1479 | * Set up addresses, the PrimeCell configured address | 1452 | * Set up addresses, the PrimeCell configured address |
| 1480 | * will take precedence since this may configure the | 1453 | * will take precedence since this may configure the |
| @@ -1499,6 +1472,13 @@ static struct dma_async_tx_descriptor *pl08x_prep_slave_sg( | |||
| 1499 | return NULL; | 1472 | return NULL; |
| 1500 | } | 1473 | } |
| 1501 | 1474 | ||
| 1475 | if (cctl == ~0) { | ||
| 1476 | pl08x_free_txd(pl08x, txd); | ||
| 1477 | dev_err(&pl08x->adev->dev, | ||
| 1478 | "DMA slave configuration botched?\n"); | ||
| 1479 | return NULL; | ||
| 1480 | } | ||
| 1481 | |||
| 1502 | txd->cctl = cctl | pl08x_select_bus(src_buses, dst_buses); | 1482 | txd->cctl = cctl | pl08x_select_bus(src_buses, dst_buses); |
| 1503 | 1483 | ||
| 1504 | if (plchan->cfg.device_fc) | 1484 | if (plchan->cfg.device_fc) |
