spi: altera: Consolidate TX/RX data register access
[linux-2.6-block.git] / drivers / spi / spi-altera.c
index bfac34068999e5dcf306133b2c73b7e13c6b90b5..a5adf0d868fc9baf0b836f543d2b313c5fa169ee 100644 (file)
@@ -76,18 +76,43 @@ static void altera_spi_set_cs(struct spi_device *spi, bool is_high)
        }
 }
 
-static inline unsigned int hw_txbyte(struct altera_spi *hw, int count)
+static void altera_spi_tx_word(struct altera_spi *hw)
 {
+       unsigned int txd = 0;
+
        if (hw->tx) {
                switch (hw->bytes_per_word) {
                case 1:
-                       return hw->tx[count];
+                       txd = hw->tx[hw->count];
+                       break;
                case 2:
-                       return (hw->tx[count * 2]
-                               | (hw->tx[count * 2 + 1] << 8));
+                       txd = (hw->tx[hw->count * 2]
+                               | (hw->tx[hw->count * 2 + 1] << 8));
+                       break;
                }
        }
-       return 0;
+
+       writel(txd, hw->base + ALTERA_SPI_TXDATA);
+}
+
+static void altera_spi_rx_word(struct altera_spi *hw)
+{
+       unsigned int rxd;
+
+       rxd = readl(hw->base + ALTERA_SPI_RXDATA);
+       if (hw->rx) {
+               switch (hw->bytes_per_word) {
+               case 1:
+                       hw->rx[hw->count] = rxd;
+                       break;
+               case 2:
+                       hw->rx[hw->count * 2] = rxd;
+                       hw->rx[hw->count * 2 + 1] = rxd >> 8;
+                       break;
+               }
+       }
+
+       hw->count++;
 }
 
 static int altera_spi_txrx(struct spi_master *master,
@@ -107,32 +132,16 @@ static int altera_spi_txrx(struct spi_master *master,
                writel(hw->imr, hw->base + ALTERA_SPI_CONTROL);
 
                /* send the first byte */
-               writel(hw_txbyte(hw, 0), hw->base + ALTERA_SPI_TXDATA);
+               altera_spi_tx_word(hw);
        } else {
                while (hw->count < hw->len) {
-                       unsigned int rxd;
-
-                       writel(hw_txbyte(hw, hw->count),
-                              hw->base + ALTERA_SPI_TXDATA);
+                       altera_spi_tx_word(hw);
 
                        while (!(readl(hw->base + ALTERA_SPI_STATUS) &
                                 ALTERA_SPI_STATUS_RRDY_MSK))
                                cpu_relax();
 
-                       rxd = readl(hw->base + ALTERA_SPI_RXDATA);
-                       if (hw->rx) {
-                               switch (hw->bytes_per_word) {
-                               case 1:
-                                       hw->rx[hw->count] = rxd;
-                                       break;
-                               case 2:
-                                       hw->rx[hw->count * 2] = rxd;
-                                       hw->rx[hw->count * 2 + 1] = rxd >> 8;
-                                       break;
-                               }
-                       }
-
-                       hw->count++;
+                       altera_spi_rx_word(hw);
                }
                spi_finalize_current_transfer(master);
        }
@@ -144,25 +153,11 @@ static irqreturn_t altera_spi_irq(int irq, void *dev)
 {
        struct spi_master *master = dev;
        struct altera_spi *hw = spi_master_get_devdata(master);
-       unsigned int rxd;
-
-       rxd = readl(hw->base + ALTERA_SPI_RXDATA);
-       if (hw->rx) {
-               switch (hw->bytes_per_word) {
-               case 1:
-                       hw->rx[hw->count] = rxd;
-                       break;
-               case 2:
-                       hw->rx[hw->count * 2] = rxd;
-                       hw->rx[hw->count * 2 + 1] = rxd >> 8;
-                       break;
-               }
-       }
 
-       hw->count++;
+       altera_spi_rx_word(hw);
 
        if (hw->count < hw->len) {
-               writel(hw_txbyte(hw, hw->count), hw->base + ALTERA_SPI_TXDATA);
+               altera_spi_tx_word(hw);
        } else {
                /* disable receive interrupt */
                hw->imr &= ~ALTERA_SPI_CONTROL_IRRDY_MSK;