Lines Matching refs:dspi
166 static inline int is_double_byte_mode(struct fsl_dspi *dspi) in is_double_byte_mode() argument
170 regmap_read(dspi->regmap, SPI_CTAR(0), &val); in is_double_byte_mode()
246 static u32 dspi_data_to_pushr(struct fsl_dspi *dspi, int tx_word) in dspi_data_to_pushr() argument
250 if (!(dspi->dataflags & TRAN_STATE_TX_VOID)) in dspi_data_to_pushr()
251 d16 = tx_word ? *(u16 *)dspi->tx : *(u8 *)dspi->tx; in dspi_data_to_pushr()
253 d16 = dspi->void_write_data; in dspi_data_to_pushr()
255 dspi->tx += tx_word + 1; in dspi_data_to_pushr()
256 dspi->len -= tx_word + 1; in dspi_data_to_pushr()
259 SPI_PUSHR_PCS(dspi->cs) | in dspi_data_to_pushr()
264 static void dspi_data_from_popr(struct fsl_dspi *dspi, int rx_word) in dspi_data_from_popr() argument
269 regmap_read(dspi->regmap, SPI_POPR, &val); in dspi_data_from_popr()
272 if (!(dspi->dataflags & TRAN_STATE_RX_VOID)) in dspi_data_from_popr()
273 rx_word ? (*(u16 *)dspi->rx = d) : (*(u8 *)dspi->rx = d); in dspi_data_from_popr()
275 dspi->rx += rx_word + 1; in dspi_data_from_popr()
278 static int dspi_eoq_write(struct fsl_dspi *dspi) in dspi_eoq_write() argument
284 tx_word = is_double_byte_mode(dspi); in dspi_eoq_write()
286 while (dspi->len && (tx_count < DSPI_FIFO_SIZE)) { in dspi_eoq_write()
291 if (tx_word && (dspi->len == 1)) { in dspi_eoq_write()
292 dspi->dataflags |= TRAN_STATE_WORD_ODD_NUM; in dspi_eoq_write()
293 regmap_update_bits(dspi->regmap, SPI_CTAR(0), in dspi_eoq_write()
298 dspi_pushr = dspi_data_to_pushr(dspi, tx_word); in dspi_eoq_write()
300 if (dspi->len == 0 || tx_count == DSPI_FIFO_SIZE - 1) { in dspi_eoq_write()
303 if ((dspi->cs_change) && (!dspi->len)) in dspi_eoq_write()
305 } else if (tx_word && (dspi->len == 1)) in dspi_eoq_write()
308 regmap_write(dspi->regmap, SPI_PUSHR, dspi_pushr); in dspi_eoq_write()
316 static int dspi_eoq_read(struct fsl_dspi *dspi) in dspi_eoq_read() argument
319 int rx_word = is_double_byte_mode(dspi); in dspi_eoq_read()
321 while ((dspi->rx < dspi->rx_end) in dspi_eoq_read()
323 if (rx_word && (dspi->rx_end - dspi->rx) == 1) in dspi_eoq_read()
326 dspi_data_from_popr(dspi, rx_word); in dspi_eoq_read()
333 static int dspi_tcfq_write(struct fsl_dspi *dspi) in dspi_tcfq_write() argument
338 tx_word = is_double_byte_mode(dspi); in dspi_tcfq_write()
340 if (tx_word && (dspi->len == 1)) { in dspi_tcfq_write()
341 dspi->dataflags |= TRAN_STATE_WORD_ODD_NUM; in dspi_tcfq_write()
342 regmap_update_bits(dspi->regmap, SPI_CTAR(0), in dspi_tcfq_write()
347 dspi_pushr = dspi_data_to_pushr(dspi, tx_word); in dspi_tcfq_write()
349 if ((dspi->cs_change) && (!dspi->len)) in dspi_tcfq_write()
352 regmap_write(dspi->regmap, SPI_PUSHR, dspi_pushr); in dspi_tcfq_write()
357 static void dspi_tcfq_read(struct fsl_dspi *dspi) in dspi_tcfq_read() argument
359 int rx_word = is_double_byte_mode(dspi); in dspi_tcfq_read()
361 if (rx_word && (dspi->rx_end - dspi->rx) == 1) in dspi_tcfq_read()
364 dspi_data_from_popr(dspi, rx_word); in dspi_tcfq_read()
370 struct fsl_dspi *dspi = spi_master_get_devdata(master); in dspi_transfer_one_message() local
377 regmap_read(dspi->regmap, SPI_TCR, &spi_tcr); in dspi_transfer_one_message()
378 dspi->spi_tcnt = SPI_TCR_GET_TCNT(spi_tcr); in dspi_transfer_one_message()
383 dspi->cur_transfer = transfer; in dspi_transfer_one_message()
384 dspi->cur_msg = message; in dspi_transfer_one_message()
385 dspi->cur_chip = spi_get_ctldata(spi); in dspi_transfer_one_message()
386 dspi->cs = spi->chip_select; in dspi_transfer_one_message()
387 dspi->cs_change = 0; in dspi_transfer_one_message()
388 if (dspi->cur_transfer->transfer_list.next in dspi_transfer_one_message()
389 == &dspi->cur_msg->transfers) in dspi_transfer_one_message()
390 dspi->cs_change = 1; in dspi_transfer_one_message()
391 dspi->void_write_data = dspi->cur_chip->void_write_data; in dspi_transfer_one_message()
393 dspi->dataflags = 0; in dspi_transfer_one_message()
394 dspi->tx = (void *)transfer->tx_buf; in dspi_transfer_one_message()
395 dspi->tx_end = dspi->tx + transfer->len; in dspi_transfer_one_message()
396 dspi->rx = transfer->rx_buf; in dspi_transfer_one_message()
397 dspi->rx_end = dspi->rx + transfer->len; in dspi_transfer_one_message()
398 dspi->len = transfer->len; in dspi_transfer_one_message()
400 if (!dspi->rx) in dspi_transfer_one_message()
401 dspi->dataflags |= TRAN_STATE_RX_VOID; in dspi_transfer_one_message()
403 if (!dspi->tx) in dspi_transfer_one_message()
404 dspi->dataflags |= TRAN_STATE_TX_VOID; in dspi_transfer_one_message()
406 regmap_write(dspi->regmap, SPI_MCR, dspi->cur_chip->mcr_val); in dspi_transfer_one_message()
407 regmap_update_bits(dspi->regmap, SPI_MCR, in dspi_transfer_one_message()
410 regmap_write(dspi->regmap, SPI_CTAR(0), in dspi_transfer_one_message()
411 dspi->cur_chip->ctar_val); in dspi_transfer_one_message()
413 trans_mode = dspi->devtype_data->trans_mode; in dspi_transfer_one_message()
416 regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_EOQFE); in dspi_transfer_one_message()
417 dspi_eoq_write(dspi); in dspi_transfer_one_message()
420 regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_TCFQE); in dspi_transfer_one_message()
421 dspi_tcfq_write(dspi); in dspi_transfer_one_message()
424 dev_err(&dspi->pdev->dev, "unsupported trans_mode %u\n", in dspi_transfer_one_message()
430 if (wait_event_interruptible(dspi->waitq, dspi->waitflags)) in dspi_transfer_one_message()
431 dev_err(&dspi->pdev->dev, "wait transfer complete fail!\n"); in dspi_transfer_one_message()
432 dspi->waitflags = 0; in dspi_transfer_one_message()
448 struct fsl_dspi *dspi = spi_master_get_devdata(spi->master); in dspi_setup() local
480 clkrate = clk_get_rate(dspi->clk); in dspi_setup()
517 struct fsl_dspi *dspi = (struct fsl_dspi *)dev_id; in dspi_interrupt() local
518 struct spi_message *msg = dspi->cur_msg; in dspi_interrupt()
524 regmap_read(dspi->regmap, SPI_SR, &spi_sr); in dspi_interrupt()
525 regmap_write(dspi->regmap, SPI_SR, spi_sr); in dspi_interrupt()
529 tx_word = is_double_byte_mode(dspi); in dspi_interrupt()
531 regmap_read(dspi->regmap, SPI_TCR, &spi_tcr); in dspi_interrupt()
542 tcnt_diff = ((spi_tcnt + SPI_TCR_TCNT_MAX) - dspi->spi_tcnt) in dspi_interrupt()
545 if (dspi->dataflags & TRAN_STATE_WORD_ODD_NUM) in dspi_interrupt()
550 dspi->spi_tcnt = spi_tcnt; in dspi_interrupt()
552 trans_mode = dspi->devtype_data->trans_mode; in dspi_interrupt()
555 dspi_eoq_read(dspi); in dspi_interrupt()
558 dspi_tcfq_read(dspi); in dspi_interrupt()
561 dev_err(&dspi->pdev->dev, "unsupported trans_mode %u\n", in dspi_interrupt()
566 if (!dspi->len) { in dspi_interrupt()
567 if (dspi->dataflags & TRAN_STATE_WORD_ODD_NUM) { in dspi_interrupt()
568 regmap_update_bits(dspi->regmap, in dspi_interrupt()
572 dspi->dataflags &= ~TRAN_STATE_WORD_ODD_NUM; in dspi_interrupt()
575 dspi->waitflags = 1; in dspi_interrupt()
576 wake_up_interruptible(&dspi->waitq); in dspi_interrupt()
580 dspi_eoq_write(dspi); in dspi_interrupt()
583 dspi_tcfq_write(dspi); in dspi_interrupt()
586 dev_err(&dspi->pdev->dev, in dspi_interrupt()
609 struct fsl_dspi *dspi = spi_master_get_devdata(master); in dspi_suspend() local
612 clk_disable_unprepare(dspi->clk); in dspi_suspend()
622 struct fsl_dspi *dspi = spi_master_get_devdata(master); in dspi_resume() local
626 clk_prepare_enable(dspi->clk); in dspi_resume()
646 struct fsl_dspi *dspi; in dspi_probe() local
657 dspi = spi_master_get_devdata(master); in dspi_probe()
658 dspi->pdev = pdev; in dspi_probe()
659 dspi->master = master; in dspi_probe()
685 dspi->devtype_data = (struct fsl_dspi_devtype_data *)of_id->data; in dspi_probe()
686 if (!dspi->devtype_data) { in dspi_probe()
699 dspi->regmap = devm_regmap_init_mmio_clk(&pdev->dev, NULL, base, in dspi_probe()
701 if (IS_ERR(dspi->regmap)) { in dspi_probe()
703 PTR_ERR(dspi->regmap)); in dspi_probe()
704 return PTR_ERR(dspi->regmap); in dspi_probe()
707 dspi->irq = platform_get_irq(pdev, 0); in dspi_probe()
708 if (dspi->irq < 0) { in dspi_probe()
710 ret = dspi->irq; in dspi_probe()
714 ret = devm_request_irq(&pdev->dev, dspi->irq, dspi_interrupt, 0, in dspi_probe()
715 pdev->name, dspi); in dspi_probe()
721 dspi->clk = devm_clk_get(&pdev->dev, "dspi"); in dspi_probe()
722 if (IS_ERR(dspi->clk)) { in dspi_probe()
723 ret = PTR_ERR(dspi->clk); in dspi_probe()
727 clk_prepare_enable(dspi->clk); in dspi_probe()
729 init_waitqueue_head(&dspi->waitq); in dspi_probe()
741 clk_disable_unprepare(dspi->clk); in dspi_probe()
751 struct fsl_dspi *dspi = spi_master_get_devdata(master); in dspi_remove() local
754 clk_disable_unprepare(dspi->clk); in dspi_remove()
755 spi_unregister_master(dspi->master); in dspi_remove()
756 spi_master_put(dspi->master); in dspi_remove()