Lines Matching refs:drv_data

48 int pxa2xx_spi_map_dma_buffers(struct driver_data *drv_data)  in pxa2xx_spi_map_dma_buffers()  argument
50 struct spi_message *msg = drv_data->cur_msg; in pxa2xx_spi_map_dma_buffers()
53 if (!drv_data->cur_chip->enable_dma) in pxa2xx_spi_map_dma_buffers()
57 return drv_data->rx_dma && drv_data->tx_dma; in pxa2xx_spi_map_dma_buffers()
59 if (!IS_DMA_ALIGNED(drv_data->rx) || !IS_DMA_ALIGNED(drv_data->tx)) in pxa2xx_spi_map_dma_buffers()
63 if (drv_data->rx == NULL) { in pxa2xx_spi_map_dma_buffers()
64 *drv_data->null_dma_buf = 0; in pxa2xx_spi_map_dma_buffers()
65 drv_data->rx = drv_data->null_dma_buf; in pxa2xx_spi_map_dma_buffers()
66 drv_data->rx_map_len = 4; in pxa2xx_spi_map_dma_buffers()
68 drv_data->rx_map_len = drv_data->len; in pxa2xx_spi_map_dma_buffers()
72 if (drv_data->tx == NULL) { in pxa2xx_spi_map_dma_buffers()
73 *drv_data->null_dma_buf = 0; in pxa2xx_spi_map_dma_buffers()
74 drv_data->tx = drv_data->null_dma_buf; in pxa2xx_spi_map_dma_buffers()
75 drv_data->tx_map_len = 4; in pxa2xx_spi_map_dma_buffers()
77 drv_data->tx_map_len = drv_data->len; in pxa2xx_spi_map_dma_buffers()
83 drv_data->tx_dma = dma_map_single(dev, drv_data->tx, in pxa2xx_spi_map_dma_buffers()
84 drv_data->tx_map_len, DMA_TO_DEVICE); in pxa2xx_spi_map_dma_buffers()
85 if (dma_mapping_error(dev, drv_data->tx_dma)) in pxa2xx_spi_map_dma_buffers()
89 drv_data->rx_dma = dma_map_single(dev, drv_data->rx, in pxa2xx_spi_map_dma_buffers()
90 drv_data->rx_map_len, DMA_FROM_DEVICE); in pxa2xx_spi_map_dma_buffers()
91 if (dma_mapping_error(dev, drv_data->rx_dma)) { in pxa2xx_spi_map_dma_buffers()
92 dma_unmap_single(dev, drv_data->tx_dma, in pxa2xx_spi_map_dma_buffers()
93 drv_data->tx_map_len, DMA_TO_DEVICE); in pxa2xx_spi_map_dma_buffers()
100 static void pxa2xx_spi_unmap_dma_buffers(struct driver_data *drv_data) in pxa2xx_spi_unmap_dma_buffers() argument
104 if (!drv_data->dma_mapped) in pxa2xx_spi_unmap_dma_buffers()
107 if (!drv_data->cur_msg->is_dma_mapped) { in pxa2xx_spi_unmap_dma_buffers()
108 dev = &drv_data->cur_msg->spi->dev; in pxa2xx_spi_unmap_dma_buffers()
109 dma_unmap_single(dev, drv_data->rx_dma, in pxa2xx_spi_unmap_dma_buffers()
110 drv_data->rx_map_len, DMA_FROM_DEVICE); in pxa2xx_spi_unmap_dma_buffers()
111 dma_unmap_single(dev, drv_data->tx_dma, in pxa2xx_spi_unmap_dma_buffers()
112 drv_data->tx_map_len, DMA_TO_DEVICE); in pxa2xx_spi_unmap_dma_buffers()
115 drv_data->dma_mapped = 0; in pxa2xx_spi_unmap_dma_buffers()
118 static int wait_ssp_rx_stall(struct driver_data *drv_data) in wait_ssp_rx_stall() argument
122 while ((pxa2xx_spi_read(drv_data, SSSR) & SSSR_BSY) && --limit) in wait_ssp_rx_stall()
138 static void pxa2xx_spi_dma_error_stop(struct driver_data *drv_data, in pxa2xx_spi_dma_error_stop() argument
142 DCSR(drv_data->rx_channel) = RESET_DMA_CHANNEL; in pxa2xx_spi_dma_error_stop()
143 DCSR(drv_data->tx_channel) = RESET_DMA_CHANNEL; in pxa2xx_spi_dma_error_stop()
144 write_SSSR_CS(drv_data, drv_data->clear_sr); in pxa2xx_spi_dma_error_stop()
145 pxa2xx_spi_write(drv_data, SSCR1, in pxa2xx_spi_dma_error_stop()
146 pxa2xx_spi_read(drv_data, SSCR1) in pxa2xx_spi_dma_error_stop()
147 & ~drv_data->dma_cr1); in pxa2xx_spi_dma_error_stop()
148 if (!pxa25x_ssp_comp(drv_data)) in pxa2xx_spi_dma_error_stop()
149 pxa2xx_spi_write(drv_data, SSTO, 0); in pxa2xx_spi_dma_error_stop()
150 pxa2xx_spi_flush(drv_data); in pxa2xx_spi_dma_error_stop()
151 pxa2xx_spi_write(drv_data, SSCR0, in pxa2xx_spi_dma_error_stop()
152 pxa2xx_spi_read(drv_data, SSCR0) & ~SSCR0_SSE); in pxa2xx_spi_dma_error_stop()
154 pxa2xx_spi_unmap_dma_buffers(drv_data); in pxa2xx_spi_dma_error_stop()
156 dev_err(&drv_data->pdev->dev, "%s\n", msg); in pxa2xx_spi_dma_error_stop()
158 drv_data->cur_msg->state = ERROR_STATE; in pxa2xx_spi_dma_error_stop()
159 tasklet_schedule(&drv_data->pump_transfers); in pxa2xx_spi_dma_error_stop()
162 static void pxa2xx_spi_dma_transfer_complete(struct driver_data *drv_data) in pxa2xx_spi_dma_transfer_complete() argument
164 struct spi_message *msg = drv_data->cur_msg; in pxa2xx_spi_dma_transfer_complete()
167 pxa2xx_spi_write(drv_data, SSCR1, in pxa2xx_spi_dma_transfer_complete()
168 pxa2xx_spi_read(drv_data, SSCR1) in pxa2xx_spi_dma_transfer_complete()
169 & ~drv_data->dma_cr1); in pxa2xx_spi_dma_transfer_complete()
170 write_SSSR_CS(drv_data, drv_data->clear_sr); in pxa2xx_spi_dma_transfer_complete()
171 DCSR(drv_data->tx_channel) = RESET_DMA_CHANNEL; in pxa2xx_spi_dma_transfer_complete()
172 DCSR(drv_data->rx_channel) = RESET_DMA_CHANNEL; in pxa2xx_spi_dma_transfer_complete()
174 if (wait_dma_channel_stop(drv_data->rx_channel) == 0) in pxa2xx_spi_dma_transfer_complete()
175 dev_err(&drv_data->pdev->dev, in pxa2xx_spi_dma_transfer_complete()
178 if (wait_ssp_rx_stall(drv_data->ioaddr) == 0) in pxa2xx_spi_dma_transfer_complete()
179 dev_err(&drv_data->pdev->dev, in pxa2xx_spi_dma_transfer_complete()
182 pxa2xx_spi_unmap_dma_buffers(drv_data); in pxa2xx_spi_dma_transfer_complete()
185 drv_data->rx += drv_data->len - in pxa2xx_spi_dma_transfer_complete()
186 (DCMD(drv_data->rx_channel) & DCMD_LENGTH); in pxa2xx_spi_dma_transfer_complete()
191 drv_data->read(drv_data); in pxa2xx_spi_dma_transfer_complete()
194 msg->actual_length += drv_data->len - in pxa2xx_spi_dma_transfer_complete()
195 (drv_data->rx_end - drv_data->rx); in pxa2xx_spi_dma_transfer_complete()
202 msg->state = pxa2xx_spi_next_transfer(drv_data); in pxa2xx_spi_dma_transfer_complete()
205 tasklet_schedule(&drv_data->pump_transfers); in pxa2xx_spi_dma_transfer_complete()
210 struct driver_data *drv_data = data; in pxa2xx_spi_dma_handler() local
215 if (channel == drv_data->tx_channel) in pxa2xx_spi_dma_handler()
216 pxa2xx_spi_dma_error_stop(drv_data, in pxa2xx_spi_dma_handler()
219 pxa2xx_spi_dma_error_stop(drv_data, in pxa2xx_spi_dma_handler()
225 if ((channel == drv_data->tx_channel) in pxa2xx_spi_dma_handler()
227 && (drv_data->ssp_type == PXA25x_SSP)) { in pxa2xx_spi_dma_handler()
230 if (wait_ssp_rx_stall(drv_data) == 0) in pxa2xx_spi_dma_handler()
231 dev_err(&drv_data->pdev->dev, in pxa2xx_spi_dma_handler()
235 pxa2xx_spi_dma_transfer_complete(drv_data); in pxa2xx_spi_dma_handler()
239 irqreturn_t pxa2xx_spi_dma_transfer(struct driver_data *drv_data) in pxa2xx_spi_dma_transfer() argument
243 irq_status = pxa2xx_spi_read(drv_data, SSSR) & drv_data->mask_sr; in pxa2xx_spi_dma_transfer()
245 pxa2xx_spi_dma_error_stop(drv_data, in pxa2xx_spi_dma_transfer()
252 && (DCSR(drv_data->tx_channel) & DCSR_RUN)) { in pxa2xx_spi_dma_transfer()
253 pxa2xx_spi_write(drv_data, SSSR, SSSR_TINT); in pxa2xx_spi_dma_transfer()
257 if (irq_status & SSSR_TINT || drv_data->rx == drv_data->rx_end) { in pxa2xx_spi_dma_transfer()
261 if (!pxa25x_ssp_comp(drv_data)) in pxa2xx_spi_dma_transfer()
262 pxa2xx_spi_write(drv_data, SSTO, 0); in pxa2xx_spi_dma_transfer()
265 pxa2xx_spi_dma_transfer_complete(drv_data); in pxa2xx_spi_dma_transfer()
274 int pxa2xx_spi_dma_prepare(struct driver_data *drv_data, u32 dma_burst) in pxa2xx_spi_dma_prepare() argument
278 switch (drv_data->n_bytes) { in pxa2xx_spi_dma_prepare()
291 DCSR(drv_data->rx_channel) = RESET_DMA_CHANNEL; in pxa2xx_spi_dma_prepare()
292 DSADR(drv_data->rx_channel) = drv_data->ssdr_physical; in pxa2xx_spi_dma_prepare()
293 DTADR(drv_data->rx_channel) = drv_data->rx_dma; in pxa2xx_spi_dma_prepare()
294 if (drv_data->rx == drv_data->null_dma_buf) in pxa2xx_spi_dma_prepare()
296 DCMD(drv_data->rx_channel) = DCMD_FLOWSRC in pxa2xx_spi_dma_prepare()
299 | drv_data->len; in pxa2xx_spi_dma_prepare()
301 DCMD(drv_data->rx_channel) = DCMD_INCTRGADDR in pxa2xx_spi_dma_prepare()
305 | drv_data->len; in pxa2xx_spi_dma_prepare()
308 DCSR(drv_data->tx_channel) = RESET_DMA_CHANNEL; in pxa2xx_spi_dma_prepare()
309 DSADR(drv_data->tx_channel) = drv_data->tx_dma; in pxa2xx_spi_dma_prepare()
310 DTADR(drv_data->tx_channel) = drv_data->ssdr_physical; in pxa2xx_spi_dma_prepare()
311 if (drv_data->tx == drv_data->null_dma_buf) in pxa2xx_spi_dma_prepare()
313 DCMD(drv_data->tx_channel) = DCMD_FLOWTRG in pxa2xx_spi_dma_prepare()
316 | drv_data->len; in pxa2xx_spi_dma_prepare()
318 DCMD(drv_data->tx_channel) = DCMD_INCSRCADDR in pxa2xx_spi_dma_prepare()
322 | drv_data->len; in pxa2xx_spi_dma_prepare()
325 if (drv_data->ssp_type == PXA25x_SSP) in pxa2xx_spi_dma_prepare()
326 DCMD(drv_data->tx_channel) |= DCMD_ENDIRQEN; in pxa2xx_spi_dma_prepare()
331 void pxa2xx_spi_dma_start(struct driver_data *drv_data) in pxa2xx_spi_dma_start() argument
333 DCSR(drv_data->rx_channel) |= DCSR_RUN; in pxa2xx_spi_dma_start()
334 DCSR(drv_data->tx_channel) |= DCSR_RUN; in pxa2xx_spi_dma_start()
337 int pxa2xx_spi_dma_setup(struct driver_data *drv_data) in pxa2xx_spi_dma_setup() argument
339 struct device *dev = &drv_data->pdev->dev; in pxa2xx_spi_dma_setup()
340 struct ssp_device *ssp = drv_data->ssp; in pxa2xx_spi_dma_setup()
343 drv_data->rx_channel = pxa_request_dma("pxa2xx_spi_ssp_rx", in pxa2xx_spi_dma_setup()
346 drv_data); in pxa2xx_spi_dma_setup()
347 if (drv_data->rx_channel < 0) { in pxa2xx_spi_dma_setup()
349 drv_data->rx_channel); in pxa2xx_spi_dma_setup()
352 drv_data->tx_channel = pxa_request_dma("pxa2xx_spi_ssp_tx", in pxa2xx_spi_dma_setup()
355 drv_data); in pxa2xx_spi_dma_setup()
356 if (drv_data->tx_channel < 0) { in pxa2xx_spi_dma_setup()
358 drv_data->tx_channel); in pxa2xx_spi_dma_setup()
359 pxa_free_dma(drv_data->rx_channel); in pxa2xx_spi_dma_setup()
363 DRCMR(ssp->drcmr_rx) = DRCMR_MAPVLD | drv_data->rx_channel; in pxa2xx_spi_dma_setup()
364 DRCMR(ssp->drcmr_tx) = DRCMR_MAPVLD | drv_data->tx_channel; in pxa2xx_spi_dma_setup()
369 void pxa2xx_spi_dma_release(struct driver_data *drv_data) in pxa2xx_spi_dma_release() argument
371 struct ssp_device *ssp = drv_data->ssp; in pxa2xx_spi_dma_release()
376 if (drv_data->tx_channel != 0) in pxa2xx_spi_dma_release()
377 pxa_free_dma(drv_data->tx_channel); in pxa2xx_spi_dma_release()
378 if (drv_data->rx_channel != 0) in pxa2xx_spi_dma_release()
379 pxa_free_dma(drv_data->rx_channel); in pxa2xx_spi_dma_release()
382 void pxa2xx_spi_dma_resume(struct driver_data *drv_data) in pxa2xx_spi_dma_resume() argument
384 if (drv_data->rx_channel != -1) in pxa2xx_spi_dma_resume()
385 DRCMR(drv_data->ssp->drcmr_rx) = in pxa2xx_spi_dma_resume()
386 DRCMR_MAPVLD | drv_data->rx_channel; in pxa2xx_spi_dma_resume()
387 if (drv_data->tx_channel != -1) in pxa2xx_spi_dma_resume()
388 DRCMR(drv_data->ssp->drcmr_tx) = in pxa2xx_spi_dma_resume()
389 DRCMR_MAPVLD | drv_data->tx_channel; in pxa2xx_spi_dma_resume()