diff options
author | Jarkko Nikula <jarkko.nikula@linux.intel.com> | 2016-06-21 06:21:34 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2016-06-21 13:44:48 -0400 |
commit | b6ced294fb61418e7d3fc30bac696f313551d412 (patch) | |
tree | 88220341a7d916b53e47710b62a16efc10423571 /drivers/spi/spi-pxa2xx.c | |
parent | 2d7537d8f64184debed89a57aa7bea5d27b76a90 (diff) |
spi: pxa2xx: Switch to SPI core DMA mapping functionality
SPI core provides DMA mapping with scatterlists. Start using it instead
of own implementation in spi-pxa2xx. Major difference in addition to
bunch of removed boilerplate code is that SPI core does
mapping/unmapping for all transfers in a message before and after the
message sending where spi-pxa2xx did mapping/unmapping for each
transfers separately.
Signed-off-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/spi/spi-pxa2xx.c')
-rw-r--r-- | drivers/spi/spi-pxa2xx.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c index e5c457abb596..3e90a4ce668b 100644 --- a/drivers/spi/spi-pxa2xx.c +++ b/drivers/spi/spi-pxa2xx.c | |||
@@ -912,6 +912,17 @@ static unsigned int pxa2xx_ssp_get_clk_div(struct driver_data *drv_data, | |||
912 | return clk_div << 8; | 912 | return clk_div << 8; |
913 | } | 913 | } |
914 | 914 | ||
915 | static bool pxa2xx_spi_can_dma(struct spi_master *master, | ||
916 | struct spi_device *spi, | ||
917 | struct spi_transfer *xfer) | ||
918 | { | ||
919 | struct chip_data *chip = spi_get_ctldata(spi); | ||
920 | |||
921 | return chip->enable_dma && | ||
922 | xfer->len <= MAX_DMA_LEN && | ||
923 | xfer->len >= chip->dma_burst_size; | ||
924 | } | ||
925 | |||
915 | static void pump_transfers(unsigned long data) | 926 | static void pump_transfers(unsigned long data) |
916 | { | 927 | { |
917 | struct driver_data *drv_data = (struct driver_data *)data; | 928 | struct driver_data *drv_data = (struct driver_data *)data; |
@@ -929,6 +940,7 @@ static void pump_transfers(unsigned long data) | |||
929 | u32 dma_burst = drv_data->cur_chip->dma_burst_size; | 940 | u32 dma_burst = drv_data->cur_chip->dma_burst_size; |
930 | u32 change_mask = pxa2xx_spi_get_ssrc1_change_mask(drv_data); | 941 | u32 change_mask = pxa2xx_spi_get_ssrc1_change_mask(drv_data); |
931 | int err; | 942 | int err; |
943 | int dma_mapped; | ||
932 | 944 | ||
933 | /* Get current state information */ | 945 | /* Get current state information */ |
934 | message = drv_data->cur_msg; | 946 | message = drv_data->cur_msg; |
@@ -963,7 +975,7 @@ static void pump_transfers(unsigned long data) | |||
963 | } | 975 | } |
964 | 976 | ||
965 | /* Check if we can DMA this transfer */ | 977 | /* Check if we can DMA this transfer */ |
966 | if (!pxa2xx_spi_dma_is_possible(transfer->len) && chip->enable_dma) { | 978 | if (transfer->len > MAX_DMA_LEN && chip->enable_dma) { |
967 | 979 | ||
968 | /* reject already-mapped transfers; PIO won't always work */ | 980 | /* reject already-mapped transfers; PIO won't always work */ |
969 | if (message->is_dma_mapped | 981 | if (message->is_dma_mapped |
@@ -1040,10 +1052,10 @@ static void pump_transfers(unsigned long data) | |||
1040 | 1052 | ||
1041 | message->state = RUNNING_STATE; | 1053 | message->state = RUNNING_STATE; |
1042 | 1054 | ||
1043 | drv_data->dma_mapped = 0; | 1055 | dma_mapped = master->can_dma && |
1044 | if (pxa2xx_spi_dma_is_possible(drv_data->len)) | 1056 | master->can_dma(master, message->spi, transfer) && |
1045 | drv_data->dma_mapped = pxa2xx_spi_map_dma_buffers(drv_data); | 1057 | master->cur_msg_mapped; |
1046 | if (drv_data->dma_mapped) { | 1058 | if (dma_mapped) { |
1047 | 1059 | ||
1048 | /* Ensure we have the correct interrupt handler */ | 1060 | /* Ensure we have the correct interrupt handler */ |
1049 | drv_data->transfer_handler = pxa2xx_spi_dma_transfer; | 1061 | drv_data->transfer_handler = pxa2xx_spi_dma_transfer; |
@@ -1075,12 +1087,12 @@ static void pump_transfers(unsigned long data) | |||
1075 | dev_dbg(&message->spi->dev, "%u Hz actual, %s\n", | 1087 | dev_dbg(&message->spi->dev, "%u Hz actual, %s\n", |
1076 | master->max_speed_hz | 1088 | master->max_speed_hz |
1077 | / (1 + ((cr0 & SSCR0_SCR(0xfff)) >> 8)), | 1089 | / (1 + ((cr0 & SSCR0_SCR(0xfff)) >> 8)), |
1078 | drv_data->dma_mapped ? "DMA" : "PIO"); | 1090 | dma_mapped ? "DMA" : "PIO"); |
1079 | else | 1091 | else |
1080 | dev_dbg(&message->spi->dev, "%u Hz actual, %s\n", | 1092 | dev_dbg(&message->spi->dev, "%u Hz actual, %s\n", |
1081 | master->max_speed_hz / 2 | 1093 | master->max_speed_hz / 2 |
1082 | / (1 + ((cr0 & SSCR0_SCR(0x0ff)) >> 8)), | 1094 | / (1 + ((cr0 & SSCR0_SCR(0x0ff)) >> 8)), |
1083 | drv_data->dma_mapped ? "DMA" : "PIO"); | 1095 | dma_mapped ? "DMA" : "PIO"); |
1084 | 1096 | ||
1085 | if (is_lpss_ssp(drv_data)) { | 1097 | if (is_lpss_ssp(drv_data)) { |
1086 | if ((pxa2xx_spi_read(drv_data, SSIRF) & 0xff) | 1098 | if ((pxa2xx_spi_read(drv_data, SSIRF) & 0xff) |
@@ -1594,6 +1606,8 @@ static int pxa2xx_spi_probe(struct platform_device *pdev) | |||
1594 | if (status) { | 1606 | if (status) { |
1595 | dev_dbg(dev, "no DMA channels available, using PIO\n"); | 1607 | dev_dbg(dev, "no DMA channels available, using PIO\n"); |
1596 | platform_info->enable_dma = false; | 1608 | platform_info->enable_dma = false; |
1609 | } else { | ||
1610 | master->can_dma = pxa2xx_spi_can_dma; | ||
1597 | } | 1611 | } |
1598 | } | 1612 | } |
1599 | 1613 | ||