Lines Matching +full:spi +full:- +full:cs +full:- +full:setup +full:- +full:delay +full:- +full:ns
1 // SPDX-License-Identifier: GPL-2.0+
10 #include <linux/delay.h>
12 #include <linux/dma-mapping.h>
20 #include <linux/spi/spi.h>
21 #include <linux/spi/spi-fsl-dspi.h>
23 #define DRIVER_NAME "fsl-dspi"
106 #define SPI_FRAME_BITS(bits) SPI_CTAR_FMSZ((bits) - 1)
107 #define SPI_FRAME_EBITS(bits) SPI_CTARE_FMSZE(((bits) - 1) >> 4)
146 /* Has A-011218 DMA erratum */
152 /* Has A-011218 DMA erratum */
163 /* Has A-011218 DMA erratum */
169 /* Has A-011218 DMA erratum */
251 switch (dspi->oper_word_size) { in dspi_native_host_to_dev()
253 *txdata = *(u8 *)dspi->tx; in dspi_native_host_to_dev()
256 *txdata = *(u16 *)dspi->tx; in dspi_native_host_to_dev()
259 *txdata = *(u32 *)dspi->tx; in dspi_native_host_to_dev()
262 dspi->tx += dspi->oper_word_size; in dspi_native_host_to_dev()
267 switch (dspi->oper_word_size) { in dspi_native_dev_to_host()
269 *(u8 *)dspi->rx = rxdata; in dspi_native_dev_to_host()
272 *(u16 *)dspi->rx = rxdata; in dspi_native_dev_to_host()
275 *(u32 *)dspi->rx = rxdata; in dspi_native_dev_to_host()
278 dspi->rx += dspi->oper_word_size; in dspi_native_dev_to_host()
283 *txdata = cpu_to_be32(*(u32 *)dspi->tx); in dspi_8on32_host_to_dev()
284 dspi->tx += sizeof(u32); in dspi_8on32_host_to_dev()
289 *(u32 *)dspi->rx = be32_to_cpu(rxdata); in dspi_8on32_dev_to_host()
290 dspi->rx += sizeof(u32); in dspi_8on32_dev_to_host()
295 *txdata = cpu_to_be16(*(u16 *)dspi->tx); in dspi_8on16_host_to_dev()
296 dspi->tx += sizeof(u16); in dspi_8on16_host_to_dev()
301 *(u16 *)dspi->rx = be16_to_cpu(rxdata); in dspi_8on16_dev_to_host()
302 dspi->rx += sizeof(u16); in dspi_8on16_dev_to_host()
307 u16 hi = *(u16 *)dspi->tx; in dspi_16on32_host_to_dev()
308 u16 lo = *(u16 *)(dspi->tx + 2); in dspi_16on32_host_to_dev()
311 dspi->tx += sizeof(u32); in dspi_16on32_host_to_dev()
319 *(u16 *)dspi->rx = lo; in dspi_16on32_dev_to_host()
320 *(u16 *)(dspi->rx + 2) = hi; in dspi_16on32_dev_to_host()
321 dspi->rx += sizeof(u32); in dspi_16on32_dev_to_host()
332 if (dspi->tx) in dspi_pop_tx()
333 dspi->host_to_dev(dspi, &txdata); in dspi_pop_tx()
334 dspi->len -= dspi->oper_word_size; in dspi_pop_tx()
341 u16 cmd = dspi->tx_cmd, data = dspi_pop_tx(dspi); in dspi_pop_tx_pushr()
343 if (spi_controller_is_target(dspi->ctlr)) in dspi_pop_tx_pushr()
346 if (dspi->len > 0) in dspi_pop_tx_pushr()
354 if (!dspi->rx) in dspi_push_rx()
356 dspi->dev_to_host(dspi, rxdata); in dspi_push_rx()
362 struct fsl_dspi_dma *dma = dspi->dma; in dspi_tx_dma_callback()
364 complete(&dma->cmd_tx_complete); in dspi_tx_dma_callback()
370 struct fsl_dspi_dma *dma = dspi->dma; in dspi_rx_dma_callback()
373 if (dspi->rx) { in dspi_rx_dma_callback()
374 for (i = 0; i < dspi->words_in_flight; i++) in dspi_rx_dma_callback()
375 dspi_push_rx(dspi, dspi->dma->rx_dma_buf[i]); in dspi_rx_dma_callback()
378 complete(&dma->cmd_rx_complete); in dspi_rx_dma_callback()
383 struct device *dev = &dspi->pdev->dev; in dspi_next_xfer_dma_submit()
384 struct fsl_dspi_dma *dma = dspi->dma; in dspi_next_xfer_dma_submit()
388 for (i = 0; i < dspi->words_in_flight; i++) in dspi_next_xfer_dma_submit()
389 dspi->dma->tx_dma_buf[i] = dspi_pop_tx_pushr(dspi); in dspi_next_xfer_dma_submit()
391 dma->tx_desc = dmaengine_prep_slave_single(dma->chan_tx, in dspi_next_xfer_dma_submit()
392 dma->tx_dma_phys, in dspi_next_xfer_dma_submit()
393 dspi->words_in_flight * in dspi_next_xfer_dma_submit()
397 if (!dma->tx_desc) { in dspi_next_xfer_dma_submit()
399 return -EIO; in dspi_next_xfer_dma_submit()
402 dma->tx_desc->callback = dspi_tx_dma_callback; in dspi_next_xfer_dma_submit()
403 dma->tx_desc->callback_param = dspi; in dspi_next_xfer_dma_submit()
404 if (dma_submit_error(dmaengine_submit(dma->tx_desc))) { in dspi_next_xfer_dma_submit()
406 return -EINVAL; in dspi_next_xfer_dma_submit()
409 dma->rx_desc = dmaengine_prep_slave_single(dma->chan_rx, in dspi_next_xfer_dma_submit()
410 dma->rx_dma_phys, in dspi_next_xfer_dma_submit()
411 dspi->words_in_flight * in dspi_next_xfer_dma_submit()
415 if (!dma->rx_desc) { in dspi_next_xfer_dma_submit()
417 return -EIO; in dspi_next_xfer_dma_submit()
420 dma->rx_desc->callback = dspi_rx_dma_callback; in dspi_next_xfer_dma_submit()
421 dma->rx_desc->callback_param = dspi; in dspi_next_xfer_dma_submit()
422 if (dma_submit_error(dmaengine_submit(dma->rx_desc))) { in dspi_next_xfer_dma_submit()
424 return -EINVAL; in dspi_next_xfer_dma_submit()
427 reinit_completion(&dspi->dma->cmd_rx_complete); in dspi_next_xfer_dma_submit()
428 reinit_completion(&dspi->dma->cmd_tx_complete); in dspi_next_xfer_dma_submit()
430 dma_async_issue_pending(dma->chan_rx); in dspi_next_xfer_dma_submit()
431 dma_async_issue_pending(dma->chan_tx); in dspi_next_xfer_dma_submit()
433 if (spi_controller_is_target(dspi->ctlr)) { in dspi_next_xfer_dma_submit()
434 wait_for_completion_interruptible(&dspi->dma->cmd_rx_complete); in dspi_next_xfer_dma_submit()
438 time_left = wait_for_completion_timeout(&dspi->dma->cmd_tx_complete, in dspi_next_xfer_dma_submit()
442 dmaengine_terminate_all(dma->chan_tx); in dspi_next_xfer_dma_submit()
443 dmaengine_terminate_all(dma->chan_rx); in dspi_next_xfer_dma_submit()
444 return -ETIMEDOUT; in dspi_next_xfer_dma_submit()
447 time_left = wait_for_completion_timeout(&dspi->dma->cmd_rx_complete, in dspi_next_xfer_dma_submit()
451 dmaengine_terminate_all(dma->chan_tx); in dspi_next_xfer_dma_submit()
452 dmaengine_terminate_all(dma->chan_rx); in dspi_next_xfer_dma_submit()
453 return -ETIMEDOUT; in dspi_next_xfer_dma_submit()
463 struct spi_message *message = dspi->cur_msg; in dspi_dma_xfer()
464 struct device *dev = &dspi->pdev->dev; in dspi_dma_xfer()
468 * dspi->len gets decremented by dspi_pop_tx_pushr in in dspi_dma_xfer()
471 while (dspi->len) { in dspi_dma_xfer()
472 /* Figure out operational bits-per-word for this chunk */ in dspi_dma_xfer()
475 dspi->words_in_flight = dspi->len / dspi->oper_word_size; in dspi_dma_xfer()
476 if (dspi->words_in_flight > dspi->devtype_data->fifo_size) in dspi_dma_xfer()
477 dspi->words_in_flight = dspi->devtype_data->fifo_size; in dspi_dma_xfer()
479 message->actual_length += dspi->words_in_flight * in dspi_dma_xfer()
480 dspi->oper_word_size; in dspi_dma_xfer()
494 int dma_bufsize = dspi->devtype_data->fifo_size * 2; in dspi_request_dma()
495 struct device *dev = &dspi->pdev->dev; in dspi_request_dma()
502 return -ENOMEM; in dspi_request_dma()
504 dma->chan_rx = dma_request_chan(dev, "rx"); in dspi_request_dma()
505 if (IS_ERR(dma->chan_rx)) { in dspi_request_dma()
506 return dev_err_probe(dev, PTR_ERR(dma->chan_rx), in dspi_request_dma()
510 dma->chan_tx = dma_request_chan(dev, "tx"); in dspi_request_dma()
511 if (IS_ERR(dma->chan_tx)) { in dspi_request_dma()
512 ret = PTR_ERR(dma->chan_tx); in dspi_request_dma()
517 dma->tx_dma_buf = dma_alloc_coherent(dma->chan_tx->device->dev, in dspi_request_dma()
518 dma_bufsize, &dma->tx_dma_phys, in dspi_request_dma()
520 if (!dma->tx_dma_buf) { in dspi_request_dma()
521 ret = -ENOMEM; in dspi_request_dma()
525 dma->rx_dma_buf = dma_alloc_coherent(dma->chan_rx->device->dev, in dspi_request_dma()
526 dma_bufsize, &dma->rx_dma_phys, in dspi_request_dma()
528 if (!dma->rx_dma_buf) { in dspi_request_dma()
529 ret = -ENOMEM; in dspi_request_dma()
542 ret = dmaengine_slave_config(dma->chan_rx, &cfg); in dspi_request_dma()
545 ret = -EINVAL; in dspi_request_dma()
550 ret = dmaengine_slave_config(dma->chan_tx, &cfg); in dspi_request_dma()
553 ret = -EINVAL; in dspi_request_dma()
557 dspi->dma = dma; in dspi_request_dma()
558 init_completion(&dma->cmd_tx_complete); in dspi_request_dma()
559 init_completion(&dma->cmd_rx_complete); in dspi_request_dma()
564 dma_free_coherent(dma->chan_rx->device->dev, in dspi_request_dma()
565 dma_bufsize, dma->rx_dma_buf, dma->rx_dma_phys); in dspi_request_dma()
567 dma_free_coherent(dma->chan_tx->device->dev, in dspi_request_dma()
568 dma_bufsize, dma->tx_dma_buf, dma->tx_dma_phys); in dspi_request_dma()
570 dma_release_channel(dma->chan_tx); in dspi_request_dma()
572 dma_release_channel(dma->chan_rx); in dspi_request_dma()
575 dspi->dma = NULL; in dspi_request_dma()
582 int dma_bufsize = dspi->devtype_data->fifo_size * 2; in dspi_release_dma()
583 struct fsl_dspi_dma *dma = dspi->dma; in dspi_release_dma()
588 if (dma->chan_tx) { in dspi_release_dma()
589 dma_free_coherent(dma->chan_tx->device->dev, dma_bufsize, in dspi_release_dma()
590 dma->tx_dma_buf, dma->tx_dma_phys); in dspi_release_dma()
591 dma_release_channel(dma->chan_tx); in dspi_release_dma()
594 if (dma->chan_rx) { in dspi_release_dma()
595 dma_free_coherent(dma->chan_rx->device->dev, dma_bufsize, in dspi_release_dma()
596 dma->rx_dma_buf, dma->rx_dma_phys); in dspi_release_dma()
597 dma_release_channel(dma->chan_rx); in dspi_release_dma()
604 /* Valid baud rate pre-scaler values */ in hz_to_spi_baud()
633 *pbr = ARRAY_SIZE(pbr_tbl) - 1; in hz_to_spi_baud()
634 *br = ARRAY_SIZE(brs) - 1; in hz_to_spi_baud()
665 …pr_warn("Cannot find correct scale values for %dns delay at clkrate %ld, using max prescaler value… in ns_delay_scale()
667 *psc = ARRAY_SIZE(pscale_tbl) - 1; in ns_delay_scale()
677 * dspi_pop_tx (the function that decrements dspi->len) _after_ in dspi_pushr_cmd_write()
684 if (dspi->len > dspi->oper_word_size) in dspi_pushr_cmd_write()
686 regmap_write(dspi->regmap_pushr, dspi->pushr_cmd, cmd); in dspi_pushr_cmd_write()
691 regmap_write(dspi->regmap_pushr, dspi->pushr_tx, txdata); in dspi_pushr_txdata_write()
696 int num_bytes = num_words * dspi->oper_word_size; in dspi_xspi_fifo_write()
697 u16 tx_cmd = dspi->tx_cmd; in dspi_xspi_fifo_write()
700 * If the PCS needs to de-assert (i.e. we're at the end of the buffer in dspi_xspi_fifo_write()
707 if (!(dspi->tx_cmd & SPI_PUSHR_CMD_CONT) && num_bytes == dspi->len) in dspi_xspi_fifo_write()
711 regmap_write(dspi->regmap, SPI_CTARE(0), in dspi_xspi_fifo_write()
712 SPI_FRAME_EBITS(dspi->oper_bits_per_word) | in dspi_xspi_fifo_write()
722 while (num_words--) { in dspi_xspi_fifo_write()
726 if (dspi->oper_bits_per_word > 16) in dspi_xspi_fifo_write()
735 regmap_read(dspi->regmap, SPI_POPR, &rxdata); in dspi_popr_read()
741 int num_fifo_entries = dspi->words_in_flight; in dspi_fifo_read()
744 while (num_fifo_entries--) in dspi_fifo_read()
750 struct spi_transfer *xfer = dspi->cur_transfer; in dspi_setup_accel()
751 bool odd = !!(dspi->len & 1); in dspi_setup_accel()
754 if (xfer->bits_per_word % 8) in dspi_setup_accel()
757 if (!odd && dspi->len <= dspi->devtype_data->fifo_size * 2) { in dspi_setup_accel()
758 dspi->oper_bits_per_word = 16; in dspi_setup_accel()
759 } else if (odd && dspi->len <= dspi->devtype_data->fifo_size) { in dspi_setup_accel()
760 dspi->oper_bits_per_word = 8; in dspi_setup_accel()
763 if (dspi->devtype_data->trans_mode == DSPI_XSPI_MODE) in dspi_setup_accel()
764 dspi->oper_bits_per_word = 32; in dspi_setup_accel()
766 dspi->oper_bits_per_word = 16; in dspi_setup_accel()
773 if (dspi->len >= DIV_ROUND_UP(dspi->oper_bits_per_word, 8)) in dspi_setup_accel()
776 dspi->oper_bits_per_word /= 2; in dspi_setup_accel()
777 } while (dspi->oper_bits_per_word > 8); in dspi_setup_accel()
780 if (xfer->bits_per_word == 8 && dspi->oper_bits_per_word == 32) { in dspi_setup_accel()
781 dspi->dev_to_host = dspi_8on32_dev_to_host; in dspi_setup_accel()
782 dspi->host_to_dev = dspi_8on32_host_to_dev; in dspi_setup_accel()
783 } else if (xfer->bits_per_word == 8 && dspi->oper_bits_per_word == 16) { in dspi_setup_accel()
784 dspi->dev_to_host = dspi_8on16_dev_to_host; in dspi_setup_accel()
785 dspi->host_to_dev = dspi_8on16_host_to_dev; in dspi_setup_accel()
786 } else if (xfer->bits_per_word == 16 && dspi->oper_bits_per_word == 32) { in dspi_setup_accel()
787 dspi->dev_to_host = dspi_16on32_dev_to_host; in dspi_setup_accel()
788 dspi->host_to_dev = dspi_16on32_host_to_dev; in dspi_setup_accel()
791 dspi->dev_to_host = dspi_native_dev_to_host; in dspi_setup_accel()
792 dspi->host_to_dev = dspi_native_host_to_dev; in dspi_setup_accel()
793 dspi->oper_bits_per_word = xfer->bits_per_word; in dspi_setup_accel()
796 dspi->oper_word_size = DIV_ROUND_UP(dspi->oper_bits_per_word, 8); in dspi_setup_accel()
803 regmap_write(dspi->regmap, SPI_CTAR(0), in dspi_setup_accel()
804 dspi->cur_chip->ctar_val | in dspi_setup_accel()
805 SPI_FRAME_BITS(dspi->oper_bits_per_word)); in dspi_setup_accel()
810 int num_fifo_entries = dspi->devtype_data->fifo_size; in dspi_fifo_write()
811 struct spi_transfer *xfer = dspi->cur_transfer; in dspi_fifo_write()
812 struct spi_message *msg = dspi->cur_msg; in dspi_fifo_write()
817 /* In XSPI mode each 32-bit word occupies 2 TX FIFO entries */ in dspi_fifo_write()
818 if (dspi->oper_word_size == 4) in dspi_fifo_write()
822 * Integer division intentionally trims off odd (or non-multiple of 4) in dspi_fifo_write()
826 num_words = dspi->len / dspi->oper_word_size; in dspi_fifo_write()
831 num_bytes = num_words * dspi->oper_word_size; in dspi_fifo_write()
832 msg->actual_length += num_bytes; in dspi_fifo_write()
833 dspi->progress += num_bytes / DIV_ROUND_UP(xfer->bits_per_word, 8); in dspi_fifo_write()
839 dspi->words_in_flight = num_words; in dspi_fifo_write()
841 spi_take_timestamp_pre(dspi->ctlr, xfer, dspi->progress, !dspi->irq); in dspi_fifo_write()
846 * interrupt, so we must never use dspi->words_in_flight again since it in dspi_fifo_write()
850 spi_take_timestamp_post(dspi->ctlr, dspi->cur_transfer, in dspi_fifo_write()
851 dspi->progress, !dspi->irq); in dspi_fifo_write()
858 if (!dspi->len) in dspi_rxtx()
864 return -EINPROGRESS; in dspi_rxtx()
873 regmap_read(dspi->regmap, SPI_SR, &spi_sr); in dspi_poll()
874 regmap_write(dspi->regmap, SPI_SR, spi_sr); in dspi_poll()
878 } while (--tries); in dspi_poll()
881 return -ETIMEDOUT; in dspi_poll()
891 regmap_read(dspi->regmap, SPI_SR, &spi_sr); in dspi_interrupt()
892 regmap_write(dspi->regmap, SPI_SR, spi_sr); in dspi_interrupt()
898 complete(&dspi->xfer_done); in dspi_interrupt()
903 static void dspi_assert_cs(struct spi_device *spi, bool *cs) in dspi_assert_cs() argument
905 if (!spi_get_csgpiod(spi, 0) || *cs) in dspi_assert_cs()
908 gpiod_set_value_cansleep(spi_get_csgpiod(spi, 0), true); in dspi_assert_cs()
909 *cs = true; in dspi_assert_cs()
912 static void dspi_deassert_cs(struct spi_device *spi, bool *cs) in dspi_deassert_cs() argument
914 if (!spi_get_csgpiod(spi, 0) || !*cs) in dspi_deassert_cs()
917 gpiod_set_value_cansleep(spi_get_csgpiod(spi, 0), false); in dspi_deassert_cs()
918 *cs = false; in dspi_deassert_cs()
925 struct spi_device *spi = message->spi; in dspi_transfer_one_message() local
927 bool cs = false; in dspi_transfer_one_message() local
930 message->actual_length = 0; in dspi_transfer_one_message()
932 list_for_each_entry(transfer, &message->transfers, transfer_list) { in dspi_transfer_one_message()
933 dspi->cur_transfer = transfer; in dspi_transfer_one_message()
934 dspi->cur_msg = message; in dspi_transfer_one_message()
935 dspi->cur_chip = spi_get_ctldata(spi); in dspi_transfer_one_message()
937 dspi_assert_cs(spi, &cs); in dspi_transfer_one_message()
940 dspi->tx_cmd = SPI_PUSHR_CMD_CTAS(0); in dspi_transfer_one_message()
941 if (!spi_get_csgpiod(spi, 0)) in dspi_transfer_one_message()
942 dspi->tx_cmd |= SPI_PUSHR_CMD_PCS(spi_get_chipselect(spi, 0)); in dspi_transfer_one_message()
944 if (list_is_last(&dspi->cur_transfer->transfer_list, in dspi_transfer_one_message()
945 &dspi->cur_msg->transfers)) { in dspi_transfer_one_message()
949 if (transfer->cs_change) in dspi_transfer_one_message()
950 dspi->tx_cmd |= SPI_PUSHR_CMD_CONT; in dspi_transfer_one_message()
953 * when cs_change is not set, and de-activate PCS in dspi_transfer_one_message()
957 if (!transfer->cs_change) in dspi_transfer_one_message()
958 dspi->tx_cmd |= SPI_PUSHR_CMD_CONT; in dspi_transfer_one_message()
961 dspi->tx = transfer->tx_buf; in dspi_transfer_one_message()
962 dspi->rx = transfer->rx_buf; in dspi_transfer_one_message()
963 dspi->len = transfer->len; in dspi_transfer_one_message()
964 dspi->progress = 0; in dspi_transfer_one_message()
966 regmap_update_bits(dspi->regmap, SPI_MCR, in dspi_transfer_one_message()
970 spi_take_timestamp_pre(dspi->ctlr, dspi->cur_transfer, in dspi_transfer_one_message()
971 dspi->progress, !dspi->irq); in dspi_transfer_one_message()
973 if (dspi->devtype_data->trans_mode == DSPI_DMA_MODE) { in dspi_transfer_one_message()
978 if (dspi->irq) { in dspi_transfer_one_message()
979 wait_for_completion(&dspi->xfer_done); in dspi_transfer_one_message()
980 reinit_completion(&dspi->xfer_done); in dspi_transfer_one_message()
984 } while (status == -EINPROGRESS); in dspi_transfer_one_message()
992 if (!(dspi->tx_cmd & SPI_PUSHR_CMD_CONT)) in dspi_transfer_one_message()
993 dspi_deassert_cs(spi, &cs); in dspi_transfer_one_message()
996 message->status = status; in dspi_transfer_one_message()
1002 static int dspi_setup(struct spi_device *spi) in dspi_setup() argument
1004 struct fsl_dspi *dspi = spi_controller_get_devdata(spi->controller); in dspi_setup()
1005 u32 period_ns = DIV_ROUND_UP(NSEC_PER_SEC, spi->max_speed_hz); in dspi_setup()
1013 bool cs = true; in dspi_setup() local
1015 /* Only alloc on first setup */ in dspi_setup()
1016 chip = spi_get_ctldata(spi); in dspi_setup()
1020 return -ENOMEM; in dspi_setup()
1023 pdata = dev_get_platdata(&dspi->pdev->dev); in dspi_setup()
1026 of_property_read_u32(spi->dev.of_node, "fsl,spi-cs-sck-delay", in dspi_setup()
1029 of_property_read_u32(spi->dev.of_node, "fsl,spi-sck-cs-delay", in dspi_setup()
1032 cs_sck_delay = pdata->cs_sck_delay; in dspi_setup()
1033 sck_cs_delay = pdata->sck_cs_delay; in dspi_setup()
1045 dev_dbg(&spi->dev, in dspi_setup()
1046 "DSPI controller timing params: CS-to-SCK delay %u ns, SCK-to-CS delay %u ns\n", in dspi_setup()
1049 clkrate = clk_get_rate(dspi->clk); in dspi_setup()
1050 hz_to_spi_baud(&pbr, &br, spi->max_speed_hz, clkrate); in dspi_setup()
1052 /* Set PCS to SCK delay scale values */ in dspi_setup()
1055 /* Set After SCK delay scale values */ in dspi_setup()
1058 chip->ctar_val = 0; in dspi_setup()
1059 if (spi->mode & SPI_CPOL) in dspi_setup()
1060 chip->ctar_val |= SPI_CTAR_CPOL; in dspi_setup()
1061 if (spi->mode & SPI_CPHA) in dspi_setup()
1062 chip->ctar_val |= SPI_CTAR_CPHA; in dspi_setup()
1064 if (!spi_controller_is_target(dspi->ctlr)) { in dspi_setup()
1065 chip->ctar_val |= SPI_CTAR_PCSSCK(pcssck) | in dspi_setup()
1072 if (spi->mode & SPI_LSB_FIRST) in dspi_setup()
1073 chip->ctar_val |= SPI_CTAR_LSBFE; in dspi_setup()
1076 gpiod_direction_output(spi_get_csgpiod(spi, 0), false); in dspi_setup()
1077 dspi_deassert_cs(spi, &cs); in dspi_setup()
1079 spi_set_ctldata(spi, chip); in dspi_setup()
1084 static void dspi_cleanup(struct spi_device *spi) in dspi_cleanup() argument
1086 struct chip_data *chip = spi_get_ctldata(spi); in dspi_cleanup()
1088 dev_dbg(&spi->dev, "spi_device %u.%u cleanup\n", in dspi_cleanup()
1089 spi->controller->bus_num, spi_get_chipselect(spi, 0)); in dspi_cleanup()
1096 .compatible = "fsl,vf610-dspi",
1099 .compatible = "fsl,ls1021a-v1.0-dspi",
1102 .compatible = "fsl,ls1012a-dspi",
1105 .compatible = "fsl,ls1028a-dspi",
1108 .compatible = "fsl,ls1043a-dspi",
1111 .compatible = "fsl,ls1046a-dspi",
1114 .compatible = "fsl,ls2080a-dspi",
1117 .compatible = "fsl,ls2085a-dspi",
1120 .compatible = "fsl,lx2160a-dspi",
1132 if (dspi->irq) in dspi_suspend()
1133 disable_irq(dspi->irq); in dspi_suspend()
1134 spi_controller_suspend(dspi->ctlr); in dspi_suspend()
1135 clk_disable_unprepare(dspi->clk); in dspi_suspend()
1149 ret = clk_prepare_enable(dspi->clk); in dspi_resume()
1152 spi_controller_resume(dspi->ctlr); in dspi_resume()
1153 if (dspi->irq) in dspi_resume()
1154 enable_irq(dspi->irq); in dspi_resume()
1215 mcr = SPI_MCR_PCSIS(GENMASK(dspi->ctlr->max_native_cs - 1, 0)); in dspi_init()
1217 if (dspi->devtype_data->trans_mode == DSPI_XSPI_MODE) in dspi_init()
1219 if (!spi_controller_is_target(dspi->ctlr)) in dspi_init()
1222 regmap_write(dspi->regmap, SPI_MCR, mcr); in dspi_init()
1223 regmap_write(dspi->regmap, SPI_SR, SPI_SR_CLEAR); in dspi_init()
1225 switch (dspi->devtype_data->trans_mode) { in dspi_init()
1227 regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_CMDTCFE); in dspi_init()
1230 regmap_write(dspi->regmap, SPI_RSER, in dspi_init()
1235 dev_err(&dspi->pdev->dev, "unsupported trans_mode %u\n", in dspi_init()
1236 dspi->devtype_data->trans_mode); in dspi_init()
1237 return -EINVAL; in dspi_init()
1248 * Terminate all pending DMA transactions for the SPI working in dspi_target_abort()
1251 if (dspi->devtype_data->trans_mode == DSPI_DMA_MODE) { in dspi_target_abort()
1252 dmaengine_terminate_sync(dspi->dma->chan_rx); in dspi_target_abort()
1253 dmaengine_terminate_sync(dspi->dma->chan_tx); in dspi_target_abort()
1257 regmap_update_bits(dspi->regmap, SPI_MCR, in dspi_target_abort()
1266 struct device_node *np = pdev->dev.of_node; in dspi_probe()
1270 int ret, cs_num, bus_num = -1; in dspi_probe()
1276 dspi = devm_kzalloc(&pdev->dev, sizeof(*dspi), GFP_KERNEL); in dspi_probe()
1278 return -ENOMEM; in dspi_probe()
1280 ctlr = spi_alloc_host(&pdev->dev, 0); in dspi_probe()
1282 return -ENOMEM; in dspi_probe()
1287 dspi->pdev = pdev; in dspi_probe()
1288 dspi->ctlr = ctlr; in dspi_probe()
1290 ctlr->setup = dspi_setup; in dspi_probe()
1291 ctlr->transfer_one_message = dspi_transfer_one_message; in dspi_probe()
1292 ctlr->dev.of_node = pdev->dev.of_node; in dspi_probe()
1294 ctlr->cleanup = dspi_cleanup; in dspi_probe()
1295 ctlr->target_abort = dspi_target_abort; in dspi_probe()
1296 ctlr->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST; in dspi_probe()
1297 ctlr->use_gpio_descriptors = true; in dspi_probe()
1299 pdata = dev_get_platdata(&pdev->dev); in dspi_probe()
1301 ctlr->num_chipselect = ctlr->max_native_cs = pdata->cs_num; in dspi_probe()
1302 ctlr->bus_num = pdata->bus_num; in dspi_probe()
1305 dspi->devtype_data = &devtype_data[MCF5441X]; in dspi_probe()
1309 ret = of_property_read_u32(np, "spi-num-chipselects", &cs_num); in dspi_probe()
1311 dev_err(&pdev->dev, "can't get spi-num-chipselects\n"); in dspi_probe()
1314 ctlr->num_chipselect = ctlr->max_native_cs = cs_num; in dspi_probe()
1316 of_property_read_u32(np, "bus-num", &bus_num); in dspi_probe()
1317 ctlr->bus_num = bus_num; in dspi_probe()
1319 if (of_property_read_bool(np, "spi-slave")) in dspi_probe()
1320 ctlr->target = true; in dspi_probe()
1322 dspi->devtype_data = of_device_get_match_data(&pdev->dev); in dspi_probe()
1323 if (!dspi->devtype_data) { in dspi_probe()
1324 dev_err(&pdev->dev, "can't get devtype_data\n"); in dspi_probe()
1325 ret = -EFAULT; in dspi_probe()
1332 dspi->pushr_cmd = 0; in dspi_probe()
1333 dspi->pushr_tx = 2; in dspi_probe()
1335 dspi->pushr_cmd = 2; in dspi_probe()
1336 dspi->pushr_tx = 0; in dspi_probe()
1339 if (dspi->devtype_data->trans_mode == DSPI_XSPI_MODE) in dspi_probe()
1340 ctlr->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32); in dspi_probe()
1342 ctlr->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 16); in dspi_probe()
1350 if (dspi->devtype_data->trans_mode == DSPI_XSPI_MODE) in dspi_probe()
1354 dspi->regmap = devm_regmap_init_mmio(&pdev->dev, base, regmap_config); in dspi_probe()
1355 if (IS_ERR(dspi->regmap)) { in dspi_probe()
1356 dev_err(&pdev->dev, "failed to init regmap: %ld\n", in dspi_probe()
1357 PTR_ERR(dspi->regmap)); in dspi_probe()
1358 ret = PTR_ERR(dspi->regmap); in dspi_probe()
1362 if (dspi->devtype_data->trans_mode == DSPI_XSPI_MODE) { in dspi_probe()
1363 dspi->regmap_pushr = devm_regmap_init_mmio( in dspi_probe()
1364 &pdev->dev, base + SPI_PUSHR, in dspi_probe()
1366 if (IS_ERR(dspi->regmap_pushr)) { in dspi_probe()
1367 dev_err(&pdev->dev, in dspi_probe()
1369 PTR_ERR(dspi->regmap_pushr)); in dspi_probe()
1370 ret = PTR_ERR(dspi->regmap_pushr); in dspi_probe()
1375 dspi->clk = devm_clk_get_enabled(&pdev->dev, "dspi"); in dspi_probe()
1376 if (IS_ERR(dspi->clk)) { in dspi_probe()
1377 ret = PTR_ERR(dspi->clk); in dspi_probe()
1378 dev_err(&pdev->dev, "unable to get clock\n"); in dspi_probe()
1386 dspi->irq = platform_get_irq(pdev, 0); in dspi_probe()
1387 if (dspi->irq <= 0) { in dspi_probe()
1388 dev_info(&pdev->dev, in dspi_probe()
1390 dspi->irq = 0; in dspi_probe()
1394 init_completion(&dspi->xfer_done); in dspi_probe()
1396 ret = request_threaded_irq(dspi->irq, dspi_interrupt, NULL, in dspi_probe()
1397 IRQF_SHARED, pdev->name, dspi); in dspi_probe()
1399 dev_err(&pdev->dev, "Unable to attach DSPI interrupt\n"); in dspi_probe()
1405 if (dspi->devtype_data->trans_mode == DSPI_DMA_MODE) { in dspi_probe()
1406 ret = dspi_request_dma(dspi, res->start); in dspi_probe()
1408 dev_err(&pdev->dev, "can't get dma channels\n"); in dspi_probe()
1413 ctlr->max_speed_hz = in dspi_probe()
1414 clk_get_rate(dspi->clk) / dspi->devtype_data->max_clock_factor; in dspi_probe()
1416 if (dspi->devtype_data->trans_mode != DSPI_DMA_MODE) in dspi_probe()
1417 ctlr->ptp_sts_supported = true; in dspi_probe()
1421 dev_err(&pdev->dev, "Problem registering DSPI ctlr\n"); in dspi_probe()
1430 if (dspi->irq) in dspi_probe()
1431 free_irq(dspi->irq, dspi); in dspi_probe()
1442 /* Disconnect from the SPI framework */ in dspi_remove()
1443 spi_unregister_controller(dspi->ctlr); in dspi_remove()
1446 regmap_update_bits(dspi->regmap, SPI_MCR, in dspi_remove()
1451 regmap_update_bits(dspi->regmap, SPI_MCR, SPI_MCR_HALT, SPI_MCR_HALT); in dspi_remove()
1454 if (dspi->irq) in dspi_remove()
1455 free_irq(dspi->irq, dspi); in dspi_remove()