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
361 ret = clk_enable(xqspi->refclk); in zynqmp_prepare_transfer_hardware()
365 ret = clk_enable(xqspi->pclk); in zynqmp_prepare_transfer_hardware()
369 zynqmp_gqspi_write(xqspi, GQSPI_EN_OFST, GQSPI_EN_MASK); in zynqmp_prepare_transfer_hardware()
386 struct zynqmp_qspi *xqspi = spi_master_get_devdata(master); in zynqmp_unprepare_transfer_hardware() local
388 zynqmp_gqspi_write(xqspi, GQSPI_EN_OFST, 0x0); in zynqmp_unprepare_transfer_hardware()
389 clk_disable(xqspi->refclk); in zynqmp_unprepare_transfer_hardware()
390 clk_disable(xqspi->pclk); in zynqmp_unprepare_transfer_hardware()
401 struct zynqmp_qspi *xqspi = spi_master_get_devdata(qspi->master); in zynqmp_qspi_chipselect() local
406 genfifoentry |= xqspi->genfifobus; in zynqmp_qspi_chipselect()
409 genfifoentry |= xqspi->genfifocs; in zynqmp_qspi_chipselect()
415 zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, genfifoentry); in zynqmp_qspi_chipselect()
418 zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, 0x0); in zynqmp_qspi_chipselect()
421 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, in zynqmp_qspi_chipselect()
422 zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST) | in zynqmp_qspi_chipselect()
429 statusreg = zynqmp_gqspi_read(xqspi, GQSPI_ISR_OFST); in zynqmp_qspi_chipselect()
439 dev_err(xqspi->dev, "Chip select timed out\n"); in zynqmp_qspi_chipselect()
467 struct zynqmp_qspi *xqspi = spi_master_get_devdata(qspi->master); in zynqmp_qspi_setup_transfer() local
478 clk_rate = clk_get_rate(xqspi->refclk); in zynqmp_qspi_setup_transfer()
485 config_reg = zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST); in zynqmp_qspi_setup_transfer()
497 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, config_reg); in zynqmp_qspi_setup_transfer()
524 static void zynqmp_qspi_filltxfifo(struct zynqmp_qspi *xqspi, int size) in zynqmp_qspi_filltxfifo() argument
528 while ((xqspi->bytes_to_transfer > 0) && (count < size)) { in zynqmp_qspi_filltxfifo()
529 memcpy(&intermediate, xqspi->txbuf, 4); in zynqmp_qspi_filltxfifo()
530 zynqmp_gqspi_write(xqspi, GQSPI_TXD_OFST, intermediate); in zynqmp_qspi_filltxfifo()
532 if (xqspi->bytes_to_transfer >= 4) { in zynqmp_qspi_filltxfifo()
533 xqspi->txbuf += 4; in zynqmp_qspi_filltxfifo()
534 xqspi->bytes_to_transfer -= 4; in zynqmp_qspi_filltxfifo()
536 xqspi->txbuf += xqspi->bytes_to_transfer; in zynqmp_qspi_filltxfifo()
537 xqspi->bytes_to_transfer = 0; in zynqmp_qspi_filltxfifo()
549 static void zynqmp_qspi_readrxfifo(struct zynqmp_qspi *xqspi, u32 size) in zynqmp_qspi_readrxfifo() argument
554 while ((count < size) && (xqspi->bytes_to_receive > 0)) { in zynqmp_qspi_readrxfifo()
555 if (xqspi->bytes_to_receive >= 4) { in zynqmp_qspi_readrxfifo()
556 (*(u32 *) xqspi->rxbuf) = in zynqmp_qspi_readrxfifo()
557 zynqmp_gqspi_read(xqspi, GQSPI_RXD_OFST); in zynqmp_qspi_readrxfifo()
558 xqspi->rxbuf += 4; in zynqmp_qspi_readrxfifo()
559 xqspi->bytes_to_receive -= 4; in zynqmp_qspi_readrxfifo()
562 data = zynqmp_gqspi_read(xqspi, GQSPI_RXD_OFST); in zynqmp_qspi_readrxfifo()
563 count += xqspi->bytes_to_receive; in zynqmp_qspi_readrxfifo()
564 zynqmp_qspi_copy_read_data(xqspi, data, in zynqmp_qspi_readrxfifo()
565 xqspi->bytes_to_receive); in zynqmp_qspi_readrxfifo()
566 xqspi->bytes_to_receive = 0; in zynqmp_qspi_readrxfifo()
578 static void zynqmp_process_dma_irq(struct zynqmp_qspi *xqspi) in zynqmp_process_dma_irq() argument
582 dma_unmap_single(xqspi->dev, xqspi->dma_addr, in zynqmp_process_dma_irq()
583 xqspi->dma_rx_bytes, DMA_FROM_DEVICE); in zynqmp_process_dma_irq()
584 xqspi->rxbuf += xqspi->dma_rx_bytes; in zynqmp_process_dma_irq()
585 xqspi->bytes_to_receive -= xqspi->dma_rx_bytes; in zynqmp_process_dma_irq()
586 xqspi->dma_rx_bytes = 0; in zynqmp_process_dma_irq()
589 zynqmp_gqspi_write(xqspi, GQSPI_QSPIDMA_DST_I_DIS_OFST, in zynqmp_process_dma_irq()
592 if (xqspi->bytes_to_receive > 0) { in zynqmp_process_dma_irq()
594 config_reg = zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST); in zynqmp_process_dma_irq()
596 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, config_reg); in zynqmp_process_dma_irq()
599 genfifoentry = xqspi->genfifoentry; in zynqmp_process_dma_irq()
600 genfifoentry |= xqspi->bytes_to_receive; in zynqmp_process_dma_irq()
601 zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, genfifoentry); in zynqmp_process_dma_irq()
604 zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, 0x0); in zynqmp_process_dma_irq()
607 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, in zynqmp_process_dma_irq()
608 (zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST) | in zynqmp_process_dma_irq()
612 zynqmp_gqspi_write(xqspi, GQSPI_IER_OFST, in zynqmp_process_dma_irq()
634 struct zynqmp_qspi *xqspi = spi_master_get_devdata(master); in zynqmp_qspi_irq() local
638 status = zynqmp_gqspi_read(xqspi, GQSPI_ISR_OFST); in zynqmp_qspi_irq()
639 zynqmp_gqspi_write(xqspi, GQSPI_ISR_OFST, status); in zynqmp_qspi_irq()
640 mask = (status & ~(zynqmp_gqspi_read(xqspi, GQSPI_IMASK_OFST))); in zynqmp_qspi_irq()
643 if (xqspi->mode == GQSPI_MODE_DMA) { in zynqmp_qspi_irq()
645 zynqmp_gqspi_read(xqspi, GQSPI_QSPIDMA_DST_I_STS_OFST); in zynqmp_qspi_irq()
646 zynqmp_gqspi_write(xqspi, GQSPI_QSPIDMA_DST_I_STS_OFST, in zynqmp_qspi_irq()
651 zynqmp_qspi_filltxfifo(xqspi, GQSPI_TX_FIFO_FILL); in zynqmp_qspi_irq()
656 zynqmp_process_dma_irq(xqspi); in zynqmp_qspi_irq()
660 zynqmp_qspi_readrxfifo(xqspi, GQSPI_RX_FIFO_FILL); in zynqmp_qspi_irq()
664 if ((xqspi->bytes_to_receive == 0) && (xqspi->bytes_to_transfer == 0) in zynqmp_qspi_irq()
666 zynqmp_gqspi_write(xqspi, GQSPI_IDR_OFST, GQSPI_ISR_IDR_MASK); in zynqmp_qspi_irq()
679 static inline u32 zynqmp_qspi_selectspimode(struct zynqmp_qspi *xqspi, in zynqmp_qspi_selectspimode() argument
695 dev_warn(xqspi->dev, "Invalid SPI mode\n"); in zynqmp_qspi_selectspimode()
705 static void zynq_qspi_setuprxdma(struct zynqmp_qspi *xqspi) in zynq_qspi_setuprxdma() argument
709 u64 dma_align = (u64)(uintptr_t)xqspi->rxbuf; in zynq_qspi_setuprxdma()
711 if ((xqspi->bytes_to_receive < 8) || in zynq_qspi_setuprxdma()
714 config_reg = zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST); in zynq_qspi_setuprxdma()
716 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, config_reg); in zynq_qspi_setuprxdma()
717 xqspi->mode = GQSPI_MODE_IO; in zynq_qspi_setuprxdma()
718 xqspi->dma_rx_bytes = 0; in zynq_qspi_setuprxdma()
722 rx_rem = xqspi->bytes_to_receive % 4; in zynq_qspi_setuprxdma()
723 rx_bytes = (xqspi->bytes_to_receive - rx_rem); in zynq_qspi_setuprxdma()
725 addr = dma_map_single(xqspi->dev, (void *)xqspi->rxbuf, in zynq_qspi_setuprxdma()
727 if (dma_mapping_error(xqspi->dev, addr)) in zynq_qspi_setuprxdma()
728 dev_err(xqspi->dev, "ERR:rxdma:memory not mapped\n"); in zynq_qspi_setuprxdma()
730 xqspi->dma_rx_bytes = rx_bytes; in zynq_qspi_setuprxdma()
731 xqspi->dma_addr = addr; in zynq_qspi_setuprxdma()
732 zynqmp_gqspi_write(xqspi, GQSPI_QSPIDMA_DST_ADDR_OFST, in zynq_qspi_setuprxdma()
735 zynqmp_gqspi_write(xqspi, GQSPI_QSPIDMA_DST_ADDR_MSB_OFST, in zynq_qspi_setuprxdma()
739 config_reg = zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST); in zynq_qspi_setuprxdma()
742 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, config_reg); in zynq_qspi_setuprxdma()
745 xqspi->mode = GQSPI_MODE_DMA; in zynq_qspi_setuprxdma()
748 zynqmp_gqspi_write(xqspi, GQSPI_QSPIDMA_DST_SIZE_OFST, rx_bytes); in zynq_qspi_setuprxdma()
760 static void zynqmp_qspi_txrxsetup(struct zynqmp_qspi *xqspi, in zynqmp_qspi_txrxsetup() argument
767 if ((xqspi->txbuf != NULL) && (xqspi->rxbuf == NULL)) { in zynqmp_qspi_txrxsetup()
773 zynqmp_qspi_selectspimode(xqspi, transfer->tx_nbits); in zynqmp_qspi_txrxsetup()
774 xqspi->bytes_to_transfer = transfer->len; in zynqmp_qspi_txrxsetup()
775 if (xqspi->mode == GQSPI_MODE_DMA) { in zynqmp_qspi_txrxsetup()
776 config_reg = zynqmp_gqspi_read(xqspi, in zynqmp_qspi_txrxsetup()
779 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, in zynqmp_qspi_txrxsetup()
781 xqspi->mode = GQSPI_MODE_IO; in zynqmp_qspi_txrxsetup()
783 zynqmp_qspi_filltxfifo(xqspi, GQSPI_TXD_DEPTH); in zynqmp_qspi_txrxsetup()
785 xqspi->bytes_to_receive = 0; in zynqmp_qspi_txrxsetup()
786 } else if ((xqspi->txbuf == NULL) && (xqspi->rxbuf != NULL)) { in zynqmp_qspi_txrxsetup()
795 zynqmp_qspi_selectspimode(xqspi, transfer->rx_nbits); in zynqmp_qspi_txrxsetup()
796 xqspi->bytes_to_transfer = 0; in zynqmp_qspi_txrxsetup()
797 xqspi->bytes_to_receive = transfer->len; in zynqmp_qspi_txrxsetup()
798 zynq_qspi_setuprxdma(xqspi); in zynqmp_qspi_txrxsetup()
819 struct zynqmp_qspi *xqspi = spi_master_get_devdata(master); in zynqmp_qspi_start_transfer() local
822 xqspi->txbuf = transfer->tx_buf; in zynqmp_qspi_start_transfer()
823 xqspi->rxbuf = transfer->rx_buf; in zynqmp_qspi_start_transfer()
827 genfifoentry |= xqspi->genfifocs; in zynqmp_qspi_start_transfer()
828 genfifoentry |= xqspi->genfifobus; in zynqmp_qspi_start_transfer()
830 zynqmp_qspi_txrxsetup(xqspi, transfer, &genfifoentry); in zynqmp_qspi_start_transfer()
832 if (xqspi->mode == GQSPI_MODE_DMA) in zynqmp_qspi_start_transfer()
833 transfer_len = xqspi->dma_rx_bytes; in zynqmp_qspi_start_transfer()
837 xqspi->genfifoentry = genfifoentry; in zynqmp_qspi_start_transfer()
841 zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, genfifoentry); in zynqmp_qspi_start_transfer()
857 zynqmp_gqspi_write(xqspi, in zynqmp_qspi_start_transfer()
869 zynqmp_gqspi_write(xqspi, in zynqmp_qspi_start_transfer()
874 if ((xqspi->mode == GQSPI_MODE_IO) && in zynqmp_qspi_start_transfer()
875 (xqspi->rxbuf != NULL)) { in zynqmp_qspi_start_transfer()
877 zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, 0x0); in zynqmp_qspi_start_transfer()
881 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, in zynqmp_qspi_start_transfer()
882 zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST) | in zynqmp_qspi_start_transfer()
885 if (xqspi->txbuf != NULL) in zynqmp_qspi_start_transfer()
887 zynqmp_gqspi_write(xqspi, GQSPI_IER_OFST, in zynqmp_qspi_start_transfer()
892 if (xqspi->rxbuf != NULL) { in zynqmp_qspi_start_transfer()
894 if (xqspi->mode == GQSPI_MODE_DMA) { in zynqmp_qspi_start_transfer()
896 zynqmp_gqspi_write(xqspi, in zynqmp_qspi_start_transfer()
900 zynqmp_gqspi_write(xqspi, GQSPI_IER_OFST, in zynqmp_qspi_start_transfer()
947 struct zynqmp_qspi *xqspi = spi_master_get_devdata(master); in zynqmp_qspi_resume() local
950 ret = clk_enable(xqspi->pclk); in zynqmp_qspi_resume()
956 ret = clk_enable(xqspi->refclk); in zynqmp_qspi_resume()
959 clk_disable(xqspi->pclk); in zynqmp_qspi_resume()
983 struct zynqmp_qspi *xqspi; in zynqmp_qspi_probe() local
987 master = spi_alloc_master(&pdev->dev, sizeof(*xqspi)); in zynqmp_qspi_probe()
991 xqspi = spi_master_get_devdata(master); in zynqmp_qspi_probe()
996 xqspi->regs = devm_ioremap_resource(&pdev->dev, res); in zynqmp_qspi_probe()
997 if (IS_ERR(xqspi->regs)) { in zynqmp_qspi_probe()
998 ret = PTR_ERR(xqspi->regs); in zynqmp_qspi_probe()
1002 xqspi->dev = dev; in zynqmp_qspi_probe()
1003 xqspi->pclk = devm_clk_get(&pdev->dev, "pclk"); in zynqmp_qspi_probe()
1004 if (IS_ERR(xqspi->pclk)) { in zynqmp_qspi_probe()
1006 ret = PTR_ERR(xqspi->pclk); in zynqmp_qspi_probe()
1010 ret = clk_prepare_enable(xqspi->pclk); in zynqmp_qspi_probe()
1016 xqspi->refclk = devm_clk_get(&pdev->dev, "ref_clk"); in zynqmp_qspi_probe()
1017 if (IS_ERR(xqspi->refclk)) { in zynqmp_qspi_probe()
1019 ret = PTR_ERR(xqspi->refclk); in zynqmp_qspi_probe()
1023 ret = clk_prepare_enable(xqspi->refclk); in zynqmp_qspi_probe()
1030 zynqmp_qspi_init_hw(xqspi); in zynqmp_qspi_probe()
1032 xqspi->irq = platform_get_irq(pdev, 0); in zynqmp_qspi_probe()
1033 if (xqspi->irq <= 0) { in zynqmp_qspi_probe()
1038 ret = devm_request_irq(&pdev->dev, xqspi->irq, zynqmp_qspi_irq, in zynqmp_qspi_probe()
1054 master->max_speed_hz = clk_get_rate(xqspi->refclk) / 2; in zynqmp_qspi_probe()
1069 clk_disable_unprepare(xqspi->refclk); in zynqmp_qspi_probe()
1071 clk_disable_unprepare(xqspi->pclk); in zynqmp_qspi_probe()
1091 struct zynqmp_qspi *xqspi = spi_master_get_devdata(master); in zynqmp_qspi_remove() local
1093 zynqmp_gqspi_write(xqspi, GQSPI_EN_OFST, 0x0); in zynqmp_qspi_remove()
1094 clk_disable_unprepare(xqspi->refclk); in zynqmp_qspi_remove()
1095 clk_disable_unprepare(xqspi->pclk); in zynqmp_qspi_remove()