Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spi: zynqmp-gqspi: Clean up the driver a bit

Merge series from Sean Anderson <sean.anderson@linux.dev>:

Here are a few mostly independent cleanups I came up with while writing
some other patches. Feel free to apply them in piecemeal if you like.

+77 -92
+77 -92
drivers/spi/spi-zynqmp-gqspi.c
··· 82 82 #define GQSPI_GENFIFO_RX 0x00020000 83 83 #define GQSPI_GENFIFO_STRIPE 0x00040000 84 84 #define GQSPI_GENFIFO_POLL 0x00080000 85 - #define GQSPI_GENFIFO_EXP_START 0x00000100 86 85 #define GQSPI_FIFO_CTRL_RST_RX_FIFO_MASK 0x00000004 87 86 #define GQSPI_FIFO_CTRL_RST_TX_FIFO_MASK 0x00000002 88 87 #define GQSPI_FIFO_CTRL_RST_GEN_FIFO_MASK 0x00000001 ··· 579 580 zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, config_reg); 580 581 zynqmp_qspi_set_tapdelay(xqspi, baud_rate_val); 581 582 } 583 + 584 + dev_dbg(xqspi->dev, "config speed %u\n", req_speed_hz); 582 585 return 0; 583 586 } 584 587 ··· 671 670 static void zynqmp_qspi_fillgenfifo(struct zynqmp_qspi *xqspi, u8 nbits, 672 671 u32 genfifoentry) 673 672 { 674 - u32 transfer_len = 0; 673 + u32 transfer_len, tempcount, exponent; 674 + u8 imm_data; 675 675 676 - if (xqspi->txbuf) { 677 - genfifoentry &= ~GQSPI_GENFIFO_RX; 678 - genfifoentry |= GQSPI_GENFIFO_DATA_XFER; 679 - genfifoentry |= GQSPI_GENFIFO_TX; 680 - transfer_len = xqspi->bytes_to_transfer; 681 - } else if (xqspi->rxbuf) { 682 - genfifoentry &= ~GQSPI_GENFIFO_TX; 683 - genfifoentry |= GQSPI_GENFIFO_DATA_XFER; 676 + genfifoentry |= GQSPI_GENFIFO_DATA_XFER; 677 + if (xqspi->rxbuf) { 684 678 genfifoentry |= GQSPI_GENFIFO_RX; 685 679 if (xqspi->mode == GQSPI_MODE_DMA) 686 680 transfer_len = xqspi->dma_rx_bytes; 687 681 else 688 682 transfer_len = xqspi->bytes_to_receive; 689 683 } else { 690 - /* Sending dummy circles here */ 691 - genfifoentry &= ~(GQSPI_GENFIFO_TX | GQSPI_GENFIFO_RX); 692 - genfifoentry |= GQSPI_GENFIFO_DATA_XFER; 693 684 transfer_len = xqspi->bytes_to_transfer; 694 685 } 686 + 687 + if (xqspi->txbuf) 688 + genfifoentry |= GQSPI_GENFIFO_TX; 689 + 695 690 genfifoentry |= zynqmp_qspi_selectspimode(xqspi, nbits); 696 691 xqspi->genfifoentry = genfifoentry; 692 + dev_dbg(xqspi->dev, "genfifo %05x transfer_len %u\n", 693 + genfifoentry, transfer_len); 697 694 698 - if ((transfer_len) < GQSPI_GENFIFO_IMM_DATA_MASK) { 699 - genfifoentry &= ~GQSPI_GENFIFO_IMM_DATA_MASK; 700 - genfifoentry |= transfer_len; 701 - zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, genfifoentry); 702 - } else { 703 - int tempcount = transfer_len; 704 - u32 exponent = 8; /* 2^8 = 256 */ 705 - u8 imm_data = tempcount & 0xFF; 706 - 707 - tempcount &= ~(tempcount & 0xFF); 708 - /* Immediate entry */ 709 - if (tempcount != 0) { 710 - /* Exponent entries */ 711 - genfifoentry |= GQSPI_GENFIFO_EXP; 712 - while (tempcount != 0) { 713 - if (tempcount & GQSPI_GENFIFO_EXP_START) { 714 - genfifoentry &= 715 - ~GQSPI_GENFIFO_IMM_DATA_MASK; 716 - genfifoentry |= exponent; 717 - zynqmp_gqspi_write(xqspi, 718 - GQSPI_GEN_FIFO_OFST, 719 - genfifoentry); 720 - } 721 - tempcount = tempcount >> 1; 722 - exponent++; 723 - } 724 - } 725 - if (imm_data != 0) { 726 - genfifoentry &= ~GQSPI_GENFIFO_EXP; 727 - genfifoentry &= ~GQSPI_GENFIFO_IMM_DATA_MASK; 728 - genfifoentry |= (u8)(imm_data & 0xFF); 695 + /* Exponent entries */ 696 + imm_data = transfer_len; 697 + tempcount = transfer_len >> 8; 698 + exponent = 8; 699 + genfifoentry |= GQSPI_GENFIFO_EXP; 700 + while (tempcount) { 701 + if (tempcount & 1) 729 702 zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, 730 - genfifoentry); 731 - } 703 + genfifoentry | exponent); 704 + tempcount >>= 1; 705 + exponent++; 732 706 } 733 - if (xqspi->mode == GQSPI_MODE_IO && xqspi->rxbuf) { 734 - /* Dummy generic FIFO entry */ 735 - zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, 0x0); 736 - } 707 + 708 + /* Immediate entry */ 709 + genfifoentry &= ~GQSPI_GENFIFO_EXP; 710 + if (imm_data) 711 + zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, 712 + genfifoentry | imm_data); 713 + 714 + /* Dummy generic FIFO entry */ 715 + if (xqspi->mode == GQSPI_MODE_IO && xqspi->rxbuf) 716 + zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, 0); 717 + } 718 + 719 + /** 720 + * zynqmp_qspi_disable_dma() - Disable DMA mode 721 + * @xqspi: GQSPI instance 722 + */ 723 + static void zynqmp_qspi_disable_dma(struct zynqmp_qspi *xqspi) 724 + { 725 + u32 config_reg = zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST); 726 + 727 + config_reg &= ~GQSPI_CFG_MODE_EN_MASK; 728 + zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, config_reg); 729 + xqspi->mode = GQSPI_MODE_IO; 730 + } 731 + 732 + /** 733 + * zynqmp_qspi_enable_dma() - Enable DMA mode 734 + * @xqspi: GQSPI instance 735 + */ 736 + static void zynqmp_qspi_enable_dma(struct zynqmp_qspi *xqspi) 737 + { 738 + u32 config_reg = zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST); 739 + 740 + config_reg &= ~GQSPI_CFG_MODE_EN_MASK; 741 + config_reg |= GQSPI_CFG_MODE_EN_DMA_MASK; 742 + zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, config_reg); 743 + xqspi->mode = GQSPI_MODE_DMA; 737 744 } 738 745 739 746 /** ··· 753 744 */ 754 745 static void zynqmp_process_dma_irq(struct zynqmp_qspi *xqspi) 755 746 { 756 - u32 config_reg, genfifoentry; 747 + u32 genfifoentry; 757 748 758 749 dma_unmap_single(xqspi->dev, xqspi->dma_addr, 759 750 xqspi->dma_rx_bytes, DMA_FROM_DEVICE); ··· 767 758 768 759 if (xqspi->bytes_to_receive > 0) { 769 760 /* Switch to IO mode,for remaining bytes to receive */ 770 - config_reg = zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST); 771 - config_reg &= ~GQSPI_CFG_MODE_EN_MASK; 772 - zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, config_reg); 761 + zynqmp_qspi_disable_dma(xqspi); 773 762 774 763 /* Initiate the transfer of remaining bytes */ 775 764 genfifoentry = xqspi->genfifoentry; ··· 806 799 static irqreturn_t zynqmp_qspi_irq(int irq, void *dev_id) 807 800 { 808 801 struct zynqmp_qspi *xqspi = (struct zynqmp_qspi *)dev_id; 809 - irqreturn_t ret = IRQ_NONE; 810 802 u32 status, mask, dma_status = 0; 811 803 812 804 status = zynqmp_gqspi_read(xqspi, GQSPI_ISR_OFST); ··· 820 814 dma_status); 821 815 } 822 816 823 - if (mask & GQSPI_ISR_TXNOT_FULL_MASK) { 824 - zynqmp_qspi_filltxfifo(xqspi, GQSPI_TX_FIFO_FILL); 825 - ret = IRQ_HANDLED; 826 - } 817 + if (!mask && !dma_status) 818 + return IRQ_NONE; 827 819 828 - if (dma_status & GQSPI_QSPIDMA_DST_I_STS_DONE_MASK) { 820 + if (mask & GQSPI_ISR_TXNOT_FULL_MASK) 821 + zynqmp_qspi_filltxfifo(xqspi, GQSPI_TX_FIFO_FILL); 822 + 823 + if (dma_status & GQSPI_QSPIDMA_DST_I_STS_DONE_MASK) 829 824 zynqmp_process_dma_irq(xqspi); 830 - ret = IRQ_HANDLED; 831 - } else if (!(mask & GQSPI_IER_RXEMPTY_MASK) && 832 - (mask & GQSPI_IER_GENFIFOEMPTY_MASK)) { 825 + else if (!(mask & GQSPI_IER_RXEMPTY_MASK) && 826 + (mask & GQSPI_IER_GENFIFOEMPTY_MASK)) 833 827 zynqmp_qspi_readrxfifo(xqspi, GQSPI_RX_FIFO_FILL); 834 - ret = IRQ_HANDLED; 835 - } 836 828 837 829 if (xqspi->bytes_to_receive == 0 && xqspi->bytes_to_transfer == 0 && 838 830 ((status & GQSPI_IRQ_MASK) == GQSPI_IRQ_MASK)) { 839 831 zynqmp_gqspi_write(xqspi, GQSPI_IDR_OFST, GQSPI_ISR_IDR_MASK); 840 832 complete(&xqspi->data_completion); 841 - ret = IRQ_HANDLED; 842 833 } 843 - return ret; 834 + return IRQ_HANDLED; 844 835 } 845 836 846 837 /** ··· 848 845 */ 849 846 static int zynqmp_qspi_setuprxdma(struct zynqmp_qspi *xqspi) 850 847 { 851 - u32 rx_bytes, rx_rem, config_reg; 848 + u32 rx_bytes, rx_rem; 852 849 dma_addr_t addr; 853 850 u64 dma_align = (u64)(uintptr_t)xqspi->rxbuf; 854 851 855 852 if (xqspi->bytes_to_receive < 8 || 856 853 ((dma_align & GQSPI_DMA_UNALIGN) != 0x0)) { 857 854 /* Setting to IO mode */ 858 - config_reg = zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST); 859 - config_reg &= ~GQSPI_CFG_MODE_EN_MASK; 860 - zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, config_reg); 861 - xqspi->mode = GQSPI_MODE_IO; 855 + zynqmp_qspi_disable_dma(xqspi); 862 856 xqspi->dma_rx_bytes = 0; 863 857 return 0; 864 858 } ··· 878 878 zynqmp_gqspi_write(xqspi, GQSPI_QSPIDMA_DST_ADDR_MSB_OFST, 879 879 ((u32)addr) & 0xfff); 880 880 881 - /* Enabling the DMA mode */ 882 - config_reg = zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST); 883 - config_reg &= ~GQSPI_CFG_MODE_EN_MASK; 884 - config_reg |= GQSPI_CFG_MODE_EN_DMA_MASK; 885 - zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, config_reg); 886 - 887 - /* Switch to DMA mode */ 888 - xqspi->mode = GQSPI_MODE_DMA; 881 + zynqmp_qspi_enable_dma(xqspi); 889 882 890 883 /* Write the number of bytes to transfer */ 891 884 zynqmp_gqspi_write(xqspi, GQSPI_QSPIDMA_DST_SIZE_OFST, rx_bytes); ··· 898 905 static void zynqmp_qspi_write_op(struct zynqmp_qspi *xqspi, u8 tx_nbits, 899 906 u32 genfifoentry) 900 907 { 901 - u32 config_reg; 902 - 903 908 zynqmp_qspi_fillgenfifo(xqspi, tx_nbits, genfifoentry); 904 909 zynqmp_qspi_filltxfifo(xqspi, GQSPI_TXD_DEPTH); 905 - if (xqspi->mode == GQSPI_MODE_DMA) { 906 - config_reg = zynqmp_gqspi_read(xqspi, 907 - GQSPI_CONFIG_OFST); 908 - config_reg &= ~GQSPI_CFG_MODE_EN_MASK; 909 - zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, 910 - config_reg); 911 - xqspi->mode = GQSPI_MODE_IO; 912 - } 910 + if (xqspi->mode == GQSPI_MODE_DMA) 911 + zynqmp_qspi_disable_dma(xqspi); 913 912 } 914 913 915 914 /** ··· 1044 1059 static int zynqmp_qspi_exec_op(struct spi_mem *mem, 1045 1060 const struct spi_mem_op *op) 1046 1061 { 1047 - struct zynqmp_qspi *xqspi = spi_controller_get_devdata 1048 - (mem->spi->controller); 1062 + struct zynqmp_qspi *xqspi = 1063 + spi_controller_get_devdata(mem->spi->controller); 1049 1064 unsigned long timeout; 1050 1065 int err = 0, i; 1051 1066 u32 genfifoentry = 0;