diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-11-21 02:57:04 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-11-21 02:57:04 -0500 |
commit | fc02e90c34bacd5d7bc77b832c65a8f06e1bd60e (patch) | |
tree | d870acafa2290779aa7c0594172bf1c691d3e6c0 /drivers/spi | |
parent | ec4e0e2fe018992d980910db901637c814575914 (diff) | |
parent | 13d428afc007fcfcd6deeb215618f54cf9c0cae6 (diff) |
Merge commit 'v2.6.28-rc6' into sched/core
Diffstat (limited to 'drivers/spi')
-rw-r--r-- | drivers/spi/pxa2xx_spi.c | 24 | ||||
-rw-r--r-- | drivers/spi/spi_imx.c | 45 |
2 files changed, 34 insertions, 35 deletions
diff --git a/drivers/spi/pxa2xx_spi.c b/drivers/spi/pxa2xx_spi.c index dae87b1a4c6e..cf12f2d84be2 100644 --- a/drivers/spi/pxa2xx_spi.c +++ b/drivers/spi/pxa2xx_spi.c | |||
@@ -352,21 +352,21 @@ static int map_dma_buffers(struct driver_data *drv_data) | |||
352 | } else | 352 | } else |
353 | drv_data->tx_map_len = drv_data->len; | 353 | drv_data->tx_map_len = drv_data->len; |
354 | 354 | ||
355 | /* Stream map the rx buffer */ | 355 | /* Stream map the tx buffer. Always do DMA_TO_DEVICE first |
356 | drv_data->rx_dma = dma_map_single(dev, drv_data->rx, | 356 | * so we flush the cache *before* invalidating it, in case |
357 | drv_data->rx_map_len, | 357 | * the tx and rx buffers overlap. |
358 | DMA_FROM_DEVICE); | 358 | */ |
359 | if (dma_mapping_error(dev, drv_data->rx_dma)) | ||
360 | return 0; | ||
361 | |||
362 | /* Stream map the tx buffer */ | ||
363 | drv_data->tx_dma = dma_map_single(dev, drv_data->tx, | 359 | drv_data->tx_dma = dma_map_single(dev, drv_data->tx, |
364 | drv_data->tx_map_len, | 360 | drv_data->tx_map_len, DMA_TO_DEVICE); |
365 | DMA_TO_DEVICE); | 361 | if (dma_mapping_error(dev, drv_data->tx_dma)) |
362 | return 0; | ||
366 | 363 | ||
367 | if (dma_mapping_error(dev, drv_data->tx_dma)) { | 364 | /* Stream map the rx buffer */ |
368 | dma_unmap_single(dev, drv_data->rx_dma, | 365 | drv_data->rx_dma = dma_map_single(dev, drv_data->rx, |
369 | drv_data->rx_map_len, DMA_FROM_DEVICE); | 366 | drv_data->rx_map_len, DMA_FROM_DEVICE); |
367 | if (dma_mapping_error(dev, drv_data->rx_dma)) { | ||
368 | dma_unmap_single(dev, drv_data->tx_dma, | ||
369 | drv_data->tx_map_len, DMA_TO_DEVICE); | ||
370 | return 0; | 370 | return 0; |
371 | } | 371 | } |
372 | 372 | ||
diff --git a/drivers/spi/spi_imx.c b/drivers/spi/spi_imx.c index 61ba147e384d..0b4db0ce78d6 100644 --- a/drivers/spi/spi_imx.c +++ b/drivers/spi/spi_imx.c | |||
@@ -506,20 +506,6 @@ static int map_dma_buffers(struct driver_data *drv_data) | |||
506 | if (!IS_DMA_ALIGNED(drv_data->rx) || !IS_DMA_ALIGNED(drv_data->tx)) | 506 | if (!IS_DMA_ALIGNED(drv_data->rx) || !IS_DMA_ALIGNED(drv_data->tx)) |
507 | return -1; | 507 | return -1; |
508 | 508 | ||
509 | /* NULL rx means write-only transfer and no map needed | ||
510 | since rx DMA will not be used */ | ||
511 | if (drv_data->rx) { | ||
512 | buf = drv_data->rx; | ||
513 | drv_data->rx_dma = dma_map_single( | ||
514 | dev, | ||
515 | buf, | ||
516 | drv_data->len, | ||
517 | DMA_FROM_DEVICE); | ||
518 | if (dma_mapping_error(dev, drv_data->rx_dma)) | ||
519 | return -1; | ||
520 | drv_data->rx_dma_needs_unmap = 1; | ||
521 | } | ||
522 | |||
523 | if (drv_data->tx == NULL) { | 509 | if (drv_data->tx == NULL) { |
524 | /* Read only message --> use drv_data->dummy_dma_buf for dummy | 510 | /* Read only message --> use drv_data->dummy_dma_buf for dummy |
525 | writes to achive reads */ | 511 | writes to achive reads */ |
@@ -533,18 +519,31 @@ static int map_dma_buffers(struct driver_data *drv_data) | |||
533 | buf, | 519 | buf, |
534 | drv_data->tx_map_len, | 520 | drv_data->tx_map_len, |
535 | DMA_TO_DEVICE); | 521 | DMA_TO_DEVICE); |
536 | if (dma_mapping_error(dev, drv_data->tx_dma)) { | 522 | if (dma_mapping_error(dev, drv_data->tx_dma)) |
537 | if (drv_data->rx_dma) { | ||
538 | dma_unmap_single(dev, | ||
539 | drv_data->rx_dma, | ||
540 | drv_data->len, | ||
541 | DMA_FROM_DEVICE); | ||
542 | drv_data->rx_dma_needs_unmap = 0; | ||
543 | } | ||
544 | return -1; | 523 | return -1; |
545 | } | ||
546 | drv_data->tx_dma_needs_unmap = 1; | 524 | drv_data->tx_dma_needs_unmap = 1; |
547 | 525 | ||
526 | /* NULL rx means write-only transfer and no map needed | ||
527 | * since rx DMA will not be used */ | ||
528 | if (drv_data->rx) { | ||
529 | buf = drv_data->rx; | ||
530 | drv_data->rx_dma = dma_map_single(dev, | ||
531 | buf, | ||
532 | drv_data->len, | ||
533 | DMA_FROM_DEVICE); | ||
534 | if (dma_mapping_error(dev, drv_data->rx_dma)) { | ||
535 | if (drv_data->tx_dma) { | ||
536 | dma_unmap_single(dev, | ||
537 | drv_data->tx_dma, | ||
538 | drv_data->tx_map_len, | ||
539 | DMA_TO_DEVICE); | ||
540 | drv_data->tx_dma_needs_unmap = 0; | ||
541 | } | ||
542 | return -1; | ||
543 | } | ||
544 | drv_data->rx_dma_needs_unmap = 1; | ||
545 | } | ||
546 | |||
548 | return 0; | 547 | return 0; |
549 | } | 548 | } |
550 | 549 | ||