Lines Matching refs:xqspi
181 static u32 zynqmp_gqspi_read(struct zynqmp_qspi *xqspi, u32 offset) in zynqmp_gqspi_read() argument
183 return readl_relaxed(xqspi->regs + offset); in zynqmp_gqspi_read()
192 static inline void zynqmp_gqspi_write(struct zynqmp_qspi *xqspi, u32 offset, in zynqmp_gqspi_write() argument
195 writel_relaxed(val, (xqspi->regs + offset)); in zynqmp_gqspi_write()
263 static void zynqmp_qspi_init_hw(struct zynqmp_qspi *xqspi) in zynqmp_qspi_init_hw() argument
268 zynqmp_gqspi_write(xqspi, GQSPI_SEL_OFST, GQSPI_SEL_MASK); in zynqmp_qspi_init_hw()
270 zynqmp_gqspi_write(xqspi, GQSPI_ISR_OFST, in zynqmp_qspi_init_hw()
271 zynqmp_gqspi_read(xqspi, GQSPI_ISR_OFST) | in zynqmp_qspi_init_hw()
274 zynqmp_gqspi_write(xqspi, GQSPI_QSPIDMA_DST_I_STS_OFST, in zynqmp_qspi_init_hw()
275 zynqmp_gqspi_read(xqspi, in zynqmp_qspi_init_hw()
277 zynqmp_gqspi_write(xqspi, GQSPI_QSPIDMA_DST_STS_OFST, in zynqmp_qspi_init_hw()
278 zynqmp_gqspi_read(xqspi, in zynqmp_qspi_init_hw()
281 zynqmp_gqspi_write(xqspi, GQSPI_IDR_OFST, GQSPI_IDR_ALL_MASK); in zynqmp_qspi_init_hw()
282 zynqmp_gqspi_write(xqspi, in zynqmp_qspi_init_hw()
286 zynqmp_gqspi_write(xqspi, GQSPI_EN_OFST, 0x0); in zynqmp_qspi_init_hw()
287 config_reg = zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST); in zynqmp_qspi_init_hw()
303 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, config_reg); in zynqmp_qspi_init_hw()
306 zynqmp_gqspi_write(xqspi, GQSPI_FIFO_CTRL_OFST, in zynqmp_qspi_init_hw()
311 zynqmp_gqspi_write(xqspi, GQSPI_LPBK_DLY_ADJ_OFST, in zynqmp_qspi_init_hw()
312 zynqmp_gqspi_read(xqspi, GQSPI_LPBK_DLY_ADJ_OFST) | in zynqmp_qspi_init_hw()
315 zynqmp_gqspi_write(xqspi, GQSPI_TX_THRESHOLD_OFST, in zynqmp_qspi_init_hw()
317 zynqmp_gqspi_write(xqspi, GQSPI_RX_THRESHOLD_OFST, in zynqmp_qspi_init_hw()
319 zynqmp_gqspi_write(xqspi, GQSPI_GF_THRESHOLD_OFST, in zynqmp_qspi_init_hw()
321 zynqmp_gqspi_selectslave(xqspi, in zynqmp_qspi_init_hw()
325 zynqmp_gqspi_write(xqspi, in zynqmp_qspi_init_hw()
330 zynqmp_gqspi_write(xqspi, GQSPI_EN_OFST, GQSPI_EN_MASK); in zynqmp_qspi_init_hw()
339 static void zynqmp_qspi_copy_read_data(struct zynqmp_qspi *xqspi, in zynqmp_qspi_copy_read_data() argument
342 memcpy(xqspi->rxbuf, &data, size); in zynqmp_qspi_copy_read_data()
343 xqspi->rxbuf += size; in zynqmp_qspi_copy_read_data()
344 xqspi->bytes_to_receive -= size; in zynqmp_qspi_copy_read_data()
358 struct zynqmp_qspi *xqspi = spi_master_get_devdata(master); in zynqmp_prepare_transfer_hardware() local
360 zynqmp_gqspi_write(xqspi, GQSPI_EN_OFST, GQSPI_EN_MASK); in zynqmp_prepare_transfer_hardware()
375 struct zynqmp_qspi *xqspi = spi_master_get_devdata(master); in zynqmp_unprepare_transfer_hardware() local
377 zynqmp_gqspi_write(xqspi, GQSPI_EN_OFST, 0x0); in zynqmp_unprepare_transfer_hardware()
388 struct zynqmp_qspi *xqspi = spi_master_get_devdata(qspi->master); in zynqmp_qspi_chipselect() local
393 genfifoentry |= xqspi->genfifobus; in zynqmp_qspi_chipselect()
396 genfifoentry |= xqspi->genfifocs; in zynqmp_qspi_chipselect()
402 zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, genfifoentry); in zynqmp_qspi_chipselect()
405 zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, 0x0); in zynqmp_qspi_chipselect()
408 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, in zynqmp_qspi_chipselect()
409 zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST) | in zynqmp_qspi_chipselect()
416 statusreg = zynqmp_gqspi_read(xqspi, GQSPI_ISR_OFST); in zynqmp_qspi_chipselect()
426 dev_err(xqspi->dev, "Chip select timed out\n"); in zynqmp_qspi_chipselect()
454 struct zynqmp_qspi *xqspi = spi_master_get_devdata(qspi->master); in zynqmp_qspi_setup_transfer() local
465 clk_rate = clk_get_rate(xqspi->refclk); in zynqmp_qspi_setup_transfer()
472 config_reg = zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST); in zynqmp_qspi_setup_transfer()
484 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, config_reg); in zynqmp_qspi_setup_transfer()
511 static void zynqmp_qspi_filltxfifo(struct zynqmp_qspi *xqspi, int size) in zynqmp_qspi_filltxfifo() argument
515 while ((xqspi->bytes_to_transfer > 0) && (count < size)) { in zynqmp_qspi_filltxfifo()
516 memcpy(&intermediate, xqspi->txbuf, 4); in zynqmp_qspi_filltxfifo()
517 zynqmp_gqspi_write(xqspi, GQSPI_TXD_OFST, intermediate); in zynqmp_qspi_filltxfifo()
519 if (xqspi->bytes_to_transfer >= 4) { in zynqmp_qspi_filltxfifo()
520 xqspi->txbuf += 4; in zynqmp_qspi_filltxfifo()
521 xqspi->bytes_to_transfer -= 4; in zynqmp_qspi_filltxfifo()
523 xqspi->txbuf += xqspi->bytes_to_transfer; in zynqmp_qspi_filltxfifo()
524 xqspi->bytes_to_transfer = 0; in zynqmp_qspi_filltxfifo()
536 static void zynqmp_qspi_readrxfifo(struct zynqmp_qspi *xqspi, u32 size) in zynqmp_qspi_readrxfifo() argument
541 while ((count < size) && (xqspi->bytes_to_receive > 0)) { in zynqmp_qspi_readrxfifo()
542 if (xqspi->bytes_to_receive >= 4) { in zynqmp_qspi_readrxfifo()
543 (*(u32 *) xqspi->rxbuf) = in zynqmp_qspi_readrxfifo()
544 zynqmp_gqspi_read(xqspi, GQSPI_RXD_OFST); in zynqmp_qspi_readrxfifo()
545 xqspi->rxbuf += 4; in zynqmp_qspi_readrxfifo()
546 xqspi->bytes_to_receive -= 4; in zynqmp_qspi_readrxfifo()
549 data = zynqmp_gqspi_read(xqspi, GQSPI_RXD_OFST); in zynqmp_qspi_readrxfifo()
550 count += xqspi->bytes_to_receive; in zynqmp_qspi_readrxfifo()
551 zynqmp_qspi_copy_read_data(xqspi, data, in zynqmp_qspi_readrxfifo()
552 xqspi->bytes_to_receive); in zynqmp_qspi_readrxfifo()
553 xqspi->bytes_to_receive = 0; in zynqmp_qspi_readrxfifo()
565 static void zynqmp_process_dma_irq(struct zynqmp_qspi *xqspi) in zynqmp_process_dma_irq() argument
569 dma_unmap_single(xqspi->dev, xqspi->dma_addr, in zynqmp_process_dma_irq()
570 xqspi->dma_rx_bytes, DMA_FROM_DEVICE); in zynqmp_process_dma_irq()
571 xqspi->rxbuf += xqspi->dma_rx_bytes; in zynqmp_process_dma_irq()
572 xqspi->bytes_to_receive -= xqspi->dma_rx_bytes; in zynqmp_process_dma_irq()
573 xqspi->dma_rx_bytes = 0; in zynqmp_process_dma_irq()
576 zynqmp_gqspi_write(xqspi, GQSPI_QSPIDMA_DST_I_DIS_OFST, in zynqmp_process_dma_irq()
579 if (xqspi->bytes_to_receive > 0) { in zynqmp_process_dma_irq()
581 config_reg = zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST); in zynqmp_process_dma_irq()
583 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, config_reg); in zynqmp_process_dma_irq()
586 genfifoentry = xqspi->genfifoentry; in zynqmp_process_dma_irq()
587 genfifoentry |= xqspi->bytes_to_receive; in zynqmp_process_dma_irq()
588 zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, genfifoentry); in zynqmp_process_dma_irq()
591 zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, 0x0); in zynqmp_process_dma_irq()
594 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, in zynqmp_process_dma_irq()
595 (zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST) | in zynqmp_process_dma_irq()
599 zynqmp_gqspi_write(xqspi, GQSPI_IER_OFST, in zynqmp_process_dma_irq()
621 struct zynqmp_qspi *xqspi = spi_master_get_devdata(master); in zynqmp_qspi_irq() local
625 status = zynqmp_gqspi_read(xqspi, GQSPI_ISR_OFST); in zynqmp_qspi_irq()
626 zynqmp_gqspi_write(xqspi, GQSPI_ISR_OFST, status); in zynqmp_qspi_irq()
627 mask = (status & ~(zynqmp_gqspi_read(xqspi, GQSPI_IMASK_OFST))); in zynqmp_qspi_irq()
630 if (xqspi->mode == GQSPI_MODE_DMA) { in zynqmp_qspi_irq()
632 zynqmp_gqspi_read(xqspi, GQSPI_QSPIDMA_DST_I_STS_OFST); in zynqmp_qspi_irq()
633 zynqmp_gqspi_write(xqspi, GQSPI_QSPIDMA_DST_I_STS_OFST, in zynqmp_qspi_irq()
638 zynqmp_qspi_filltxfifo(xqspi, GQSPI_TX_FIFO_FILL); in zynqmp_qspi_irq()
643 zynqmp_process_dma_irq(xqspi); in zynqmp_qspi_irq()
647 zynqmp_qspi_readrxfifo(xqspi, GQSPI_RX_FIFO_FILL); in zynqmp_qspi_irq()
651 if ((xqspi->bytes_to_receive == 0) && (xqspi->bytes_to_transfer == 0) in zynqmp_qspi_irq()
653 zynqmp_gqspi_write(xqspi, GQSPI_IDR_OFST, GQSPI_ISR_IDR_MASK); in zynqmp_qspi_irq()
666 static inline u32 zynqmp_qspi_selectspimode(struct zynqmp_qspi *xqspi, in zynqmp_qspi_selectspimode() argument
682 dev_warn(xqspi->dev, "Invalid SPI mode\n"); in zynqmp_qspi_selectspimode()
692 static void zynq_qspi_setuprxdma(struct zynqmp_qspi *xqspi) in zynq_qspi_setuprxdma() argument
696 u64 dma_align = (u64)(uintptr_t)xqspi->rxbuf; in zynq_qspi_setuprxdma()
698 if ((xqspi->bytes_to_receive < 8) || in zynq_qspi_setuprxdma()
701 config_reg = zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST); in zynq_qspi_setuprxdma()
703 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, config_reg); in zynq_qspi_setuprxdma()
704 xqspi->mode = GQSPI_MODE_IO; in zynq_qspi_setuprxdma()
705 xqspi->dma_rx_bytes = 0; in zynq_qspi_setuprxdma()
709 rx_rem = xqspi->bytes_to_receive % 4; in zynq_qspi_setuprxdma()
710 rx_bytes = (xqspi->bytes_to_receive - rx_rem); in zynq_qspi_setuprxdma()
712 addr = dma_map_single(xqspi->dev, (void *)xqspi->rxbuf, in zynq_qspi_setuprxdma()
714 if (dma_mapping_error(xqspi->dev, addr)) in zynq_qspi_setuprxdma()
715 dev_err(xqspi->dev, "ERR:rxdma:memory not mapped\n"); in zynq_qspi_setuprxdma()
717 xqspi->dma_rx_bytes = rx_bytes; in zynq_qspi_setuprxdma()
718 xqspi->dma_addr = addr; in zynq_qspi_setuprxdma()
719 zynqmp_gqspi_write(xqspi, GQSPI_QSPIDMA_DST_ADDR_OFST, in zynq_qspi_setuprxdma()
722 zynqmp_gqspi_write(xqspi, GQSPI_QSPIDMA_DST_ADDR_MSB_OFST, in zynq_qspi_setuprxdma()
726 config_reg = zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST); in zynq_qspi_setuprxdma()
729 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, config_reg); in zynq_qspi_setuprxdma()
732 xqspi->mode = GQSPI_MODE_DMA; in zynq_qspi_setuprxdma()
735 zynqmp_gqspi_write(xqspi, GQSPI_QSPIDMA_DST_SIZE_OFST, rx_bytes); in zynq_qspi_setuprxdma()
747 static void zynqmp_qspi_txrxsetup(struct zynqmp_qspi *xqspi, in zynqmp_qspi_txrxsetup() argument
754 if ((xqspi->txbuf != NULL) && (xqspi->rxbuf == NULL)) { in zynqmp_qspi_txrxsetup()
760 zynqmp_qspi_selectspimode(xqspi, transfer->tx_nbits); in zynqmp_qspi_txrxsetup()
761 xqspi->bytes_to_transfer = transfer->len; in zynqmp_qspi_txrxsetup()
762 if (xqspi->mode == GQSPI_MODE_DMA) { in zynqmp_qspi_txrxsetup()
763 config_reg = zynqmp_gqspi_read(xqspi, in zynqmp_qspi_txrxsetup()
766 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, in zynqmp_qspi_txrxsetup()
768 xqspi->mode = GQSPI_MODE_IO; in zynqmp_qspi_txrxsetup()
770 zynqmp_qspi_filltxfifo(xqspi, GQSPI_TXD_DEPTH); in zynqmp_qspi_txrxsetup()
772 xqspi->bytes_to_receive = 0; in zynqmp_qspi_txrxsetup()
773 } else if ((xqspi->txbuf == NULL) && (xqspi->rxbuf != NULL)) { in zynqmp_qspi_txrxsetup()
782 zynqmp_qspi_selectspimode(xqspi, transfer->rx_nbits); in zynqmp_qspi_txrxsetup()
783 xqspi->bytes_to_transfer = 0; in zynqmp_qspi_txrxsetup()
784 xqspi->bytes_to_receive = transfer->len; in zynqmp_qspi_txrxsetup()
785 zynq_qspi_setuprxdma(xqspi); in zynqmp_qspi_txrxsetup()
806 struct zynqmp_qspi *xqspi = spi_master_get_devdata(master); in zynqmp_qspi_start_transfer() local
809 xqspi->txbuf = transfer->tx_buf; in zynqmp_qspi_start_transfer()
810 xqspi->rxbuf = transfer->rx_buf; in zynqmp_qspi_start_transfer()
814 genfifoentry |= xqspi->genfifocs; in zynqmp_qspi_start_transfer()
815 genfifoentry |= xqspi->genfifobus; in zynqmp_qspi_start_transfer()
817 zynqmp_qspi_txrxsetup(xqspi, transfer, &genfifoentry); in zynqmp_qspi_start_transfer()
819 if (xqspi->mode == GQSPI_MODE_DMA) in zynqmp_qspi_start_transfer()
820 transfer_len = xqspi->dma_rx_bytes; in zynqmp_qspi_start_transfer()
824 xqspi->genfifoentry = genfifoentry; in zynqmp_qspi_start_transfer()
828 zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, genfifoentry); in zynqmp_qspi_start_transfer()
844 zynqmp_gqspi_write(xqspi, in zynqmp_qspi_start_transfer()
856 zynqmp_gqspi_write(xqspi, in zynqmp_qspi_start_transfer()
861 if ((xqspi->mode == GQSPI_MODE_IO) && in zynqmp_qspi_start_transfer()
862 (xqspi->rxbuf != NULL)) { in zynqmp_qspi_start_transfer()
864 zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, 0x0); in zynqmp_qspi_start_transfer()
868 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, in zynqmp_qspi_start_transfer()
869 zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST) | in zynqmp_qspi_start_transfer()
872 if (xqspi->txbuf != NULL) in zynqmp_qspi_start_transfer()
874 zynqmp_gqspi_write(xqspi, GQSPI_IER_OFST, in zynqmp_qspi_start_transfer()
879 if (xqspi->rxbuf != NULL) { in zynqmp_qspi_start_transfer()
881 if (xqspi->mode == GQSPI_MODE_DMA) { in zynqmp_qspi_start_transfer()
883 zynqmp_gqspi_write(xqspi, in zynqmp_qspi_start_transfer()
887 zynqmp_gqspi_write(xqspi, GQSPI_IER_OFST, in zynqmp_qspi_start_transfer()
928 struct zynqmp_qspi *xqspi = spi_master_get_devdata(master); in zynqmp_qspi_resume() local
931 ret = clk_enable(xqspi->pclk); in zynqmp_qspi_resume()
937 ret = clk_enable(xqspi->refclk); in zynqmp_qspi_resume()
940 clk_disable(xqspi->pclk); in zynqmp_qspi_resume()
946 clk_disable(xqspi->refclk); in zynqmp_qspi_resume()
947 clk_disable(xqspi->pclk); in zynqmp_qspi_resume()
962 struct zynqmp_qspi *xqspi = spi_master_get_devdata(master); in zynqmp_runtime_suspend() local
964 clk_disable(xqspi->refclk); in zynqmp_runtime_suspend()
965 clk_disable(xqspi->pclk); in zynqmp_runtime_suspend()
981 struct zynqmp_qspi *xqspi = spi_master_get_devdata(master); in zynqmp_runtime_resume() local
984 ret = clk_enable(xqspi->pclk); in zynqmp_runtime_resume()
990 ret = clk_enable(xqspi->refclk); in zynqmp_runtime_resume()
993 clk_disable(xqspi->pclk); in zynqmp_runtime_resume()
1018 struct zynqmp_qspi *xqspi; in zynqmp_qspi_probe() local
1025 master = spi_alloc_master(&pdev->dev, sizeof(*xqspi)); in zynqmp_qspi_probe()
1029 xqspi = spi_master_get_devdata(master); in zynqmp_qspi_probe()
1033 xqspi->regs = devm_platform_ioremap_resource(pdev, 0); in zynqmp_qspi_probe()
1034 if (IS_ERR(xqspi->regs)) { in zynqmp_qspi_probe()
1035 ret = PTR_ERR(xqspi->regs); in zynqmp_qspi_probe()
1039 xqspi->dev = dev; in zynqmp_qspi_probe()
1040 xqspi->pclk = devm_clk_get(&pdev->dev, "pclk"); in zynqmp_qspi_probe()
1041 if (IS_ERR(xqspi->pclk)) { in zynqmp_qspi_probe()
1043 ret = PTR_ERR(xqspi->pclk); in zynqmp_qspi_probe()
1047 ret = clk_prepare_enable(xqspi->pclk); in zynqmp_qspi_probe()
1053 xqspi->refclk = devm_clk_get(&pdev->dev, "ref_clk"); in zynqmp_qspi_probe()
1054 if (IS_ERR(xqspi->refclk)) { in zynqmp_qspi_probe()
1056 ret = PTR_ERR(xqspi->refclk); in zynqmp_qspi_probe()
1060 ret = clk_prepare_enable(xqspi->refclk); in zynqmp_qspi_probe()
1071 zynqmp_qspi_init_hw(xqspi); in zynqmp_qspi_probe()
1075 xqspi->irq = platform_get_irq(pdev, 0); in zynqmp_qspi_probe()
1076 if (xqspi->irq <= 0) { in zynqmp_qspi_probe()
1080 ret = devm_request_irq(&pdev->dev, xqspi->irq, zynqmp_qspi_irq, in zynqmp_qspi_probe()
1096 master->max_speed_hz = clk_get_rate(xqspi->refclk) / 2; in zynqmp_qspi_probe()
1113 clk_disable_unprepare(xqspi->refclk); in zynqmp_qspi_probe()
1115 clk_disable_unprepare(xqspi->pclk); in zynqmp_qspi_probe()
1135 struct zynqmp_qspi *xqspi = spi_master_get_devdata(master); in zynqmp_qspi_remove() local
1137 zynqmp_gqspi_write(xqspi, GQSPI_EN_OFST, 0x0); in zynqmp_qspi_remove()
1138 clk_disable_unprepare(xqspi->refclk); in zynqmp_qspi_remove()
1139 clk_disable_unprepare(xqspi->pclk); in zynqmp_qspi_remove()