Lines Matching refs:cfspi

23 static inline int forward_to_spi_cmd(struct cfspi *cfspi)  in forward_to_spi_cmd()  argument
25 return cfspi->rx_cpck_len; in forward_to_spi_cmd()
29 static inline int forward_to_spi_cmd(struct cfspi *cfspi) in forward_to_spi_cmd() argument
47 static inline void debugfs_store_prev(struct cfspi *cfspi) in debugfs_store_prev() argument
50 cfspi->pcmd = cfspi->cmd; in debugfs_store_prev()
52 cfspi->tx_ppck_len = cfspi->tx_cpck_len; in debugfs_store_prev()
53 cfspi->rx_ppck_len = cfspi->rx_cpck_len; in debugfs_store_prev()
56 static inline void debugfs_store_prev(struct cfspi *cfspi) in debugfs_store_prev() argument
63 struct cfspi *cfspi; in cfspi_xfer() local
67 cfspi = container_of(work, struct cfspi, work); in cfspi_xfer()
70 cfspi->cmd = SPI_CMD_EOT; in cfspi_xfer()
74 cfspi_dbg_state(cfspi, CFSPI_STATE_WAITING); in cfspi_xfer()
77 wait_event_interruptible(cfspi->wait, in cfspi_xfer()
78 test_bit(SPI_XFER, &cfspi->state) || in cfspi_xfer()
79 test_bit(SPI_TERMINATE, &cfspi->state)); in cfspi_xfer()
81 if (test_bit(SPI_TERMINATE, &cfspi->state)) in cfspi_xfer()
86 memset(cfspi->xfer.va_tx, 0xFF, SPI_DMA_BUF_LEN); in cfspi_xfer()
87 memset(cfspi->xfer.va_rx, 0xFF, SPI_DMA_BUF_LEN); in cfspi_xfer()
90 cfspi_dbg_state(cfspi, CFSPI_STATE_AWAKE); in cfspi_xfer()
93 if (cfspi->tx_cpck_len) { in cfspi_xfer()
96 cfspi_dbg_state(cfspi, CFSPI_STATE_FETCH_PKT); in cfspi_xfer()
99 ptr = (u8 *) cfspi->xfer.va_tx; in cfspi_xfer()
101 len = cfspi_xmitfrm(cfspi, ptr, cfspi->tx_cpck_len); in cfspi_xfer()
102 WARN_ON(len != cfspi->tx_cpck_len); in cfspi_xfer()
105 cfspi_dbg_state(cfspi, CFSPI_STATE_GET_NEXT); in cfspi_xfer()
108 cfspi->tx_npck_len = cfspi_xmitlen(cfspi); in cfspi_xfer()
110 WARN_ON(cfspi->tx_npck_len > SPI_DMA_BUF_LEN); in cfspi_xfer()
116 ptr = (u8 *) cfspi->xfer.va_tx; in cfspi_xfer()
119 *ptr++ = cfspi->tx_npck_len & 0x00FF; in cfspi_xfer()
120 *ptr++ = (cfspi->tx_npck_len & 0xFF00) >> 8; in cfspi_xfer()
123 cfspi->xfer.tx_dma_len = cfspi->tx_cpck_len + SPI_IND_SZ; in cfspi_xfer()
124 cfspi->xfer.rx_dma_len = cfspi->rx_cpck_len + SPI_CMD_SZ; in cfspi_xfer()
127 if (cfspi->tx_cpck_len && in cfspi_xfer()
128 (cfspi->xfer.tx_dma_len % spi_frm_align)) { in cfspi_xfer()
130 cfspi->xfer.tx_dma_len += spi_frm_align - in cfspi_xfer()
131 (cfspi->xfer.tx_dma_len % spi_frm_align); in cfspi_xfer()
135 if (cfspi->rx_cpck_len && in cfspi_xfer()
136 (cfspi->xfer.rx_dma_len % spi_frm_align)) { in cfspi_xfer()
138 cfspi->xfer.rx_dma_len += spi_frm_align - in cfspi_xfer()
139 (cfspi->xfer.rx_dma_len % spi_frm_align); in cfspi_xfer()
142 cfspi_dbg_state(cfspi, CFSPI_STATE_INIT_XFER); in cfspi_xfer()
145 ret = cfspi->dev->init_xfer(&cfspi->xfer, cfspi->dev); in cfspi_xfer()
148 cfspi_dbg_state(cfspi, CFSPI_STATE_WAIT_ACTIVE); in cfspi_xfer()
156 cfspi_dbg_state(cfspi, CFSPI_STATE_SIG_ACTIVE); in cfspi_xfer()
159 cfspi->dev->sig_xfer(true, cfspi->dev); in cfspi_xfer()
161 cfspi_dbg_state(cfspi, CFSPI_STATE_WAIT_XFER_DONE); in cfspi_xfer()
164 wait_for_completion(&cfspi->comp); in cfspi_xfer()
166 cfspi_dbg_state(cfspi, CFSPI_STATE_XFER_DONE); in cfspi_xfer()
168 if (cfspi->cmd == SPI_CMD_EOT) { in cfspi_xfer()
173 clear_bit(SPI_SS_ON, &cfspi->state); in cfspi_xfer()
176 cfspi_dbg_state(cfspi, CFSPI_STATE_WAIT_INACTIVE); in cfspi_xfer()
179 if (SPI_XFER_TIME_USEC(cfspi->xfer.tx_dma_len, in cfspi_xfer()
180 cfspi->dev->clk_mhz) < in cfspi_xfer()
185 (cfspi->xfer.tx_dma_len, cfspi->dev->clk_mhz)); in cfspi_xfer()
188 cfspi_dbg_state(cfspi, CFSPI_STATE_SIG_INACTIVE); in cfspi_xfer()
191 cfspi->dev->sig_xfer(false, cfspi->dev); in cfspi_xfer()
194 if (cfspi->rx_cpck_len) { in cfspi_xfer()
197 cfspi_dbg_state(cfspi, CFSPI_STATE_DELIVER_PKT); in cfspi_xfer()
200 ptr = ((u8 *)(cfspi->xfer.va_rx + SPI_DATA_POS)); in cfspi_xfer()
202 len = cfspi_rxfrm(cfspi, ptr, cfspi->rx_cpck_len); in cfspi_xfer()
203 WARN_ON(len != cfspi->rx_cpck_len); in cfspi_xfer()
207 ptr = (u8 *) cfspi->xfer.va_rx; in cfspi_xfer()
209 ptr += forward_to_spi_cmd(cfspi); in cfspi_xfer()
211 cfspi->cmd = *ptr++; in cfspi_xfer()
212 cfspi->cmd |= ((*ptr++) << 8) & 0xFF00; in cfspi_xfer()
213 cfspi->rx_npck_len = *ptr++; in cfspi_xfer()
214 cfspi->rx_npck_len |= ((*ptr++) << 8) & 0xFF00; in cfspi_xfer()
216 WARN_ON(cfspi->rx_npck_len > SPI_DMA_BUF_LEN); in cfspi_xfer()
217 WARN_ON(cfspi->cmd > SPI_CMD_EOT); in cfspi_xfer()
219 debugfs_store_prev(cfspi); in cfspi_xfer()
222 if (cfspi->cmd == SPI_CMD_EOT) { in cfspi_xfer()
224 cfspi->tx_cpck_len = 0; in cfspi_xfer()
225 cfspi->rx_cpck_len = 0; in cfspi_xfer()
228 cfspi->tx_cpck_len = cfspi->tx_npck_len; in cfspi_xfer()
229 cfspi->rx_cpck_len = cfspi->rx_npck_len; in cfspi_xfer()
238 spin_lock_irqsave(&cfspi->lock, flags); in cfspi_xfer()
239 if (cfspi->cmd == SPI_CMD_EOT && !cfspi_xmitlen(cfspi) in cfspi_xfer()
240 && !test_bit(SPI_SS_ON, &cfspi->state)) in cfspi_xfer()
241 clear_bit(SPI_XFER, &cfspi->state); in cfspi_xfer()
243 spin_unlock_irqrestore(&cfspi->lock, flags); in cfspi_xfer()