e289df8234
The granularity of DMA mappings is transfer and moreover, the direction is also important as it can be unidirect. The current cur_msg_mapped flag doesn't fit well the DMA mapping and syncing calls and we have tons of checks around on top of it. So, instead of doing that rework the code to use per transfer per direction flag to show if it's DMA mapped or not. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-QRD Link: https://lore.kernel.org/r/20240531194723.1761567-9-andriy.shevchenko@linux.intel.com Reviewed-by: Serge Semin <fancer.lancer@gmail.com> Tested-by: Nícolas F. R. A. Prado <nfraprado@collabora.com> Signed-off-by: Mark Brown <broonie@kernel.org>
52 lines
1.5 KiB
C
52 lines
1.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0+ */
|
|
/*
|
|
* Copyright (C) 2018 Exceet Electronics GmbH
|
|
* Copyright (C) 2018 Bootlin
|
|
*
|
|
* Author: Boris Brezillon <boris.brezillon@bootlin.com>
|
|
*
|
|
* Helpers needed by the spi or spi-mem logic. Should not be used outside of
|
|
* spi-mem.c and spi.c.
|
|
*/
|
|
|
|
#ifndef __LINUX_SPI_INTERNALS_H
|
|
#define __LINUX_SPI_INTERNALS_H
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/dma-direction.h>
|
|
#include <linux/scatterlist.h>
|
|
#include <linux/spi/spi.h>
|
|
|
|
void spi_flush_queue(struct spi_controller *ctrl);
|
|
|
|
#ifdef CONFIG_HAS_DMA
|
|
int spi_map_buf(struct spi_controller *ctlr, struct device *dev,
|
|
struct sg_table *sgt, void *buf, size_t len,
|
|
enum dma_data_direction dir);
|
|
void spi_unmap_buf(struct spi_controller *ctlr, struct device *dev,
|
|
struct sg_table *sgt, enum dma_data_direction dir);
|
|
#else /* !CONFIG_HAS_DMA */
|
|
static inline int spi_map_buf(struct spi_controller *ctlr, struct device *dev,
|
|
struct sg_table *sgt, void *buf, size_t len,
|
|
enum dma_data_direction dir)
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
|
|
static inline void spi_unmap_buf(struct spi_controller *ctlr,
|
|
struct device *dev, struct sg_table *sgt,
|
|
enum dma_data_direction dir)
|
|
{
|
|
}
|
|
#endif /* CONFIG_HAS_DMA */
|
|
|
|
static inline bool spi_xfer_is_dma_mapped(struct spi_controller *ctlr,
|
|
struct spi_device *spi,
|
|
struct spi_transfer *xfer)
|
|
{
|
|
return ctlr->can_dma && ctlr->can_dma(ctlr, spi, xfer) &&
|
|
(xfer->tx_sg_mapped || xfer->rx_sg_mapped);
|
|
}
|
|
|
|
#endif /* __LINUX_SPI_INTERNALS_H */
|