Lines Matching refs:dws

36 static void dw_spi_dma_maxburst_init(struct dw_spi *dws)  in dw_spi_dma_maxburst_init()  argument
42 def_burst = dws->fifo_len / 2; in dw_spi_dma_maxburst_init()
44 ret = dma_get_slave_caps(dws->rxchan, &caps); in dw_spi_dma_maxburst_init()
50 dws->rxburst = min(max_burst, def_burst); in dw_spi_dma_maxburst_init()
51 dw_writel(dws, DW_SPI_DMARDLR, dws->rxburst - 1); in dw_spi_dma_maxburst_init()
53 ret = dma_get_slave_caps(dws->txchan, &caps); in dw_spi_dma_maxburst_init()
70 dws->txburst = min(max_burst, def_burst); in dw_spi_dma_maxburst_init()
71 dw_writel(dws, DW_SPI_DMATDLR, dws->txburst); in dw_spi_dma_maxburst_init()
74 static void dw_spi_dma_sg_burst_init(struct dw_spi *dws) in dw_spi_dma_sg_burst_init() argument
78 dma_get_slave_caps(dws->txchan, &tx); in dw_spi_dma_sg_burst_init()
79 dma_get_slave_caps(dws->rxchan, &rx); in dw_spi_dma_sg_burst_init()
82 dws->dma_sg_burst = min(tx.max_sg_burst, rx.max_sg_burst); in dw_spi_dma_sg_burst_init()
84 dws->dma_sg_burst = tx.max_sg_burst; in dw_spi_dma_sg_burst_init()
86 dws->dma_sg_burst = rx.max_sg_burst; in dw_spi_dma_sg_burst_init()
88 dws->dma_sg_burst = 0; in dw_spi_dma_sg_burst_init()
91 static int dw_spi_dma_init_mfld(struct device *dev, struct dw_spi *dws) in dw_spi_dma_init_mfld() argument
111 dws->rxchan = dma_request_channel(mask, dw_spi_dma_chan_filter, rx); in dw_spi_dma_init_mfld()
112 if (!dws->rxchan) in dw_spi_dma_init_mfld()
117 dws->txchan = dma_request_channel(mask, dw_spi_dma_chan_filter, tx); in dw_spi_dma_init_mfld()
118 if (!dws->txchan) in dw_spi_dma_init_mfld()
121 dws->master->dma_rx = dws->rxchan; in dw_spi_dma_init_mfld()
122 dws->master->dma_tx = dws->txchan; in dw_spi_dma_init_mfld()
124 init_completion(&dws->dma_completion); in dw_spi_dma_init_mfld()
126 dw_spi_dma_maxburst_init(dws); in dw_spi_dma_init_mfld()
128 dw_spi_dma_sg_burst_init(dws); in dw_spi_dma_init_mfld()
135 dma_release_channel(dws->rxchan); in dw_spi_dma_init_mfld()
136 dws->rxchan = NULL; in dw_spi_dma_init_mfld()
142 static int dw_spi_dma_init_generic(struct device *dev, struct dw_spi *dws) in dw_spi_dma_init_generic() argument
144 dws->rxchan = dma_request_slave_channel(dev, "rx"); in dw_spi_dma_init_generic()
145 if (!dws->rxchan) in dw_spi_dma_init_generic()
148 dws->txchan = dma_request_slave_channel(dev, "tx"); in dw_spi_dma_init_generic()
149 if (!dws->txchan) { in dw_spi_dma_init_generic()
150 dma_release_channel(dws->rxchan); in dw_spi_dma_init_generic()
151 dws->rxchan = NULL; in dw_spi_dma_init_generic()
155 dws->master->dma_rx = dws->rxchan; in dw_spi_dma_init_generic()
156 dws->master->dma_tx = dws->txchan; in dw_spi_dma_init_generic()
158 init_completion(&dws->dma_completion); in dw_spi_dma_init_generic()
160 dw_spi_dma_maxburst_init(dws); in dw_spi_dma_init_generic()
162 dw_spi_dma_sg_burst_init(dws); in dw_spi_dma_init_generic()
167 static void dw_spi_dma_exit(struct dw_spi *dws) in dw_spi_dma_exit() argument
169 if (dws->txchan) { in dw_spi_dma_exit()
170 dmaengine_terminate_sync(dws->txchan); in dw_spi_dma_exit()
171 dma_release_channel(dws->txchan); in dw_spi_dma_exit()
174 if (dws->rxchan) { in dw_spi_dma_exit()
175 dmaengine_terminate_sync(dws->rxchan); in dw_spi_dma_exit()
176 dma_release_channel(dws->rxchan); in dw_spi_dma_exit()
180 static irqreturn_t dw_spi_dma_transfer_handler(struct dw_spi *dws) in dw_spi_dma_transfer_handler() argument
182 dw_spi_check_status(dws, false); in dw_spi_dma_transfer_handler()
184 complete(&dws->dma_completion); in dw_spi_dma_transfer_handler()
192 struct dw_spi *dws = spi_controller_get_devdata(master); in dw_spi_can_dma() local
194 return xfer->len > dws->fifo_len; in dw_spi_can_dma()
207 static int dw_spi_dma_wait(struct dw_spi *dws, unsigned int len, u32 speed) in dw_spi_dma_wait() argument
218 ms = wait_for_completion_timeout(&dws->dma_completion, in dw_spi_dma_wait()
222 dev_err(&dws->master->cur_msg->spi->dev, in dw_spi_dma_wait()
230 static inline bool dw_spi_dma_tx_busy(struct dw_spi *dws) in dw_spi_dma_tx_busy() argument
232 return !(dw_readl(dws, DW_SPI_SR) & SR_TF_EMPT); in dw_spi_dma_tx_busy()
235 static int dw_spi_dma_wait_tx_done(struct dw_spi *dws, in dw_spi_dma_wait_tx_done() argument
242 nents = dw_readl(dws, DW_SPI_TXFLR); in dw_spi_dma_wait_tx_done()
244 delay.value = nents * dws->n_bytes * BITS_PER_BYTE; in dw_spi_dma_wait_tx_done()
246 while (dw_spi_dma_tx_busy(dws) && retry--) in dw_spi_dma_wait_tx_done()
250 dev_err(&dws->master->dev, "Tx hanged up\n"); in dw_spi_dma_wait_tx_done()
263 struct dw_spi *dws = arg; in dw_spi_dma_tx_done() local
265 clear_bit(TX_BUSY, &dws->dma_chan_busy); in dw_spi_dma_tx_done()
266 if (test_bit(RX_BUSY, &dws->dma_chan_busy)) in dw_spi_dma_tx_done()
269 complete(&dws->dma_completion); in dw_spi_dma_tx_done()
272 static int dw_spi_dma_config_tx(struct dw_spi *dws) in dw_spi_dma_config_tx() argument
278 txconf.dst_addr = dws->dma_addr; in dw_spi_dma_config_tx()
279 txconf.dst_maxburst = dws->txburst; in dw_spi_dma_config_tx()
281 txconf.dst_addr_width = dw_spi_dma_convert_width(dws->n_bytes); in dw_spi_dma_config_tx()
284 return dmaengine_slave_config(dws->txchan, &txconf); in dw_spi_dma_config_tx()
287 static int dw_spi_dma_submit_tx(struct dw_spi *dws, struct scatterlist *sgl, in dw_spi_dma_submit_tx() argument
294 txdesc = dmaengine_prep_slave_sg(dws->txchan, sgl, nents, in dw_spi_dma_submit_tx()
301 txdesc->callback_param = dws; in dw_spi_dma_submit_tx()
306 dmaengine_terminate_sync(dws->txchan); in dw_spi_dma_submit_tx()
310 set_bit(TX_BUSY, &dws->dma_chan_busy); in dw_spi_dma_submit_tx()
315 static inline bool dw_spi_dma_rx_busy(struct dw_spi *dws) in dw_spi_dma_rx_busy() argument
317 return !!(dw_readl(dws, DW_SPI_SR) & SR_RF_NOT_EMPT); in dw_spi_dma_rx_busy()
320 static int dw_spi_dma_wait_rx_done(struct dw_spi *dws) in dw_spi_dma_wait_rx_done() argument
336 nents = dw_readl(dws, DW_SPI_RXFLR); in dw_spi_dma_wait_rx_done()
337 ns = 4U * NSEC_PER_SEC / dws->max_freq * nents; in dw_spi_dma_wait_rx_done()
347 while (dw_spi_dma_rx_busy(dws) && retry--) in dw_spi_dma_wait_rx_done()
351 dev_err(&dws->master->dev, "Rx hanged up\n"); in dw_spi_dma_wait_rx_done()
364 struct dw_spi *dws = arg; in dw_spi_dma_rx_done() local
366 clear_bit(RX_BUSY, &dws->dma_chan_busy); in dw_spi_dma_rx_done()
367 if (test_bit(TX_BUSY, &dws->dma_chan_busy)) in dw_spi_dma_rx_done()
370 complete(&dws->dma_completion); in dw_spi_dma_rx_done()
373 static int dw_spi_dma_config_rx(struct dw_spi *dws) in dw_spi_dma_config_rx() argument
379 rxconf.src_addr = dws->dma_addr; in dw_spi_dma_config_rx()
380 rxconf.src_maxburst = dws->rxburst; in dw_spi_dma_config_rx()
382 rxconf.src_addr_width = dw_spi_dma_convert_width(dws->n_bytes); in dw_spi_dma_config_rx()
385 return dmaengine_slave_config(dws->rxchan, &rxconf); in dw_spi_dma_config_rx()
388 static int dw_spi_dma_submit_rx(struct dw_spi *dws, struct scatterlist *sgl, in dw_spi_dma_submit_rx() argument
395 rxdesc = dmaengine_prep_slave_sg(dws->rxchan, sgl, nents, in dw_spi_dma_submit_rx()
402 rxdesc->callback_param = dws; in dw_spi_dma_submit_rx()
407 dmaengine_terminate_sync(dws->rxchan); in dw_spi_dma_submit_rx()
411 set_bit(RX_BUSY, &dws->dma_chan_busy); in dw_spi_dma_submit_rx()
416 static int dw_spi_dma_setup(struct dw_spi *dws, struct spi_transfer *xfer) in dw_spi_dma_setup() argument
425 ret = dw_spi_dma_config_tx(dws); in dw_spi_dma_setup()
430 ret = dw_spi_dma_config_rx(dws); in dw_spi_dma_setup()
439 dw_writel(dws, DW_SPI_DMACR, dma_ctrl); in dw_spi_dma_setup()
445 spi_umask_intr(dws, imr); in dw_spi_dma_setup()
447 reinit_completion(&dws->dma_completion); in dw_spi_dma_setup()
449 dws->transfer_handler = dw_spi_dma_transfer_handler; in dw_spi_dma_setup()
454 static int dw_spi_dma_transfer_all(struct dw_spi *dws, in dw_spi_dma_transfer_all() argument
460 ret = dw_spi_dma_submit_tx(dws, xfer->tx_sg.sgl, xfer->tx_sg.nents); in dw_spi_dma_transfer_all()
466 ret = dw_spi_dma_submit_rx(dws, xfer->rx_sg.sgl, in dw_spi_dma_transfer_all()
472 dma_async_issue_pending(dws->rxchan); in dw_spi_dma_transfer_all()
475 dma_async_issue_pending(dws->txchan); in dw_spi_dma_transfer_all()
477 ret = dw_spi_dma_wait(dws, xfer->len, xfer->effective_speed_hz); in dw_spi_dma_transfer_all()
480 dw_writel(dws, DW_SPI_DMACR, 0); in dw_spi_dma_transfer_all()
517 static int dw_spi_dma_transfer_one(struct dw_spi *dws, in dw_spi_dma_transfer_one() argument
549 ret = dw_spi_dma_submit_tx(dws, &tx_tmp, 1); in dw_spi_dma_transfer_one()
554 ret = dw_spi_dma_submit_rx(dws, &rx_tmp, 1); in dw_spi_dma_transfer_one()
559 dma_async_issue_pending(dws->rxchan); in dw_spi_dma_transfer_one()
561 dma_async_issue_pending(dws->txchan); in dw_spi_dma_transfer_one()
569 ret = dw_spi_dma_wait(dws, len, xfer->effective_speed_hz); in dw_spi_dma_transfer_one()
573 reinit_completion(&dws->dma_completion); in dw_spi_dma_transfer_one()
581 dw_writel(dws, DW_SPI_DMACR, 0); in dw_spi_dma_transfer_one()
586 static int dw_spi_dma_transfer(struct dw_spi *dws, struct spi_transfer *xfer) in dw_spi_dma_transfer() argument
600 if (!dws->dma_sg_burst || !xfer->rx_buf || nents <= dws->dma_sg_burst) in dw_spi_dma_transfer()
601 ret = dw_spi_dma_transfer_all(dws, xfer); in dw_spi_dma_transfer()
603 ret = dw_spi_dma_transfer_one(dws, xfer); in dw_spi_dma_transfer()
607 if (dws->master->cur_msg->status == -EINPROGRESS) { in dw_spi_dma_transfer()
608 ret = dw_spi_dma_wait_tx_done(dws, xfer); in dw_spi_dma_transfer()
613 if (xfer->rx_buf && dws->master->cur_msg->status == -EINPROGRESS) in dw_spi_dma_transfer()
614 ret = dw_spi_dma_wait_rx_done(dws); in dw_spi_dma_transfer()
619 static void dw_spi_dma_stop(struct dw_spi *dws) in dw_spi_dma_stop() argument
621 if (test_bit(TX_BUSY, &dws->dma_chan_busy)) { in dw_spi_dma_stop()
622 dmaengine_terminate_sync(dws->txchan); in dw_spi_dma_stop()
623 clear_bit(TX_BUSY, &dws->dma_chan_busy); in dw_spi_dma_stop()
625 if (test_bit(RX_BUSY, &dws->dma_chan_busy)) { in dw_spi_dma_stop()
626 dmaengine_terminate_sync(dws->rxchan); in dw_spi_dma_stop()
627 clear_bit(RX_BUSY, &dws->dma_chan_busy); in dw_spi_dma_stop()
640 void dw_spi_dma_setup_mfld(struct dw_spi *dws) in dw_spi_dma_setup_mfld() argument
642 dws->dma_ops = &dw_spi_dma_mfld_ops; in dw_spi_dma_setup_mfld()
655 void dw_spi_dma_setup_generic(struct dw_spi *dws) in dw_spi_dma_setup_generic() argument
657 dws->dma_ops = &dw_spi_dma_generic_ops; in dw_spi_dma_setup_generic()