aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Niebuhr <bniebuhr@efjohnson.com>2010-08-20 07:32:49 -0400
committerSekhar Nori <nsekhar@ti.com>2010-11-18 08:08:29 -0500
commitcf90fe73504764cbcc2552c7ea69b1866059db30 (patch)
tree6437d026e5ee4781da5f805e65d03eeb7c478e24
parent47f44671c0dc92e2b77ff3dd843f742d12510477 (diff)
spi: davinci: remove non-useful interrupt mode support
The interrupt mode support as it stands is another version of poll mode. Even when interrupt mode is selected, the code tight loops on interrupt status register, rendering it totally useless. A completion variable is initialized, but never used. Remove this fake interrupt mode since users can anyway use poll mode with no functional difference. A usefully implemented interrupt mode support can be added later. Signed-off-by: Brian Niebuhr <bniebuhr@efjohnson.com> Tested-By: Michael Williamson <michael.williamson@criticallink.com> Signed-off-by: Sekhar Nori <nsekhar@ti.com>
-rw-r--r--arch/arm/mach-davinci/dm355.c1
-rw-r--r--arch/arm/mach-davinci/dm365.c1
-rw-r--r--arch/arm/mach-davinci/include/mach/spi.h2
-rw-r--r--drivers/spi/davinci_spi.c126
4 files changed, 19 insertions, 111 deletions
diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c
index a6d9b72190ff..e311f29ffb57 100644
--- a/arch/arm/mach-davinci/dm355.c
+++ b/arch/arm/mach-davinci/dm355.c
@@ -413,7 +413,6 @@ static struct davinci_spi_platform_data dm355_spi0_pdata = {
413 .version = SPI_VERSION_1, 413 .version = SPI_VERSION_1,
414 .num_chipselect = 2, 414 .num_chipselect = 2,
415 .clk_internal = 1, 415 .clk_internal = 1,
416 .poll_mode = 1, /* 0 -> interrupt mode 1-> polling mode */
417}; 416};
418static struct platform_device dm355_spi0_device = { 417static struct platform_device dm355_spi0_device = {
419 .name = "spi_davinci", 418 .name = "spi_davinci",
diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c
index 80dd159134cb..1e5012e196ba 100644
--- a/arch/arm/mach-davinci/dm365.c
+++ b/arch/arm/mach-davinci/dm365.c
@@ -626,7 +626,6 @@ static struct davinci_spi_platform_data dm365_spi0_pdata = {
626 .version = SPI_VERSION_1, 626 .version = SPI_VERSION_1,
627 .num_chipselect = 2, 627 .num_chipselect = 2,
628 .clk_internal = 1, 628 .clk_internal = 1,
629 .poll_mode = 1, /* 0 -> interrupt mode 1-> polling mode */
630}; 629};
631 630
632static struct resource dm365_spi0_resources[] = { 631static struct resource dm365_spi0_resources[] = {
diff --git a/arch/arm/mach-davinci/include/mach/spi.h b/arch/arm/mach-davinci/include/mach/spi.h
index 483b055da440..e68afe23885b 100644
--- a/arch/arm/mach-davinci/include/mach/spi.h
+++ b/arch/arm/mach-davinci/include/mach/spi.h
@@ -30,8 +30,6 @@ struct davinci_spi_platform_data {
30 u8 version; 30 u8 version;
31 u8 num_chipselect; 31 u8 num_chipselect;
32 u8 clk_internal; 32 u8 clk_internal;
33 u8 intr_level;
34 u8 poll_mode;
35 u8 use_dma; 33 u8 use_dma;
36 u8 *chip_sel; 34 u8 *chip_sel;
37}; 35};
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,
611static int davinci_spi_bufs_pio(struct spi_device *spi, struct spi_transfer *t) 601static 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 */
861static 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
1082free_clk: 997free_clk:
@@ -1086,8 +1001,6 @@ put_master:
1086 spi_master_put(master); 1001 spi_master_put(master);
1087free_tmp_buf: 1002free_tmp_buf:
1088 kfree(davinci_spi->tmp_buf); 1003 kfree(davinci_spi->tmp_buf);
1089irq_free:
1090 free_irq(davinci_spi->irq, davinci_spi);
1091unmap_io: 1004unmap_io:
1092 iounmap(davinci_spi->base); 1005 iounmap(davinci_spi->base);
1093release_region: 1006release_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