diff options
Diffstat (limited to 'drivers/spi/davinci_spi.c')
-rw-r--r-- | drivers/spi/davinci_spi.c | 126 |
1 files changed, 19 insertions, 107 deletions
diff --git a/drivers/spi/davinci_spi.c b/drivers/spi/davinci_spi.c index 54d06f409b65..198f062da370 100644 --- a/drivers/spi/davinci_spi.c +++ b/drivers/spi/davinci_spi.c | |||
@@ -59,8 +59,6 @@ | |||
59 | #define SPIPC0_SPIENA_MASK BIT(8) /* nREADY */ | 59 | #define SPIPC0_SPIENA_MASK BIT(8) /* nREADY */ |
60 | 60 | ||
61 | #define SPIINT_MASKALL 0x0101035F | 61 | #define SPIINT_MASKALL 0x0101035F |
62 | #define SPI_INTLVL_1 0x000001FFu | ||
63 | #define SPI_INTLVL_0 0x00000000u | ||
64 | 62 | ||
65 | /* SPIDAT1 (upper 16 bit defines) */ | 63 | /* SPIDAT1 (upper 16 bit defines) */ |
66 | #define SPIDAT1_CSHOLD_MASK BIT(12) | 64 | #define SPIDAT1_CSHOLD_MASK BIT(12) |
@@ -92,14 +90,8 @@ | |||
92 | #define SPIFLG_DESYNC_MASK BIT(3) | 90 | #define SPIFLG_DESYNC_MASK BIT(3) |
93 | #define SPIFLG_BITERR_MASK BIT(4) | 91 | #define SPIFLG_BITERR_MASK BIT(4) |
94 | #define SPIFLG_OVRRUN_MASK BIT(6) | 92 | #define SPIFLG_OVRRUN_MASK BIT(6) |
95 | #define SPIFLG_RX_INTR_MASK BIT(8) | ||
96 | #define SPIFLG_TX_INTR_MASK BIT(9) | ||
97 | #define SPIFLG_BUF_INIT_ACTIVE_MASK BIT(24) | 93 | #define SPIFLG_BUF_INIT_ACTIVE_MASK BIT(24) |
98 | 94 | ||
99 | #define SPIINT_BITERR_INTR BIT(4) | ||
100 | #define SPIINT_OVRRUN_INTR BIT(6) | ||
101 | #define SPIINT_RX_INTR BIT(8) | ||
102 | #define SPIINT_TX_INTR BIT(9) | ||
103 | #define SPIINT_DMA_REQ_EN BIT(16) | 95 | #define SPIINT_DMA_REQ_EN BIT(16) |
104 | 96 | ||
105 | /* SPI Controller registers */ | 97 | /* SPI Controller registers */ |
@@ -136,8 +128,6 @@ struct davinci_spi { | |||
136 | resource_size_t pbase; | 128 | resource_size_t pbase; |
137 | void __iomem *base; | 129 | void __iomem *base; |
138 | size_t region_size; | 130 | size_t region_size; |
139 | u32 irq; | ||
140 | struct completion done; | ||
141 | 131 | ||
142 | const void *tx; | 132 | const void *tx; |
143 | void *rx; | 133 | void *rx; |
@@ -611,7 +601,7 @@ static int davinci_spi_check_error(struct davinci_spi *davinci_spi, | |||
611 | static int davinci_spi_bufs_pio(struct spi_device *spi, struct spi_transfer *t) | 601 | static int davinci_spi_bufs_pio(struct spi_device *spi, struct spi_transfer *t) |
612 | { | 602 | { |
613 | struct davinci_spi *davinci_spi; | 603 | struct davinci_spi *davinci_spi; |
614 | int int_status, count, ret; | 604 | int status, count, ret; |
615 | u8 conv; | 605 | u8 conv; |
616 | u32 tx_data, data1_reg_val; | 606 | u32 tx_data, data1_reg_val; |
617 | u32 buf_val, flg_val; | 607 | u32 buf_val, flg_val; |
@@ -627,8 +617,6 @@ static int davinci_spi_bufs_pio(struct spi_device *spi, struct spi_transfer *t) | |||
627 | conv = davinci_spi->bytes_per_word[spi->chip_select]; | 617 | conv = davinci_spi->bytes_per_word[spi->chip_select]; |
628 | data1_reg_val = ioread32(davinci_spi->base + SPIDAT1); | 618 | data1_reg_val = ioread32(davinci_spi->base + SPIDAT1); |
629 | 619 | ||
630 | INIT_COMPLETION(davinci_spi->done); | ||
631 | |||
632 | ret = davinci_spi_bufs_prep(spi, davinci_spi); | 620 | ret = davinci_spi_bufs_prep(spi, davinci_spi); |
633 | if (ret) | 621 | if (ret) |
634 | return ret; | 622 | return ret; |
@@ -638,9 +626,10 @@ static int davinci_spi_bufs_pio(struct spi_device *spi, struct spi_transfer *t) | |||
638 | 626 | ||
639 | count = t->len / conv; | 627 | count = t->len / conv; |
640 | 628 | ||
629 | clear_io_bits(davinci_spi->base + SPIINT, SPIINT_MASKALL); | ||
630 | |||
641 | /* Determine the command to execute READ or WRITE */ | 631 | /* Determine the command to execute READ or WRITE */ |
642 | if (t->tx_buf) { | 632 | if (t->tx_buf) { |
643 | clear_io_bits(davinci_spi->base + SPIINT, SPIINT_MASKALL); | ||
644 | 633 | ||
645 | while (1) { | 634 | while (1) { |
646 | tx_data = davinci_spi->get_tx(davinci_spi); | 635 | tx_data = davinci_spi->get_tx(davinci_spi); |
@@ -668,45 +657,25 @@ static int davinci_spi_bufs_pio(struct spi_device *spi, struct spi_transfer *t) | |||
668 | break; | 657 | break; |
669 | } | 658 | } |
670 | } else { | 659 | } else { |
671 | if (pdata->poll_mode) { | 660 | while (1) { |
672 | while (1) { | 661 | /* keeps the serial clock going */ |
673 | /* keeps the serial clock going */ | 662 | if ((ioread32(davinci_spi->base + SPIBUF) |
674 | if ((ioread32(davinci_spi->base + SPIBUF) | 663 | & SPIBUF_TXFULL_MASK) == 0) |
675 | & SPIBUF_TXFULL_MASK) == 0) | 664 | iowrite32(data1_reg_val, |
676 | iowrite32(data1_reg_val, | 665 | davinci_spi->base + SPIDAT1); |
677 | davinci_spi->base + SPIDAT1); | ||
678 | 666 | ||
679 | while (ioread32(davinci_spi->base + SPIBUF) & | 667 | while (ioread32(davinci_spi->base + SPIBUF) & |
680 | SPIBUF_RXEMPTY_MASK) | 668 | SPIBUF_RXEMPTY_MASK) |
681 | cpu_relax(); | 669 | cpu_relax(); |
682 | 670 | ||
683 | flg_val = ioread32(davinci_spi->base + SPIFLG); | 671 | flg_val = ioread32(davinci_spi->base + SPIFLG); |
684 | buf_val = ioread32(davinci_spi->base + SPIBUF); | 672 | buf_val = ioread32(davinci_spi->base + SPIBUF); |
685 | |||
686 | davinci_spi->get_rx(buf_val, davinci_spi); | ||
687 | |||
688 | count--; | ||
689 | if (count <= 0) | ||
690 | break; | ||
691 | } | ||
692 | } else { /* Receive in Interrupt mode */ | ||
693 | int i; | ||
694 | |||
695 | for (i = 0; i < count; i++) { | ||
696 | set_io_bits(davinci_spi->base + SPIINT, | ||
697 | SPIINT_BITERR_INTR | ||
698 | | SPIINT_OVRRUN_INTR | ||
699 | | SPIINT_RX_INTR); | ||
700 | 673 | ||
701 | iowrite32(data1_reg_val, | 674 | davinci_spi->get_rx(buf_val, davinci_spi); |
702 | davinci_spi->base + SPIDAT1); | ||
703 | 675 | ||
704 | while (ioread32(davinci_spi->base + SPIINT) & | 676 | count--; |
705 | SPIINT_RX_INTR) | 677 | if (count <= 0) |
706 | cpu_relax(); | 678 | break; |
707 | } | ||
708 | iowrite32((data1_reg_val & 0x0ffcffff), | ||
709 | davinci_spi->base + SPIDAT1); | ||
710 | } | 679 | } |
711 | } | 680 | } |
712 | 681 | ||
@@ -714,9 +683,9 @@ static int davinci_spi_bufs_pio(struct spi_device *spi, struct spi_transfer *t) | |||
714 | * Check for bit error, desync error,parity error,timeout error and | 683 | * Check for bit error, desync error,parity error,timeout error and |
715 | * receive overflow errors | 684 | * receive overflow errors |
716 | */ | 685 | */ |
717 | int_status = ioread32(davinci_spi->base + SPIFLG); | 686 | status = ioread32(davinci_spi->base + SPIFLG); |
718 | 687 | ||
719 | ret = davinci_spi_check_error(davinci_spi, int_status); | 688 | ret = davinci_spi_check_error(davinci_spi, status); |
720 | if (ret != 0) | 689 | if (ret != 0) |
721 | return ret; | 690 | return ret; |
722 | 691 | ||
@@ -854,38 +823,6 @@ static int davinci_spi_bufs_dma(struct spi_device *spi, struct spi_transfer *t) | |||
854 | } | 823 | } |
855 | 824 | ||
856 | /** | 825 | /** |
857 | * davinci_spi_irq - IRQ handler for DaVinci SPI | ||
858 | * @irq: IRQ number for this SPI Master | ||
859 | * @context_data: structure for SPI Master controller davinci_spi | ||
860 | */ | ||
861 | static irqreturn_t davinci_spi_irq(s32 irq, void *context_data) | ||
862 | { | ||
863 | struct davinci_spi *davinci_spi = context_data; | ||
864 | u32 int_status, rx_data = 0; | ||
865 | irqreturn_t ret = IRQ_NONE; | ||
866 | |||
867 | int_status = ioread32(davinci_spi->base + SPIFLG); | ||
868 | |||
869 | while ((int_status & SPIFLG_RX_INTR_MASK)) { | ||
870 | if (likely(int_status & SPIFLG_RX_INTR_MASK)) { | ||
871 | ret = IRQ_HANDLED; | ||
872 | |||
873 | rx_data = ioread32(davinci_spi->base + SPIBUF); | ||
874 | davinci_spi->get_rx(rx_data, davinci_spi); | ||
875 | |||
876 | /* Disable Receive Interrupt */ | ||
877 | iowrite32(~(SPIINT_RX_INTR | SPIINT_TX_INTR), | ||
878 | davinci_spi->base + SPIINT); | ||
879 | } else | ||
880 | (void)davinci_spi_check_error(davinci_spi, int_status); | ||
881 | |||
882 | int_status = ioread32(davinci_spi->base + SPIFLG); | ||
883 | } | ||
884 | |||
885 | return ret; | ||
886 | } | ||
887 | |||
888 | /** | ||
889 | * davinci_spi_probe - probe function for SPI Master Controller | 826 | * davinci_spi_probe - probe function for SPI Master Controller |
890 | * @pdev: platform_device structure which contains plateform specific data | 827 | * @pdev: platform_device structure which contains plateform specific data |
891 | */ | 828 | */ |
@@ -943,22 +880,11 @@ static int davinci_spi_probe(struct platform_device *pdev) | |||
943 | goto release_region; | 880 | goto release_region; |
944 | } | 881 | } |
945 | 882 | ||
946 | davinci_spi->irq = platform_get_irq(pdev, 0); | ||
947 | if (davinci_spi->irq <= 0) { | ||
948 | ret = -EINVAL; | ||
949 | goto unmap_io; | ||
950 | } | ||
951 | |||
952 | ret = request_irq(davinci_spi->irq, davinci_spi_irq, IRQF_DISABLED, | ||
953 | dev_name(&pdev->dev), davinci_spi); | ||
954 | if (ret) | ||
955 | goto unmap_io; | ||
956 | |||
957 | /* Allocate tmp_buf for tx_buf */ | 883 | /* Allocate tmp_buf for tx_buf */ |
958 | davinci_spi->tmp_buf = kzalloc(SPI_BUFSIZ, GFP_KERNEL); | 884 | davinci_spi->tmp_buf = kzalloc(SPI_BUFSIZ, GFP_KERNEL); |
959 | if (davinci_spi->tmp_buf == NULL) { | 885 | if (davinci_spi->tmp_buf == NULL) { |
960 | ret = -ENOMEM; | 886 | ret = -ENOMEM; |
961 | goto irq_free; | 887 | goto unmap_io; |
962 | } | 888 | } |
963 | 889 | ||
964 | davinci_spi->bitbang.master = spi_master_get(master); | 890 | davinci_spi->bitbang.master = spi_master_get(master); |
@@ -1034,8 +960,6 @@ static int davinci_spi_probe(struct platform_device *pdev) | |||
1034 | davinci_spi->get_rx = davinci_spi_rx_buf_u8; | 960 | davinci_spi->get_rx = davinci_spi_rx_buf_u8; |
1035 | davinci_spi->get_tx = davinci_spi_tx_buf_u8; | 961 | davinci_spi->get_tx = davinci_spi_tx_buf_u8; |
1036 | 962 | ||
1037 | init_completion(&davinci_spi->done); | ||
1038 | |||
1039 | /* Reset In/OUT SPI module */ | 963 | /* Reset In/OUT SPI module */ |
1040 | iowrite32(0, davinci_spi->base + SPIGCR0); | 964 | iowrite32(0, davinci_spi->base + SPIGCR0); |
1041 | udelay(100); | 965 | udelay(100); |
@@ -1062,21 +986,12 @@ static int davinci_spi_probe(struct platform_device *pdev) | |||
1062 | /* master mode default */ | 986 | /* master mode default */ |
1063 | set_io_bits(davinci_spi->base + SPIGCR1, SPIGCR1_MASTER_MASK); | 987 | set_io_bits(davinci_spi->base + SPIGCR1, SPIGCR1_MASTER_MASK); |
1064 | 988 | ||
1065 | if (davinci_spi->pdata->intr_level) | ||
1066 | iowrite32(SPI_INTLVL_1, davinci_spi->base + SPILVL); | ||
1067 | else | ||
1068 | iowrite32(SPI_INTLVL_0, davinci_spi->base + SPILVL); | ||
1069 | |||
1070 | ret = spi_bitbang_start(&davinci_spi->bitbang); | 989 | ret = spi_bitbang_start(&davinci_spi->bitbang); |
1071 | if (ret) | 990 | if (ret) |
1072 | goto free_clk; | 991 | goto free_clk; |
1073 | 992 | ||
1074 | dev_info(&pdev->dev, "Controller at 0x%p\n", davinci_spi->base); | 993 | dev_info(&pdev->dev, "Controller at 0x%p\n", davinci_spi->base); |
1075 | 994 | ||
1076 | if (!pdata->poll_mode) | ||
1077 | dev_info(&pdev->dev, "Operating in interrupt mode" | ||
1078 | " using IRQ %d\n", davinci_spi->irq); | ||
1079 | |||
1080 | return ret; | 995 | return ret; |
1081 | 996 | ||
1082 | free_clk: | 997 | free_clk: |
@@ -1086,8 +1001,6 @@ put_master: | |||
1086 | spi_master_put(master); | 1001 | spi_master_put(master); |
1087 | free_tmp_buf: | 1002 | free_tmp_buf: |
1088 | kfree(davinci_spi->tmp_buf); | 1003 | kfree(davinci_spi->tmp_buf); |
1089 | irq_free: | ||
1090 | free_irq(davinci_spi->irq, davinci_spi); | ||
1091 | unmap_io: | 1004 | unmap_io: |
1092 | iounmap(davinci_spi->base); | 1005 | iounmap(davinci_spi->base); |
1093 | release_region: | 1006 | release_region: |
@@ -1121,7 +1034,6 @@ static int __exit davinci_spi_remove(struct platform_device *pdev) | |||
1121 | clk_put(davinci_spi->clk); | 1034 | clk_put(davinci_spi->clk); |
1122 | spi_master_put(master); | 1035 | spi_master_put(master); |
1123 | kfree(davinci_spi->tmp_buf); | 1036 | kfree(davinci_spi->tmp_buf); |
1124 | free_irq(davinci_spi->irq, davinci_spi); | ||
1125 | iounmap(davinci_spi->base); | 1037 | iounmap(davinci_spi->base); |
1126 | release_mem_region(davinci_spi->pbase, davinci_spi->region_size); | 1038 | release_mem_region(davinci_spi->pbase, davinci_spi->region_size); |
1127 | 1039 | ||