From 937ea26ef6e2652fe4e4bc671ae26e80f6b75852 Mon Sep 17 00:00:00 2001 From: Ashish Kori Date: Thu, 18 Jun 2020 18:44:37 +0530 Subject: [PATCH] spi: spi-msm-geni: Add support to disable dma mode for SPI transfers QUPv3 controller supports different modes of data transfers for SPI. Add support to choose only fifo mode for data transfers. Currently SSC DMA path is broken as agnoc is not enabled. This clk is owned by SLPI, once SLPI change is mainlined we can use DMA mode for SSC QUP also. Change-Id: Ie4c67be29adba9d6c5a5bb1b9eb2161a2b384100 Signed-off-by: Ashish Kori --- drivers/spi/spi-msm-geni.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/drivers/spi/spi-msm-geni.c b/drivers/spi/spi-msm-geni.c index e28ed6b9a1c4..68ab4e5677cc 100644 --- a/drivers/spi/spi-msm-geni.c +++ b/drivers/spi/spi-msm-geni.c @@ -168,6 +168,7 @@ struct spi_geni_master { bool set_miso_sampling; u32 miso_sampling_ctrl_val; bool gpi_reset; /* GPI channel reset*/ + bool disable_dma; }; static struct spi_master *get_spi_master(struct device *dev) @@ -1330,17 +1331,16 @@ static int setup_fifo_xfer(struct spi_transfer *xfer, fifo_size = (mas->tx_fifo_depth * mas->tx_fifo_width / mas->cur_word_len); - if (trans_len > fifo_size) { - if (mas->cur_xfer_mode != SE_DMA) { - mas->cur_xfer_mode = SE_DMA; - geni_se_select_mode(mas->base, mas->cur_xfer_mode); - } - } else { - if (mas->cur_xfer_mode != FIFO_MODE) { - mas->cur_xfer_mode = FIFO_MODE; - geni_se_select_mode(mas->base, mas->cur_xfer_mode); - } - } + /* + * Controller has support to transfer data either in FIFO mode + * or in SE_DMA mode. Either force the controller to choose FIFO + * mode for transfers or select the mode dynamically based on + * size of data. + */ + mas->cur_xfer_mode = SE_DMA; + if (mas->disable_dma || trans_len <= fifo_size) + mas->cur_xfer_mode = FIFO_MODE; + geni_se_select_mode(mas->base, mas->cur_xfer_mode); geni_write_reg(spi_tx_cfg, mas->base, SE_SPI_TRANS_CFG); geni_setup_m_cmd(mas->base, m_cmd, m_param); @@ -1923,6 +1923,10 @@ static int spi_geni_probe(struct platform_device *pdev) goto spi_geni_probe_err; } + geni_mas->disable_dma = of_property_read_bool(pdev->dev.of_node, + "qcom,disable-dma"); + + spi->mode_bits = (SPI_CPOL | SPI_CPHA | SPI_LOOP | SPI_CS_HIGH); spi->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32); spi->num_chipselect = SPI_NUM_CHIPSELECT;