Lines Matching refs:ctlr
123 struct spi_controller *ctlr; member
396 spi_finalize_current_transfer(bs->ctlr); in bcm2835_spi_interrupt()
402 static int bcm2835_spi_transfer_one_irq(struct spi_controller *ctlr, in bcm2835_spi_transfer_one_irq() argument
407 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_transfer_one_irq()
477 static void bcm2835_spi_transfer_prologue(struct spi_controller *ctlr, in bcm2835_spi_transfer_prologue() argument
522 dma_sync_single_for_device(ctlr->dma_rx->device->dev, in bcm2835_spi_transfer_prologue()
601 struct spi_controller *ctlr = data; in bcm2835_spi_dma_rx_done() local
602 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_dma_rx_done()
609 dmaengine_terminate_async(ctlr->dma_tx); in bcm2835_spi_dma_rx_done()
618 spi_finalize_current_transfer(ctlr); in bcm2835_spi_dma_rx_done()
629 struct spi_controller *ctlr = data; in bcm2835_spi_dma_tx_done() local
630 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_dma_tx_done()
645 dmaengine_terminate_async(ctlr->dma_rx); in bcm2835_spi_dma_tx_done()
649 spi_finalize_current_transfer(ctlr); in bcm2835_spi_dma_tx_done()
663 static int bcm2835_spi_prepare_sg(struct spi_controller *ctlr, in bcm2835_spi_prepare_sg() argument
680 chan = ctlr->dma_tx; in bcm2835_spi_prepare_sg()
686 chan = ctlr->dma_rx; in bcm2835_spi_prepare_sg()
702 desc->callback_param = ctlr; in bcm2835_spi_prepare_sg()
705 desc->callback_param = ctlr; in bcm2835_spi_prepare_sg()
762 static int bcm2835_spi_transfer_one_dma(struct spi_controller *ctlr, in bcm2835_spi_transfer_one_dma() argument
767 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_transfer_one_dma()
778 bcm2835_spi_transfer_prologue(ctlr, tfr, bs, cs); in bcm2835_spi_transfer_one_dma()
782 ret = bcm2835_spi_prepare_sg(ctlr, tfr, bs, slv, true); in bcm2835_spi_transfer_one_dma()
801 dma_async_issue_pending(ctlr->dma_tx); in bcm2835_spi_transfer_one_dma()
808 ret = bcm2835_spi_prepare_sg(ctlr, tfr, bs, slv, false); in bcm2835_spi_transfer_one_dma()
815 dmaengine_terminate_sync(ctlr->dma_tx); in bcm2835_spi_transfer_one_dma()
821 dma_async_issue_pending(ctlr->dma_rx); in bcm2835_spi_transfer_one_dma()
831 dmaengine_terminate_async(ctlr->dma_rx); in bcm2835_spi_transfer_one_dma()
844 static bool bcm2835_spi_can_dma(struct spi_controller *ctlr, in bcm2835_spi_can_dma() argument
856 static void bcm2835_dma_release(struct spi_controller *ctlr, in bcm2835_dma_release() argument
859 if (ctlr->dma_tx) { in bcm2835_dma_release()
860 dmaengine_terminate_sync(ctlr->dma_tx); in bcm2835_dma_release()
866 dma_unmap_page_attrs(ctlr->dma_tx->device->dev, in bcm2835_dma_release()
871 dma_release_channel(ctlr->dma_tx); in bcm2835_dma_release()
872 ctlr->dma_tx = NULL; in bcm2835_dma_release()
875 if (ctlr->dma_rx) { in bcm2835_dma_release()
876 dmaengine_terminate_sync(ctlr->dma_rx); in bcm2835_dma_release()
877 dma_release_channel(ctlr->dma_rx); in bcm2835_dma_release()
878 ctlr->dma_rx = NULL; in bcm2835_dma_release()
882 static int bcm2835_dma_init(struct spi_controller *ctlr, struct device *dev, in bcm2835_dma_init() argument
891 addr = of_get_address(ctlr->dev.of_node, 0, NULL, NULL); in bcm2835_dma_init()
900 ctlr->dma_tx = dma_request_chan(dev, "tx"); in bcm2835_dma_init()
901 if (IS_ERR(ctlr->dma_tx)) { in bcm2835_dma_init()
903 ret = PTR_ERR(ctlr->dma_tx); in bcm2835_dma_init()
904 ctlr->dma_tx = NULL; in bcm2835_dma_init()
907 ctlr->dma_rx = dma_request_chan(dev, "rx"); in bcm2835_dma_init()
908 if (IS_ERR(ctlr->dma_rx)) { in bcm2835_dma_init()
910 ret = PTR_ERR(ctlr->dma_rx); in bcm2835_dma_init()
911 ctlr->dma_rx = NULL; in bcm2835_dma_init()
923 ret = dmaengine_slave_config(ctlr->dma_tx, &slave_config); in bcm2835_dma_init()
927 bs->fill_tx_addr = dma_map_page_attrs(ctlr->dma_tx->device->dev, in bcm2835_dma_init()
931 if (dma_mapping_error(ctlr->dma_tx->device->dev, bs->fill_tx_addr)) { in bcm2835_dma_init()
938 bs->fill_tx_desc = dmaengine_prep_dma_cyclic(ctlr->dma_tx, in bcm2835_dma_init()
964 ret = dmaengine_slave_config(ctlr->dma_rx, &slave_config); in bcm2835_dma_init()
969 ctlr->can_dma = bcm2835_spi_can_dma; in bcm2835_dma_init()
977 bcm2835_dma_release(ctlr, bs); in bcm2835_dma_init()
989 static int bcm2835_spi_transfer_one_poll(struct spi_controller *ctlr, in bcm2835_spi_transfer_one_poll() argument
994 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_transfer_one_poll()
1033 return bcm2835_spi_transfer_one_irq(ctlr, spi, in bcm2835_spi_transfer_one_poll()
1044 static int bcm2835_spi_transfer_one(struct spi_controller *ctlr, in bcm2835_spi_transfer_one() argument
1048 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_transfer_one()
1093 return bcm2835_spi_transfer_one_poll(ctlr, spi, tfr, cs); in bcm2835_spi_transfer_one()
1099 if (ctlr->can_dma && bcm2835_spi_can_dma(ctlr, spi, tfr)) in bcm2835_spi_transfer_one()
1100 return bcm2835_spi_transfer_one_dma(ctlr, tfr, slv, cs); in bcm2835_spi_transfer_one()
1103 return bcm2835_spi_transfer_one_irq(ctlr, spi, tfr, cs, true); in bcm2835_spi_transfer_one()
1106 static int bcm2835_spi_prepare_message(struct spi_controller *ctlr, in bcm2835_spi_prepare_message() argument
1110 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_prepare_message()
1114 if (ctlr->can_dma) { in bcm2835_spi_prepare_message()
1120 ret = spi_split_transfers_maxsize(ctlr, msg, 65532, in bcm2835_spi_prepare_message()
1135 static void bcm2835_spi_handle_err(struct spi_controller *ctlr, in bcm2835_spi_handle_err() argument
1138 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_handle_err()
1141 dmaengine_terminate_sync(ctlr->dma_tx); in bcm2835_spi_handle_err()
1143 dmaengine_terminate_sync(ctlr->dma_rx); in bcm2835_spi_handle_err()
1159 struct spi_controller *ctlr = spi->controller; in bcm2835_spi_cleanup() local
1165 dma_unmap_single(ctlr->dma_rx->device->dev, in bcm2835_spi_cleanup()
1173 static int bcm2835_spi_setup_dma(struct spi_controller *ctlr, in bcm2835_spi_setup_dma() argument
1180 if (!ctlr->dma_rx) in bcm2835_spi_setup_dma()
1183 slv->clear_rx_addr = dma_map_single(ctlr->dma_rx->device->dev, in bcm2835_spi_setup_dma()
1187 if (dma_mapping_error(ctlr->dma_rx->device->dev, slv->clear_rx_addr)) { in bcm2835_spi_setup_dma()
1193 slv->clear_rx_desc = dmaengine_prep_dma_cyclic(ctlr->dma_rx, in bcm2835_spi_setup_dma()
1213 struct spi_controller *ctlr = spi->controller; in bcm2835_spi_setup() local
1214 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_setup()
1228 ret = bcm2835_spi_setup_dma(ctlr, spi, bs, slv); in bcm2835_spi_setup()
1250 if (ctlr->dma_rx) { in bcm2835_spi_setup()
1254 dma_sync_single_for_device(ctlr->dma_rx->device->dev, in bcm2835_spi_setup()
1318 struct spi_controller *ctlr; in bcm2835_spi_probe() local
1322 ctlr = devm_spi_alloc_master(&pdev->dev, sizeof(*bs)); in bcm2835_spi_probe()
1323 if (!ctlr) in bcm2835_spi_probe()
1326 platform_set_drvdata(pdev, ctlr); in bcm2835_spi_probe()
1328 ctlr->use_gpio_descriptors = true; in bcm2835_spi_probe()
1329 ctlr->mode_bits = BCM2835_SPI_MODE_BITS; in bcm2835_spi_probe()
1330 ctlr->bits_per_word_mask = SPI_BPW_MASK(8); in bcm2835_spi_probe()
1331 ctlr->num_chipselect = 3; in bcm2835_spi_probe()
1332 ctlr->setup = bcm2835_spi_setup; in bcm2835_spi_probe()
1333 ctlr->cleanup = bcm2835_spi_cleanup; in bcm2835_spi_probe()
1334 ctlr->transfer_one = bcm2835_spi_transfer_one; in bcm2835_spi_probe()
1335 ctlr->handle_err = bcm2835_spi_handle_err; in bcm2835_spi_probe()
1336 ctlr->prepare_message = bcm2835_spi_prepare_message; in bcm2835_spi_probe()
1337 ctlr->dev.of_node = pdev->dev.of_node; in bcm2835_spi_probe()
1339 bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_probe()
1340 bs->ctlr = ctlr; in bcm2835_spi_probe()
1351 ctlr->max_speed_hz = clk_get_rate(bs->clk) / 2; in bcm2835_spi_probe()
1360 err = bcm2835_dma_init(ctlr, &pdev->dev, bs); in bcm2835_spi_probe()
1375 err = spi_register_controller(ctlr); in bcm2835_spi_probe()
1387 bcm2835_dma_release(ctlr, bs); in bcm2835_spi_probe()
1395 struct spi_controller *ctlr = platform_get_drvdata(pdev); in bcm2835_spi_remove() local
1396 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_remove()
1400 spi_unregister_controller(ctlr); in bcm2835_spi_remove()
1402 bcm2835_dma_release(ctlr, bs); in bcm2835_spi_remove()