summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars-Peter Clausen <lars@metafoo.de>2017-08-16 05:33:12 -0400
committerMark Brown <broonie@kernel.org>2017-08-16 06:53:31 -0400
commitb64836a5718bdcce7b23dc06eb1f3a9620cf6214 (patch)
treef8b9617638237af3508364ccbbf244f32cb8a0a1
parente19b63cd3cb7ebf1ca73d9c4f58934149337ed24 (diff)
spi: altera: Consolidate TX/RX data register access
The patterns for accessing the TX/RX data registers is the same for the IRQ and non-IRQ paths. Consolidate the duplicated code into shared helper functions. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/spi/spi-altera.c75
1 files changed, 35 insertions, 40 deletions
diff --git a/drivers/spi/spi-altera.c b/drivers/spi/spi-altera.c
index bfac34068999..a5adf0d868fc 100644
--- a/drivers/spi/spi-altera.c
+++ b/drivers/spi/spi-altera.c
@@ -76,18 +76,43 @@ static void altera_spi_set_cs(struct spi_device *spi, bool is_high)
76 } 76 }
77} 77}
78 78
79static inline unsigned int hw_txbyte(struct altera_spi *hw, int count) 79static void altera_spi_tx_word(struct altera_spi *hw)
80{ 80{
81 unsigned int txd = 0;
82
81 if (hw->tx) { 83 if (hw->tx) {
82 switch (hw->bytes_per_word) { 84 switch (hw->bytes_per_word) {
83 case 1: 85 case 1:
84 return hw->tx[count]; 86 txd = hw->tx[hw->count];
87 break;
85 case 2: 88 case 2:
86 return (hw->tx[count * 2] 89 txd = (hw->tx[hw->count * 2]
87 | (hw->tx[count * 2 + 1] << 8)); 90 | (hw->tx[hw->count * 2 + 1] << 8));
91 break;
88 } 92 }
89 } 93 }
90 return 0; 94
95 writel(txd, hw->base + ALTERA_SPI_TXDATA);
96}
97
98static void altera_spi_rx_word(struct altera_spi *hw)
99{
100 unsigned int rxd;
101
102 rxd = readl(hw->base + ALTERA_SPI_RXDATA);
103 if (hw->rx) {
104 switch (hw->bytes_per_word) {
105 case 1:
106 hw->rx[hw->count] = rxd;
107 break;
108 case 2:
109 hw->rx[hw->count * 2] = rxd;
110 hw->rx[hw->count * 2 + 1] = rxd >> 8;
111 break;
112 }
113 }
114
115 hw->count++;
91} 116}
92 117
93static int altera_spi_txrx(struct spi_master *master, 118static int altera_spi_txrx(struct spi_master *master,
@@ -107,32 +132,16 @@ static int altera_spi_txrx(struct spi_master *master,
107 writel(hw->imr, hw->base + ALTERA_SPI_CONTROL); 132 writel(hw->imr, hw->base + ALTERA_SPI_CONTROL);
108 133
109 /* send the first byte */ 134 /* send the first byte */
110 writel(hw_txbyte(hw, 0), hw->base + ALTERA_SPI_TXDATA); 135 altera_spi_tx_word(hw);
111 } else { 136 } else {
112 while (hw->count < hw->len) { 137 while (hw->count < hw->len) {
113 unsigned int rxd; 138 altera_spi_tx_word(hw);
114
115 writel(hw_txbyte(hw, hw->count),
116 hw->base + ALTERA_SPI_TXDATA);
117 139
118 while (!(readl(hw->base + ALTERA_SPI_STATUS) & 140 while (!(readl(hw->base + ALTERA_SPI_STATUS) &
119 ALTERA_SPI_STATUS_RRDY_MSK)) 141 ALTERA_SPI_STATUS_RRDY_MSK))
120 cpu_relax(); 142 cpu_relax();
121 143
122 rxd = readl(hw->base + ALTERA_SPI_RXDATA); 144 altera_spi_rx_word(hw);
123 if (hw->rx) {
124 switch (hw->bytes_per_word) {
125 case 1:
126 hw->rx[hw->count] = rxd;
127 break;
128 case 2:
129 hw->rx[hw->count * 2] = rxd;
130 hw->rx[hw->count * 2 + 1] = rxd >> 8;
131 break;
132 }
133 }
134
135 hw->count++;
136 } 145 }
137 spi_finalize_current_transfer(master); 146 spi_finalize_current_transfer(master);
138 } 147 }
@@ -144,25 +153,11 @@ static irqreturn_t altera_spi_irq(int irq, void *dev)
144{ 153{
145 struct spi_master *master = dev; 154 struct spi_master *master = dev;
146 struct altera_spi *hw = spi_master_get_devdata(master); 155 struct altera_spi *hw = spi_master_get_devdata(master);
147 unsigned int rxd;
148
149 rxd = readl(hw->base + ALTERA_SPI_RXDATA);
150 if (hw->rx) {
151 switch (hw->bytes_per_word) {
152 case 1:
153 hw->rx[hw->count] = rxd;
154 break;
155 case 2:
156 hw->rx[hw->count * 2] = rxd;
157 hw->rx[hw->count * 2 + 1] = rxd >> 8;
158 break;
159 }
160 }
161 156
162 hw->count++; 157 altera_spi_rx_word(hw);
163 158
164 if (hw->count < hw->len) { 159 if (hw->count < hw->len) {
165 writel(hw_txbyte(hw, hw->count), hw->base + ALTERA_SPI_TXDATA); 160 altera_spi_tx_word(hw);
166 } else { 161 } else {
167 /* disable receive interrupt */ 162 /* disable receive interrupt */
168 hw->imr &= ~ALTERA_SPI_CONTROL_IRRDY_MSK; 163 hw->imr &= ~ALTERA_SPI_CONTROL_IRRDY_MSK;