1.1 --- a/pkg/devices/lib/spi/src/jz4780.cc Thu Nov 09 18:40:31 2023 +0100
1.2 +++ b/pkg/devices/lib/spi/src/jz4780.cc Fri Nov 10 02:02:11 2023 +0100
1.3 @@ -345,7 +345,9 @@
1.4 uint32_t
1.5 Spi_jz4780_channel::transfer(l4re_dma_space_dma_addr_t paddr,
1.6 uint32_t count, uint8_t unit_size,
1.7 - uint8_t char_size)
1.8 + uint8_t char_size,
1.9 + l4_addr_t desc_vaddr,
1.10 + l4re_dma_space_dma_addr_t desc_paddr)
1.11 {
1.12 configure_transfer(char_size);
1.13
1.14 @@ -354,12 +356,18 @@
1.15 uint32_t to_transfer = _dma->transfer(paddr, _spi_start + Ssi_data,
1.16 unit_count, true, false,
1.17 unit_size, unit_size, unit_size,
1.18 - _request_type);
1.19 + _request_type, desc_vaddr, desc_paddr);
1.20 +
1.21 + /* Wait if not using a descriptor, which could be causing an endless,
1.22 + repeating transfer. */
1.23
1.24 - if (to_transfer)
1.25 + if (to_transfer && !desc_vaddr)
1.26 + {
1.27 transferred = to_transfer ? (unit_count - _dma->wait()) * unit_size : 0;
1.28 -
1.29 - wait_busy();
1.30 + wait_busy();
1.31 + }
1.32 + else
1.33 + transferred = to_transfer;
1.34
1.35 return transferred;
1.36 }
1.37 @@ -440,3 +448,12 @@
1.38 return static_cast<Spi_jz4780_channel *>(channel)->transfer(paddr, count,
1.39 unit_size, char_size);
1.40 }
1.41 +
1.42 +uint32_t jz4780_spi_transfer_descriptor(void *channel, l4re_dma_space_dma_addr_t paddr,
1.43 + uint32_t count, uint8_t unit_size,
1.44 + uint8_t char_size, l4_addr_t desc_vaddr,
1.45 + l4re_dma_space_dma_addr_t desc_paddr)
1.46 +{
1.47 + return static_cast<Spi_jz4780_channel *>(channel)->transfer(paddr, count,
1.48 + unit_size, char_size, desc_vaddr, desc_paddr);
1.49 +}