aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRicardo Ribalda Delgado <ricardo.ribalda@gmail.com>2015-01-28 07:23:47 -0500
committerMark Brown <broonie@kernel.org>2015-01-28 14:42:42 -0500
commit24ba5e593f391507c614f5b62065194e6593a658 (patch)
treeb853b2dec896c440e7393f350c4f6d3fe67378fb
parentf9c6ef6cfe9c16b6681607afd7e4f8379e615c4f (diff)
spi/xilinx: Remove rx_fn and tx_fn pointer
Simplify the code by removing the tx and and rx function pointers and substitute them by a single function. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/spi/spi-xilinx.c69
1 files changed, 18 insertions, 51 deletions
diff --git a/drivers/spi/spi-xilinx.c b/drivers/spi/spi-xilinx.c
index 523da738805f..ac94e546a555 100644
--- a/drivers/spi/spi-xilinx.c
+++ b/drivers/spi/spi-xilinx.c
@@ -92,8 +92,6 @@ struct xilinx_spi {
92 u32 cs_inactive; /* Level of the CS pins when inactive*/ 92 u32 cs_inactive; /* Level of the CS pins when inactive*/
93 unsigned int (*read_fn)(void __iomem *); 93 unsigned int (*read_fn)(void __iomem *);
94 void (*write_fn)(u32, void __iomem *); 94 void (*write_fn)(u32, void __iomem *);
95 void (*tx_fn)(struct xilinx_spi *);
96 void (*rx_fn)(struct xilinx_spi *);
97}; 95};
98 96
99static void xspi_write32(u32 val, void __iomem *addr) 97static void xspi_write32(u32 val, void __iomem *addr)
@@ -116,49 +114,32 @@ static unsigned int xspi_read32_be(void __iomem *addr)
116 return ioread32be(addr); 114 return ioread32be(addr);
117} 115}
118 116
119static void xspi_tx8(struct xilinx_spi *xspi) 117static void xilinx_spi_tx(struct xilinx_spi *xspi)
120{
121 xspi->write_fn(*xspi->tx_ptr, xspi->regs + XSPI_TXD_OFFSET);
122 xspi->tx_ptr++;
123}
124
125static void xspi_tx16(struct xilinx_spi *xspi)
126{
127 xspi->write_fn(*(u16 *)(xspi->tx_ptr), xspi->regs + XSPI_TXD_OFFSET);
128 xspi->tx_ptr += 2;
129}
130
131static void xspi_tx32(struct xilinx_spi *xspi)
132{ 118{
133 xspi->write_fn(*(u32 *)(xspi->tx_ptr), xspi->regs + XSPI_TXD_OFFSET); 119 xspi->write_fn(*(u32 *)(xspi->tx_ptr), xspi->regs + XSPI_TXD_OFFSET);
134 xspi->tx_ptr += 4; 120 xspi->tx_ptr += xspi->bits_per_word / 8;
135} 121}
136 122
137static void xspi_rx8(struct xilinx_spi *xspi) 123static void xilinx_spi_rx(struct xilinx_spi *xspi)
138{ 124{
139 u32 data = xspi->read_fn(xspi->regs + XSPI_RXD_OFFSET); 125 u32 data = xspi->read_fn(xspi->regs + XSPI_RXD_OFFSET);
140 if (xspi->rx_ptr) {
141 *xspi->rx_ptr = data & 0xff;
142 xspi->rx_ptr++;
143 }
144}
145 126
146static void xspi_rx16(struct xilinx_spi *xspi) 127 if (!xspi->rx_ptr)
147{ 128 return;
148 u32 data = xspi->read_fn(xspi->regs + XSPI_RXD_OFFSET);
149 if (xspi->rx_ptr) {
150 *(u16 *)(xspi->rx_ptr) = data & 0xffff;
151 xspi->rx_ptr += 2;
152 }
153}
154 129
155static void xspi_rx32(struct xilinx_spi *xspi) 130 switch (xspi->bits_per_word) {
156{ 131 case 8:
157 u32 data = xspi->read_fn(xspi->regs + XSPI_RXD_OFFSET); 132 *(u8 *)(xspi->rx_ptr) = data;
158 if (xspi->rx_ptr) { 133 break;
134 case 16:
135 *(u16 *)(xspi->rx_ptr) = data;
136 break;
137 case 32:
159 *(u32 *)(xspi->rx_ptr) = data; 138 *(u32 *)(xspi->rx_ptr) = data;
160 xspi->rx_ptr += 4; 139 break;
161 } 140 }
141
142 xspi->rx_ptr += xspi->bits_per_word / 8;
162} 143}
163 144
164static void xspi_init_hw(struct xilinx_spi *xspi) 145static void xspi_init_hw(struct xilinx_spi *xspi)
@@ -250,7 +231,7 @@ static void xilinx_spi_fill_tx_fifo(struct xilinx_spi *xspi, int n_words)
250 231
251 while (n_words--) 232 while (n_words--)
252 if (xspi->tx_ptr) 233 if (xspi->tx_ptr)
253 xspi->tx_fn(xspi); 234 xilinx_spi_tx(xspi);
254 else 235 else
255 xspi->write_fn(0, xspi->regs + XSPI_TXD_OFFSET); 236 xspi->write_fn(0, xspi->regs + XSPI_TXD_OFFSET);
256 return; 237 return;
@@ -301,7 +282,7 @@ static int xilinx_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)
301 282
302 /* Read out all the data from the Rx FIFO */ 283 /* Read out all the data from the Rx FIFO */
303 while (n_words--) 284 while (n_words--)
304 xspi->rx_fn(xspi); 285 xilinx_spi_rx(xspi);
305 } 286 }
306 287
307 return t->len - xspi->remaining_bytes; 288 return t->len - xspi->remaining_bytes;
@@ -430,20 +411,6 @@ static int xilinx_spi_probe(struct platform_device *pdev)
430 411
431 master->bits_per_word_mask = SPI_BPW_MASK(bits_per_word); 412 master->bits_per_word_mask = SPI_BPW_MASK(bits_per_word);
432 xspi->bits_per_word = bits_per_word; 413 xspi->bits_per_word = bits_per_word;
433 if (xspi->bits_per_word == 8) {
434 xspi->tx_fn = xspi_tx8;
435 xspi->rx_fn = xspi_rx8;
436 } else if (xspi->bits_per_word == 16) {
437 xspi->tx_fn = xspi_tx16;
438 xspi->rx_fn = xspi_rx16;
439 } else if (xspi->bits_per_word == 32) {
440 xspi->tx_fn = xspi_tx32;
441 xspi->rx_fn = xspi_rx32;
442 } else {
443 ret = -EINVAL;
444 goto put_master;
445 }
446
447 xspi->buffer_size = xilinx_spi_find_buffer_size(xspi); 414 xspi->buffer_size = xilinx_spi_find_buffer_size(xspi);
448 415
449 xspi->irq = platform_get_irq(pdev, 0); 416 xspi->irq = platform_get_irq(pdev, 0);