mtd: st_spi_fsm: Supply a method to read from the FSM's FIFO
authorLee Jones <lee.jones@linaro.org>
Thu, 20 Mar 2014 09:20:37 +0000 (09:20 +0000)
committerBrian Norris <computersforpeace@gmail.com>
Thu, 20 Mar 2014 11:17:14 +0000 (04:17 -0700)
When invoked the driver will attempt to read any available data from
the FSM's data register. Any data collected from this FIFO would have
originated from the flash chip.

Acked-by Angus Clark <angus.clark@st.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
drivers/mtd/devices/st_spi_fsm.c

index 5e22c8688197f5ce2cd39ef31c0d013e671099ae..73e0f2731bcbaf87d9808b3fa22824de4ce8966d 100644 (file)
@@ -281,6 +281,32 @@ static void stfsm_wait_seq(struct stfsm *fsm)
        dev_err(fsm->dev, "timeout on sequence completion\n");
 }
 
+static void stfsm_read_fifo(struct stfsm *fsm, uint32_t *buf,
+                           const uint32_t size)
+{
+       uint32_t remaining = size >> 2;
+       uint32_t avail;
+       uint32_t words;
+
+       dev_dbg(fsm->dev, "Reading %d bytes from FIFO\n", size);
+
+       BUG_ON((((uint32_t)buf) & 0x3) || (size & 0x3));
+
+       while (remaining) {
+               for (;;) {
+                       avail = stfsm_fifo_available(fsm);
+                       if (avail)
+                               break;
+                       udelay(1);
+               }
+               words = min(avail, remaining);
+               remaining -= words;
+
+               readsl(fsm->base + SPI_FAST_SEQ_DATA_REG, buf, words);
+               buf += words;
+       }
+}
+
 static int stfsm_set_mode(struct stfsm *fsm, uint32_t mode)
 {
        int ret, timeout = 10;