Lines Matching refs:dspi
244 void (*host_to_dev)(struct fsl_dspi *dspi, u32 *txdata);
245 void (*dev_to_host)(struct fsl_dspi *dspi, u32 rxdata);
248 static void dspi_native_host_to_dev(struct fsl_dspi *dspi, u32 *txdata) in dspi_native_host_to_dev() argument
250 switch (dspi->oper_word_size) { in dspi_native_host_to_dev()
252 *txdata = *(u8 *)dspi->tx; in dspi_native_host_to_dev()
255 *txdata = *(u16 *)dspi->tx; in dspi_native_host_to_dev()
258 *txdata = *(u32 *)dspi->tx; in dspi_native_host_to_dev()
261 dspi->tx += dspi->oper_word_size; in dspi_native_host_to_dev()
264 static void dspi_native_dev_to_host(struct fsl_dspi *dspi, u32 rxdata) in dspi_native_dev_to_host() argument
266 switch (dspi->oper_word_size) { in dspi_native_dev_to_host()
268 *(u8 *)dspi->rx = rxdata; in dspi_native_dev_to_host()
271 *(u16 *)dspi->rx = rxdata; in dspi_native_dev_to_host()
274 *(u32 *)dspi->rx = rxdata; in dspi_native_dev_to_host()
277 dspi->rx += dspi->oper_word_size; in dspi_native_dev_to_host()
280 static void dspi_8on32_host_to_dev(struct fsl_dspi *dspi, u32 *txdata) in dspi_8on32_host_to_dev() argument
282 *txdata = cpu_to_be32(*(u32 *)dspi->tx); in dspi_8on32_host_to_dev()
283 dspi->tx += sizeof(u32); in dspi_8on32_host_to_dev()
286 static void dspi_8on32_dev_to_host(struct fsl_dspi *dspi, u32 rxdata) in dspi_8on32_dev_to_host() argument
288 *(u32 *)dspi->rx = be32_to_cpu(rxdata); in dspi_8on32_dev_to_host()
289 dspi->rx += sizeof(u32); in dspi_8on32_dev_to_host()
292 static void dspi_8on16_host_to_dev(struct fsl_dspi *dspi, u32 *txdata) in dspi_8on16_host_to_dev() argument
294 *txdata = cpu_to_be16(*(u16 *)dspi->tx); in dspi_8on16_host_to_dev()
295 dspi->tx += sizeof(u16); in dspi_8on16_host_to_dev()
298 static void dspi_8on16_dev_to_host(struct fsl_dspi *dspi, u32 rxdata) in dspi_8on16_dev_to_host() argument
300 *(u16 *)dspi->rx = be16_to_cpu(rxdata); in dspi_8on16_dev_to_host()
301 dspi->rx += sizeof(u16); in dspi_8on16_dev_to_host()
304 static void dspi_16on32_host_to_dev(struct fsl_dspi *dspi, u32 *txdata) in dspi_16on32_host_to_dev() argument
306 u16 hi = *(u16 *)dspi->tx; in dspi_16on32_host_to_dev()
307 u16 lo = *(u16 *)(dspi->tx + 2); in dspi_16on32_host_to_dev()
310 dspi->tx += sizeof(u32); in dspi_16on32_host_to_dev()
313 static void dspi_16on32_dev_to_host(struct fsl_dspi *dspi, u32 rxdata) in dspi_16on32_dev_to_host() argument
318 *(u16 *)dspi->rx = lo; in dspi_16on32_dev_to_host()
319 *(u16 *)(dspi->rx + 2) = hi; in dspi_16on32_dev_to_host()
320 dspi->rx += sizeof(u32); in dspi_16on32_dev_to_host()
327 static u32 dspi_pop_tx(struct fsl_dspi *dspi) in dspi_pop_tx() argument
331 if (dspi->tx) in dspi_pop_tx()
332 dspi->host_to_dev(dspi, &txdata); in dspi_pop_tx()
333 dspi->len -= dspi->oper_word_size; in dspi_pop_tx()
338 static u32 dspi_pop_tx_pushr(struct fsl_dspi *dspi) in dspi_pop_tx_pushr() argument
340 u16 cmd = dspi->tx_cmd, data = dspi_pop_tx(dspi); in dspi_pop_tx_pushr()
342 if (spi_controller_is_slave(dspi->ctlr)) in dspi_pop_tx_pushr()
345 if (dspi->len > 0) in dspi_pop_tx_pushr()
351 static void dspi_push_rx(struct fsl_dspi *dspi, u32 rxdata) in dspi_push_rx() argument
353 if (!dspi->rx) in dspi_push_rx()
355 dspi->dev_to_host(dspi, rxdata); in dspi_push_rx()
360 struct fsl_dspi *dspi = arg; in dspi_tx_dma_callback() local
361 struct fsl_dspi_dma *dma = dspi->dma; in dspi_tx_dma_callback()
368 struct fsl_dspi *dspi = arg; in dspi_rx_dma_callback() local
369 struct fsl_dspi_dma *dma = dspi->dma; in dspi_rx_dma_callback()
372 if (dspi->rx) { in dspi_rx_dma_callback()
373 for (i = 0; i < dspi->words_in_flight; i++) in dspi_rx_dma_callback()
374 dspi_push_rx(dspi, dspi->dma->rx_dma_buf[i]); in dspi_rx_dma_callback()
380 static int dspi_next_xfer_dma_submit(struct fsl_dspi *dspi) in dspi_next_xfer_dma_submit() argument
382 struct device *dev = &dspi->pdev->dev; in dspi_next_xfer_dma_submit()
383 struct fsl_dspi_dma *dma = dspi->dma; in dspi_next_xfer_dma_submit()
387 for (i = 0; i < dspi->words_in_flight; i++) in dspi_next_xfer_dma_submit()
388 dspi->dma->tx_dma_buf[i] = dspi_pop_tx_pushr(dspi); in dspi_next_xfer_dma_submit()
392 dspi->words_in_flight * in dspi_next_xfer_dma_submit()
402 dma->tx_desc->callback_param = dspi; in dspi_next_xfer_dma_submit()
410 dspi->words_in_flight * in dspi_next_xfer_dma_submit()
420 dma->rx_desc->callback_param = dspi; in dspi_next_xfer_dma_submit()
426 reinit_completion(&dspi->dma->cmd_rx_complete); in dspi_next_xfer_dma_submit()
427 reinit_completion(&dspi->dma->cmd_tx_complete); in dspi_next_xfer_dma_submit()
432 if (spi_controller_is_slave(dspi->ctlr)) { in dspi_next_xfer_dma_submit()
433 wait_for_completion_interruptible(&dspi->dma->cmd_rx_complete); in dspi_next_xfer_dma_submit()
437 time_left = wait_for_completion_timeout(&dspi->dma->cmd_tx_complete, in dspi_next_xfer_dma_submit()
446 time_left = wait_for_completion_timeout(&dspi->dma->cmd_rx_complete, in dspi_next_xfer_dma_submit()
458 static void dspi_setup_accel(struct fsl_dspi *dspi);
460 static int dspi_dma_xfer(struct fsl_dspi *dspi) in dspi_dma_xfer() argument
462 struct spi_message *message = dspi->cur_msg; in dspi_dma_xfer()
463 struct device *dev = &dspi->pdev->dev; in dspi_dma_xfer()
470 while (dspi->len) { in dspi_dma_xfer()
472 dspi_setup_accel(dspi); in dspi_dma_xfer()
474 dspi->words_in_flight = dspi->len / dspi->oper_word_size; in dspi_dma_xfer()
475 if (dspi->words_in_flight > dspi->devtype_data->fifo_size) in dspi_dma_xfer()
476 dspi->words_in_flight = dspi->devtype_data->fifo_size; in dspi_dma_xfer()
478 message->actual_length += dspi->words_in_flight * in dspi_dma_xfer()
479 dspi->oper_word_size; in dspi_dma_xfer()
481 ret = dspi_next_xfer_dma_submit(dspi); in dspi_dma_xfer()
491 static int dspi_request_dma(struct fsl_dspi *dspi, phys_addr_t phy_addr) in dspi_request_dma() argument
493 int dma_bufsize = dspi->devtype_data->fifo_size * 2; in dspi_request_dma()
494 struct device *dev = &dspi->pdev->dev; in dspi_request_dma()
557 dspi->dma = dma; in dspi_request_dma()
575 dspi->dma = NULL; in dspi_request_dma()
580 static void dspi_release_dma(struct fsl_dspi *dspi) in dspi_release_dma() argument
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()
672 static void dspi_pushr_cmd_write(struct fsl_dspi *dspi, u16 cmd) in dspi_pushr_cmd_write() argument
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()
689 static void dspi_pushr_txdata_write(struct fsl_dspi *dspi, u16 txdata) in dspi_pushr_txdata_write() argument
691 regmap_write(dspi->regmap_pushr, dspi->pushr_tx, txdata); in dspi_pushr_txdata_write()
694 static void dspi_xspi_fifo_write(struct fsl_dspi *dspi, int num_words) in dspi_xspi_fifo_write() argument
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()
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()
719 dspi_pushr_cmd_write(dspi, tx_cmd); in dspi_xspi_fifo_write()
723 u32 data = dspi_pop_tx(dspi); in dspi_xspi_fifo_write()
725 dspi_pushr_txdata_write(dspi, data & 0xFFFF); in dspi_xspi_fifo_write()
726 if (dspi->oper_bits_per_word > 16) in dspi_xspi_fifo_write()
727 dspi_pushr_txdata_write(dspi, data >> 16); in dspi_xspi_fifo_write()
731 static u32 dspi_popr_read(struct fsl_dspi *dspi) in dspi_popr_read() argument
735 regmap_read(dspi->regmap, SPI_POPR, &rxdata); in dspi_popr_read()
739 static void dspi_fifo_read(struct fsl_dspi *dspi) in dspi_fifo_read() argument
741 int num_fifo_entries = dspi->words_in_flight; in dspi_fifo_read()
745 dspi_push_rx(dspi, dspi_popr_read(dspi)); in dspi_fifo_read()
748 static void dspi_setup_accel(struct fsl_dspi *dspi) in dspi_setup_accel() argument
750 struct spi_transfer *xfer = dspi->cur_transfer; in dspi_setup_accel()
751 bool odd = !!(dspi->len & 1); 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()
808 static void dspi_fifo_write(struct fsl_dspi *dspi) in dspi_fifo_write() argument
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()
815 dspi_setup_accel(dspi); in dspi_fifo_write()
818 if (dspi->oper_word_size == 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()
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()
843 dspi_xspi_fifo_write(dspi, num_words); 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()
854 static int dspi_rxtx(struct fsl_dspi *dspi) in dspi_rxtx() argument
856 dspi_fifo_read(dspi); in dspi_rxtx()
858 if (!dspi->len) in dspi_rxtx()
862 dspi_fifo_write(dspi); in dspi_rxtx()
867 static int dspi_poll(struct fsl_dspi *dspi) in dspi_poll() argument
873 regmap_read(dspi->regmap, SPI_SR, &spi_sr); in dspi_poll()
874 regmap_write(dspi->regmap, SPI_SR, spi_sr); in dspi_poll()
883 return dspi_rxtx(dspi); in dspi_poll()
888 struct fsl_dspi *dspi = (struct fsl_dspi *)dev_id; in dspi_interrupt() local
891 regmap_read(dspi->regmap, SPI_SR, &spi_sr); in dspi_interrupt()
892 regmap_write(dspi->regmap, SPI_SR, spi_sr); in dspi_interrupt()
897 if (dspi_rxtx(dspi) == 0) in dspi_interrupt()
898 complete(&dspi->xfer_done); in dspi_interrupt()
906 struct fsl_dspi *dspi = spi_controller_get_devdata(ctlr); in dspi_transfer_one_message() local
914 dspi->cur_transfer = transfer; in dspi_transfer_one_message()
915 dspi->cur_msg = message; in dspi_transfer_one_message()
916 dspi->cur_chip = spi_get_ctldata(spi); in dspi_transfer_one_message()
918 dspi->tx_cmd = SPI_PUSHR_CMD_CTAS(0) | in dspi_transfer_one_message()
920 if (list_is_last(&dspi->cur_transfer->transfer_list, in dspi_transfer_one_message()
921 &dspi->cur_msg->transfers)) { in dspi_transfer_one_message()
926 dspi->tx_cmd |= SPI_PUSHR_CMD_CONT; in dspi_transfer_one_message()
934 dspi->tx_cmd |= SPI_PUSHR_CMD_CONT; in dspi_transfer_one_message()
937 dspi->tx = transfer->tx_buf; in dspi_transfer_one_message()
938 dspi->rx = transfer->rx_buf; in dspi_transfer_one_message()
939 dspi->len = transfer->len; in dspi_transfer_one_message()
940 dspi->progress = 0; in dspi_transfer_one_message()
942 regmap_update_bits(dspi->regmap, SPI_MCR, in dspi_transfer_one_message()
946 spi_take_timestamp_pre(dspi->ctlr, dspi->cur_transfer, in dspi_transfer_one_message()
947 dspi->progress, !dspi->irq); in dspi_transfer_one_message()
949 if (dspi->devtype_data->trans_mode == DSPI_DMA_MODE) { in dspi_transfer_one_message()
950 status = dspi_dma_xfer(dspi); in dspi_transfer_one_message()
952 dspi_fifo_write(dspi); in dspi_transfer_one_message()
954 if (dspi->irq) { in dspi_transfer_one_message()
955 wait_for_completion(&dspi->xfer_done); in dspi_transfer_one_message()
956 reinit_completion(&dspi->xfer_done); in dspi_transfer_one_message()
959 status = dspi_poll(dspi); in dspi_transfer_one_message()
977 struct fsl_dspi *dspi = spi_controller_get_devdata(spi->controller); in dspi_setup() local
993 pdata = dev_get_platdata(&dspi->pdev->dev); in dspi_setup()
1006 clkrate = clk_get_rate(dspi->clk); in dspi_setup()
1021 if (!spi_controller_is_slave(dspi->ctlr)) { in dspi_setup()
1084 struct fsl_dspi *dspi = dev_get_drvdata(dev); in dspi_suspend() local
1086 if (dspi->irq) in dspi_suspend()
1087 disable_irq(dspi->irq); in dspi_suspend()
1088 spi_controller_suspend(dspi->ctlr); in dspi_suspend()
1089 clk_disable_unprepare(dspi->clk); in dspi_suspend()
1098 struct fsl_dspi *dspi = dev_get_drvdata(dev); in dspi_resume() local
1103 ret = clk_prepare_enable(dspi->clk); in dspi_resume()
1106 spi_controller_resume(dspi->ctlr); in dspi_resume()
1107 if (dspi->irq) in dspi_resume()
1108 enable_irq(dspi->irq); in dspi_resume()
1164 static int dspi_init(struct fsl_dspi *dspi) in dspi_init() argument
1169 mcr = SPI_MCR_PCSIS(GENMASK(dspi->ctlr->max_native_cs - 1, 0)); in dspi_init()
1171 if (dspi->devtype_data->trans_mode == DSPI_XSPI_MODE) in dspi_init()
1173 if (!spi_controller_is_slave(dspi->ctlr)) in dspi_init()
1176 regmap_write(dspi->regmap, SPI_MCR, mcr); in dspi_init()
1177 regmap_write(dspi->regmap, SPI_SR, SPI_SR_CLEAR); in dspi_init()
1179 switch (dspi->devtype_data->trans_mode) { in dspi_init()
1181 regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_CMDTCFE); in dspi_init()
1184 regmap_write(dspi->regmap, SPI_RSER, in dspi_init()
1189 dev_err(&dspi->pdev->dev, "unsupported trans_mode %u\n", in dspi_init()
1190 dspi->devtype_data->trans_mode); in dspi_init()
1199 struct fsl_dspi *dspi = spi_master_get_devdata(master); in dspi_slave_abort() local
1205 if (dspi->devtype_data->trans_mode == DSPI_DMA_MODE) { in dspi_slave_abort()
1206 dmaengine_terminate_sync(dspi->dma->chan_rx); in dspi_slave_abort()
1207 dmaengine_terminate_sync(dspi->dma->chan_tx); in dspi_slave_abort()
1211 regmap_update_bits(dspi->regmap, SPI_MCR, in dspi_slave_abort()
1225 struct fsl_dspi *dspi; in dspi_probe() local
1230 dspi = devm_kzalloc(&pdev->dev, sizeof(*dspi), GFP_KERNEL); in dspi_probe()
1231 if (!dspi) in dspi_probe()
1238 spi_controller_set_devdata(ctlr, dspi); in dspi_probe()
1239 platform_set_drvdata(pdev, dspi); in dspi_probe()
1241 dspi->pdev = pdev; in dspi_probe()
1242 dspi->ctlr = ctlr; in dspi_probe()
1258 dspi->devtype_data = &devtype_data[MCF5441X]; in dspi_probe()
1275 dspi->devtype_data = of_device_get_match_data(&pdev->dev); in dspi_probe()
1276 if (!dspi->devtype_data) { in dspi_probe()
1285 dspi->pushr_cmd = 0; in dspi_probe()
1286 dspi->pushr_tx = 2; in dspi_probe()
1288 dspi->pushr_cmd = 2; in dspi_probe()
1289 dspi->pushr_tx = 0; in dspi_probe()
1292 if (dspi->devtype_data->trans_mode == DSPI_XSPI_MODE) in dspi_probe()
1304 if (dspi->devtype_data->trans_mode == DSPI_XSPI_MODE) in dspi_probe()
1308 dspi->regmap = devm_regmap_init_mmio(&pdev->dev, base, regmap_config); in dspi_probe()
1309 if (IS_ERR(dspi->regmap)) { in dspi_probe()
1311 PTR_ERR(dspi->regmap)); in dspi_probe()
1312 ret = PTR_ERR(dspi->regmap); in dspi_probe()
1316 if (dspi->devtype_data->trans_mode == DSPI_XSPI_MODE) { in dspi_probe()
1317 dspi->regmap_pushr = devm_regmap_init_mmio( in dspi_probe()
1320 if (IS_ERR(dspi->regmap_pushr)) { in dspi_probe()
1323 PTR_ERR(dspi->regmap_pushr)); in dspi_probe()
1324 ret = PTR_ERR(dspi->regmap_pushr); in dspi_probe()
1329 dspi->clk = devm_clk_get(&pdev->dev, "dspi"); in dspi_probe()
1330 if (IS_ERR(dspi->clk)) { in dspi_probe()
1331 ret = PTR_ERR(dspi->clk); in dspi_probe()
1335 ret = clk_prepare_enable(dspi->clk); in dspi_probe()
1339 ret = dspi_init(dspi); in dspi_probe()
1343 dspi->irq = platform_get_irq(pdev, 0); in dspi_probe()
1344 if (dspi->irq <= 0) { in dspi_probe()
1347 dspi->irq = 0; in dspi_probe()
1351 init_completion(&dspi->xfer_done); in dspi_probe()
1353 ret = request_threaded_irq(dspi->irq, dspi_interrupt, NULL, in dspi_probe()
1354 IRQF_SHARED, pdev->name, dspi); in dspi_probe()
1362 if (dspi->devtype_data->trans_mode == DSPI_DMA_MODE) { in dspi_probe()
1363 ret = dspi_request_dma(dspi, res->start); in dspi_probe()
1371 clk_get_rate(dspi->clk) / dspi->devtype_data->max_clock_factor; in dspi_probe()
1373 if (dspi->devtype_data->trans_mode != DSPI_DMA_MODE) in dspi_probe()
1385 dspi_release_dma(dspi); in dspi_probe()
1387 if (dspi->irq) in dspi_probe()
1388 free_irq(dspi->irq, dspi); in dspi_probe()
1390 clk_disable_unprepare(dspi->clk); in dspi_probe()
1399 struct fsl_dspi *dspi = platform_get_drvdata(pdev); in dspi_remove() local
1402 spi_unregister_controller(dspi->ctlr); in dspi_remove()
1405 regmap_update_bits(dspi->regmap, SPI_MCR, in dspi_remove()
1410 regmap_update_bits(dspi->regmap, SPI_MCR, SPI_MCR_HALT, SPI_MCR_HALT); in dspi_remove()
1412 dspi_release_dma(dspi); in dspi_remove()
1413 if (dspi->irq) in dspi_remove()
1414 free_irq(dspi->irq, dspi); in dspi_remove()
1415 clk_disable_unprepare(dspi->clk); in dspi_remove()