Lines Matching +full:spi +full:- +full:controller

1 // SPDX-License-Identifier: GPL-2.0-only
3 * PXA2xx SPI DMA engine support.
10 #include <linux/dma-mapping.h>
15 #include <linux/spi/spi.h>
16 #include <linux/spi/pxa2xx_spi.h>
18 #include "spi-pxa2xx.h"
23 struct spi_message *msg = drv_data->controller->cur_msg; in pxa2xx_spi_dma_transfer_complete()
29 * by using ->dma_running. in pxa2xx_spi_dma_transfer_complete()
31 if (atomic_dec_and_test(&drv_data->dma_running)) { in pxa2xx_spi_dma_transfer_complete()
34 * might not know about the error yet. So we re-check the in pxa2xx_spi_dma_transfer_complete()
39 & drv_data->mask_sr; in pxa2xx_spi_dma_transfer_complete()
46 & ~drv_data->dma_cr1); in pxa2xx_spi_dma_transfer_complete()
47 write_SSSR_CS(drv_data, drv_data->clear_sr); in pxa2xx_spi_dma_transfer_complete()
56 msg->status = -EIO; in pxa2xx_spi_dma_transfer_complete()
59 spi_finalize_current_transfer(drv_data->controller); in pxa2xx_spi_dma_transfer_complete()
74 spi_get_ctldata(drv_data->controller->cur_msg->spi); in pxa2xx_spi_dma_prepare_one()
81 switch (drv_data->n_bytes) { in pxa2xx_spi_dma_prepare_one()
97 cfg.dst_addr = drv_data->ssdr_physical; in pxa2xx_spi_dma_prepare_one()
99 cfg.dst_maxburst = chip->dma_burst_size; in pxa2xx_spi_dma_prepare_one()
101 sgt = &xfer->tx_sg; in pxa2xx_spi_dma_prepare_one()
102 chan = drv_data->controller->dma_tx; in pxa2xx_spi_dma_prepare_one()
104 cfg.src_addr = drv_data->ssdr_physical; in pxa2xx_spi_dma_prepare_one()
106 cfg.src_maxburst = chip->dma_burst_size; in pxa2xx_spi_dma_prepare_one()
108 sgt = &xfer->rx_sg; in pxa2xx_spi_dma_prepare_one()
109 chan = drv_data->controller->dma_rx; in pxa2xx_spi_dma_prepare_one()
114 dev_warn(&drv_data->pdev->dev, "DMA slave config failed\n"); in pxa2xx_spi_dma_prepare_one()
118 return dmaengine_prep_slave_sg(chan, sgt->sgl, sgt->nents, dir, in pxa2xx_spi_dma_prepare_one()
126 status = pxa2xx_spi_read(drv_data, SSSR) & drv_data->mask_sr; in pxa2xx_spi_dma_transfer()
128 dev_err(&drv_data->pdev->dev, "FIFO overrun\n"); in pxa2xx_spi_dma_transfer()
130 dmaengine_terminate_async(drv_data->controller->dma_rx); in pxa2xx_spi_dma_transfer()
131 dmaengine_terminate_async(drv_data->controller->dma_tx); in pxa2xx_spi_dma_transfer()
148 dev_err(&drv_data->pdev->dev, in pxa2xx_spi_dma_prepare()
150 err = -EBUSY; in pxa2xx_spi_dma_prepare()
156 dev_err(&drv_data->pdev->dev, in pxa2xx_spi_dma_prepare()
158 err = -EBUSY; in pxa2xx_spi_dma_prepare()
163 rx_desc->callback = pxa2xx_spi_dma_callback; in pxa2xx_spi_dma_prepare()
164 rx_desc->callback_param = drv_data; in pxa2xx_spi_dma_prepare()
171 dmaengine_terminate_async(drv_data->controller->dma_tx); in pxa2xx_spi_dma_prepare()
178 dma_async_issue_pending(drv_data->controller->dma_rx); in pxa2xx_spi_dma_start()
179 dma_async_issue_pending(drv_data->controller->dma_tx); in pxa2xx_spi_dma_start()
181 atomic_set(&drv_data->dma_running, 1); in pxa2xx_spi_dma_start()
186 atomic_set(&drv_data->dma_running, 0); in pxa2xx_spi_dma_stop()
187 dmaengine_terminate_sync(drv_data->controller->dma_rx); in pxa2xx_spi_dma_stop()
188 dmaengine_terminate_sync(drv_data->controller->dma_tx); in pxa2xx_spi_dma_stop()
193 struct pxa2xx_spi_controller *pdata = drv_data->controller_info; in pxa2xx_spi_dma_setup()
194 struct device *dev = &drv_data->pdev->dev; in pxa2xx_spi_dma_setup()
195 struct spi_controller *controller = drv_data->controller; in pxa2xx_spi_dma_setup() local
201 controller->dma_tx = dma_request_slave_channel_compat(mask, in pxa2xx_spi_dma_setup()
202 pdata->dma_filter, pdata->tx_param, dev, "tx"); in pxa2xx_spi_dma_setup()
203 if (!controller->dma_tx) in pxa2xx_spi_dma_setup()
204 return -ENODEV; in pxa2xx_spi_dma_setup()
206 controller->dma_rx = dma_request_slave_channel_compat(mask, in pxa2xx_spi_dma_setup()
207 pdata->dma_filter, pdata->rx_param, dev, "rx"); in pxa2xx_spi_dma_setup()
208 if (!controller->dma_rx) { in pxa2xx_spi_dma_setup()
209 dma_release_channel(controller->dma_tx); in pxa2xx_spi_dma_setup()
210 controller->dma_tx = NULL; in pxa2xx_spi_dma_setup()
211 return -ENODEV; in pxa2xx_spi_dma_setup()
219 struct spi_controller *controller = drv_data->controller; in pxa2xx_spi_dma_release() local
221 if (controller->dma_rx) { in pxa2xx_spi_dma_release()
222 dmaengine_terminate_sync(controller->dma_rx); in pxa2xx_spi_dma_release()
223 dma_release_channel(controller->dma_rx); in pxa2xx_spi_dma_release()
224 controller->dma_rx = NULL; in pxa2xx_spi_dma_release()
226 if (controller->dma_tx) { in pxa2xx_spi_dma_release()
227 dmaengine_terminate_sync(controller->dma_tx); in pxa2xx_spi_dma_release()
228 dma_release_channel(controller->dma_tx); in pxa2xx_spi_dma_release()
229 controller->dma_tx = NULL; in pxa2xx_spi_dma_release()
234 struct spi_device *spi, in pxa2xx_spi_set_dma_burst_and_threshold() argument
238 struct pxa2xx_spi_chip *chip_info = spi->controller_data; in pxa2xx_spi_set_dma_burst_and_threshold()
239 struct driver_data *drv_data = spi_controller_get_devdata(spi->controller); in pxa2xx_spi_set_dma_burst_and_threshold()
240 u32 dma_burst_size = drv_data->controller_info->dma_burst_size; in pxa2xx_spi_set_dma_burst_and_threshold()
247 *burst_code = chip_info ? chip_info->dma_burst_size : dma_burst_size; in pxa2xx_spi_set_dma_burst_and_threshold()